genmms.c
上传用户:itx_2006
上传日期:2007-01-06
资源大小:493k
文件大小:18k
源码类别:

编译器/解释器

开发平台:

Others

  1. /*
  2.  * genmms -- a program to make VMS makefiles for PCCTS
  3.  *
  4.  * ANTLR 1.33MR10
  5.  * Terence John Parr 1989 - 1998
  6.  * Purdue University
  7.  * U of MN
  8.  *
  9.  *
  10.  * VMS version from J.F. Pieronne
  11.  */
  12. #include <stdio.h>
  13. #include <ssdef.h>
  14. #include "pcctscfg.h" /* be sensitive to what ANTLR/DLG call the files */
  15. #define DIE return SS$_ABORT;
  16. #define DONE return 1;
  17. #ifndef require
  18. #define require(expr, err) {if ( !(expr) ) fatal(err);}
  19. #endif
  20. #define MAX_FILES 50
  21. #define MAX_CLASSES 50
  22. char *RENAME_OBJ_FLAG="/obj=",
  23.      *RENAME_EXE_FLAG="/exe=";
  24. char *dlg = "parser.dlg";
  25. char *err = "err.c";
  26. char *hdr = "stdpccts.h";
  27. char *tok = "tokens.h";
  28. char *mode = "mode.h";
  29. char *scan = "scan";
  30. char ATOKENBUFFER_O[100];
  31. char APARSER_O[100];
  32. char ASTBASE_O[100];
  33. char PCCTSAST_O[100];
  34. char LIST_O[100];
  35. char DLEXERBASE_O[100];
  36. /* Option flags */
  37. static char *project="t", *files[MAX_FILES], *classes[MAX_CLASSES];
  38. static int num_files = 0;
  39. static int num_classes = 0;
  40. static int user_lexer = 0;
  41. static char *user_token_types = NULL;
  42. static int gen_CPP = 0;
  43. static char *outdir=".";
  44. static char *dlg_class = "DLGLexer";
  45. static int gen_trees = 0;
  46. static int  gen_hoist = 0;
  47. typedef struct _Opt {
  48. char *option;
  49. int  arg;
  50. #ifdef __cplusplus
  51. void (*process)(...);
  52. #else
  53. void (*process)();
  54. #endif
  55. char *descr;
  56. } Opt;
  57. #ifdef __STDC__
  58. static void ProcessArgs(int, char **, Opt *);
  59. #else
  60. static void ProcessArgs();
  61. #endif
  62. static void
  63. pProj( s, t )
  64. char *s;
  65. char *t;
  66. {
  67. project = t;
  68. }
  69. static void
  70. pUL( s )
  71. char *s;
  72. {
  73. user_lexer = 1;
  74. }
  75. static void
  76. pCPP( s )
  77. char *s;
  78. {
  79. gen_CPP = 1;
  80. }
  81. static void
  82. pUT( s, t )
  83. char *s;
  84. char *t;
  85. {
  86. user_token_types = t;
  87. }
  88. static void
  89. pTrees( s )
  90. char *s;
  91. {
  92. gen_trees = 1;
  93. }
  94. static void
  95. pHoist( s )
  96. char *s;
  97. {
  98. gen_hoist = 1;
  99. }
  100. static void
  101. #ifdef __STDC__
  102. pFile( char *s )
  103. #else
  104. pFile( s )
  105. char *s;
  106. #endif
  107. {
  108. if ( *s=='-' )
  109. {
  110. fprintf(stderr, "invalid option: '%s'; ignored...",s);
  111. return;
  112. }
  113. require(num_files<MAX_FILES, "exceeded max # of input files");
  114. files[num_files++] = s;
  115. }
  116. static void
  117. #ifdef __STDC__
  118. pClass( char *s, char *t )
  119. #else
  120. pClass( s, t )
  121. char *s;
  122. char *t;
  123. #endif
  124. {
  125. require(num_classes<MAX_CLASSES, "exceeded max # of grammar classes");
  126. classes[num_classes++] = t;
  127. }
  128. static void
  129. #ifdef __STDC__
  130. pDLGClass( char *s, char *t )
  131. #else
  132. pDLGClass( s, t )
  133. char *s;
  134. char *t;
  135. #endif
  136. {
  137. if ( !gen_CPP ) {
  138. fprintf(stderr, "-dlg-class makes no sense without C++ mode; ignored...");
  139. }
  140. else dlg_class = t;
  141. }
  142. static void
  143. #ifdef __STDC__
  144. pOdir( char *s, char *t )
  145. #else
  146. pOdir( s, t )
  147. char *s;
  148. char *t;
  149. #endif
  150. {
  151. outdir = t;
  152. }
  153. static void
  154. #ifdef __STDC__
  155. pHdr( char *s, char *t )
  156. #else
  157. pHdr( s, t )
  158. char *s;
  159. char *t;
  160. #endif
  161. {
  162. hdr = t;
  163. }
  164. Opt options[] = {
  165.     { "-cc", 0, pCPP, "Generate C++ output"},
  166.     { "-class", 1, pClass, "Name of a grammar class defined in grammar (if C++)"},
  167.     { "-dlg-class", 1,pDLGClass,"Name of DLG lexer class (default=DLGLexer) (if C++)"},
  168.     { "-header", 1,pHdr, "Name of ANTLR standard header info (default=no file)"},
  169.     { "-o", 1, pOdir, "Directory where output files should go (default=".")"},
  170.     { "-project", 1, pProj, "Name of executable to create (default=t)"},
  171.     { "-token-types", 1, pUT, "Token types are in this file (don't use tokens.h)"},
  172.     { "-trees", 0, pTrees, "Generate ASTs"},
  173.     { "-user-lexer", 0, pUL, "Do not create a DLG-based scanner"},
  174.     { "-mrhoist",0,pHoist,      "Maintenance release style hoisting"},
  175. { "*",  0, pFile,  "" }, /* anything else is a file */
  176. { NULL, 0, NULL, NULL }
  177. };
  178. extern char *DIR();
  179. main(argc, argv)
  180. int argc;
  181. char **argv;
  182. {
  183. if ( argc == 1 ) { help(); DIE; }
  184. ProcessArgs(argc-1, &(argv[1]), options);
  185. strcpy(ATOKENBUFFER_O, ATOKENBUFFER_C);
  186. ATOKENBUFFER_O[strlen(ATOKENBUFFER_C)-strlen(CPP_FILE_SUFFIX)] = '';
  187. strcat(ATOKENBUFFER_O, OBJ_FILE_SUFFIX);
  188. strcpy(APARSER_O, APARSER_C);
  189. APARSER_O[strlen(APARSER_O)-strlen(CPP_FILE_SUFFIX)] = '';
  190. strcat(APARSER_O, OBJ_FILE_SUFFIX);
  191. strcpy(ASTBASE_O, ASTBASE_C);
  192. ASTBASE_O[strlen(ASTBASE_C)-strlen(CPP_FILE_SUFFIX)] = '';
  193. strcat(ASTBASE_O, OBJ_FILE_SUFFIX);
  194. strcpy(PCCTSAST_O, PCCTSAST_C);
  195. PCCTSAST_O[strlen(PCCTSAST_C)-strlen(CPP_FILE_SUFFIX)] = '';
  196. strcat(PCCTSAST_O, OBJ_FILE_SUFFIX);
  197. strcpy(LIST_O, LIST_C);
  198. LIST_O[strlen(LIST_C)-strlen(CPP_FILE_SUFFIX)] = '';
  199. strcat(LIST_O, OBJ_FILE_SUFFIX);
  200. strcpy(DLEXERBASE_O, DLEXERBASE_C);
  201. DLEXERBASE_O[strlen(DLEXERBASE_C)-strlen(CPP_FILE_SUFFIX)] = '';
  202. strcat(DLEXERBASE_O, OBJ_FILE_SUFFIX);
  203. if ( num_files == 0 ) fatal("no grammar files specified; exiting...");
  204. if ( !gen_CPP && num_classes>0 ) {
  205. warn("can't define classes w/o C++ mode; turning on C++ mode...n");
  206. gen_CPP=1;
  207. }
  208. if ( gen_CPP && num_classes==0 ) {
  209. fatal("must define classes >0 grammar classes in C++ moden");
  210. }
  211. mk(project, files, num_files, argc, argv);
  212. DONE;
  213. }
  214. help()
  215. {
  216. Opt *p = options;
  217. static char buf[1000+1];
  218. fprintf(stderr, "genmk [options] f1.g ... fn.gn");
  219. while ( p->option!=NULL && *(p->option) != '*' )
  220. {
  221. buf[0]='';
  222. if ( p->arg ) sprintf(buf, "%s ___", p->option);
  223. else strcpy(buf, p->option);
  224. fprintf(stderr, "t%-16s   %sn", buf, p->descr);
  225. p++;
  226. }
  227. }
  228. mk(project, files, n, argc, argv)
  229. char *project;
  230. char **files;
  231. int n;
  232. int argc;
  233. char **argv;
  234. {
  235. int i;
  236. printf("!n");
  237. printf("! PCCTS makefile for: ");
  238. pfiles(files, n, NULL);
  239. printf("n");
  240. printf("!n");
  241. printf("! Created from:");
  242. for (i=0; i<argc; i++) printf(" %s", argv[i]);
  243. printf("n");
  244. printf("!n");
  245. printf("! PCCTS release 1.33MR10n");
  246. printf("! Project: %sn", project);
  247. if ( gen_CPP ) printf("! C++ outputn");
  248. else printf("! C outputn");
  249. if ( user_lexer ) printf("! User-defined scannern");
  250. else printf("! DLG scannern");
  251. if ( user_token_types!=NULL ) printf("! User-defined token types in '%s'n", user_token_types);
  252. else printf("! ANTLR-defined token typesn");
  253. printf("!n");
  254. if ( user_token_types!=NULL ) {
  255. printf("! Make sure #tokdefs directive in ANTLR grammar lists this file:n");
  256. printf("TOKENS = %s", user_token_types);
  257. }
  258. else printf("TOKENS = %stokens.h", DIR());
  259. printf("n");
  260. printf("!n");
  261. printf("! The following filenames must be consistent with ANTLR/DLG flagsn");
  262. printf("DLG_FILE = %s%sn", DIR(), dlg);
  263. printf("ERR = %serrn", DIR());
  264. if ( strcmp(hdr,"stdpccts.h")!=0 ) printf("HDR_FILE = %s%sn", DIR(), hdr);
  265. else printf("HDR_FILE =n");
  266. if ( !gen_CPP ) printf("MOD_FILE = %s%sn", DIR(), mode);
  267. if ( !gen_CPP ) printf("SCAN = %sn", scan);
  268. else printf("SCAN = %s%sn", DIR(), dlg_class);
  269. printf("PCCTS = PCCTS_ROOTn");
  270. printf("ANTLR_H = $(PCCTS):[h]n");
  271. printf("BIN = $(PCCTS):[bin]n");
  272. printf("ANTLR = mcr $(BIN)antlrn");
  273. printf("DLG = mcr $(BIN)dlgn");
  274. printf("LNKFLAGS = /tracebackn");
  275.         if (gen_CPP)
  276.   printf("CFLAGS =/ASSUME=NOHEADER_TYPE_DEFAULT/define=(__STDC__)/include=($(ANTLR_H)");
  277.         else
  278.           printf("CFLAGS = /define=(__STDC__)/include=($(ANTLR_H)");
  279. if ( strcmp(outdir, ".")!=0 ) printf(", %s", outdir);
  280. printf(") $(COTHER)");
  281. printf("n");
  282. printf("AFLAGS =");
  283. if ( strcmp(outdir,".")!=0 ) printf(" -o %s", outdir);
  284. if ( user_lexer ) printf(" -gx");
  285. if ( gen_CPP ) printf(" -"CC"");
  286. if ( strcmp(hdr,"stdpccts.h")!=0 ) printf(" -gh %s", hdr);
  287. if ( gen_trees ) printf(" -gt");
  288.     if ( gen_hoist ) {
  289.       printf(" -mrhoist on") ;
  290.     } else {
  291.       printf(" -mrhoist off");
  292.     };
  293.     printf(" $(AOTHER)");
  294.     printf("n");
  295.     printf("DFLAGS = -"C2" -i");
  296.     if ( gen_CPP ) printf(" -"CC"");
  297.     if ( strcmp(dlg_class,"DLGLexer")!=0 ) printf(" -cl %s", dlg_class);
  298.     if ( strcmp(outdir,".")!=0 ) printf(" -o %s", outdir);
  299.     printf(" $(DOTHER)");
  300.     printf("n");
  301.     printf("GRM = ");
  302.     pfiles(files, n, NULL);
  303.     printf("n");
  304.     printf("SRC = ");
  305.     if ( gen_CPP ) pfiles(files, n, CPP_FILE_SUFFIX_NO_DOT);
  306.     else pfiles(files, n, "c");
  307.     if ( gen_CPP ) {
  308.       printf(" ,-n     ");
  309.       printf(" ");
  310.       pclasses(classes, num_classes, CPP_FILE_SUFFIX_NO_DOT);
  311.       printf(" ,-n      ");
  312.       printf("$(ANTLR_H)%s", APARSER_C);
  313.       if ( !user_lexer ) printf(", $(ANTLR_H)%s", DLEXERBASE_C);
  314.       if ( gen_trees ) {
  315. printf(" ,-n      ");
  316. printf("$(ANTLR_H)%s,", ASTBASE_C);
  317. printf(" $(ANTLR_H)%s", PCCTSAST_C);
  318. /* printf(" $(ANTLR_H)%s%s", DirectorySymbol, LIST_C); */
  319.       }
  320.       printf(" ,-n      ");
  321.       printf(" $(ANTLR_H)%s", ATOKENBUFFER_C);
  322.     }
  323.     if ( !user_lexer ) {
  324.       if ( gen_CPP ) printf(", $(SCAN)%s", CPP_FILE_SUFFIX);
  325.       else printf(", %s$(SCAN).c", DIR());
  326.     }
  327.     if ( !gen_CPP ) printf(" $(ERR).c");
  328.     printf("n");
  329.     printf("OBJ = ");
  330.     pfiles(files, n, "obj");
  331.     if ( gen_CPP ) {
  332.       printf(" ,-n     ");
  333.       printf(" ");
  334.       pclasses(classes, num_classes, "o");
  335.       printf(" ,-n      ");
  336.       printf(" %s%s", DIR(), APARSER_O);
  337.       if ( !user_lexer ) {
  338. printf(", %s%s", DIR(), DLEXERBASE_O);
  339.       }
  340.       if ( gen_trees ) {
  341. printf(" ,-n      ");
  342. printf("%s%s", DIR(), ASTBASE_O);
  343. printf(", %s%s", DIR(), PCCTSAST_O);
  344. /* printf(" %s%s", DIR(), LIST_O); */
  345.       }
  346.       printf(", %s%s", DIR(), ATOKENBUFFER_O);
  347.     }
  348.     if ( !user_lexer ) {
  349.       if ( gen_CPP ) printf(", $(SCAN)%s", OBJ_FILE_SUFFIX);
  350.       else printf(", %s$(SCAN)%s", DIR(), OBJ_FILE_SUFFIX);
  351.     }
  352.     if ( !gen_CPP ) printf(", $(ERR)%s", OBJ_FILE_SUFFIX);
  353.     printf("n");
  354.     printf("ANTLR_SPAWN = ");
  355.     if ( gen_CPP ) pfiles(files, n, CPP_FILE_SUFFIX_NO_DOT);
  356.     else pfiles(files, n, "c");
  357.     if ( gen_CPP ) {
  358.       printf(", ");
  359.       pclasses(classes, num_classes, CPP_FILE_SUFFIX_NO_DOT);
  360.       printf(" ,-n              ");
  361.       pclasses(classes, num_classes, "h");
  362.       if ( strcmp(hdr,"stdpccts.h")!=0 ) {
  363. printf(" ,-n              ");
  364. printf("$(HDR_FILE), stdpccts.h");
  365.       }
  366.     }
  367.     if ( user_lexer ) {
  368.       if ( !user_token_types ) printf(", $(TOKENS)");
  369.     }
  370.     else {
  371.       printf(", $(DLG_FILE)");
  372.       if ( !user_token_types ) printf(", $(TOKENS)");
  373.     }
  374.     if ( !gen_CPP ) printf(", $(ERR).c");
  375.     printf("n");
  376.     if ( !user_lexer ) {
  377.       if ( gen_CPP ) printf("DLG_SPAWN = $(SCAN)%s", CPP_FILE_SUFFIX);
  378.       else printf("DLG_SPAWN = %s$(SCAN).c", DIR());
  379.       if ( gen_CPP ) printf(", $(SCAN).h");
  380.       else printf(", $(MOD_FILE)");
  381.       printf("n");
  382.     }
  383.     printf("ANTLR_SPAWN_ALL_VERSIONS = ");
  384.     if ( gen_CPP ) pfiles(files, n, CPP_FILE_SUFFIX_NO_DOT);
  385.     else pfiles(files, n, "c");
  386.     if ( gen_CPP ) {
  387.       printf(";*, ");
  388.       pclasses(classes, num_classes, CPP_FILE_SUFFIX_NO_DOT);
  389.       printf(";* ,-n              ");
  390.       pclasses(classes, num_classes, "h");
  391.       printf(";*");
  392.       if ( strcmp(hdr,"stdpccts.h")!=0 ) {
  393. printf(" ,-n              ");
  394. printf("$(HDR_FILE);*, stdpccts.h;*");
  395.       }
  396.     }
  397.     if ( user_lexer ) {
  398.       if ( !user_token_types ) printf(", $(TOKENS);*");
  399.     }
  400.     else {
  401.       printf(", $(DLG_FILE);*");
  402.       if ( !user_token_types ) printf(", $(TOKENS);*");
  403.     }
  404.     if ( !gen_CPP ) printf(", $(ERR).c;*");
  405.     printf("n");
  406.     if ( !user_lexer ) {
  407.       if ( gen_CPP ) printf("DLG_SPAWN_ALL_VERSIONS = $(SCAN)%s;*", CPP_FILE_SUFFIX);
  408.       else printf("DLG_SPAWN_ALL_VERSIONS = %s$(SCAN).c;*", DIR());
  409.       if ( gen_CPP ) printf(", $(SCAN).h;*");
  410.       else printf(", $(MOD_FILE);*");
  411.       printf("n");
  412.     }
  413.     if ( gen_CPP ) {
  414.       printf("CCC=CXXn");
  415.       printf("CC=$(CCC)n");
  416.     }
  417.     else printf("CC=ccn");
  418.     /* set up dependencies */
  419.     printf("n%s.exe : $(OBJ), $(SRC)n", project);
  420.     if (gen_CPP)
  421.       printf(" CXXLINK %s %s $(LNKFLAGS) $(OBJ)n",
  422.      RENAME_EXE_FLAG,
  423.      project);
  424.     else
  425.       printf(" LINK %s %s $(LNKFLAGS) $(OBJ)n",
  426.      RENAME_EXE_FLAG,
  427.      project);
  428.     printf("n");
  429.     /* how to compile parser files */
  430.     for (i=0; i<num_files; i++)
  431.       {
  432. pfiles(&files[i], 1, "obj");
  433. if ( user_lexer ) {
  434.   printf(" : $(TOKENS)");
  435. }
  436. else {
  437.   if ( gen_CPP ) printf(" : $(TOKENS), $(SCAN).h");
  438.   else printf(" : $(MOD_FILE), $(TOKENS)");
  439. }
  440. printf(", ");
  441. if ( gen_CPP ) pfiles(&files[i], 1, CPP_FILE_SUFFIX_NO_DOT);
  442. else pfiles(&files[i], 1, "c");
  443. if ( gen_CPP && strcmp(hdr,"stdpccts.h")!=0 ) printf(", $(HDR_FILE)");
  444. printf("n");
  445. printf(" %s $(CFLAGS) %s ",gen_CPP?"$(CCC)":"$(CC)",RENAME_OBJ_FLAG);
  446. pfiles(&files[i], 1, "obj");
  447. printf(" ");
  448. if ( gen_CPP ) pfiles(&files[i], 1, CPP_FILE_SUFFIX_NO_DOT);
  449. else pfiles(&files[i], 1, "c");
  450. printf("nn");
  451.       }
  452.     /* how to compile err.c */
  453.     if ( !gen_CPP ) {
  454.       printf("$(ERR)%s : $(ERR).c", OBJ_FILE_SUFFIX);
  455.       if ( !user_lexer ) printf(", $(TOKENS)");
  456.       printf("n");
  457.       printf(" %s $(CFLAGS) %s $(ERR)%s $(ERR).c",
  458.      gen_CPP?"$(CCC)":"$(CC)",
  459.      RENAME_OBJ_FLAG,
  460.      OBJ_FILE_SUFFIX);
  461.       printf("nn");
  462.     }
  463.     /* how to compile Class.c */
  464.     for (i=0; i<num_classes; i++)
  465.       {
  466. pclasses(&classes[i], 1, "obj");
  467. if ( user_lexer ) {
  468.   printf(" : $(TOKENS)");
  469. }
  470. else {
  471.   printf(" : $(TOKENS), $(SCAN).h");
  472. }
  473. printf(", ");
  474. pclasses(&classes[i], 1, CPP_FILE_SUFFIX_NO_DOT);
  475. printf(", ");
  476. pclasses(&classes[i], 1, "h");
  477. if ( gen_CPP && strcmp(hdr,"stdpccts.h")!=0 ) printf(", $(HDR_FILE)");
  478. printf("n");
  479. printf(" %s $(CFLAGS) %s ",
  480.        gen_CPP?"$(CCC)":"$(CC)",
  481.        RENAME_OBJ_FLAG);
  482. pclasses(&classes[i], 1, "obj");
  483. printf(" ");
  484. pclasses(&classes[i], 1, CPP_FILE_SUFFIX_NO_DOT);
  485. printf("nn");
  486.       }
  487.     /* how to compile scan.c */
  488.     if ( !user_lexer ) {
  489.       if ( gen_CPP ) printf("$(SCAN)%s : $(SCAN)%s", OBJ_FILE_SUFFIX, CPP_FILE_SUFFIX);
  490.       else printf("%s$(SCAN)%s : %s$(SCAN).c", DIR(), OBJ_FILE_SUFFIX, DIR());
  491.       if ( !user_lexer ) printf(", $(TOKENS)");
  492.       printf("n");
  493.       if ( gen_CPP ) printf(" $(CCC) $(CFLAGS) %s $(SCAN)%s $(SCAN)%s",
  494.     RENAME_OBJ_FLAG,
  495.     OBJ_FILE_SUFFIX,
  496.     CPP_FILE_SUFFIX);
  497.       else printf(" $(CC) $(CFLAGS) %s %s$(SCAN)%s %s$(SCAN).c",
  498.   RENAME_OBJ_FLAG,
  499.   DIR(),
  500.   OBJ_FILE_SUFFIX,
  501.   DIR());
  502.       printf("nn");
  503.     }
  504.     printf("$(ANTLR_SPAWN) : $(GRM)n");
  505.     printf(" $(ANTLR) $(AFLAGS) $(GRM)n");
  506.     if ( !user_lexer )
  507.       {
  508. printf("n");
  509. printf("$(DLG_SPAWN) : $(DLG_FILE)n");
  510. if ( gen_CPP ) printf(" $(DLG) $(DFLAGS) $(DLG_FILE)n");
  511. else printf(" $(DLG) $(DFLAGS) $(DLG_FILE) $(SCAN).cn");
  512.       }
  513.     /* do the makes for ANTLR/DLG support */
  514.     if ( gen_CPP ) {
  515.       printf("n");
  516.       printf("%s%s : $(ANTLR_H)%sn", DIR(), APARSER_O, APARSER_C);
  517.       printf(" %s $(CFLAGS) %s ",
  518.      gen_CPP?"$(CCC)":"$(CC)",
  519.      RENAME_OBJ_FLAG);
  520.       printf("%s%s $(ANTLR_H)%sn", DIR(), APARSER_O, APARSER_C);
  521.       printf("n");
  522.       printf("%s%s : $(ANTLR_H)%sn", DIR(), ATOKENBUFFER_O, ATOKENBUFFER_C);
  523.       printf(" %s $(CFLAGS) %s ",
  524.      gen_CPP?"$(CCC)":"$(CC)",
  525.      RENAME_OBJ_FLAG);
  526.       printf("%s%s $(ANTLR_H)%sn", DIR(), ATOKENBUFFER_O, ATOKENBUFFER_C);
  527.       if ( !user_lexer ) {
  528. printf("n");
  529. printf("%s%s : $(ANTLR_H)%sn", DIR(), DLEXERBASE_O, DLEXERBASE_C);
  530. printf(" %s $(CFLAGS) %s ",
  531.        gen_CPP?"$(CCC)":"$(CC)",
  532.        RENAME_OBJ_FLAG);
  533. printf("%s%s $(ANTLR_H)%sn", DIR(), DLEXERBASE_O, DLEXERBASE_C);
  534.       }
  535.       if ( gen_trees ) {
  536. printf("n");
  537. printf("%s%s : $(ANTLR_H)%sn", DIR(), ASTBASE_O, ASTBASE_C);
  538. printf(" %s $(CFLAGS) %s ",
  539.        gen_CPP?"$(CCC)":"$(CC)",
  540.        RENAME_OBJ_FLAG);
  541. printf("%s%s $(ANTLR_H)%sn", DIR(), ASTBASE_O, ASTBASE_C);
  542. printf("n");
  543. printf("%s%s : $(ANTLR_H)%sn", DIR(), PCCTSAST_O, PCCTSAST_C);
  544. printf(" %s $(CFLAGS) %s ",
  545.        gen_CPP?"$(CCC)":"$(CC)",
  546.        RENAME_OBJ_FLAG);
  547. printf("%s%s $(ANTLR_H)%sn", DIR(), PCCTSAST_O, PCCTSAST_C);
  548. printf("n");
  549. /*
  550.   printf("%s%s : $(ANTLR_H)%s%sn", DIR(), LIST_O, DirectorySymbol, LIST_C);
  551.   printf(" %s -c $(CFLAGS) %s ",
  552.   gen_CPP?"$(CCC)":"$(CC)",RENAME_OBJ_FLAG);
  553.   printf("%s%s $(ANTLR_H)%s%sn", DIR(), LIST_O, DirectorySymbol, LIST_C);
  554.   */
  555.       }
  556.     }
  557.     /* clean and scrub targets */
  558.     printf("nclean :n");
  559.     printf(" delete *%s.*,  %s.exe.*", OBJ_FILE_SUFFIX, project);
  560.     if ( strcmp(outdir, ".")!=0 ) printf(" %s*%s;*", DIR(), OBJ_FILE_SUFFIX);
  561.     printf("n");
  562.     printf("nscrub :n");
  563.     printf(" delete *%s.*,  %s.exe;*", OBJ_FILE_SUFFIX, project);
  564.     if ( strcmp(outdir, ".")!=0 ) printf(", %s*%s.*", DIR(), OBJ_FILE_SUFFIX);
  565.     printf(", $(ANTLR_SPAWN_ALL_VERSIONS)");
  566.     if ( !user_lexer ) printf(", $(DLG_SPAWN_ALL_VERSIONS)");
  567.     printf("n");
  568. }
  569. pfiles(files, n, suffix)
  570. char **files;
  571. int n;
  572. char *suffix;
  573. {
  574.   int first=1;
  575.   while ( n>0 )
  576.     {
  577.       char *p = &(*files)[strlen(*files)-1];
  578.       if ( !first ) putchar(' ');
  579.       first=0;
  580.       while ( p > *files && *p != '.' ) --p;
  581.       if ( p == *files )
  582. {
  583.   fprintf(stderr,
  584.   "genmk: filenames must be file.suffix format: %sn",
  585.   *files);
  586.   exit(-1);
  587. }
  588.       if ( suffix == NULL ) printf("%s", *files);
  589.       else
  590. {
  591.   *p = '';
  592.   printf("%s", DIR());
  593.   if ( strcmp(suffix, "o")==0 ) printf("%s%s", *files, OBJ_FILE_SUFFIX);
  594.   else printf("%s.%s", *files, suffix);
  595.   *p = '.';
  596. }
  597.       files++;
  598.       --n;
  599.     }
  600. }
  601. pclasses(classes, n, suffix)
  602. char **classes;
  603. int n;
  604. char *suffix;
  605. {
  606. int first=1;
  607. while ( n>0 )
  608. {
  609. if ( !first ) putchar(' ');
  610. first=0;
  611. if ( suffix == NULL ) printf("%s", *classes);
  612. else {
  613. printf("%s", DIR());
  614. if ( strcmp(suffix, "o")==0 ) printf("%s%s", *classes, OBJ_FILE_SUFFIX);
  615. else printf("%s.%s", *classes, suffix);
  616. }
  617. classes++;
  618. --n;
  619. }
  620. }
  621. static void
  622. #ifdef __STDC__
  623. ProcessArgs( int argc, char **argv, Opt *options )
  624. #else
  625. ProcessArgs( argc, argv, options )
  626. int argc;
  627. char **argv;
  628. Opt *options;
  629. #endif
  630. {
  631. Opt *p;
  632. require(argv!=NULL, "ProcessArgs: command line NULL");
  633. while ( argc-- > 0 )
  634. {
  635. p = options;
  636. while ( p->option != NULL )
  637. {
  638. if ( strcmp(p->option, "*") == 0 ||
  639.  strcmp(p->option, *argv) == 0 )
  640. {
  641. if ( p->arg )
  642. {
  643. (*p->process)( *argv, *(argv+1) );
  644. argv++;
  645. argc--;
  646. }
  647. else
  648. (*p->process)( *argv );
  649. break;
  650. }
  651. p++;
  652. }
  653. argv++;
  654. }
  655. }
  656. fatal( err_)
  657. char *err_;
  658. {
  659.     fprintf(stderr, "genmk: %sn", err_);
  660.     exit(1);
  661. }
  662. warn( err_)
  663. char *err_;
  664. {
  665.     fprintf(stderr, "genmk: %sn", err_);
  666. }
  667. char *DIR()
  668. {
  669. static char buf[200+1];
  670. if ( strcmp(outdir,TopDirectory)==0 ) return "";
  671. sprintf(buf, "%s", outdir);
  672. return buf;
  673. }