X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fdata-in.c;h=7e7d087d51dcfa1ab9811715ff7354f106081bae;hb=8830c95bb9e8d72621787866141a27fc22e8c786;hp=eda6d1258f729b8d05352fb71fe1a24a0cdb1ef6;hpb=5c3291dc396b795696e94f47780308fd7ace6fc4;p=pspp-builds.git diff --git a/src/data/data-in.c b/src/data/data-in.c index eda6d125..7e7d087d 100644 --- a/src/data/data-in.c +++ b/src/data/data-in.c @@ -37,6 +37,7 @@ #include #include +#include #include #include #include @@ -53,7 +54,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 +101,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 +117,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; @@ -124,9 +125,12 @@ data_in (struct substring input, enum legacy_encoding 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); } @@ -608,12 +612,14 @@ parse_A (struct data_in *i) { /* This is equivalent to buf_copy_rpad, except that we posibly do a character set recoding in the middle. */ - char *dst = value_str_rw (i->output, i->width); + uint8_t *dst = value_str_rw (i->output, i->width); size_t dst_size = i->width; 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); @@ -624,7 +630,7 @@ parse_A (struct data_in *i) static bool parse_AHEX (struct data_in *i) { - char *s = value_str_rw (i->output, i->width); + uint8_t *s = value_str_rw (i->output, i->width); size_t j; for (j = 0; ; j++) @@ -639,7 +645,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);