Read dictionary encoding from data files.
authorJohn Darrington <john@darrington.wattle.id.au>
Fri, 27 Mar 2009 04:47:01 +0000 (13:47 +0900)
committerJohn Darrington <john@darrington.wattle.id.au>
Fri, 27 Mar 2009 04:47:01 +0000 (13:47 +0900)
If record 7 subtype 20 exists, use it to set the encoding of the
dictionary when reading a file.

src/data/dictionary.c
src/data/dictionary.h
src/data/sys-file-reader.c
src/libpspp/i18n.c
src/ui/gui/psppire-dict.c

index ba840898112494b775d02c810edee29c98037fee..1c50ac7feb26976ea1e9b63d835961a5ae3db243 100644 (file)
@@ -63,6 +63,9 @@ struct dictionary
     struct vector **vector;     /* Vectors of variables. */
     size_t vector_cnt;          /* Number of vectors. */
     struct attrset attributes;  /* Custom attributes. */
+
+    char *encoding;             /* Character encoding of string data */
+
     const struct dict_callbacks *callbacks; /* Callbacks on dictionary
                                               modification */
     void *cb_data ;                  /* Data passed to callbacks */
@@ -71,6 +74,20 @@ struct dictionary
     void *changed_data;
   };
 
+
+void
+dict_set_encoding (struct dictionary *d, const char *enc)
+{
+  d->encoding = strdup (enc);
+}
+
+const char *
+dict_get_encoding (const struct dictionary *d)
+{
+  return d->encoding ;
+}
+
+
 void
 dict_set_change_callback (struct dictionary *d,
                          void (*changed) (struct dictionary *, void*),
@@ -194,6 +211,8 @@ dict_clone (const struct dictionary *s)
   for (i = 0; i < s->vector_cnt; i++)
     d->vector[i] = vector_clone (s->vector[i], s, d);
 
+  d->encoding = strdup (s->encoding);
+
   dict_set_attributes (d, dict_get_attributes (s));
 
   return d;
index 18bf3f781081a14fc23fe2d3568efa1e96b31a9c..4efb953c550fae754c62c96098bb8e8a51995b80 100644 (file)
@@ -147,6 +147,11 @@ struct attrset *dict_get_attributes (const struct dictionary *);
 void dict_set_attributes (struct dictionary *, const struct attrset *);
 bool dict_has_attributes (const struct dictionary *);
 
+
+void dict_set_encoding (struct dictionary *d, const char *enc);
+const char *dict_get_encoding (const struct dictionary *d);
+
+
 /* Functions to be called upon dictionary changes. */
 struct dict_callbacks
  {
index 84d7f83c4c422a502272ec47039aeb3bb5889b18..fb4f6f93defcc8cc7486fd3039fe7a36f8efd37a 100644 (file)
@@ -778,7 +778,12 @@ read_extension_record (struct sfm_reader *r, struct dictionary *dict,
     case 20:
       /* New in SPSS 16.  Contains a single string that describes
          the character encoding, e.g. "windows-1252". */
-      break;
+      {
+       char *encoding = calloc (size, count + 1);
+       read_string (r, encoding, count + 1);
+       dict_set_encoding (dict, encoding);
+       return;
+      }
 
     case 21:
       /* New in SPSS 16.  Encodes value labels for long string
index 674a9a27022b44bedb51c8883a8d203cfe0be3c8..b323bf8586a2370b2e072b69eb3a8d6cb10b68e1 100644 (file)
@@ -88,9 +88,6 @@ recode_string (const char *to, const char *from,
   if (from == NULL)
     from = default_encoding;
 
-
-  fprintf (stderr, "from: %s; to %s\n", from, to);
-
   if ( 0 == strcmp (to, from))
     return xstrndup (text, length);
 
index c4f30783552ebb19fc794b65683f0a51acbdbb5d..afc7d570c9afe6ab85f637344b9b46a9340bc711 100644 (file)
@@ -868,5 +868,5 @@ psppire_dict_dump (const PsppireDict *dict)
 const gchar *
 psppire_dict_encoding (const PsppireDict *dict)
 {
-  return NULL;
+  return dict_get_encoding (dict->dict);
 }