|
|
1.1 root 1: #include <stdio.h>
2: #include "pret.h"
3:
4: #define LOOK 0
5: #define ADD 1
6:
7: struct QSET_EL {
8: char name[MAXNAME]; /* message name */
9: char status; /* usage of this message */
10: int id; /* number assigned to msg */
11: struct QSET_EL *nxtel;
12: };
13:
14: struct QSETS {
15: int nrelmnts;
16: int status; /* usage of the qset itself */
17: int qstatus; /* usage of the setowner (a queue) */
18: char setname[MAXNAME]; /* symbolic name */
19: char setowner[MAXNAME]; /* queue */
20: int qind; /* NONE if simple q, #expr if array */
21: struct QSET_EL *elmnts;
22: struct QSETS *nxtset;
23: int closed;
24: };
25:
26: struct QSETS *frstset;
27: int nrsets = 0;
28:
29: extern struct QTABLE qtable[NQUEUES];
30: extern char procname[MAXNAME];
31: extern char refname[MAXNAME];
32: extern pid, rid;
33: char *Emalloc();
34:
35: isqset(str)
36: char *str;
37: { struct QSETS *q = frstset;
38: char buf1[MAXNAME], buf2[MAXNAME];
39: int i;
40:
41: buf1[0] = '\0';
42: if (pid != NONE)
43: strncpy(buf1, procname, 8);
44: else if (rid != NONE)
45: strncpy(buf1, refname, 8);
46: strcat(buf1, ":");
47:
48: strcpy(buf2, "global:");
49: strcat(buf1, str);
50: strcat(buf2, str);
51:
52: for (i = 0; i < nrsets; i++, q = q->nxtset)
53: { if (strcmp(buf1, q->setname) == 0
54: || strcmp(buf2, q->setname) == 0)
55: return 1;
56: }
57: return 0;
58: }
59:
60: struct QSETS *
61: findset(which)
62: { struct QSETS *hook = frstset;
63: int i;
64:
65: if (which >= nrsets || which < 0)
66: whoops("cannot happen - findset");
67:
68: for (i = 0; i < which; i++)
69: hook = hook->nxtset;
70:
71: return hook;
72: }
73:
74: inqset(which, what, usage, qind)
75: char *what;
76: {
77: struct QSETS *hook = findset(which);
78: struct QSET_EL *hookl = hook->elmnts;
79: int i;
80:
81: for (i = 0; i < hook->nrelmnts; i++)
82: { if (strcmp(what, hookl->name) == 0)
83: { hookl->status |= usage;
84: if (hookl->id == -1)
85: whoops("unnumbered parameter");
86: if (qind != hook->qind)
87: yyerror("queue indexing error, qset, %s", what);
88: return hookl->id;
89: }
90: hookl = hookl->nxtel;
91: }
92:
93: return -1;
94: }
95:
96: renumqset(which, N)
97: { struct QSETS * hook = findset(which);
98: struct QSET_EL * hookl = hook->elmnts;
99: int i, j;
100:
101: qsetowner(which, 0);
102: for (i = 0, j = N; i < hook->nrelmnts; i++)
103: { hookl->id = j++;
104: hookl = hookl->nxtel;
105: }
106: return j;
107: }
108:
109: matchset(a, b)
110: { struct QSETS * one = findset(a);
111: struct QSETS * two = findset(b);
112: struct QSET_EL * onel;
113: struct QSET_EL * twol;
114: int i;
115:
116: if (one->nrelmnts != two->nrelmnts)
117: { yyerror("qset does not match formal parameter, %s", one->setname);
118: return;
119: }
120: onel = one->elmnts;
121: twol = two->elmnts;
122:
123: for (i = 0; i < one->nrelmnts; i++)
124: { onel->status |= twol->status;
125: onel = onel->nxtel;
126: twol = twol->nxtel;
127: }
128: return two->qstatus;
129: }
130:
131: matchowner(a, str, how, qind)
132: char *str;
133: { struct QSETS * hook = findset(a);
134:
135: if (strcmp(hook->setowner, str) == 0)
136: { hook->qstatus |= how;
137: if (qind != hook->qind)
138: yyerror("queue indexing error (qset ref), %s", str);
139: return 1;
140: }
141: return 0;
142: }
143:
144: struct QSET_EL *
145: mkelmnt(str, how)
146: char *str;
147: { struct QSET_EL *try = (struct QSET_EL *)
148: Emalloc( sizeof( struct QSET_EL ) );
149:
150: strcpy(try->name, str);
151: try->nxtel = NULL;
152: try->status = how;
153: try->id = -1;
154:
155: return try;
156: }
157:
158: struct QSETS *
159: mkset(str1, str2, how, qind)
160: char *str1, *str2;
161: { struct QSET_EL *hook;
162: struct QSETS *try = (struct QSETS *)
163: Emalloc( sizeof( struct QSETS ) );
164:
165: if (how == RFR)
166: yyerror("undeclared qset, %s", str1);
167:
168: try->status = how;
169: try->qstatus = 0;
170: try->nxtset = NULL;
171: strcpy(try->setname, str1);
172: strcpy(try->setowner, str2);
173: try->closed = 0;
174: try->qind = qind;
175:
176: try->nrelmnts = 0;
177: try->elmnts = mkelmnt(" tau", SAR);
178: try->nrelmnts++;
179:
180: hook = try->elmnts;
181: hook->nxtel = mkelmnt(" any", SND);
182: try->nrelmnts++;
183:
184: nrsets++;
185: return try;
186: }
187:
188: qsetowner(which, how)
189: { struct QSETS *hook = findset(which);
190: return newqname(hook->setowner, how, NONE, hook->qind);
191: }
192:
193: inset(str, str2, mask, how, qind)
194: char *str, *str2;
195: { struct QSETS *hook = frstset;
196: struct QSETS *last = frstset;
197: int i;
198: for (i = 0; i < nrsets && hook != NULL; i++)
199: { if (strcmp(hook->setname, str) == 0)
200: { if (mask == DCL)
201: yyerror("qset redeclared, %s", str);
202: hook->status |= mask;
203: break;
204: }
205: last = hook;
206: hook = hook->nxtset;
207: }
208: if (how == ADD && i == nrsets)
209: last->nxtset = mkset(str, str2, mask, qind);
210:
211: return i;
212: }
213:
214: newqset(str1, str2, mask, qind)
215: char *str1, *str2;
216: {
217: int i = nrsets;
218: char str[MAXNAME];
219:
220: if (pid != NONE)
221: strncpy(str, procname, 8);
222: else if (rid != NONE)
223: strncpy(str, refname, 8);
224: else
225: strcpy(str, "global");
226: strcat(str, ":");
227: strcat(str, str1);
228:
229: if (mask == RFR && (pid != NONE || rid != NONE))
230: { if (inset(str, str2, mask, LOOK, qind) == nrsets)
231: { strcpy(str, "global");
232: strcat(str, ":");
233: strcat(str, str1);
234: } }
235:
236: if (nrsets == 0)
237: frstset = mkset(str, str2, mask, qind);
238: else
239: i = inset(str, str2, mask, ADD, qind);
240:
241: return i;
242: }
243:
244: closeqset(which)
245: { struct QSETS *where = findset(which);
246: where->closed = 1;
247: }
248:
249: isclosed(which)
250: { struct QSETS *where = findset(which);
251: return where->closed;
252: }
253:
254: addsetname(str, which, susp)
255: char *str;
256: { struct QSETS *where = findset(which);
257: struct QSET_EL *hook = where->elmnts;
258: int i, j;
259:
260: j = newqname(where->setowner, 0, NONE, where->qind);
261: i = where->nrelmnts;
262:
263: if (i == 0)
264: where->elmnts = mkelmnt(str, 0);
265: else
266: { for (i = 1; i < where->nrelmnts; i++)
267: hook = hook->nxtel;
268:
269: hook->nxtel = mkelmnt(str, 0);
270: }
271:
272: /* if setowner is a formal parameter name
273: * the returned value `j' refers to the qset
274: * in which it was defined + an offset `MANY'
275: * if so, we must check that the message added
276: * here was also defined in the original set
277: */
278:
279: if (susp && j >= MANY && isclosed(j - MANY)) /* current set is open */
280: addmsg(str, j, 0, NORM, where->qind); /* check validity msg */
281:
282: where->nrelmnts++;
283:
284: return i;
285: }
286:
287: callist(which, hit)
288: { int i, j;
289: struct QSETS * hook = findset(which);
290: struct QSET_EL * kooh = hook->elmnts;
291:
292: for (i = 0; i < hook->nrelmnts; i++)
293: { j = addmsg(kooh->name, hit, kooh->status, NORM, hook->qind);
294: callentry(ISM, j);
295: kooh = kooh->nxtel;
296: }
297: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.