-/* Find the grouping characters in CC_STRING and set CC's
- grouping and decimal members appropriately. Returns true if
- successful, false otherwise. */
-static bool
-find_cc_separators (const char *cc_string, struct fmt_number_style *cc)
-{
- const char *sp;
- int comma_cnt, dot_cnt;
-
- /* Count commas and periods. There must be exactly three of
- one or the other, except that an apostrophe escapes a
- following comma or period. */
- comma_cnt = dot_cnt = 0;
- for (sp = cc_string; *sp; sp++)
- if (*sp == ',')
- comma_cnt++;
- else if (*sp == '.')
- dot_cnt++;
- else if (*sp == '\'' && (sp[1] == '.' || sp[1] == ',' || sp[1] == '\''))
- sp++;
-
- if ((comma_cnt == 3) == (dot_cnt == 3))
- return false;
-
- if (comma_cnt == 3)
- {
- cc->decimal = '.';
- cc->grouping = ',';
- }
- else
- {
- cc->decimal = ',';
- cc->grouping = '.';
- }
- return true;
-}
-
-/* Extracts a token from IN into a newly allocated AFFIX. Tokens
- are delimited by GROUPING. The token is truncated to at most
- FMT_STYLE_AFFIX_MAX characters. Returns the first character
- following the token. */
-static const char *
-extract_cc_token (const char *in, int grouping, struct substring *affix)
-{
- size_t ofs = 0;
- ss_alloc_uninit (affix, FMT_STYLE_AFFIX_MAX);
- for (; *in != '\0' && *in != grouping; in++)
- {
- if (*in == '\'' && in[1] == grouping)
- in++;
- if (ofs < FMT_STYLE_AFFIX_MAX)
- ss_data (*affix)[ofs++] = *in;
- }
- affix->length = ofs;
-
- if (*in == grouping)
- in++;
- return in;
-}
-
-/* Sets custom currency specifier CC having name CC_NAME ('A' through
- 'E') to correspond to the settings in CC_STRING. */
-static bool
-do_cc (const char *cc_string, enum fmt_type type)
-{
- struct fmt_number_style *cc = fmt_number_style_create ();
-
- /* Determine separators. */
- if (!find_cc_separators (cc_string, cc))
- {
- fmt_number_style_destroy (cc);
- msg (SE, _("%s: Custom currency string `%s' does not contain "
- "exactly three periods or commas (or it contains both)."),
- fmt_name (type), cc_string);
- return false;
- }
-
- cc_string = extract_cc_token (cc_string, cc->grouping, &cc->neg_prefix);
- cc_string = extract_cc_token (cc_string, cc->grouping, &cc->prefix);
- cc_string = extract_cc_token (cc_string, cc->grouping, &cc->suffix);
- cc_string = extract_cc_token (cc_string, cc->grouping, &cc->neg_suffix);