From: John Darrington Date: Tue, 7 Jul 2009 09:35:21 +0000 (+0800) Subject: Replace legacy_recode with recode_string. X-Git-Tag: build37~53^2~16 X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?p=pspp-builds.git;a=commitdiff_plain;h=2764b3157e26955a31af5f4aa7d14e27098ddf19 Replace legacy_recode with recode_string. Iconv seems to do a good job of converting between ascii and ebcdic, so use the recode_string function instead of our own conversion routines. --- diff --git a/src/data/data-in.c b/src/data/data-in.c index e7a83f25..4666a173 100644 --- a/src/data/data-in.c +++ b/src/data/data-in.c @@ -37,6 +37,7 @@ #include #include +#include #include #include #include @@ -124,9 +125,12 @@ data_in (struct substring input, const char *encoding, } else { + char *s; ss_alloc_uninit (&i.input, ss_length (input)); - legacy_recode (encoding, ss_data (input), LEGACY_NATIVE, - ss_data (i.input), ss_length (input)); + + s = recode_string (LEGACY_NATIVE, encoding, ss_data (input), ss_length (input)); + memcpy (ss_data (i.input), s, ss_length (input)); + free (s); i.encoding = LEGACY_NATIVE; copy = ss_data (i.input); } @@ -613,7 +617,9 @@ parse_A (struct data_in *i) const char *src = ss_data (i->input); size_t src_size = ss_length (i->input); - legacy_recode (i->encoding, src, LEGACY_NATIVE, dst, MIN (src_size, dst_size)); + char *s = recode_string (LEGACY_NATIVE, i->encoding, src, MIN (src_size, dst_size)); + memcpy (dst, s, dst_size); + free (s); if (dst_size > src_size) memset (&dst[src_size], ' ', dst_size - src_size); diff --git a/src/data/data-out.c b/src/data/data-out.c index 4c6ca3dd..20a0b46d 100644 --- a/src/data/data-out.c +++ b/src/data/data-out.c @@ -106,7 +106,11 @@ data_out_legacy (const union value *input, const char *encoding, converters[format->type] (input, format, output); if (0 != strcmp (encoding, LEGACY_NATIVE) && fmt_get_category (format->type) != FMT_CAT_BINARY) - legacy_recode (LEGACY_NATIVE, output, encoding, output, format->w); + { + char *s = recode_string (encoding, LEGACY_NATIVE, output, format->w ); + memcpy (output, s, format->w); + free (s); + } } /* Converts the INPUT value into a UTF8 encoded string, according to format diff --git a/src/language/data-io/file-handle.q b/src/language/data-io/file-handle.q index 60eeee7b..3e053ed5 100644 --- a/src/language/data-io/file-handle.q +++ b/src/language/data-io/file-handle.q @@ -102,7 +102,7 @@ cmd_file_handle (struct lexer *lexer, struct dataset *ds) properties.mode = FH_MODE_VARIABLE; break; case FH_360: - properties.encoding = "PSPP-LEGACY-EBCDIC"; + properties.encoding = "EBCDIC-US"; if (cmd.recform == FH_FIXED || cmd.recform == FH_F) properties.mode = FH_MODE_FIXED; else if (cmd.recform == FH_VARIABLE || cmd.recform == FH_V) diff --git a/src/language/data-io/print.c b/src/language/data-io/print.c index eac5567a..c981bb1d 100644 --- a/src/language/data-io/print.c +++ b/src/language/data-io/print.c @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include @@ -483,8 +484,9 @@ print_trns_proc (void *trns_, struct ccase **c, casenumber case_num UNUSED) { size_t length = ds_length (&spec->string); char *data = ss_data (ds_tail (&trns->line, length)); - legacy_recode (LEGACY_NATIVE, data, - trns->encoding, data, length); + char *s = recode_string (trns->encoding, LEGACY_NATIVE, data, length); + memcpy (data, s, length); + free (s); } } } diff --git a/src/language/expressions/operations.def b/src/language/expressions/operations.def index d78827a8..52d4226d 100644 --- a/src/language/expressions/operations.def +++ b/src/language/expressions/operations.def @@ -587,7 +587,7 @@ absorb_miss string function STRING (x, no_format f) v.f = x; assert (!fmt_is_string (f->type)); - s = data_out (&v, "no-such-encoding", f); + s = data_out (&v, LEGACY_NATIVE, f); dst = alloc_string (e, strlen (s)); strcpy (dst.string, s); free (s); diff --git a/src/libpspp/legacy-encoding.c b/src/libpspp/legacy-encoding.c index aaa1fb73..18a62197 100644 --- a/src/libpspp/legacy-encoding.c +++ b/src/libpspp/legacy-encoding.c @@ -17,116 +17,25 @@ #include #include - -#include "str.h" - -static const char ascii_to_ebcdic[256]; -static const char ebcdic_to_ascii[256]; - -void -legacy_recode (const char *from, const char *src, - const char *to, char *dst, - size_t size) -{ - if (0 != strcmp (from, to)) - { - const char *table; - size_t i; - - 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]]; - } - else - { - if (src != dst) - memcpy (dst, src, size); - } -} +#include +#include char legacy_to_native (const char *from, char c) { - legacy_recode (from, &c, LEGACY_NATIVE, &c, 1); - return c; + char x; + char *s = recode_string (LEGACY_NATIVE, from, &c, 1); + x = s[0]; + free (s); + return x; } char legacy_from_native (const char *to, char c) { - legacy_recode (LEGACY_NATIVE, &c, to, &c, 1); - return c; + char x; + char *s = recode_string (to, LEGACY_NATIVE, &c, 1); + x = s[0]; + free (s); + return x; } - -static const char ascii_to_ebcdic[256] = - { - 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, - 0x16, 0x05, 0x25, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, - 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f, - 0x40, 0x5a, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d, - 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61, - 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, - 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f, - 0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, - 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, - 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, - 0xe7, 0xe8, 0xe9, 0xad, 0xe0, 0xbd, 0x9a, 0x6d, - 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, - 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, - 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, - 0xa7, 0xa8, 0xa9, 0xc0, 0x4f, 0xd0, 0x5f, 0x07, - 0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17, - 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x09, 0x0a, 0x1b, - 0x30, 0x31, 0x1a, 0x33, 0x34, 0x35, 0x36, 0x08, - 0x38, 0x39, 0x3a, 0x3b, 0x04, 0x14, 0x3e, 0xe1, - 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, - 0x49, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, - 0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, - 0x68, 0x69, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, - 0x76, 0x77, 0x78, 0x80, 0x8a, 0x8b, 0x8c, 0x8d, - 0x8e, 0x8f, 0x90, 0x6a, 0x9b, 0x9c, 0x9d, 0x9e, - 0x9f, 0xa0, 0xaa, 0xab, 0xac, 0x4a, 0xae, 0xaf, - 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, - 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xa1, 0xbe, 0xbf, - 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xda, 0xdb, - 0xdc, 0xdd, 0xde, 0xdf, 0xea, 0xeb, 0xec, 0xed, - 0xee, 0xef, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, - }; - -static const char ebcdic_to_ascii[256] = - { - 0x00, 0x01, 0x02, 0x03, 0x9c, 0x09, 0x86, 0x7f, - 0x97, 0x8d, 0x8e, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x10, 0x11, 0x12, 0x13, 0x9d, 0x85, 0x08, 0x87, - 0x18, 0x19, 0x92, 0x8f, 0x1c, 0x1d, 0x1e, 0x1f, - 0x80, 0x81, 0x82, 0x83, 0x84, 0x0a, 0x17, 0x1b, - 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x05, 0x06, 0x07, - 0x90, 0x91, 0x16, 0x93, 0x94, 0x95, 0x96, 0x04, - 0x98, 0x99, 0x9a, 0x9b, 0x14, 0x15, 0x9e, 0x1a, - 0x20, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, - 0xa7, 0xa8, 0xd5, 0x2e, 0x3c, 0x28, 0x2b, 0x7c, - 0x26, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, - 0xb0, 0xb1, 0x21, 0x24, 0x2a, 0x29, 0x3b, 0x7e, - 0x2d, 0x2f, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, - 0xb8, 0xb9, 0xcb, 0x2c, 0x25, 0x5f, 0x3e, 0x3f, - 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, - 0xc2, 0x60, 0x3a, 0x23, 0x40, 0x27, 0x3d, 0x22, - 0xc3, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, - 0x68, 0x69, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, - 0xca, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, - 0x71, 0x72, 0x5e, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, - 0xd1, 0xe5, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, - 0x79, 0x7a, 0xd2, 0xd3, 0xd4, 0x5b, 0xd6, 0xd7, - 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, - 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0x5d, 0xe6, 0xe7, - 0x7b, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, - 0x48, 0x49, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, - 0x7d, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, - 0x51, 0x52, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, - 0x5c, 0x9f, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, - 0x59, 0x5a, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, - 0x38, 0x39, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, - }; - diff --git a/src/libpspp/legacy-encoding.h b/src/libpspp/legacy-encoding.h index ec889efb..c6ae0ab4 100644 --- a/src/libpspp/legacy-encoding.h +++ b/src/libpspp/legacy-encoding.h @@ -17,23 +17,18 @@ #ifndef LIBPSPP_LEGACY_ENCODING #define LIBPSPP_LEGACY_ENCODING 1 -#include #include - #if 'A' == 0x41 -#define LEGACY_NATIVE "PSPP-LEGACY-ASCII" +#define LEGACY_NATIVE "ASCII" #elif 'A' == 0xc1 -#define LEGACY_NATIVE "PSPP-LEGACY-EBCDIC" +#define LEGACY_NATIVE "EBCDIC-US" #else #error Cannot detect native character set. #endif - - -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 */ diff --git a/src/output/table.c b/src/output/table.c index 2de17901..7460fce3 100644 --- a/src/output/table.c +++ b/src/output/table.c @@ -580,7 +580,7 @@ tab_fixed (struct tab_table *table, int c, int r, unsigned char opt, #endif double_value.f = val; - s = data_out_pool (&double_value, "FIXME-tab_fixed", &f, table->container); + s = data_out_pool (&double_value, LEGACY_NATIVE, &f, table->container); cp = s; while (isspace ((unsigned char) *cp) && cp < &s[w]) @@ -631,7 +631,7 @@ tab_double (struct tab_table *table, int c, int r, unsigned char opt, #endif double_value.f = val; - s = data_out_pool (&double_value, "FIXME-tab_double", fmt, table->container); + s = data_out_pool (&double_value, LEGACY_NATIVE, fmt, table->container); cp = s; while (isspace ((unsigned char) *cp) && cp < s + fmt->w)