INPUT PROGRAM: Avoid infinite loop for trivially empty input program.
[pspp] / src / language / command.c
index ff2b030ce0e206f3af47c48f090368027dd60e4c..78fd5f00b00fe6cba1bd77806ac976c7fd2fedcd 100644 (file)
@@ -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 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
 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,
@@ -138,7 +150,6 @@ cmd_parse_in_state (struct lexer *lexer, struct dataset *ds,
   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;
 
@@ -362,7 +373,7 @@ 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:
@@ -385,24 +396,23 @@ report_state_mismatch (const struct command *command, enum cmd_state state)
         case S_INITIAL | S_DATA:
           NOT_REACHED ();
         case S_INITIAL | S_INPUT_PROGRAM:
-          msg (SE, _("%s is allowed only before the active dataset 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 dataset 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 dataset 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 dataset 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 INPUT PROGRAM or inside FILE TYPE."), command->name);
           break;
 
           /* Three allowed states. */
@@ -431,7 +441,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");