value-labels: Interpret \n as new-line in value labels.
[pspp-builds.git] / src / data / value-labels.h
index 53d13a389700eb586af6aaf14bd82bd540311235..6c13ec9a5088b4104f898603aa130c9edf3613e0 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 1997-9, 2000, 2009 Free Software Foundation, Inc.
+   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
@@ -27,8 +27,8 @@
 
 #include <stdbool.h>
 #include <stddef.h>
-#include <data/value.h>
-#include <libpspp/hmap.h>
+#include "data/value.h"
+#include "libpspp/hmap.h"
 
 /* One value label.
 
@@ -38,7 +38,8 @@ struct val_lab
   {
     struct hmap_node node;      /* Node in hash map. */
     union value value;          /* The value being labeled. */
-    struct atom *label;         /* A ref-counted string. */
+    const char *label;          /* An interned string. */
+    const char *escaped_label;  /* An interned string. */
   };
 
 /* Returns the value in VL.  The caller must not modify or free
@@ -52,13 +53,33 @@ 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 *);
+/* Returns the label in VL as a UTF-8 encoded interned string, in a format
+   appropriate for use in output.  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;
+}
+
+/* Returns the label in VL as a UTF-8 encoded interned string.  Any new-line
+   characters in the label's usual output form are represented in the returned
+   string as the two-byte sequence "\\n".  This form is used on the VALUE
+   LABELS command, in system and portable files, and passed to val_labs_add()
+   and val_labs_replace().
+
+   The caller must not modify or free the returned value. */
+static inline const char *
+val_lab_get_escaped_label (const struct val_lab *vl)
+{
+  return vl->escaped_label;
+}
 \f
 /* 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. */
+    struct hmap labels;         /* Hash table of `struct val_lab's. */
   };
 
 /* Creating and destroying sets of value labels. */
@@ -70,8 +91,8 @@ 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 *);
+struct val_lab *val_labs_lookup (const struct val_labs *,
+                                 const union value *);
 
 /* Basic properties. */
 size_t val_labs_count (const struct val_labs *);
@@ -82,7 +103,7 @@ void val_labs_set_width (struct val_labs *, int new_width);
 /* 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 *);
+void val_labs_remove (struct val_labs *, struct val_lab *);
 
 /* Iterating through value labels. */
 const struct val_lab *val_labs_first (const struct val_labs *);