3 \details The driver assumes the existence of a bison-generated parser,
4 referenced by the external function 'yyparse'.
5 It also assumes the existence of a lexer which must be initialized
6 before parsing, referenced by the external function 'lexer_init'
7 which assumes standard error handling.
8 All input arguments are made available through the exposed (that is,
9 non-static) array of character pointers 'cargs', which point
10 to the non-duplicated strings in 'argv' directly from the system.
11 \author Jordan Lavatai
13 ----------------------------------------------------------------------------*/
15 #include <stdio.h> //print
16 #include <errno.h> //errors
17 #include <string.h> //strndupa
19 #include <stdlib.h> //exit
20 #include <unistd.h> //getopt, sysconf
22 #include "parser.tab.h" //bison
24 #define DEFAULT_PAGESIZE 4096
25 const char* cargs
['Z'] = {0};
26 const long sys_pagesize
;
30 int main(int, char*[]);
38 int scanner_init(void);
40 int scanner(yypstate
*, yycstate
*);
44 extern //apc/parser.tab.c
47 yycstate
* yycstate_new(void);
52 /* Main entry from terminal
53 parses the command line and kicks off recursive scanning
59 #define $($)#$ //stringifier
61 #define MAXERR "-%c allows at most " $(MAXSTR) " input characters\n", opt
63 #define USAGE "Usage %s [-d dir_root][-o output_file][-h]\n", argv[0]
66 "\t\t-d\tRoot directory to parse from \t[./]\n" \
67 "\t\t-o\tOutput filename \t\t[a.asspak]\n" \
68 "\t\t-h\tPrint this help\n"
73 switch (opt
= getopt(argc
, argv
, OPTS
))
78 if (strnlen(optarg
, MAXSTR
) != MAXSTR
)
79 { cargs
[opt
] = optarg
;
82 fprintf(stderr
, MAXERR
);
84 fprintf(stderr
, USAGE
);
91 if ((sys_pagesize
= sysconf(_SC_PAGESIZE
)) == 0)
92 sys_pagesize
= DEFAULT_PAGESIZE
;
94 apc_pstate
= yypstate_new();
95 apc_cstate
= yycstate_new();
97 if (scanner_init() || ir_init())