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