smap: New functions smap_from_json(), smap_to_json().
authorBen Pfaff <blp@nicira.com>
Wed, 23 May 2012 00:12:22 +0000 (17:12 -0700)
committerBen Pfaff <blp@nicira.com>
Wed, 18 Jul 2012 17:30:50 +0000 (10:30 -0700)
These will acquire a caller in an upcoming commit.

Signed-off-by: Ben Pfaff <blp@nicira.com>
lib/smap.c
lib/smap.h

index 866532156d3cae7348bf24d4dd5c3f689122beb2..e612ac7bad7749bf1a8212cf98af2e91ad177704 100644 (file)
@@ -18,6 +18,7 @@
 #include <assert.h>
 
 #include "hash.h"
+#include "json.h"
 
 static struct smap_node *smap_add__(struct smap *, char *, void *,
                                     size_t hash);
@@ -232,6 +233,41 @@ smap_sort(const struct smap *smap)
         return nodes;
     }
 }
+
+/* Adds each of the key-value pairs from 'json' (which must be a JSON object
+ * whose values are strings) to 'smap'.
+ *
+ * The caller must have initialized 'smap'.
+ *
+ * The caller retains ownership of 'json' and everything in it. */
+void
+smap_from_json(struct smap *smap, const struct json *json)
+{
+    const struct shash_node *node;
+
+    SHASH_FOR_EACH (node, json_object(json)) {
+        const struct json *value = node->data;
+        smap_add(smap, node->name, json_string(value));
+    }
+}
+
+/* Returns a JSON object that maps from the keys in 'smap' to their values.
+ *
+ * The caller owns the returned value and must eventually json_destroy() it.
+ *
+ * The caller retains ownership of 'smap' and everything in it. */
+struct json *
+smap_to_json(const struct smap *smap)
+{
+    const struct smap_node *node;
+    struct json *json;
+
+    json = json_object_create();
+    SMAP_FOR_EACH (node, smap) {
+        json_object_put_string(json, node->key, node->value);
+    }
+    return json;
+}
 \f
 /* Private Helpers. */
 
index 51f6397c4aab3cc63c66ffdd87710580970af560..8510a3761efabda1a127f680e64d1e8a36935931 100644 (file)
@@ -17,6 +17,8 @@
 
 #include "hmap.h"
 
+struct json;
+
 /* A map from string to string. */
 struct smap {
     struct hmap map;           /* Contains "struct smap_node"s. */
@@ -60,4 +62,7 @@ size_t smap_count(const struct smap *);
 void smap_clone(struct smap *dst, const struct smap *src);
 const struct smap_node **smap_sort(const struct smap *);
 
+void smap_from_json(struct smap *, const struct json *);
+struct json *smap_to_json(const struct smap *);
+
 #endif /* smap.h */