Avoided comparison of string variables to SYSMIS
authorJohn Darrington <john@darrington.wattle.id.au>
Sun, 10 Dec 2006 02:33:43 +0000 (02:33 +0000)
committerJohn Darrington <john@darrington.wattle.id.au>
Sun, 10 Dec 2006 02:33:43 +0000 (02:33 +0000)
src/data/ChangeLog
src/data/casefilter.c

index 3d06ed277e0db7b755fc4b6316eec77d5a4ef5ff..d64e89807698ec41e6950b6e295db6d1928318d1 100644 (file)
@@ -1,3 +1,9 @@
+Sun Dec 10 11:32:56 WST 2006 John Darrington <john@darrington.wattle.id.au>
+
+       * casefilter.c (casefilter_variable_missing): Avoided comparision of
+       string variables to SYSMIS.  Thanks to Ben Pfaff for reporting this
+       problem.
+
 Sat Dec  9 07:18:03 WST 2006 John Darrington <john@darrington.wattle.id.au>
 
        * value-labels.c (destroy_atoms): New function.
index add1d7f231c82feb3c15cc6a2a090405b81543aa..1494133359d2b3aaa3608269316f82190f215953 100644 (file)
@@ -28,7 +28,7 @@
 #include <data/variable.h>
 #include <data/missing-values.h>
 
-struct casefilter 
+struct casefilter
  {
    bool exclude_user_missing;
 
@@ -38,12 +38,12 @@ struct casefilter
 
 
 /* Returns true iff the entire case should be skipped */
-bool 
+bool
 casefilter_skip_case (const struct casefilter *filter, const struct ccase *c)
 {
   int i;
 
-  for (i = 0; i < filter->n_vars; ++i) 
+  for (i = 0; i < filter->n_vars; ++i)
     {
       if ( casefilter_variable_missing (filter, c, filter->vars[i]))
        return true;
@@ -53,30 +53,30 @@ casefilter_skip_case (const struct casefilter *filter, const struct ccase *c)
 }
 
 /* Returns true iff the variable V in case C is missing */
-bool 
-casefilter_variable_missing (const struct casefilter *filter, 
-                            const struct ccase *c, 
+bool
+casefilter_variable_missing (const struct casefilter *filter,
+                            const struct ccase *c,
                             const struct variable *var)
 {
   const union value *val = case_data (c, var->fv) ;
-      
-  if ( val->f == SYSMIS ) 
+
+  if ( var_get_type (var) != ALPHA && val->f == SYSMIS )
     return true;
 
-  if ( filter->exclude_user_missing && 
-       var_is_value_user_missing (var, val) ) 
+  if ( filter->exclude_user_missing &&
+       var_is_value_user_missing (var, val) )
     return true;
 
   return false;
 }
 
 /* Create a new casefilter.
-   If EXCL is true, then the filter  user missing values to be missing, 
+   If EXCL is true, then the filter  user missing values to be missing,
    otherwise they are considered at their face value.
    VARS is an array of variables which if *any* of them are missing.
    N_VARS is the size of VARS.
  */
-struct casefilter * 
+struct casefilter *
 casefilter_create (bool excl, struct variable **vars, int n_vars)
 {
   int i;
@@ -85,7 +85,7 @@ casefilter_create (bool excl, struct variable **vars, int n_vars)
   filter->exclude_user_missing = excl ;
   filter->vars = xnmalloc (n_vars, sizeof (*filter->vars) );
 
-  for ( i = 0 ; i < n_vars ; ++i ) 
+  for ( i = 0 ; i < n_vars ; ++i )
     filter->vars[i] = vars[i];
 
   filter->n_vars = n_vars ;
@@ -96,23 +96,23 @@ casefilter_create (bool excl, struct variable **vars, int n_vars)
 
 /* Add the variables in VARS to the list of variables for which the
    filter considers. N_VARS is the size of VARS */
-void 
-casefilter_add_variables (struct casefilter *filter, 
+void
+casefilter_add_variables (struct casefilter *filter,
                           struct variable **vars, int n_vars)
 {
   int i;
 
   filter->vars = xnrealloc (filter->vars, filter->n_vars + n_vars,
                           sizeof (*filter->vars) );
-                          
-  for ( i = 0 ; i < n_vars ; ++i ) 
+
+  for ( i = 0 ; i < n_vars ; ++i )
     filter->vars[i + filter->n_vars] = vars[i];
 
   filter->n_vars += n_vars ;
 }
 
 /* Destroy the filter FILTER */
-void 
+void
 casefilter_destroy (struct casefilter *filter)
 {
   free (filter->vars);