output: Make tables reference-counted.
authorBen Pfaff <blp@gnu.org>
Sat, 20 Jun 2009 05:52:40 +0000 (22:52 -0700)
committerBen Pfaff <blp@gnu.org>
Sat, 20 Jun 2009 05:57:19 +0000 (22:57 -0700)
Adding a reference count to tab_table allows output drivers to retain
a copy of a table even after the main output engine is done.  This
will be useful for the GUI output driver.

src/output/table.c
src/output/table.h

index 9457923ab8f8c2e517fe6e2a5a74ac27705156f0..1b052888ebc0db42bd41ad7ab5b6978da8bc5f5c 100644 (file)
@@ -62,6 +62,7 @@ tab_create (int nc, int nr, int reallocable UNUSED)
   struct tab_table *t;
 
   t = pool_create_container (struct tab_table, container);
+  t->ref_cnt = 1;
   t->col_style = TAB_COL_NONE;
   t->col_group = 0;
   t->title = NULL;
@@ -86,17 +87,28 @@ tab_create (int nc, int nr, int reallocable UNUSED)
   return t;
 }
 
-/* Destroys table T. */
+/* Increases T's reference count and, if this causes T's
+   reference count to reach 0, destroys T. */
 void
 tab_destroy (struct tab_table *t)
 {
-  assert (t != NULL);
+  assert (t->ref_cnt > 0);
+  if (--t->ref_cnt > 0)
+    return;
   if (t->dim_free != NULL)
     t->dim_free (t->dim_aux);
   free (t->title);
   pool_destroy (t->container);
 }
 
+/* Increases T's reference count. */
+void
+tab_ref (struct tab_table *t)
+{
+  assert (t->ref_cnt > 0);
+  t->ref_cnt++;
+}
+
 /* Sets the width and height of a table, in columns and rows,
    respectively.  Use only to reduce the size of a table, since it
    does not change the amount of allocated memory. */
index 516db6a52a7f44e5fe9e6a853aaf1fb63294587b..03c981a30cc1a76c028d5c05108f0d51b2b42cc6 100644 (file)
@@ -76,6 +76,7 @@ typedef void tab_dim_free_func (void *aux);
 struct tab_table
   {
     struct pool *container;
+    int ref_cnt;                /* Reference count. */
 
     /* Contents. */
     int col_style;             /* Columns: One of TAB_COL_*. */
@@ -129,6 +130,7 @@ struct tab_rendering
 /* Tables. */
 struct tab_table *tab_create (int nc, int nr, int reallocable);
 void tab_destroy (struct tab_table *);
+void tab_ref (struct tab_table *);
 void tab_resize (struct tab_table *, int nc, int nr);
 void tab_realloc (struct tab_table *, int nc, int nr);
 void tab_headers (struct tab_table *, int l, int r, int t, int b);