X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fvariable.c;h=42a07ee8bb5d3481bec1a4656f13bba1dd61a393;hb=3321d6ba64c5dc771c1d5a1833480fb4a6aaa795;hp=8758af35b429b6cc026aead9db207aeb283fc339;hpb=24c5f7c629e68801492d7ca1766953a2a954a820;p=pspp diff --git a/src/data/variable.c b/src/data/variable.c index 8758af35b4..42a07ee8bb 100644 --- a/src/data/variable.c +++ b/src/data/variable.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. + Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011, 2012, 2013, 2014, 2016 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -42,6 +42,42 @@ #include "gettext.h" #define _(msgid) gettext (msgid) +#define N_(msgid) (msgid) + +/* This should follow the definition in Gtk */ +typedef struct +{ + int value; + const char *name; + const char *label; +} GEnumValue; + +const GEnumValue align[] = + { + {ALIGN_LEFT, "left", N_("Left")}, + {ALIGN_RIGHT, "right", N_("Right")}, + {ALIGN_CENTRE, "center", N_("Center")}, + {0,0,0} + }; + +const GEnumValue measure[] = + { + {MEASURE_NOMINAL, "nominal", N_("Nominal")}, + {MEASURE_ORDINAL, "ordinal", N_("Ordinal")}, + {MEASURE_SCALE, "scale", N_("Scale")}, + {0,0,0} + }; + +const GEnumValue role[] = + { + {ROLE_INPUT, "input", N_("Input")}, + {ROLE_TARGET, "output", N_("Output")}, + {ROLE_BOTH, "both", N_("Both")}, + {ROLE_NONE, "none", N_("None")}, + {ROLE_PARTITION, "partition", N_("Partition")}, + {ROLE_SPLIT, "split", N_("Split")}, + {0,0,0} + }; /* A variable. */ struct variable @@ -771,20 +807,8 @@ measure_is_valid (enum measure m) const char * measure_to_string (enum measure m) { - switch (m) - { - case MEASURE_NOMINAL: - return _("Nominal"); - - case MEASURE_ORDINAL: - return _("Ordinal"); - - case MEASURE_SCALE: - return _("Scale"); - - default: - return "Invalid"; - } + assert (m == measure[m].value); + return gettext (measure[m].label); } /* Returns a string version of measurement level M, for use in PSPP command @@ -866,31 +890,10 @@ var_role_is_valid (enum var_role role) /* Returns a string version of ROLE, for display to a user. */ const char * -var_role_to_string (enum var_role role) +var_role_to_string (enum var_role r) { - switch (role) - { - case ROLE_INPUT: - return _("Input"); - - case ROLE_TARGET: - return _("Output"); - - case ROLE_BOTH: - return _("Both"); - - case ROLE_NONE: - return _("None"); - - case ROLE_PARTITION: - return _("Partition"); - - case ROLE_SPLIT: - return _("Split"); - - default: - return "Invalid"; - } + assert (r == role[r].value); + return gettext (role[r].label); } /* Returns a string version of ROLE, for use in PSPP comamnd syntax. */ @@ -967,12 +970,14 @@ var_set_display_width_quiet (struct variable *v, int new_width) void var_set_display_width (struct variable *v, int new_width) { - struct variable *ov = var_clone (v); - var_set_display_width_quiet (v, new_width); - dict_var_changed (v, VAR_TRAIT_DISPLAY_WIDTH, ov); + if (v->display_width != new_width) + { + struct variable *ov = var_clone (v); + var_set_display_width_quiet (v, new_width); + dict_var_changed (v, VAR_TRAIT_DISPLAY_WIDTH, ov); + } } - /* Returns the default display width for a variable of the given WIDTH, as set by var_create. The return value can be used to reset a variable's display width to the default. */ @@ -994,20 +999,8 @@ alignment_is_valid (enum alignment a) const char * alignment_to_string (enum alignment a) { - switch (a) - { - case ALIGN_LEFT: - return _("Left"); - - case ALIGN_RIGHT: - return _("Right"); - - case ALIGN_CENTRE: - return _("Center"); - - default: - return "Invalid"; - } + assert (a == align[a].value); + return gettext (align[a].label); } /* Returns a string version of alignment A, for use in PSPP command syntax. */ @@ -1310,3 +1303,29 @@ var_clear_vardict (struct variable *v) { v->vardict = NULL; } + + +/* + Returns zero, if W is a missing value for WV or if it is less than zero. + Typically used to force a numerical value into a valid weight. + + As a side effect, this function will emit a warning if the value + WARN_ON_INVALID points to a bool which is TRUE. That bool will be then + set to FALSE. + */ +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) + { + *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; +}