Categorical dependent variables for EXPORTed models
[pspp] / src / sel-if.c
index f4afd9c65cbffe3cda2ae2c50db033a3c0d0464a..10d1030f004f70eb4419c2a1a060482e2519bebf 100644 (file)
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-   02111-1307, USA. */
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+   02110-1301, USA. */
 
 #include <config.h>
+#include <stdlib.h>
 #include "alloc.h"
 #include "command.h"
+#include "dictionary.h"
 #include "error.h"
-#include "expr.h"
+#include "expressions/public.h"
 #include "lexer.h"
 #include "str.h"
 #include "var.h"
 
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+
 /* SELECT IF transformation. */
 struct select_if_trns
   {
-    struct trns_header h;
     struct expression *e;      /* Test expression. */
   };
 
-static int select_if_proc (struct trns_header *, struct ccase *);
-static void select_if_free (struct trns_header *);
+static trns_proc_func select_if_proc;
+static trns_free_func select_if_free;
 
 /* Parses the SELECT IF transformation. */
 int
@@ -43,10 +47,7 @@ cmd_select_if (void)
   struct expression *e;
   struct select_if_trns *t;
 
-  lex_match_id ("SELECT");
-  lex_match_id ("IF");
-
-  e = expr_parse (PXP_BOOLEAN);
+  e = expr_parse (default_dict, EXPR_BOOLEAN);
   if (!e)
     return CMD_FAILURE;
 
@@ -58,36 +59,36 @@ cmd_select_if (void)
     }
 
   t = xmalloc (sizeof *t);
-  t->h.proc = select_if_proc;
-  t->h.free = select_if_free;
   t->e = e;
-  add_transformation ((struct trns_header *) t);
+  add_transformation (select_if_proc, select_if_free, t);
 
   return CMD_SUCCESS;
 }
 
 /* Performs the SELECT IF transformation T on case C. */
 static int
-select_if_proc (struct trns_header * t, struct ccase * c)
+select_if_proc (void *t_, struct ccase *c,
+                int case_num)
 {
-  return (expr_evaluate (((struct select_if_trns *) t)->e, c, NULL) == 1.0) - 2;
+  struct select_if_trns *t = t_;
+  return expr_evaluate_num (t->e, c, case_num) == 1.0 ? -1 : -2;
 }
 
 /* Frees SELECT IF transformation T. */
 static void
-select_if_free (struct trns_header * t)
+select_if_free (void *t_)
 {
-  expr_free (((struct select_if_trns *) t)->e);
+  struct select_if_trns *t = t_;
+  expr_free (t->e);
+  free (t);
 }
 
 /* Parses the FILTER command. */
 int
 cmd_filter (void)
 {
-  lex_match_id ("FILTER");
-
   if (lex_match_id ("OFF"))
-    default_dict.filter_var[0] = 0;
+    dict_set_filter (default_dict, NULL);
   else
     {
       struct variable *v;
@@ -103,13 +104,13 @@ cmd_filter (void)
          return CMD_FAILURE;
        }
 
-      if (v->name[0] == '#')
+      if (dict_class_from_id (v->name) == DC_SCRATCH)
        {
          msg (SE, _("The filter variable may not be scratch."));
          return CMD_FAILURE;
        }
-      
-      strcpy (default_dict.filter_var, v->name);
+
+      dict_set_filter (default_dict, v);
 
       FILTER_before_TEMPORARY = !temporary;
     }
@@ -123,10 +124,7 @@ cmd_process_if (void)
 {
   struct expression *e;
 
-  lex_match_id ("PROCESS");
-  lex_match_id ("IF");
-
-  e = expr_parse (PXP_BOOLEAN);
+  e = expr_parse (default_dict, EXPR_BOOLEAN);
   if (!e)
     return CMD_FAILURE;