union
{
char *text;
- struct table *subtable;
+ struct table_item *subtable;
}
u;
+
+ size_t n_footnotes;
+ char **footnotes;
};
static const struct table_class tab_table_class;
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];
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)
{
- table_unref (subtable);
+ table_item_unref (subtable);
}
/* Places SUBTABLE as the content for cells (X1,X2)-(Y1,Y2) inclusive in TABLE
with options OPT. */
void
tab_subtable (struct tab_table *table, int x1, int y1, int x2, int y2,
- unsigned opt, struct table *subtable)
+ unsigned opt, struct table_item *subtable)
{
add_joined_cell (table, x1, y1, x2, y2, opt | TAB_SUBTABLE)->u.subtable
= subtable;
as a nested table but its contents become part of TABLE. */
void
tab_subtable_bare (struct tab_table *table, int x1, int y1, int x2, int y2,
- unsigned opt, struct table *subtable)
+ unsigned opt, struct table_item *subtable)
{
- assert (table_nc (subtable) == 1);
- assert (table_nr (subtable) == 1);
+ const struct table *t UNUSED = table_item_get_table (subtable);
+ assert (table_nc (t) == 1);
+ assert (table_nr (t) == 1);
tab_subtable (table, x1, y1, x2, y2, opt | TAB_BARE, subtable);
}
cell->inline_contents.options = opt;
cell->inline_contents.table = NULL;
+ cell->inline_contents.n_footnotes = 0;
cell->destructor = NULL;
if (opt & TAB_JOIN)
assert (opt & TAB_SUBTABLE);
/* This overwrites all of the members of CELL. */
- table_get_cell (jc->u.subtable, 0, 0, cell);
+ table_get_cell (table_item_get_table (jc->u.subtable), 0, 0, cell);
}
else
{
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];