data-in: Make data_in() parameters more uniform.
authorBen Pfaff <blp@cs.stanford.edu>
Mon, 20 Sep 2010 04:36:58 +0000 (21:36 -0700)
committerBen Pfaff <blp@cs.stanford.edu>
Fri, 24 Sep 2010 04:13:11 +0000 (21:13 -0700)
data_in() essentially takes an input encoding and an output encoding but
the parameters were in inconsistent order, inconsistently named, and had
inconsistent types.  This commit changes all that to, I hope, be easier to
understand.

12 files changed:
perl-module/PSPP.xs
src/data/data-in.c
src/data/data-in.h
src/language/data-io/data-parser.c
src/language/expressions/operations.def
src/language/lexer/value-parser.c
src/language/stats/flip.c
src/language/xforms/recode.c
src/ui/gui/helper.c
src/ui/gui/psppire-data-store.c
src/ui/gui/text-data-import-dialog.c
src/ui/syntax-gen.c

index 0e918a9fc25a8b35ae03a3b985331aae61616bfe..bf90d986f327b811fb5f67822d7cf5c332b0c0ca 100644 (file)
@@ -655,9 +655,8 @@ CODE:
       {
        struct substring ss = ss_cstr (SvPV_nolen (sv));
        if ( ! data_in (ss, LEGACY_NATIVE, ifmt->type, 0, 0,
-                       sfi->dict,
-                       case_data_rw (c, v),
-                       var_get_width (v)) )
+                       case_data_rw (c, v), var_get_width (v),
+                       dict_get_encoding (sfi->dict)))
          {
            RETVAL = 0;
            goto finish;
index b8226b37f926601dd1ed04f0ce368a242a5346ff..de19d670484fd8344de1351497684386ca0d3f16 100644 (file)
@@ -79,17 +79,16 @@ static bool trim_spaces_and_check_missing (struct data_in *);
 static int hexit_value (int c);
 \f
 /* Parses the characters in INPUT, which are encoded in the given
-   ENCODING, according to FORMAT.  Stores the parsed
-   representation in OUTPUT, which the caller must have
-   initialized with the given WIDTH (0 for a numeric field,
-   otherwise the string width).
-   Iff FORMAT is a string format, then DICT must be a pointer
-   to the dictionary associated with OUTPUT.  Otherwise, DICT
-   may be null. */
+   INPUT_ENCODING, according to FORMAT.
+
+   Stores the parsed representation in OUTPUT, which the caller must have
+   initialized with the given WIDTH (0 for a numeric field, otherwise the
+   string width).  If FORMAT is FMT_A, then OUTPUT_ENCODING must specify the
+   correct encoding for OUTPUT (normally obtained via dict_get_encoding()). */
 bool
-data_in (struct substring input, const char *encoding,
+data_in (struct substring input, const char *input_encoding,
          enum fmt_type format, int first_column, int last_column,
-         const struct dictionary *dict, union value *output, int width)
+         union value *output, int width, const char *output_encoding)
 {
   static data_in_parser_func *const handlers[FMT_NUMBER_OF_FORMATS] =
     {
@@ -146,13 +145,14 @@ data_in (struct substring input, const char *encoding,
       else
         {
           /* Use the final output encoding. */
-          dest_encoding = dict_get_encoding (dict);
+          dest_encoding = output_encoding;
         }
     }
 
   if (dest_encoding != NULL)
     {
-      i.input = recode_substring_pool (dest_encoding, encoding, input, NULL);
+      i.input = recode_substring_pool (dest_encoding, input_encoding, input,
+                                       NULL);
       s = i.input.string;
     }
   else
@@ -209,7 +209,7 @@ number_has_implied_decimals (const char *s, enum fmt_type type)
 }
 
 static bool
-has_implied_decimals (struct substring input, const char *encoding,
+has_implied_decimals (struct substring input, const char *input_encoding,
                       enum fmt_type format)
 {
   bool retval;
@@ -237,7 +237,7 @@ has_implied_decimals (struct substring input, const char *encoding,
       return false;
     }
 
-  s = recode_string (LEGACY_NATIVE, encoding,
+  s = recode_string (LEGACY_NATIVE, input_encoding,
                      ss_data (input), ss_length (input));
   retval = (format == FMT_Z
             ? strchr (s, '.') == NULL
@@ -255,11 +255,11 @@ has_implied_decimals (struct substring input, const char *encoding,
 
    If it is appropriate, this function modifies the numeric value in OUTPUT. */
 void
-data_in_imply_decimals (struct substring input, const char *encoding,
+data_in_imply_decimals (struct substring input, const char *input_encoding,
                         enum fmt_type format, int d, union value *output)
 {
   if (d > 0 && output->f != SYSMIS
-      && has_implied_decimals (input, encoding, format))
+      && has_implied_decimals (input, input_encoding, format))
     output->f /= pow (10., d);
 }
 \f
index af62b3aecba9ec019356d179005b8a633184de36..dbf2fa7caa82f5bf9d5c841db9e590bbeeacb973 100644 (file)
 union value;
 struct dictionary;
 
-bool data_in (struct substring input, const char *encoding,
-               enum fmt_type, int first_column, int last_column,
-               const struct dictionary *dict,
-               union value *output, int width);
+bool data_in (struct substring input, const char *input_encoding,
+              enum fmt_type, int first_column, int last_column,
+              union value *output, int width, const char *output_encoding);
 
 void data_in_imply_decimals (struct substring input, const char *encoding,
                              enum fmt_type format, int d, union value *output);
index 0802bba8c5971117b2ebf9db50ca7ed35b9a0d02..800ae57b50db3e027a82396ce243e4604cf45f5f 100644 (file)
@@ -509,7 +509,8 @@ static bool
 parse_fixed (const struct data_parser *parser, struct dfm_reader *reader,
              struct ccase *c)
 {
-  const char *encoding = dfm_reader_get_legacy_encoding (reader);
+  const char *input_encoding = dfm_reader_get_legacy_encoding (reader);
+  const char *output_encoding = dict_get_encoding (parser->dict);
   struct field *f;
   int row;
 
@@ -536,12 +537,12 @@ parse_fixed (const struct data_parser *parser, struct dfm_reader *reader,
                                           f->format.w);
           union value *value = case_data_rw_idx (c, f->case_idx);
 
-          data_in (s, encoding, f->format.type,
+          data_in (s, input_encoding, f->format.type,
                    f->first_column, f->first_column + f->format.w,
-                   parser->dict, value, fmt_var_width (&f->format));
+                   value, fmt_var_width (&f->format), output_encoding);
 
-          data_in_imply_decimals (s, encoding, f->format.type, f->format.d,
-                                  value);
+          data_in_imply_decimals (s, input_encoding, f->format.type,
+                                  f->format.d, value);
         }
 
       dfm_forward_record (reader);
@@ -557,7 +558,8 @@ static bool
 parse_delimited_span (const struct data_parser *parser,
                       struct dfm_reader *reader, struct ccase *c)
 {
-  const char *encoding = dfm_reader_get_legacy_encoding (reader);
+  const char *input_encoding = dfm_reader_get_legacy_encoding (reader);
+  const char *output_encoding = dict_get_encoding (parser->dict);
   struct string tmp = DS_EMPTY_INITIALIZER;
   struct field *f;
 
@@ -582,10 +584,9 @@ parse_delimited_span (const struct data_parser *parser,
            }
        }
 
-      data_in (s, encoding, f->format.type, first_column, last_column,
-              parser->dict,
+      data_in (s, input_encoding, f->format.type, first_column, last_column,
                case_data_rw_idx (c, f->case_idx),
-               fmt_var_width (&f->format));
+               fmt_var_width (&f->format), output_encoding);
     }
   ds_destroy (&tmp);
   return true;
@@ -598,7 +599,8 @@ static bool
 parse_delimited_no_span (const struct data_parser *parser,
                          struct dfm_reader *reader, struct ccase *c)
 {
-  const char *encoding = dfm_reader_get_legacy_encoding (reader);
+  const char *input_encoding = dfm_reader_get_legacy_encoding (reader);
+  const char *output_encoding = dict_get_encoding (parser->dict);
   struct string tmp = DS_EMPTY_INITIALIZER;
   struct substring s;
   struct field *f, *end;
@@ -623,10 +625,9 @@ parse_delimited_no_span (const struct data_parser *parser,
           goto exit;
        }
 
-      data_in (s, encoding, f->format.type, first_column, last_column,
-              parser->dict,
+      data_in (s, input_encoding, f->format.type, first_column, last_column,
                case_data_rw_idx (c, f->case_idx),
-               fmt_var_width (&f->format));
+               fmt_var_width (&f->format), output_encoding);
     }
 
   s = dfm_get_record (reader);
index a945f7bf998a25c25e28a97b2f14348680c85e26..b7783257cdd990548541ee68b60c638bcf0476e7 100644 (file)
@@ -581,7 +581,7 @@ string function RTRIM (string s, string c)
 function NUMBER (string s, ni_format f)
 {
   union value out;
-  data_in (ss_head (s, f->w), LEGACY_NATIVE, f->type, 0, 0, NULL, &out, 0);
+  data_in (ss_head (s, f->w), LEGACY_NATIVE, f->type, 0, 0, &out, 0, NULL);
   data_in_imply_decimals (s, LEGACY_NATIVE, f->type, f->d, &out);
   return out.f;
 }
index c2020d36581bf9263cbf366884aa2071c4643f17..8cbbab4c82bfa3d0e262d865d8975c72794c9bee 100644 (file)
@@ -105,7 +105,7 @@ parse_number (struct lexer *lexer, double *x, const enum fmt_type *format)
       union value v;
       assert (! (fmt_get_category (*format) & ( FMT_CAT_STRING )));
       data_in (ds_ss (lex_tokstr (lexer)), LEGACY_NATIVE, *format, 0, 0,
-               NULL, &v, 0);
+               &v, 0, NULL);
       lex_get (lexer);
       *x = v.f;
       if (*x == SYSMIS)
index 3474979aa2702f3163d0223f33a37227f5c26e37..7390b08c0a5fcd5fd84e355b0b5c74a58756e269 100644 (file)
@@ -397,6 +397,7 @@ static struct ccase *
 flip_casereader_read (struct casereader *reader, void *flip_)
 {
   struct flip_pgm *flip = flip_;
+  const char *encoding;
   struct ccase *c;
   size_t i;
 
@@ -404,12 +405,10 @@ flip_casereader_read (struct casereader *reader, void *flip_)
     return false;
 
   c = case_create (casereader_get_proto (reader));
-  data_in (ss_cstr (flip->old_names.names[flip->cases_read]), dict_get_encoding (flip->dict), 
-       FMT_A,
-       0, 0,
-       flip->dict, 
-       case_data_rw_idx (c, 0), 8);
-       
+  encoding = dict_get_encoding (flip->dict);
+  data_in (ss_cstr (flip->old_names.names[flip->cases_read]), encoding,
+           FMT_A, 0, 0, case_data_rw_idx (c, 0), 8, encoding);
+
   for (i = 0; i < flip->n_cases; i++)
     {
       double in;
index 7f45865739ce4691cba7fa984a5b64a933267740..c9787b11bdfeaf3094b1650a76daa50dabedb76e 100644 (file)
@@ -159,6 +159,7 @@ cmd_recode (struct lexer *lexer, struct dataset *ds)
       /* Create destination variables, if needed.
          This must be the final step; otherwise we'd have to
          delete destination variables on failure. */
+      trns->dst_dict = dataset_dict (ds);
       if (trns->src_vars != trns->dst_vars)
        create_dst_vars (trns, dataset_dict (ds));
 
@@ -545,8 +546,6 @@ create_dst_vars (struct recode_trns *trns, struct dictionary *dict)
 {
   size_t i;
 
-  trns->dst_dict = dict;
-
   for (i = 0; i < trns->var_cnt; i++)
     {
       const struct variable **var = &trns->dst_vars[i];
@@ -608,8 +607,9 @@ static const struct map_out *
 find_src_string (struct recode_trns *trns, const uint8_t *value,
                  const struct variable *src_var)
 {
-  struct mapping *m;
+  const char *encoding = dict_get_encoding (trns->dst_dict);
   int width = var_get_width (src_var);
+  struct mapping *m;
 
   for (m = trns->mappings; m < trns->mappings + trns->map_cnt; m++)
     {
@@ -632,8 +632,7 @@ find_src_string (struct recode_trns *trns, const uint8_t *value,
 
             msg_disable ();
             match = data_in (ss_buffer (CHAR_CAST_BUG (char *, value), width),
-                             LEGACY_NATIVE, FMT_F, 0, 0, trns->dst_dict,
-                             &uv, 0);
+                             LEGACY_NATIVE, FMT_F, 0, 0, &uv, 0, encoding);
             msg_enable ();
             out->value.f = uv.f;
             break;
index 70e3c27394e7dbf913c3de93939d0bb8e12da1d4..b8936e6c3b091427521a81a209192207b953ccaf 100644 (file)
@@ -98,7 +98,8 @@ text_to_value (const gchar *text,
 
   value_init (val, width);
   msg_disable ();
-  data_in (ss_cstr (text), UTF8, format->type, 0, 0, dict->dict, val, width);
+  data_in (ss_cstr (text), UTF8, format->type, 0, 0, val, width,
+           dict_get_encoding (dict->dict));
   msg_enable ();
 
   return val;
index fb9c81797f54a995c09a9e5d95ce872bdb935960..7d26f5629b67b3c0bb0da77f09f5963027c9e7e6 100644 (file)
@@ -959,7 +959,8 @@ psppire_data_store_data_in (PsppireDataStore *ds, casenumber casenum, gint idx,
                         FALSE);
   value_init (&value, width);
   ok = (datasheet_get_value (ds->datasheet, casenum, idx, &value)
-        && data_in (input, UTF8, fmt->type, 0, 0, dict->dict, &value, width)
+        && data_in (input, UTF8, fmt->type, 0, 0, &value, width,
+                    dict_get_encoding (dict->dict))
         && datasheet_put_value (ds->datasheet, casenum, idx, &value));
   value_destroy (&value, width);
 
index 070c4f6b3cd3b05b3428994cb307326463599a6c..c9227ff8549b9b99b107e2664bd0b85aa1cff242 100644 (file)
@@ -1777,8 +1777,8 @@ parse_field (struct import_assistant *ia,
     {
       msg_disable ();
 
-      if (!data_in (field, LEGACY_NATIVE, in->type, 0, 0, ia->formats.dict,
-                    &val, var_get_width (var)))
+      if (!data_in (field, LEGACY_NATIVE, in->type, 0, 0, &val,
+                    var_get_width (var), dict_get_encoding (ia->formats.dict)))
         {
           char fmt_string[FMT_STRING_LEN_MAX + 1];
           fmt_to_string (in, fmt_string);
index b204fbf6f314929fc8656aac20d3002624612818..aae8c972f95ac324c1da897b02fb83be7794691a 100644 (file)
@@ -155,7 +155,7 @@ syntax_gen_number (struct string *output,
       msg_disable ();
       /* FIXME: UTF8 encoded strings will fail here */
       ok = data_in (ss_cstr (s), LEGACY_NATIVE,
-                    format->type, 0, 0, NULL, &v_out, 0);
+                    format->type, 0, 0, &v_out, 0, NULL);
       msg_enable ();
       if (ok && v_out.f == number)
         {