176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* JSON query 276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * ZZJSON - Copyright (C) 2008 by Ivo van Poorten 376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * License: GNU Lesser General Public License version 2.1 476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "zzjson.h" 776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <string.h> 876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <stdarg.h> 976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1076d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanZZJSON *zzjson_object_find_label(ZZJSON *zzjson, char *label) { 1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (zzjson->type != ZZJSON_OBJECT) return NULL; 1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman while (zzjson) { 1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman char *string = zzjson->value.object.label; 1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (zzjson->type != ZZJSON_OBJECT) return NULL; 1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!string) return NULL; 1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!strcmp(string, label)) 2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return zzjson->value.object.val; 2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman zzjson = zzjson->next; 2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return NULL; 2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanZZJSON *zzjson_object_find_labels(ZZJSON *zzjson, ...) { 2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman va_list ap; 2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman char *lbl; 2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman va_start(ap, zzjson); 3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lbl = va_arg(ap, char *); 3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman while (lbl) { 3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman zzjson = zzjson_object_find_label(zzjson, lbl); 3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!zzjson) break; 3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lbl = va_arg(ap, char *); 3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman va_end(ap); 3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return zzjson; 4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanunsigned int zzjson_object_count(ZZJSON *zzjson) { 4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman unsigned int count = 1; 4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (zzjson->type != ZZJSON_OBJECT) return 0; 4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!zzjson->value.object.label) return 0; /* empty { } */ 4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman while ((zzjson = zzjson->next)) count++; 4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return count; 5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanunsigned int zzjson_array_count(ZZJSON *zzjson) { 5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman unsigned int count = 1; 5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (zzjson->type != ZZJSON_ARRAY) return 0; 5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!zzjson->value.array.val) return 0; /* empty [ ] */ 5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman while ((zzjson = zzjson->next)) count++; 6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return count; 6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 64