/* $FreeBSD: stable/2.1/sys/netiso/xebec/xebec.c 50950 1999-09-05 08:39:22Z peter $ */
/* $Source: /pub/FreeBSD/FreeBSD-CVS/src/sys/netiso/xebec/Attic/xebec.c,v $ */

#include "xebec.h"
#include "llparse.h"
#ifndef	E_TABLE
#define	E_TABLE "xebec.e"
#endif	E_TABLE

#include "main.h"
#include "sets.h"
#include <stdio.h>

extern FILE *eventfile_h, *actfile;

llaction(lln,token)
LLtoken *token;
{
	struct llattr *llattr;
	llattr = &llattrdesc[lldescindex-1];
switch(lln) {
case 1:
	llfinprod();
	break;

case 10: {

					if(strlen(llattr->llabase[3].ID.address) > 50 ) {
						fprintf(stderr,
						"Protocol name may not exceed 50 chars in length.\n");
						Exit(-1);
					}
					strcpy(protocol, llattr->llabase[3].ID.address);
					openfiles(protocol);

} break;

case 11: {

					llattr->llabase[7].pcb.isevent = 0;

} break;

case 12: {

				  fprintf(actfile, "\ntypedef %s %s%s;\n",
							  llattr->llabase[7].pcb.address,protocol, PCBNAME);
				  llattr->llabase[8].syn.type = PCB_SYN;

} break;

case 13: {
 llattr->llabase[11].part.type = (unsigned char) STATESET;
} break;

case 14: {
 end_states(eventfile_h);
} break;

case 15: {
 llattr->llabase[14].pcb.isevent = 1;
} break;

case 16: {

					fprintf(eventfile_h, "\t"); /* fmq gags on single chars */
					includecode(eventfile_h, llattr->llabase[14].pcb.address);
					fprintf(eventfile_h, "\n"); /* fmq gags on single chars */
					llattr->llabase[15].syn.type = EVENT_SYN;

} break;

case 17: {

				  	llattr->llabase[16].part.type = (unsigned char)EVENTSET;

} break;

case 18: {
 end_events();
} break;

case 19: {

					putincludes();
					putdriver(actfile, 9);

} break;

case 20: {
	if(llattr->llabase[0].pcb.isevent)  {
					fprintf(stderr,
					"Event is a list of objects enclosed by \"{}\"\n");
					Exit(-1);
				}
			  fprintf(eventfile_h, "struct ");

} break;

case 21: {
 llattr->llabase[0].pcb.address = llattr->llabase[2].ACTION.address;
} break;

case 22: {
	if( ! llattr->llabase[0].pcb.isevent)  {
					fprintf(stderr,
					"Pcb requires a type or structure definition.\"{}\"\n");
					Exit(-1);
				}
			   llattr->llabase[0].pcb.address = llattr->llabase[1].ACTION.address;

} break;

case 23: {
  llattr->llabase[0].pcb.address = llattr->llabase[1].ID.address;
} break;

case 24: {
 synonyms[llattr->llabase[0].syn.type] = stash( llattr->llabase[2].ID.address );
} break;

case 25: {
 includecode(actfile, llattr->llabase[2].ACTION.address);
} break;

case 26: {

			llattr->llabase[2].partrest.address = llattr->llabase[1].ID.address;
			llattr->llabase[2].partrest.type = llattr->llabase[0].part.type;

} break;

case 27: {
 llattr->llabase[3].parttail.type = llattr->llabase[0].part.type;
} break;

case 28: {
 llattr->llabase[1].part.type = llattr->llabase[0].parttail.type;
} break;

case 29: {

			  if(  lookup( llattr->llabase[0].partrest.type, llattr->llabase[0].partrest.address ) ) {
				fprintf(stderr, "bnf:trying to redefine obj type 0x%x, adr %s\n",
					llattr->llabase[0].partrest.type, llattr->llabase[0].partrest.address);
				Exit(-1);
			  }
			  llattr->llabase[2].setdef.type = llattr->llabase[0].partrest.type;
			  llattr->llabase[2].setdef.address = stash( llattr->llabase[0].partrest.address );
			  llattr->llabase[2].setdef.keep = 1;

} break;

case 30: {
 llattr->llabase[3].setstruct.object = llattr->llabase[2].setdef.object;
} break;

case 31: {

		 defineitem(llattr->llabase[0].partrest.type,
					llattr->llabase[0].partrest.address, llattr->llabase[1].ACTION.address);

} break;

case 32: {

			defineitem(llattr->llabase[0].partrest.type, llattr->llabase[0].partrest.address, (char *)0);

} break;

case 33: {

				if(llattr->llabase[0].setstruct.object)  {
					/* WHEN COULD THIS BE FALSE??
					 * isn't it supposed to be setstruct.object???
					 * (it used to be $ACTION.address)
					 */

					llattr->llabase[0].setstruct.object->obj_struc = llattr->llabase[1].ACTION.address;
					fprintf(eventfile_h,
						"struct %s %s%s;\n\n", llattr->llabase[1].ACTION.address,
						EV_PREFIX,  llattr->llabase[0].setstruct.object->obj_name);
				}

} break;

case 34: {

			llattr->llabase[2].setlist.setnum =
			defineset(llattr->llabase[0].setdef.type, llattr->llabase[0].setdef.address, llattr->llabase[0].setdef.keep);

} break;

case 35: {
 llattr->llabase[0].setdef.object = llattr->llabase[2].setlist.setnum;
} break;

case 36: {

		member(llattr->llabase[0].setlist.setnum, llattr->llabase[1].ID.address);
				llattr->llabase[2].setlisttail.setnum = llattr->llabase[0].setlist.setnum;

} break;

case 37: {
 llattr->llabase[2].setlist.setnum = llattr->llabase[0].setlisttail.setnum;
} break;

case 38: {
 transno ++;
} break;

case 39: {

	 	CurrentEvent /* GAG! */ = llattr->llabase[6].event.object;

} break;

case 40: {

		llattr->llabase[8].actionpart.string = llattr->llabase[7].predicatepart.string;
		llattr->llabase[8].actionpart.newstate = llattr->llabase[1].newstate.object;
		llattr->llabase[8].actionpart.oldstate = llattr->llabase[5].oldstate.object;

} break;

case 41: {

		 llattr->llabase[0].predicatepart.string = stash ( llattr->llabase[1].PREDICATE.address );

} break;

case 42: {

		llattr->llabase[0].predicatepart.string = (char *)0;

} break;

case 43: {

	  statetable( llattr->llabase[0].actionpart.string, llattr->llabase[0].actionpart.oldstate,
					llattr->llabase[0].actionpart.newstate,
					acttable(actfile, llattr->llabase[1].ACTION.address ),
					CurrentEvent );
	  if( print_trans ) {
	  	dump_trans( llattr->llabase[0].actionpart.string, llattr->llabase[0].actionpart.oldstate,
					llattr->llabase[0].actionpart.newstate,
					llattr->llabase[1].ACTION.address, CurrentEvent );
	  }

} break;

case 44: {

	  statetable(llattr->llabase[0].actionpart.string, llattr->llabase[0].actionpart.oldstate, llattr->llabase[0].actionpart.newstate,
				  0, CurrentEvent ); /* KLUDGE - remove this */
	  if( print_trans ) {
	  	dump_trans( llattr->llabase[0].actionpart.string, llattr->llabase[0].actionpart.oldstate,
					llattr->llabase[0].actionpart.newstate,
					"NULLACTION", CurrentEvent );
	  }

} break;

case 45: {

		llattr->llabase[0].oldstate.object = Lookup(STATESET, llattr->llabase[1].ID.address);

} break;

case 46: {

			llattr->llabase[1].setdef.address = (char *)0;
			llattr->llabase[1].setdef.type = (unsigned char)STATESET;
			llattr->llabase[1].setdef.keep = 0;

} break;

case 47: {

			llattr->llabase[0].oldstate.object = llattr->llabase[1].setdef.object;

} break;

case 48: {

		llattr->llabase[0].newstate.object = Lookup(STATESET, llattr->llabase[1].ID.address);

} break;

case 49: {

		extern struct Object *SameState;

		llattr->llabase[0].newstate.object = SameState;

} break;

case 50: {

			llattr->llabase[0].event.object = Lookup(EVENTSET, llattr->llabase[1].ID.address);

} break;

case 51: {

			llattr->llabase[1].setdef.address = (char *)0;
			llattr->llabase[1].setdef.type = (unsigned char)EVENTSET;
			llattr->llabase[1].setdef.keep = 0;

} break;

case 52: {

			llattr->llabase[0].event.object = llattr->llabase[1].setdef.object;

} break;
}
}
char *llstrings[] = {
	"<null>",
	"ID",
	"STRUCT",
	"SYNONYM",
	"PREDICATE",
	"ACTION",
	"PROTOCOL",
	"LBRACK",
	"RBRACK",
	"LANGLE",
	"EQUAL",
	"COMMA",
	"STAR",
	"EVENTS",
	"TRANSITIONS",
	"INCLUDE",
	"STATES",
	"SEMI",
	"PCB",
	"DEFAULT",
	"NULLACTION",
	"SAME",
	"ENDMARKER",
	"pcb",
	"syn",
	"setlist",
	"setlisttail",
	"part",
	"parttail",
	"partrest",
	"setstruct",
	"setdef",
	"translist",
	"transition",
	"event",
	"oldstate",
	"newstate",
	"predicatepart",
	"actionpart",
	"program",
	"includelist",
	"optsemi",
	"translisttail",
	"$goal$",
	(char *) 0
};
short llnterms = 23;
short llnsyms = 44;
short llnprods = 38;
short llinfinite = 10000;
short llproductions[] = {
41, -21, 5, -20, 2,
41, -22, 5,
41, -23, 1,
-24, 1, 3,

26, -36, 1,
25, -37, 11,

28, -27, 29, -26, 1,
27, -28,

30, -30, 31, -29, 10,
-31, 5,
-32,
-33, 5,

-35, 8, 25, -34, 7,
42, 33,
17, 38, -40, 37, -39, 34, 35, 10, 10, 9, -38, 36,
-50, 1,
-52, 31, -51,
-45, 1,
-47, 31, -46,
-48, 1,
-49, 21,
-41, 4,
-42, 19,
-43, 5,
-44, 20,
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,
12, -25, 5, 15,

17,

32,

22, 39,
0
};
struct llprodindex llprodindex[] = {
{   0,   0,   0 }, {   0,   5,  19 }, {   5,   3,   3 }, {   8,   3,   2 },
{  11,   3,   2 }, {  14,   0,   2 }, {  14,   3,   0 }, {  17,   3,   1 },
{  20,   0,   0 }, {  20,   5,   3 }, {  25,   2,   0 }, {  27,   0,   3 },
{  27,   5,   1 }, {  32,   2,   0 }, {  34,   1,   3 }, {  35,   2,   1 },
{  37,   0,   0 }, {  37,   5,   1 }, {  42,   2,   0 }, {  44,  12,   3 },
{  56,   2,   2 }, {  58,   3,   2 }, {  61,   2,   0 }, {  63,   3,   2 },
{  66,   2,   1 }, {  68,   2,   0 }, {  70,   2,   9 }, {  72,   2,   1 },
{  74,   2,   1 }, {  76,   2,   1 }, {  78,  29,   1 }, { 107,   4,   1 },
{ 111,   0,   1 }, { 111,   1,   1 }, { 112,   0,   1 }, { 112,   1,   1 },
{ 113,   0,   1 }, { 113,   2,   2 }, {   0,   0,   0 }
};
short llepsilon[] = {
 0, 0, 0, 0, 0, 1, 0, 0, 1, 0,
 0, 1, 0, 0, 1, 0, 1, 0, 0, 0,
 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 0, 0, 1, 0, 1, 0, 1, 0, 0
};
struct llparsetable llparsetable[] = {
{   1,   3 }, {   2,   1 }, {   5,   2 }, {   0,  23 }, {   1,   5 },
{   3,   4 }, {  12,   5 }, {   0,  24 }, {   1,   6 }, {   0,  25 },
{   8,   8 }, {  11,   7 }, {   0,  26 }, {   1,   9 }, {   0,  27 },
{   1,  10 }, {  12,  11 }, {   0,  28 }, {   1,  14 }, {   5,  13 },
{  10,  12 }, {  12,  14 }, {   0,  29 }, {   1,  16 }, {   5,  15 },
{  12,  16 }, {   0,  30 }, {   7,  17 }, {   0,  31 }, {   1,  18 },
{  21,  18 }, {   0,  32 }, {   1,  19 }, {  21,  19 }, {   0,  33 },
{   1,  20 }, {   7,  21 }, {   0,  34 }, {   1,  22 }, {   7,  23 },
{   0,  35 }, {   1,  24 }, {  21,  25 }, {   0,  36 }, {   4,  26 },
{  19,  27 }, {   0,  37 }, {   5,  28 }, {  20,  29 }, {   0,  38 },
{  12,  30 }, {   0,  39 }, {  15,  31 }, {  18,  32 }, {   0,  40 },
{   1,  34 }, {   3,  34 }, {  12,  34 }, {  17,  33 }, {   0,  41 },
{   1,  35 }, {  21,  35 }, {  22,  36 }, {   0,  42 }, {  12,  37 },
{   0,  43 }, {   0,   0 }
};
short llparseindex[] = {
 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 0, 0, 0, 0, 4, 8, 10, 13, 15, 18,
 23, 27, 29, 32, 35, 38, 41, 44, 47, 50,
 52, 55, 60, 64, 0
};
