Annotation of Net2/kern/tty_ring.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1989, 1990, 1991, 1992 William F. Jolitz, TeleMuse
                      3:  * All rights reserved.
                      4:  *
                      5:  * Redistribution and use in source and binary forms, with or without
                      6:  * modification, are permitted provided that the following conditions
                      7:  * are met:
                      8:  * 1. Redistributions of source code must retain the above copyright
                      9:  *    notice, this list of conditions and the following disclaimer.
                     10:  * 2. Redistributions in binary form must reproduce the above copyright
                     11:  *    notice, this list of conditions and the following disclaimer in the
                     12:  *    documentation and/or other materials provided with the distribution.
                     13:  * 3. All advertising materials mentioning features or use of this software
                     14:  *    must display the following acknowledgement:
                     15:  *     This software is a component of "386BSD" developed by 
                     16:        William F. Jolitz, TeleMuse.
                     17:  * 4. Neither the name of the developer nor the name "386BSD"
                     18:  *    may be used to endorse or promote products derived from this software
                     19:  *    without specific prior written permission.
                     20:  *
                     21:  * THIS SOFTWARE IS A COMPONENT OF 386BSD DEVELOPED BY WILLIAM F. JOLITZ 
                     22:  * AND IS INTENDED FOR RESEARCH AND EDUCATIONAL PURPOSES ONLY. THIS 
                     23:  * SOFTWARE SHOULD NOT BE CONSIDERED TO BE A COMMERCIAL PRODUCT. 
                     24:  * THE DEVELOPER URGES THAT USERS WHO REQUIRE A COMMERCIAL PRODUCT 
                     25:  * NOT MAKE USE THIS WORK.
                     26:  *
                     27:  * FOR USERS WHO WISH TO UNDERSTAND THE 386BSD SYSTEM DEVELOPED
                     28:  * BY WILLIAM F. JOLITZ, WE RECOMMEND THE USER STUDY WRITTEN 
                     29:  * REFERENCES SUCH AS THE  "PORTING UNIX TO THE 386" SERIES 
                     30:  * (BEGINNING JANUARY 1991 "DR. DOBBS JOURNAL", USA AND BEGINNING 
                     31:  * JUNE 1991 "UNIX MAGAZIN", GERMANY) BY WILLIAM F. JOLITZ AND 
                     32:  * LYNNE GREER JOLITZ, AS WELL AS OTHER BOOKS ON UNIX AND THE 
                     33:  * ON-LINE 386BSD USER MANUAL BEFORE USE. A BOOK DISCUSSING THE INTERNALS 
                     34:  * OF 386BSD ENTITLED "386BSD FROM THE INSIDE OUT" WILL BE AVAILABLE LATE 1992.
                     35:  *
                     36:  * THIS SOFTWARE IS PROVIDED BY THE DEVELOPER ``AS IS'' AND
                     37:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     38:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     39:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE DEVELOPER BE LIABLE
                     40:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     41:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     42:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     43:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     44:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     45:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     46:  * SUCH DAMAGE.
                     47:  *
                     48:  */
                     49: static char rcsid[] = "$Header: /usr/bill/working/sys/kern/RCS/tty_ring.c,v 1.2 92/01/21 21:29:55 william Exp $";
                     50: 
                     51: #include "param.h"
                     52: #include "systm.h"
                     53: #include "buf.h"
                     54: #include "ioctl.h"
                     55: #include "tty.h"
                     56: 
                     57: putc(c, rbp) struct ringb *rbp;
                     58: {
                     59:        char *nxtp;
                     60: 
                     61:        /* ring buffer full? */
                     62:        if ( (nxtp = RB_SUCC(rbp, rbp->rb_tl)) == rbp->rb_hd) return (-1);
                     63: 
                     64:        /* stuff character */
                     65:        *rbp->rb_tl = c;
                     66:        rbp->rb_tl = nxtp;
                     67:        return(0);
                     68: }
                     69: 
                     70: getc(rbp) struct ringb *rbp;
                     71: {
                     72:        u_char c;
                     73: 
                     74:        /* ring buffer empty? */
                     75:        if (rbp->rb_hd == rbp->rb_tl) return(-1);
                     76: 
                     77:        /* fetch character, locate next character */
                     78:        c = *(u_char *) rbp->rb_hd;
                     79:        rbp->rb_hd = RB_SUCC(rbp, rbp->rb_hd);
                     80:        return (c);
                     81: }
                     82: 
                     83: nextc(cpp, rbp) struct ringb *rbp; char **cpp; {
                     84: 
                     85:        if (*cpp == rbp->rb_tl) return (0);
                     86:        else {  char *cp;
                     87:                cp = *cpp;
                     88:                *cpp = RB_SUCC(rbp, cp);
                     89:                return(*cp);
                     90:        }
                     91: }
                     92: 
                     93: ungetc(c, rbp) struct ringb *rbp;
                     94: {
                     95:        char    *backp;
                     96: 
                     97:        /* ring buffer full? */
                     98:        if ( (backp = RB_PRED(rbp, rbp->rb_hd)) == rbp->rb_tl) return (-1);
                     99:        rbp->rb_hd = backp;
                    100: 
                    101:        /* stuff character */
                    102:        *rbp->rb_hd = c;
                    103:        return(0);
                    104: }
                    105: 
                    106: unputc(rbp) struct ringb *rbp;
                    107: {
                    108:        char    *backp;
                    109:        int c;
                    110: 
                    111:        /* ring buffer empty? */
                    112:        if (rbp->rb_hd == rbp->rb_tl) return(-1);
                    113: 
                    114:        /* backup buffer and dig out previous character */
                    115:        backp = RB_PRED(rbp, rbp->rb_tl);
                    116:        c = *(u_char *)backp;
                    117:        rbp->rb_tl = backp;
                    118: 
                    119:        return(c);
                    120: }
                    121: 
                    122: #define        peekc(rbp)      (*(rbp)->rb_hd)
                    123: 
                    124: initrb(rbp) struct ringb *rbp; {
                    125:        rbp->rb_hd = rbp->rb_tl = rbp->rb_buf;
                    126: }
                    127: 
                    128: /*
                    129:  * Example code for contiguous operations:
                    130:        ...
                    131:        nc = RB_CONTIGPUT(&rb);
                    132:        if (nc) {
                    133:        if (nc > 9) nc = 9;
                    134:                bcopy("ABCDEFGHI", rb.rb_tl, nc);
                    135:                rb.rb_tl += nc;
                    136:                rb.rb_tl = RB_ROLLOVER(&rb, rb.rb_tl);
                    137:        }
                    138:        ...
                    139:        ...
                    140:        nc = RB_CONTIGGET(&rb);
                    141:        if (nc) {
                    142:                if (nc > 79) nc = 79;
                    143:                bcopy(rb.rb_hd, stringbuf, nc);
                    144:                rb.rb_hd += nc;
                    145:                rb.rb_hd = RB_ROLLOVER(&rb, rb.rb_hd);
                    146:                stringbuf[nc] = 0;
                    147:                printf("%s|", stringbuf);
                    148:        }
                    149:        ...
                    150:  */
                    151: 
                    152: /*
                    153:  * Concatinate ring buffers.
                    154:  */
                    155: catb(from, to)
                    156:        struct ringb *from, *to;
                    157: {
                    158:        char c;
                    159: 
                    160:        while ((c = getc(from)) >= 0)
                    161:                putc(c, to);
                    162: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.