X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Foutput%2Foutput-item.c;h=860678b25f99932e3949fa23bd7cc404f3e2b164;hb=855eaf1506f0ea76a8bbfb3bbfd456524f4edeca;hp=dd4e70c2ee48b8591813767374d166b8a1615b0e;hpb=81579d9e9f994fb2908f50af41c3eb033d216e58;p=pspp diff --git a/src/output/output-item.c b/src/output/output-item.c index dd4e70c2ee..860678b25f 100644 --- a/src/output/output-item.c +++ b/src/output/output-item.c @@ -25,6 +25,8 @@ #include "libpspp/cast.h" #include "gl/xalloc.h" + +#include "gettext.h" /* Increases ITEM's reference count, indicating that it has an additional owner. An output item that is shared among multiple owners must not be @@ -46,7 +48,11 @@ output_item_unref (struct output_item *item) { assert (item->ref_cnt > 0); if (--item->ref_cnt == 0) - item->class->destroy (item); + { + char *label = item->label; + item->class->destroy (item); + free (label); + } } } @@ -57,17 +63,34 @@ output_item_is_shared (const struct output_item *item) { return item->ref_cnt > 1; } - -/* Initializes ITEM as an output item of the specified CLASS, initially with a - reference count of 1. - An output item is an abstract class, that is, a plain output_item is not - useful on its own. Thus, this function is normally called from the - initialization function of some subclass of output_item. */ +/* Returns the label for ITEM, which the caller must not modify or free. */ +const char * +output_item_get_label (const struct output_item *item) +{ + return item->label ? item->label : item->class->get_label (item); +} + +/* Sets the label for ITEM to LABEL. The caller retains ownership of LABEL. + If LABEL is nonnull, it overrides any previously set label and the default + label. If LABEL is null, ITEM will now use its default label. + + ITEM must not be shared. */ +void +output_item_set_label (struct output_item *item, const char *label) +{ + output_item_set_label_nocopy (item, label ? xstrdup (label) : NULL); +} + +/* Sets the label for ITEM to LABEL, transferring ownership of LABEL to ITEM. + If LABEL is nonnull, it overrides any previously set label and the default + label. If LABEL is null, ITEM will now use its default label. + + ITEM must not be shared. */ void -output_item_init (struct output_item *item, - const struct output_item_class *class) +output_item_set_label_nocopy (struct output_item *item, char *label) { - item->class = class; - item->ref_cnt = 1; + assert (!output_item_is_shared (item)); + free (item->label); + item->label = label; }