X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=inline;f=src%2Flanguage%2Fcommand.c;h=bffd13ebb0d74b119de6d296b7e4f4fe3ba91f60;hb=0c0593b7c5d28af91329ec96447242120861db81;hp=522d53eaa2d34217a20371c0664d6709dda723f8;hpb=0aae014cd74bc4ff005f87d7bac7901ccd2d8224;p=pspp diff --git a/src/language/command.c b/src/language/command.c index 522d53eaa2..bffd13ebb0 100644 --- a/src/language/command.c +++ b/src/language/command.c @@ -55,9 +55,6 @@ cmd_result_is_valid (enum cmd_result 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: @@ -89,13 +86,15 @@ cmd_result_is_failure (enum cmd_result result) /* Command processing states. */ enum states { - S_INITIAL = 1 << 0, /* Allowed before active dataset defined. */ - S_DATA = 1 << 1, /* Allowed after active dataset defined. */ - S_INPUT_PROGRAM = 1 << 2, /* Allowed in INPUT PROGRAM. */ - S_FILE_TYPE = 1 << 3, /* Allowed in FILE TYPE. */ - S_NESTED = 1 << 4, /* Allowed in LOOP and DO IF. */ - - S_ANY = S_INITIAL | S_DATA | S_INPUT_PROGRAM | S_FILE_TYPE | S_NESTED, + S_INITIAL = 1 << CMD_STATE_INITIAL, + S_DATA = 1 << CMD_STATE_DATA, + S_INPUT_PROGRAM = 1 << CMD_STATE_INPUT_PROGRAM, + S_FILE_TYPE = 1 << CMD_STATE_FILE_TYPE, + S_NESTED_DATA = 1 << CMD_STATE_NESTED_DATA, + S_NESTED_INPUT_PROGRAM = 1 << CMD_STATE_NESTED_INPUT_PROGRAM, + + S_NESTED_ANY = S_NESTED_DATA | S_NESTED_INPUT_PROGRAM, + S_ANY = S_INITIAL | S_DATA | S_INPUT_PROGRAM | S_FILE_TYPE | S_NESTED_ANY, }; /* Other command requirements. */ @@ -362,26 +361,7 @@ parse_command_name (struct lexer *lexer, int *n_tokens) static bool in_correct_state (const struct command *command, enum cmd_state state) { - switch (state) - { - case CMD_STATE_INITIAL: - return command->states & S_INITIAL; - - case CMD_STATE_DATA: - return command->states & S_DATA; - - case CMD_STATE_INPUT_PROGRAM: - return command->states & S_INPUT_PROGRAM; - - case CMD_STATE_FILE_TYPE: - return command->states & S_FILE_TYPE; - - case CMD_STATE_NESTED: - return command->states & S_NESTED; - - default: - NOT_REACHED (); - } + return command->states & (1 << state); } /* Emits an appropriate error message for trying to invoke @@ -395,7 +375,8 @@ report_state_mismatch (const struct command *command, enum cmd_state state) { case CMD_STATE_INITIAL: case CMD_STATE_DATA: - switch ((int) command->states) + switch ((int) command->states + & (S_INITIAL | S_DATA | S_INPUT_PROGRAM | S_FILE_TYPE)) { /* One allowed state. */ case S_INITIAL: @@ -472,8 +453,22 @@ report_state_mismatch (const struct command *command, enum cmd_state state) msg (SE, _("%s is not allowed inside %s."), command->name, "FILE TYPE"); break; - case CMD_STATE_NESTED: - msg (SE, _("%s is not allowed inside DO IF or LOOP."), command->name); + case CMD_STATE_NESTED_DATA: + case CMD_STATE_NESTED_INPUT_PROGRAM: + switch ((int) command->states & S_NESTED_ANY) + { + case 0: + msg (SE, _("%s is not allowed inside DO IF or LOOP."), command->name); + break; + + case S_NESTED_DATA: + msg (SE, _("In INPUT PROGRAM, " + "%s is not allowed inside DO IF or LOOP."), command->name); + break; + + default: + NOT_REACHED (); + } break; } }