projects
/
pspp
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Revert "Fixed a use after free error when manipulating datasets."
[pspp]
/
src
/
data
/
data-out.c
diff --git
a/src/data/data-out.c
b/src/data/data-out.c
index 94e555cc8215aa048ea1754fdfeefa87b6344ca3..cbd114b8e58cf8399caba921df0c12168cca4b90 100644
(file)
--- 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)
{
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);
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).
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 *
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)
{
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)
{
}
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 *
}
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);
}
\f
}
\f
@@
-473,7
+474,8
@@
output_date (const union value *input, const struct fmt_spec *format,
{
if (year <= 9999)
p += sprintf (p, "%04d", year);
{
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;
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':
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);
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))
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_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);
}
\f
/* Decimal and scientific formatting. */
}
\f
/* 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);
{
char *cp = strchr (p, 'E') + 1;
long int exponent = strtol (cp, NULL, 10);
- if (abs (exponent) > 999)
+ if (
l
abs (exponent) > 999)
return false;
sprintf (cp, "%+04ld", exponent);
}
return false;
sprintf (cp, "%+04ld", exponent);
}