summaryrefslogtreecommitdiffstats
path: root/web/server/h2o/libh2o/deps/klib/kson.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--web/server/h2o/libh2o/deps/klib/kson.h64
1 files changed, 64 insertions, 0 deletions
diff --git a/web/server/h2o/libh2o/deps/klib/kson.h b/web/server/h2o/libh2o/deps/klib/kson.h
new file mode 100644
index 00000000..a03eb52f
--- /dev/null
+++ b/web/server/h2o/libh2o/deps/klib/kson.h
@@ -0,0 +1,64 @@
+#ifndef KSON_H
+#define KSON_H
+
+#include <string.h>
+
+#define KSON_TYPE_NO_QUOTE 1
+#define KSON_TYPE_SGL_QUOTE 2
+#define KSON_TYPE_DBL_QUOTE 3
+#define KSON_TYPE_BRACKET 4
+#define KSON_TYPE_BRACE 5
+
+#define KSON_OK 0
+#define KSON_ERR_EXTRA_LEFT 1
+#define KSON_ERR_EXTRA_RIGHT 2
+#define KSON_ERR_NO_KEY 3
+
+typedef struct kson_node_s {
+ unsigned long long type:3, n:61;
+ char *key;
+ union {
+ struct kson_node_s **child;
+ char *str;
+ } v;
+} kson_node_t;
+
+typedef struct {
+ long n_nodes;
+ kson_node_t *root;
+} kson_t;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ kson_t *kson_parse(const char *json);
+ void kson_destroy(kson_t *kson);
+ const kson_node_t *kson_by_path(const kson_node_t *root, int path_len, ...);
+ void kson_format(const kson_node_t *root);
+
+#ifdef __cplusplus
+}
+#endif
+
+#define kson_is_internal(p) ((p)->type == KSON_TYPE_BRACKET || (p)->type == KSON_TYPE_BRACE)
+
+static inline const kson_node_t *kson_by_key(const kson_node_t *p, const char *key)
+{
+ long i;
+ if (!kson_is_internal(p)) return 0;
+ for (i = 0; i < (long)p->n; ++i) {
+ const kson_node_t *q = p->v.child[i];
+ if (q->key && strcmp(q->key, key) == 0)
+ return q;
+ }
+ return 0;
+}
+
+static inline const kson_node_t *kson_by_index(const kson_node_t *p, long i)
+{
+ if (!kson_is_internal(p)) return 0;
+ return 0 <= i && i < (long)p->n? p->v.child[i] : 0;
+}
+
+#endif