From 20c0fa7cfbb8ce29de4eafa9c926e163b757d5c6 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Mon, 8 Oct 2012 13:26:42 +0200 Subject: [PATCH] use the new parser by default you can force the old parser with the command line flag --force-old-config-parser-v4.4-only (which will be present in v4.4 only, as the name suggests) --- include/all.h | 2 +- include/commands_parser.h | 5 +++++ include/config.h | 2 ++ src/cfgparse.y | 21 +++++++++++++++------ src/main.c | 5 +++++ 5 files changed, 28 insertions(+), 7 deletions(-) diff --git a/include/all.h b/include/all.h index 9ac6a54f..c9c4bbbe 100644 --- a/include/all.h +++ b/include/all.h @@ -80,7 +80,7 @@ #include "commands.h" #include "commands_parser.h" #include "config_directives.h" -//#include "config_parser.h" +#include "config_parser.h" #include "fake_outputs.h" #include "display_version.h" diff --git a/include/commands_parser.h b/include/commands_parser.h index 6ff8d54e..fcc14ff5 100644 --- a/include/commands_parser.h +++ b/include/commands_parser.h @@ -27,6 +27,11 @@ struct CommandResult { /* Whether the command requires calling tree_render. */ bool needs_tree_render; + + /* The next state to transition to. Passed to the function so that we can + * determine the next state as a result of a function call, like + * cfg_criteria_pop_state() does. */ + int next_state; }; struct CommandResult *parse_command(const char *input); diff --git a/include/config.h b/include/config.h index 76fee94d..fd9c7303 100644 --- a/include/config.h +++ b/include/config.h @@ -24,6 +24,8 @@ extern char *current_configpath; extern Config config; extern SLIST_HEAD(modes_head, Mode) modes; extern TAILQ_HEAD(barconfig_head, Barconfig) barconfigs; +/* defined in src/cfgparse.y */ +extern bool force_old_config_parser; /** * Used during the config file lexing/parsing to keep the state of the lexer diff --git a/src/cfgparse.y b/src/cfgparse.y index 8bc7990e..2a22aae4 100644 --- a/src/cfgparse.y +++ b/src/cfgparse.y @@ -13,6 +13,8 @@ #include "all.h" +bool force_old_config_parser = false; + static pid_t configerror_pid = -1; static Match current_match; @@ -625,15 +627,20 @@ void parse_file(const char *f) { } } - /* now lex/parse it */ - yy_scan_string(new); context = scalloc(sizeof(struct context)); context->filename = f; - if (yyparse() != 0) { - fprintf(stderr, "Could not parse configfile\n"); - exit(1); + if (force_old_config_parser) { + /* now lex/parse it */ + yy_scan_string(new); + if (yyparse() != 0) { + fprintf(stderr, "Could not parse configfile\n"); + exit(1); + } + } else { + struct ConfigResult *config_output = parse_config(new, context); + yajl_gen_free(config_output->json_gen); } check_for_duplicate_bindings(context); @@ -669,7 +676,8 @@ void parse_file(const char *f) { start_configerror_nagbar(f); } - yylex_destroy(); + if (force_old_config_parser) + yylex_destroy(); FREE(context->line_copy); free(context); FREE(font_pattern); @@ -1485,6 +1493,7 @@ new_float: border_style: TOK_NORMAL optional_border_width { + /* FIXME: the whole border_style thing actually screws up when new_float is used because it overwrites earlier values :-/ */ config.default_border_width = $2; $$ = BS_NORMAL; } diff --git a/src/main.c b/src/main.c index 3b29f7a8..6d0f80cb 100644 --- a/src/main.c +++ b/src/main.c @@ -269,6 +269,7 @@ int main(int argc, char *argv[]) { {"get_socketpath", no_argument, 0, 0}, {"fake_outputs", required_argument, 0, 0}, {"fake-outputs", required_argument, 0, 0}, + {"force-old-config-parser-v4.4-only", no_argument, 0, 0}, {0, 0, 0, 0} }; int option_index = 0, opt; @@ -372,6 +373,10 @@ int main(int argc, char *argv[]) { LOG("Initializing fake outputs: %s\n", optarg); fake_outputs = sstrdup(optarg); break; + } else if (strcmp(long_options[option_index].name, "force-old-config-parser-v4.4-only") == 0) { + LOG("FORCING OLD CONFIG PARSER!\n"); + force_old_config_parser = true; + break; } /* fall-through */ default: