X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=src%2Fvalue-labels.c;h=cff267f09df9848b1e5fcc66c4bac9d407fac915;hb=012b055f5f7b4ddd2a608e64c53eaae101b5634e;hp=a7e80a595e71c0808bdd225902ce79192784ff8f;hpb=2bfc3a138f308ffb38634a92b23bdc7b62592324;p=pspp-builds.git diff --git a/src/value-labels.c b/src/value-labels.c index a7e80a59..cff267f0 100644 --- a/src/value-labels.c +++ b/src/value-labels.c @@ -14,16 +14,16 @@ 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., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. */ #include -#include +#include "value-labels.h" +#include "error.h" #include -#include #include "alloc.h" #include "hash.h" -#include "value-labels.h" +#include "str.h" static hsh_compare_func compare_int_val_lab; static hsh_hash_func hash_int_val_lab; @@ -32,7 +32,7 @@ static hsh_free_func free_int_val_lab; struct atom; static struct atom *atom_create (const char *string); static void atom_destroy (struct atom *); -static const char *atom_to_string (const struct atom *); +static char *atom_to_string (const struct atom *); /* A set of value labels. */ struct val_labs @@ -91,8 +91,12 @@ val_labs_set_width (struct val_labs *vls, int new_width) void val_labs_destroy (struct val_labs *vls) { - if (vls != NULL && vls->labels != NULL) - hsh_destroy (vls->labels); + if (vls != NULL) + { + if (vls->labels != NULL) + hsh_destroy (vls->labels); + free (vls); + } } /* Removes all the value labels from VLS. */ @@ -216,7 +220,7 @@ val_labs_remove (struct val_labs *vls, union value value) if (vls->labels != NULL) { struct int_val_lab *ivl = create_int_val_lab (vls, value, ""); - int deleted = hsh_delete (vls->labels, &ivl); + int deleted = hsh_delete (vls->labels, ivl); free (ivl); return deleted; } @@ -228,7 +232,7 @@ val_labs_remove (struct val_labs *vls, union value value) returns the label; otherwise, returns a null pointer. If VLS's width is greater than MAX_SHORT_STRING, always returns a null pointer. */ -const char * +char * val_labs_find (const struct val_labs *vls, union value value) { assert (vls != NULL); @@ -380,7 +384,7 @@ hash_int_val_lab (const void *vl_, void *vls_) /* Free a value label. */ void -free_int_val_lab (void *vl_, void *vls_ unused) +free_int_val_lab (void *vl_, void *vls_ UNUSED) { struct int_val_lab *vl = vl_; @@ -448,7 +452,7 @@ atom_destroy (struct atom *atom) } /* Returns the string associated with ATOM. */ -static const char * +static char * atom_to_string (const struct atom *atom) { assert (atom != NULL); @@ -458,7 +462,7 @@ atom_to_string (const struct atom *atom) /* A hsh_compare_func that compares A and B. */ static int -compare_atoms (const void *a_, const void *b_, void *aux unused) +compare_atoms (const void *a_, const void *b_, void *aux UNUSED) { const struct atom *a = a_; const struct atom *b = b_; @@ -468,7 +472,7 @@ compare_atoms (const void *a_, const void *b_, void *aux unused) /* A hsh_hash_func that hashes ATOM. */ static unsigned -hash_atom (const void *atom_, void *aux unused) +hash_atom (const void *atom_, void *aux UNUSED) { const struct atom *atom = atom_; @@ -477,10 +481,38 @@ hash_atom (const void *atom_, void *aux unused) /* A hsh_free_func that destroys ATOM. */ static void -free_atom (void *atom_, void *aux unused) +free_atom (void *atom_, void *aux UNUSED) { struct atom *atom = atom_; free (atom->string); free (atom); } + + +/* Get a string representing the value. + That is, if it has a label, then return that label, + otherwise, if the value is alpha, then return the string for it, + else format it and return the formatted string +*/ +const char * +value_to_string (const union value *val, const struct variable *var) +{ + char *s; + + assert (val != NULL); + assert (var != NULL); + + s = val_labs_find (var->val_labs, *val); + if (s == NULL) + { + static char buf[256]; + if (var->width != 0) + str_copy_buf_trunc (buf, sizeof buf, val->s, var->width); + else + snprintf(buf, 100, "%g", val->f); + s = buf; + } + + return s; +}