]> git.proxmox.com Git - mirror_edk2.git/blobdiff - Tools/CodeTools/TianoTools/Pccts/support/genmk/genmk.c
Restructuring for better separation of Tool packages.
[mirror_edk2.git] / Tools / CodeTools / TianoTools / Pccts / support / genmk / genmk.c
diff --git a/Tools/CodeTools/TianoTools/Pccts/support/genmk/genmk.c b/Tools/CodeTools/TianoTools/Pccts/support/genmk/genmk.c
new file mode 100644 (file)
index 0000000..4952a30
--- /dev/null
@@ -0,0 +1,1063 @@
+/*\r
+ * genmk -- a program to make makefiles for PCCTS\r
+ *\r
+ * ANTLR 1.33MR23\r
+ * Terence John Parr 1989 - 2000\r
+ * Purdue University\r
+ * U of MN\r
+ */\r
+\r
+#include <stdio.h>\r
+#include <string.h>\r
+#include "pcctscfg.h" /* be sensitive to what ANTLR/DLG call the files */\r
+\r
+#ifdef VAXC\r
+#define DIE            return 0;\r
+#define DONE   return 1;\r
+#else\r
+#define DIE            return 1;\r
+#define DONE   return 0;\r
+#endif\r
+\r
+#ifndef require\r
+#define require(expr, err) {if ( !(expr) ) fatal(err);}\r
+#endif\r
+\r
+#define MAX_FILES      50\r
+#define MAX_CFILES     1600\r
+#define MAX_SFILES     50\r
+#define MAX_SORS       50\r
+#define MAX_CLASSES    50\r
+\r
+char *RENAME_OBJ_FLAG="-o",\r
+     *RENAME_EXE_FLAG="-o";\r
+\r
+char *dlg = "parser.dlg";\r
+char *err = "err.c";\r
+char *hdr = "stdpccts.h";\r
+char *tok = "tokens.h";\r
+char *mode = "mode.h";\r
+char *scan = "scan";\r
+\r
+char ATOKENBUFFER_O[100];\r
+char APARSER_O[100];\r
+char ASTBASE_O[100];\r
+char PCCTSAST_O[100];\r
+char LIST_O[100];\r
+char DLEXERBASE_O[100];\r
+\r
+/* Option flags */\r
+static char *project="t", *files[MAX_FILES], *classes[MAX_CLASSES];\r
+static char *cfiles[MAX_CFILES];\r
+static char *sfiles[MAX_SORS][MAX_SFILES],*sclasses[MAX_SORS];\r
+static int  num_sfiles[MAX_SORS]; /*sorcerer files in group */\r
+static int  num_sors = 0; /*sorcerer groups */\r
+static int  num_files = 0; /* grammar files */\r
+static int  num_cfiles = 0; /* additional C/C++ files */\r
+static int  num_classes = 0; /* ANTLR classes */\r
+static int  user_lexer = 0;\r
+static char *user_token_types = NULL;\r
+static int  gen_CPP = 0;\r
+static char *outdir=".";\r
+static char *dlg_class = "DLGLexer";\r
+static int  gen_trees = 0;\r
+static int  gen_hoist = 0;\r
+static int  nondef_comp = 0; /* 1=compiler is non default */\r
+static char *compilerCCC="CC";\r
+static char *compilerCC="cc";\r
+static char *pccts_path="/usr/local/pccts";\r
+\r
+#ifdef __STDC__\r
+void help(void);\r
+void mk(char *project, char **files, int n, int argc, char **argv);\r
+void pfiles(char **files, int n, char *suffix);\r
+void fatal(char *msg);\r
+void warn(char *msg);\r
+#else\r
+void help();\r
+void mk();\r
+void pfiles();\r
+void fatal();\r
+void warn();\r
+#endif\r
+\r
+typedef struct _Opt {\r
+                       char *option;\r
+                       int arg;\r
+#ifdef __cplusplus\r
+                       void (*process)(...);\r
+#else\r
+                       void (*process)();\r
+#endif\r
+                       char *descr;\r
+               } Opt;\r
+\r
+#ifdef __STDC__\r
+static void ProcessArgs(int, char **, Opt *);\r
+#else\r
+static void ProcessArgs();\r
+#endif\r
+\r
+static void\r
+#ifdef __STDC__\r
+pProj(char *s, char *t )\r
+#else\r
+pProj( s, t )\r
+char *s;\r
+char *t;\r
+#endif\r
+{\r
+       project = t;\r
+}\r
+\r
+static void\r
+#ifdef __STDC__\r
+pUL( char *s )\r
+#else\r
+pUL( s )\r
+char *s;\r
+#endif\r
+{\r
+       user_lexer = 1;\r
+}\r
+\r
+static void\r
+#ifdef __STDC__\r
+pCPP( char *s )\r
+#else\r
+pCPP( s )\r
+char *s;\r
+#endif\r
+{\r
+       gen_CPP = 1;\r
+}\r
+\r
+static void\r
+#ifdef __STDC__\r
+pUT( char *s, char *t )\r
+#else\r
+pUT( s, t )\r
+char *s;\r
+char *t;\r
+#endif\r
+{\r
+       user_token_types = t;\r
+}\r
+\r
+static void\r
+#ifdef __STDC__\r
+pTrees( char *s )\r
+#else\r
+pTrees( s )\r
+char *s;\r
+#endif\r
+{\r
+       gen_trees = 1;\r
+}\r
+\r
+static void\r
+#ifdef __STDC__\r
+pHoist( char *s )\r
+#else\r
+pHoist( s )\r
+char *s;\r
+#endif\r
+{\r
+       gen_hoist = 1;\r
+}\r
+\r
+static void\r
+#ifdef __STDC__\r
+pSor( char *s )\r
+#else\r
+pSor( s )\r
+char *s;\r
+#endif\r
+{\r
+       require(num_sors<MAX_SORS, "exceeded max # of sorcerer groups");\r
+       num_sors++;\r
+       pTrees(NULL); /* silently turn on tree generation */\r
+}\r
+\r
+static void\r
+#ifdef __STDC__\r
+pSFiles( char *s, char *t )\r
+#else\r
+pSFiles( s, t )\r
+char *s;\r
+char *t;\r
+#endif\r
+{\r
+       if (num_sors==0)\r
+       {\r
+               pSor(NULL);\r
+               warn("sorcerer input file before any '-sor' option");\r
+       }\r
+               \r
+       require(num_sfiles[num_sors-1]<MAX_SFILES,\r
+                "exceeded max # of sorcerer input files");\r
+       sfiles[num_sors-1][num_sfiles[num_sors-1]++] = t;\r
+}\r
+\r
+static void\r
+#ifdef __STDC__\r
+pCFiles( char *s, char *t )\r
+#else\r
+pCFiles( s, t )\r
+char *s;\r
+char *t;\r
+#endif\r
+{\r
+       require(num_cfiles<MAX_CFILES, "exceeded max # of C/C++ input files");\r
+       cfiles[num_cfiles++] = t;\r
+}\r
+\r
+int\r
+#ifdef __STDC__\r
+isKnownSuffix( char *s )\r
+#else\r
+isKnownSuffix( s )\r
+       char *s;\r
+#endif\r
+{\r
+       if(s==NULL) return 0;\r
+       if (strcasecmp(s,".c")==0) return 1;\r
+       if (strcasecmp(s,".cc")==0) return 1;\r
+       if (strcasecmp(s,".cpp")==0) return 1;\r
+       if (strcasecmp(s,".cxx")==0) return 1;\r
+       if (strcasecmp(s,CPP_FILE_SUFFIX)==0) return 1;\r
+       if (strcasecmp(s,".sor")==0) return 2;\r
+       return 0;\r
+}\r
+\r
+static void\r
+#ifdef __STDC__\r
+pFile( char *s )\r
+#else\r
+pFile( s )\r
+char *s;\r
+#endif\r
+{\r
+       if ( *s=='-' )\r
+       {\r
+               fprintf(stderr, "invalid option: '%s'; ignored...",s);\r
+               return;\r
+       }\r
+       switch(isKnownSuffix(strrchr(s,'.')))\r
+       {\r
+        case 1: /* c/c++ */\r
+               pCFiles("-cfiles",s);\r
+               return;\r
+        case 2: /* sorcerer */\r
+               pSFiles("",s);\r
+               return;\r
+        default: /* grammar (ANTLR) */\r
+               break;\r
+       }\r
+       require(num_files<MAX_FILES, "exceeded max # of input files");\r
+       files[num_files++] = s;\r
+}\r
+\r
+static void\r
+#ifdef __STDC__\r
+pClass( char *s, char *t )\r
+#else\r
+pClass( s, t )\r
+char *s;\r
+char *t;\r
+#endif\r
+{\r
+       if (num_sors==0)\r
+       {\r
+               require(num_classes<MAX_CLASSES, "exceeded max # of grammar classes");\r
+               classes[num_classes++] = t;\r
+       } else\r
+       {\r
+               sclasses[num_sors-1] = t; /* one class per sorcerer group (last valid) */\r
+       }\r
+}\r
+\r
+static void\r
+#ifdef __STDC__\r
+pDLGClass( char *s, char *t )\r
+#else\r
+pDLGClass( s, t )\r
+char *s;\r
+char *t;\r
+#endif\r
+{\r
+       if ( !gen_CPP ) {\r
+               fprintf(stderr, "-dlg-class makes no sense without C++ mode; ignored...");\r
+       }\r
+       else dlg_class = t;\r
+}\r
+\r
+static void\r
+#ifdef __STDC__\r
+pOdir( char *s, char *t )\r
+#else\r
+pOdir( s, t )\r
+char *s;\r
+char *t;\r
+#endif\r
+{\r
+       outdir = t;\r
+}\r
+\r
+static void\r
+#ifdef __STDC__\r
+pHdr( char *s, char *t )\r
+#else\r
+pHdr( s, t )\r
+char *s;\r
+char *t;\r
+#endif\r
+{\r
+       hdr = t;\r
+}\r
+\r
+static void\r
+#ifdef __STDC__\r
+pCompiler( char *s, char *t )\r
+#else\r
+pCompiler( s, t )\r
+char *s;\r
+char *t;\r
+#endif\r
+{\r
+       compilerCCC = t;\r
+       compilerCC = t;\r
+       nondef_comp = 1;\r
+}\r
+\r
+static void\r
+#ifdef __STDC__\r
+ppccts_path( char *s, char *t )\r
+#else\r
+ppccts_path( s, t )\r
+char *s;\r
+char *t;\r
+#endif\r
+{\r
+       pccts_path = t;\r
+}\r
+\r
+Opt options[] = {\r
+       { "-CC", 0,     pCPP,                   "Generate C++ output"},\r
+       { "-class", 1,  pClass,         "Name of a grammar class defined in grammar (if C++)"},\r
+       { "-dlg-class", 1,pDLGClass,"Name of DLG lexer class (default=DLGLexer) (if C++)"},\r
+       { "-header", 1,pHdr,            "Name of ANTLR standard header info (default=no file)"},\r
+       { "-o", 1,      pOdir,                  "Directory where output files should go (default=\".\")"},\r
+       { "-project", 1,        pProj,  "Name of executable to create (default=t)"},\r
+       { "-token-types", 1, pUT,       "Token types are in this file (don't use tokens.h)"},\r
+       { "-trees", 0, pTrees,          "Generate ASTs"},\r
+       { "-user-lexer", 0,     pUL,    "Do not create a DLG-based scanner"},\r
+       { "-mrhoist",0,pHoist,      "Maintenance release style hoisting"},\r
+       { "-cfiles",1,pCFiles,      "Additional files in C or C++ to compile"},\r
+       { "-sor",0,pSor,           "Start of sorcerer group"},\r
+       { "-pccts_path",1,ppccts_path,\r
+                       "Path for $PCCTS directory (default is /usr/local/pccts)"},\r
+       { "-compiler",1,pCompiler,\r
+                       "Default compiler (default is CC/cc)"},\r
+       { "*", 0,pFile,                 "" },   /* anything else is a file */\r
+       { NULL, 0, NULL, NULL }\r
+};\r
+\r
+#ifdef __STDC__\r
+extern char *DIR(void);\r
+#else\r
+extern char *DIR();\r
+#endif\r
+\r
+#ifdef __STDC__\r
+int main(int argc, char **argv)\r
+#else\r
+int main(argc, argv)\r
+int argc;\r
+char **argv;\r
+#endif\r
+{\r
+       int i;\r
+       \r
+       if ( argc == 1 ) { help(); DIE; }\r
+       for(i=0;i<MAX_SORS;i++) num_sfiles[i]=0;\r
+       \r
+       ProcessArgs(argc-1, &(argv[1]), options);\r
+\r
+       strcpy(ATOKENBUFFER_O, ATOKENBUFFER_C);\r
+       ATOKENBUFFER_O[strlen(ATOKENBUFFER_C)-strlen(CPP_FILE_SUFFIX)] = '\0';\r
+       strcat(ATOKENBUFFER_O, OBJ_FILE_SUFFIX);\r
+       strcpy(APARSER_O, APARSER_C);\r
+       APARSER_O[strlen(APARSER_O)-strlen(CPP_FILE_SUFFIX)] = '\0';\r
+       strcat(APARSER_O, OBJ_FILE_SUFFIX);\r
+\r
+       strcpy(ASTBASE_O, ASTBASE_C);\r
+       ASTBASE_O[strlen(ASTBASE_C)-strlen(CPP_FILE_SUFFIX)] = '\0';\r
+       strcat(ASTBASE_O, OBJ_FILE_SUFFIX);\r
+\r
+       strcpy(PCCTSAST_O, PCCTSAST_C);\r
+       PCCTSAST_O[strlen(PCCTSAST_C)-strlen(CPP_FILE_SUFFIX)] = '\0';\r
+       strcat(PCCTSAST_O, OBJ_FILE_SUFFIX);\r
+\r
+       strcpy(LIST_O, LIST_C);\r
+       LIST_O[strlen(LIST_C)-strlen(CPP_FILE_SUFFIX)] = '\0';\r
+       strcat(LIST_O, OBJ_FILE_SUFFIX);\r
+\r
+       strcpy(DLEXERBASE_O, DLEXERBASE_C);\r
+       DLEXERBASE_O[strlen(DLEXERBASE_C)-strlen(CPP_FILE_SUFFIX)] = '\0';\r
+       strcat(DLEXERBASE_O, OBJ_FILE_SUFFIX);\r
+\r
+       if ( num_files == 0 ) fatal("no grammar files specified; exiting...");\r
+       if ( !gen_CPP && num_classes>0 ) {\r
+               warn("can't define classes w/o C++ mode; turning on C++ mode...\n");\r
+               gen_CPP=1;\r
+       }\r
+       if (!gen_CPP && num_sors) {\r
+               warn("can't define sorcerer group in C mode (yet); turning on C++ mode...\n");\r
+               gen_CPP=1;\r
+       }\r
+       if ( gen_CPP && num_classes==0 ) {\r
+               fatal("must define classes >0 grammar classes in C++ mode\n");\r
+       }\r
+\r
+       mk(project, files, num_files, argc, argv);\r
+       DONE;\r
+}\r
+\r
+#ifdef __STDC__\r
+void help(void)\r
+#else\r
+void help()\r
+#endif\r
+{\r
+       Opt *p = options;\r
+       static char buf[1000+1];\r
+\r
+       fprintf(stderr, "genmk [options] f1.g ... fn.g\n");\r
+       while ( p->option!=NULL && *(p->option) != '*' )\r
+       {\r
+               buf[0]='\0';\r
+               if ( p->arg ) sprintf(buf, "%s ___", p->option);\r
+               else strcpy(buf, p->option);\r
+               fprintf(stderr, "\t%-16s   %s\n", buf, p->descr);\r
+               p++;\r
+       }\r
+}\r
+\r
+#ifdef __STDC__\r
+void mk(char *project, char **files, int n, int argc, char **argv)\r
+#else\r
+void mk(project, files, n, argc, argv)\r
+char *project;\r
+char **files;\r
+int n;\r
+int argc;\r
+char **argv;\r
+#endif\r
+{\r
+       int i,j;\r
+\r
+       printf("#\n");\r
+       printf("# PCCTS makefile for: ");\r
+       pfiles(files, n, NULL);\r
+       printf("\n");\r
+       printf("#\n");\r
+       printf("# Created from:");\r
+       for (i=0; i<argc; i++) printf(" %s", argv[i]);\r
+       printf("\n");\r
+       printf("#\n");\r
+       printf("# PCCTS release 1.33MR23\n");\r
+       printf("# Project: %s\n", project);\r
+       if ( gen_CPP ) printf("# C++ output\n");\r
+       else printf("# C output\n");\r
+       if ( user_lexer ) printf("# User-defined scanner\n");\r
+       else printf("# DLG scanner\n");\r
+       if ( user_token_types!=NULL ) printf("# User-defined token types in '%s'\n", user_token_types);\r
+       else printf("# ANTLR-defined token types\n");\r
+       printf("#\n");\r
+/***********\r
+       printf(".SUFFIXES:\n.SUFFIXES:\t.o .cpp .c .h .g .i .dlg .sor\n"); \r
+ ***********/\r
+       if ( user_token_types!=NULL ) {\r
+               printf("# Make sure #tokdefs directive in ANTLR grammar lists this file:\n");\r
+               printf("TOKENS = %s", user_token_types);\r
+       }\r
+       else printf("TOKENS = %stokens.h", DIR());\r
+       printf("\n");\r
+       printf("#\n");\r
+       printf("# The following filenames must be consistent with ANTLR/DLG flags\n");\r
+       printf("DLG_FILE = %s%s\n", DIR(), dlg);\r
+       printf("ERR = %serr\n", DIR());\r
+       if ( strcmp(hdr,"stdpccts.h")!=0 ) printf("HDR_FILE = %s%s\n", DIR(), hdr);\r
+       else printf("HDR_FILE =\n");\r
+       if ( !gen_CPP ) printf("MOD_FILE = %s%s\n", DIR(), mode);\r
+       if ( !gen_CPP ) printf("SCAN = %s\n", scan);\r
+       else printf("SCAN = %s%s\n", DIR(), dlg_class);\r
+\r
+       printf("PCCTS = %s\n",pccts_path);\r
+       printf("ANTLR_H = $(PCCTS)%sh\n", DirectorySymbol);\r
+       if (num_sors>0) {\r
+               printf("SOR_H = $(PCCTS)%ssorcerer%sh\n", DirectorySymbol, DirectorySymbol);\r
+               printf("SOR_LIB = $(PCCTS)%ssorcerer%slib\n",\r
+                               DirectorySymbol, DirectorySymbol);\r
+       }\r
+       printf("BIN = $(PCCTS)%sbin\n", DirectorySymbol);\r
+       printf("ANTLR = $(BIN)%santlr\n", DirectorySymbol);\r
+       printf("DLG = $(BIN)%sdlg\n", DirectorySymbol);\r
+       if (num_sors>0) printf("SOR = $(BIN)%ssor\n", DirectorySymbol);\r
+       printf("CFLAGS = -I. -I$(ANTLR_H)");\r
+       if (num_sors>0) printf(" -I$(SOR_H)");\r
+       if ( strcmp(outdir, ".")!=0 ) printf(" -I%s", outdir);\r
+       printf(" $(COTHER)");\r
+       printf("\n");\r
+       printf("AFLAGS =");\r
+       if ( strcmp(outdir,".")!=0 ) printf(" -o %s", outdir);\r
+       if ( user_lexer ) printf(" -gx");\r
+       if ( gen_CPP ) printf(" -CC");\r
+       if ( strcmp(hdr,"stdpccts.h")!=0 ) printf(" -gh %s", hdr);\r
+       if ( gen_trees ) printf(" -gt");\r
+       if ( gen_hoist ) {\r
+               printf(" -mrhoist on") ;\r
+       } else {\r
+               printf(" -mrhoist off");\r
+       };\r
+       printf(" $(AOTHER)");\r
+       printf("\n");\r
+       printf("DFLAGS = -C2 -i");\r
+       if ( gen_CPP ) printf(" -CC");\r
+       if ( strcmp(dlg_class,"DLGLexer")!=0 ) printf(" -cl %s", dlg_class);\r
+       if ( strcmp(outdir,".")!=0 ) printf(" -o %s", outdir);\r
+       printf(" $(DOTHER)");\r
+       printf("\n");\r
+       if (num_sors>0)\r
+       {\r
+               printf("SFLAGS = -CPP");\r
+               if ( strcmp(outdir,".")!=0 ) printf(" -out-dir %s", outdir);\r
+               printf(" $(SOTHER)\n");\r
+       }\r
+       printf("GRM = ");\r
+       pfiles(files, n, NULL);\r
+       printf("\n");\r
+       printf("SRC = ");\r
+       if ( gen_CPP ) pfiles(files, n, CPP_FILE_SUFFIX_NO_DOT);\r
+       else pfiles(files, n, "c");\r
+       if ( gen_CPP ) {\r
+               printf(" \\\n\t");\r
+               pclasses(classes, num_classes, CPP_FILE_SUFFIX_NO_DOT);\r
+               printf(" \\\n\t");\r
+               printf("$(ANTLR_H)%s%s", DirectorySymbol, APARSER_C);\r
+               if ( !user_lexer ) printf(" $(ANTLR_H)%s%s", DirectorySymbol, DLEXERBASE_C);\r
+               if ( gen_trees ) {\r
+                       printf(" \\\n\t");\r
+                       printf("$(ANTLR_H)%s%s", DirectorySymbol, ASTBASE_C);\r
+                       printf(" $(ANTLR_H)%s%s", DirectorySymbol, PCCTSAST_C);\r
+/*                     printf(" $(ANTLR_H)%s%s", DirectorySymbol, LIST_C); */\r
+                       printf(" \\\n\t");\r
+               }\r
+               printf(" $(ANTLR_H)%s%s", DirectorySymbol, ATOKENBUFFER_C);\r
+       }\r
+       if ( !user_lexer ) {\r
+               if ( gen_CPP ) printf(" $(SCAN)%s", CPP_FILE_SUFFIX);\r
+               else printf(" %s$(SCAN).c", DIR());\r
+       }\r
+       if ( !gen_CPP ) printf(" $(ERR).c");\r
+       for (i=0;i<num_sors;i++)\r
+       {\r
+               printf(" \\\n\t");\r
+               pclasses(&sclasses[i],1,CPP_FILE_SUFFIX_NO_DOT);\r
+               printf(" ");\r
+               pfiles(&sfiles[i][0],num_sfiles[i],CPP_FILE_SUFFIX_NO_DOT);\r
+       }\r
+       if(num_sors>0)\r
+               printf(" \\\n\t$(SOR_LIB)%sSTreeParser.cpp", DirectorySymbol);\r
+       if (num_cfiles>0)\r
+       {\r
+               printf(" \\\n\t");\r
+               pfiles(cfiles,num_cfiles,NULL);\r
+       }\r
+       printf("\n\n");\r
+       printf("OBJ = ");\r
+       pfiles(files, n, "o");\r
+       if ( gen_CPP ) {\r
+               printf(" \\\n\t");\r
+               pclasses(classes, num_classes, "o");\r
+               printf(" \\\n\t");\r
+               printf("%s%s", DIR(), APARSER_O);\r
+               if ( !user_lexer ) {\r
+                       printf(" %s%s", DIR(), DLEXERBASE_O);\r
+               }\r
+               if ( gen_trees ) {\r
+                       printf(" \\\n\t");\r
+                       printf("%s%s", DIR(), ASTBASE_O);\r
+                       printf(" %s%s", DIR(), PCCTSAST_O);\r
+/*                     printf(" %s%s", DIR(), LIST_O); */\r
+                       printf(" \\\n\t");\r
+               }\r
+               printf(" %s%s", DIR(), ATOKENBUFFER_O);\r
+       }\r
+       if ( !user_lexer ) {\r
+               if ( gen_CPP ) printf(" $(SCAN)%s", OBJ_FILE_SUFFIX);\r
+               else printf(" %s$(SCAN)%s", DIR(), OBJ_FILE_SUFFIX);\r
+       }\r
+       if ( !gen_CPP ) printf(" $(ERR)%s", OBJ_FILE_SUFFIX);\r
+       for (i=0;i<num_sors;i++)\r
+       {\r
+               printf(" \\\n\t");\r
+               pclasses(&sclasses[i],1,"o");\r
+               printf(" ");\r
+               pfiles(&sfiles[i][0],num_sfiles[i],"o");\r
+       }\r
+       if(num_sors>0) printf(" \\\n\tSTreeParser.o");\r
+       if (num_cfiles>0)\r
+       {\r
+               printf(" \\\n\t");\r
+               pfiles(cfiles,num_cfiles,"o");\r
+       }\r
+       printf("\n\n");\r
+\r
+       printf("ANTLR_SPAWN = ");\r
+       if ( gen_CPP ) pfiles(files, n, CPP_FILE_SUFFIX_NO_DOT);\r
+       else pfiles(files, n, "c");\r
+       if ( gen_CPP ) {\r
+               printf(" ");\r
+               pclasses(classes, num_classes, CPP_FILE_SUFFIX_NO_DOT);\r
+               printf(" \\\n\t\t");\r
+               pclasses(classes, num_classes, "h");\r
+               if ( strcmp(hdr,"stdpccts.h")!=0 ) {\r
+                       printf(" \\\n\t\t");\r
+                       printf("$(HDR_FILE) stdpccts.h");\r
+               }\r
+       }\r
+       if ( user_lexer ) {\r
+               if ( !user_token_types ) printf(" $(TOKENS)");\r
+       }\r
+       else {\r
+               printf(" $(DLG_FILE)");\r
+               if ( !user_token_types ) printf(" $(TOKENS)");\r
+       }\r
+       if ( !gen_CPP ) printf(" $(ERR).c");\r
+       printf("\n");\r
+\r
+       if ( !user_lexer ) {\r
+               if ( gen_CPP ) printf("DLG_SPAWN = $(SCAN)%s", CPP_FILE_SUFFIX);\r
+               else printf("DLG_SPAWN = %s$(SCAN).c", DIR());\r
+               if ( gen_CPP ) printf(" $(SCAN).h");\r
+               if ( !gen_CPP ) printf(" $(MOD_FILE)");\r
+               printf("\n");\r
+       }\r
+\r
+       if ( gen_CPP ) {\r
+               if ( !nondef_comp )\r
+                       printf("ifdef CXX\nCCC = $(CXX)\nendif\n\nifndef CCC\n");\r
+               printf("CCC = %s\n",compilerCCC);\r
+               if ( !nondef_comp ) printf("endif\n\n");\r
+       }\r
+       else\r
+       {\r
+               if ( !nondef_comp ) printf("ifndef CC\n");\r
+               printf("CC = %s\n",compilerCC);\r
+               if ( !nondef_comp ) printf("endif\n\n");\r
+       }\r
+\r
+       /* set up dependencies */\r
+       printf("\n%s : $(SRC) $(OBJ)\n", project);\r
+       printf("\t%s %s %s $(CFLAGS) $(OBJ)\n",\r
+               gen_CPP?"$(CCC)":"$(CC)",\r
+               RENAME_EXE_FLAG,\r
+               project);\r
+       printf("\n");\r
+\r
+       /* implicit rules */\r
+\r
+/*     if(gen_CPP)\r
+               printf("%%.o : %%.cpp\n\t$(CCC) -c $(CFLAGS) $<\n\n");\r
+\r
+       printf("%%.o : %%.c\n\t%s -c $(CFLAGS) $<\n\n",\r
+                       gen_CPP?"$(CCC)":"$(CC)");\r
+*/\r
+       /* how to compile parser files */\r
+\r
+       for (i=0; i<num_files; i++)\r
+       {\r
+               pfiles(&files[i], 1, "o");\r
+               if ( user_lexer ) {\r
+                       printf(" : $(TOKENS)");\r
+               }\r
+               else {\r
+                       if ( gen_CPP ) printf(" : $(TOKENS) $(SCAN).h");\r
+                       else printf(" : $(MOD_FILE) $(TOKENS)");\r
+               }\r
+               printf(" ");\r
+               if ( gen_CPP ) pfiles(&files[i], 1, CPP_FILE_SUFFIX_NO_DOT);\r
+               else pfiles(&files[i], 1, "c");\r
+               if ( gen_CPP && strcmp(hdr,"stdpccts.h")!=0 ) printf(" $(HDR_FILE)");\r
+               printf("\n");\r
+               printf("\t%s -c $(CFLAGS) %s ",\r
+                       gen_CPP?"$(CCC)":"$(CC)",RENAME_OBJ_FLAG);\r
+               pfiles(&files[i], 1, "o");\r
+               printf(" ");\r
+               if ( gen_CPP ) pfiles(&files[i], 1, CPP_FILE_SUFFIX_NO_DOT);\r
+               else pfiles(&files[i], 1, "c");\r
+               printf("\n\n");\r
+       }\r
+\r
+       for (i=0; i<num_cfiles; i++)\r
+       {\r
+               pfiles(&cfiles[i], 1, "o");\r
+               printf(" : ");\r
+               pfiles(&cfiles[i], 1, NULL);\r
+               if ( gen_CPP && strcmp(hdr,"stdpccts.h")!=0 ) printf(" $(HDR_FILE)");\r
+/***   printf(" "); ***/\r
+/***   pfiles(&cfiles[i], 1, "h"); ***/\r
+               printf("\n");\r
+               printf("\t%s -c $(CFLAGS) %s ",\r
+                       gen_CPP?"$(CCC)":"$(CC)",RENAME_OBJ_FLAG);\r
+               pfiles(&cfiles[i], 1, "o");\r
+               printf(" ");\r
+               pfiles(&cfiles[i], 1, NULL);\r
+               printf("\n\n");\r
+\r
+/*\r
+ *             pfiles(&cfiles[i], 1, "h");\r
+ *             printf(" :\ntouch ");\r
+ *             pfiles(&cfiles[i], 1, "h");\r
+ *             printf("\n\n");\r
+ */\r
+       }\r
+\r
+       /* how to compile err.c */\r
+       if ( !gen_CPP ) {\r
+               printf("$(ERR)%s : $(ERR).c", OBJ_FILE_SUFFIX);\r
+               if ( !user_lexer ) printf(" $(TOKENS)");\r
+               printf("\n");\r
+               printf("\t%s -c $(CFLAGS) %s $(ERR)%s $(ERR).c",\r
+                       gen_CPP?"$(CCC)":"$(CC)",\r
+                       RENAME_OBJ_FLAG,\r
+                       OBJ_FILE_SUFFIX);\r
+               printf("\n\n");\r
+       }\r
+\r
+       /* how to compile Class.c */\r
+       for (i=0; i<num_classes; i++)\r
+       {\r
+               pclasses(&classes[i], 1, "o");\r
+               if ( user_lexer ) {\r
+                       printf(" : $(TOKENS)");\r
+               }\r
+               else {\r
+                       printf(" : $(TOKENS) $(SCAN).h");\r
+               }\r
+               printf(" ");\r
+               pclasses(&classes[i], 1, CPP_FILE_SUFFIX_NO_DOT);\r
+               printf(" ");\r
+               pclasses(&classes[i], 1, "h");\r
+               if ( gen_CPP && strcmp(hdr,"stdpccts.h")!=0 ) printf(" $(HDR_FILE)");\r
+               printf("\n");\r
+               printf("\t%s -c $(CFLAGS) %s ",\r
+                       gen_CPP?"$(CCC)":"$(CC)",\r
+                       RENAME_OBJ_FLAG);\r
+               pclasses(&classes[i], 1, "o");\r
+               printf(" ");\r
+               pclasses(&classes[i], 1, CPP_FILE_SUFFIX_NO_DOT);\r
+               printf("\n\n");\r
+       }\r
+\r
+       /* how to compile scan.c */\r
+       if ( !user_lexer ) {\r
+               if ( gen_CPP ) printf("$(SCAN)%s : $(SCAN)%s", OBJ_FILE_SUFFIX, CPP_FILE_SUFFIX);\r
+               else printf("%s$(SCAN)%s : %s$(SCAN).c", DIR(), OBJ_FILE_SUFFIX, DIR());\r
+               if ( !user_lexer ) printf(" $(TOKENS)");\r
+               printf("\n");\r
+               if ( gen_CPP ) printf("\t$(CCC) -c $(CFLAGS) %s $(SCAN)%s $(SCAN)%s",\r
+                                                       RENAME_OBJ_FLAG,\r
+                                                       OBJ_FILE_SUFFIX,\r
+                                                       CPP_FILE_SUFFIX);\r
+               else printf("\t$(CC) -c $(CFLAGS) %s %s$(SCAN)%s %s$(SCAN).c",\r
+                                       RENAME_OBJ_FLAG,\r
+                                       DIR(),\r
+                                       OBJ_FILE_SUFFIX,\r
+                                       DIR());\r
+               printf("\n\n");\r
+       }\r
+/* how to compile sorcerer classes */\r
+       for (i=0;i<num_sors;i++)\r
+       {\r
+               pclasses(&sclasses[i], 1, "o");\r
+               printf(" : ");\r
+               pclasses(&sclasses[i], 1, CPP_FILE_SUFFIX_NO_DOT);\r
+               printf(" ");\r
+               pclasses(&sclasses[i], 1, "h");\r
+               if ( gen_CPP && strcmp(hdr,"stdpccts.h")!=0 ) printf(" $(HDR_FILE)");\r
+               printf("\n");\r
+               printf("\t%s -c $(CFLAGS) %s ",\r
+                               gen_CPP?"$(CCC)":"$(CC)",\r
+                               RENAME_OBJ_FLAG);\r
+               pclasses(&sclasses[i], 1, "o");\r
+               printf(" ");\r
+               pclasses(&sclasses[i], 1, CPP_FILE_SUFFIX_NO_DOT);\r
+               printf("\n\n");\r
+/* how to compile i-th sorcerer's files*/\r
+               for (j=0; j<num_sfiles[i]; j++)\r
+               {\r
+                       pfiles(&sfiles[i][j], 1, "o");\r
+                       printf(" : ");\r
+                       if ( gen_CPP ) pfiles(&sfiles[i][j], 1, CPP_FILE_SUFFIX_NO_DOT);\r
+                       else pfiles(&sfiles[i][j], 1, "c");\r
+                       if ( gen_CPP && strcmp(hdr,"stdpccts.h")!=0 ) printf(" $(HDR_FILE)");\r
+                       printf("\n");\r
+                       printf("\t%s -c $(CFLAGS) %s ",\r
+                                       gen_CPP?"$(CCC)":"$(CC)",RENAME_OBJ_FLAG);\r
+                       pfiles(&sfiles[i][j], 1, "o");\r
+                       printf(" ");\r
+                       if ( gen_CPP ) pfiles(&sfiles[i][j], 1, CPP_FILE_SUFFIX_NO_DOT);\r
+                       else pfiles(&sfiles[i][j], 1, "c");\r
+                       printf("\n\n");\r
+               }\r
+               if ( gen_CPP ) pfiles(&sfiles[i][0], num_sfiles[i], CPP_FILE_SUFFIX_NO_DOT);\r
+               else pfiles(&sfiles[i][0], num_sfiles[i], "c");\r
+               if ( gen_CPP )\r
+               {\r
+                       printf(" ");\r
+                       pclasses(&sclasses[i], 1, CPP_FILE_SUFFIX_NO_DOT);\r
+                       printf(" ");\r
+                       pclasses(&sclasses[i], 1, "h");\r
+                       if ( strcmp(hdr,"stdpccts.h")!=0 ) \r
+                       {\r
+                               printf(" ");\r
+                               printf("$(HDR_FILE) stdpccts.h");\r
+                       }\r
+               }\r
+               printf(" : ");\r
+               pfiles(&sfiles[i][0],num_sfiles[i],NULL);\r
+               printf("\n\t$(SOR) $(SFLAGS) ");\r
+               pfiles(&sfiles[i][0],num_sfiles[i],NULL);\r
+               printf("\n\n");\r
+       }\r
+       if(num_sors>0)\r
+       {\r
+               printf("STreeParser%s : $(SOR_LIB)%sSTreeParser.cpp\n",\r
+                               OBJ_FILE_SUFFIX,DirectorySymbol);\r
+               printf("\t%s -c $(CFLAGS) %s ",\r
+                               gen_CPP?"$(CCC)":"$(CC)",RENAME_OBJ_FLAG);\r
+               printf("STreeParser%s ",OBJ_FILE_SUFFIX);\r
+               printf("$(SOR_LIB)%sSTreeParser.cpp\n\n",DirectorySymbol);\r
+       }\r
+       \r
+       printf("$(ANTLR_SPAWN) : $(GRM)\n");\r
+       printf("\t$(ANTLR) $(AFLAGS) $(GRM)\n");\r
+\r
+       if ( !user_lexer )\r
+       {\r
+               printf("\n");\r
+               printf("$(DLG_SPAWN) : $(DLG_FILE)\n");\r
+               if ( gen_CPP ) printf("\t$(DLG) $(DFLAGS) $(DLG_FILE)\n");\r
+               else printf("\t$(DLG) $(DFLAGS) $(DLG_FILE) $(SCAN).c\n");\r
+       }\r
+\r
+       /* do the makes for ANTLR/DLG support */\r
+       if ( gen_CPP ) {\r
+               printf("\n");\r
+               printf("%s%s : $(ANTLR_H)%s%s\n", DIR(), APARSER_O, DirectorySymbol, APARSER_C);\r
+               printf("\t%s -c $(CFLAGS) %s ",\r
+                               gen_CPP?"$(CCC)":"$(CC)",\r
+                               RENAME_OBJ_FLAG);\r
+               printf("%s%s $(ANTLR_H)%s%s\n", DIR(), APARSER_O, DirectorySymbol, APARSER_C);\r
+               printf("\n");\r
+               printf("%s%s : $(ANTLR_H)%s%s\n", DIR(), ATOKENBUFFER_O, DirectorySymbol, ATOKENBUFFER_C);\r
+               printf("\t%s -c $(CFLAGS) %s ",\r
+                               gen_CPP?"$(CCC)":"$(CC)",\r
+                               RENAME_OBJ_FLAG);\r
+               printf("%s%s $(ANTLR_H)%s%s\n", DIR(), ATOKENBUFFER_O, DirectorySymbol, ATOKENBUFFER_C);\r
+               if ( !user_lexer ) {\r
+                       printf("\n");\r
+                       printf("%s%s : $(ANTLR_H)%s%s\n", DIR(), DLEXERBASE_O, DirectorySymbol, DLEXERBASE_C);\r
+                       printf("\t%s -c $(CFLAGS) %s ",\r
+                                       gen_CPP?"$(CCC)":"$(CC)",\r
+                                       RENAME_OBJ_FLAG);\r
+                       printf("%s%s $(ANTLR_H)%s%s\n", DIR(), DLEXERBASE_O, DirectorySymbol, DLEXERBASE_C);\r
+               }\r
+               if ( gen_trees ) {\r
+                       printf("\n");\r
+                       printf("%s%s : $(ANTLR_H)%s%s\n", DIR(), ASTBASE_O, DirectorySymbol, ASTBASE_C);\r
+                       printf("\t%s -c $(CFLAGS) %s ",\r
+                                       gen_CPP?"$(CCC)":"$(CC)",\r
+                                       RENAME_OBJ_FLAG);\r
+                       printf("%s%s $(ANTLR_H)%s%s\n", DIR(), ASTBASE_O, DirectorySymbol, ASTBASE_C);\r
+                       printf("\n");\r
+                       printf("%s%s : $(ANTLR_H)%s%s\n", DIR(), PCCTSAST_O, DirectorySymbol, PCCTSAST_C);\r
+                       printf("\t%s -c $(CFLAGS) %s ",\r
+                                       gen_CPP?"$(CCC)":"$(CC)",\r
+                                       RENAME_OBJ_FLAG);\r
+                       printf("%s%s $(ANTLR_H)%s%s\n", DIR(), PCCTSAST_O, DirectorySymbol, PCCTSAST_C);\r
+                       printf("\n");\r
+/*\r
+                       printf("%s%s : $(ANTLR_H)%s%s\n", DIR(), LIST_O, DirectorySymbol, LIST_C);\r
+                       printf("\t%s -c $(CFLAGS) %s ",\r
+                                       gen_CPP?"$(CCC)":"$(CC)",RENAME_OBJ_FLAG);\r
+                       printf("%s%s $(ANTLR_H)%s%s\n", DIR(), LIST_O, DirectorySymbol, LIST_C);\r
+*/\r
+               }\r
+       }\r
+\r
+       /* clean and scrub targets */\r
+\r
+       printf("\nclean:\n");\r
+       printf("\trm -f *%s core %s", OBJ_FILE_SUFFIX, project);\r
+       if ( strcmp(outdir, ".")!=0 ) printf(" %s*%s", DIR(), OBJ_FILE_SUFFIX);\r
+       printf("\n");\r
+\r
+       printf("\nscrub: clean\n");\r
+/*     printf("\trm -f *%s core %s", OBJ_FILE_SUFFIX, project); */\r
+/*     if ( strcmp(outdir, ".")!=0 ) printf(" %s*%s", DIR(), OBJ_FILE_SUFFIX); */\r
+       printf("\trm -f $(ANTLR_SPAWN)");\r
+       if ( !user_lexer ) printf(" $(DLG_SPAWN)");\r
+       for (i=0;i<num_sors;i++)\r
+       {\r
+               printf(" ");\r
+               if ( gen_CPP ) pfiles(&sfiles[i][0], num_sfiles[i], CPP_FILE_SUFFIX_NO_DOT);\r
+               else pfiles(&sfiles[i][0], num_sfiles[i], "c");\r
+               if ( gen_CPP )\r
+               {\r
+                       printf(" ");\r
+                       pclasses(&sclasses[i], 1, CPP_FILE_SUFFIX_NO_DOT);\r
+                       printf(" ");\r
+                       pclasses(&sclasses[i], 1, "h");\r
+               }\r
+       }\r
+       printf("\n\n");\r
+}\r
+\r
+#ifdef __STDC__\r
+void pfiles(char **files, int n, char *suffix)\r
+#else\r
+void pfiles(files, n, suffix)\r
+char **files;\r
+int n;\r
+char *suffix;\r
+#endif\r
+{\r
+       int first=1;\r
+\r
+       while ( n>0 )\r
+       {\r
+               char *p = &(*files)[strlen(*files)-1];\r
+               if ( !first ) putchar(' ');\r
+               first=0;\r
+               while ( p > *files && *p != '.' ) --p;\r
+               if ( p == *files )\r
+               {\r
+                       fprintf(stderr,\r
+                                       "genmk: filenames must be file.suffix format: %s\n",\r
+                                       *files);\r
+                       exit(-1);\r
+               }\r
+               if ( suffix == NULL ) printf("%s", *files);\r
+               else\r
+               {\r
+                       *p = '\0';\r
+                       printf("%s", DIR());\r
+                       if ( strcmp(suffix, "o")==0 ) printf("%s%s", *files, OBJ_FILE_SUFFIX);\r
+                       else printf("%s.%s", *files, suffix);\r
+                       *p = '.';\r
+               }\r
+               files++;\r
+               --n;\r
+       }\r
+}\r
+\r
+#ifdef __STDC__\r
+pclasses(char **classes, int n, char *suffix)\r
+#else\r
+pclasses(classes, n, suffix)\r
+char **classes;\r
+int n;\r
+char *suffix;\r
+#endif\r
+{\r
+       int first=1;\r
+\r
+       while ( n>0 )\r
+       {\r
+               if ( !first ) putchar(' ');\r
+               first=0;\r
+               if ( suffix == NULL ) printf("%s", *classes);\r
+               else {\r
+                       printf("%s", DIR());\r
+                       if ( strcmp(suffix, "o")==0 ) printf("%s%s", *classes, OBJ_FILE_SUFFIX);\r
+                       else printf("%s.%s", *classes, suffix);\r
+               }\r
+               classes++;\r
+               --n;\r
+       }\r
+}\r
+\r
+static void\r
+#ifdef __STDC__\r
+ProcessArgs( int argc, char **argv, Opt *options )\r
+#else\r
+ProcessArgs( argc, argv, options )\r
+int argc;\r
+char **argv;\r
+Opt *options;\r
+#endif\r
+{\r
+       Opt *p;\r
+       require(argv!=NULL, "ProcessArgs: command line NULL");\r
+\r
+       while ( argc-- > 0 )\r
+       {\r
+               p = options;\r
+               while ( p->option != NULL )\r
+               {\r
+                       if ( strcmp(p->option, "*") == 0 ||\r
+                                strcmp(p->option, *argv) == 0 )\r
+                       {\r
+                               if ( p->arg )\r
+                               {\r
+                                       (*p->process)( *argv, *(argv+1) );\r
+                                       argv++;\r
+                                       argc--;\r
+                               }\r
+                               else\r
+                                       (*p->process)( *argv );\r
+                               break;\r
+                       }\r
+                       p++;\r
+               }\r
+               argv++;\r
+       }\r
+}\r
+\r
+#ifdef __STDC__\r
+void fatal( char *err_)\r
+#else\r
+void fatal( err_)\r
+char *err_;\r
+#endif\r
+{\r
+       fprintf(stderr, "genmk: %s\n", err_);\r
+       exit(1);\r
+}\r
+\r
+#ifdef __STDC__\r
+void warn( char *err_)\r
+#else\r
+void warn( err_)\r
+char *err_;\r
+#endif\r
+{\r
+       fprintf(stderr, "genmk: %s\n", err_);\r
+}\r
+\r
+#ifdef __STDC__\r
+char *DIR(void)\r
+#else\r
+char *DIR()\r
+#endif\r
+{\r
+       static char buf[200+1];\r
+       \r
+       if ( strcmp(outdir,TopDirectory)==0 ) return "";\r
+       sprintf(buf, "%s%s", outdir, DirectorySymbol);\r
+       return buf;\r
+}\r