X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fdata-out.c;h=cbd114b8e58cf8399caba921df0c12168cca4b90;hb=14e92ae17ea68adfe8d703b740e20c7f368138fb;hp=94e555cc8215aa048ea1754fdfeefa87b6344ca3;hpb=1bfabd49d76fa7d0e62aa2e29966b2f3e71e3cf6;p=pspp diff --git a/src/data/data-out.c b/src/data/data-out.c index 94e555cc82..cbd114b8e5 100644 --- a/src/data/data-out.c +++ b/src/data/data-out.c @@ -113,7 +113,7 @@ data_out_recode (const union value *input, const char *input_encoding, assert (fmt_check_output (format)); if (format->type == FMT_A) { - char *in = CHAR_CAST (char *, value_str (input, format->w)); + char *in = CHAR_CAST (char *, input->s); char *out = recode_string (output_encoding, input_encoding, in, format->w); ds_put_cstr (output, out); @@ -157,21 +157,21 @@ binary_to_utf8 (const char *in, struct pool *pool) VALUE must be the correct width for FORMAT, that is, its width must be fmt_var_width(FORMAT). - ENCODING must be the encoding of INPUT. Normally this can be obtained by - calling dict_get_encoding() on the dictionary with which INPUT is - associated. ENCODING is only important when FORMAT's type is FMT_A. + INPUT_ENCODING must be the encoding of INPUT. Normally this can be obtained + by calling dict_get_encoding() on the dictionary with which INPUT is + associated. INPUT_ENCODING is only important when FORMAT's type is FMT_A. The return value is dynamically allocated, and must be freed by the caller. If POOL is non-null, then the return value is allocated on that pool. */ char * -data_out_pool (const union value *input, const char *encoding, +data_out_pool (const union value *input, const char *input_encoding, const struct fmt_spec *format, struct pool *pool) { assert (fmt_check_output (format)); if (format->type == FMT_A) { - char *in = CHAR_CAST (char *, value_str (input, format->w)); - return recode_string_pool (UTF8, encoding, in, format->w, pool); + char *in = CHAR_CAST (char *, input->s); + return recode_string_pool (UTF8, input_encoding, in, format->w, pool); } else if (fmt_get_category (format->type) == FMT_CAT_BINARY) { @@ -224,9 +224,10 @@ data_out_stretchy (const union value *input, const char *encoding, } char * -data_out (const union value *input, const char *encoding, const struct fmt_spec *format) +data_out (const union value *input, const char *input_encoding, + const struct fmt_spec *format) { - return data_out_pool (input, encoding, format, NULL); + return data_out_pool (input, input_encoding, format, NULL); } @@ -473,7 +474,8 @@ output_date (const union value *input, const struct fmt_spec *format, { if (year <= 9999) p += sprintf (p, "%04d", year); - else if (format->type == FMT_DATETIME) + else if (format->type == FMT_DATETIME + || format->type == FMT_YMDHMS) p = stpcpy (p, "****"); else goto overflow; @@ -508,10 +510,14 @@ output_date (const union value *input, const struct fmt_spec *format, number = fmod (number, 60. * 60.); break; case 'M': + if (number < 0) + *p++ = '-'; + number = fabs (number); p += sprintf (p, "%02d", (int) floor (number / 60.)); number = fmod (number, 60.); excess_width = format->w - (p - tmp); - if (excess_width < 0) + if (excess_width < 0 + || (format->type == FMT_MTIME && excess_width < 3)) goto overflow; if (excess_width == 3 || excess_width == 4 || (excess_width >= 5 && format->d == 0)) @@ -615,7 +621,7 @@ static void output_AHEX (const union value *input, const struct fmt_spec *format, char *output) { - output_hex (value_str (input, format->w), format->w / 2, output); + output_hex (input->s, format->w / 2, output); } /* Decimal and scientific formatting. */ @@ -805,7 +811,7 @@ output_scientific (double number, const struct fmt_spec *format, { char *cp = strchr (p, 'E') + 1; long int exponent = strtol (cp, NULL, 10); - if (abs (exponent) > 999) + if (labs (exponent) > 999) return false; sprintf (cp, "%+04ld", exponent); }