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