diff options
author | Florian Forster <octo@leeloo.lan.home.verplant.org> | 2010-08-06 09:38:00 +0200 |
---|---|---|
committer | Florian Forster <octo@leeloo.lan.home.verplant.org> | 2010-08-06 09:38:00 +0200 |
commit | eaad36d81f6e2370a0da5f2c5fc1d4b6d187bac8 (patch) | |
tree | 73d7c17be7ec0587b82d6b84195d5ad5a1d031eb | |
parent | cfa9f8fcb12d80dd5ebf94f5e6a607aab4d225fb (diff) | |
download | yajl-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.h | 1 | ||||
-rw-r--r-- | src/yajl_tree.c | 83 |
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 : */ |