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=e1c889ffe33b09967f3bcf798198ed825363fe05;hpb=f550aee00a62fe1d8baf62d83cd7efef6cc2ee92;p=pspp diff --git a/src/output/output-item.c b/src/output/output-item.c index e1c889ffe3..860678b25f 100644 --- a/src/output/output-item.c +++ b/src/output/output-item.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 2009 Free Software Foundation, Inc. + Copyright (C) 2009, 2011 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -16,15 +16,17 @@ #include -#include +#include "output/output-item-provider.h" #include #include -#include -#include +#include "libpspp/assertion.h" +#include "libpspp/cast.h" -#include "xalloc.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; }