[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[formatting i18n 07/14] format: Increase abstraction of fmt_number_style
From: |
Ben Pfaff |
Subject: |
[formatting i18n 07/14] format: Increase abstraction of fmt_number_style. |
Date: |
Sat, 19 Feb 2011 17:42:19 -0800 |
Upcoming commits will make some changes to fmt_number_style, so it
seems best to avoid having clients actually construct and modify
instances of this structure. This commit makes that change.
We could take it one step further and add accessor functions even
for reading out the structure, but in my opinion that would be
overkill for this structure.
---
doc/dev/concepts.texi | 5 ---
src/data/format.c | 67 +++++++++++++++++--------------------------------
src/data/format.h | 11 ++------
src/data/settings.c | 60 +++++++++++++++++++++----------------------
4 files changed, 55 insertions(+), 88 deletions(-)
diff --git a/doc/dev/concepts.texi b/doc/dev/concepts.texi
index f134737..24c1654 100644
--- a/doc/dev/concepts.texi
+++ b/doc/dev/concepts.texi
@@ -637,11 +637,6 @@ work with these global styles:
Returns the numeric style for the given format @var{type}.
@end deftypefun
address@hidden void fmt_check_style (const struct fmt_number_style
address@hidden)
-Asserts that style is self consistent.
address@hidden deftypefun
-
-
@deftypefun {const char *} fmt_name (enum fmt_type @var{type})
Returns the name of the given format @var{type}.
@end deftypefun
diff --git a/src/data/format.c b/src/data/format.c
index a78ea91..4ec3dc5 100644
--- a/src/data/format.c
+++ b/src/data/format.c
@@ -1,5 +1,5 @@
/* PSPP - a program for statistical analysis.
- Copyright (C) 1997-9, 2000, 2006, 2010 Free Software Foundation, Inc.
+ Copyright (C) 1997-9, 2000, 2006, 2010, 2011 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
@@ -107,52 +107,46 @@ fmt_settings_get_style (const struct fmt_settings
*settings,
return &settings->styles[type];
}
+/* Sets the number style for TYPE to have the given DECIMAL and GROUPING
+ characters, negative prefix NEG_PREFIX, prefix PREFIX, suffix SUFFIX, and
+ negative suffix NEG_SUFFIX. */
void
fmt_settings_set_style (struct fmt_settings *settings, enum fmt_type type,
- const struct fmt_number_style *style)
+ char decimal, char grouping,
+ const char *neg_prefix, const char *prefix,
+ const char *suffix, const char *neg_suffix)
{
- fmt_check_style (style);
- fmt_number_style_destroy (&settings->styles[type]);
- fmt_number_style_clone (&settings->styles[type], style);
-}
-
-/* Sets the number style for TYPE to have the given standard
- PREFIX and SUFFIX, "-" as prefix suffix, an empty negative
- suffix, DECIMAL as the decimal point character, and GROUPING
- as the grouping character. */
-static void
-set_style (struct fmt_settings *settings, enum fmt_type type,
- const char *prefix, const char *suffix,
- char decimal, char grouping)
-{
- struct fmt_number_style *style;
+ struct fmt_number_style *style = &settings->styles[type];
- assert (is_fmt_type (type));
-
- style = &settings->styles[type];
+ assert (grouping == '.' || grouping == ',' || grouping == 0);
+ assert (decimal == '.' || decimal == ',');
+ assert (decimal != grouping);
fmt_number_style_destroy (style);
- ss_alloc_substring (&style->neg_prefix, ss_cstr ("-"));
+ ss_alloc_substring (&style->neg_prefix, ss_cstr (neg_prefix));
ss_alloc_substring (&style->prefix, ss_cstr (prefix));
ss_alloc_substring (&style->suffix, ss_cstr (suffix));
+ ss_alloc_substring (&style->neg_suffix, ss_cstr (neg_suffix));
style->decimal = decimal;
style->grouping = grouping;
}
-/* Sets the decimal point character for SETTINGS to DECIMAL. */
+/* Sets the decimal point character for the settings in S to DECIMAL.
+
+ This has no effect on custom currency formats. */
void
-fmt_settings_set_decimal (struct fmt_settings *settings, char decimal)
+fmt_settings_set_decimal (struct fmt_settings *s, char decimal)
{
int grouping = decimal == '.' ? ',' : '.';
assert (decimal == '.' || decimal == ',');
- set_style (settings, FMT_F, "", "", decimal, 0);
- set_style (settings, FMT_E, "", "", decimal, 0);
- set_style (settings, FMT_COMMA, "", "", decimal, grouping);
- set_style (settings, FMT_DOT, "", "", grouping, decimal);
- set_style (settings, FMT_DOLLAR, "$", "", decimal, grouping);
- set_style (settings, FMT_PCT, "", "%", decimal, 0);
+ fmt_settings_set_style (s, FMT_F, decimal, 0, "-", "", "", "");
+ fmt_settings_set_style (s, FMT_E, decimal, 0, "-", "", "", "");
+ fmt_settings_set_style (s, FMT_COMMA, decimal, grouping, "-", "", "", "");
+ fmt_settings_set_style (s, FMT_DOT, grouping, decimal, "-", "", "", "");
+ fmt_settings_set_style (s, FMT_DOLLAR, decimal, grouping, "-", "$", "", "");
+ fmt_settings_set_style (s, FMT_PCT, decimal, 0, "-", "", "%", "");
}
/* Returns an input format specification with type TYPE, width W,
@@ -972,21 +966,6 @@ fmt_number_style_destroy (struct fmt_number_style *style)
}
}
-/* Checks that style is STYLE sane */
-void
-fmt_check_style (const struct fmt_number_style *style)
-{
- assert (ss_length (style->neg_prefix) <= FMT_STYLE_AFFIX_MAX);
- assert (ss_length (style->prefix) <= FMT_STYLE_AFFIX_MAX);
- assert (ss_length (style->suffix) <= FMT_STYLE_AFFIX_MAX);
- assert (ss_length (style->neg_suffix) <= FMT_STYLE_AFFIX_MAX);
- assert (style->decimal == '.' || style->decimal == ',');
- assert (style->grouping == '.' || style->grouping == ','
- || style->grouping == 0);
- assert (style->grouping != style->decimal);
-}
-
-
/* Returns the total width of the standard prefix and suffix for
STYLE. */
int
diff --git a/src/data/format.h b/src/data/format.h
index 3672654..568dd3d 100644
--- a/src/data/format.h
+++ b/src/data/format.h
@@ -139,7 +139,9 @@ void fmt_settings_set_decimal (struct fmt_settings *, char);
const struct fmt_number_style *fmt_settings_get_style (
const struct fmt_settings *, enum fmt_type);
void fmt_settings_set_style (struct fmt_settings *, enum fmt_type,
- const struct fmt_number_style *);
+ char decimal, char grouping,
+ const char *neg_prefix, const char *prefix,
+ const char *suffix, const char *neg_suffix);
/* A numeric output style. */
struct fmt_number_style
@@ -152,16 +154,9 @@ struct fmt_number_style
char grouping; /* Grouping character: ',', '.', or 0. */
};
-/* Maximum length of prefix or suffix string in
- struct fmt_number_style. */
-#define FMT_STYLE_AFFIX_MAX 16
-
int fmt_affix_width (const struct fmt_number_style *);
int fmt_neg_affix_width (const struct fmt_number_style *);
-void fmt_check_style (const struct fmt_number_style *style);
-
-
extern const struct fmt_spec F_8_0 ;
#endif /* data/format.h */
diff --git a/src/data/settings.c b/src/data/settings.c
index ec026d4..71d4261 100644
--- a/src/data/settings.c
+++ b/src/data/settings.c
@@ -1,5 +1,5 @@
/* PSPP - a program for statistical analysis.
- Copyright (C) 1997-9, 2000, 2006, 2007, 2009, 2010 Free Software
Foundation, Inc.
+ Copyright (C) 1997-9, 2000, 2006, 2007, 2009, 2010, 2011 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
@@ -526,11 +526,10 @@ settings_set_syntax ( enum behavior_mode mode)
-/* Find the grouping characters in CC_STRING and set CC's
- grouping and decimal members appropriately. Returns true if
- successful, false otherwise. */
+/* Find the grouping characters in CC_STRING and sets *GROUPING and *DECIMAL
+ appropriately. Returns true if successful, false otherwise. */
static bool
-find_cc_separators (const char *cc_string, struct fmt_number_style *cc)
+find_cc_separators (const char *cc_string, char *decimal, char *grouping)
{
const char *sp;
int comma_cnt, dot_cnt;
@@ -552,36 +551,32 @@ find_cc_separators (const char *cc_string, struct
fmt_number_style *cc)
if (comma_cnt == 3)
{
- cc->decimal = '.';
- cc->grouping = ',';
+ *decimal = '.';
+ *grouping = ',';
}
else
{
- cc->decimal = ',';
- cc->grouping = '.';
+ *decimal = ',';
+ *grouping = '.';
}
return true;
}
-/* Extracts a token from IN into AFFIX, using BUFFER for storage. BUFFER must
- have at least FMT_STYLE_AFFIX_MAX + 1 bytes of space. Tokens are delimited
- by GROUPING. The token is truncated to at most FMT_STYLE_AFFIX_MAX bytes,
- followed by a null terminator. Returns the first character following the
- token. */
+/* Extracts a token from IN into a newly allocated string AFFIXP. Tokens are
+ delimited by GROUPING. Returns the first character following the token. */
static const char *
-extract_cc_token (const char *in, int grouping, struct substring *affix,
- char buffer[FMT_STYLE_AFFIX_MAX + 1])
+extract_cc_token (const char *in, int grouping, char **affixp)
{
- size_t ofs = 0;
+ char *out;
+ out = *affixp = xmalloc (strlen (in) + 1);
for (; *in != '\0' && *in != grouping; in++)
{
if (*in == '\'' && in[1] == grouping)
in++;
- if (ofs < FMT_STYLE_AFFIX_MAX)
- buffer[ofs++] = *in;
+ *out++ = *in;
}
- *affix = ss_buffer (buffer, ofs);
+ *out = '\0';
if (*in == grouping)
in++;
@@ -593,16 +588,13 @@ extract_cc_token (const char *in, int grouping, struct
substring *affix,
bool
settings_set_cc (const char *cc_string, enum fmt_type type)
{
- char a[FMT_STYLE_AFFIX_MAX + 1];
- char b[FMT_STYLE_AFFIX_MAX + 1];
- char c[FMT_STYLE_AFFIX_MAX + 1];
- char d[FMT_STYLE_AFFIX_MAX + 1];
- struct fmt_number_style cc;
+ char *neg_prefix, *prefix, *suffix, *neg_suffix;
+ char decimal, grouping;
assert (fmt_get_category (type) == FMT_CAT_CUSTOM);
/* Determine separators. */
- if (!find_cc_separators (cc_string, &cc))
+ if (!find_cc_separators (cc_string, &decimal, &grouping))
{
msg (SE, _("%s: Custom currency string `%s' does not contain "
"exactly three periods or commas (or it contains both)."),
@@ -610,12 +602,18 @@ settings_set_cc (const char *cc_string, enum fmt_type
type)
return false;
}
- cc_string = extract_cc_token (cc_string, cc.grouping, &cc.neg_prefix, a);
- cc_string = extract_cc_token (cc_string, cc.grouping, &cc.prefix, b);
- cc_string = extract_cc_token (cc_string, cc.grouping, &cc.suffix, c);
- cc_string = extract_cc_token (cc_string, cc.grouping, &cc.neg_suffix, d);
+ cc_string = extract_cc_token (cc_string, grouping, &neg_prefix);
+ cc_string = extract_cc_token (cc_string, grouping, &prefix);
+ cc_string = extract_cc_token (cc_string, grouping, &suffix);
+ cc_string = extract_cc_token (cc_string, grouping, &neg_suffix);
- fmt_settings_set_style (the_settings.styles, type, &cc);
+ fmt_settings_set_style (the_settings.styles, type, decimal, grouping,
+ neg_prefix, prefix, suffix, neg_suffix);
+
+ free (neg_suffix);
+ free (suffix);
+ free (prefix);
+ free (neg_prefix);
return true;
}
--
1.7.2.3
- [formatting i18n 03/14] PRINT: Use UTF-8 encoding for output to the output subsystem., (continued)
- [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, 2011/02/19
- [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 <=
- [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