Annotation of researchv10no/cmd/visi/queues.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  *      queues.c 1.4
                      3:  *
                      4:  *     Queue Handling Functions for Spreadsheet Program `vis'
                      5:  *
                      6:  *      A. F. Gettier
                      7:  *      Bell Laboratories
                      8:  *      Update made 11/1/82 11:13:33
                      9:  *      Retrieved 11/15/82 13:22:42
                     10:  */
                     11: #include       "vis.h"
                     12: #include       <stdio.h>
                     13: 
                     14: /*LINTLIBRARY*/
                     15: /*
                     16:  *     Add to the end of a queue
                     17:  */
                     18: void qadd( hdr, val )
                     19: struct qheader *hdr;
                     20: struct node    *val;
                     21: {
                     22:        struct qentry   *t, *a, *b;
                     23:        struct node     *x;
                     24:        t = NODE( qentry );
                     25:        t->next = 0;
                     26:        t->nodeptr = val;
                     27:        a = hdr->first;
                     28:        b = 0;
                     29:        if ( a == 0 ) {
                     30:                hdr->first = hdr->last = t;
                     31:                return;
                     32:        }
                     33:        loop {
                     34:                x = a->nodeptr;
                     35:                /*
                     36:                 *      don't enter if present
                     37:                 */
                     38:                if ( (val->row == x->row && val->col < x->col )
                     39:                    || val->row < x->row ) {
                     40:                        b = a;
                     41:                        a = a->next;
                     42:                        if ( a == 0 ) {
                     43:                                b->next = hdr->last = t;
                     44:                                return;
                     45:                        }
                     46:                }
                     47:                else {
                     48:                        if (val->row == x->row && val->col == x->col )
                     49:                                return;
                     50:                        if ( b == 0 ) {
                     51:                                t->next = hdr->first;
                     52:                                hdr->first = t;
                     53:                        }
                     54:                        else {
                     55:                                t->next = b->next;
                     56:                                b->next = t;
                     57:                        }
                     58:                        return;
                     59:                }
                     60:        }
                     61: }
                     62: 
                     63: 
                     64: 
                     65: /*
                     66:  *     Read from the front of a queue
                     67:  */
                     68: struct node *qread( hdr )
                     69: struct qheader *hdr;
                     70: {
                     71:        struct node     *t;
                     72:        struct qentry   *s;
                     73:        if ( hdr->first == 0 )  return( 0 );
                     74:        t = (hdr->first)->nodeptr;
                     75:        s = (hdr->first)->next;
                     76:        free( (char *)hdr->first );
                     77:        hdr->first = s;
                     78:        if ( s == 0 ) hdr->last = 0;
                     79:        return( t );
                     80: }
                     81: 
                     82: 
                     83: 
                     84: /*
                     85:  *     Empty a queue
                     86:  */
                     87: void qempty( hdr )
                     88: struct qheader *hdr;
                     89: {
                     90:        struct qentry   *t;
                     91:        while ( hdr->first != 0 ) {
                     92:                t = hdr->first;
                     93:                free( (char *)hdr->first );
                     94:                hdr->first = t;
                     95:        }
                     96:        hdr->last = 0;
                     97: }
                     98: 
                     99: 
                    100: 
                    101: /*
                    102:  *     Initialize a queue
                    103:  */
                    104: void qinit( hdr )
                    105: struct qheader *hdr;
                    106: {
                    107:        hdr->first = 0;
                    108:        hdr->last = 0;
                    109: }
                    110: 
                    111: 
                    112: 
                    113: /*
                    114:  *     Copy a Queue
                    115:  */
                    116: struct qheader *qcopy( hdr )
                    117: struct qheader *hdr;
                    118: {
                    119:        struct qheader  *t;
                    120:        struct qentry   *s, *s1;
                    121:        t = NODE( qheader );
                    122:        t->first = 0;
                    123:        t->last = 0;
                    124:        s1 = hdr->first;
                    125:        while( s1 != 0 ) {
                    126:                s = NODE( qentry );
                    127:                if ( t->first == 0 )
                    128:                        t->first = s;
                    129:                else 
                    130:                        (t->last)->next = s;
                    131:                t->last = s;
                    132:                s->next = 0;
                    133:                s->nodeptr = s1->nodeptr;
                    134:                s1 = s1->next;
                    135:        }
                    136:        return( t );
                    137: }

unix.superglobalmegacorp.com

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