Improve error message for creating a new string var with COMPUTE or IF.
[pspp] / src / language / control / loop.c
index e91d9438f39c131836141ee2be53d47c970d2904..765d21314793e0165e235ec7c9ae3a0917a6048f 100644 (file)
@@ -61,7 +61,7 @@ struct loop_trns
 
     /* Iteration limit. */
     int max_pass_count;         /* Maximum number of passes (-1=unlimited). */
-    int pass;                  /* Number of passes thru the loop so far. */
+    int pass;                  /* Number of passes through the loop so far. */
 
     /* a=a TO b [BY c]. */
     struct variable *index_var; /* Index variable. */
@@ -177,10 +177,7 @@ close_loop (void *loop_)
 
   /* If there's nothing else limiting the number of loops, use
      MXLOOPS as a limit. */
-  if (loop->max_pass_count == -1
-      && loop->index_var == NULL
-      && loop->loop_condition == NULL
-      && loop->end_loop_condition == NULL)
+  if (loop->max_pass_count == -1 && loop->index_var == NULL)
     loop->max_pass_count = settings_get_mxloops ();
 }
 
@@ -197,7 +194,7 @@ parse_if_clause (struct lexer *lexer,
       return false;
     }
 
-  *condition = expr_parse_pool (lexer, loop->pool, loop->ds, EXPR_BOOLEAN);
+  *condition = expr_parse_bool (lexer, loop->pool, loop->ds);
   return *condition != NULL;
 }
 
@@ -235,8 +232,7 @@ parse_index_clause (struct dataset *ds, struct lexer *lexer,
   if (!lex_force_match (lexer, T_EQUALS))
     return false;
 
-  loop->first_expr = expr_parse_pool (lexer, loop->pool,
-                                     loop->ds, EXPR_NUMBER);
+  loop->first_expr = expr_parse (lexer, loop->pool, loop->ds, VAL_NUMERIC);
   if (loop->first_expr == NULL)
     return false;
 
@@ -255,13 +251,13 @@ parse_index_clause (struct dataset *ds, struct lexer *lexer,
           lex_sbc_only_once (e == &loop->last_expr ? "TO" : "BY");
           return false;
         }
-      *e = expr_parse_pool (lexer, loop->pool, loop->ds, EXPR_NUMBER);
+      *e = expr_parse (lexer, loop->pool, loop->ds, VAL_NUMERIC);
       if (*e == NULL)
         return false;
     }
   if (loop->last_expr == NULL)
     {
-      lex_sbc_missing (lexer, "TO");
+      lex_sbc_missing ("TO");
       return false;
     }
   if (loop->by_expr == NULL)
@@ -367,12 +363,8 @@ end_loop_trns_proc (void *loop_, struct ccase **c, casenumber case_num UNUSED)
     goto break_out;
 
   /* MXLOOPS limiter. */
-  if (loop->max_pass_count >= 0)
-    {
-      if (loop->pass >= loop->max_pass_count)
-        goto break_out;
-      loop->pass++;
-    }
+  if (loop->max_pass_count >= 0 && ++loop->pass >= loop->max_pass_count)
+    goto break_out;
 
   /* Indexing clause limiter: counting downward. */
   if (loop->index_var != NULL)