Annotation of 41BSD/cmd/cifplot/queue.c, revision 1.1

1.1     ! root        1: /*******************************************************************
        !             2: *                                                                  *
        !             3: *    File: CIFPLOT/queue.c                                         *
        !             4: *    Written by Dan Fitzpatrick                                    *
        !             5: *    copyright 1980 -- Regents of the University of California     *
        !             6: *                                                                  *
        !             7: ********************************************************************/
        !             8: 
        !             9: #include <stdio.h>
        !            10: #include "defs.h"
        !            11: #include "globals.h"
        !            12: #include "structs.h"
        !            13: #include "out_structs.h"
        !            14: 
        !            15: IMPORT Element *GetList();
        !            16: 
        !            17: InitQueue(q)
        !            18: Queue *q;
        !            19: {
        !            20:     q->QStart = NIL;
        !            21:     }
        !            22: 
        !            23: PutQueue(e,q)
        !            24: Queue *q;
        !            25: Element *e;
        !            26: /* Put element `e' into queue `q' */
        !            27: {
        !            28:     e->Link = NIL;
        !            29:     if(q->QStart == NIL) {
        !            30:        q->QStart = q->QEnd = e;
        !            31:        return;
        !            32:        }
        !            33:     q->QEnd->Link = e;
        !            34:     q->QEnd = e;
        !            35:     return;
        !            36:     }
        !            37: 
        !            38: Element *
        !            39: GetQueue(q)
        !            40: Queue *q;
        !            41: /* Return the element at the front of the queue `q'
        !            42:  * If the queue is empty return NIL */
        !            43: {
        !            44:     register Element *e;
        !            45:     e = q->QStart;
        !            46:     if(q->QStart != NIL) q->QStart = q->QStart->Link;
        !            47:     return(e);
        !            48:     }
        !            49: 
        !            50: CatQueue(q1,q2)
        !            51: Queue *q1,*q2;
        !            52: /* Tack q2 onto the end of q1 */
        !            53: {
        !            54:     if(q1->QStart == NIL)
        !            55:        q1->QStart = q2->QStart;
        !            56:      else
        !            57:        q1->QEnd->Link = q2->QStart;
        !            58:     if(q2->QStart != NIL)
        !            59:        q1->QEnd = q2->QEnd;
        !            60:     }
        !            61: 
        !            62: MoveQueue(q1,q2)
        !            63: Queue *q1,*q2;
        !            64: /* Make q1 point to the same queue as q2 */
        !            65: {
        !            66:     q1->QStart = q2->QStart;
        !            67:     q1->QEnd = q2->QEnd;
        !            68:     }
        !            69: 
        !            70: InitList(l)
        !            71: List *l;
        !            72: {
        !            73:     l->Link = NIL;
        !            74:     }
        !            75: 
        !            76: PutList(e,l,f)
        !            77: List *l;
        !            78: Element *e;
        !            79: real (*f)();
        !            80: /* Insert element `e' into list `l' maintaining the ascending
        !            81:  * order of the list where `f' is a function of two arguments
        !            82:  * giving the ordinality of the elements.
        !            83:  * So if two elements `i' & `j' are compared then
        !            84:  * f(i,j) <= 0 iff i <= j.
        !            85:  * If the ordering doesn't matter substitute 0 for f */
        !            86: {
        !            87:     Element *p;
        !            88: 
        !            89:     e->Link = NIL;
        !            90:     if(f == 0) {
        !            91:        e->Link = l->Link;
        !            92:        l->Link = e;
        !            93:        return;
        !            94:        }
        !            95:     if(l->Link == NIL) {
        !            96:        l->Link = e;
        !            97:        return;
        !            98:        }
        !            99:     
        !           100:     for(p= (Element *) l;p->Link != NIL; p=p->Link)
        !           101:        if((*f)(e,p->Link) <= 0.0) {
        !           102:            e->Link = p->Link;
        !           103:            p->Link = e;
        !           104:            return;
        !           105:            }
        !           106:     p->Link = e;
        !           107:     return;
        !           108:     }
        !           109: 
        !           110: MergeActives(i,list)
        !           111: int i;
        !           112: List *list;
        !           113: {
        !           114:     Element *p,*e;
        !           115: 
        !           116:     if(ActiveEdges[i].Link == NIL) {
        !           117:        ActiveEdges[i].Link = list->Link;
        !           118:        list->Link = NIL;
        !           119:        return;
        !           120:        }
        !           121:     e = GetList(list);
        !           122:     if(e == NIL) return;
        !           123:     
        !           124:     for(p= (Element *) &(ActiveEdges[i]);p->Link != NIL; p=p->Link)
        !           125:        if(((edge *) e)->iy <= ((edge *) p->Link)->iy) {
        !           126:            e->Link = p->Link;
        !           127:            p->Link = e;
        !           128:            e = GetList(list);
        !           129:            if(e == NIL) return;
        !           130:            }
        !           131:     p->Link = e;
        !           132:     e->Link = list->Link;
        !           133:     list->Link = NIL;
        !           134:     return;
        !           135:     }
        !           136: 
        !           137: Element *
        !           138: GetList(l)
        !           139: List *l;
        !           140: /* Return the element at the front of the list `l' */
        !           141: {
        !           142:     register Element *e;
        !           143:     e = l->Link;
        !           144:     if(e != NIL) l->Link = l->Link->Link;
        !           145:     return(e);
        !           146:     }
        !           147: 
        !           148: Element *
        !           149: PeekList(l)
        !           150: List *l;
        !           151: /* return pointer to first element in list without removing it */
        !           152: {
        !           153:     return(l->Link);
        !           154:     }
        !           155: 
        !           156: SortList(l,f)
        !           157: List *l;
        !           158: real (*f)();
        !           159: /* sort list l with fuction f as in PutList */
        !           160: {
        !           161:     register Element *e,*t1,*t2;
        !           162:     int sorted;
        !           163: 
        !           164:     if( (l->Link == NIL) || (l->Link->Link == NIL) ) return;
        !           165:     sorted = 0;
        !           166:     while(!sorted) {
        !           167:        sorted = 1;
        !           168:        for(e = (Element *) l; e->Link->Link != NIL; e=e->Link)
        !           169:            if((*f)(e->Link,e->Link->Link) > 0.0) {
        !           170:                t1 = e->Link;
        !           171:                t2 = t1->Link;
        !           172:                t1->Link = t2->Link;
        !           173:                t2->Link = t1;
        !           174:                e->Link = t2;
        !           175:                sorted = 0;
        !           176:                }
        !           177:        }
        !           178:     }
        !           179: 
        !           180: int sortcnt = 0;
        !           181: 
        !           182: SortActives(i)
        !           183: int i;
        !           184: /* Does a bubble sort on ActiveList[i] */
        !           185: {
        !           186:     register Element *e,*t1,*t2;
        !           187:     Element *last;
        !           188:     int sorted;
        !           189: 
        !           190:     if( (ActiveEdges[i].Link == NIL) || (ActiveEdges[i].Link->Link == NIL) ) return;
        !           191:     sorted = 0;
        !           192:     last = NIL;
        !           193:     while(!sorted) {
        !           194:        sorted = 1;
        !           195:        sortcnt++;
        !           196:        for(e = (Element *) &(ActiveEdges[i]); e->Link->Link != last; e=e->Link) {
        !           197:            if(((edge *) e->Link)->iy > ((edge *) e->Link->Link)->iy) {
        !           198:                change[i] = 1;
        !           199:                t1 = e->Link;
        !           200:                t2 = t1->Link;
        !           201:                t1->Link = t2->Link;
        !           202:                t2->Link = t1;
        !           203:                e->Link = t2;
        !           204:                sorted = 0;
        !           205:                }
        !           206:            }
        !           207:        last = t1;
        !           208:        }
        !           209:     }
        !           210: 
        !           211: SortSummary()
        !           212: {
        !           213:     printf("%d Sort Scans\n",sortcnt);
        !           214:     }

unix.superglobalmegacorp.com

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