Change how checking for missing values works.
[pspp] / src / data / variable.c
index 593e23ca720bcbc89bae8bfde8c6312d23f0ac9a..8acac77fb2072a937207f627d92b4b1fd584c4c6 100644 (file)
@@ -109,7 +109,7 @@ struct variable
     /* Used only for system and portable file input and output.
        See short-names.h. */
     char **short_names;
-    size_t short_name_cnt;
+    size_t n_short_names;
 
     /* Custom attributes. */
     struct attrset attributes;
@@ -128,12 +128,11 @@ static void var_set_name_quiet (struct variable *v, const char *name);
 struct variable *
 var_create (const char *name, int width)
 {
-  struct variable *v;
   enum val_type type;
 
   assert (width >= 0 && width <= MAX_STRING);
 
-  v = xzalloc (sizeof *v);
+  struct variable *v = XZALLOC (struct variable);
   var_set_name_quiet (v, name);
   v->width = width;
   mv_init (&v->miss, width);
@@ -440,32 +439,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);
 }
 \f
 /* Returns variable V's value labels,
@@ -572,7 +567,8 @@ static void
 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 (" "));
   ds_put_substring (str, ss);
@@ -1122,9 +1118,9 @@ var_must_leave (const struct variable *v)
    all if it hasn't been saved to or read from a system or
    portable file. */
 size_t
-var_get_short_name_cnt (const struct variable *var)
+var_get_n_short_names (const struct variable *var)
 {
-  return var->short_name_cnt;
+  return var->n_short_names;
 }
 
 /* Returns VAR's short name with the given IDX, if it has one
@@ -1134,7 +1130,7 @@ var_get_short_name_cnt (const struct variable *var)
 const char *
 var_get_short_name (const struct variable *var, size_t idx)
 {
-  return idx < var->short_name_cnt ? var->short_names[idx] : NULL;
+  return idx < var->n_short_names ? var->short_names[idx] : NULL;
 }
 
 /* Sets VAR's short name with the given IDX to the UTF-8 string SHORT_NAME.
@@ -1149,7 +1145,7 @@ var_set_short_name (struct variable *var, size_t idx, const char *short_name)
   struct variable *ov = var_clone (var);
 
   /* Clear old short name numbered IDX, if any. */
-  if (idx < var->short_name_cnt)
+  if (idx < var->n_short_names)
     {
       free (var->short_names[idx]);
       var->short_names[idx] = NULL;
@@ -1158,14 +1154,14 @@ var_set_short_name (struct variable *var, size_t idx, const char *short_name)
   /* Install new short name for IDX. */
   if (short_name != NULL)
     {
-      if (idx >= var->short_name_cnt)
+      if (idx >= var->n_short_names)
         {
-          size_t old_cnt = var->short_name_cnt;
+          size_t n_old = var->n_short_names;
           size_t i;
-          var->short_name_cnt = MAX (idx * 2, 1);
-          var->short_names = xnrealloc (var->short_names, var->short_name_cnt,
+          var->n_short_names = MAX (idx * 2, 1);
+          var->short_names = xnrealloc (var->short_names, var->n_short_names,
                                         sizeof *var->short_names);
-          for (i = old_cnt; i < var->short_name_cnt; i++)
+          for (i = n_old; i < var->n_short_names; i++)
             var->short_names[i] = NULL;
         }
       var->short_names[idx] = utf8_to_upper (short_name);
@@ -1180,11 +1176,11 @@ var_clear_short_names (struct variable *v)
 {
   size_t i;
 
-  for (i = 0; i < v->short_name_cnt; i++)
+  for (i = 0; i < v->n_short_names; i++)
     free (v->short_names[i]);
   free (v->short_names);
   v->short_names = NULL;
-  v->short_name_cnt = 0;
+  v->n_short_names = 0;
 }
 \f
 /* Relationship with dictionary. */
@@ -1330,7 +1326,7 @@ 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)))
+  if (w < 0.0 || (wv && var_is_num_missing (wv, w)))
     w = 0.0;
 
   if (w == 0.0 && warn_on_invalid != NULL && *warn_on_invalid)