Change enum legacy_encoding to const char *.
authorJohn Darrington <john@darrington.wattle.id.au>
Sun, 5 Jul 2009 12:45:12 +0000 (20:45 +0800)
committerJohn Darrington <john@darrington.wattle.id.au>
Sun, 5 Jul 2009 12:45:12 +0000 (20:45 +0800)
Preparation for i18n of union values.  Remove the
legacy_encoding enum and substitute it with a const
char *.  This makes it easier to integrate recoding
of union values in the data parsing stage.

15 files changed:
src/data/data-in.c
src/data/data-in.h
src/data/data-out.c
src/data/data-out.h
src/data/file-handle-def.c
src/data/file-handle-def.h
src/language/data-io/data-parser.c
src/language/data-io/data-reader.c
src/language/data-io/data-reader.h
src/language/data-io/data-writer.c
src/language/data-io/data-writer.h
src/language/data-io/file-handle.q
src/language/data-io/print.c
src/libpspp/legacy-encoding.c
src/libpspp/legacy-encoding.h

index eda6d1258f729b8d05352fb71fe1a24a0cdb1ef6..e7a83f25b44a5f7a55d2c46e20aed4dc7785e40e 100644 (file)
@@ -53,7 +53,7 @@
 /* Information about parsing one data field. */
 struct data_in
   {
-    enum legacy_encoding encoding;/* Encoding of source. */
+    const char *encoding;       /* Encoding of source. */
     struct substring input;     /* Source. */
     enum fmt_type format;       /* Input format. */
     int implied_decimals;       /* Number of implied decimal places. */
@@ -100,7 +100,7 @@ static int hexit_value (int c);
    FIRST_COLUMN plus the length of the input because of the
    possibility of escaped quotes in strings, etc.) */
 bool
-data_in (struct substring input, enum legacy_encoding encoding,
+data_in (struct substring input, const char *encoding,
          enum fmt_type format, int implied_decimals,
          int first_column, int last_column, union value *output, int width)
 {
@@ -116,7 +116,7 @@ data_in (struct substring input, enum legacy_encoding encoding,
 
   assert ((width != 0) == fmt_is_string (format));
 
-  if (encoding == LEGACY_NATIVE
+  if (0 == strcmp (encoding, LEGACY_NATIVE)
       || fmt_get_category (format) & (FMT_CAT_BINARY | FMT_CAT_STRING))
     {
       i.input = input;
@@ -639,7 +639,7 @@ parse_AHEX (struct data_in *i)
           return false;
         }
 
-      if (i->encoding != LEGACY_NATIVE)
+      if (0 != strcmp (i->encoding, LEGACY_NATIVE))
         {
           hi = legacy_to_native (i->encoding, hi);
           lo = legacy_to_native (i->encoding, lo);
index 3a8d67cc22f66b28eb0bed54126e5a3255449064..5256bb9132553b46075f4f5526c20f8e936f7e8f 100644 (file)
@@ -26,7 +26,7 @@
 
 enum fmt_type;
 union value;
-bool data_in (struct substring input, enum legacy_encoding,
+bool data_in (struct substring input, const char *encoding,
               enum fmt_type, int implied_decimals,
               int first_column, int last_column,
               union value *output, int width);
index e7800a8ff2de3a64c58d77b1aee3688a76c90b5d..fa8d59e74ced3dd4df1c0977a5f25b6d70fe76c9 100644 (file)
@@ -86,7 +86,7 @@ static void output_hex (const void *, size_t bytes, char *);
 /* Same as data_out, and additionally recodes the output from
    native form into the given legacy character ENCODING. */
 void
-data_out_legacy (const union value *input, enum legacy_encoding encoding,
+data_out_legacy (const union value *input, const char *encoding,
                  const struct fmt_spec *format, char *output)
 {
   static data_out_converter_func *const converters[FMT_NUMBER_OF_FORMATS] =
@@ -98,7 +98,7 @@ data_out_legacy (const union value *input, enum legacy_encoding encoding,
   assert (fmt_check_output (format));
 
   converters[format->type] (input, format, output);
-  if (encoding != LEGACY_NATIVE
+  if (0 != strcmp (encoding, LEGACY_NATIVE)
       && fmt_get_category (format->type) != FMT_CAT_BINARY)
     legacy_recode (LEGACY_NATIVE, output, encoding, output, format->w);
 }
index f9f70da90d37843d546752b3ad97baf041fdfc51..7972f6a90eafe5050e2c219ecb2e45888ce20981 100644 (file)
@@ -27,7 +27,7 @@ union value;
 
 void data_out (const union value *, const struct fmt_spec *, char *);
 
-void data_out_legacy (const union value *, enum legacy_encoding,
+void data_out_legacy (const union value *, const char *encoding,
                       const struct fmt_spec *, char *);
 
 #endif /* data-out.h */
index 0652501faa17fa27b19989b07e471b816731360c..6ed3f8f9f95205158cbf2a33227e5dbec6a81529 100644 (file)
@@ -49,7 +49,7 @@ struct file_handle
     /* FH_REF_FILE only. */
     char *file_name;           /* File name as provided by user. */
     enum fh_mode mode;         /* File mode. */
-    enum legacy_encoding encoding;/* File encoding. */
+    const char *encoding;       /* File encoding. */
 
     /* FH_REF_FILE and FH_REF_INLINE only. */
     size_t record_width;        /* Length of fixed-format records. */
@@ -325,7 +325,7 @@ fh_get_tab_width (const struct file_handle *handle)
 }
 
 /* Returns the encoding of characters read from HANDLE. */
-enum legacy_encoding
+const char *
 fh_get_legacy_encoding (const struct file_handle *handle)
 {
   assert (handle->referent & (FH_REF_FILE | FH_REF_INLINE));
index 73e118cdf848f81e1e6405983fec02b45f0a6a9c..b4a6d6100e8ed291ed8705a659d381beb8ec26a6 100644 (file)
@@ -54,7 +54,7 @@ struct fh_properties
     enum fh_mode mode;          /* File mode. */
     size_t record_width;        /* Length of fixed-format records. */
     size_t tab_width;           /* Tab width, 0=do not expand tabs. */
-    enum legacy_encoding encoding;/* ASCII or EBCDIC? */
+    const char *encoding;       /* ASCII or EBCDIC? */
   };
 
 void fh_init (void);
@@ -89,7 +89,7 @@ enum fh_mode fh_get_mode (const struct file_handle *) ;
 /* Properties of FH_REF_FILE and FH_REF_INLINE file handles. */
 size_t fh_get_record_width (const struct file_handle *);
 size_t fh_get_tab_width (const struct file_handle *);
-enum legacy_encoding fh_get_legacy_encoding (const struct file_handle *);
+const char *fh_get_legacy_encoding (const struct file_handle *);
 
 /* Properties of FH_REF_SCRATCH file handles. */
 struct scratch_handle *fh_get_scratch_handle (const struct file_handle *);
index 2f503423adcbcb5e4066c36736bc6e215d3fdd72..eab32868431bdf007aebf4b5d752ae9da843c257 100644 (file)
@@ -505,7 +505,7 @@ static bool
 parse_fixed (const struct data_parser *parser, struct dfm_reader *reader,
              struct ccase *c)
 {
-  enum legacy_encoding encoding = dfm_reader_get_legacy_encoding (reader);
+  const char *encoding = dfm_reader_get_legacy_encoding (reader);
   struct field *f;
   int row;
 
@@ -547,7 +547,7 @@ static bool
 parse_delimited_span (const struct data_parser *parser,
                       struct dfm_reader *reader, struct ccase *c)
 {
-  enum legacy_encoding encoding = dfm_reader_get_legacy_encoding (reader);
+  const char *encoding = dfm_reader_get_legacy_encoding (reader);
   struct string tmp = DS_EMPTY_INITIALIZER;
   struct field *f;
 
@@ -588,7 +588,7 @@ static bool
 parse_delimited_no_span (const struct data_parser *parser,
                          struct dfm_reader *reader, struct ccase *c)
 {
-  enum legacy_encoding encoding = dfm_reader_get_legacy_encoding (reader);
+  const char *encoding = dfm_reader_get_legacy_encoding (reader);
   struct string tmp = DS_EMPTY_INITIALIZER;
   struct substring s;
   struct field *f;
index 24ddcf13ec61cf6749c64cd63bfd4e03268cbeea..6f620a6a948341a0dfa5db150763d20f51e92284 100644 (file)
@@ -597,7 +597,7 @@ dfm_expand_tabs (struct dfm_reader *r)
 }
 
 /* Returns the legacy character encoding of data read from READER. */
-enum legacy_encoding
+const char *
 dfm_reader_get_legacy_encoding (const struct dfm_reader *reader)
 {
   return fh_get_legacy_encoding (reader->fh);
index c7fee613d01caefe81f5edf5fe10c6f0538dc84f..308701c253147d48863a01bdb159c002e5fbf52a 100644 (file)
@@ -38,8 +38,7 @@ bool dfm_reader_error (const struct dfm_reader *);
 unsigned dfm_eof (struct dfm_reader *);
 struct substring dfm_get_record (struct dfm_reader *);
 void dfm_expand_tabs (struct dfm_reader *);
-enum legacy_encoding dfm_reader_get_legacy_encoding (
-  const struct dfm_reader *);
+const char *dfm_reader_get_legacy_encoding (const struct dfm_reader *);
 int dfm_get_percent_read (const struct dfm_reader *);
 
 /* Line control. */
index b5df59d4605f2535a690aea77e0934eb46ee6a65..85b11d4c1e553054160f8b1a57a3d1cac2704a00 100644 (file)
@@ -200,7 +200,7 @@ dfm_close_writer (struct dfm_writer *w)
 }
 
 /* Returns the legacy character encoding of data written to WRITER. */
-enum legacy_encoding
+const char *
 dfm_writer_get_legacy_encoding (const struct dfm_writer *writer)
 {
   return fh_get_legacy_encoding (writer->fh);
index 2142f2155008a8c934e471a72d837e992faae044..045db3163fd3144f2653e294d5a023e1416dc0f6 100644 (file)
@@ -27,7 +27,6 @@ struct dfm_writer *dfm_open_writer (struct file_handle *);
 bool dfm_close_writer (struct dfm_writer *);
 bool dfm_write_error (const struct dfm_writer *);
 bool dfm_put_record (struct dfm_writer *, const char *rec, size_t len);
-enum legacy_encoding dfm_writer_get_legacy_encoding (
-  const struct dfm_writer *);
+const char *dfm_writer_get_legacy_encoding (const struct dfm_writer *);
 
 #endif /* data-writer.h */
index 827dbab499e9af94a7c55fee5a42764a1ca39f89..60eeee7b559089fd7e65766ceef1b8e777afe5a4 100644 (file)
@@ -102,7 +102,7 @@ cmd_file_handle (struct lexer *lexer, struct dataset *ds)
           properties.mode = FH_MODE_VARIABLE;
           break;
         case FH_360:
-          properties.encoding = LEGACY_EBCDIC;
+          properties.encoding = "PSPP-LEGACY-EBCDIC";
           if (cmd.recform == FH_FIXED || cmd.recform == FH_F)
             properties.mode = FH_MODE_FIXED;
           else if (cmd.recform == FH_VARIABLE || cmd.recform == FH_V)
index aae8b38a05f7d126f4ca473a92cf818542a1c6f9..eac5567a53a5458a4b3ddb4f61dd80b5599d8225 100644 (file)
@@ -83,7 +83,7 @@ struct print_trns
     struct pool *pool;          /* Stores related data. */
     bool eject;                 /* Eject page before printing? */
     bool include_prefix;        /* Prefix lines with space? */
-    enum legacy_encoding encoding; /* Encoding to use for output. */
+    const char *encoding;       /* Encoding to use for output. */
     struct dfm_writer *writer; /* Output file, NULL=listing file. */
     struct ll_list specs;       /* List of struct prt_out_specs. */
     size_t record_cnt;          /* Number of records to write. */
@@ -479,7 +479,7 @@ print_trns_proc (void *trns_, struct ccase **c, casenumber case_num UNUSED)
       else
         {
           ds_put_substring (&trns->line, ds_ss (&spec->string));
-          if (trns->encoding != LEGACY_NATIVE)
+          if (0 != strcmp (trns->encoding, LEGACY_NATIVE))
             {
               size_t length = ds_length (&spec->string);
               char *data = ss_data (ds_tail (&trns->line, length));
index 45f0195f37f3fc18b035401fcd1313a85f76b259..aaa1fb7392fc39874e4737453f745f14775a1785 100644 (file)
@@ -24,16 +24,16 @@ static const char ascii_to_ebcdic[256];
 static const char ebcdic_to_ascii[256];
 
 void
-legacy_recode (enum legacy_encoding from, const char *src,
-             enum legacy_encoding to, char *dst,
+legacy_recode (const char *from, const char *src,
+             const char *to, char *dst,
              size_t size)
 {
-  if (from != to)
+  if (0 != strcmp (from, to))
     {
       const char *table;
       size_t i;
 
-      table = from == LEGACY_ASCII ? ascii_to_ebcdic : ebcdic_to_ascii;
+      table = (0 == strcmp (from, "PSPP-LEGACY-ASCII")) ? ascii_to_ebcdic : ebcdic_to_ascii;
       for (i = 0; i < size; i++)
         dst[i] = table[(unsigned char) src[i]];
     }
@@ -45,14 +45,14 @@ legacy_recode (enum legacy_encoding from, const char *src,
 }
 
 char
-legacy_to_native (enum legacy_encoding from, char c)
+legacy_to_native (const char *from, char c)
 {
   legacy_recode (from, &c, LEGACY_NATIVE, &c, 1);
   return c;
 }
 
 char
-legacy_from_native (enum legacy_encoding to, char c)
+legacy_from_native (const char *to, char c)
 {
   legacy_recode (LEGACY_NATIVE, &c, to, &c, 1);
   return c;
index 12afe42b7f22d97a190659fad70579f7ee4e9043..ec889efbc9044b9bdc3626249900f2dba47172ba 100644 (file)
 #include <stddef.h>
 #include <libpspp/compiler.h>
 
-/* A legacy character encoding.
-   This exists only to handle the specific legacy EBCDIC-to-ASCII
-   recoding that MODE=360 file handles perform. */
-enum legacy_encoding
-  {
-    LEGACY_ASCII,         /* ASCII or similar character set. */
-    LEGACY_EBCDIC,        /* IBM EBCDIC character set. */
-
-    /* Native character set. */
+
 #if 'A' == 0x41
-    LEGACY_NATIVE = LEGACY_ASCII
+#define  LEGACY_NATIVE "PSPP-LEGACY-ASCII"
 #elif 'A' == 0xc1
-    LEGACY_NATIVE = LEGACY_EBCDIC
+#define  LEGACY_NATIVE "PSPP-LEGACY-EBCDIC"
 #else
 #error Cannot detect native character set.
 #endif
-  };
 
-void legacy_recode (enum legacy_encoding, const char *src,
-                    enum legacy_encoding, char *dst, size_t);
-char legacy_to_native (enum legacy_encoding from, char) PURE_FUNCTION;
-char legacy_from_native (enum legacy_encoding to, char) PURE_FUNCTION;
+
+
+void legacy_recode (const char *from, const char *src,
+                    const char *to, char *dst, size_t);
+char legacy_to_native (const char *from, char) PURE_FUNCTION;
+char legacy_from_native (const char *to, char) PURE_FUNCTION;
 
 #endif /* libpspp/legacy-encoding.h */