X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fsettings.c;h=3e637a31b36883c2bd7f00e533ead94d22c80f75;hb=377d05c1eb7b390e2cdb049469fe6b0cfcf52615;hp=10b20f8a352b9b83eec4307c41696f1a180a56bf;hpb=86eb95d2cd8b0acde9ace8fb02f3201001a9dedf;p=pspp diff --git a/src/data/settings.c b/src/data/settings.c index 10b20f8a35..3e637a31b3 100644 --- a/src/data/settings.c +++ b/src/data/settings.c @@ -73,7 +73,7 @@ struct settings int *algorithm; int syntax; - struct fmt_number_style *styles; + struct fmt_settings *styles; enum settings_output_devices output_routing[SETTINGS_N_OUTPUT_TYPES]; }; @@ -151,7 +151,7 @@ settings_init (int *width, int *length) { 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 ()); } @@ -159,7 +159,7 @@ settings_init (int *width, int *length) 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 @@ -589,41 +589,46 @@ find_cc_separators (const char *cc_string, struct fmt_number_style *cc) 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)."), @@ -631,12 +636,12 @@ 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); - 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; } @@ -645,41 +650,37 @@ settings_set_cc (const char *cc_string, enum fmt_type type) 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; )