pspp-dev
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]