added checks for pointers to coefficient
authorJason Stover <jhs@math.gcsu.edu>
Sat, 1 Mar 2008 20:53:00 +0000 (20:53 +0000)
committerJason Stover <jhs@math.gcsu.edu>
Sat, 1 Mar 2008 20:53:00 +0000 (20:53 +0000)
src/math/ChangeLog
src/math/coefficient.c

index 2c0df305822838c8d3aa2c9aa0fcb76fa2a7f688..48b30627f8444d6d9238357f7ca08a5aa7a12645 100644 (file)
@@ -1,3 +1,12 @@
+2008-03-01  Jason Stover  <jhs@math.gcsu.edu>
+
+       * coefficient.c (pspp_coeff_init): Ensure first arg is not a null
+       pointer.
+
+       * coefficient.c (pspp_linreg_get_coeff): Make sure we don't return
+       a result beyond the last coefficient, or start with a coefficient
+       beyond the last one if there is only one.
+
 2007-06-06  Ben Pfaff  <blp@gnu.org>
 
        Adapt case sources, sinks, and clients of procedure code to the
index 44b7c0d3219b764b827f704a6b807c60a9adf2e0..1868bda4aa6ceb30b85a4b77191c70c4fc83f6f7 100644 (file)
@@ -55,6 +55,7 @@ pspp_coeff_init (struct pspp_coeff ** c, const struct design_matrix *X)
   size_t i;
   int n_vals = 1;
 
+  assert (c != NULL);
   for (i = 0; i < X->m->size2; i++)
     {
       c[i] = xmalloc (sizeof (*c[i]));
@@ -182,7 +183,7 @@ const struct pspp_coeff *
 pspp_linreg_get_coeff (const pspp_linreg_cache * c,
                       const struct variable *v, const union value *val)
 {
-  int i = 1;
+  int i;
   struct pspp_coeff *result = NULL;
   const struct variable *tmp = NULL;
 
@@ -194,7 +195,10 @@ pspp_linreg_get_coeff (const pspp_linreg_cache * c,
     {
       return NULL;
     }
-
+  /*
+    C->N_COEFFS == 1 means regression through the origin.
+   */
+  i = (c->n_coeffs > 1) ? 1 : 0;
   result = c->coeff[i];
   tmp = pspp_coeff_get_var (result, 0);
   while (tmp != v && i < c->n_coeffs)
@@ -203,7 +207,7 @@ pspp_linreg_get_coeff (const pspp_linreg_cache * c,
       tmp = pspp_coeff_get_var (result, 0);
       i++;
     }
-  if (i > c->n_coeffs)
+  if (i >= c->n_coeffs)
     {
       return NULL;
     }