everything passes again ctables
authorBen Pfaff <blp@cs.stanford.edu>
Sat, 11 Dec 2021 05:23:07 +0000 (21:23 -0800)
committerBen Pfaff <blp@cs.stanford.edu>
Sat, 11 Dec 2021 05:23:07 +0000 (21:23 -0800)
src/language/command.c
src/language/command.def
src/language/control/do-if.c
src/language/control/loop.c
src/language/data-io/data-list.c
src/language/data-io/inpt-pgm.c
src/language/data-io/inpt-pgm.h
src/language/xforms/compute.c
tests/language/control/do-if.at

index 09c951cae2cc7690037bffb24b392a4bc654c432..bffd13ebb0d74b119de6d296b7e4f4fe3ba91f60 100644 (file)
@@ -375,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:
index b588552244bd20036f307c97aabdff598c809c1c..352f7c107893067ce6e3ae8ce873d211969b3e27 100644 (file)
@@ -149,11 +149,17 @@ DEF_CMD (S_DATA, 0, "T-TEST", cmd_t_test)
 DEF_CMD (S_DATA, 0, "TEMPORARY", cmd_temporary)
 DEF_CMD (S_DATA, 0, "USE", cmd_use)
 
-/* Commands valid only with INPUT PROGRAM. */
+/* Commands valid only inside INPUT PROGRAM. */
 DEF_CMD (S_INPUT_PROGRAM | S_NESTED_INPUT_PROGRAM, 0, "END CASE", cmd_end_case)
 DEF_CMD (S_INPUT_PROGRAM | S_NESTED_INPUT_PROGRAM, 0, "END FILE", cmd_end_file)
 DEF_CMD (S_INPUT_PROGRAM | S_NESTED_INPUT_PROGRAM, 0, "REREAD", cmd_reread)
 
+/* Not really commands, but part of LOOP and DO IF syntax. */
+DEF_CMD (S_ANY, 0, "ELSE IF", cmd_inside_do_if)
+DEF_CMD (S_ANY, 0, "ELSE", cmd_inside_do_if)
+DEF_CMD (S_ANY, 0, "END IF", cmd_inside_do_if)
+DEF_CMD (S_ANY, 0, "END LOOP", cmd_inside_loop)
+
 /* Commands for testing PSPP. */
 DEF_CMD (S_ANY, F_TESTING, "DEBUG EXPAND", cmd_debug_expand)
 DEF_CMD (S_ANY, F_TESTING, "DEBUG EVALUATE", cmd_debug_evaluate)
index f4fab4734ccadc0e191fae79c37115d3c3d07ed5..c564240bb16e3b300f6573014f1237ad049e2535 100644 (file)
@@ -143,6 +143,13 @@ cmd_do_if (struct lexer *lexer, struct dataset *ds)
   return ok ? CMD_SUCCESS : CMD_CASCADING_FAILURE;
 }
 
+int
+cmd_inside_do_if (struct lexer *lexer UNUSED, struct dataset *ds UNUSED)
+{
+  msg (SE, _("This command cannot appear outside DO IF...END IF."));
+  return CMD_FAILURE;
+}
+
 static const struct trns_chain *
 do_if_find_clause (const struct do_if_trns *do_if,
                    struct ccase *c, casenumber case_num)
index 22c73519de3caa70f48b8b2e25f0cd98bdb9510e..b55028177d588d4a588934571aa07e180e976f66 100644 (file)
@@ -119,6 +119,13 @@ cmd_loop (struct lexer *lexer, struct dataset *ds)
   return ok ? CMD_SUCCESS : CMD_CASCADING_FAILURE;
 }
 
+int
+cmd_inside_loop (struct lexer *lexer UNUSED, struct dataset *ds UNUSED)
+{
+  msg (SE, _("This command cannot appear outside LOOP...END LOOP."));
+  return CMD_FAILURE;
+}
+
 static enum trns_result
 break_trns_proc (void *aux UNUSED, struct ccase **c UNUSED,
                  casenumber case_num UNUSED)
@@ -128,11 +135,11 @@ break_trns_proc (void *aux UNUSED, struct ccase **c UNUSED,
 
 /* Parses BREAK. */
 int
-cmd_break (struct lexer *lexer UNUSED, struct dataset *ds)
+cmd_break (struct lexer *lexer, struct dataset *ds)
 {
   if (!in_loop)
     {
-      msg (SE, _("BREAK cannot appear outside LOOP...END LOOP."));
+      cmd_inside_loop (lexer, ds);
       return CMD_FAILURE;
     }
 
index b1a771734023307584015003f1a7f665b0928daf..1ade0dc617c566c885001a21634ea37d55df438b 100644 (file)
@@ -302,6 +302,8 @@ cmd_data_list (struct lexer *lexer, struct dataset *ds)
   fh_unref (fh);
   free (encoding);
 
+  data_list_seen ();
+
   return CMD_SUCCESS;
 
  error:
index 03345003b701d9d6ba6fd339ce49c44d1fe611b8..c295db642830d4ef6ce2c97d2814b24185bc1c00 100644 (file)
@@ -80,6 +80,12 @@ in_input_program (void)
   return inside_input_program;
 }
 
+void
+data_list_seen (void)
+{
+  saw_DATA_LIST = true;
+}
+
 /* Emits an END CASE transformation for INP. */
 static void
 emit_END_CASE (struct dataset *ds)
index cac4d9b6d709b978f827e0dc60f122703cd803cf..d6c5bbd63d73290d305117bf4480bc74f7b01bae 100644 (file)
@@ -20,6 +20,7 @@
 #include <stdbool.h>
 
 bool in_input_program (void);
-void cancel_input_program (void);
+
+void data_list_seen (void);
 
 #endif /* inpt-pgm.h */
index 083d7d219f386f456bcfb0262e3d283ee4f702d5..5c330f65a823e746a8dfefa854f79ff142529e56 100644 (file)
@@ -129,7 +129,6 @@ compute_num (void *compute_, struct ccase **c, casenumber case_num)
 {
   struct compute_trns *compute = compute_;
 
-  printf ("compute\n");
   if (compute->test == NULL
       || expr_evaluate_num (compute->test, *c, case_num) == 1.0)
     {
index d0bf071765c8ba9d327c39b109df1c928f87be98..4b862dce4d1cd016bb24523d65b8abbe3481132a 100644 (file)
@@ -91,8 +91,6 @@ EXECUTE.
 ])
 AT_CHECK([pspp -O format=csv do-if.sps], [1], [dnl
 do-if.sps:7: error: ELSE: This command cannot appear outside DO IF...END IF.
-
-do-if.sps:9: error: Stopping syntax file processing here to avoid a cascade of dependent command failures.
 ])
 AT_CLEANUP