Rewrite expression code.
[pspp-builds.git] / src / do-if.c
index 88022b3b4ccf257b163e058f7e19768699c9f229..d7e80e5cdcc04fd49897325abfb13b5ed18dd1ce 100644 (file)
    02111-1307, USA. */
 
 #include <config.h>
-#include <assert.h>
+#include "do-ifP.h"
+#include "error.h"
 #include <stdlib.h>
 #include "alloc.h"
 #include "command.h"
 #include "error.h"
-#include "expr.h"
+#include "expressions/public.h"
 #include "lexer.h"
 #include "str.h"
 #include "var.h"
 
 #include "debug-print.h"
 
-#if DEBUGGING
-#include <stdio.h>
-#endif
-
 /* *INDENT-OFF* */
 /* Description of DO IF transformations:
 
 */
 /* *INDENT-ON* */
 
-#include "do-ifP.h"
-
 static struct do_if_trns *parse_do_if (void);
 static void add_ELSE_IF (struct do_if_trns *);
-static int goto_trns_proc (struct trns_header *, struct ccase *);
-static int do_if_trns_proc (struct trns_header *, struct ccase *);
-static void do_if_trns_free (struct trns_header *);
+static trns_proc_func goto_trns_proc, do_if_trns_proc;
+static trns_free_func do_if_trns_free;
 
 /* Parse DO IF. */
 int
@@ -157,8 +151,6 @@ cmd_else (void)
 {
   struct do_if_trns *t;
 
-  lex_match_id ("ELSE");
-
   /* Check that we're in a pleasing situation. */
   if (!ctl_stack || ctl_stack->type != CST_DO_IF)
     {
@@ -200,8 +192,6 @@ cmd_end_if (void)
   /* List iterator. */
   struct do_if_trns *iter;
 
-  lex_match_id ("IF");
-
   /* Check that we're in a pleasing situation. */
   if (!ctl_stack || ctl_stack->type != CST_DO_IF)
     {
@@ -254,9 +244,7 @@ parse_do_if (void)
   struct do_if_trns *t;
   struct expression *e;
 
-  lex_match_id ("IF");
-
-  e = expr_parse (PXP_BOOLEAN);
+  e = expr_parse (default_dict, EXPR_BOOLEAN);
   if (!e)
     return NULL;
   if (token != '.')
@@ -277,24 +265,26 @@ parse_do_if (void)
 
 /* Executes a goto transformation. */
 static int 
-goto_trns_proc (struct trns_header * t, struct ccase * c unused)
+goto_trns_proc (struct trns_header * t, struct ccase * c UNUSED,
+                int case_num UNUSED)
 {
   return ((struct goto_trns *) t)->dest;
 }
 
 static int 
-do_if_trns_proc (struct trns_header * trns, struct ccase * c)
+do_if_trns_proc (struct trns_header * trns, struct ccase * c,
+                 int case_num UNUSED)
 {
   struct do_if_trns *t = (struct do_if_trns *) trns;
-  union value bool;
+  double boolean;
 
-  expr_evaluate (t->cond, c, &bool);
-  if (bool.f == 1.0)
+  boolean = expr_evaluate_num (t->cond, c, case_num);
+  if (boolean == 1.0)
     {
       debug_printf ((_("DO IF %d: true\n"), t->h.index));
       return -1;
     }
-  else if (bool.f == 0.0)
+  else if (boolean == 0.0)
     {
       debug_printf ((_("DO IF %d: false\n"), t->h.index));
       return t->false_jump;