home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / sys / netiso / xebec / xebec.c < prev    next >
Encoding:
C/C++ Source or Header  |  1988-10-05  |  10.2 KB  |  452 lines

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