X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Foutput%2Ftab.c;h=db384bdfc93408b434b08211ac774c03f60251a4;hb=9be3ebc378cac9467044f7240b1c42ab1bfe01c2;hp=bb6b82a2da5e843e47b3ac123eb26d23caead909;hpb=bf3af6fb69dc94a6b3010e11e5d359e9e4abd5ba;p=pspp diff --git a/src/output/tab.c b/src/output/tab.c index bb6b82a2da..db384bdfc9 100644 --- a/src/output/tab.c +++ b/src/output/tab.c @@ -59,6 +59,9 @@ struct tab_joined_cell struct table_item *subtable; } u; + + size_t n_footnotes; + char **footnotes; }; static const struct table_class tab_table_class; @@ -85,6 +88,7 @@ tab_create (int nc, int nr) table_set_nr (&t->table, nr); t->title = NULL; + t->caption = NULL; t->cf = nc; t->cc = pool_calloc (t->container, nr * nc, sizeof *t->cc); t->ct = pool_malloc (t->container, nr * nc); @@ -544,6 +548,8 @@ add_joined_cell (struct tab_table *table, int x1, int y1, int x2, int y2, j->d[TABLE_VERT][0] = y1 + table->row_ofs; j->d[TABLE_HORZ][1] = ++x2 + table->col_ofs; j->d[TABLE_VERT][1] = ++y2 + table->row_ofs; + j->n_footnotes = 0; + j->footnotes = NULL; { void **cc = &table->cc[x1 + y1 * table->cf]; @@ -597,6 +603,32 @@ tab_joint_text_format (struct tab_table *table, int x1, int y1, int x2, int y2, add_joined_cell (table, x1, y1, x2, y2, opt)->u.text = s; } +void +tab_footnote (struct tab_table *table, int x, int y, const char *format, ...) +{ + int index = x + y * table->cf; + unsigned char opt = table->ct[index]; + struct tab_joined_cell *j; + va_list args; + + if (opt & TAB_JOIN) + j = table->cc[index]; + else + { + char *text = table->cc[index]; + + j = add_joined_cell (table, x, y, x, y, table->ct[index]); + j->u.text = text ? text : xstrdup (""); + } + + j->footnotes = xrealloc (j->footnotes, + (j->n_footnotes + 1) * sizeof *j->footnotes); + + va_start (args, format); + j->footnotes[j->n_footnotes++] = pool_vasprintf (table->container, format, args); + va_end (args); +} + static void subtable_unref (void *subtable) { @@ -651,11 +683,24 @@ tab_title (struct tab_table *t, const char *title, ...) va_end (args); } +/* Set the caption of table T to CAPTION, which is formatted as if + passed to printf(). */ +void +tab_caption (struct tab_table *t, const char *caption, ...) +{ + va_list args; + + free (t->caption); + va_start (args, caption); + t->caption = xvasprintf (caption, args); + va_end (args); +} + /* Easy, type-safe way to submit a tab table to som. */ void tab_submit (struct tab_table *t) { - table_item_submit (table_item_create (&t->table, t->title)); + table_item_submit (table_item_create (&t->table, t->title, t->caption)); } /* Editing. */ @@ -739,6 +784,8 @@ tab_destroy (struct table *table) struct tab_table *t = tab_cast (table); free (t->title); t->title = NULL; + free (t->caption); + t->caption = NULL; pool_destroy (t->container); } @@ -752,6 +799,7 @@ tab_get_cell (const struct table *table, int x, int y, struct table_cell *cell) cell->inline_contents.options = opt; cell->inline_contents.table = NULL; + cell->inline_contents.n_footnotes = 0; cell->destructor = NULL; if (opt & TAB_JOIN) @@ -777,6 +825,9 @@ tab_get_cell (const struct table *table, int x, int y, struct table_cell *cell) cell->inline_contents.text = jc->u.text; } + cell->inline_contents.footnotes = jc->footnotes; + cell->inline_contents.n_footnotes = jc->n_footnotes; + cell->d[TABLE_HORZ][0] = jc->d[TABLE_HORZ][0]; cell->d[TABLE_HORZ][1] = jc->d[TABLE_HORZ][1]; cell->d[TABLE_VERT][0] = jc->d[TABLE_VERT][0];