X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fdata-out.c;h=cbd114b8e58cf8399caba921df0c12168cca4b90;hb=8ca7ae9f41dfaaa3f7e386238faea46809c17f40;hp=d3125955b856da23edf85deeff9d48bf1a7556de;hpb=6f3865480503c571963d8a2d1af858a4d72d4e88;p=pspp diff --git a/src/data/data-out.c b/src/data/data-out.c index d3125955b8..cbd114b8e5 100644 --- a/src/data/data-out.c +++ b/src/data/data-out.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 1997-9, 2000, 2006, 2009, 2011, 2012 Free Software Foundation, Inc. + Copyright (C) 1997-9, 2000, 2006, 2009, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -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) { @@ -193,10 +193,41 @@ data_out_pool (const union value *input, const char *encoding, } } +/* Like data_out_pool(), except that for basic numeric formats (F, COMMA, DOT, + COLLAR, PCT, E) and custom currency formats are formatted as wide as + necessary to fully display the selected number of decimal places. */ char * -data_out (const union value *input, const char *encoding, const struct fmt_spec *format) +data_out_stretchy (const union value *input, const char *encoding, + const struct fmt_spec *format, struct pool *pool) { - return data_out_pool (input, encoding, format, NULL); + + if (fmt_get_category (format->type) & (FMT_CAT_BASIC | FMT_CAT_CUSTOM)) + { + const struct fmt_number_style *style = settings_get_style (format->type); + struct fmt_spec wide_format; + char tmp[128]; + size_t size; + + wide_format.type = format->type; + wide_format.w = 40; + wide_format.d = format->d; + + size = format->w + style->extra_bytes + 1; + if (size <= sizeof tmp) + { + output_number (input, &wide_format, tmp); + return pool_strdup (pool, tmp + strspn (tmp, " ")); + } + } + + return data_out_pool (input, encoding, format, pool); +} + +char * +data_out (const union value *input, const char *input_encoding, + const struct fmt_spec *format) +{ + return data_out_pool (input, input_encoding, format, NULL); } @@ -443,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; @@ -478,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)) @@ -585,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. */ @@ -775,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); }