diff --git a/b2/boom.c b/b2/boom.c index 86bf088..381dc47 100644 --- a/b2/boom.c +++ b/b2/boom.c @@ -12,29 +12,11 @@ #include #include -#include #include -#include #include "lang.h" -static void open_stdin(const char *name) -{ - int fd; - - fd = open(name, O_RDONLY); - if (fd < 0) { - perror(name); - exit(1); - } - if (dup2(fd, 0) < 0) { - perror("dup2"); - exit(1); - } -} - - static void usage(const char *name) { fprintf(stderr, @@ -51,7 +33,7 @@ static void usage(const char *name) int main(int argc, char **argv) { - void (*parse)(void) = parse_hierarchy; + void (*parse)(const char *name) = parse_hierarchy; int i; for (i = 1; i != argc; i++) { @@ -67,8 +49,7 @@ int main(int argc, char **argv) else usage(*argv); } else { - open_stdin(argv[i]); - parse(); + parse(argv[i]); } } return 0; diff --git a/b2/lang.h b/b2/lang.h index fe0f263..923ab9a 100644 --- a/b2/lang.h +++ b/b2/lang.h @@ -13,11 +13,11 @@ #ifndef LANG_H #define LANG_H -void parse_hierarchy(void); -void parse_characteristics(void); -void parse_inventory(void); -void parse_currencies(void); -void parse_providers(void); +void parse_hierarchy(const char *name); +void parse_characteristics(const char *name); +void parse_inventory(const char *name); +void parse_currencies(const char *name); +void parse_providers(const char *name); void yywarnf(const char *fmt, ...); void yyerrorf(const char *fmt, ...); diff --git a/b2/lang.l b/b2/lang.l index 1772ea3..6ef5581 100644 --- a/b2/lang.l +++ b/b2/lang.l @@ -12,6 +12,8 @@ #include #include +#include +#include #include "util.h" #include "param.h" @@ -27,48 +29,59 @@ static int expose_nl; static int lineno; -void parse_hierarchy(void) +static void open_stdin(const char *name) { - start_token = START_HIERARCHY; - expose_nl = 0; + int fd; + + fd = open(name, O_RDONLY); + if (fd < 0) { + perror(name); + exit(1); + } + if (dup2(fd, 0) < 0) { + perror("dup2"); + exit(1); + } +} + + +static void do_parse(const char *name, int start, int nl) +{ + open_stdin(name); + start_token = start; + expose_nl = nl; lineno = 1; yyparse(); } -void parse_characteristics(void) +void parse_hierarchy(const char *name) { - start_token = START_CHAR; - expose_nl = 1; - lineno = 1; - yyparse(); + do_parse(name, START_HIERARCHY, 0); } -void parse_inventory(void) +void parse_characteristics(const char *name) { - start_token = START_INVENTORY; - expose_nl = 1; - lineno = 1; - yyparse(); + do_parse(name, START_CHAR, 1); } -void parse_currencies(void) +void parse_inventory(const char *name) { - start_token = START_EXCHANGE; - expose_nl = 1; - lineno = 1; - yyparse(); + do_parse(name, START_INVENTORY, 1); } -void parse_providers(void) +void parse_currencies(const char *name) { - start_token = START_PROVIDERS; - expose_nl = 1; - lineno = 1; - yyparse(); + do_parse(name, START_EXCHANGE, 1); +} + + +void parse_providers(const char *name) +{ + do_parse(name, START_PROVIDERS, 1); } %}