X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fvariable.c;h=87e7d07823f42271707000938d7501a24f562250;hb=c6caca37f19989f96ad843e2baee09a54c4f23ba;hp=5115d4a6e4b44fb4fb6371c4f13b2772759a1a68;hpb=339f1956cc727eda788638644ef93ab7852b31cd;p=pspp diff --git a/src/data/variable.c b/src/data/variable.c index 5115d4a6e4..87e7d07823 100644 --- a/src/data/variable.c +++ b/src/data/variable.c @@ -63,6 +63,7 @@ const GEnumValue align[] = const GEnumValue measure[] = { + {MEASURE_UNKNOWN, "unknown", N_("Unknown")}, {MEASURE_NOMINAL, "nominal", N_("Nominal")}, {MEASURE_ORDINAL, "ordinal", N_("Ordinal")}, {MEASURE_SCALE, "scale", N_("Scale")}, @@ -139,7 +140,7 @@ var_create (const char *name, int width) v->leave = var_must_leave (v); type = val_type_from_width (width); v->alignment = var_default_alignment (type); - v->measure = var_default_measure (type); + v->measure = var_default_measure_for_type (type); v->role = ROLE_INPUT; v->display_width = var_default_display_width (width); v->print = v->write = var_default_formats (width); @@ -439,32 +440,28 @@ var_has_missing_values (const struct variable *v) return !mv_is_empty (&v->miss); } -/* Returns true if VALUE is in the given CLASS of missing values - in V, false otherwise. */ -bool -var_is_value_missing (const struct variable *v, const union value *value, - enum mv_class class) +/* Returns MV_SYSTEM if VALUE is system-missing, MV_USER if VALUE is + user-missing for V, and otherwise 0. */ +enum mv_class +var_is_value_missing (const struct variable *v, const union value *value) { - return mv_is_value_missing (&v->miss, value, class); + return mv_is_value_missing (&v->miss, value); } -/* Returns true if D is in the given CLASS of missing values in - V, false otherwise. - V must be a numeric variable. */ -bool -var_is_num_missing (const struct variable *v, double d, enum mv_class class) +/* Returns MV_SYSTEM if VALUE is system-missing, MV_USER if VALUE is + user-missing for V, and otherwise 0. V must be a numeric variable. */ +enum mv_class +var_is_num_missing (const struct variable *v, double d) { - return mv_is_num_missing (&v->miss, d, class); + return mv_is_num_missing (&v->miss, d); } -/* Returns true if S[] is a missing value for V, false otherwise. - S[] must contain exactly as many characters as V's width. - V must be a string variable. */ -bool -var_is_str_missing (const struct variable *v, const uint8_t s[], - enum mv_class class) +/* Returns MV_USER if VALUE is user-missing for V and otherwise 0. V must be + a string variable. */ +enum mv_class +var_is_str_missing (const struct variable *v, const uint8_t s[]) { - return mv_is_str_missing (&v->miss, s, class); + return mv_is_str_missing (&v->miss, s); } /* Returns variable V's value labels, @@ -813,7 +810,8 @@ var_has_label (const struct variable *v) bool measure_is_valid (enum measure m) { - return m == MEASURE_NOMINAL || m == MEASURE_ORDINAL || m == MEASURE_SCALE; + return (m == MEASURE_UNKNOWN || m == MEASURE_NOMINAL + || m == MEASURE_ORDINAL || m == MEASURE_SCALE); } /* Returns a string version of measurement level M, for display to a user. @@ -877,9 +875,38 @@ var_set_measure (struct variable *v, enum measure measure) used to reset a variable's measurement level to the default. */ enum measure -var_default_measure (enum val_type type) +var_default_measure_for_type (enum val_type type) +{ + return type == VAL_NUMERIC ? MEASURE_UNKNOWN : MEASURE_NOMINAL; +} + +/* Returns the default measurement level for a variable with the given + FORMAT, or MEASURE_UNKNOWN if there is no good default. */ +enum measure +var_default_measure_for_format (enum fmt_type format) { - return type == VAL_NUMERIC ? MEASURE_SCALE : MEASURE_NOMINAL; + if (format == FMT_DOLLAR) + return MEASURE_SCALE; + + switch (fmt_get_category (format)) + { + case FMT_CAT_BASIC: + case FMT_CAT_LEGACY: + case FMT_CAT_BINARY: + case FMT_CAT_HEXADECIMAL: + return MEASURE_UNKNOWN; + + case FMT_CAT_CUSTOM: + case FMT_CAT_DATE: + case FMT_CAT_TIME: + return MEASURE_SCALE; + + case FMT_CAT_DATE_COMPONENT: + case FMT_CAT_STRING: + return MEASURE_NOMINAL; + } + + NOT_REACHED (); } /* Returns true if M is a valid variable role, @@ -1330,15 +1357,16 @@ var_clear_vardict (struct variable *v) double var_force_valid_weight (const struct variable *wv, double w, bool *warn_on_invalid) { - if (w < 0.0 || (wv && var_is_num_missing (wv, w, MV_ANY))) - w = 0.0; - - if (w == 0.0 && warn_on_invalid != NULL && *warn_on_invalid) + if (w <= 0.0 || (wv ? var_is_num_missing (wv, w) : w == SYSMIS)) { - *warn_on_invalid = false; - msg (SW, _("At least one case in the data file had a weight value " - "that was user-missing, system-missing, zero, or " - "negative. These case(s) were ignored.")); + w = 0.0; + if (warn_on_invalid != NULL && *warn_on_invalid) + { + *warn_on_invalid = false; + msg (SW, _("At least one case in the data file had a weight value " + "that was user-missing, system-missing, zero, or " + "negative. These case(s) were ignored.")); + } } return w;