[json-glib] generator: Add an GString-based method



commit 0c01de6d988539a3929f0ee9bbc39f1245ae0cdf
Author: Garrett Regier <garrettregier gmail com>
Date:   Fri Jun 16 17:14:35 2017 -0700

    generator: Add an GString-based method
    
    This allows callers to avoid extra allocations
    when dumping to a preexisting string.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=773504

 doc/json-glib-sections.txt |    1 +
 json-glib/json-generator.c |   41 ++++++++++++++++++++++++++++++-----------
 json-glib/json-generator.h |    4 ++++
 3 files changed, 35 insertions(+), 11 deletions(-)
---
diff --git a/doc/json-glib-sections.txt b/doc/json-glib-sections.txt
index 047f03e..44942c4 100644
--- a/doc/json-glib-sections.txt
+++ b/doc/json-glib-sections.txt
@@ -227,6 +227,7 @@ json_generator_get_indent_char
 <SUBSECTION>
 json_generator_to_file
 json_generator_to_data
+json_generator_to_gstring
 json_generator_to_stream
 
 <SUBSECTION Standard>
diff --git a/json-glib/json-generator.c b/json-glib/json-generator.c
index 0afe881..346be65 100644
--- a/json-glib/json-generator.c
+++ b/json-glib/json-generator.c
@@ -478,6 +478,35 @@ json_generator_new (void)
 }
 
 /**
+ * json_generator_to_gstring:
+ * @generator: a #JsonGenerator
+ * @string: a #GString
+ *
+ * Generates a JSON data stream from @generator
+ * and appends it to @string.
+ *
+ * Return value: (transfer none): a #GString holding a JSON data stream.
+ *   Use g_string_free() to free the allocated resources.
+ *
+ * Since: 1.4
+ */
+GString *
+json_generator_to_gstring (JsonGenerator *generator,
+                           GString       *string)
+{
+  JsonNode *root;
+
+  g_return_val_if_fail (JSON_IS_GENERATOR (generator), NULL);
+  g_return_val_if_fail (string != NULL, NULL);
+
+  root = generator->priv->root;
+  if (root != NULL)
+    dump_node (generator, string, 0, NULL, root);
+
+  return string;
+}
+
+/**
  * json_generator_to_data:
  * @generator: a #JsonGenerator
  * @length: (out): return location for the length of the returned
@@ -493,22 +522,12 @@ gchar *
 json_generator_to_data (JsonGenerator *generator,
                         gsize         *length)
 {
-  JsonNode *root;
   GString *string;
 
   g_return_val_if_fail (JSON_IS_GENERATOR (generator), NULL);
 
-  root = generator->priv->root;
-  if (!root)
-    {
-      if (length)
-        *length = 0;
-
-      return NULL;
-    }
-
   string = g_string_new ("");
-  dump_node (generator, string, 0, NULL, root);
+  json_generator_to_gstring (generator, string);
 
   if (length)
     *length = string->len;
diff --git a/json-glib/json-generator.h b/json-glib/json-generator.h
index 194495a..30a28dc 100644
--- a/json-glib/json-generator.h
+++ b/json-glib/json-generator.h
@@ -102,6 +102,10 @@ void            json_generator_set_root         (JsonGenerator  *generator,
 JSON_AVAILABLE_IN_1_0
 JsonNode *      json_generator_get_root         (JsonGenerator  *generator);
 
+JSON_AVAILABLE_IN_1_4
+GString        *json_generator_to_gstring       (JsonGenerator  *generator,
+                                                 GString        *string);
+
 JSON_AVAILABLE_IN_1_0
 gchar *         json_generator_to_data          (JsonGenerator  *generator,
                                                  gsize          *length);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]