variable: Introduce and use new function var_get_encoding().
authorBen Pfaff <blp@cs.stanford.edu>
Fri, 9 Apr 2010 04:28:42 +0000 (21:28 -0700)
committerBen Pfaff <blp@cs.stanford.edu>
Mon, 12 Apr 2010 03:39:03 +0000 (20:39 -0700)
These changes seem like slight cleanups since they eliminate a function
parameter in these cases.

src/data/sys-file-writer.c
src/data/variable.c
src/data/variable.h
src/language/stats/crosstabs.q
src/ui/gui/psppire-data-editor.c

index 5daea89dc5a908ac385a5f19dc8c2c62db7c0e20..0d93bd12f012e678cde6f1c00db793987124b67d 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 1997-9, 2000, 2006, 2007, 2009 Free Software Foundation, Inc.
+   Copyright (C) 1997-9, 2000, 2006, 2007, 2009, 2010 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -95,9 +95,9 @@ struct sfm_writer
 static const struct casewriter_class sys_file_casewriter_class;
 
 static void write_header (struct sfm_writer *, const struct dictionary *);
-static void write_variable (struct sfm_writer *, const struct variable *, const struct dictionary *);
-static void write_value_labels (struct sfm_writer *,
-                                struct variable *, int idx, const struct dictionary *);
+static void write_variable (struct sfm_writer *, const struct variable *);
+static void write_value_labels (struct sfm_writer *, struct variable *,
+                                int idx);
 static void write_integer_info_record (struct sfm_writer *);
 static void write_float_info_record (struct sfm_writer *);
 
@@ -223,7 +223,7 @@ sfm_open_writer (struct file_handle *fh, struct dictionary *d,
   /* Write basic variable info. */
   short_names_assign (d);
   for (i = 0; i < dict_get_var_cnt (d); i++)
-    write_variable (w, dict_get_var (d, i), d);
+    write_variable (w, dict_get_var (d, i));
 
   /* Write out value labels. */
   idx = 0;
@@ -231,7 +231,7 @@ sfm_open_writer (struct file_handle *fh, struct dictionary *d,
     {
       struct variable *v = dict_get_var (d, i);
 
-      write_value_labels (w, v, idx, d);
+      write_value_labels (w, v, idx);
       idx += sfm_width_to_octs (var_get_width (v));
     }
 
@@ -421,7 +421,7 @@ write_variable_continuation_records (struct sfm_writer *w, int width)
 /* Write the variable record(s) for variable V to system file
    W. */
 static void
-write_variable (struct sfm_writer *w, const struct variable *v, const struct dictionary *dict)
+write_variable (struct sfm_writer *w, const struct variable *v)
 {
   int width = var_get_width (v);
   int segment_cnt = sfm_width_to_segments (width);
@@ -461,7 +461,7 @@ write_variable (struct sfm_writer *w, const struct variable *v, const struct dic
   /* Value label. */
   if (var_has_label (v))
     {
-      char *label = recode_string (dict_get_encoding (dict), UTF8, var_get_label (v), -1);
+      char *label = recode_string (var_get_encoding (v), UTF8, var_get_label (v), -1);
       size_t label_len = MIN (strlen (label), 255);
       size_t padded_len = ROUND_UP (label_len, 4);
       write_int (w, label_len);
@@ -508,7 +508,7 @@ write_variable (struct sfm_writer *w, const struct variable *v, const struct dic
    Value labels for long string variables are written separately,
    by write_long_string_value_labels. */
 static void
-write_value_labels (struct sfm_writer *w, struct variable *v, int idx, const struct dictionary *dict)
+write_value_labels (struct sfm_writer *w, struct variable *v, int idx)
 {
   const struct val_labs *val_labs;
   const struct val_lab **labels;
@@ -527,7 +527,7 @@ write_value_labels (struct sfm_writer *w, struct variable *v, int idx, const str
   for (i = 0; i < n_labels; i++)
     {
       const struct val_lab *vl = labels[i];
-      char *label = recode_string (dict_get_encoding (dict), UTF8, val_lab_get_label (vl), -1);
+      char *label = recode_string (var_get_encoding (v), UTF8, val_lab_get_label (vl), -1);
       uint8_t len = MIN (strlen (label), 255);
 
       write_value (w, val_lab_get_value (vl), var_get_width (v));
index 05edc57e2db85a3c02df4fbe3a16a6747d92c4bc..79925fa8cbfb00dd4c47c66e085fab1a12162fb3 100644 (file)
@@ -590,10 +590,9 @@ var_append_value_name (const struct variable *v, const union value *value,
                       struct string *str)
 {
   const char *name = var_lookup_value_label (v, value);
-  const struct dictionary *dict = var_get_vardict (v)->dict;
   if (name == NULL)
     {
-      char *s = data_out (value, dict_get_encoding (dict), &v->print);
+      char *s = data_out (value, var_get_encoding (v), &v->print);
       ds_put_cstr (str, s);
       free (s);
     }
@@ -1053,6 +1052,15 @@ var_has_attributes (const struct variable *v)
   return attrset_count (&v->attributes) > 0;
 }
 \f
+/* Returns the encoding of values of variable VAR.  (This is actually a
+   property of the dictionary.)  Returns null if no specific encoding has been
+   set.  */
+const char *
+var_get_encoding (const struct variable *var)
+{
+  return var_has_vardict (var) ? dict_get_encoding (var->vardict.dict) : NULL;
+}
+\f
 /* Returns V's vardict structure. */
 const struct vardict_info *
 var_get_vardict (const struct variable *v)
index 0b619a497ed1eefa04a1dac97ec4be20afac4b80..d730768e650407fbcaff63fa6649af2e2659a1f7 100644 (file)
@@ -178,6 +178,9 @@ struct attrset *var_get_attributes (const struct variable *);
 void var_set_attributes (struct variable *, const struct attrset *);
 bool var_has_attributes (const struct variable *);
 
+/* Encoding. */
+const char *var_get_encoding (const struct variable *);
+
 /* Function types. */
 typedef bool var_predicate_func (const struct variable *);
 
index b137e284968372f2c0580774522c994362252ad4..d0fd6dd51fcc88bf3631c4e01768b1281ece9a6e 100644 (file)
@@ -1191,7 +1191,8 @@ create_crosstab_table (struct crosstabs_proc *proc, struct pivot_table *pt)
       /* Insert the formatted value of the variable, then trim
          leading spaces in what was just inserted. */
       ofs = ds_length (&title);
-      s = data_out (&pt->const_values[i], dict_get_encoding (proc->dict), var_get_print_format (var));
+      s = data_out (&pt->const_values[i], var_get_encoding (var),
+                    var_get_print_format (var));
       ds_put_cstr (&title, s);
       free (s);
       ds_remove (&title, ofs, ss_cspan (ds_substr (&title, ofs, SIZE_MAX),
index 8a882e2c2d7bd3c63659748ec56d4dfcdb357f68..036b9b7746cbabd9cf878662cdc63a435a84e877 100644 (file)
@@ -1653,14 +1653,13 @@ enum {
 
 /* Perform data_out for case CC, variable V, appending to STRING */
 static void
-data_out_g_string (GString *string, const struct dictionary *dict, 
-                  const struct variable *v,
+data_out_g_string (GString *string, const struct variable *v,
                   const struct ccase *cc)
 {
   const struct fmt_spec *fs = var_get_print_format (v);
   const union value *val = case_data (cc, v);
 
-  char *s = data_out (val, dict_get_encoding (dict), fs);
+  char *s = data_out (val, var_get_encoding (v), fs);
 
   g_string_append (string, s);
 
@@ -1694,7 +1693,7 @@ clip_to_text (void)
       for (c = 0 ; c < var_cnt ; ++c)
        {
          const struct variable *v = dict_get_var (clip_dict, c);
-         data_out_g_string (string, clip_dict, v, cc);
+         data_out_g_string (string, v, cc);
          if ( c < val_cnt - 1 )
            g_string_append (string, "\t");
        }
@@ -1741,7 +1740,7 @@ clip_to_html (void)
        {
          const struct variable *v = dict_get_var (clip_dict, c);
          g_string_append (string, "<td>");
-         data_out_g_string (string, clip_dict, v, cc);
+         data_out_g_string (string, v, cc);
          g_string_append (string, "</td>\n");
        }