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

编译器/解释器

开发平台:

Others

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