(dump_free) For SBC_DBL_LIST, enclose the output code in curly braces,
[pspp-builds.git] / src / language / xforms / recode.c
index d2548f31dc7361c66cf0de3f1486a96f45fed182..86bd8b88292a6a46163bf0d07f1b464eb6aa0bda 100644 (file)
    02110-1301, USA. */
 
 #include <config.h>
-#include <libpspp/message.h>
+
 #include <ctype.h>
 #include <math.h>
 #include <stdlib.h>
-#include <libpspp/alloc.h>
+
 #include <data/case.h>
-#include <language/command.h>
-#include <libpspp/compiler.h>
 #include <data/data-in.h>
 #include <data/dictionary.h>
-#include <libpspp/message.h>
+#include <data/procedure.h>
+#include <data/transformations.h>
+#include <data/variable.h>
+#include <language/command.h>
 #include <language/lexer/lexer.h>
+#include <language/lexer/range-parser.h>
+#include <libpspp/alloc.h>
+#include <libpspp/compiler.h>
 #include <libpspp/magic.h>
+#include <libpspp/message.h>
+#include <libpspp/message.h>
 #include <libpspp/pool.h>
-#include <language/lexer/range-parser.h>
 #include <libpspp/str.h>
-#include <data/variable.h>
 
 #include "gettext.h"
 #define _(msgid) gettext (msgid)
@@ -52,18 +56,25 @@ enum map_in_type
     MAP_CONVERT                        /* "123" => 123. */
   };
 
+/* A value involved in a RECODE mapping. */
+union recode_value 
+  {
+    double f;                   /* Numeric. */
+    char *c;                    /* Short or long string. */
+  };
+
 /* Describes input values to be mapped. */
 struct map_in
   {
     enum map_in_type type;      /* One of MAP_*. */
-    union value x, y;           /* Source values. */
+    union recode_value x, y;    /* Source values. */
   };
 
 /* Describes the value used as output from a mapping. */
 struct map_out 
   {
     bool copy_input;            /* If true, copy input to output. */
-    union value value;          /* If copy_input false, recoded value. */
+    union recode_value value;   /* If copy_input false, recoded value. */
     int width;                  /* If copy_input false, output value width. */ 
   };
 
@@ -139,7 +150,7 @@ cmd_recode (void)
           || !parse_dst_vars (trns))
         {
           recode_trns_free (trns);
-          return CMD_PART_SUCCESS;
+          return CMD_FAILURE;
         }
 
       /* Ensure that all the output strings are at least as wide
@@ -581,17 +592,19 @@ find_src_string (struct recode_trns *trns, const char *value, int width)
           break;
         case MAP_CONVERT:
           {
+            union value uv;
             struct data_in di;
 
             di.s = value;
             di.e = value + width;
-            di.v = &out->value;
+            di.v = &uv;
             di.flags = DI_IGNORE_ERROR;
             di.f1 = di.f2 = 0;
             di.format.type = FMT_F;
             di.format.w = width;
             di.format.d = 0;
             match = data_in (&di);
+            out->value.f = uv.f;
             break;
           }
         default: