From: Ben Pfaff Date: Tue, 15 Feb 2011 07:17:11 +0000 (-0800) Subject: format: Increase abstraction of fmt_number_style. X-Git-Tag: v0.7.7~49 X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2b0538e3901bfc1301729ab5b84e4d3e05ee4ccc;p=pspp-builds.git format: Increase abstraction of fmt_number_style. 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. --- diff --git a/doc/dev/concepts.texi b/doc/dev/concepts.texi index f1347379..24c16541 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 -@deftypefun void fmt_check_style (const struct fmt_number_style *@var{style}) -Asserts that style is self consistent. -@end 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 a78ea91c..4ec3dc56 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 36726542..568dd3d3 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 ec026d4c..71d4261d 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; }