/* 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. */
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
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;
}
}