X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=src%2Fdump.c;h=dc27fbde9ce096ca0f0300a79cdb054cec35918a;hb=145032a57f7844c29f2c40415b46338ac3445207;hp=a08c2e18fa642faa436b87f4ee967f6c996a6fee;hpb=8e61b7c0f0b796f238253b2a61f82870786d81c8;p=jansson.git diff --git a/src/dump.c b/src/dump.c index a08c2e1..dc27fbd 100644 --- a/src/dump.c +++ b/src/dump.c @@ -9,7 +9,6 @@ #include #include #include -#include #include #include @@ -232,38 +231,44 @@ static int do_dump(const json_t *json, unsigned long flags, int depth, /* detect circular references */ array = json_to_array(json); if(array->visited) - return -1; + goto array_error; array->visited = 1; n = json_array_size(json); if(dump("[", 1, data)) - return -1; - if(n == 0) + goto array_error; + if(n == 0) { + array->visited = 0; return dump("]", 1, data); + } if(dump_indent(flags, depth + 1, 0, dump, data)) - return -1; + goto array_error; for(i = 0; i < n; ++i) { if(do_dump(json_array_get(json, i), flags, depth + 1, dump, data)) - return -1; + goto array_error; if(i < n - 1) { if(dump(",", 1, data) || dump_indent(flags, depth + 1, 1, dump, data)) - return -1; + goto array_error; } else { if(dump_indent(flags, depth, 0, dump, data)) - return -1; + goto array_error; } } array->visited = 0; return dump("]", 1, data); + + array_error: + array->visited = 0; + return -1; } case JSON_OBJECT: @@ -285,17 +290,19 @@ static int do_dump(const json_t *json, unsigned long flags, int depth, /* detect circular references */ object = json_to_object(json); if(object->visited) - return -1; + goto object_error; object->visited = 1; iter = json_object_iter((json_t *)json); if(dump("{", 1, data)) - return -1; - if(!iter) + goto object_error; + if(!iter) { + object->visited = 0; return dump("}", 1, data); + } if(dump_indent(flags, depth + 1, 0, dump, data)) - return -1; + goto object_error; if(flags & JSON_SORT_KEYS || flags & JSON_PRESERVE_ORDER) { @@ -307,7 +314,7 @@ static int do_dump(const json_t *json, unsigned long flags, int depth, size = json_object_size(json); keys = malloc(size * sizeof(object_key_t *)); if(!keys) - return -1; + goto object_error; i = 0; while(iter) @@ -339,7 +346,7 @@ static int do_dump(const json_t *json, unsigned long flags, int depth, do_dump(value, flags, depth + 1, dump, data)) { free(keys); - return -1; + goto object_error; } if(i < size - 1) @@ -348,7 +355,7 @@ static int do_dump(const json_t *json, unsigned long flags, int depth, dump_indent(flags, depth + 1, 1, dump, data)) { free(keys); - return -1; + goto object_error; } } else @@ -356,7 +363,7 @@ static int do_dump(const json_t *json, unsigned long flags, int depth, if(dump_indent(flags, depth, 0, dump, data)) { free(keys); - return -1; + goto object_error; } } } @@ -375,18 +382,18 @@ static int do_dump(const json_t *json, unsigned long flags, int depth, if(dump(separator, separator_length, data) || do_dump(json_object_iter_value(iter), flags, depth + 1, dump, data)) - return -1; + goto object_error; if(next) { if(dump(",", 1, data) || dump_indent(flags, depth + 1, 1, dump, data)) - return -1; + goto object_error; } else { if(dump_indent(flags, depth, 0, dump, data)) - return -1; + goto object_error; } iter = next; @@ -395,6 +402,10 @@ static int do_dump(const json_t *json, unsigned long flags, int depth, object->visited = 0; return dump("}", 1, data); + + object_error: + object->visited = 0; + return -1; } default: