PipeWire 1.3.0
Loading...
Searching...
No Matches
json.h
Go to the documentation of this file.
1/* Simple Plugin API */
2/* SPDX-FileCopyrightText: Copyright © 2020 Wim Taymans */
3/* SPDX-License-Identifier: MIT */
4
5#ifndef SPA_UTILS_JSON_UTILS_H
6#define SPA_UTILS_JSON_UTILS_H
7
8#ifdef __cplusplus
9extern "C" {
10#else
11#include <stdbool.h>
12#endif
13#include <stddef.h>
14#include <stdlib.h>
15#include <stdint.h>
16#include <string.h>
17#include <math.h>
18#include <float.h>
19
20#include <spa/utils/json-core.h>
21
31static inline int spa_json_begin(struct spa_json * iter, const char *data, size_t size, const char **val)
32{
33 spa_json_init(iter, data, size);
34 return spa_json_next(iter, val);
35}
37/* float */
38static inline int spa_json_get_float(struct spa_json *iter, float *res)
39{
40 const char *value;
41 int len;
42 if ((len = spa_json_next(iter, &value)) <= 0)
43 return len;
44 return spa_json_parse_float(value, len, res);
45}
46
47/* int */
48static inline int spa_json_get_int(struct spa_json *iter, int *res)
49{
50 const char *value;
51 int len;
52 if ((len = spa_json_next(iter, &value)) <= 0)
53 return len;
54 return spa_json_parse_int(value, len, res);
55}
56
57/* bool */
58static inline int spa_json_get_bool(struct spa_json *iter, bool *res)
59{
60 const char *value;
61 int len;
62 if ((len = spa_json_next(iter, &value)) <= 0)
63 return len;
64 return spa_json_parse_bool(value, len, res);
65}
66
67/* string */
68static inline int spa_json_get_string(struct spa_json *iter, char *res, int maxlen)
69{
70 const char *value;
71 int len;
72 if ((len = spa_json_next(iter, &value)) <= 0)
73 return len;
74 return spa_json_parse_stringn(value, len, res, maxlen);
75}
76
77
78static inline int spa_json_enter_container(struct spa_json *iter, struct spa_json *sub, char type)
79{
80 const char *value;
81 int len;
82 if ((len = spa_json_next(iter, &value)) <= 0)
83 return len;
84 if (!spa_json_is_container(value, len))
85 return -EPROTO;
86 if (*value != type)
87 return -EINVAL;
88 spa_json_enter(iter, sub);
89 return 1;
90}
91
92static inline int spa_json_begin_container(struct spa_json * iter,
93 const char *data, size_t size, char type, bool relax)
94{
95 int res;
96 spa_json_init(iter, data, size);
97 res = spa_json_enter_container(iter, iter, type);
98 if (res == -EPROTO && relax)
99 spa_json_init(iter, data, size);
100 else if (res <= 0)
101 return res;
102 return 1;
103}
109static inline int spa_json_container_len(struct spa_json *iter, const char *value, int len SPA_UNUSED)
110{
111 const char *val;
112 struct spa_json sub;
113 int res;
114 spa_json_enter(iter, &sub);
115 while ((res = spa_json_next(&sub, &val)) > 0);
116 if (res < 0)
117 return 0;
118 return sub.cur + 1 - value;
119}
120
121/* object */
122static inline int spa_json_enter_object(struct spa_json *iter, struct spa_json *sub)
123{
124 return spa_json_enter_container(iter, sub, '{');
125}
126static inline int spa_json_begin_object_relax(struct spa_json * iter, const char *data, size_t size)
128 return spa_json_begin_container(iter, data, size, '{', true);
129}
130static inline int spa_json_begin_object(struct spa_json * iter, const char *data, size_t size)
132 return spa_json_begin_container(iter, data, size, '{', false);
133}
134
135static inline int spa_json_object_next(struct spa_json *iter, char *key, int maxkeylen, const char **value)
136{
137 int res1, res2;
138 while (true) {
139 res1 = spa_json_get_string(iter, key, maxkeylen);
140 if (res1 <= 0 && res1 != -ENOSPC)
141 return res1;
142 res2 = spa_json_next(iter, value);
143 if (res2 <= 0 || res1 != -ENOSPC)
144 return res2;
145 }
146}
147
148static inline int spa_json_object_find(struct spa_json *iter, const char *key, const char **value)
149{
150 struct spa_json obj = SPA_JSON_SAVE(iter);
151 int res, len = strlen(key) + 3;
152 char k[len];
154 while ((res = spa_json_object_next(&obj, k, len, value)) > 0)
155 if (spa_streq(k, key))
156 return res;
157 return -ENOENT;
158}
159
160static inline int spa_json_str_object_find(const char *obj, size_t obj_len,
161 const char *key, char *value, size_t maxlen)
162{
163 struct spa_json iter;
164 int l;
165 const char *v;
166
167 if (spa_json_begin_object(&iter, obj, obj_len) <= 0)
168 return -EINVAL;
169 if ((l = spa_json_object_find(&iter, key, &v)) <= 0)
170 return l;
171 return spa_json_parse_stringn(v, l, value, maxlen);
172}
173
174/* array */
175static inline int spa_json_enter_array(struct spa_json *iter, struct spa_json *sub)
176{
177 return spa_json_enter_container(iter, sub, '[');
178}
179static inline int spa_json_begin_array_relax(struct spa_json * iter, const char *data, size_t size)
181 return spa_json_begin_container(iter, data, size, '[', true);
182}
183static inline int spa_json_begin_array(struct spa_json * iter, const char *data, size_t size)
185 return spa_json_begin_container(iter, data, size, '[', false);
186}
187
188#define spa_json_make_str_array_unpack(maxlen,type,conv) \
189{ \
190 struct spa_json iter; \
191 char v[maxlen]; \
192 uint32_t count = 0; \
193 if (spa_json_begin_array_relax(&iter, arr, arr_len) <= 0) \
194 return -EINVAL; \
195 while (spa_json_get_string(&iter, v, sizeof(v)) > 0 && count < max) \
196 values[count++] = conv(v); \
197 return count; \
198}
199
200static inline int spa_json_str_array_uint32(const char *arr, size_t arr_len,
201 uint32_t *values, size_t max)
202{
203 spa_json_make_str_array_unpack(32,uint32_t, atoi);
204}
210#ifdef __cplusplus
211} /* extern "C" */
212#endif
213
214#endif /* SPA_UTILS_JSON_UTILS_H */
#define SPA_JSON_SAVE(iter)
Definition json-core.h:64
static int spa_json_parse_float(const char *val, int len, float *result)
Definition json-core.h:395
static int spa_json_parse_stringn(const char *val, int len, char *result, int maxlen)
Definition json-core.h:506
static int spa_json_begin_object(struct spa_json *iter, const char *data, size_t size)
Definition json.h:135
static int spa_json_enter_container(struct spa_json *iter, struct spa_json *sub, char type)
Definition json.h:83
static void spa_json_enter(struct spa_json *iter, struct spa_json *sub)
Definition json-core.h:58
static int spa_json_begin_container(struct spa_json *iter, const char *data, size_t size, char type, bool relax)
Definition json.h:97
static int spa_json_get_int(struct spa_json *iter, int *res)
Definition json.h:53
static int spa_json_parse_bool(const char *val, int len, bool *result)
Definition json-core.h:472
static int spa_json_enter_object(struct spa_json *iter, struct spa_json *sub)
Definition json.h:127
static int spa_json_get_string(struct spa_json *iter, char *res, int maxlen)
Definition json.h:73
static int spa_json_begin(struct spa_json *iter, const char *data, size_t size, const char **val)
Definition json.h:36
static int spa_json_str_object_find(const char *obj, size_t obj_len, const char *key, char *value, size_t maxlen)
Definition json.h:165
static int spa_json_begin_array(struct spa_json *iter, const char *data, size_t size)
Definition json.h:188
static int spa_json_get_bool(struct spa_json *iter, bool *res)
Definition json.h:63
static int spa_json_object_find(struct spa_json *iter, const char *key, const char **value)
Definition json.h:153
#define spa_json_make_str_array_unpack(maxlen, type, conv)
Definition json.h:193
static int spa_json_parse_int(const char *val, int len, int *result)
Definition json-core.h:436
static int spa_json_next(struct spa_json *iter, const char **value)
Get the next token.
Definition json-core.h:71
static int spa_json_object_next(struct spa_json *iter, char *key, int maxkeylen, const char **value)
Definition json.h:140
static int spa_json_is_container(const char *val, int len)
Definition json-core.h:371
static void spa_json_init(struct spa_json *iter, const char *data, size_t size)
Definition json-core.h:51
static int spa_json_enter_array(struct spa_json *iter, struct spa_json *sub)
Definition json.h:180
static int spa_json_begin_object_relax(struct spa_json *iter, const char *data, size_t size)
Definition json.h:131
static int spa_json_get_float(struct spa_json *iter, float *res)
Definition json.h:43
static int spa_json_begin_array_relax(struct spa_json *iter, const char *data, size_t size)
Definition json.h:184
static int spa_json_str_array_uint32(const char *arr, size_t arr_len, uint32_t *values, size_t max)
Definition json.h:205
static int spa_json_container_len(struct spa_json *iter, const char *value, int len 1)
Return length of container at current position, starting at value.
Definition json.h:114
static bool spa_streq(const char *s1, const char *s2)
Definition string.h:41
#define SPA_UNUSED
Definition defs.h:307
spa/utils/json-core.h
spa/utils/string.h
Definition json-core.h:38
const char * cur
Definition json-core.h:39