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