better
[pspp] / src / language / command.c
index 15b76519678145bd468101037671849f4652c554..09c951cae2cc7690037bffb24b392a4bc654c432 100644 (file)
@@ -86,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. */
@@ -359,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
@@ -469,8 +452,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;
     }
 }