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