home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / oct93 / develop / yacc.lha / Yacc / src / main.c.orig < prev    next >
Text File  |  1993-07-09  |  7KB  |  378 lines

  1. #include <signal.h>
  2. #include "defs.h"
  3.  
  4. char dflag;
  5. char lflag;
  6. char rflag;
  7. char tflag;
  8. char vflag;
  9.  
  10. char *symbol_prefix;
  11. char *file_prefix = "y";
  12. char *myname = "yacc";
  13. char *temp_form = "yacc.XXXXXXX";
  14.  
  15. int lineno;
  16. int outline;
  17.  
  18. char *action_file_name;
  19. char *code_file_name;
  20. char *defines_file_name;
  21. char *input_file_name = "";
  22. char *output_file_name;
  23. char *text_file_name;
  24. char *union_file_name;
  25. char *verbose_file_name;
  26.  
  27. FILE *action_file;    /*  a temp file, used to save actions associated    */
  28.             /*  with rules until the parser is written        */
  29. FILE *code_file;    /*  y.code.c (used when the -r option is specified) */
  30. FILE *defines_file;    /*  y.tab.h                        */
  31. FILE *input_file;    /*  the input file                    */
  32. FILE *output_file;    /*  y.tab.c                        */
  33. FILE *text_file;    /*  a temp file, used to save text until all        */
  34.             /*  symbols have been defined                */
  35. FILE *union_file;    /*  a temp file, used to save the union            */
  36.             /*  definition until all symbol have been        */
  37.             /*  defined                        */
  38. FILE *verbose_file;    /*  y.output                        */
  39.  
  40. int nitems;
  41. int nrules;
  42. int nsyms;
  43. int ntokens;
  44. int nvars;
  45.  
  46. int   start_symbol;
  47. char  **symbol_name;
  48. short *symbol_value;
  49. short *symbol_prec;
  50. char  *symbol_assoc;
  51.  
  52. short *ritem;
  53. short *rlhs;
  54. short *rrhs;
  55. short *rprec;
  56. char  *rassoc;
  57. short **derives;
  58. char *nullable;
  59.  
  60. extern char *mktemp();
  61. extern char *getenv();
  62.  
  63.  
  64. done(k)
  65. int k;
  66. {
  67.     if (action_file) { fclose(action_file); unlink(action_file_name); }
  68.     if (text_file) { fclose(text_file); unlink(text_file_name); }
  69.     if (union_file) { fclose(union_file); unlink(union_file_name); }
  70.     exit(k);
  71. }
  72.  
  73.  
  74. void
  75. onintr(signo)
  76.     int signo;
  77. {
  78.     done(1);
  79. }
  80.  
  81.  
  82. set_signals()
  83. {
  84. #ifdef SIGINT
  85.     if (signal(SIGINT, SIG_IGN) != SIG_IGN)
  86.     signal(SIGINT, onintr);
  87. #endif
  88. #ifdef SIGTERM
  89.     if (signal(SIGTERM, SIG_IGN) != SIG_IGN)
  90.     signal(SIGTERM, onintr);
  91. #endif
  92. #ifdef SIGHUP
  93.     if (signal(SIGHUP, SIG_IGN) != SIG_IGN)
  94.     signal(SIGHUP, onintr);
  95. #endif
  96. }
  97.  
  98.  
  99. usage()
  100. {
  101.     fprintf(stderr, "usage: %s [-dlrtv] [-b file_prefix] [-p symbol_prefix] filename\n", myname);
  102.     exit(1);
  103. }
  104.  
  105.  
  106. getargs(argc, argv)
  107. int argc;
  108. char *argv[];
  109. {
  110.     register int i;
  111.     register char *s;
  112.  
  113.     if (argc > 0) myname = argv[0];
  114.     for (i = 1; i < argc; ++i)
  115.     {
  116.     s = argv[i];
  117.     if (*s != '-') break;
  118.     switch (*++s)
  119.     {
  120.     case '\0':
  121.         input_file = stdin;
  122.         if (i + 1 < argc) usage();
  123.         return;
  124.  
  125.     case '-':
  126.         ++i;
  127.         goto no_more_options;
  128.  
  129.     case 'b':
  130.         if (*++s)
  131.          file_prefix = s;
  132.         else if (++i < argc)
  133.         file_prefix = argv[i];
  134.         else
  135.         usage();
  136.         continue;
  137.  
  138.     case 'd':
  139.         dflag = 1;
  140.         break;
  141.  
  142.     case 'l':
  143.         lflag = 1;
  144.         break;
  145.  
  146.     case 'p':
  147.         if (*++s)
  148.         symbol_prefix = s;
  149.         else if (++i < argc)
  150.         symbol_prefix = argv[i];
  151.         else
  152.         usage();
  153.         continue;
  154.  
  155.     case 'r':
  156.         rflag = 1;
  157.         break;
  158.  
  159.     case 't':
  160.         tflag = 1;
  161.         break;
  162.  
  163.     case 'v':
  164.         vflag = 1;
  165.         break;
  166.  
  167.     default:
  168.         usage();
  169.     }
  170.  
  171.     for (;;)
  172.     {
  173.         switch (*++s)
  174.         {
  175.         case '\0':
  176.         goto end_of_option;
  177.  
  178.         case 'd':
  179.         dflag = 1;
  180.         break;
  181.  
  182.         case 'l':
  183.         lflag = 1;
  184.         break;
  185.  
  186.         case 'r':
  187.         rflag = 1;
  188.         break;
  189.  
  190.         case 't':
  191.         tflag = 1;
  192.         break;
  193.  
  194.         case 'v':
  195.         vflag = 1;
  196.         break;
  197.  
  198.         default:
  199.         usage();
  200.         }
  201.     }
  202. end_of_option:;
  203.     }
  204.  
  205. no_more_options:;
  206.     if (i + 1 != argc) usage();
  207.     input_file_name = argv[i];
  208. }
  209.  
  210.  
  211. char *
  212. allocate(n)
  213. unsigned n;
  214. {
  215.     register char *p;
  216.  
  217.     p = NULL;
  218.     if (n)
  219.     {
  220.     p = CALLOC(1, n);
  221.     if (!p) no_space();
  222.     }
  223.     return (p);
  224. }
  225.  
  226.  
  227. create_file_names()
  228. {
  229.     int i, len;
  230.     char *tmpdir;
  231.  
  232.     tmpdir = getenv("TMPDIR");
  233.     if (tmpdir == 0) tmpdir = "/tmp";
  234.  
  235.     len = strlen(tmpdir);
  236.     i = len + 13;
  237.     if (len && tmpdir[len-1] != '/')
  238.     ++i;
  239.  
  240.     action_file_name = MALLOC(i);
  241.     if (action_file_name == 0) no_space();
  242.     text_file_name = MALLOC(i);
  243.     if (text_file_name == 0) no_space();
  244.     union_file_name = MALLOC(i);
  245.     if (union_file_name == 0) no_space();
  246.  
  247.     strcpy(action_file_name, tmpdir);
  248.     strcpy(text_file_name, tmpdir);
  249.     strcpy(union_file_name, tmpdir);
  250.  
  251.     if (len && tmpdir[len - 1] != '/')
  252.     {
  253.     action_file_name[len] = '/';
  254.     text_file_name[len] = '/';
  255.     union_file_name[len] = '/';
  256.     ++len;
  257.     }
  258.  
  259.     strcpy(action_file_name + len, temp_form);
  260.     strcpy(text_file_name + len, temp_form);
  261.     strcpy(union_file_name + len, temp_form);
  262.  
  263.     action_file_name[len + 5] = 'a';
  264.     text_file_name[len + 5] = 't';
  265.     union_file_name[len + 5] = 'u';
  266.  
  267.     mktemp(action_file_name);
  268.     mktemp(text_file_name);
  269.     mktemp(union_file_name);
  270.  
  271.     len = strlen(file_prefix);
  272.  
  273.     output_file_name = MALLOC(len + 7);
  274.     if (output_file_name == 0)
  275.     no_space();
  276.     strcpy(output_file_name, file_prefix);
  277.     strcpy(output_file_name + len, OUTPUT_SUFFIX);
  278.  
  279.     if (rflag)
  280.     {
  281.     code_file_name = MALLOC(len + 8);
  282.     if (code_file_name == 0)
  283.         no_space();
  284.     strcpy(code_file_name, file_prefix);
  285.     strcpy(code_file_name + len, CODE_SUFFIX);
  286.     }
  287.     else
  288.     code_file_name = output_file_name;
  289.  
  290.     if (dflag)
  291.     {
  292.     defines_file_name = MALLOC(len + 7);
  293.     if (defines_file_name == 0)
  294.         no_space();
  295.     strcpy(defines_file_name, file_prefix);
  296.     strcpy(defines_file_name + len, DEFINES_SUFFIX);
  297.     }
  298.  
  299.     if (vflag)
  300.     {
  301.     verbose_file_name = MALLOC(len + 8);
  302.     if (verbose_file_name == 0)
  303.         no_space();
  304.     strcpy(verbose_file_name, file_prefix);
  305.     strcpy(verbose_file_name + len, VERBOSE_SUFFIX);
  306.     }
  307. }
  308.  
  309.  
  310. open_files()
  311. {
  312.     create_file_names();
  313.  
  314.     if (input_file == 0)
  315.     {
  316.     input_file = fopen(input_file_name, "r");
  317.     if (input_file == 0)
  318.         open_error(input_file_name);
  319.     }
  320.  
  321.     action_file = fopen(action_file_name, "w");
  322.     if (action_file == 0)
  323.     open_error(action_file_name);
  324.  
  325.     text_file = fopen(text_file_name, "w");
  326.     if (text_file == 0)
  327.     open_error(text_file_name);
  328.  
  329.     if (vflag)
  330.     {
  331.     verbose_file = fopen(verbose_file_name, "w");
  332.     if (verbose_file == 0)
  333.         open_error(verbose_file_name);
  334.     }
  335.  
  336.     if (dflag)
  337.     {
  338.     defines_file = fopen(defines_file_name, "w");
  339.     if (defines_file == 0)
  340.         open_error(defines_file_name);
  341.     union_file = fopen(union_file_name, "w");
  342.     if (union_file ==  0)
  343.         open_error(union_file_name);
  344.     }
  345.  
  346.     output_file = fopen(output_file_name, "w");
  347.     if (output_file == 0)
  348.     open_error(output_file_name);
  349.  
  350.     if (rflag)
  351.     {
  352.     code_file = fopen(code_file_name, "w");
  353.     if (code_file == 0)
  354.         open_error(code_file_name);
  355.     }
  356.     else
  357.     code_file = output_file;
  358. }
  359.  
  360.  
  361. int
  362. main(argc, argv)
  363. int argc;
  364. char *argv[];
  365. {
  366.     set_signals();
  367.     getargs(argc, argv);
  368.     open_files();
  369.     reader();
  370.     lr0();
  371.     lalr();
  372.     make_parser();
  373.     verbose();
  374.     output();
  375.     done(0);
  376.     /*NOTREACHED*/
  377. }
  378.