X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Foutput%2Ftable-item.c;h=a1595479bbf5bde005fc9734085b471e8f5c0cff;hb=ac2fba558fc64d7f1a554e9388d5adfe5ad22f0e;hp=1308cb86503cddd887354bbdac1d13c9c6798555;hpb=01d6db8119ca4553d61841f2a9248712d4c6e0dc;p=pspp diff --git a/src/output/table-item.c b/src/output/table-item.c index 1308cb8650..a1595479bb 100644 --- a/src/output/table-item.c +++ b/src/output/table-item.c @@ -24,6 +24,7 @@ #include "libpspp/cast.h" #include "output/driver.h" #include "output/output-item-provider.h" +#include "output/pivot-table.h" #include "output/table-item.h" #include "gl/xalloc.h" @@ -35,8 +36,7 @@ table_item_text_create (const char *content) return NULL; struct table_item_text *text = xmalloc (sizeof *text); - *text = (struct table_item_text) { .content = xstrdup (content), - .halign = TAB_LEFT }; + *text = (struct table_item_text) { .content = xstrdup (content) }; return text; } @@ -52,8 +52,7 @@ table_item_text_clone (const struct table_item_text *old) .footnotes = xmemdup (old->footnotes, old->n_footnotes * sizeof *old->footnotes), .n_footnotes = old->n_footnotes, - .style = cell_style_clone (NULL, old->style), - .halign = old->halign, + .style = area_style_clone (NULL, old->style), }; return new; } @@ -65,11 +64,61 @@ table_item_text_destroy (struct table_item_text *text) { free (text->content); free (text->footnotes); - cell_style_free (text->style); + area_style_free (text->style); free (text); } } +void +table_item_layer_copy (struct table_item_layer *dst, + const struct table_item_layer *src) +{ + dst->content = xstrdup (src->content); + dst->footnotes = xmemdup (src->footnotes, + src->n_footnotes * sizeof *src->footnotes); + dst->n_footnotes = src->n_footnotes; +} + +void +table_item_layer_uninit (struct table_item_layer *layer) +{ + if (layer) + { + free (layer->content); + free (layer->footnotes); + } +} + +struct table_item_layers * +table_item_layers_clone (const struct table_item_layers *old) +{ + if (!old) + return NULL; + + struct table_item_layers *new = xmalloc (sizeof *new); + *new = (struct table_item_layers) { + .layers = xnmalloc (old->n_layers, sizeof *new->layers), + .n_layers = old->n_layers, + .style = area_style_clone (NULL, old->style), + }; + for (size_t i = 0; i < new->n_layers; i++) + table_item_layer_copy (&new->layers[i], &old->layers[i]); + return new; +} + +void +table_item_layers_destroy (struct table_item_layers *layers) +{ + if (layers) + { + for (size_t i = 0; i < layers->n_layers; i++) + table_item_layer_uninit (&layers->layers[i]); + free (layers->layers); + area_style_free (layers->style); + free (layers); + } +} + /* Initializes ITEM as a table item for rendering TABLE. The new table item initially has the specified TITLE and CAPTION, which may each be NULL. The caller retains ownership of TITLE and CAPTION. */ @@ -82,6 +131,7 @@ table_item_create (struct table *table, const char *title, const char *caption) item->title = table_item_text_create (title); item->layers = NULL; item->caption = table_item_text_create (caption); + item->pt = NULL; return item; } @@ -116,7 +166,7 @@ table_item_set_title (struct table_item *item, /* Returns ITEM's layers, which will be a null pointer if no layers have been set. */ -const struct table_item_text * +const struct table_item_layers * table_item_get_layers (const struct table_item *item) { return item->layers; @@ -129,11 +179,11 @@ table_item_get_layers (const struct table_item *item) This function may only be used on a table_item that is unshared. */ void table_item_set_layers (struct table_item *item, - const struct table_item_text *layers) + const struct table_item_layers *layers) { assert (!table_item_is_shared (item)); - table_item_text_destroy (item->layers); - item->layers = table_item_text_clone (layers); + table_item_layers_destroy (item->layers); + item->layers = table_item_layers_clone (layers); } /* Returns ITEM's caption, which is a null pointer if no caption has been @@ -171,13 +221,15 @@ table_item_destroy (struct output_item *output_item) { struct table_item *item = to_table_item (output_item); table_item_text_destroy (item->title); - table_item_text_destroy (item->layers); table_item_text_destroy (item->caption); + table_item_layers_destroy (item->layers); + pivot_table_unref (item->pt); table_unref (item->table); free (item); } const struct output_item_class table_item_class = { + "table", table_item_destroy, };