Rewrote most of the examine command.
[pspp-builds.git] / src / autorecode.c
index f6b8e15ece49a73ae1737ab9036300198350897a..a28b13bdcac0e8c3cd2a6257f4019de448324a6f 100644 (file)
    02111-1307, USA. */
 
 #include <config.h>
-#include <assert.h>
+#include "error.h"
 #include <stdlib.h>
 #include "alloc.h"
+#include "case.h"
 #include "command.h"
+#include "dictionary.h"
 #include "error.h"
 #include "hash.h"
 #include "lexer.h"
@@ -103,7 +105,6 @@ cmd_autorecode (void)
   arc.print = 0;
   dst_cnt = 0;
 
-  lex_match_id ("AUTORECODE");
   lex_match_id ("VARIABLES");
   lex_match ('=');
   if (!parse_variables (default_dict, &arc.src_vars, &arc.var_cnt,
@@ -205,7 +206,8 @@ arc_free (struct autorecode_pgm *arc)
       int i;
 
       for (i = 0; i < arc->var_cnt; i++)
-        hsh_destroy (arc->src_values[i]); 
+        hsh_destroy (arc->src_values[i]);
+      free (arc->src_values);
     }
   pool_destroy (arc->src_values_pool);
 }
@@ -262,7 +264,7 @@ recode (const struct autorecode_pgm *arc)
 
 static int
 autorecode_trns_proc (struct trns_header * trns, struct ccase * c,
-                      int case_num UNUSED)
+                      int case_idx UNUSED)
 {
   struct autorecode_trns *t = (struct autorecode_trns *) trns;
   int i;
@@ -271,17 +273,15 @@ autorecode_trns_proc (struct trns_header * trns, struct ccase * c,
     {
       struct arc_spec *spec = &t->specs[i];
       struct arc_item *item;
+      union value v;
 
       if (spec->src->type == NUMERIC)
-       item = hsh_force_find (spec->items, &c->data[spec->src->fv].f);
+        v.f = case_num (c, spec->src->fv);
       else
-       {
-         union value v;
-         v.c = c->data[spec->src->fv].s;
-         item = hsh_force_find (spec->items, &v);
-       }
+        v.c = (char *) case_str (c, spec->src->fv);
+      item = hsh_force_find (spec->items, &v);
 
-      c->data[spec->dest->fv].f = item->to;
+      case_data_rw (c, spec->dest->fv)->f = item->to;
     }
   return -1;
 }
@@ -346,9 +346,9 @@ autorecode_proc_func (struct ccase *c, void *arc_)
       union value v, *vp, **vpp;
 
       if (arc->src_vars[i]->type == NUMERIC)
-        v.f = c->data[arc->src_vars[i]->fv].f;
+        v.f = case_num (c, arc->src_vars[i]->fv);
       else
-        v.c = c->data[arc->src_vars[i]->fv].s;
+        v.c = (char *) case_str (c, arc->src_vars[i]->fv);
 
       vpp = (union value **) hsh_probe (arc->src_values[i], &v);
       if (*vpp == NULL)