- return table->class->get_rule (table, axis, x, y);
-}
-\f
-struct table_unshared
- {
- struct table table;
- struct table *subtable;
- };
-
-static const struct table_class table_unshared_class;
-
-/* Takes ownership of TABLE and returns a table with the same contents but
- which is guaranteed not to be shared (as returned by table_is_shared()).
-
- If TABLE is unshared, just returns TABLE.
-
- The only real use for this function is to create a copy of TABLE in which
- the headers can be adjusted, which is a pretty specialized use case. */
-struct table *
-table_unshare (struct table *table)
-{
- if (!table_is_shared (table))
- return table;
- else
- {
- struct table_unshared *tiu = xmalloc (sizeof *tiu);
- table_init (&tiu->table, &table_unshared_class);
- table_set_nc (&tiu->table, table_nc (table));
- table_set_nr (&tiu->table, table_nr (table));
- table_set_hl (&tiu->table, table_hl (table));
- table_set_hr (&tiu->table, table_hr (table));
- table_set_ht (&tiu->table, table_ht (table));
- table_set_hb (&tiu->table, table_hb (table));
- tiu->subtable = table;
- return &tiu->table;
- }
-}
-
-static struct table_unshared *
-table_unshared_cast (const struct table *table)
-{
- assert (table->class == &table_unshared_class);
- return UP_CAST (table, struct table_unshared, table);
-}
-
-static void
-table_unshared_destroy (struct table *tiu_)
-{
- struct table_unshared *tiu = table_unshared_cast (tiu_);
- table_unref (tiu->subtable);
- free (tiu);
-}
-
-static void
-table_unshared_get_cell (const struct table *tiu_, int x, int y,
- struct table_cell *cell)
-{
- struct table_unshared *tiu = table_unshared_cast (tiu_);
- table_get_cell (tiu->subtable, x, y, cell);
-}
-
-static int
-table_unshared_get_rule (const struct table *tiu_,
- enum table_axis axis, int x, int y)
-{
- struct table_unshared *tiu = table_unshared_cast (tiu_);
- return table_get_rule (tiu->subtable, axis, x, y);
-}
-
-static const struct table_class table_unshared_class =
- {
- table_unshared_destroy,
- table_unshared_get_cell,
- table_unshared_get_rule,
- NULL, /* paste */
- NULL, /* select */
- };
-\f
-struct table_string
- {
- struct table table;
- char *string;
- unsigned int options;
- };
-
-static const struct table_class table_string_class;
-
-/* Returns a table that contains a single cell, whose contents are S with
- options OPTIONS (a combination of TAB_* values). */
-struct table *
-table_from_string (unsigned int options, const char *s)
-{
- struct table_string *ts = xmalloc (sizeof *ts);
- table_init (&ts->table, &table_string_class);
- ts->table.n[TABLE_HORZ] = ts->table.n[TABLE_VERT] = 1;
- ts->string = xstrdup (s);
- ts->options = options;
- return &ts->table;
-}
-
-static struct table_string *
-table_string_cast (const struct table *table)
-{
- assert (table->class == &table_string_class);
- return UP_CAST (table, struct table_string, table);
-}
-
-static void
-table_string_destroy (struct table *ts_)
-{
- struct table_string *ts = table_string_cast (ts_);
- free (ts->string);
- free (ts);
-}