X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fvalue-labels.h;h=53d13a389700eb586af6aaf14bd82bd540311235;hb=b5c82cc9aabe7e641011130240ae1b2e84348e23;hp=253990ea5a8beec3f564abc4088aad54b407d59a;hpb=480a0746507ce73d26f528b56dc3ed80195096e0;p=pspp-builds.git diff --git a/src/data/value-labels.h b/src/data/value-labels.h index 253990ea..53d13a38 100644 --- a/src/data/value-labels.h +++ b/src/data/value-labels.h @@ -1,60 +1,93 @@ -/* PSPP - computes sample statistics. - Copyright (C) 1997-9, 2000 Free Software Foundation, Inc. +/* PSPP - a program for statistical analysis. + Copyright (C) 1997-9, 2000, 2009 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 +#include -struct val_labs; -struct variable; +/* One value label. -struct val_lab + A value label is normally part of a struct val_labs (see + below). */ +struct val_lab { - union value value; - const char *label; + struct hmap_node node; /* Node in hash map. */ + union value value; /* The value being labeled. */ + struct atom *label; /* A ref-counted string. */ }; +/* Returns the value in VL. The caller must not modify or free + the returned value. + + 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; +} + +const char *val_lab_get_label (const struct val_lab *); + +/* A set of value labels. */ +struct val_labs + { + 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_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 *); +/* Looking up value labels. */ +const char *val_labs_find (const struct val_labs *, const union value *); +const struct val_lab *val_labs_lookup (const struct val_labs *, + const union value *); + +/* 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); -bool val_labs_add (struct val_labs *, union value, const char *); -void val_labs_replace (struct val_labs *, union value, const char *); -bool val_labs_remove (struct val_labs *, union value); -char *val_labs_find (const struct val_labs *, union value); - -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 *, const struct val_lab *); -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 **); +/* 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 */