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