X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fcommand.c;h=de20cb3caac25833be6ffd60654c3b5ac48e8436;hb=a09789d93e0160b14f1b06ad91080a249c252253;hp=703ae3ebceaf9c683926f231e31e3e5aa928b1a3;hpb=2be9bee9da6a2ce27715e58128569594319abfa2;p=pspp diff --git a/src/language/command.c b/src/language/command.c index 703ae3ebce..de20cb3caa 100644 --- a/src/language/command.c +++ b/src/language/command.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 1997-9, 2000, 2009, 2010, 2011 Free Software Foundation, Inc. + Copyright (C) 1997-9, 2000, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -26,6 +26,7 @@ #include "data/casereader.h" #include "data/dataset.h" #include "data/dictionary.h" +#include "data/session.h" #include "data/settings.h" #include "data/variable.h" #include "language/lexer/command-name.h" @@ -35,9 +36,8 @@ #include "libpspp/i18n.h" #include "libpspp/message.h" #include "libpspp/str.h" -#include "output/text-item.h" +#include "output/group-item.h" -#include "xalloc.h" #include "xmalloca.h" #include "gettext.h" @@ -49,10 +49,22 @@ static inline bool cmd_result_is_valid (enum cmd_result result) { - return (result == CMD_SUCCESS || result == CMD_EOF || result == CMD_FINISH - || (result >= CMD_PRIVATE_FIRST && result <= CMD_PRIVATE_LAST) - || result == CMD_FAILURE || result == CMD_NOT_IMPLEMENTED - || result == CMD_CASCADING_FAILURE); + switch (result) + { + case CMD_SUCCESS: + case CMD_EOF: + case CMD_FINISH: + case CMD_DATA_LIST: + case CMD_END_CASE: + case CMD_END_FILE: + case CMD_FAILURE: + case CMD_NOT_IMPLEMENTED: + case CMD_CASCADING_FAILURE: + return true; + + default: + return false; + } } /* Returns true if RESULT indicates success, @@ -76,8 +88,8 @@ cmd_result_is_failure (enum cmd_result result) /* Command processing states. */ enum states { - S_INITIAL = 0x01, /* Allowed before active file defined. */ - S_DATA = 0x02, /* Allowed after active file defined. */ + S_INITIAL = 0x01, /* Allowed before active dataset defined. */ + S_DATA = 0x02, /* Allowed after active dataset defined. */ S_INPUT_PROGRAM = 0x04, /* Allowed in INPUT PROGRAM. */ S_FILE_TYPE = 0x08, /* Allowed in FILE TYPE. */ S_ANY = 0x0f /* Allowed anywhere. */ @@ -129,13 +141,14 @@ enum cmd_result cmd_parse_in_state (struct lexer *lexer, struct dataset *ds, enum cmd_state state) { + struct session *session = dataset_session (ds); int result; result = do_parse_command (lexer, ds, state); + ds = session_active_dataset (session); assert (!proc_is_open (ds)); unset_cmd_algorithm (); - dict_clear_aux (dataset_dict (ds)); if (!dataset_end_of_command (ds)) result = CMD_CASCADING_FAILURE; @@ -147,7 +160,7 @@ cmd_parse (struct lexer *lexer, struct dataset *ds) { const struct dictionary *dict = dataset_dict (ds); return cmd_parse_in_state (lexer, ds, - proc_has_active_file (ds) && + dataset_has_source (ds) && dict_get_var_cnt (dict) > 0 ? CMD_STATE_DATA : CMD_STATE_INITIAL); } @@ -185,7 +198,8 @@ do_parse_command (struct lexer *lexer, result = CMD_FAILURE; goto finish; } - text_item_submit (text_item_create (TEXT_ITEM_COMMAND_OPEN, command->name)); + group_open_item_submit (group_open_item_create_nocopy ( + utf8_to_title (command->name), NULL)); opened = true; if (command->function == NULL) @@ -228,12 +242,12 @@ finish: result = lex_end_of_command (lexer); lex_discard_rest_of_command (lexer); - while (lex_token (lexer) == T_ENDCMD) - lex_get (lexer); + if (result != CMD_EOF && result != CMD_FINISH) + while (lex_token (lexer) == T_ENDCMD) + lex_get (lexer); if (opened) - text_item_submit (text_item_create (TEXT_ITEM_COMMAND_CLOSE, - command->name)); + group_close_item_submit (group_close_item_create ()); return result; } @@ -359,57 +373,57 @@ report_state_mismatch (const struct command *command, enum cmd_state state) assert (!in_correct_state (command, state)); if (state == CMD_STATE_INITIAL || state == CMD_STATE_DATA) { - switch (command->states) + switch ((int) command->states) { /* One allowed state. */ case S_INITIAL: - msg (SE, _("%s is allowed only before the active file has " + msg (SE, _("%s is allowed only before the active dataset has " "been defined."), command->name); break; case S_DATA: - msg (SE, _("%s is allowed only after the active file has " + msg (SE, _("%s is allowed only after the active dataset has " "been defined."), command->name); break; case S_INPUT_PROGRAM: - msg (SE, _("%s is allowed only inside INPUT PROGRAM."), - command->name); + msg (SE, _("%s is allowed only inside %s."), + command->name, "INPUT PROGRAM"); break; case S_FILE_TYPE: - msg (SE, _("%s is allowed only inside FILE TYPE."), command->name); + msg (SE, _("%s is allowed only inside %s."), command->name, "FILE TYPE"); break; /* Two allowed states. */ case S_INITIAL | S_DATA: NOT_REACHED (); case S_INITIAL | S_INPUT_PROGRAM: - msg (SE, _("%s is allowed only before the active file has " - "been defined or inside INPUT PROGRAM."), command->name); + msg (SE, _("%s is allowed only before the active dataset has been defined or inside %s."), + command->name, "INPUT PROGRAM"); break; case S_INITIAL | S_FILE_TYPE: - msg (SE, _("%s is allowed only before the active file has " - "been defined or inside FILE TYPE."), command->name); + msg (SE, _("%s is allowed only before the active dataset has been defined or inside %s."), + command->name, "FILE TYPE"); break; case S_DATA | S_INPUT_PROGRAM: - msg (SE, _("%s is allowed only after the active file has " - "been defined or inside INPUT PROGRAM."), command->name); + msg (SE, _("%s is allowed only after the active dataset has been defined or inside %s."), + command->name, "INPUT PROGRAM"); break; case S_DATA | S_FILE_TYPE: - msg (SE, _("%s is allowed only after the active file has " - "been defined or inside FILE TYPE."), command->name); + msg (SE, _("%s is allowed only after the active dataset has been defined or inside %s."), + command->name, "FILE TYPE"); break; case S_INPUT_PROGRAM | S_FILE_TYPE: - msg (SE, _("%s is allowed only inside INPUT PROGRAM " - "or inside FILE TYPE."), command->name); + msg (SE, _("%s is allowed only inside %s or inside %s."), command->name, + "INPUT PROGRAM", "FILE TYPE"); break; /* Three allowed states. */ case S_DATA | S_INPUT_PROGRAM | S_FILE_TYPE: - msg (SE, _("%s is allowed only after the active file has " + msg (SE, _("%s is allowed only after the active dataset has " "been defined, inside INPUT PROGRAM, or inside " "FILE TYPE."), command->name); break; case S_INITIAL | S_INPUT_PROGRAM | S_FILE_TYPE: - msg (SE, _("%s is allowed only before the active file has " + msg (SE, _("%s is allowed only before the active dataset has " "been defined, inside INPUT PROGRAM, or inside " "FILE TYPE."), command->name); break; @@ -428,7 +442,7 @@ 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 %s."), - command->name, "INPUT PROGRAM" ); + command->name, "INPUT PROGRAM"); else if (state == CMD_STATE_FILE_TYPE) msg (SE, _("%s is not allowed inside %s."), command->name, "FILE TYPE"); @@ -512,7 +526,7 @@ cmd_erase (struct lexer *lexer, struct dataset *ds UNUSED) if (settings_get_safer_mode ()) { - msg (SE, _("This command not allowed when the SAFER option is set.")); + msg (SE, _("This command not allowed when the %s option is set."), "SAFER"); return CMD_FAILURE; } @@ -541,6 +555,6 @@ cmd_erase (struct lexer *lexer, struct dataset *ds UNUSED) int cmd_new_file (struct lexer *lexer UNUSED, struct dataset *ds) { - proc_discard_active_file (ds); + dataset_clear (ds); return CMD_SUCCESS; }