Code

src/graph_ident.[ch]: Generate JSON data using libyajl.
authorFlorian Forster <ff@octo.it>
Wed, 21 Jul 2010 09:05:23 +0000 (11:05 +0200)
committerFlorian Forster <octo@leeloo.lan.home.verplant.org>
Wed, 21 Jul 2010 09:05:23 +0000 (11:05 +0200)
src/graph_ident.c
src/graph_ident.h

index 6111fe7f80b2d51ff375ed0eee9e52c783e5fc8f..e7d193266e4d38622ff6ad35a659102cb605be50 100644 (file)
@@ -502,35 +502,40 @@ char *ident_to_file (const graph_ident_t *ident) /* {{{ */
   return (strdup (buffer));
 } /* }}} char *ident_to_file */
 
-#define ADD_FIELD(field) do {                              \
-  char json[1024];                                         \
-  json_escape_copy (json, ident->field, sizeof (json));    \
-  strlcat (buffer, json, sizeof (buffer));                 \
-} while (0)
-
-char *ident_to_json (const graph_ident_t *ident) /* {{{ */
+int ident_to_json (const graph_ident_t *ident, /* {{{ */
+    yajl_gen handler)
 {
-  char buffer[4096];
+  yajl_gen_status status;
 
-  buffer[0] = 0;
+  if ((ident == NULL) || (handler == NULL))
+    return (EINVAL);
 
-  strlcat (buffer, "{\"host\":\"", sizeof (buffer));
-  ADD_FIELD (host);
-  strlcat (buffer, "\",\"plugin\":\"", sizeof (buffer));
-  ADD_FIELD (plugin);
-  strlcat (buffer, "\",\"plugin_instance\":\"", sizeof (buffer));
-  ADD_FIELD (plugin_instance);
-  strlcat (buffer, "\",\"type\":\"", sizeof (buffer));
-  ADD_FIELD (type);
-  strlcat (buffer, "\",\"type_instance\":\"", sizeof (buffer));
-  ADD_FIELD (type_instance);
-  strlcat (buffer, "\"}", sizeof (buffer));
+#define ADD_STRING(str) do {                              \
+  status = yajl_gen_string (handler,                      \
+      (unsigned char *) (str),                            \
+      (unsigned int) strlen (str));                       \
+  if (status != yajl_gen_status_ok)                       \
+    return ((int) status);                                \
+} while (0)
 
-  return (strdup (buffer));
-} /* }}} char *ident_to_json */
+  yajl_gen_map_open (handler);
+  ADD_STRING ("host");
+  ADD_STRING (ident->host);
+  ADD_STRING ("plugin");
+  ADD_STRING (ident->plugin);
+  ADD_STRING ("plugin_instance");
+  ADD_STRING (ident->plugin_instance);
+  ADD_STRING ("type");
+  ADD_STRING (ident->type);
+  ADD_STRING ("type_instance");
+  ADD_STRING (ident->type_instance);
+  yajl_gen_map_close (handler);
 
 #undef ADD_FIELD
 
+  return (0);
+} /* }}} char *ident_to_json */
+
 int ident_describe (const graph_ident_t *ident, /* {{{ */
     const graph_ident_t *selector,
     char *buffer, size_t buffer_size)
index 5787ad58d411e62a9a0b2848173bc5914439b9f8..ddba4776561da3408aa66037b232752aa7d76cec 100644 (file)
@@ -25,6 +25,9 @@
 #define GRAPH_IDENT_H 1
 
 #include <time.h>
+
+#include <yajl/yajl_gen.h>
+
 #include "graph_types.h"
 
 #define ANY_TOKEN "/any/"
@@ -86,7 +89,8 @@ _Bool ident_intersect (const graph_ident_t *s0, const graph_ident_t *s1);
 
 char *ident_to_string (const graph_ident_t *ident);
 char *ident_to_file (const graph_ident_t *ident);
-char *ident_to_json (const graph_ident_t *ident);
+int ident_to_json (const graph_ident_t *ident,
+    yajl_gen handler);
 
 int ident_describe (const graph_ident_t *ident, const graph_ident_t *selector,
     char *buffer, size_t buffer_size);