value-labels: New function val_labs_find_value().
authorBen Pfaff <blp@cs.stanford.edu>
Sat, 3 Mar 2012 18:46:37 +0000 (10:46 -0800)
committerBen Pfaff <blp@cs.stanford.edu>
Sat, 21 Apr 2012 04:39:52 +0000 (21:39 -0700)
The new data sheet implementation (in an upcoming commit) will use
this.

src/data/value-labels.c
src/data/value-labels.h

index 746e20908f8f8bdafa7fa8a6529e7d8450be333c..0b2ae3f6323575dc9711c1de1f8b88f4e34d0df4 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 1997-9, 2000, 2009, 2010, 2011 Free Software Foundation, Inc.
+   Copyright (C) 1997-9, 2000, 2009, 2010, 2011, 2012 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
@@ -256,6 +256,35 @@ val_labs_lookup (const struct val_labs *vls, const union value *value)
   return (vls == NULL ? NULL
           : val_labs_lookup__ (vls, value, value_hash (value, vls->width, 0)));
 }
+
+/* Searches VLS for a value label whose label is exactly LABEL.  If successful,
+   returns the corresponding value.  Otherwise, returns a null pointer.
+
+   Returns a null pointer if VLS is null.
+
+   This function is O(n) in the number of labels in VLS. */
+const union value *
+val_labs_find_value (const struct val_labs *vls, const char *label_)
+{
+  const union value *value = NULL;
+
+  if (vls != NULL)
+    {
+      const struct val_lab *vl;
+      const char *label;
+
+      label = intern_new (label_);
+      HMAP_FOR_EACH (vl, struct val_lab, node, &vls->labels)
+        if (vl->label == label)
+          {
+            value = &vl->value;
+            break;
+          }
+      intern_unref (label);
+    }
+
+  return value;
+}
 \f
 /* Returns the first value label in VLS, in arbitrary order, or a
    null pointer if VLS is empty or if VLS is a null pointer.  If
index f0f7ce01264c392552f7b96d130be6577ddb50a9..af98d9f9b54ef392f7623f7a3f3d050bb60b5bfb 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 1997-9, 2000, 2009, 2011 Free Software Foundation, Inc.
+   Copyright (C) 1997-9, 2000, 2009, 2011, 2012 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
@@ -93,6 +93,8 @@ size_t val_labs_count (const struct val_labs *);
 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 *);
+const union value *val_labs_find_value (const struct val_labs *,
+                                        const char *label);
 
 /* Basic properties. */
 size_t val_labs_count (const struct val_labs *);