[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[formatting i18n 08/14] data-out: Make each converter responsible for st
From: |
Ben Pfaff |
Subject: |
[formatting i18n 08/14] data-out: Make each converter responsible for storing null terminator. |
Date: |
Sat, 19 Feb 2011 17:42:20 -0800 |
Until now, every converter has produced output that is exactly as many
bytes long as the format's width. In upcoming patches this will change,
because in UTF-8 a character that occupies a single display column can
require multiple bytes. In preparation, this commit requires the
individual converters to write out their own null byte, giving a bit
more flexibility regarding length.
---
src/data/data-out.c | 36 +++++++++++++++++++++++++++++++++---
1 files changed, 33 insertions(+), 3 deletions(-)
diff --git a/src/data/data-out.c b/src/data/data-out.c
index ca5fcec..85e8eaa 100644
--- a/src/data/data-out.c
+++ b/src/data/data-out.c
@@ -136,7 +136,6 @@ data_out_pool (const union value *input, const char
*encoding,
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);
@@ -200,6 +199,8 @@ output_N (const union value *input, const struct fmt_spec
*format,
else
output_overflow (format, output);
}
+
+ output[format->w] = '\0';
}
/* Outputs Z format. */
@@ -223,6 +224,7 @@ output_Z (const union value *input, const struct fmt_spec
*format,
*p = "}JKLMNOPQR"[*p - '0'];
}
memcpy (output, buf, format->w);
+ output[format->w] = '\0';
}
}
@@ -266,6 +268,8 @@ output_IB (const union value *input, const struct fmt_spec
*format,
settings_get_output_integer_format (),
output);
}
+
+ output[format->w] = '\0';
}
/* Outputs PIB format. */
@@ -280,6 +284,8 @@ output_PIB (const union value *input, const struct fmt_spec
*format,
else
output_binary_integer (number, format->w,
settings_get_output_integer_format (), output);
+
+ output[format->w] = '\0';
}
/* Outputs PIBHEX format. */
@@ -298,6 +304,7 @@ output_PIBHEX (const union value *input, const struct
fmt_spec *format,
output_binary_integer (number, format->w / 2, INTEGER_MSB_FIRST, tmp);
output_hex (tmp, format->w / 2, output);
}
+
}
/* Outputs RB format. */
@@ -307,6 +314,8 @@ output_RB (const union value *input, const struct fmt_spec
*format,
{
double d = input->f;
memcpy (output, &d, format->w);
+
+ output[format->w] = '\0';
}
/* Outputs RBHEX format. */
@@ -315,6 +324,7 @@ output_RBHEX (const union value *input, const struct
fmt_spec *format,
char *output)
{
double d = input->f;
+
output_hex (&d, format->w / 2, output);
}
@@ -451,6 +461,7 @@ output_date (const union value *input, const struct
fmt_spec *format,
}
buf_copy_lpad (output, format->w, tmp, p - tmp, ' ');
+ output[format->w] = '\0';
return;
overflow:
@@ -474,13 +485,18 @@ output_WKDAY (const union value *input, const struct
fmt_spec *format,
};
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], ' ');
+ output[format->w] = '\0';
+ }
else
{
if (input->f != SYSMIS)
msg (ME, _("Weekday number %f is not between 1 and 7."), input->f);
output_missing (format, output);
}
+
}
/* Outputs MONTH format. */
@@ -495,13 +511,17 @@ output_MONTH (const union value *input, const struct
fmt_spec *format,
};
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], ' ');
+ output[format->w] = '\0';
+ }
else
{
if (input->f != SYSMIS)
msg (ME, _("Month number %f is not between 1 and 12."), input->f);
output_missing (format, output);
}
+
}
/* Outputs A format. */
@@ -510,6 +530,7 @@ output_A (const union value *input, const struct fmt_spec
*format,
char *output)
{
memcpy (output, value_str (input, format->w), format->w);
+ output[format->w] = '\0';
}
/* Outputs AHEX format. */
@@ -724,6 +745,7 @@ output_scientific (double number, const struct fmt_spec
*format,
assert (p == buf + format->w);
memcpy (output, buf, format->w);
+ output[format->w] = '\0';
return true;
}
@@ -973,6 +995,8 @@ output_infinite (double number, const struct fmt_spec
*format, char *output)
}
else
output_overflow (format, output);
+
+ output[format->w] = '\0';
}
/* Formats OUTPUT as a missing value for the given FORMAT. */
@@ -990,6 +1014,8 @@ output_missing (const struct fmt_spec *format, char
*output)
}
else
output[format->w - 1] = '.';
+
+ output[format->w] = '\0';
}
/* Formats OUTPUT for overflow given FORMAT. */
@@ -997,6 +1023,7 @@ static void
output_overflow (const struct fmt_spec *format, char *output)
{
memset (output, '*', format->w);
+ output[format->w] = '\0';
}
/* Converts the integer part of NUMBER to a packed BCD number
@@ -1011,6 +1038,8 @@ output_bcd_integer (double number, int digits, char
*output)
char decimal[64];
assert (digits < sizeof decimal);
+
+ output[DIV_RND_UP (digits, 2)] = '\0';
if (number != SYSMIS
&& number >= 0.
&& number < power10 (digits)
@@ -1060,4 +1089,5 @@ output_hex (const void *data_, size_t bytes, char *output)
*output++ = hex_digits[data[i] >> 4];
*output++ = hex_digits[data[i] & 15];
}
+ *output = '\0';
}
--
1.7.2.3
- [formatting i18n 00/14] Fix i18n of formatted data, Ben Pfaff, 2011/02/19
- [formatting i18n 03/14] PRINT: Use UTF-8 encoding for output to the output subsystem., Ben Pfaff, 2011/02/19
- [formatting i18n 01/14] Use new Gnulib function dtoastr() to format short, accurate real numbers., Ben Pfaff, 2011/02/19
- [formatting i18n 04/14] i18n: New function recode_byte()., Ben Pfaff, 2011/02/19
- [formatting i18n 10/14] format: Count prefix and suffix width in terms of display columns., Ben Pfaff, 2011/02/19
- [formatting i18n 08/14] data-out: Make each converter responsible for storing null terminator.,
Ben Pfaff <=
- [formatting i18n 12/14] pool: Support NULL pool argument to pool_alloc_unaligned()., Ben Pfaff, 2011/02/19
- [formatting i18n 14/14] data-out: Add test for non-ASCII custom currency formats., Ben Pfaff, 2011/02/19
- [formatting i18n 11/14] data-out: Reorganize output_Z() to be more easily understood., Ben Pfaff, 2011/02/19
- [formatting i18n 02/14] CROSSTABS: Eliminate redundant data copying., Ben Pfaff, 2011/02/19
- [formatting i18n 06/14] legacy-encoding: Remove., Ben Pfaff, 2011/02/19
- [formatting i18n 07/14] format: Increase abstraction of fmt_number_style., Ben Pfaff, 2011/02/19
- [formatting i18n 09/14] format: Create a new "struct fmt_affix" for prefix and suffix strings., Ben Pfaff, 2011/02/19
- [formatting i18n 05/14] i18n: Introduce C_ENCODING as replacement for LEGACY_NATIVE., Ben Pfaff, 2011/02/19
- [formatting i18n 13/14] data-out: Optimize and fix some bad assumptions., Ben Pfaff, 2011/02/19
- Re: [formatting i18n 00/14] Fix i18n of formatted data, Ben Pfaff, 2011/02/23