X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?p=pspp-builds.git;a=blobdiff_plain;f=src%2Fdata%2Fdata-out.c;h=fa8d59e74ced3dd4df1c0977a5f25b6d70fe76c9;hp=967f57eddc23bf2090360032d26fb20417b01728;hb=9254d30d06a0565c89daccedd93a94c4c6086004;hpb=8a55f06f1878e987d1b3d0b09a74d58291c33887 diff --git a/src/data/data-out.c b/src/data/data-out.c index 967f57ed..fa8d59e7 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 Free Software Foundation, Inc. + Copyright (C) 1997-9, 2000, 2006, 2009 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 @@ -25,17 +25,16 @@ #include #include -#include "calendar.h" -#include "format.h" -#include "settings.h" -#include "value.h" +#include +#include +#include +#include #include #include #include #include #include -#include #include #include "minmax.h" @@ -61,12 +60,6 @@ static int rounder_width (const struct rounder *, int decimals, static void rounder_format (const struct rounder *, int decimals, char *output); -/* Format of integers in output (SET WIB). */ -static enum integer_format output_integer_format = INTEGER_NATIVE; - -/* Format of reals in output (SET WRB). */ -static enum float_format output_float_format = FLOAT_NATIVE_DOUBLE; - typedef void data_out_converter_func (const union value *, const struct fmt_spec *, char *); @@ -90,13 +83,11 @@ static void output_binary_integer (uint64_t, int bytes, enum integer_format, char *); static void output_hex (const void *, size_t bytes, char *); -/* Converts the INPUT value into printable form in the exactly - FORMAT->W characters in OUTPUT according to format - specification FORMAT. No null terminator is appended to the - buffer. */ +/* Same as data_out, and additionally recodes the output from + native form into the given legacy character ENCODING. */ void -data_out (const union value *input, const struct fmt_spec *format, - char *output) +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] = { @@ -107,35 +98,25 @@ data_out (const union value *input, const struct fmt_spec *format, assert (fmt_check_output (format)); 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); } -/* Returns the current output integer format. */ -enum integer_format -data_out_get_integer_format (void) -{ - return output_integer_format; -} +/* Converts the INPUT value into printable form in the exactly + FORMAT->W characters in OUTPUT according to format + specification FORMAT. No null terminator is appended to the + buffer. -/* Sets the output integer format to INTEGER_FORMAT. */ + VALUE must be the correct width for FORMAT, that is, its + width must be fmt_var_width(FORMAT). */ void -data_out_set_integer_format (enum integer_format integer_format) -{ - output_integer_format = integer_format; -} - -/* Returns the current output float format. */ -enum float_format -data_out_get_float_format (void) +data_out (const union value *input, const struct fmt_spec *format, + char *output) { - return output_float_format; + return data_out_legacy (input, LEGACY_NATIVE, format, output); } -/* Sets the output float format to FLOAT_FORMAT. */ -void -data_out_set_float_format (enum float_format float_format) -{ - output_float_format = float_format; -} /* Main conversion functions. */ @@ -249,7 +230,8 @@ output_IB (const union value *input, const struct fmt_spec *format, uint64_t integer = fabs (number); if (number < 0) integer = -integer; - output_binary_integer (integer, format->w, output_integer_format, + output_binary_integer (integer, format->w, + settings_get_output_integer_format (), output); } } @@ -264,7 +246,8 @@ output_PIB (const union value *input, const struct fmt_spec *format, || number < 0 || number >= power256 (format->w)) memset (output, 0, format->w); else - output_binary_integer (number, format->w, output_integer_format, output); + output_binary_integer (number, format->w, + settings_get_output_integer_format (), output); } /* Outputs PIBHEX format. */ @@ -355,7 +338,7 @@ output_date (const union value *input, const struct fmt_spec *format, p += sprintf (p, "%02d", month); else { - static const char *months[12] = + static const char *const months[12] = { "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC", @@ -375,7 +358,8 @@ output_date (const union value *input, const struct fmt_spec *format, } else { - int offset = year - get_epoch (); + int epoch = settings_get_epoch (); + int offset = year - epoch; if (offset < 0 || offset > 99) goto overflow; p += sprintf (p, "%02d", abs (year) % 100); @@ -415,11 +399,11 @@ output_date (const union value *input, const struct fmt_spec *format, int d = MIN (format->d, excess_width - 4); int w = d + 3; sprintf (p, ":%0*.*f", w, d, number); - if (fmt_decimal_char (FMT_F) != '.') + if (settings_get_decimal_char (FMT_F) != '.') { char *cp = strchr (p, '.'); if (cp != NULL) - *cp = fmt_decimal_char (FMT_F); + *cp = settings_get_decimal_char (FMT_F); } p += strlen (p); } @@ -434,7 +418,7 @@ output_date (const union value *input, const struct fmt_spec *format, } } - buf_copy_lpad (output, format->w, tmp, p - tmp); + buf_copy_lpad (output, format->w, tmp, p - tmp, ' '); return; overflow: @@ -451,14 +435,14 @@ static void output_WKDAY (const union value *input, const struct fmt_spec *format, char *output) { - static const char *weekdays[7] = + static const char *const weekdays[7] = { "SUNDAY", "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY", }; if (input->f >= 1 && input->f < 8) - buf_copy_str_rpad (output, format->w, weekdays[(int) input->f - 1]); + buf_copy_str_rpad (output, format->w, weekdays[(int) input->f - 1], ' '); else { if (input->f != SYSMIS) @@ -472,14 +456,14 @@ static void output_MONTH (const union value *input, const struct fmt_spec *format, char *output) { - static const char *months[12] = + static const char *const months[12] = { "JANUARY", "FEBRUARY", "MARCH", "APRIL", "MAY", "JUNE", "JULY", "AUGUST", "SEPTEMBER", "OCTOBER", "NOVEMBER", "DECEMBER", }; if (input->f >= 1 && input->f < 13) - buf_copy_str_rpad (output, format->w, months[(int) input->f - 1]); + buf_copy_str_rpad (output, format->w, months[(int) input->f - 1], ' '); else { if (input->f != SYSMIS) @@ -493,7 +477,7 @@ static void output_A (const union value *input, const struct fmt_spec *format, char *output) { - memcpy (output, input->s, format->w); + memcpy (output, value_str (input, format->w), format->w); } /* Outputs AHEX format. */ @@ -501,7 +485,7 @@ static void output_AHEX (const union value *input, const struct fmt_spec *format, char *output) { - output_hex (input->s, format->w, output); + output_hex (value_str (input, format->w), format->w / 2, output); } /* Decimal and scientific formatting. */ @@ -532,7 +516,9 @@ static bool output_decimal (const struct rounder *r, const struct fmt_spec *format, bool require_affixes, char *output) { - const struct fmt_number_style *style = fmt_get_style (format->type); + const struct fmt_number_style *style = + settings_get_style (format->type); + int decimals; for (decimals = format->d; decimals >= 0; decimals--) @@ -634,7 +620,8 @@ static bool output_scientific (double number, const struct fmt_spec *format, bool require_affixes, char *output) { - const struct fmt_number_style *style = fmt_get_style (format->type); + const struct fmt_number_style *style = + settings_get_style (format->type); int width; int fraction_width; bool add_affixes; @@ -950,7 +937,7 @@ output_infinite (double number, const struct fmt_spec *format, char *output) else s = "Unknown"; - buf_copy_str_lpad (output, format->w, s); + buf_copy_str_lpad (output, format->w, s, ' '); } else output_overflow (format, output);