| /* JSON query |
| * ZZJSON - Copyright (C) 2008 by Ivo van Poorten |
| * License: GNU Lesser General Public License version 2.1 |
| */ |
| |
| #include "zzjson.h" |
| #include <string.h> |
| #include <stdarg.h> |
| |
| ZZJSON *zzjson_object_find_label(ZZJSON *zzjson, char *label) { |
| if (zzjson->type != ZZJSON_OBJECT) return NULL; |
| |
| while (zzjson) { |
| char *string = zzjson->value.object.label; |
| |
| if (zzjson->type != ZZJSON_OBJECT) return NULL; |
| if (!string) return NULL; |
| |
| if (!strcmp(string, label)) |
| return zzjson->value.object.val; |
| zzjson = zzjson->next; |
| } |
| return NULL; |
| } |
| |
| ZZJSON *zzjson_object_find_labels(ZZJSON *zzjson, ...) { |
| va_list ap; |
| char *lbl; |
| |
| va_start(ap, zzjson); |
| lbl = va_arg(ap, char *); |
| while (lbl) { |
| zzjson = zzjson_object_find_label(zzjson, lbl); |
| if (!zzjson) break; |
| lbl = va_arg(ap, char *); |
| } |
| va_end(ap); |
| |
| return zzjson; |
| } |
| |
| unsigned int zzjson_object_count(ZZJSON *zzjson) { |
| unsigned int count = 1; |
| |
| if (zzjson->type != ZZJSON_OBJECT) return 0; |
| if (!zzjson->value.object.label) return 0; /* empty { } */ |
| |
| while ((zzjson = zzjson->next)) count++; |
| |
| return count; |
| } |
| |
| unsigned int zzjson_array_count(ZZJSON *zzjson) { |
| unsigned int count = 1; |
| |
| if (zzjson->type != ZZJSON_ARRAY) return 0; |
| if (!zzjson->value.array.val) return 0; /* empty [ ] */ |
| |
| while ((zzjson = zzjson->next)) count++; |
| |
| return count; |
| } |
| |