X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fformat.h;h=d6779d4b3f5f6dccab20e952d55006cf835eaf0e;hb=0569b2e2c28be9bf5754297f705d82b6518e0f7d;hp=1744becccc68c91cb79881f269227a6923b1d179;hpb=6e8e87dfefd60ab46c6a484374cfd7911eef07c9;p=pspp diff --git a/src/data/format.h b/src/data/format.h index 1744becccc..d6779d4b3f 100644 --- a/src/data/format.h +++ b/src/data/format.h @@ -20,9 +20,13 @@ /* Display format types. */ #include +#include #include "data/val-type.h" #include "libpspp/str.h" +struct fmt_settings; +struct msg_location; + /* How a format is going to be used. */ enum fmt_use { @@ -53,7 +57,7 @@ enum fmt_category }; /* Format type. */ -enum fmt_type +enum ATTRIBUTE ((packed)) fmt_type { #define FMT(NAME, METHOD, IMIN, OMIN, IO, CATEGORY) FMT_##NAME, #include "format.def" @@ -72,8 +76,8 @@ enum fmt_type struct fmt_spec { enum fmt_type type; /* One of FMT_*. */ - int w; /* Width. */ - int d; /* Number of decimal places. */ + uint8_t d; /* Number of decimal places. */ + uint16_t w; /* Width. */ }; /* Maximum width of any numeric format. */ @@ -82,7 +86,8 @@ struct fmt_spec /* Constructing formats. */ struct fmt_spec fmt_for_input (enum fmt_type, int w, int d) PURE_FUNCTION; struct fmt_spec fmt_for_output (enum fmt_type, int w, int d) PURE_FUNCTION; -struct fmt_spec fmt_for_output_from_input (const struct fmt_spec *); +struct fmt_spec fmt_for_output_from_input (const struct fmt_spec *, + const struct fmt_settings *); struct fmt_spec fmt_default_for_width (int width); /* Verifying formats. */ @@ -92,11 +97,15 @@ bool fmt_check_output (const struct fmt_spec *); bool fmt_check_type_compat (const struct fmt_spec *, enum val_type); bool fmt_check_width_compat (const struct fmt_spec *, int var_width); +char *fmt_check__ (const struct fmt_spec *, enum fmt_use); +char *fmt_check_type_compat__ (const struct fmt_spec *, enum val_type); +char *fmt_check_width_compat__ (const struct fmt_spec *, int var_width); + /* Working with formats. */ int fmt_var_width (const struct fmt_spec *); char *fmt_to_string (const struct fmt_spec *, char s[FMT_STRING_LEN_MAX + 1]); bool fmt_equal (const struct fmt_spec *, const struct fmt_spec *); -void fmt_resize (struct fmt_spec *, int new_width); +bool fmt_resize (struct fmt_spec *, int new_width); void fmt_fix (struct fmt_spec *, enum fmt_use); void fmt_fix_input (struct fmt_spec *); @@ -133,27 +142,11 @@ bool fmt_usable_for_input (enum fmt_type) PURE_FUNCTION; int fmt_to_io (enum fmt_type) PURE_FUNCTION; bool fmt_from_io (int io, enum fmt_type *); +bool fmt_from_u32 (uint32_t, int var_width, bool loose, struct fmt_spec *); -const char *fmt_date_template (enum fmt_type) PURE_FUNCTION; +const char *fmt_date_template (enum fmt_type, int width) PURE_FUNCTION; const char *fmt_gui_name (enum fmt_type); -/* Format settings. - - A fmt_settings is really just a collection of one "struct fmt_number_style" - for each format type. */ -struct fmt_settings *fmt_settings_create (void); -void fmt_settings_destroy (struct fmt_settings *); -struct fmt_settings *fmt_settings_clone (const struct fmt_settings *); - -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, - char decimal, char grouping, - const char *neg_prefix, const char *prefix, - const char *suffix, const char *neg_suffix); - /* A prefix or suffix for a numeric output format. */ struct fmt_affix { @@ -161,7 +154,8 @@ struct fmt_affix int width; /* Display width in columns (see wcwidth()). */ }; -/* A numeric output style. */ +/* A numeric output style. This can express the basic numeric formats (in the + FMT_CAT_BASIC category) and custom currency formats (FMT_CCx). */ struct fmt_number_style { struct fmt_affix neg_prefix; /* Negative prefix. */ @@ -172,7 +166,7 @@ struct fmt_number_style char grouping; /* Grouping character: ',', '.', or 0. */ /* A fmt_affix may require more bytes than its display width; for example, - U+00A5 (Â¥) is 3 bytes in UTF-8 but occupies only one display column. + U+00A5 (Â¥) is 2 bytes in UTF-8 but occupies only one display column. This member is the sum of the number of bytes required by all of the fmt_affix members in this struct, minus their display widths. Thus, it can be used to size memory allocations: for example, the formatted @@ -181,9 +175,41 @@ struct fmt_number_style int extra_bytes; }; +struct fmt_number_style *fmt_number_style_from_string (const char *); +struct fmt_number_style *fmt_number_style_clone ( + const struct fmt_number_style *); +void fmt_number_style_destroy (struct fmt_number_style *); + +char *fmt_number_style_to_string (const struct fmt_number_style *); + int fmt_affix_width (const struct fmt_number_style *); int fmt_neg_affix_width (const struct fmt_number_style *); + +/* Number of custom currency styles. */ +#define FMT_N_CCS 5 /* FMT_CCA through FMT_CCE. */ + +struct fmt_settings + { + int epoch; /* 0 for default epoch. */ + char decimal; /* '.' or ','. */ + struct fmt_number_style *ccs[FMT_N_CCS]; /* CCA through CCE. */ + }; +#define FMT_SETTINGS_INIT { .decimal = '.' } + +void fmt_settings_init (struct fmt_settings *); +void fmt_settings_uninit (struct fmt_settings *); +struct fmt_settings fmt_settings_copy (const struct fmt_settings *); +const struct fmt_number_style *fmt_settings_get_style ( + const struct fmt_settings *, enum fmt_type); +int fmt_settings_get_epoch (const struct fmt_settings *); + +void fmt_settings_set_cc (struct fmt_settings *, enum fmt_type, + struct fmt_number_style *); + extern const struct fmt_spec F_8_0 ; +extern const struct fmt_spec F_8_2 ; +extern const struct fmt_spec F_4_3 ; +extern const struct fmt_spec F_5_1 ; #endif /* data/format.h */