Lexer actually lexes filenames now, and odats are made out of mapvariants
[henge/webcc.git] / src / bin / tools / apc.c
index a22975d..2307ccc 100644 (file)
 /* Standard */
 #include <stdio.h>  //print
 #include <errno.h>  //errors
-#include <string.h> //strnlen
+#include <string.h> //strndupa
 /* Posix */
 #include <stdlib.h> //exit
 #include <unistd.h> //getopt
+/* Internal */
+#include <apc/parser.tab.h> //bison
 
 const char* cargs['Z'] = {0};
 
 int main(int, char*[]);
 
 extern //bison
-void yyparse(void);
+int yyparse(void);
 extern //lexer.c
 int  lexer_init(void);
 
+extern //apc/parser.tab.c
+YYSTYPE yylval;
+extern //lexer.c
+int  lexer(void);
+
 /* Main entry from terminal
    parses the command line and kicks off recursive scanning
 */
@@ -35,18 +42,24 @@ int main
 ( int   argc,
   char* argv[]
 )
-#define S(S)#S //stringifier
+#define $($)#$ //stringifier
 #define MAXSTR 255
-#define MAXERR "-%c allows at most " S(MAXSTR) " input characters\n", opt
-#define USAGE  "Usage: %s [-r root]\n", argv[0]
+#define MAXERR "-%c allows at most " $(MAXSTR) " input characters\n", opt
+#define OPTS  "d:o:h-"
+#define USAGE "Usage %s [-d dir_root][-o output_file][-h]\n", argv[0]
+#define USAGE_LONG                                     \
+  "\tOptions:\n"                                       \
+  "\t\t-d\tRoot directory to parse from \t[./]\n"      \
+  "\t\t-o\tOutput filename \t\t[a.asspak]\n"           \
+  "\t\t-h\tPrint this help\n"
 #define DONE   -1
 { int   opt;
 
  getopt:
-  switch (opt = getopt(argc, argv, "r:o:"))
+  switch (opt = getopt(argc, argv, OPTS))
   { case DONE:
       break;
-    case 'r' :
+    case 'd' :
     case 'o' :
       if (strnlen(optarg, MAXSTR) != MAXSTR)
         { cargs[opt] = optarg;
@@ -56,6 +69,10 @@ int main
     default :
       fprintf(stderr, USAGE);
       exit(EXIT_FAILURE);
+    case 'h' :
+      printf(USAGE);
+      printf(USAGE_LONG);
+      exit(EXIT_SUCCESS);
   }
   if (lexer_init())
     { perror("lexer");