int *algorithm;
int syntax;
- struct fmt_number_style *styles;
+ struct fmt_settings *styles;
enum settings_output_devices output_routing[SETTINGS_N_OUTPUT_TYPES];
};
{
init_viewport (width, length);
settings_set_epoch (-1);
- the_settings.styles = fmt_create ();
+ the_settings.styles = fmt_settings_create ();
settings_set_decimal_char (get_system_decimal ());
}
void
settings_done (void)
{
- fmt_done (the_settings.styles);
+ fmt_settings_destroy (the_settings.styles);
}
/* Returns the floating-point format used for RB and RBHEX
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. */
+/* 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. */
static const char *
-extract_cc_token (const char *in, int grouping, struct substring *affix)
+extract_cc_token (const char *in, int grouping, struct substring *affix,
+ char buffer[FMT_STYLE_AFFIX_MAX + 1])
{
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;
+ buffer[ofs++] = *in;
}
- affix->length = ofs;
+ *affix = ss_buffer (buffer, 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. */
bool
settings_set_cc (const char *cc_string, enum fmt_type type)
{
- struct fmt_number_style *cc = &the_settings.styles[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;
assert (fmt_get_category (type) == FMT_CAT_CUSTOM);
/* Determine separators. */
- if (!find_cc_separators (cc_string, cc))
+ if (!find_cc_separators (cc_string, &cc))
{
msg (SE, _("%s: Custom currency string `%s' does not contain "
"exactly three periods or commas (or it contains both)."),
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);
+ 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);
- fmt_check_style (cc);
+ fmt_settings_set_style (the_settings.styles, type, &cc);
return true;
}
int
settings_get_decimal_char (enum fmt_type type)
{
- return fmt_get_style (the_settings.styles, type)->decimal;
+ return fmt_settings_get_style (the_settings.styles, type)->decimal;
}
void
settings_set_decimal_char (char decimal)
{
- fmt_set_decimal (the_settings.styles, decimal);
+ fmt_settings_set_decimal (the_settings.styles, decimal);
}
-
-
/* Returns the number formatting style associated with the given
format TYPE. */
const struct fmt_number_style *
settings_get_style (enum fmt_type type)
{
assert (is_fmt_type (type));
- return &the_settings.styles[type];
+ return fmt_settings_get_style (the_settings.styles, type);
}
-
/* Returns a string of the form "$#,###.##" according to FMT,
which must be of type FMT_DOLLAR. The caller must free the
string. */
char *
settings_dollar_template (const struct fmt_spec *fmt)
{
- const struct fmt_number_style *styles = the_settings.styles;
struct string str = DS_EMPTY_INITIALIZER;
int c;
const struct fmt_number_style *fns ;
assert (fmt->type == FMT_DOLLAR);
- fns = fmt_get_style (styles, fmt->type);
+ fns = fmt_settings_get_style (the_settings.styles, fmt->type);
ds_put_char (&str, '$');
for (c = MAX (fmt->w - fmt->d - 1, 0); c > 0; )