Fixed some problems with value labels not reporting correctly.
[pspp-builds.git] / src / value-labels.c
index a7e80a595e71c0808bdd225902ce79192784ff8f..91dd1702e1f69beaac15933077d8b27beb90c3e7 100644 (file)
    02111-1307, USA. */
 
 #include <config.h>
-#include <assert.h>
+#include "value-labels.h"
+#include "error.h"
 #include <stdlib.h>
 #include <string.h>
 #include "alloc.h"
 #include "hash.h"
-#include "value-labels.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. */
@@ -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)
+{
+  static char buf[100];
+  char *s;
+  const struct val_labs *val_labs = var->val_labs;
+  
+  s = val_labs_find (val_labs, *val);
+
+  if ( s ) 
+    return s;
+
+  if ( 0 == var->width ) 
+    snprintf(buf,100,"%g",val->f);
+  else
+    {
+      strncpy(buf,val->s,MAX_SHORT_STRING);
+      strcat(buf,"\0");
+    }
+  return buf;
+}