summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Forster <octo@leeloo.lan.home.verplant.org>2010-08-06 09:38:00 +0200
committerFlorian Forster <octo@leeloo.lan.home.verplant.org>2010-08-06 09:38:00 +0200
commiteaad36d81f6e2370a0da5f2c5fc1d4b6d187bac8 (patch)
tree73d7c17be7ec0587b82d6b84195d5ad5a1d031eb
parentcfa9f8fcb12d80dd5ebf94f5e6a607aab4d225fb (diff)
downloadyajl-eaad36d81f6e2370a0da5f2c5fc1d4b6d187bac8.tar.gz
Add "yajl_tree_free", a function to free the pointer returned by "yajl_tree_parse".
-rw-r--r--src/api/yajl_tree.h1
-rw-r--r--src/yajl_tree.c83
2 files changed, 84 insertions, 0 deletions
diff --git a/src/api/yajl_tree.h b/src/api/yajl_tree.h
index 4df749e..8e0fc47 100644
--- a/src/api/yajl_tree.h
+++ b/src/api/yajl_tree.h
@@ -89,6 +89,7 @@ struct yajl_value_s
};
YAJL_API yajl_value_t *yajl_tree_parse (const char *input);
+YAJL_API void yajl_tree_free (yajl_value_t *v);
#endif /* YAJL_TREE_H */
/* vim: set sw=2 sts=2 et : */
diff --git a/src/yajl_tree.c b/src/yajl_tree.c
index df1a028..9258fd1 100644
--- a/src/yajl_tree.c
+++ b/src/yajl_tree.c
@@ -71,6 +71,49 @@ static yajl_value_t *value_alloc (uint8_t type) /* {{{ */
return (v);
} /* }}} yajl_value_t *value_alloc */
+static void yajl_object_free (yajl_value_t *v)
+{
+ yajl_value_object_t *o;
+ size_t i;
+
+ if ((v == NULL) || (v->type != VALUE_TYPE_OBJECT))
+ return;
+
+ o = &v->data.object;
+
+ for (i = 0; i < o->children_num; i++)
+ {
+ yajl_tree_free (o->keys[i]);
+ o->keys[i] = NULL;
+ yajl_tree_free (o->values[i]);
+ o->values[i] = NULL;
+ }
+
+ free (o->keys);
+ free (o->values);
+ free (v);
+} /* }}} void yajl_object_free */
+
+static void yajl_array_free (yajl_value_t *v)
+{
+ yajl_value_array_t *a;
+ size_t i;
+
+ if ((v == NULL) || (v->type != VALUE_TYPE_ARRAY))
+ return;
+
+ a = &v->data.array;
+
+ for (i = 0; i < a->children_num; i++)
+ {
+ yajl_tree_free (a->children[i]);
+ a->children[i] = NULL;
+ }
+
+ free (a->children);
+ free (v);
+} /* }}} void yajl_array_free */
+
static int context_push (context_t *ctx, yajl_value_t *v) /* {{{ */
{
stack_elem_t *stack;
@@ -371,4 +414,44 @@ yajl_value_t *yajl_tree_parse (const char *input) /* {{{ */
return (ctx.root);
} /* }}} yajl_value_t *yajl_tree_parse */
+void yajl_tree_free (yajl_value_t *v) /* {{{ */
+{
+ if (v == NULL)
+ return;
+
+ if (v->type == VALUE_TYPE_STRING)
+ {
+ yajl_value_string_t *s = &v->data.string;
+
+ free (s->value);
+ free (v);
+
+ return;
+ }
+ else if (v->type == VALUE_TYPE_NUMBER)
+ {
+ yajl_value_number_t *n = &v->data.number;
+
+ free (n->value);
+ free (v);
+
+ return;
+ }
+ else if (v->type == VALUE_TYPE_OBJECT)
+ {
+ yajl_object_free (v);
+ return;
+ }
+ else if (v->type == VALUE_TYPE_ARRAY)
+ {
+ yajl_array_free (v);
+ return;
+ }
+ else /* if (VALUE_TYPE_TRUE or VALUE_TYPE_FALSE or VALUE_TYPE_NULL) */
+ {
+ free (v);
+ return;
+ }
+} /* void yajl_tree_free */
+
/* vim: set sw=2 sts=2 et fdm=marker : */