X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fformat.c;h=74ee0e2e2ab3379222868ddce40aa1bf4fc795d6;hb=ed109bf498216cef15a3cbf180827dc8b20eff0b;hp=d0b87a503f198a8d7db58978abbf6c2fa27a6d06;hpb=81e3a36c830463d97ff4f5937a670206cc26e193;p=pspp diff --git a/src/data/format.c b/src/data/format.c index d0b87a503f..74ee0e2e2a 100644 --- a/src/data/format.c +++ b/src/data/format.c @@ -63,13 +63,13 @@ fmt_settings_uninit (struct fmt_settings *settings) fmt_number_style_destroy (settings->ccs[i]); } -void -fmt_settings_copy (struct fmt_settings *new, const struct fmt_settings *old) +struct fmt_settings +fmt_settings_copy (const struct fmt_settings *old) { - new->epoch = old->epoch; - new->decimal = old->decimal; + struct fmt_settings new = *old; for (int i = 0; i < FMT_N_CCS; i++) - new->ccs[i] = fmt_number_style_clone (old->ccs[i]); + new.ccs[i] = fmt_number_style_clone (old->ccs[i]); + return new; } static size_t @@ -184,10 +184,7 @@ fmt_settings_set_cc (struct fmt_settings *settings, enum fmt_type type, struct fmt_spec fmt_for_input (enum fmt_type type, int w, int d) { - struct fmt_spec f; - f.type = type; - f.w = w; - f.d = d; + struct fmt_spec f = { .type = type, .w = w, .d = d }; assert (fmt_check_input (&f)); return f; } @@ -197,10 +194,7 @@ fmt_for_input (enum fmt_type type, int w, int d) struct fmt_spec fmt_for_output (enum fmt_type type, int w, int d) { - struct fmt_spec f; - f.type = type; - f.w = w; - f.d = d; + struct fmt_spec f = { .type = type, .w = w, .d = d }; assert (fmt_check_output (&f)); return f; } @@ -208,7 +202,8 @@ fmt_for_output (enum fmt_type type, int w, int d) /* Returns the output format specifier corresponding to input format specifier INPUT. */ struct fmt_spec -fmt_for_output_from_input (const struct fmt_spec *input) +fmt_for_output_from_input (const struct fmt_spec *input, + const struct fmt_settings *settings) { struct fmt_spec output; @@ -237,7 +232,7 @@ fmt_for_output_from_input (const struct fmt_spec *input) case FMT_PCT: { const struct fmt_number_style *style = - settings_get_style (input->type); + fmt_settings_get_style (settings, input->type); output.w += fmt_affix_width (style); if (style->grouping != 0 && input->w - input->d >= 3) @@ -1143,12 +1138,8 @@ fmt_clamp_width (struct fmt_spec *fmt, enum fmt_use use) static void fmt_clamp_decimals (struct fmt_spec *fmt, enum fmt_use use) { - int max_d; - - max_d = fmt_max_decimals (fmt->type, fmt->w, use); - if (fmt->d < 0) - fmt->d = 0; - else if (fmt->d > max_d) + int max_d = fmt_max_decimals (fmt->type, fmt->w, use); + if (fmt->d > max_d) fmt->d = max_d; } @@ -1156,7 +1147,7 @@ static struct fmt_affix fmt_affix_clone (const struct fmt_affix *old) { return (struct fmt_affix) { - .s = old->s ? xstrdup (old->s) : NULL, + .s = xstrdup_if_nonnull (old->s), .width = old->width, }; } @@ -1239,6 +1230,34 @@ fmt_number_style_from_string (const char *s) return style; } +static void +format_cc (struct string *out, const char *in, char grouping) +{ + while (*in != '\0') + { + char c = *in++; + if (c == grouping || c == '\'') + ds_put_byte (out, '\''); + else if (c == '"') + ds_put_byte (out, '"'); + ds_put_byte (out, c); + } +} + +char * +fmt_number_style_to_string (const struct fmt_number_style *cc) +{ + struct string out = DS_EMPTY_INITIALIZER; + format_cc (&out, cc->neg_prefix.s, cc->grouping); + ds_put_byte (&out, cc->grouping); + format_cc (&out, cc->prefix.s, cc->grouping); + ds_put_byte (&out, cc->grouping); + format_cc (&out, cc->suffix.s, cc->grouping); + ds_put_byte (&out, cc->grouping); + format_cc (&out, cc->neg_suffix.s, cc->grouping); + return ds_steal_cstr (&out); +} + struct fmt_number_style * fmt_number_style_clone (const struct fmt_number_style *old) { @@ -1305,7 +1324,7 @@ get_fmt_desc (enum fmt_type type) return &formats[type]; } -const struct fmt_spec F_8_0 = {FMT_F, 8, 0}; -const struct fmt_spec F_8_2 = {FMT_F, 8, 2}; -const struct fmt_spec F_4_3 = {FMT_F, 4, 3}; -const struct fmt_spec F_5_1 = {FMT_F, 5, 1}; +const struct fmt_spec F_8_0 = { .type = FMT_F, .w = 8, .d = 0 }; +const struct fmt_spec F_8_2 = { .type = FMT_F, .w = 8, .d = 2 }; +const struct fmt_spec F_4_3 = { .type = FMT_F, .w = 4, .d = 3 }; +const struct fmt_spec F_5_1 = { .type = FMT_F, .w = 5, .d = 1 };