1 /* $NetBSD: xebec.c,v 1.11 2007/01/18 12:43:38 cbiere Exp $ */
2
3 #include <sys/cdefs.h>
4 __RCSID("$NetBSD: xebec.c,v 1.11 2007/01/18 12:43:38 cbiere Exp $");
5
6 #include "xebec.h"
7 #include "llparse.h"
8 #ifndef E_TABLE
9 #define E_TABLE "xebec.e"
10 #endif /* !E_TABLE */
11
12 #include "main.h"
13 #include "sets.h"
14 #include "procs.h"
15 #include <stdio.h>
16 #include <string.h>
17
18 extern FILE *eventfile_h, *actfile;
19
20 void
21 llaction(lln,token)
22 int lln;
23 LLtoken *token;
24 {
25 struct llattr *llattr;
26 (void) token;
27 llattr = &llattrdesc[lldescindex-1];
28 switch(lln) {
29 case 1:
30 llfinprod();
31 break;
32
33 case 10: {
34
35 if(strlen(llattr->llabase[3].ID.address) > 50 ) {
36 fprintf(stderr,
37 "Protocol name may not exceed 50 chars in length.\n");
38 Exit(-1);
39 }
40 strcpy(protocol, llattr->llabase[3].ID.address);
41 openfiles(protocol);
42
43 } break;
44
45 case 11: {
46
47 llattr->llabase[7].pcb.isevent = 0;
48
49 } break;
50
51 case 12: {
52
53 fprintf(actfile, "\ntypedef %s %s%s;\n",
54 llattr->llabase[7].pcb.address,protocol, PCBNAME);
55 llattr->llabase[8].syn.type = PCB_SYN;
56
57 } break;
58
59 case 13: {
60 llattr->llabase[11].part.type = (unsigned char) STATESET;
61 } break;
62
63 case 14: {
64 end_states(eventfile_h);
65 } break;
66
67 case 15: {
68 llattr->llabase[14].pcb.isevent = 1;
69 } break;
70
71 case 16: {
72
73 fprintf(eventfile_h, "\t"); /* fmq gags on single chars */
74 includecode(eventfile_h, llattr->llabase[14].pcb.address);
75 fprintf(eventfile_h, "\n"); /* fmq gags on single chars */
76 llattr->llabase[15].syn.type = EVENT_SYN;
77
78 } break;
79
80 case 17: {
81
82 llattr->llabase[16].part.type = (unsigned char)EVENTSET;
83
84 } break;
85
86 case 18: {
87 end_events();
88 } break;
89
90 case 19: {
91
92 putincludes();
93 putdriver(actfile, 9);
94
95 } break;
96
97 case 20: {
98 if(llattr->llabase[0].pcb.isevent) {
99 fprintf(stderr,
100 "Event is a list of objects enclosed by \"{}\"\n");
101 Exit(-1);
102 }
103 fprintf(eventfile_h, "struct ");
104
105 } break;
106
107 case 21: {
108 llattr->llabase[0].pcb.address = llattr->llabase[2].ACTION.address;
109 } break;
110
111 case 22: {
112 if( ! llattr->llabase[0].pcb.isevent) {
113 fprintf(stderr,
114 "Pcb requires a type or structure definition.\"{}\"\n");
115 Exit(-1);
116 }
117 llattr->llabase[0].pcb.address = llattr->llabase[1].ACTION.address;
118
119 } break;
120
121 case 23: {
122 llattr->llabase[0].pcb.address = llattr->llabase[1].ID.address;
123 } break;
124
125 case 24: {
126 synonyms[llattr->llabase[0].syn.type] = stash( llattr->llabase[2].ID.address );
127 } break;
128
129 case 25: {
130 includecode(actfile, llattr->llabase[2].ACTION.address);
131 } break;
132
133 case 26: {
134
135 llattr->llabase[2].partrest.address = llattr->llabase[1].ID.address;
136 llattr->llabase[2].partrest.type = llattr->llabase[0].part.type;
137
138 } break;
139
140 case 27: {
141 llattr->llabase[3].parttail.type = llattr->llabase[0].part.type;
142 } break;
143
144 case 28: {
145 llattr->llabase[1].part.type = llattr->llabase[0].parttail.type;
146 } break;
147
148 case 29: {
149
150 if( lookup( llattr->llabase[0].partrest.type, llattr->llabase[0].partrest.address ) ) {
151 fprintf(stderr, "bnf:trying to redefine obj type 0x%x, adr %s\n",
152 llattr->llabase[0].partrest.type, llattr->llabase[0].partrest.address);
153 Exit(-1);
154 }
155 llattr->llabase[2].setdef.type = llattr->llabase[0].partrest.type;
156 llattr->llabase[2].setdef.address = stash( llattr->llabase[0].partrest.address );
157 llattr->llabase[2].setdef.keep = 1;
158
159 } break;
160
161 case 30: {
162 llattr->llabase[3].setstruct.object = llattr->llabase[2].setdef.object;
163 } break;
164
165 case 31: {
166
167 defineitem(llattr->llabase[0].partrest.type,
168 llattr->llabase[0].partrest.address, llattr->llabase[1].ACTION.address);
169
170 } break;
171
172 case 32: {
173
174 defineitem(llattr->llabase[0].partrest.type, llattr->llabase[0].partrest.address, (char *)0);
175
176 } break;
177
178 case 33: {
179
180 if(llattr->llabase[0].setstruct.object) {
181 /* WHEN COULD THIS BE FALSE??
182 * isn't it supposed to be setstruct.object???
183 * (it used to be $ACTION.address)
184 */
185
186 llattr->llabase[0].setstruct.object->obj_struc = llattr->llabase[1].ACTION.address;
187 fprintf(eventfile_h,
188 "struct %s %s%s;\n\n", llattr->llabase[1].ACTION.address,
189 EV_PREFIX, llattr->llabase[0].setstruct.object->obj_name);
190 }
191
192 } break;
193
194 case 34: {
195
196 llattr->llabase[2].setlist.setnum =
197 defineset(llattr->llabase[0].setdef.type, llattr->llabase[0].setdef.address, llattr->llabase[0].setdef.keep);
198
199 } break;
200
201 case 35: {
202 llattr->llabase[0].setdef.object = llattr->llabase[2].setlist.setnum;
203 } break;
204
205 case 36: {
206
207 member(llattr->llabase[0].setlist.setnum, llattr->llabase[1].ID.address);
208 llattr->llabase[2].setlisttail.setnum = llattr->llabase[0].setlist.setnum;
209
210 } break;
211
212 case 37: {
213 llattr->llabase[2].setlist.setnum = llattr->llabase[0].setlisttail.setnum;
214 } break;
215
216 case 38: {
217 transno++;
218 } break;
219
220 case 39: {
221
222 CurrentEvent /* GAG! */ = llattr->llabase[6].event.object;
223
224 } break;
225
226 case 40: {
227
228 llattr->llabase[8].actionpart.string = llattr->llabase[7].predicatepart.string;
229 llattr->llabase[8].actionpart.newstate = llattr->llabase[1].newstate.object;
230 llattr->llabase[8].actionpart.oldstate = llattr->llabase[5].oldstate.object;
231
232 } break;
233
234 case 41: {
235
236 llattr->llabase[0].predicatepart.string = stash ( llattr->llabase[1].PREDICATE.address );
237
238 } break;
239
240 case 42: {
241
242 llattr->llabase[0].predicatepart.string = (char *)0;
243
244 } break;
245
246 case 43: {
247
248 statetable( llattr->llabase[0].actionpart.string, llattr->llabase[0].actionpart.oldstate,
249 llattr->llabase[0].actionpart.newstate,
250 acttable(actfile, llattr->llabase[1].ACTION.address ),
251 CurrentEvent );
252 if( print_trans ) {
253 dump_trans( llattr->llabase[0].actionpart.string, llattr->llabase[0].actionpart.oldstate,
254 llattr->llabase[0].actionpart.newstate,
255 llattr->llabase[1].ACTION.address, CurrentEvent );
256 }
257
258 } break;
259
260 case 44: {
261
262 statetable(llattr->llabase[0].actionpart.string, llattr->llabase[0].actionpart.oldstate, llattr->llabase[0].actionpart.newstate,
263 0, CurrentEvent ); /* KLUDGE - remove this */
264 if( print_trans ) {
265 dump_trans( llattr->llabase[0].actionpart.string, llattr->llabase[0].actionpart.oldstate,
266 llattr->llabase[0].actionpart.newstate,
267 "NULLACTION", CurrentEvent );
268 }
269
270 } break;
271
272 case 45: {
273
274 llattr->llabase[0].oldstate.object = Lookup(STATESET, llattr->llabase[1].ID.address);
275
276 } break;
277
278 case 46: {
279
280 llattr->llabase[1].setdef.address = (char *)0;
281 llattr->llabase[1].setdef.type = (unsigned char)STATESET;
282 llattr->llabase[1].setdef.keep = 0;
283
284 } break;
285
286 case 47: {
287
288 llattr->llabase[0].oldstate.object = llattr->llabase[1].setdef.object;
289
290 } break;
291
292 case 48: {
293
294 llattr->llabase[0].newstate.object = Lookup(STATESET, llattr->llabase[1].ID.address);
295
296 } break;
297
298 case 49: {
299
300 extern struct Object *SameState;
301
302 llattr->llabase[0].newstate.object = SameState;
303
304 } break;
305
306 case 50: {
307
308 llattr->llabase[0].event.object = Lookup(EVENTSET, llattr->llabase[1].ID.address);
309
310 } break;
311
312 case 51: {
313
314 llattr->llabase[1].setdef.address = (char *)0;
315 llattr->llabase[1].setdef.type = (unsigned char)EVENTSET;
316 llattr->llabase[1].setdef.keep = 0;
317
318 } break;
319
320 case 52: {
321
322 llattr->llabase[0].event.object = llattr->llabase[1].setdef.object;
323
324 } break;
325 }
326 }
327 char *llstrings[] = {
328 "<null>",
329 "ID",
330 "STRUCT",
331 "SYNONYM",
332 "PREDICATE",
333 "ACTION",
334 "PROTOCOL",
335 "LBRACK",
336 "RBRACK",
337 "LANGLE",
338 "EQUAL",
339 "COMMA",
340 "STAR",
341 "EVENTS",
342 "TRANSITIONS",
343 "INCLUDE",
344 "STATES",
345 "SEMI",
346 "PCB",
347 "DEFAULT",
348 "NULLACTION",
349 "SAME",
350 "ENDMARKER",
351 "pcb",
352 "syn",
353 "setlist",
354 "setlisttail",
355 "part",
356 "parttail",
357 "partrest",
358 "setstruct",
359 "setdef",
360 "translist",
361 "transition",
362 "event",
363 "oldstate",
364 "newstate",
365 "predicatepart",
366 "actionpart",
367 "program",
368 "includelist",
369 "optsemi",
370 "translisttail",
371 "$goal$",
372 (char *) 0
373 };
374 short llnterms = 23;
375 short llnsyms = 44;
376 short llnprods = 38;
377 short llinfinite = 10000;
378 short llproductions[] = {
379 41, -21, 5, -20, 2,
380 41, -22, 5,
381 41, -23, 1,
382 -24, 1, 3,
383
384 26, -36, 1,
385 25, -37, 11,
386
387 28, -27, 29, -26, 1,
388 27, -28,
389
390 30, -30, 31, -29, 10,
391 -31, 5,
392 -32,
393 -33, 5,
394
395 -35, 8, 25, -34, 7,
396 42, 33,
397 17, 38, -40, 37, -39, 34, 35, 10, 10, 9, -38, 36,
398 -50, 1,
399 -52, 31, -51,
400 -45, 1,
401 -47, 31, -46,
402 -48, 1,
403 -49, 21,
404 -41, 4,
405 -42, 19,
406 -43, 5,
407 -44, 20,
408 32, -19, 14, -18, 12, 27, -17, 24, -16, 23, -15, 13, -14, 12, 27, -13, 16, 12, 24, -12, 23, -11, 18, 40, 12, -10, 1, 6, 12,
409 12, -25, 5, 15,
410
411 17,
412
413 32,
414
415 22, 39,
416
417 };
418 struct llprodindex llprodindex[] = {
419 { 0, 0, 0 }, { 0, 5, 19 }, { 5, 3, 3 }, { 8, 3, 2 },
420 { 11, 3, 2 }, { 14, 0, 2 }, { 14, 3, 0 }, { 17, 3, 1 },
421 { 20, 0, 0 }, { 20, 5, 3 }, { 25, 2, 0 }, { 27, 0, 3 },
422 { 27, 5, 1 }, { 32, 2, 0 }, { 34, 1, 3 }, { 35, 2, 1 },
423 { 37, 0, 0 }, { 37, 5, 1 }, { 42, 2, 0 }, { 44, 12, 3 },
424 { 56, 2, 2 }, { 58, 3, 2 }, { 61, 2, 0 }, { 63, 3, 2 },
425 { 66, 2, 1 }, { 68, 2, 0 }, { 70, 2, 9 }, { 72, 2, 1 },
426 { 74, 2, 1 }, { 76, 2, 1 }, { 78, 29, 1 }, { 107, 4, 1 },
427 { 111, 0, 1 }, { 111, 1, 1 }, { 112, 0, 1 }, { 112, 1, 1 },
428 { 113, 0, 1 }, { 113, 2, 2 }, { 0, 0, 0 }
429 };
430 short llepsilon[] = {
431 0, 0, 0, 0, 0, 1, 0, 0, 1, 0,
432 0, 1, 0, 0, 1, 0, 1, 0, 0, 0,
433 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
434 0, 0, 1, 0, 1, 0, 1, 0, 0
435 };
436 struct llparsetable llparsetable[] = {
437 { 1, 3 }, { 2, 1 }, { 5, 2 }, { 0, 23 }, { 1, 5 },
438 { 3, 4 }, { 12, 5 }, { 0, 24 }, { 1, 6 }, { 0, 25 },
439 { 8, 8 }, { 11, 7 }, { 0, 26 }, { 1, 9 }, { 0, 27 },
440 { 1, 10 }, { 12, 11 }, { 0, 28 }, { 1, 14 }, { 5, 13 },
441 { 10, 12 }, { 12, 14 }, { 0, 29 }, { 1, 16 }, { 5, 15 },
442 { 12, 16 }, { 0, 30 }, { 7, 17 }, { 0, 31 }, { 1, 18 },
443 { 21, 18 }, { 0, 32 }, { 1, 19 }, { 21, 19 }, { 0, 33 },
444 { 1, 20 }, { 7, 21 }, { 0, 34 }, { 1, 22 }, { 7, 23 },
445 { 0, 35 }, { 1, 24 }, { 21, 25 }, { 0, 36 }, { 4, 26 },
446 { 19, 27 }, { 0, 37 }, { 5, 28 }, { 20, 29 }, { 0, 38 },
447 { 12, 30 }, { 0, 39 }, { 15, 31 }, { 18, 32 }, { 0, 40 },
448 { 1, 34 }, { 3, 34 }, { 12, 34 }, { 17, 33 }, { 0, 41 },
449 { 1, 35 }, { 21, 35 }, { 22, 36 }, { 0, 42 }, { 12, 37 },
450 { 0, 43 }, { 0, 0 }
451 };
452 short llparseindex[] = {
453 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
454 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
455 0, 0, 0, 0, 4, 8, 10, 13, 15, 18,
456 23, 27, 29, 32, 35, 38, 41, 44, 47, 50,
457 52, 55, 60, 64, 0
458 };
Cache object: 4db12148f857ed1487f2bcbf34bc7a90
|