diff options
Diffstat (limited to 'src/config-bison.y')
-rw-r--r-- | src/config-bison.y | 92 |
1 files changed, 87 insertions, 5 deletions
diff --git a/src/config-bison.y b/src/config-bison.y index 4f9dae5..0000907 100644 --- a/src/config-bison.y +++ b/src/config-bison.y @@ -21,6 +21,9 @@ %name-prefix "lt_config_" %{ +#include <stdlib.h> +#include <string.h> + #include "config.h" #include "lib-include.h" @@ -48,15 +51,20 @@ do { \ ERROR("failed to process option\n"); \ lt_list_add_tail(&opt->list, &opt_list); \ } while(0) + +static struct lt_list_head ln_names; + %} -%token INCLUDE FILENAME BOOL VALUE END +%token INCLUDE NAME BOOL VALUE END %token OPTIONS %token OPT_HEADERS OPT_INDENT_SYM OPT_PIPE %token OPT_TIMESTAMP OPT_FRAMESIZE OPT_FRAMESIZE_CHECK %token OPT_HIDE_TID OPT_FOLLOW_FORK OPT_FOLLOW_EXEC %token OPT_DEMANGLE OPT_BRACES OPT_ENABLE_ARGS %token OPT_DETAIL_ARGS OPT_OUTPUT_TTY +%token OPT_LIBS OPT_LIBS_TO OPT_LIBS_FROM +%token OPT_SYM OPT_SYM_OMIT OPT_SYM_BELOW %union { @@ -64,7 +72,7 @@ do { \ unsigned long l; } -%type <s> FILENAME +%type <s> NAME %type <s> BOOL %type <l> VALUE @@ -82,7 +90,7 @@ entry END | /* left blank intentionally */ -include_def: INCLUDE '"' FILENAME '"' +include_def: INCLUDE '"' NAME '"' { if (lt_inc_open(scfg->sh, lt_config_sinc, $3)) ERROR("failed to process include"); @@ -102,7 +110,7 @@ options_def: OPTIONS '{' OPTIONS_DEF '}' } OPTIONS_DEF: -OPTIONS_DEF OPT_HEADERS '=' '"' FILENAME '"' +OPTIONS_DEF OPT_HEADERS '=' '"' NAME '"' { OPTION_ADD(LT_OPT_HEADERS, $5, -1); } @@ -167,18 +175,92 @@ OPTIONS_DEF OPT_DETAIL_ARGS '=' BOOL OPTION_ADD(LT_OPT_DETAIL_ARGS, $4, -1); } | -OPTIONS_DEF OPT_OUTPUT_TTY '=' '"' FILENAME '"' +OPTIONS_DEF OPT_OUTPUT_TTY '=' '"' NAME '"' { OPTION_ADD(LT_OPT_OUTPUT_TTY, $5, -1); } | +OPTIONS_DEF OPT_LIBS '=' list_names_comma +{ + char libs[LT_LIBS_MAXSIZE]; + + if (lt_config_ln_fill(&ln_names, libs, LT_LIBS_MAXSIZE)) + ERROR("failed to process libs option"); + + OPTION_ADD(LT_OPT_LIBS, libs, -1); +} +| +OPTIONS_DEF OPT_LIBS_TO '=' list_names_comma +{ + char libs_to[LT_LIBS_MAXSIZE]; + + if (lt_config_ln_fill(&ln_names, libs_to, LT_LIBS_MAXSIZE)) + ERROR("failed to process libs_to option"); + + OPTION_ADD(LT_OPT_LIBS_TO, libs_to, -1); +} +| +OPTIONS_DEF OPT_LIBS_FROM '=' list_names_comma +{ + char libs_from[LT_LIBS_MAXSIZE]; + + if (lt_config_ln_fill(&ln_names, libs_from, LT_LIBS_MAXSIZE)) + ERROR("failed to process libs_from option"); + + OPTION_ADD(LT_OPT_LIBS_FROM, libs_from, -1); +} +| +OPTIONS_DEF OPT_SYM '=' list_names_comma +{ + char sym[LT_LIBS_MAXSIZE]; + + if (lt_config_ln_fill(&ln_names, sym, LT_LIBS_MAXSIZE)) + ERROR("failed to process sym option"); + + OPTION_ADD(LT_OPT_SYM, sym, -1); +} +| +OPTIONS_DEF OPT_SYM_OMIT '=' list_names_comma +{ + char sym_omit[LT_SYMBOLS_MAXSIZE]; + + if (lt_config_ln_fill(&ln_names, sym_omit, LT_SYMBOLS_MAXSIZE)) + ERROR("failed to process sym_omit option"); + + OPTION_ADD(LT_OPT_SYM_OMIT, sym_omit, -1); +} +| +OPTIONS_DEF OPT_SYM_BELOW '=' list_names_comma +{ + char sym_below[LT_SYMBOLS_MAXSIZE]; + + if (lt_config_ln_fill(&ln_names, sym_below, LT_SYMBOLS_MAXSIZE)) + ERROR("failed to process sym_below option"); + + OPTION_ADD(LT_OPT_SYM_BELOW, sym_below, -1); +} +| /* left blank intentionally */ +list_names_comma: +list_names_comma ',' NAME +{ + if (lt_config_ln_add(&ln_names, $3)) + ERROR("failed to add list name"); +} +| +NAME +{ + if (lt_config_ln_add(&ln_names, $1)) + ERROR("failed to add list name"); +} + %% int lt_config_parse_init(struct lt_config_app *cfg, struct lt_include *inc) { scfg = cfg; lt_config_sinc = inc; + lt_init_list_head(&ln_names); return 0; } |