Fixed a bug causing pspp to crash when computed variables had no format
[pspp-builds.git] / src / tab.c
index 8dc704ffe665d63eb8c2f4da6a92e4c48ca81feb..fbb292fdbb84b6639a844b26a1d689df87e1fc31 100644 (file)
--- a/src/tab.c
+++ b/src/tab.c
@@ -115,6 +115,7 @@ tab_destroy (struct tab_table *t)
 {
   assert (t != NULL);
   pool_destroy (t->container);
+  t=0;
 }
 
 /* Sets the width and height of a table, in columns and rows,
@@ -251,6 +252,12 @@ tab_vline (struct tab_table *t, int style, int x, int y1, int y2)
   int y;
 
   assert (t != NULL);
+  assert (x  > 0);
+  assert (x  < t->nc);
+  assert (y1 >= 0);
+  assert (y2 >= y1);
+  assert (y2 <=  t->nr);
+
 #if GLOBAL_DEBUGGING
   if (x + t->col_ofs < 0 || x + t->col_ofs > t->nc
       || y1 + t->row_ofs < 0 || y1 + t->row_ofs >= t->nr
@@ -287,20 +294,12 @@ tab_hline (struct tab_table * t, int style, int x1, int x2, int y)
   int x;
 
   assert (t != NULL);
-#if GLOBAL_DEBUGGING
-  if (x1 + t->col_ofs < 0 || x1 + t->col_ofs >= t->nc 
-      || x2 + t->col_ofs < 0 || x2 + t->col_ofs >= t->nc
-      || y + t->row_ofs < 0 || y + t->row_ofs > t->nr)
-    {
-      printf (_("bad hline: x=(%d+%d=%d,%d+%d=%d) y=%d+%d=%d "
-               "in table size (%d,%d)\n"),
-             x1, t->col_ofs, x1 + t->col_ofs,
-             x2, t->col_ofs, x2 + t->col_ofs,
-             y, t->row_ofs, y + t->row_ofs,
-             t->nc, t->nr);
-      return;
-    }
-#endif
+
+  assert (y >= 0);
+  assert (y < t->nr);
+  assert (x2 >= x1 );
+  assert (x1 >= 0 );
+  assert (x2 < t->nc);
 
   x1 += t->col_ofs;
   x2 += t->col_ofs;
@@ -326,6 +325,14 @@ tab_box (struct tab_table *t, int f_h, int f_v, int i_h, int i_v,
         int x1, int y1, int x2, int y2)
 {
   assert (t != NULL);
+
+  assert (x2 >= x1);
+  assert (y2 >= y1);
+  assert (x1 >= 0);
+  assert (y1 >= 0);
+  assert (x2 < t->nc);
+  assert (y2 < t->nr);
+
 #if GLOBAL_DEBUGGING
   if (x1 + t->col_ofs < 0 || x1 + t->col_ofs >= t->nc 
       || x2 + t->col_ofs < 0 || x2 + t->col_ofs >= t->nc
@@ -563,7 +570,6 @@ tab_value (struct tab_table *table, int c, int r, unsigned char opt,
           const union value *v, const struct fmt_spec *f)
 {
   char *contents;
-  union value temp_val;
 
   assert (table != NULL && v != NULL && f != NULL);
 #if GLOBAL_DEBUGGING
@@ -584,11 +590,6 @@ tab_value (struct tab_table *table, int c, int r, unsigned char opt,
   ls_init (&table->cc[c + r * table->cf], contents, f->w);
   table->ct[c + r * table->cf] = opt;
   
-  if (formats[f->type].cat & FCAT_STRING)
-    {
-      temp_val.c = (char *) v->s;
-      v = &temp_val;
-    }
   data_out (contents, f, v);
 }
 
@@ -602,9 +603,15 @@ tab_float (struct tab_table *table, int c, int r, unsigned char opt,
   char buf[40], *cp;
   
   struct fmt_spec f;
+  union value double_value;
 
   assert (table != NULL && w <= 40);
   
+  assert (c >= 0);
+  assert (c < table->nc);
+  assert (r >= 0);
+  assert (r < table->nr);
+
   f.type = FMT_F;
   f.w = w;
   f.d = d;
@@ -623,7 +630,9 @@ tab_float (struct tab_table *table, int c, int r, unsigned char opt,
     }
 #endif
 
-  data_out (buf, &f, (union value *) &val);
+  double_value.f = val;
+  data_out (buf, &f, &double_value);
+
   cp = buf;
   while (isspace ((unsigned char) *cp) && cp < &buf[w])
     cp++;
@@ -643,6 +652,13 @@ tab_text (struct tab_table *table, int c, int r, unsigned opt, const char *text,
   va_list args;
 
   assert (table != NULL && text != NULL);
+
+  assert (c >= 0 );
+  assert (r >= 0 );
+  assert (c < table->nc);
+  assert (r < table->nr);
+  
+
 #if GLOBAL_DEBUGGING
   if (c + table->col_ofs < 0 || r + table->row_ofs < 0
       || c + table->col_ofs >= table->nc
@@ -672,6 +688,14 @@ tab_joint_text (struct tab_table *table, int x1, int y1, int x2, int y2,
   struct tab_joined_cell *j;
 
   assert (table != NULL && text != NULL);
+
+  assert (x1 >= 0);
+  assert (y1 >= 0);
+  assert (y2 >= y1);
+  assert (x2 >= x1);
+  assert (y2 < table->nr);
+  assert (x2 < table->nc);
+
 #if GLOBAL_DEBUGGING
   if (x1 + table->col_ofs < 0 || x1 + table->col_ofs >= table->nc
       || y1 + table->row_ofs < 0 || y1 + table->row_ofs >= table->nr
@@ -1236,7 +1260,7 @@ struct som_table_class tab_table_class =
 
    FIXME: Doesn't use r1?  Huh?  */
 static int
-render_strip (int x, int y, int r, int c1, int c2, int r1 unused, int r2)
+render_strip (int x, int y, int r, int c1, int c2, int r1 UNUSED, int r2)
 {
   int x_origin = x;
 
@@ -1318,8 +1342,7 @@ render_strip (int x, int y, int r, int c1, int c2, int r1 unused, int r2)
                    {
                      j->hit = tab_hit;
 
-                     if (j->x1 == c / 2 && j->y1 == r / 2
-                         && j->x2 <= c2 && j->y2 <= r2)
+                     if (j->x1 == c / 2 && j->y1 == r / 2)
                        {
                          struct outp_text text;
 
@@ -1333,15 +1356,15 @@ render_strip (int x, int y, int r, int c1, int c2, int r1 unused, int r2)
                            int c;
 
                            for (c = j->x1, text.h = -t->wrv[j->x2];
-                                c < j->x2; c++)
-                             text.h += t->w[c] + t->wrv[c + 1];
+                                c < j->x2 && c < c2 / 2; c++) 
+                                text.h += t->w[c] + t->wrv[c + 1]; 
                          }
                          
                          {
                            int r;
 
                            for (r = j->y1, text.v = -t->hrh[j->y2];
-                                r < j->y2; r++)
+                                r < j->y2 && r < r2 / 2; r++)
                              text.v += t->h[r] + t->hrh[r + 1];
                          }
                          d->class->text_draw (d, &text);