const GEnumValue measure[] =
{
+ {MEASURE_UNKNOWN, "unknown", N_("Unknown")},
{MEASURE_NOMINAL, "nominal", N_("Nominal")},
{MEASURE_ORDINAL, "ordinal", N_("Ordinal")},
{MEASURE_SCALE, "scale", N_("Scale")},
};
\f
-static void var_set_print_format_quiet (struct variable *v, const struct fmt_spec *print);
-static void var_set_write_format_quiet (struct variable *v, const struct fmt_spec *write);
+static void var_set_print_format_quiet (struct variable *v, struct fmt_spec);
+static void var_set_write_format_quiet (struct variable *v, struct fmt_spec);
static void var_set_label_quiet (struct variable *v, const char *label);
static void var_set_name_quiet (struct variable *v, const char *name);
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);
if (print)
{
- var_set_print_format_quiet (v, print);
+ var_set_print_format_quiet (v, *print);
traits |= VAR_TRAIT_PRINT_FORMAT;
}
if (write)
{
- var_set_write_format_quiet (v, write);
+ var_set_write_format_quiet (v, *write);
traits |= VAR_TRAIT_WRITE_FORMAT;
}
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);
}
\f
/* Returns variable V's value labels,
append_value (const struct variable *v, const union value *value,
struct string *str)
{
- char *s = data_out (value, var_get_encoding (v), &v->print,
+ char *s = data_out (value, var_get_encoding (v), v->print,
settings_get_fmt_settings ());
struct substring ss = ss_cstr (s);
ss_rtrim (&ss, ss_cstr (" "));
/* Print and write formats. */
/* Returns V's print format specification. */
-const struct fmt_spec *
+struct fmt_spec
var_get_print_format (const struct variable *v)
{
- return &v->print;
+ return v->print;
}
/* Sets V's print format specification to PRINT, which must be a
(ordinarily an output format, but input formats are not
rejected). */
static void
-var_set_print_format_quiet (struct variable *v, const struct fmt_spec *print)
+var_set_print_format_quiet (struct variable *v, struct fmt_spec print)
{
- if (!fmt_equal (&v->print, print))
+ if (!fmt_equal (v->print, print))
{
assert (fmt_check_width_compat (print, v->width));
- v->print = *print;
+ v->print = print;
}
}
(ordinarily an output format, but input formats are not
rejected). */
void
-var_set_print_format (struct variable *v, const struct fmt_spec *print)
+var_set_print_format (struct variable *v, struct fmt_spec print)
{
struct variable *ov = var_clone (v);
var_set_print_format_quiet (v, print);
}
/* Returns V's write format specification. */
-const struct fmt_spec *
+struct fmt_spec
var_get_write_format (const struct variable *v)
{
- return &v->write;
+ return v->write;
}
/* Sets V's write format specification to WRITE, which must be a
(ordinarily an output format, but input formats are not
rejected). */
static void
-var_set_write_format_quiet (struct variable *v, const struct fmt_spec *write)
+var_set_write_format_quiet (struct variable *v, struct fmt_spec write)
{
- if (!fmt_equal (&v->write, write))
+ if (!fmt_equal (v->write, write))
{
assert (fmt_check_width_compat (write, v->width));
- v->write = *write;
+ v->write = write;
}
}
(ordinarily an output format, but input formats are not
rejected). */
void
-var_set_write_format (struct variable *v, const struct fmt_spec *write)
+var_set_write_format (struct variable *v, struct fmt_spec write)
{
struct variable *ov = var_clone (v);
var_set_write_format_quiet (v, write);
V's width (ordinarily an output format, but input formats are
not rejected). */
void
-var_set_both_formats (struct variable *v, const struct fmt_spec *format)
+var_set_both_formats (struct variable *v, struct fmt_spec format)
{
struct variable *ov = var_clone (v);
var_set_print_format_quiet (v, format);
/* Sets V's variable label to UTF-8 encoded string LABEL, stripping off leading
and trailing white space. If LABEL is a null pointer or if LABEL is an
- empty string (after stripping white space), then V's variable label (if any)
- is removed. */
+ empty string, then V's variable label (if any) is removed. */
static void
var_set_label_quiet (struct variable *v, const char *label)
{
free (v->label);
v->label = NULL;
- if (label != NULL && label[strspn (label, CC_SPACES)])
+ if (label != NULL && label[0])
v->label = xstrdup (label);
ds_destroy (&v->name_and_label);
ds_init_empty (&v->name_and_label);
}
-
-
/* Sets V's variable label to UTF-8 encoded string LABEL, stripping off leading
and trailing white space. If LABEL is a null pointer or if LABEL is an
empty string (after stripping white space), then V's variable label (if any)
dict_var_changed (v, VAR_TRAIT_LABEL, ov);
}
-
/* Removes any variable label from V. */
void
var_clear_label (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.
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_SCALE : MEASURE_NOMINAL;
+ 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)
+{
+ 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 ();
}
\f
/* Returns true if M is a valid variable role,
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;