X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fvalue-labels.h;h=6cb5259edb2fe22a28b53b49bba4a8e2e9fb1b1c;hb=81579d9e9f994fb2908f50af41c3eb033d216e58;hp=ad21a6d28ae3a1e4044f7c110da555cf1a8c1375;hpb=dcf9b154cbcaa35c3d8459a201b77eec8bcb30bd;p=pspp-builds.git diff --git a/src/data/value-labels.h b/src/data/value-labels.h index ad21a6d2..6cb5259e 100644 --- a/src/data/value-labels.h +++ b/src/data/value-labels.h @@ -1,62 +1,99 @@ -/* PSPP - computes sample statistics. - Copyright (C) 1997-9, 2000 Free Software Foundation, Inc. - Written by Ben Pfaff . +/* PSPP - a program for statistical analysis. + Copyright (C) 1997-9, 2000, 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 the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. + 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 + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. */ + along with this program. If not, see . */ -#ifndef VAL_LABS_H -#define VAL_LABS_H 1 +/* Sets of value labels. + struct val_labs represents a mapping from `union value's to + strings. The `union value's in the mapping all have the same + width. If this width is numeric or short string, the mapping + may contain any number of entries; long string mappings are + always empty. */ + +#ifndef DATA_VALUE_LABELS_H +#define DATA_VALUE_LABELS_H 1 + +#include #include -#include "variable.h" +#include "data/value.h" +#include "libpspp/hmap.h" + +/* One value label. + + A value label is normally part of a struct val_labs (see + below). */ +struct val_lab + { + struct hmap_node node; /* Node in hash map. */ + union value value; /* The value being labeled. */ + const char *label; /* An interned string. */ + }; -struct val_labs; +/* Returns the value in VL. The caller must not modify or free + the returned value. -struct val_lab + The width of the returned value cannot be determined directly + from VL. It may be obtained by calling val_labs_get_width on + the val_labs struct that VL is in. */ +static inline const union value *val_lab_get_value (const struct val_lab *vl) +{ + return &vl->value; +} + +/* Returns the label in VL. The caller must not modify or free the returned + value. */ +static inline const char * +val_lab_get_label (const struct val_lab *vl) +{ + return vl->label; +} + +/* A set of value labels. */ +struct val_labs { - union value value; - const char *label; + int width; /* 0=numeric, otherwise string width. */ + struct hmap labels; /* Hash table of `struct int_val_lab's. */ }; +/* Creating and destroying sets of value labels. */ struct val_labs *val_labs_create (int width); -struct val_labs *val_labs_copy (const struct val_labs *); -void val_labs_set_width (struct val_labs *, int new_width); -void val_labs_destroy (struct val_labs *); +struct val_labs *val_labs_clone (const struct val_labs *); void val_labs_clear (struct val_labs *); +void val_labs_destroy (struct val_labs *); size_t val_labs_count (const struct val_labs *); -int val_labs_add (struct val_labs *, union value, const char *); -int val_labs_replace (struct val_labs *, union value, const char *); -int val_labs_remove (struct val_labs *, union value); -char *val_labs_find (const struct val_labs *, union value); +/* Looking up value labels. */ +const char *val_labs_find (const struct val_labs *, const union value *); +struct val_lab *val_labs_lookup (const struct val_labs *, + const union value *); -struct val_labs_iterator; +/* Basic properties. */ +size_t val_labs_count (const struct val_labs *); +int val_labs_get_width (const struct val_labs *); +bool val_labs_can_set_width (const struct val_labs *, int new_width); +void val_labs_set_width (struct val_labs *, int new_width); -struct val_lab *val_labs_first (const struct val_labs *, - struct val_labs_iterator **); -struct val_lab *val_labs_first_sorted (const struct val_labs *, - struct val_labs_iterator **); -struct val_lab *val_labs_next (const struct val_labs *, - struct val_labs_iterator **); -void val_labs_done (struct val_labs_iterator **); +/* Adding value labels. */ +bool val_labs_add (struct val_labs *, const union value *, const char *); +void val_labs_replace (struct val_labs *, const union value *, const char *); +void val_labs_remove (struct val_labs *, struct val_lab *); -/* Return a string representing this value, in the form most - appropriate from a human factors perspective. - (IE: the label if it has one, otherwise the alpha/numeric ) -*/ -const char *value_to_string(const union value *, const struct variable *); +/* Iterating through value labels. */ +const struct val_lab *val_labs_first (const struct val_labs *); +const struct val_lab *val_labs_next (const struct val_labs *, + const struct val_lab *); +const struct val_lab **val_labs_sorted (const struct val_labs *); -#endif /* value-labels.h */ +#endif /* data/value-labels.h */