Added upstream version.
[vlp.git] / int / queue.c
1 #include        "depend.h"
2 #include        "genint.h"
3 #include        "int.h"
4 #include        "process.h"
5 #include        "intproto.h"
6
7
8 /* Queue management */
9 /* Single linked circular lists with queue represented as pointer to rear */
10
11 queue qinit()                           /* Initialize empty queue */
12 {
13     return (NULL);
14 } /* end qinit */
15
16
17 stack push(q, e)                        /* Insert element into the queue */
18 stack q;
19 selem e;
20 {
21     stack p;
22
23     p = (stack) ballocate(sizeof(struct queuelem));
24     if (p == NULL) errsignal(RTEMEMOV);
25     p->elem = e;
26     if (q == NULL)
27     {
28         p->next = p;                    /* the lonely element of the queue */
29         q = p;
30     }
31     else
32     {
33         p->next = q->next;              /* insert at rear */
34         q->next = p;
35     }
36     return(q);
37 } /* end push */
38
39
40 qelem qfront(q)                         /* Get first element of the queue */
41 queue q;
42 {
43     if (qempty(q)){
44        fprintf( stderr, "getting first element from empty queue\n");
45        errsignal(RTESYSER);
46     }
47     return (q->next->elem);
48 } /* end qfront */
49
50
51 queue qremove(q)                        /* Remove front element from the queue */
52 queue q;
53 {
54     queue p;
55
56     if (qempty(q)){
57        fprintf( stderr, "removing first element from empty queue\n");
58        errsignal(RTESYSER);
59     }
60     p = q->next;
61     q->next = q->next->next;
62     if (p == q) q = NULL;               /* removing last element of the queue */
63     free(p);
64     return(q);
65 } /* end qremove */
66
67
68 queue qdelete(q, e)                     /* Delete arbitrary element */
69 queue q;
70 qelem e;
71 {
72     queue p, r, s;
73
74     if (qempty(q)) return(q);
75     r = q;
76     p = r->next;
77     while (p->elem != e)
78     {
79         if (p == q) return(q);
80         r = p;
81         p = p->next;
82     }
83     r->next = p->next;
84     if (r == p) s = NULL;
85     else
86         if (p == q) s = r;
87         else s = q;
88     free(p);
89     return(s);
90 } /* end qdelete */
91
92
93 queue qrotate(q)                        /* Remove front and insert at rear */
94 queue q;
95 {
96     if (qempty(q)){
97        fprintf( stderr, "rotating empty queue\n");
98        errsignal(RTESYSER);
99     }
100     return (q->next);
101 } /* end qrotate */
102
103
104 void qfree(q)
105 queue q;
106 {
107     while (!qempty(q))
108     {
109         free(qfront(q));
110         q = qremove(q);
111     }
112 } /* end qfree */