/* queueimpl.c L. Stewart October 20, 1982 9:44 PM D. Swinehart June 27, 1982 4:49 PM Zero item->next in Enqueue!!! L. Stewart February 23, 1983 4:09 PM, CallDebugger */ #include "env.h" #include "queue.h" #include "ec.h" extern int CallDebugger(); extern int IWDC(); extern int DWDC(); extern int Zero(); /* set both words of q structure to zero */ InitQueue(q) struct Queue *q; { Zero(q, lenQueue); }; /* returns item or nil (0) */ struct Element *Dequeue(q) struct Queue *q; { struct Element *item; IWDC(); item = q->head; if (item) q->head = item->next; DWDC(); return (item); }; Enqueue(q, item) struct Queue *q; struct Element *item; { if (item == 0) CallDebugger(ecQueue+1); IWDC(); if (q->head) q->tail->next = item; else q->head = item; q->tail = item; item->next = 0; DWDC(); }; /* returns true on success, else false */ int Unqueue(q, item) struct Queue *q; struct Element *item; { struct Element *p, *lastp; if (item == 0) CallDebugger(ecQueue+2); IWDC(); p = q->head; lastp = (struct Element *) q; while (p) { if (p==item) { lastp->next = p->next; if (p->next == 0) q->tail = lastp; /* item was the tail */ DWDC(); return(true); }; lastp = p; p = p->next; }; DWDC(); return(false); };