From 0a37f63dddea0f5f41b4a7f0d57eb226284a543f Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Sun, 11 Sep 2022 17:24:42 -0700 Subject: [PATCH] INSERT: Add testing-only feature for ignoring cascading failures. This makes it easier to write tests that cause a lot of cascading failures. --- src/language/lexer/lexer.c | 4 +++- src/language/lexer/lexer.h | 3 ++- src/language/utilities/include.c | 11 +++++------ src/ui/terminal/main.c | 24 ++++++++++++++++-------- 4 files changed, 26 insertions(+), 16 deletions(-) diff --git a/src/language/lexer/lexer.c b/src/language/lexer/lexer.c index 24f901d3c0..f9236af19f 100644 --- a/src/language/lexer/lexer.c +++ b/src/language/lexer/lexer.c @@ -1866,9 +1866,11 @@ void lex_discard_noninteractive (struct lexer *lexer) { struct lex_source *src = lex_source__ (lexer); - if (src != NULL) { + if (src->reader->error == LEX_ERROR_IGNORE) + return; + lex_stage_clear (&src->pp); lex_stage_clear (&src->merge); lex_source_clear_parse (src); diff --git a/src/language/lexer/lexer.h b/src/language/lexer/lexer.h index a23e4bf693..b172ac610f 100644 --- a/src/language/lexer/lexer.h +++ b/src/language/lexer/lexer.h @@ -40,7 +40,8 @@ enum lex_error_mode LEX_ERROR_TERMINAL, /* Discard input line and continue reading. */ LEX_ERROR_CONTINUE, /* Continue to next command, except for cascading failures. */ - LEX_ERROR_STOP /* Stop processing. */ + LEX_ERROR_IGNORE, /* Continue, even for cascading failures. */ + LEX_ERROR_STOP, /* Stop processing. */ }; /* Reads a single syntax file as a stream of bytes encoded in UTF-8. diff --git a/src/language/utilities/include.c b/src/language/utilities/include.c index eefbde6158..f0d9efb5da 100644 --- a/src/language/utilities/include.c +++ b/src/language/utilities/include.c @@ -130,13 +130,12 @@ do_insert (struct lexer *lexer, struct dataset *ds, enum variant variant) { lex_match (lexer, T_EQUALS); if (lex_match_id (lexer, "CONTINUE")) - { - error_mode = LEX_ERROR_CONTINUE; - } + error_mode = LEX_ERROR_CONTINUE; else if (lex_match_id (lexer, "STOP")) - { - error_mode = LEX_ERROR_STOP; - } + error_mode = LEX_ERROR_STOP; + else if (settings_get_testing_mode () + && lex_match_id (lexer, "IGNORE")) + error_mode = LEX_ERROR_IGNORE; else { lex_error_expecting (lexer, "CONTINUE", "STOP"); diff --git a/src/ui/terminal/main.c b/src/ui/terminal/main.c index d2336472bf..60f9313840 100644 --- a/src/ui/terminal/main.c +++ b/src/ui/terminal/main.c @@ -142,17 +142,25 @@ main (int argc, char **argv) break; else if (cmd_result_is_failure (result) && lex_token (lexer) != T_STOP) { - if (lex_get_error_mode (lexer) == LEX_ERROR_STOP) + switch (lex_get_error_mode (lexer)) { + case LEX_ERROR_STOP: msg (MW, _("Error encountered while ERROR=STOP is effective.")); lex_discard_noninteractive (lexer); - } - else if (result == CMD_CASCADING_FAILURE - && lex_get_error_mode (lexer) != LEX_ERROR_TERMINAL) - { - msg (SE, _("Stopping syntax file processing here to avoid " - "a cascade of dependent command failures.")); - lex_discard_noninteractive (lexer); + break; + + case LEX_ERROR_CONTINUE: + if (result == CMD_CASCADING_FAILURE) + { + msg (SE, _("Stopping syntax file processing here to avoid " + "a cascade of dependent command failures.")); + lex_discard_noninteractive (lexer); + } + break; + + case LEX_ERROR_TERMINAL: + case LEX_ERROR_IGNORE: + break; } } -- 2.30.2