]>
Commit | Line | Data |
---|---|---|
878ddf1f | 1 | /*\r |
2 | * genmk -- a program to make makefiles for PCCTS\r | |
3 | *\r | |
4 | * ANTLR 1.33MR23\r | |
5 | * Terence John Parr 1989 - 2000\r | |
6 | * Purdue University\r | |
7 | * U of MN\r | |
8 | */\r | |
9 | \r | |
10 | #include <stdio.h>\r | |
11 | #include <string.h>\r | |
12 | #include "pcctscfg.h" /* be sensitive to what ANTLR/DLG call the files */\r | |
13 | \r | |
14 | #ifdef VAXC\r | |
15 | #define DIE return 0;\r | |
16 | #define DONE return 1;\r | |
17 | #else\r | |
18 | #define DIE return 1;\r | |
19 | #define DONE return 0;\r | |
20 | #endif\r | |
21 | \r | |
22 | #ifndef require\r | |
23 | #define require(expr, err) {if ( !(expr) ) fatal(err);}\r | |
24 | #endif\r | |
25 | \r | |
26 | #define MAX_FILES 50\r | |
27 | #define MAX_CFILES 1600\r | |
28 | #define MAX_SFILES 50\r | |
29 | #define MAX_SORS 50\r | |
30 | #define MAX_CLASSES 50\r | |
31 | \r | |
32 | char *RENAME_OBJ_FLAG="-o",\r | |
33 | *RENAME_EXE_FLAG="-o";\r | |
34 | \r | |
35 | char *dlg = "parser.dlg";\r | |
36 | char *err = "err.c";\r | |
37 | char *hdr = "stdpccts.h";\r | |
38 | char *tok = "tokens.h";\r | |
39 | char *mode = "mode.h";\r | |
40 | char *scan = "scan";\r | |
41 | \r | |
42 | char ATOKENBUFFER_O[100];\r | |
43 | char APARSER_O[100];\r | |
44 | char ASTBASE_O[100];\r | |
45 | char PCCTSAST_O[100];\r | |
46 | char LIST_O[100];\r | |
47 | char DLEXERBASE_O[100];\r | |
48 | \r | |
49 | /* Option flags */\r | |
50 | static char *project="t", *files[MAX_FILES], *classes[MAX_CLASSES];\r | |
51 | static char *cfiles[MAX_CFILES];\r | |
52 | static char *sfiles[MAX_SORS][MAX_SFILES],*sclasses[MAX_SORS];\r | |
53 | static int num_sfiles[MAX_SORS]; /*sorcerer files in group */\r | |
54 | static int num_sors = 0; /*sorcerer groups */\r | |
55 | static int num_files = 0; /* grammar files */\r | |
56 | static int num_cfiles = 0; /* additional C/C++ files */\r | |
57 | static int num_classes = 0; /* ANTLR classes */\r | |
58 | static int user_lexer = 0;\r | |
59 | static char *user_token_types = NULL;\r | |
60 | static int gen_CPP = 0;\r | |
61 | static char *outdir=".";\r | |
62 | static char *dlg_class = "DLGLexer";\r | |
63 | static int gen_trees = 0;\r | |
64 | static int gen_hoist = 0;\r | |
65 | static int nondef_comp = 0; /* 1=compiler is non default */\r | |
66 | static char *compilerCCC="CC";\r | |
67 | static char *compilerCC="cc";\r | |
68 | static char *pccts_path="/usr/local/pccts";\r | |
69 | \r | |
70 | #ifdef __STDC__\r | |
71 | void help(void);\r | |
72 | void mk(char *project, char **files, int n, int argc, char **argv);\r | |
73 | void pfiles(char **files, int n, char *suffix);\r | |
74 | void fatal(char *msg);\r | |
75 | void warn(char *msg);\r | |
76 | #else\r | |
77 | void help();\r | |
78 | void mk();\r | |
79 | void pfiles();\r | |
80 | void fatal();\r | |
81 | void warn();\r | |
82 | #endif\r | |
83 | \r | |
84 | typedef struct _Opt {\r | |
85 | char *option;\r | |
86 | int arg;\r | |
87 | #ifdef __cplusplus\r | |
88 | void (*process)(...);\r | |
89 | #else\r | |
90 | void (*process)();\r | |
91 | #endif\r | |
92 | char *descr;\r | |
93 | } Opt;\r | |
94 | \r | |
95 | #ifdef __STDC__\r | |
96 | static void ProcessArgs(int, char **, Opt *);\r | |
97 | #else\r | |
98 | static void ProcessArgs();\r | |
99 | #endif\r | |
100 | \r | |
101 | static void\r | |
102 | #ifdef __STDC__\r | |
103 | pProj(char *s, char *t )\r | |
104 | #else\r | |
105 | pProj( s, t )\r | |
106 | char *s;\r | |
107 | char *t;\r | |
108 | #endif\r | |
109 | {\r | |
110 | project = t;\r | |
111 | }\r | |
112 | \r | |
113 | static void\r | |
114 | #ifdef __STDC__\r | |
115 | pUL( char *s )\r | |
116 | #else\r | |
117 | pUL( s )\r | |
118 | char *s;\r | |
119 | #endif\r | |
120 | {\r | |
121 | user_lexer = 1;\r | |
122 | }\r | |
123 | \r | |
124 | static void\r | |
125 | #ifdef __STDC__\r | |
126 | pCPP( char *s )\r | |
127 | #else\r | |
128 | pCPP( s )\r | |
129 | char *s;\r | |
130 | #endif\r | |
131 | {\r | |
132 | gen_CPP = 1;\r | |
133 | }\r | |
134 | \r | |
135 | static void\r | |
136 | #ifdef __STDC__\r | |
137 | pUT( char *s, char *t )\r | |
138 | #else\r | |
139 | pUT( s, t )\r | |
140 | char *s;\r | |
141 | char *t;\r | |
142 | #endif\r | |
143 | {\r | |
144 | user_token_types = t;\r | |
145 | }\r | |
146 | \r | |
147 | static void\r | |
148 | #ifdef __STDC__\r | |
149 | pTrees( char *s )\r | |
150 | #else\r | |
151 | pTrees( s )\r | |
152 | char *s;\r | |
153 | #endif\r | |
154 | {\r | |
155 | gen_trees = 1;\r | |
156 | }\r | |
157 | \r | |
158 | static void\r | |
159 | #ifdef __STDC__\r | |
160 | pHoist( char *s )\r | |
161 | #else\r | |
162 | pHoist( s )\r | |
163 | char *s;\r | |
164 | #endif\r | |
165 | {\r | |
166 | gen_hoist = 1;\r | |
167 | }\r | |
168 | \r | |
169 | static void\r | |
170 | #ifdef __STDC__\r | |
171 | pSor( char *s )\r | |
172 | #else\r | |
173 | pSor( s )\r | |
174 | char *s;\r | |
175 | #endif\r | |
176 | {\r | |
177 | require(num_sors<MAX_SORS, "exceeded max # of sorcerer groups");\r | |
178 | num_sors++;\r | |
179 | pTrees(NULL); /* silently turn on tree generation */\r | |
180 | }\r | |
181 | \r | |
182 | static void\r | |
183 | #ifdef __STDC__\r | |
184 | pSFiles( char *s, char *t )\r | |
185 | #else\r | |
186 | pSFiles( s, t )\r | |
187 | char *s;\r | |
188 | char *t;\r | |
189 | #endif\r | |
190 | {\r | |
191 | if (num_sors==0)\r | |
192 | {\r | |
193 | pSor(NULL);\r | |
194 | warn("sorcerer input file before any '-sor' option");\r | |
195 | }\r | |
196 | \r | |
197 | require(num_sfiles[num_sors-1]<MAX_SFILES,\r | |
198 | "exceeded max # of sorcerer input files");\r | |
199 | sfiles[num_sors-1][num_sfiles[num_sors-1]++] = t;\r | |
200 | }\r | |
201 | \r | |
202 | static void\r | |
203 | #ifdef __STDC__\r | |
204 | pCFiles( char *s, char *t )\r | |
205 | #else\r | |
206 | pCFiles( s, t )\r | |
207 | char *s;\r | |
208 | char *t;\r | |
209 | #endif\r | |
210 | {\r | |
211 | require(num_cfiles<MAX_CFILES, "exceeded max # of C/C++ input files");\r | |
212 | cfiles[num_cfiles++] = t;\r | |
213 | }\r | |
214 | \r | |
215 | int\r | |
216 | #ifdef __STDC__\r | |
217 | isKnownSuffix( char *s )\r | |
218 | #else\r | |
219 | isKnownSuffix( s )\r | |
220 | char *s;\r | |
221 | #endif\r | |
222 | {\r | |
223 | if(s==NULL) return 0;\r | |
224 | if (strcasecmp(s,".c")==0) return 1;\r | |
225 | if (strcasecmp(s,".cc")==0) return 1;\r | |
226 | if (strcasecmp(s,".cpp")==0) return 1;\r | |
227 | if (strcasecmp(s,".cxx")==0) return 1;\r | |
228 | if (strcasecmp(s,CPP_FILE_SUFFIX)==0) return 1;\r | |
229 | if (strcasecmp(s,".sor")==0) return 2;\r | |
230 | return 0;\r | |
231 | }\r | |
232 | \r | |
233 | static void\r | |
234 | #ifdef __STDC__\r | |
235 | pFile( char *s )\r | |
236 | #else\r | |
237 | pFile( s )\r | |
238 | char *s;\r | |
239 | #endif\r | |
240 | {\r | |
241 | if ( *s=='-' )\r | |
242 | {\r | |
243 | fprintf(stderr, "invalid option: '%s'; ignored...",s);\r | |
244 | return;\r | |
245 | }\r | |
246 | switch(isKnownSuffix(strrchr(s,'.')))\r | |
247 | {\r | |
248 | case 1: /* c/c++ */\r | |
249 | pCFiles("-cfiles",s);\r | |
250 | return;\r | |
251 | case 2: /* sorcerer */\r | |
252 | pSFiles("",s);\r | |
253 | return;\r | |
254 | default: /* grammar (ANTLR) */\r | |
255 | break;\r | |
256 | }\r | |
257 | require(num_files<MAX_FILES, "exceeded max # of input files");\r | |
258 | files[num_files++] = s;\r | |
259 | }\r | |
260 | \r | |
261 | static void\r | |
262 | #ifdef __STDC__\r | |
263 | pClass( char *s, char *t )\r | |
264 | #else\r | |
265 | pClass( s, t )\r | |
266 | char *s;\r | |
267 | char *t;\r | |
268 | #endif\r | |
269 | {\r | |
270 | if (num_sors==0)\r | |
271 | {\r | |
272 | require(num_classes<MAX_CLASSES, "exceeded max # of grammar classes");\r | |
273 | classes[num_classes++] = t;\r | |
274 | } else\r | |
275 | {\r | |
276 | sclasses[num_sors-1] = t; /* one class per sorcerer group (last valid) */\r | |
277 | }\r | |
278 | }\r | |
279 | \r | |
280 | static void\r | |
281 | #ifdef __STDC__\r | |
282 | pDLGClass( char *s, char *t )\r | |
283 | #else\r | |
284 | pDLGClass( s, t )\r | |
285 | char *s;\r | |
286 | char *t;\r | |
287 | #endif\r | |
288 | {\r | |
289 | if ( !gen_CPP ) {\r | |
290 | fprintf(stderr, "-dlg-class makes no sense without C++ mode; ignored...");\r | |
291 | }\r | |
292 | else dlg_class = t;\r | |
293 | }\r | |
294 | \r | |
295 | static void\r | |
296 | #ifdef __STDC__\r | |
297 | pOdir( char *s, char *t )\r | |
298 | #else\r | |
299 | pOdir( s, t )\r | |
300 | char *s;\r | |
301 | char *t;\r | |
302 | #endif\r | |
303 | {\r | |
304 | outdir = t;\r | |
305 | }\r | |
306 | \r | |
307 | static void\r | |
308 | #ifdef __STDC__\r | |
309 | pHdr( char *s, char *t )\r | |
310 | #else\r | |
311 | pHdr( s, t )\r | |
312 | char *s;\r | |
313 | char *t;\r | |
314 | #endif\r | |
315 | {\r | |
316 | hdr = t;\r | |
317 | }\r | |
318 | \r | |
319 | static void\r | |
320 | #ifdef __STDC__\r | |
321 | pCompiler( char *s, char *t )\r | |
322 | #else\r | |
323 | pCompiler( s, t )\r | |
324 | char *s;\r | |
325 | char *t;\r | |
326 | #endif\r | |
327 | {\r | |
328 | compilerCCC = t;\r | |
329 | compilerCC = t;\r | |
330 | nondef_comp = 1;\r | |
331 | }\r | |
332 | \r | |
333 | static void\r | |
334 | #ifdef __STDC__\r | |
335 | ppccts_path( char *s, char *t )\r | |
336 | #else\r | |
337 | ppccts_path( s, t )\r | |
338 | char *s;\r | |
339 | char *t;\r | |
340 | #endif\r | |
341 | {\r | |
342 | pccts_path = t;\r | |
343 | }\r | |
344 | \r | |
345 | Opt options[] = {\r | |
346 | { "-CC", 0, pCPP, "Generate C++ output"},\r | |
347 | { "-class", 1, pClass, "Name of a grammar class defined in grammar (if C++)"},\r | |
348 | { "-dlg-class", 1,pDLGClass,"Name of DLG lexer class (default=DLGLexer) (if C++)"},\r | |
349 | { "-header", 1,pHdr, "Name of ANTLR standard header info (default=no file)"},\r | |
350 | { "-o", 1, pOdir, "Directory where output files should go (default=\".\")"},\r | |
351 | { "-project", 1, pProj, "Name of executable to create (default=t)"},\r | |
352 | { "-token-types", 1, pUT, "Token types are in this file (don't use tokens.h)"},\r | |
353 | { "-trees", 0, pTrees, "Generate ASTs"},\r | |
354 | { "-user-lexer", 0, pUL, "Do not create a DLG-based scanner"},\r | |
355 | { "-mrhoist",0,pHoist, "Maintenance release style hoisting"},\r | |
356 | { "-cfiles",1,pCFiles, "Additional files in C or C++ to compile"},\r | |
357 | { "-sor",0,pSor, "Start of sorcerer group"},\r | |
358 | { "-pccts_path",1,ppccts_path,\r | |
359 | "Path for $PCCTS directory (default is /usr/local/pccts)"},\r | |
360 | { "-compiler",1,pCompiler,\r | |
361 | "Default compiler (default is CC/cc)"},\r | |
362 | { "*", 0,pFile, "" }, /* anything else is a file */\r | |
363 | { NULL, 0, NULL, NULL }\r | |
364 | };\r | |
365 | \r | |
366 | #ifdef __STDC__\r | |
367 | extern char *DIR(void);\r | |
368 | #else\r | |
369 | extern char *DIR();\r | |
370 | #endif\r | |
371 | \r | |
372 | #ifdef __STDC__\r | |
373 | int main(int argc, char **argv)\r | |
374 | #else\r | |
375 | int main(argc, argv)\r | |
376 | int argc;\r | |
377 | char **argv;\r | |
378 | #endif\r | |
379 | {\r | |
380 | int i;\r | |
381 | \r | |
382 | if ( argc == 1 ) { help(); DIE; }\r | |
383 | for(i=0;i<MAX_SORS;i++) num_sfiles[i]=0;\r | |
384 | \r | |
385 | ProcessArgs(argc-1, &(argv[1]), options);\r | |
386 | \r | |
387 | strcpy(ATOKENBUFFER_O, ATOKENBUFFER_C);\r | |
388 | ATOKENBUFFER_O[strlen(ATOKENBUFFER_C)-strlen(CPP_FILE_SUFFIX)] = '\0';\r | |
389 | strcat(ATOKENBUFFER_O, OBJ_FILE_SUFFIX);\r | |
390 | strcpy(APARSER_O, APARSER_C);\r | |
391 | APARSER_O[strlen(APARSER_O)-strlen(CPP_FILE_SUFFIX)] = '\0';\r | |
392 | strcat(APARSER_O, OBJ_FILE_SUFFIX);\r | |
393 | \r | |
394 | strcpy(ASTBASE_O, ASTBASE_C);\r | |
395 | ASTBASE_O[strlen(ASTBASE_C)-strlen(CPP_FILE_SUFFIX)] = '\0';\r | |
396 | strcat(ASTBASE_O, OBJ_FILE_SUFFIX);\r | |
397 | \r | |
398 | strcpy(PCCTSAST_O, PCCTSAST_C);\r | |
399 | PCCTSAST_O[strlen(PCCTSAST_C)-strlen(CPP_FILE_SUFFIX)] = '\0';\r | |
400 | strcat(PCCTSAST_O, OBJ_FILE_SUFFIX);\r | |
401 | \r | |
402 | strcpy(LIST_O, LIST_C);\r | |
403 | LIST_O[strlen(LIST_C)-strlen(CPP_FILE_SUFFIX)] = '\0';\r | |
404 | strcat(LIST_O, OBJ_FILE_SUFFIX);\r | |
405 | \r | |
406 | strcpy(DLEXERBASE_O, DLEXERBASE_C);\r | |
407 | DLEXERBASE_O[strlen(DLEXERBASE_C)-strlen(CPP_FILE_SUFFIX)] = '\0';\r | |
408 | strcat(DLEXERBASE_O, OBJ_FILE_SUFFIX);\r | |
409 | \r | |
410 | if ( num_files == 0 ) fatal("no grammar files specified; exiting...");\r | |
411 | if ( !gen_CPP && num_classes>0 ) {\r | |
412 | warn("can't define classes w/o C++ mode; turning on C++ mode...\n");\r | |
413 | gen_CPP=1;\r | |
414 | }\r | |
415 | if (!gen_CPP && num_sors) {\r | |
416 | warn("can't define sorcerer group in C mode (yet); turning on C++ mode...\n");\r | |
417 | gen_CPP=1;\r | |
418 | }\r | |
419 | if ( gen_CPP && num_classes==0 ) {\r | |
420 | fatal("must define classes >0 grammar classes in C++ mode\n");\r | |
421 | }\r | |
422 | \r | |
423 | mk(project, files, num_files, argc, argv);\r | |
424 | DONE;\r | |
425 | }\r | |
426 | \r | |
427 | #ifdef __STDC__\r | |
428 | void help(void)\r | |
429 | #else\r | |
430 | void help()\r | |
431 | #endif\r | |
432 | {\r | |
433 | Opt *p = options;\r | |
434 | static char buf[1000+1];\r | |
435 | \r | |
436 | fprintf(stderr, "genmk [options] f1.g ... fn.g\n");\r | |
437 | while ( p->option!=NULL && *(p->option) != '*' )\r | |
438 | {\r | |
439 | buf[0]='\0';\r | |
440 | if ( p->arg ) sprintf(buf, "%s ___", p->option);\r | |
441 | else strcpy(buf, p->option);\r | |
442 | fprintf(stderr, "\t%-16s %s\n", buf, p->descr);\r | |
443 | p++;\r | |
444 | }\r | |
445 | }\r | |
446 | \r | |
447 | #ifdef __STDC__\r | |
448 | void mk(char *project, char **files, int n, int argc, char **argv)\r | |
449 | #else\r | |
450 | void mk(project, files, n, argc, argv)\r | |
451 | char *project;\r | |
452 | char **files;\r | |
453 | int n;\r | |
454 | int argc;\r | |
455 | char **argv;\r | |
456 | #endif\r | |
457 | {\r | |
458 | int i,j;\r | |
459 | \r | |
460 | printf("#\n");\r | |
461 | printf("# PCCTS makefile for: ");\r | |
462 | pfiles(files, n, NULL);\r | |
463 | printf("\n");\r | |
464 | printf("#\n");\r | |
465 | printf("# Created from:");\r | |
466 | for (i=0; i<argc; i++) printf(" %s", argv[i]);\r | |
467 | printf("\n");\r | |
468 | printf("#\n");\r | |
469 | printf("# PCCTS release 1.33MR23\n");\r | |
470 | printf("# Project: %s\n", project);\r | |
471 | if ( gen_CPP ) printf("# C++ output\n");\r | |
472 | else printf("# C output\n");\r | |
473 | if ( user_lexer ) printf("# User-defined scanner\n");\r | |
474 | else printf("# DLG scanner\n");\r | |
475 | if ( user_token_types!=NULL ) printf("# User-defined token types in '%s'\n", user_token_types);\r | |
476 | else printf("# ANTLR-defined token types\n");\r | |
477 | printf("#\n");\r | |
478 | /***********\r | |
479 | printf(".SUFFIXES:\n.SUFFIXES:\t.o .cpp .c .h .g .i .dlg .sor\n"); \r | |
480 | ***********/\r | |
481 | if ( user_token_types!=NULL ) {\r | |
482 | printf("# Make sure #tokdefs directive in ANTLR grammar lists this file:\n");\r | |
483 | printf("TOKENS = %s", user_token_types);\r | |
484 | }\r | |
485 | else printf("TOKENS = %stokens.h", DIR());\r | |
486 | printf("\n");\r | |
487 | printf("#\n");\r | |
488 | printf("# The following filenames must be consistent with ANTLR/DLG flags\n");\r | |
489 | printf("DLG_FILE = %s%s\n", DIR(), dlg);\r | |
490 | printf("ERR = %serr\n", DIR());\r | |
491 | if ( strcmp(hdr,"stdpccts.h")!=0 ) printf("HDR_FILE = %s%s\n", DIR(), hdr);\r | |
492 | else printf("HDR_FILE =\n");\r | |
493 | if ( !gen_CPP ) printf("MOD_FILE = %s%s\n", DIR(), mode);\r | |
494 | if ( !gen_CPP ) printf("SCAN = %s\n", scan);\r | |
495 | else printf("SCAN = %s%s\n", DIR(), dlg_class);\r | |
496 | \r | |
497 | printf("PCCTS = %s\n",pccts_path);\r | |
498 | printf("ANTLR_H = $(PCCTS)%sh\n", DirectorySymbol);\r | |
499 | if (num_sors>0) {\r | |
500 | printf("SOR_H = $(PCCTS)%ssorcerer%sh\n", DirectorySymbol, DirectorySymbol);\r | |
501 | printf("SOR_LIB = $(PCCTS)%ssorcerer%slib\n",\r | |
502 | DirectorySymbol, DirectorySymbol);\r | |
503 | }\r | |
504 | printf("BIN = $(PCCTS)%sbin\n", DirectorySymbol);\r | |
505 | printf("ANTLR = $(BIN)%santlr\n", DirectorySymbol);\r | |
506 | printf("DLG = $(BIN)%sdlg\n", DirectorySymbol);\r | |
507 | if (num_sors>0) printf("SOR = $(BIN)%ssor\n", DirectorySymbol);\r | |
508 | printf("CFLAGS = -I. -I$(ANTLR_H)");\r | |
509 | if (num_sors>0) printf(" -I$(SOR_H)");\r | |
510 | if ( strcmp(outdir, ".")!=0 ) printf(" -I%s", outdir);\r | |
511 | printf(" $(COTHER)");\r | |
512 | printf("\n");\r | |
513 | printf("AFLAGS =");\r | |
514 | if ( strcmp(outdir,".")!=0 ) printf(" -o %s", outdir);\r | |
515 | if ( user_lexer ) printf(" -gx");\r | |
516 | if ( gen_CPP ) printf(" -CC");\r | |
517 | if ( strcmp(hdr,"stdpccts.h")!=0 ) printf(" -gh %s", hdr);\r | |
518 | if ( gen_trees ) printf(" -gt");\r | |
519 | if ( gen_hoist ) {\r | |
520 | printf(" -mrhoist on") ;\r | |
521 | } else {\r | |
522 | printf(" -mrhoist off");\r | |
523 | };\r | |
524 | printf(" $(AOTHER)");\r | |
525 | printf("\n");\r | |
526 | printf("DFLAGS = -C2 -i");\r | |
527 | if ( gen_CPP ) printf(" -CC");\r | |
528 | if ( strcmp(dlg_class,"DLGLexer")!=0 ) printf(" -cl %s", dlg_class);\r | |
529 | if ( strcmp(outdir,".")!=0 ) printf(" -o %s", outdir);\r | |
530 | printf(" $(DOTHER)");\r | |
531 | printf("\n");\r | |
532 | if (num_sors>0)\r | |
533 | {\r | |
534 | printf("SFLAGS = -CPP");\r | |
535 | if ( strcmp(outdir,".")!=0 ) printf(" -out-dir %s", outdir);\r | |
536 | printf(" $(SOTHER)\n");\r | |
537 | }\r | |
538 | printf("GRM = ");\r | |
539 | pfiles(files, n, NULL);\r | |
540 | printf("\n");\r | |
541 | printf("SRC = ");\r | |
542 | if ( gen_CPP ) pfiles(files, n, CPP_FILE_SUFFIX_NO_DOT);\r | |
543 | else pfiles(files, n, "c");\r | |
544 | if ( gen_CPP ) {\r | |
545 | printf(" \\\n\t");\r | |
546 | pclasses(classes, num_classes, CPP_FILE_SUFFIX_NO_DOT);\r | |
547 | printf(" \\\n\t");\r | |
548 | printf("$(ANTLR_H)%s%s", DirectorySymbol, APARSER_C);\r | |
549 | if ( !user_lexer ) printf(" $(ANTLR_H)%s%s", DirectorySymbol, DLEXERBASE_C);\r | |
550 | if ( gen_trees ) {\r | |
551 | printf(" \\\n\t");\r | |
552 | printf("$(ANTLR_H)%s%s", DirectorySymbol, ASTBASE_C);\r | |
553 | printf(" $(ANTLR_H)%s%s", DirectorySymbol, PCCTSAST_C);\r | |
554 | /* printf(" $(ANTLR_H)%s%s", DirectorySymbol, LIST_C); */\r | |
555 | printf(" \\\n\t");\r | |
556 | }\r | |
557 | printf(" $(ANTLR_H)%s%s", DirectorySymbol, ATOKENBUFFER_C);\r | |
558 | }\r | |
559 | if ( !user_lexer ) {\r | |
560 | if ( gen_CPP ) printf(" $(SCAN)%s", CPP_FILE_SUFFIX);\r | |
561 | else printf(" %s$(SCAN).c", DIR());\r | |
562 | }\r | |
563 | if ( !gen_CPP ) printf(" $(ERR).c");\r | |
564 | for (i=0;i<num_sors;i++)\r | |
565 | {\r | |
566 | printf(" \\\n\t");\r | |
567 | pclasses(&sclasses[i],1,CPP_FILE_SUFFIX_NO_DOT);\r | |
568 | printf(" ");\r | |
569 | pfiles(&sfiles[i][0],num_sfiles[i],CPP_FILE_SUFFIX_NO_DOT);\r | |
570 | }\r | |
571 | if(num_sors>0)\r | |
572 | printf(" \\\n\t$(SOR_LIB)%sSTreeParser.cpp", DirectorySymbol);\r | |
573 | if (num_cfiles>0)\r | |
574 | {\r | |
575 | printf(" \\\n\t");\r | |
576 | pfiles(cfiles,num_cfiles,NULL);\r | |
577 | }\r | |
578 | printf("\n\n");\r | |
579 | printf("OBJ = ");\r | |
580 | pfiles(files, n, "o");\r | |
581 | if ( gen_CPP ) {\r | |
582 | printf(" \\\n\t");\r | |
583 | pclasses(classes, num_classes, "o");\r | |
584 | printf(" \\\n\t");\r | |
585 | printf("%s%s", DIR(), APARSER_O);\r | |
586 | if ( !user_lexer ) {\r | |
587 | printf(" %s%s", DIR(), DLEXERBASE_O);\r | |
588 | }\r | |
589 | if ( gen_trees ) {\r | |
590 | printf(" \\\n\t");\r | |
591 | printf("%s%s", DIR(), ASTBASE_O);\r | |
592 | printf(" %s%s", DIR(), PCCTSAST_O);\r | |
593 | /* printf(" %s%s", DIR(), LIST_O); */\r | |
594 | printf(" \\\n\t");\r | |
595 | }\r | |
596 | printf(" %s%s", DIR(), ATOKENBUFFER_O);\r | |
597 | }\r | |
598 | if ( !user_lexer ) {\r | |
599 | if ( gen_CPP ) printf(" $(SCAN)%s", OBJ_FILE_SUFFIX);\r | |
600 | else printf(" %s$(SCAN)%s", DIR(), OBJ_FILE_SUFFIX);\r | |
601 | }\r | |
602 | if ( !gen_CPP ) printf(" $(ERR)%s", OBJ_FILE_SUFFIX);\r | |
603 | for (i=0;i<num_sors;i++)\r | |
604 | {\r | |
605 | printf(" \\\n\t");\r | |
606 | pclasses(&sclasses[i],1,"o");\r | |
607 | printf(" ");\r | |
608 | pfiles(&sfiles[i][0],num_sfiles[i],"o");\r | |
609 | }\r | |
610 | if(num_sors>0) printf(" \\\n\tSTreeParser.o");\r | |
611 | if (num_cfiles>0)\r | |
612 | {\r | |
613 | printf(" \\\n\t");\r | |
614 | pfiles(cfiles,num_cfiles,"o");\r | |
615 | }\r | |
616 | printf("\n\n");\r | |
617 | \r | |
618 | printf("ANTLR_SPAWN = ");\r | |
619 | if ( gen_CPP ) pfiles(files, n, CPP_FILE_SUFFIX_NO_DOT);\r | |
620 | else pfiles(files, n, "c");\r | |
621 | if ( gen_CPP ) {\r | |
622 | printf(" ");\r | |
623 | pclasses(classes, num_classes, CPP_FILE_SUFFIX_NO_DOT);\r | |
624 | printf(" \\\n\t\t");\r | |
625 | pclasses(classes, num_classes, "h");\r | |
626 | if ( strcmp(hdr,"stdpccts.h")!=0 ) {\r | |
627 | printf(" \\\n\t\t");\r | |
628 | printf("$(HDR_FILE) stdpccts.h");\r | |
629 | }\r | |
630 | }\r | |
631 | if ( user_lexer ) {\r | |
632 | if ( !user_token_types ) printf(" $(TOKENS)");\r | |
633 | }\r | |
634 | else {\r | |
635 | printf(" $(DLG_FILE)");\r | |
636 | if ( !user_token_types ) printf(" $(TOKENS)");\r | |
637 | }\r | |
638 | if ( !gen_CPP ) printf(" $(ERR).c");\r | |
639 | printf("\n");\r | |
640 | \r | |
641 | if ( !user_lexer ) {\r | |
642 | if ( gen_CPP ) printf("DLG_SPAWN = $(SCAN)%s", CPP_FILE_SUFFIX);\r | |
643 | else printf("DLG_SPAWN = %s$(SCAN).c", DIR());\r | |
644 | if ( gen_CPP ) printf(" $(SCAN).h");\r | |
645 | if ( !gen_CPP ) printf(" $(MOD_FILE)");\r | |
646 | printf("\n");\r | |
647 | }\r | |
648 | \r | |
649 | if ( gen_CPP ) {\r | |
650 | if ( !nondef_comp )\r | |
651 | printf("ifdef CXX\nCCC = $(CXX)\nendif\n\nifndef CCC\n");\r | |
652 | printf("CCC = %s\n",compilerCCC);\r | |
653 | if ( !nondef_comp ) printf("endif\n\n");\r | |
654 | }\r | |
655 | else\r | |
656 | {\r | |
657 | if ( !nondef_comp ) printf("ifndef CC\n");\r | |
658 | printf("CC = %s\n",compilerCC);\r | |
659 | if ( !nondef_comp ) printf("endif\n\n");\r | |
660 | }\r | |
661 | \r | |
662 | /* set up dependencies */\r | |
663 | printf("\n%s : $(SRC) $(OBJ)\n", project);\r | |
664 | printf("\t%s %s %s $(CFLAGS) $(OBJ)\n",\r | |
665 | gen_CPP?"$(CCC)":"$(CC)",\r | |
666 | RENAME_EXE_FLAG,\r | |
667 | project);\r | |
668 | printf("\n");\r | |
669 | \r | |
670 | /* implicit rules */\r | |
671 | \r | |
672 | /* if(gen_CPP)\r | |
673 | printf("%%.o : %%.cpp\n\t$(CCC) -c $(CFLAGS) $<\n\n");\r | |
674 | \r | |
675 | printf("%%.o : %%.c\n\t%s -c $(CFLAGS) $<\n\n",\r | |
676 | gen_CPP?"$(CCC)":"$(CC)");\r | |
677 | */\r | |
678 | /* how to compile parser files */\r | |
679 | \r | |
680 | for (i=0; i<num_files; i++)\r | |
681 | {\r | |
682 | pfiles(&files[i], 1, "o");\r | |
683 | if ( user_lexer ) {\r | |
684 | printf(" : $(TOKENS)");\r | |
685 | }\r | |
686 | else {\r | |
687 | if ( gen_CPP ) printf(" : $(TOKENS) $(SCAN).h");\r | |
688 | else printf(" : $(MOD_FILE) $(TOKENS)");\r | |
689 | }\r | |
690 | printf(" ");\r | |
691 | if ( gen_CPP ) pfiles(&files[i], 1, CPP_FILE_SUFFIX_NO_DOT);\r | |
692 | else pfiles(&files[i], 1, "c");\r | |
693 | if ( gen_CPP && strcmp(hdr,"stdpccts.h")!=0 ) printf(" $(HDR_FILE)");\r | |
694 | printf("\n");\r | |
695 | printf("\t%s -c $(CFLAGS) %s ",\r | |
696 | gen_CPP?"$(CCC)":"$(CC)",RENAME_OBJ_FLAG);\r | |
697 | pfiles(&files[i], 1, "o");\r | |
698 | printf(" ");\r | |
699 | if ( gen_CPP ) pfiles(&files[i], 1, CPP_FILE_SUFFIX_NO_DOT);\r | |
700 | else pfiles(&files[i], 1, "c");\r | |
701 | printf("\n\n");\r | |
702 | }\r | |
703 | \r | |
704 | for (i=0; i<num_cfiles; i++)\r | |
705 | {\r | |
706 | pfiles(&cfiles[i], 1, "o");\r | |
707 | printf(" : ");\r | |
708 | pfiles(&cfiles[i], 1, NULL);\r | |
709 | if ( gen_CPP && strcmp(hdr,"stdpccts.h")!=0 ) printf(" $(HDR_FILE)");\r | |
710 | /*** printf(" "); ***/\r | |
711 | /*** pfiles(&cfiles[i], 1, "h"); ***/\r | |
712 | printf("\n");\r | |
713 | printf("\t%s -c $(CFLAGS) %s ",\r | |
714 | gen_CPP?"$(CCC)":"$(CC)",RENAME_OBJ_FLAG);\r | |
715 | pfiles(&cfiles[i], 1, "o");\r | |
716 | printf(" ");\r | |
717 | pfiles(&cfiles[i], 1, NULL);\r | |
718 | printf("\n\n");\r | |
719 | \r | |
720 | /*\r | |
721 | * pfiles(&cfiles[i], 1, "h");\r | |
722 | * printf(" :\ntouch ");\r | |
723 | * pfiles(&cfiles[i], 1, "h");\r | |
724 | * printf("\n\n");\r | |
725 | */\r | |
726 | }\r | |
727 | \r | |
728 | /* how to compile err.c */\r | |
729 | if ( !gen_CPP ) {\r | |
730 | printf("$(ERR)%s : $(ERR).c", OBJ_FILE_SUFFIX);\r | |
731 | if ( !user_lexer ) printf(" $(TOKENS)");\r | |
732 | printf("\n");\r | |
733 | printf("\t%s -c $(CFLAGS) %s $(ERR)%s $(ERR).c",\r | |
734 | gen_CPP?"$(CCC)":"$(CC)",\r | |
735 | RENAME_OBJ_FLAG,\r | |
736 | OBJ_FILE_SUFFIX);\r | |
737 | printf("\n\n");\r | |
738 | }\r | |
739 | \r | |
740 | /* how to compile Class.c */\r | |
741 | for (i=0; i<num_classes; i++)\r | |
742 | {\r | |
743 | pclasses(&classes[i], 1, "o");\r | |
744 | if ( user_lexer ) {\r | |
745 | printf(" : $(TOKENS)");\r | |
746 | }\r | |
747 | else {\r | |
748 | printf(" : $(TOKENS) $(SCAN).h");\r | |
749 | }\r | |
750 | printf(" ");\r | |
751 | pclasses(&classes[i], 1, CPP_FILE_SUFFIX_NO_DOT);\r | |
752 | printf(" ");\r | |
753 | pclasses(&classes[i], 1, "h");\r | |
754 | if ( gen_CPP && strcmp(hdr,"stdpccts.h")!=0 ) printf(" $(HDR_FILE)");\r | |
755 | printf("\n");\r | |
756 | printf("\t%s -c $(CFLAGS) %s ",\r | |
757 | gen_CPP?"$(CCC)":"$(CC)",\r | |
758 | RENAME_OBJ_FLAG);\r | |
759 | pclasses(&classes[i], 1, "o");\r | |
760 | printf(" ");\r | |
761 | pclasses(&classes[i], 1, CPP_FILE_SUFFIX_NO_DOT);\r | |
762 | printf("\n\n");\r | |
763 | }\r | |
764 | \r | |
765 | /* how to compile scan.c */\r | |
766 | if ( !user_lexer ) {\r | |
767 | if ( gen_CPP ) printf("$(SCAN)%s : $(SCAN)%s", OBJ_FILE_SUFFIX, CPP_FILE_SUFFIX);\r | |
768 | else printf("%s$(SCAN)%s : %s$(SCAN).c", DIR(), OBJ_FILE_SUFFIX, DIR());\r | |
769 | if ( !user_lexer ) printf(" $(TOKENS)");\r | |
770 | printf("\n");\r | |
771 | if ( gen_CPP ) printf("\t$(CCC) -c $(CFLAGS) %s $(SCAN)%s $(SCAN)%s",\r | |
772 | RENAME_OBJ_FLAG,\r | |
773 | OBJ_FILE_SUFFIX,\r | |
774 | CPP_FILE_SUFFIX);\r | |
775 | else printf("\t$(CC) -c $(CFLAGS) %s %s$(SCAN)%s %s$(SCAN).c",\r | |
776 | RENAME_OBJ_FLAG,\r | |
777 | DIR(),\r | |
778 | OBJ_FILE_SUFFIX,\r | |
779 | DIR());\r | |
780 | printf("\n\n");\r | |
781 | }\r | |
782 | /* how to compile sorcerer classes */\r | |
783 | for (i=0;i<num_sors;i++)\r | |
784 | {\r | |
785 | pclasses(&sclasses[i], 1, "o");\r | |
786 | printf(" : ");\r | |
787 | pclasses(&sclasses[i], 1, CPP_FILE_SUFFIX_NO_DOT);\r | |
788 | printf(" ");\r | |
789 | pclasses(&sclasses[i], 1, "h");\r | |
790 | if ( gen_CPP && strcmp(hdr,"stdpccts.h")!=0 ) printf(" $(HDR_FILE)");\r | |
791 | printf("\n");\r | |
792 | printf("\t%s -c $(CFLAGS) %s ",\r | |
793 | gen_CPP?"$(CCC)":"$(CC)",\r | |
794 | RENAME_OBJ_FLAG);\r | |
795 | pclasses(&sclasses[i], 1, "o");\r | |
796 | printf(" ");\r | |
797 | pclasses(&sclasses[i], 1, CPP_FILE_SUFFIX_NO_DOT);\r | |
798 | printf("\n\n");\r | |
799 | /* how to compile i-th sorcerer's files*/\r | |
800 | for (j=0; j<num_sfiles[i]; j++)\r | |
801 | {\r | |
802 | pfiles(&sfiles[i][j], 1, "o");\r | |
803 | printf(" : ");\r | |
804 | if ( gen_CPP ) pfiles(&sfiles[i][j], 1, CPP_FILE_SUFFIX_NO_DOT);\r | |
805 | else pfiles(&sfiles[i][j], 1, "c");\r | |
806 | if ( gen_CPP && strcmp(hdr,"stdpccts.h")!=0 ) printf(" $(HDR_FILE)");\r | |
807 | printf("\n");\r | |
808 | printf("\t%s -c $(CFLAGS) %s ",\r | |
809 | gen_CPP?"$(CCC)":"$(CC)",RENAME_OBJ_FLAG);\r | |
810 | pfiles(&sfiles[i][j], 1, "o");\r | |
811 | printf(" ");\r | |
812 | if ( gen_CPP ) pfiles(&sfiles[i][j], 1, CPP_FILE_SUFFIX_NO_DOT);\r | |
813 | else pfiles(&sfiles[i][j], 1, "c");\r | |
814 | printf("\n\n");\r | |
815 | }\r | |
816 | if ( gen_CPP ) pfiles(&sfiles[i][0], num_sfiles[i], CPP_FILE_SUFFIX_NO_DOT);\r | |
817 | else pfiles(&sfiles[i][0], num_sfiles[i], "c");\r | |
818 | if ( gen_CPP )\r | |
819 | {\r | |
820 | printf(" ");\r | |
821 | pclasses(&sclasses[i], 1, CPP_FILE_SUFFIX_NO_DOT);\r | |
822 | printf(" ");\r | |
823 | pclasses(&sclasses[i], 1, "h");\r | |
824 | if ( strcmp(hdr,"stdpccts.h")!=0 ) \r | |
825 | {\r | |
826 | printf(" ");\r | |
827 | printf("$(HDR_FILE) stdpccts.h");\r | |
828 | }\r | |
829 | }\r | |
830 | printf(" : ");\r | |
831 | pfiles(&sfiles[i][0],num_sfiles[i],NULL);\r | |
832 | printf("\n\t$(SOR) $(SFLAGS) ");\r | |
833 | pfiles(&sfiles[i][0],num_sfiles[i],NULL);\r | |
834 | printf("\n\n");\r | |
835 | }\r | |
836 | if(num_sors>0)\r | |
837 | {\r | |
838 | printf("STreeParser%s : $(SOR_LIB)%sSTreeParser.cpp\n",\r | |
839 | OBJ_FILE_SUFFIX,DirectorySymbol);\r | |
840 | printf("\t%s -c $(CFLAGS) %s ",\r | |
841 | gen_CPP?"$(CCC)":"$(CC)",RENAME_OBJ_FLAG);\r | |
842 | printf("STreeParser%s ",OBJ_FILE_SUFFIX);\r | |
843 | printf("$(SOR_LIB)%sSTreeParser.cpp\n\n",DirectorySymbol);\r | |
844 | }\r | |
845 | \r | |
846 | printf("$(ANTLR_SPAWN) : $(GRM)\n");\r | |
847 | printf("\t$(ANTLR) $(AFLAGS) $(GRM)\n");\r | |
848 | \r | |
849 | if ( !user_lexer )\r | |
850 | {\r | |
851 | printf("\n");\r | |
852 | printf("$(DLG_SPAWN) : $(DLG_FILE)\n");\r | |
853 | if ( gen_CPP ) printf("\t$(DLG) $(DFLAGS) $(DLG_FILE)\n");\r | |
854 | else printf("\t$(DLG) $(DFLAGS) $(DLG_FILE) $(SCAN).c\n");\r | |
855 | }\r | |
856 | \r | |
857 | /* do the makes for ANTLR/DLG support */\r | |
858 | if ( gen_CPP ) {\r | |
859 | printf("\n");\r | |
860 | printf("%s%s : $(ANTLR_H)%s%s\n", DIR(), APARSER_O, DirectorySymbol, APARSER_C);\r | |
861 | printf("\t%s -c $(CFLAGS) %s ",\r | |
862 | gen_CPP?"$(CCC)":"$(CC)",\r | |
863 | RENAME_OBJ_FLAG);\r | |
864 | printf("%s%s $(ANTLR_H)%s%s\n", DIR(), APARSER_O, DirectorySymbol, APARSER_C);\r | |
865 | printf("\n");\r | |
866 | printf("%s%s : $(ANTLR_H)%s%s\n", DIR(), ATOKENBUFFER_O, DirectorySymbol, ATOKENBUFFER_C);\r | |
867 | printf("\t%s -c $(CFLAGS) %s ",\r | |
868 | gen_CPP?"$(CCC)":"$(CC)",\r | |
869 | RENAME_OBJ_FLAG);\r | |
870 | printf("%s%s $(ANTLR_H)%s%s\n", DIR(), ATOKENBUFFER_O, DirectorySymbol, ATOKENBUFFER_C);\r | |
871 | if ( !user_lexer ) {\r | |
872 | printf("\n");\r | |
873 | printf("%s%s : $(ANTLR_H)%s%s\n", DIR(), DLEXERBASE_O, DirectorySymbol, DLEXERBASE_C);\r | |
874 | printf("\t%s -c $(CFLAGS) %s ",\r | |
875 | gen_CPP?"$(CCC)":"$(CC)",\r | |
876 | RENAME_OBJ_FLAG);\r | |
877 | printf("%s%s $(ANTLR_H)%s%s\n", DIR(), DLEXERBASE_O, DirectorySymbol, DLEXERBASE_C);\r | |
878 | }\r | |
879 | if ( gen_trees ) {\r | |
880 | printf("\n");\r | |
881 | printf("%s%s : $(ANTLR_H)%s%s\n", DIR(), ASTBASE_O, DirectorySymbol, ASTBASE_C);\r | |
882 | printf("\t%s -c $(CFLAGS) %s ",\r | |
883 | gen_CPP?"$(CCC)":"$(CC)",\r | |
884 | RENAME_OBJ_FLAG);\r | |
885 | printf("%s%s $(ANTLR_H)%s%s\n", DIR(), ASTBASE_O, DirectorySymbol, ASTBASE_C);\r | |
886 | printf("\n");\r | |
887 | printf("%s%s : $(ANTLR_H)%s%s\n", DIR(), PCCTSAST_O, DirectorySymbol, PCCTSAST_C);\r | |
888 | printf("\t%s -c $(CFLAGS) %s ",\r | |
889 | gen_CPP?"$(CCC)":"$(CC)",\r | |
890 | RENAME_OBJ_FLAG);\r | |
891 | printf("%s%s $(ANTLR_H)%s%s\n", DIR(), PCCTSAST_O, DirectorySymbol, PCCTSAST_C);\r | |
892 | printf("\n");\r | |
893 | /*\r | |
894 | printf("%s%s : $(ANTLR_H)%s%s\n", DIR(), LIST_O, DirectorySymbol, LIST_C);\r | |
895 | printf("\t%s -c $(CFLAGS) %s ",\r | |
896 | gen_CPP?"$(CCC)":"$(CC)",RENAME_OBJ_FLAG);\r | |
897 | printf("%s%s $(ANTLR_H)%s%s\n", DIR(), LIST_O, DirectorySymbol, LIST_C);\r | |
898 | */\r | |
899 | }\r | |
900 | }\r | |
901 | \r | |
902 | /* clean and scrub targets */\r | |
903 | \r | |
904 | printf("\nclean:\n");\r | |
905 | printf("\trm -f *%s core %s", OBJ_FILE_SUFFIX, project);\r | |
906 | if ( strcmp(outdir, ".")!=0 ) printf(" %s*%s", DIR(), OBJ_FILE_SUFFIX);\r | |
907 | printf("\n");\r | |
908 | \r | |
909 | printf("\nscrub: clean\n");\r | |
910 | /* printf("\trm -f *%s core %s", OBJ_FILE_SUFFIX, project); */\r | |
911 | /* if ( strcmp(outdir, ".")!=0 ) printf(" %s*%s", DIR(), OBJ_FILE_SUFFIX); */\r | |
912 | printf("\trm -f $(ANTLR_SPAWN)");\r | |
913 | if ( !user_lexer ) printf(" $(DLG_SPAWN)");\r | |
914 | for (i=0;i<num_sors;i++)\r | |
915 | {\r | |
916 | printf(" ");\r | |
917 | if ( gen_CPP ) pfiles(&sfiles[i][0], num_sfiles[i], CPP_FILE_SUFFIX_NO_DOT);\r | |
918 | else pfiles(&sfiles[i][0], num_sfiles[i], "c");\r | |
919 | if ( gen_CPP )\r | |
920 | {\r | |
921 | printf(" ");\r | |
922 | pclasses(&sclasses[i], 1, CPP_FILE_SUFFIX_NO_DOT);\r | |
923 | printf(" ");\r | |
924 | pclasses(&sclasses[i], 1, "h");\r | |
925 | }\r | |
926 | }\r | |
927 | printf("\n\n");\r | |
928 | }\r | |
929 | \r | |
930 | #ifdef __STDC__\r | |
931 | void pfiles(char **files, int n, char *suffix)\r | |
932 | #else\r | |
933 | void pfiles(files, n, suffix)\r | |
934 | char **files;\r | |
935 | int n;\r | |
936 | char *suffix;\r | |
937 | #endif\r | |
938 | {\r | |
939 | int first=1;\r | |
940 | \r | |
941 | while ( n>0 )\r | |
942 | {\r | |
943 | char *p = &(*files)[strlen(*files)-1];\r | |
944 | if ( !first ) putchar(' ');\r | |
945 | first=0;\r | |
946 | while ( p > *files && *p != '.' ) --p;\r | |
947 | if ( p == *files )\r | |
948 | {\r | |
949 | fprintf(stderr,\r | |
950 | "genmk: filenames must be file.suffix format: %s\n",\r | |
951 | *files);\r | |
952 | exit(-1);\r | |
953 | }\r | |
954 | if ( suffix == NULL ) printf("%s", *files);\r | |
955 | else\r | |
956 | {\r | |
957 | *p = '\0';\r | |
958 | printf("%s", DIR());\r | |
959 | if ( strcmp(suffix, "o")==0 ) printf("%s%s", *files, OBJ_FILE_SUFFIX);\r | |
960 | else printf("%s.%s", *files, suffix);\r | |
961 | *p = '.';\r | |
962 | }\r | |
963 | files++;\r | |
964 | --n;\r | |
965 | }\r | |
966 | }\r | |
967 | \r | |
968 | #ifdef __STDC__\r | |
969 | pclasses(char **classes, int n, char *suffix)\r | |
970 | #else\r | |
971 | pclasses(classes, n, suffix)\r | |
972 | char **classes;\r | |
973 | int n;\r | |
974 | char *suffix;\r | |
975 | #endif\r | |
976 | {\r | |
977 | int first=1;\r | |
978 | \r | |
979 | while ( n>0 )\r | |
980 | {\r | |
981 | if ( !first ) putchar(' ');\r | |
982 | first=0;\r | |
983 | if ( suffix == NULL ) printf("%s", *classes);\r | |
984 | else {\r | |
985 | printf("%s", DIR());\r | |
986 | if ( strcmp(suffix, "o")==0 ) printf("%s%s", *classes, OBJ_FILE_SUFFIX);\r | |
987 | else printf("%s.%s", *classes, suffix);\r | |
988 | }\r | |
989 | classes++;\r | |
990 | --n;\r | |
991 | }\r | |
992 | }\r | |
993 | \r | |
994 | static void\r | |
995 | #ifdef __STDC__\r | |
996 | ProcessArgs( int argc, char **argv, Opt *options )\r | |
997 | #else\r | |
998 | ProcessArgs( argc, argv, options )\r | |
999 | int argc;\r | |
1000 | char **argv;\r | |
1001 | Opt *options;\r | |
1002 | #endif\r | |
1003 | {\r | |
1004 | Opt *p;\r | |
1005 | require(argv!=NULL, "ProcessArgs: command line NULL");\r | |
1006 | \r | |
1007 | while ( argc-- > 0 )\r | |
1008 | {\r | |
1009 | p = options;\r | |
1010 | while ( p->option != NULL )\r | |
1011 | {\r | |
1012 | if ( strcmp(p->option, "*") == 0 ||\r | |
1013 | strcmp(p->option, *argv) == 0 )\r | |
1014 | {\r | |
1015 | if ( p->arg )\r | |
1016 | {\r | |
1017 | (*p->process)( *argv, *(argv+1) );\r | |
1018 | argv++;\r | |
1019 | argc--;\r | |
1020 | }\r | |
1021 | else\r | |
1022 | (*p->process)( *argv );\r | |
1023 | break;\r | |
1024 | }\r | |
1025 | p++;\r | |
1026 | }\r | |
1027 | argv++;\r | |
1028 | }\r | |
1029 | }\r | |
1030 | \r | |
1031 | #ifdef __STDC__\r | |
1032 | void fatal( char *err_)\r | |
1033 | #else\r | |
1034 | void fatal( err_)\r | |
1035 | char *err_;\r | |
1036 | #endif\r | |
1037 | {\r | |
1038 | fprintf(stderr, "genmk: %s\n", err_);\r | |
1039 | exit(1);\r | |
1040 | }\r | |
1041 | \r | |
1042 | #ifdef __STDC__\r | |
1043 | void warn( char *err_)\r | |
1044 | #else\r | |
1045 | void warn( err_)\r | |
1046 | char *err_;\r | |
1047 | #endif\r | |
1048 | {\r | |
1049 | fprintf(stderr, "genmk: %s\n", err_);\r | |
1050 | }\r | |
1051 | \r | |
1052 | #ifdef __STDC__\r | |
1053 | char *DIR(void)\r | |
1054 | #else\r | |
1055 | char *DIR()\r | |
1056 | #endif\r | |
1057 | {\r | |
1058 | static char buf[200+1];\r | |
1059 | \r | |
1060 | if ( strcmp(outdir,TopDirectory)==0 ) return "";\r | |
1061 | sprintf(buf, "%s%s", outdir, DirectorySymbol);\r | |
1062 | return buf;\r | |
1063 | }\r |