X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fcommand.c;h=448fae7ea803463f11a54edbec50a23c816875a4;hb=e937634e9021aa0656a6362f169ec2183efed499;hp=c00d94b9c4b3597bcc2416ae0e29fd56018b229f;hpb=b40baf410822471fbdeeec553693619d60d7c7b6;p=pspp diff --git a/src/language/command.c b/src/language/command.c index c00d94b9c4..448fae7ea8 100644 --- a/src/language/command.c +++ b/src/language/command.c @@ -23,6 +23,12 @@ #include #include #include +#if HAVE_SYS_WAIT_H +#include +#endif +#if HAVE_READLINE +#include +#endif #include #include @@ -36,17 +42,8 @@ #include #include #include -#include -#include #include - -#if HAVE_SYS_WAIT_H -#include -#endif - -#if HAVE_READLINE -#include -#endif +#include #include "xalloc.h" #include "xmalloca.h" @@ -143,11 +140,7 @@ cmd_parse_in_state (struct lexer *lexer, struct dataset *ds, { int result; - som_new_series (); - result = do_parse_command (lexer, ds, state); - if (cmd_result_is_failure (result)) - lex_discard_rest_of_command (lexer); assert (!proc_is_open (ds)); unset_cmd_algorithm (); @@ -175,8 +168,9 @@ static enum cmd_result do_parse_command (struct lexer *lexer, struct dataset *ds, enum cmd_state state) { - const struct command *command; + const struct command *command = NULL; enum cmd_result result; + bool opened = false; /* Read the command's first token. */ prompt_set_style (PROMPT_FIRST); @@ -203,53 +197,54 @@ do_parse_command (struct lexer *lexer, result = CMD_FAILURE; goto finish; } - else if (command->function == NULL) + text_item_submit (text_item_create (TEXT_ITEM_COMMAND_OPEN, command->name)); + opened = true; + + if (command->function == NULL) { msg (SE, _("%s is not yet implemented."), command->name); result = CMD_NOT_IMPLEMENTED; - goto finish; } else if ((command->flags & F_TESTING) && !settings_get_testing_mode ()) { msg (SE, _("%s may be used only in testing mode."), command->name); result = CMD_FAILURE; - goto finish; } else if ((command->flags & F_ENHANCED) && settings_get_syntax () != ENHANCED) { msg (SE, _("%s may be used only in enhanced syntax mode."), command->name); result = CMD_FAILURE; - goto finish; } else if (!in_correct_state (command, state)) { report_state_mismatch (command, state); result = CMD_FAILURE; - goto finish; } - - /* Execute command. */ - msg_set_command_name (command->name); - tab_set_command_name (command->name); - result = command->function (lexer, ds); - tab_set_command_name (NULL); - msg_set_command_name (NULL); + else + { + /* Execute command. */ + result = command->function (lexer, ds); + } assert (cmd_result_is_valid (result)); finish: - if ( cmd_result_is_failure (result)) + if (cmd_result_is_failure (result)) { - const struct source_stream *cs = lex_get_source_stream (lexer); - - if ( source_stream_current_error_mode (cs) == ERRMODE_STOP ) + lex_discard_rest_of_command (lexer); + if (source_stream_current_error_mode ( + lex_get_source_stream (lexer)) == ERRMODE_STOP ) { msg (MW, _("Error encountered while ERROR=STOP is effective.")); result = CMD_CASCADING_FAILURE; } } + if (opened) + text_item_submit (text_item_create (TEXT_ITEM_COMMAND_CLOSE, + command->name)); + return result; } @@ -689,9 +684,9 @@ report_state_mismatch (const struct command *command, enum cmd_state state) } } else if (state == CMD_STATE_INPUT_PROGRAM) - msg (SE, _("%s is not allowed inside INPUT PROGRAM."), command->name); + msg (SE, _("%s is not allowed inside %s."), command->name, "INPUT PROGRAM" ); else if (state == CMD_STATE_FILE_TYPE) - msg (SE, _("%s is not allowed inside FILE TYPE."), command->name); + msg (SE, _("%s is not allowed inside %s."), command->name, "FILE TYPE"); return false; }