Adopt use of gnulib for portability.
[pspp-builds.git] / src / autorecode.c
index f6b8e15ece49a73ae1737ab9036300198350897a..1f0fd8a3d6943581c3a91b56d619cf609b0b53a5 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 <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"
@@ -30,6 +32,9 @@
 #include "var.h"
 #include "vfm.h"
 
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+
 /* FIXME: Implement PRINT subcommand. */
 
 /* Explains how to recode one value.  `from' must be first element.  */
@@ -103,7 +108,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,
@@ -150,7 +154,7 @@ cmd_autorecode (void)
          goto lossage;
        }
       for (j = 0; j < i; j++)
-       if (!strcmp (arc.dst_names[i], arc.dst_names[j]))
+       if (!strcasecmp (arc.dst_names[i], arc.dst_names[j]))
          {
            msg (SE, _("Duplicate variable name %s among target variables."),
                 arc.dst_names[i]);
@@ -205,7 +209,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);
 }
@@ -230,7 +235,7 @@ recode (const struct autorecode_pgm *arc)
   for (i = 0; i < arc->var_cnt; i++)
     {
       struct arc_spec *spec = &t->specs[i];
-      void **p = hsh_sort (arc->src_values[i]);
+      void *const *p = hsh_sort (arc->src_values[i]);
       int count = hsh_count (arc->src_values[i]);
       int j;
 
@@ -262,7 +267,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 +276,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 +349,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)