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