X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fdata-out.c;h=94a6130adb154bd06b61901414e4209498cbf106;hb=2b77d6273ba47af3020a827d48d0ff3330d76ba5;hp=fa8d59e74ced3dd4df1c0977a5f25b6d70fe76c9;hpb=9254d30d06a0565c89daccedd93a94c4c6086004;p=pspp-builds.git diff --git a/src/data/data-out.c b/src/data/data-out.c index fa8d59e7..94a6130a 100644 --- a/src/data/data-out.c +++ b/src/data/data-out.c @@ -36,6 +36,8 @@ #include #include #include +#include +#include #include "minmax.h" @@ -83,38 +85,68 @@ static void output_binary_integer (uint64_t, int bytes, enum integer_format, char *); static void output_hex (const void *, size_t bytes, char *); -/* Same as data_out, and additionally recodes the output from - native form into the given legacy character ENCODING. */ -void -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] = + +static data_out_converter_func *const converters[FMT_NUMBER_OF_FORMATS] = { #define FMT(NAME, METHOD, IMIN, OMIN, IO, CATEGORY) output_##METHOD, #include "format.def" }; +/* Similar to data_out. Additionally recodes the output from + native form into the given legacy character ENCODING. + OUTPUT must be provided by the caller and must be at least + FORMAT->w long. No null terminator is appended to OUTPUT. +*/ +void +data_out_legacy (const union value *input, const char *encoding, + const struct fmt_spec *format, char *output) +{ 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); + { + char *s = recode_string (encoding, LEGACY_NATIVE, output, format->w ); + memcpy (output, s, format->w); + free (s); + } } -/* 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. +/* Converts the INPUT value into a UTF8 encoded string, according + to format specification FORMAT. VALUE must be the correct width for FORMAT, that is, its - width must be fmt_var_width(FORMAT). */ -void -data_out (const union value *input, const struct fmt_spec *format, - char *output) + 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. + + 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, + const struct fmt_spec *format, struct pool *pool) +{ + char *output = xmalloc (format->w + 1); + char *t ; + assert (fmt_check_output (format)); + + converters[format->type] (input, format, output); + output[format->w] = '\0'; + + t = recode_string_pool (UTF8, encoding, output, format->w, pool); + free (output); + return t; +} + +char * +data_out (const union value *input, const char *encoding, const struct fmt_spec *format) { - return data_out_legacy (input, LEGACY_NATIVE, format, output); + return data_out_pool (input, encoding, format, NULL); }