Annotation of 43BSD/ingres/source/monitor/buf.c, revision 1.1.1.1

1.1       root        1: # include      "buf.h"
                      2: # include      <sccs.h>
                      3: 
                      4: SCCSID(@(#)buf.c       8.1     12/31/84)
                      5: 
                      6: 
                      7: /*
                      8: **  BUFFER MANIPULATION ROUTINES
                      9: */
                     10: 
                     11: 
                     12: 
                     13: /*
                     14: **  BUFPUT -- put character onto buffer
                     15: **
                     16: **     The character 'c' is put onto the buffer 'bp'.  If the buffer
                     17: **     need be extended it is.
                     18: */
                     19: 
                     20: bufput(c, buffer)
                     21: char           c;
                     22: struct buf     **buffer;
                     23: {
                     24:        register struct buf     *b;
                     25:        register struct buf     *a;
                     26:        register struct buf     **bp;
                     27:        char                    *bufalloc();
                     28: 
                     29:        bp = buffer;
                     30:        b = *bp;
                     31:        if (b == 0 || b->ptr >= &b->buffer[BUFSIZE])
                     32:        {
                     33:                /* allocate new buffer segment */
                     34:                a = (struct buf *) bufalloc(sizeof *a);
                     35:                a->nextb = b;
                     36:                a->ptr = a->buffer;
                     37:                *bp = b = a;
                     38:        }
                     39: 
                     40:        *b->ptr++ = c;
                     41: }
                     42: /*
                     43: **  BUFGET -- get character off of buffer
                     44: **
                     45: **     The buffer is popped and the character is returned.  If the
                     46: **     segment is then empty, it is returned to the free list.
                     47: */
                     48: 
                     49: bufget(buffer)
                     50: struct buf     **buffer;
                     51: {
                     52:        register struct buf     *b;
                     53:        register char           c;
                     54:        register struct buf     **bp;
                     55: 
                     56:        bp = buffer;
                     57:        b = *bp;
                     58: 
                     59:        if (b == 0 || b->ptr == b->buffer)
                     60:        {
                     61:                /* buffer is empty -- return end of file */
                     62:                return (0);
                     63:        }
                     64: 
                     65:        c = *--(b->ptr);
                     66: 
                     67:        /* check to see if we have emptied the (non-initial) segment */
                     68:        if (b->ptr == b->buffer && b->nextb != 0)
                     69:        {
                     70:                /* deallocate segment */
                     71:                *bp = b->nextb;
                     72:                buffree(b);
                     73:        }
                     74: 
                     75:        return (c);
                     76: }
                     77: /*
                     78: **  BUFPURGE -- return an entire buffer to the free list
                     79: **
                     80: **     The buffer is emptied and returned to the free list.  This
                     81: **     routine should be called when the buffer is to no longer
                     82: **     be used.
                     83: */
                     84: 
                     85: bufpurge(buffer)
                     86: struct buf     **buffer;
                     87: {
                     88:        register struct buf     **bp;
                     89:        register struct buf     *a;
                     90:        register struct buf     *b;
                     91: 
                     92:        bp = buffer;
                     93:        b = *bp;
                     94:        *bp = 0;
                     95: 
                     96:        /* return the segments to the free list */
                     97:        while (b != 0)
                     98:        {
                     99:                a = b->nextb;
                    100:                buffree(b);
                    101:                b = a;
                    102:        }
                    103: }
                    104: /*
                    105: **  BUFFLUSH -- flush a buffer
                    106: **
                    107: **     The named buffer is truncated to zero length.  However, the
                    108: **     segments of the buffer are not returned to the system.
                    109: */
                    110: 
                    111: bufflush(buffer)
                    112: struct buf     **buffer;
                    113: {
                    114:        register struct buf     *b;
                    115:        register struct buf     **bp;
                    116: 
                    117:        bp = buffer;
                    118:        b = *bp;
                    119:        if (b == 0)
                    120:                return;
                    121: 
                    122:        /* return second and subsequent segments to the system */
                    123:        bufpurge(&b->nextb);
                    124: 
                    125:        /* truncate this buffer to zero length */
                    126:        b->ptr = b->buffer;
                    127: }
                    128: /*
                    129: **  BUFCRUNCH -- flatten a series of buffers to a string
                    130: **
                    131: **     The named buffer is flattenned to a conventional C string,
                    132: **     null terminated.  The buffer is deallocated.  The string is
                    133: **     allocated "somewhere" off in memory, and a pointer to it
                    134: **     is returned.
                    135: */
                    136: 
                    137: char   *Buf_flat;
                    138: 
                    139: char *
                    140: bufcrunch(buffer)
                    141: struct buf     **buffer;
                    142: {
                    143:        register char   *p;
                    144:        char            *bufflatten();
                    145: 
                    146:        p = bufflatten(*buffer, 1);
                    147:        *p = 0;
                    148:        *buffer = 0;
                    149:        return (Buf_flat);
                    150: }
                    151: 
                    152: char *
                    153: bufflatten(buf, length)
                    154: struct buf     *buf;
                    155: int            length;
                    156: {
                    157:        register struct buf     *b;
                    158:        register char           *p;
                    159:        register char           *q;
                    160:        char                    *bufalloc();
                    161: 
                    162:        b = buf;
                    163: 
                    164:        /* see if we have advanced to beginning of buffer */
                    165:        if (b != 0)
                    166:        {
                    167:                /* no, keep moving back */
                    168:                p = bufflatten(b->nextb, length + (b->ptr - b->buffer));
                    169:        }
                    170:        else
                    171:        {
                    172:                /* yes, allocate the string */
                    173:                Buf_flat = p = bufalloc(length);
                    174:                return (p);
                    175:        }
                    176: 
                    177:        /* copy buffer into string */
                    178:        for (q = b->buffer; q < b->ptr; )
                    179:                *p++ = *q++;
                    180: 
                    181:        /* deallocate the segment */
                    182:        buffree(b);
                    183: 
                    184:        /* process next segment */
                    185:        return (p);
                    186: }
                    187: /*
                    188: **  BUFALLOC -- allocate clear memory
                    189: **
                    190: **     This is similar to the system malloc routine except that
                    191: **     it has no error return, and memory is guaranteed to be clear
                    192: **     when you return.
                    193: **
                    194: **     It might be nice to rewrite this later to avoid the nasty
                    195: **     memory fragmentation that malloc() tends toward.
                    196: **
                    197: **     The error processing might have to be modified if used anywhere
                    198: **     other than INGRES.
                    199: */
                    200: 
                    201: char *
                    202: bufalloc(size)
                    203: int    size;
                    204: {
                    205:        register char   *p;
                    206:        extern int      (*ExitFn)();    /* defined in syserr.c */
                    207:        extern char     *malloc();
                    208: 
                    209:        p = malloc(size);
                    210:        if (p == NULL)
                    211:        {
                    212:                printf("Out of memory in macro processor\n");
                    213:                (*ExitFn)(-1);
                    214:        }
                    215: 
                    216:        clrmem(p, size);
                    217: 
                    218:        return (p);
                    219: }
                    220: /*
                    221: **  BUFFREE -- free memory
                    222: */
                    223: 
                    224: buffree(ptr)
                    225: char   *ptr;
                    226: {
                    227:        register char   *p;
                    228: 
                    229:        p = ptr;
                    230: 
                    231:        if (p == 0)
                    232:                syserr("buffree: 0 ptr");
                    233: 
                    234:        free(p);
                    235: }

unix.superglobalmegacorp.com

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