work on PRINT encoding
[pspp] / src / math / categoricals.c
index 5aeb7e213c6d564f95f424321e42a9ace4b91112..a7cf3a114624d4de3a9ea5d184a516b85a1700fa 100644 (file)
@@ -165,8 +165,11 @@ struct categoricals
 
   struct pool *pool;
 
-  /* Missing values to be excluded */
-  enum mv_class exclude;
+  /* Missing values in the dependent varirable to be excluded */
+  enum mv_class dep_excl;
+
+  /* Missing values in the factor variables to be excluded */
+  enum mv_class fctr_excl;
 
   const void *aux1;
   void *aux2;
@@ -295,7 +298,7 @@ lookup_case (const struct hmap *map, const struct interaction *iact, const struc
 
 struct categoricals *
 categoricals_create (struct interaction *const*inter, size_t n_inter,
-                    const struct variable *wv, enum mv_class exclude)
+                    const struct variable *wv, enum mv_class dep_excl, enum mv_class fctr_excl)
 {
   size_t i;
   struct categoricals *cat = xmalloc (sizeof *cat);
@@ -307,7 +310,8 @@ categoricals_create (struct interaction *const*inter, size_t n_inter,
   cat->reverse_variable_map_short = NULL;
   cat->reverse_variable_map_long = NULL;
   cat->pool = pool_create ();
-  cat->exclude = exclude;
+  cat->dep_excl = dep_excl;
+  cat->fctr_excl = fctr_excl;
   cat->payload = NULL;
   cat->aux2 = NULL;
 
@@ -378,7 +382,7 @@ categoricals_update (struct categoricals *cat, const struct ccase *c)
       size_t hash;
       struct interaction_value *node;
 
-      if ( interaction_case_is_missing (iact, c, cat->exclude))
+      if ( interaction_case_is_missing (iact, c, cat->fctr_excl))
        continue;
 
       hash = interaction_case_hash (iact, c, 0);
@@ -697,8 +701,14 @@ categoricals_get_n_variables (const struct categoricals *cat)
 const struct ccase *
 categoricals_get_case_by_category_real (const struct categoricals *cat, int iact, int n)
 {
+  const struct interaction_value *vn;
+
   const struct interact_params *vp = &cat->iap[iact];
-  const struct interaction_value *vn = vp->reverse_interaction_value_map [n];
+
+  if ( n >= hmap_count (&vp->ivmap))
+    return NULL;
+
+  vn = vp->reverse_interaction_value_map [n];
 
   return vn->ccase;
 }
@@ -708,7 +718,12 @@ void *
 categoricals_get_user_data_by_category_real (const struct categoricals *cat, int iact, int n)
 {
   const struct interact_params *vp = &cat->iap[iact];
-  const struct interaction_value *iv = vp->reverse_interaction_value_map [n];
+  const struct interaction_value *iv ;
+
+  if ( n >= hmap_count (&vp->ivmap))
+    return NULL;
+
+  iv = vp->reverse_interaction_value_map [n];
 
   return iv->user_data;
 }