Use data_out_pool in crosstabs.q
authorJohn Darrington <john@darrington.wattle.id.au>
Sat, 18 Jul 2009 10:08:04 +0000 (12:08 +0200)
committerJohn Darrington <john@darrington.wattle.id.au>
Sat, 18 Jul 2009 10:08:04 +0000 (12:08 +0200)
We were erroneously allocating a buffer before
the size of the contents were known.  Using
data_out_pool avoids this problem.  Thanks to
Ben Pfaff for pointing this out.

src/language/stats/crosstabs.q

index 3c689ebc494c581d1906d5e0ee6d0c92be18f6b3..e3f54c817630178cdca465f50d40f8baf9693b64 100644 (file)
@@ -1514,7 +1514,6 @@ table_value_missing (struct crosstabs_proc *proc,
                     const union value *v, const struct variable *var)
 {
   struct substring s;
-  char *ss;
   const struct fmt_spec *print = var_get_print_format (var);
 
   const char *label = var_lookup_value_label (var, v);
@@ -1524,11 +1523,8 @@ table_value_missing (struct crosstabs_proc *proc,
       return;
     }
 
-  s.string = tab_alloc (table, print->w);
-  ss = data_out (v, dict_get_encoding (proc->dict), print);
-  strcpy (s.string, ss);
-  free (ss);
-  s.length = print->w;
+  s = ss_cstr (data_out_pool (v, dict_get_encoding (proc->dict), print,
+                            table->container));
   if (proc->exclude == MV_NEVER && var_is_num_missing (var, v->f, MV_USER))
     s.string[s.length++] = 'M';
   while (s.length && *s.string == ' ')
@@ -1566,14 +1562,10 @@ format_cell_entry (struct tab_table *table, int c, int r, double value,
   const struct fmt_spec f = {FMT_F, 10, 1};
   union value v;
   struct substring s;
-  char *ss;
 
-  s.length = 10;
-  s.string = tab_alloc (table, 16);
   v.f = value;
-  ss = data_out (&v, dict_get_encoding (dict), &f);
-  strcpy (s.string, ss);
-  free (ss);
+  s = ss_cstr (data_out_pool (&v, dict_get_encoding (dict), &f, table->container));
+
   while (*s.string == ' ')
     {
       s.length--;