Line | Count | Source (jump to first uncovered line) |
1 | | #ifndef JV_H |
2 | | #define JV_H |
3 | | |
4 | | #include <stdarg.h> |
5 | | #include <stdint.h> |
6 | | #include <stdio.h> |
7 | | |
8 | | #ifdef __cplusplus |
9 | | extern "C" { |
10 | | #endif |
11 | | |
12 | | #if (defined(__GNUC__) && __GNUC__ >= 7) || \ |
13 | | (defined(__clang__) && __clang_major__ >= 10) |
14 | 0 | # define JQ_FALLTHROUGH __attribute__((fallthrough)) |
15 | | #else |
16 | | # define JQ_FALLTHROUGH do {} while (0) /* fallthrough */ |
17 | | #endif |
18 | | |
19 | | typedef enum { |
20 | | JV_KIND_INVALID, |
21 | | JV_KIND_NULL, |
22 | | JV_KIND_FALSE, |
23 | | JV_KIND_TRUE, |
24 | | JV_KIND_NUMBER, |
25 | | JV_KIND_STRING, |
26 | | JV_KIND_ARRAY, |
27 | | JV_KIND_OBJECT |
28 | | } jv_kind; |
29 | | |
30 | | struct jv_refcnt; |
31 | | |
32 | | /* All of the fields of this struct are private. |
33 | | Really. Do not play with them. */ |
34 | | typedef struct { |
35 | | unsigned char kind_flags; |
36 | | unsigned char pad_; |
37 | | unsigned short offset; /* array offsets */ |
38 | | int size; |
39 | | union { |
40 | | struct jv_refcnt* ptr; |
41 | | double number; |
42 | | } u; |
43 | | } jv; |
44 | | |
45 | | /* |
46 | | * All jv_* functions consume (decref) input and produce (incref) output |
47 | | * Except jv_copy |
48 | | */ |
49 | | |
50 | | jv_kind jv_get_kind(jv); |
51 | | const char* jv_kind_name(jv_kind); |
52 | 134M | static int jv_is_valid(jv x) { return jv_get_kind(x) != JV_KIND_INVALID; } Unexecuted instantiation: jq_fuzz_parse_stream.c:jv_is_valid Unexecuted instantiation: jv.c:jv_is_valid Unexecuted instantiation: jv_alloc.c:jv_is_valid Unexecuted instantiation: jv_dtoa.c:jv_is_valid Line | Count | Source | 52 | 134M | static int jv_is_valid(jv x) { return jv_get_kind(x) != JV_KIND_INVALID; } |
Unexecuted instantiation: util.c:jv_is_valid Unexecuted instantiation: execute.c:jv_is_valid Unexecuted instantiation: jv_aux.c:jv_is_valid Unexecuted instantiation: jv_print.c:jv_is_valid Unexecuted instantiation: linker.c:jv_is_valid Unexecuted instantiation: locfile.c:jv_is_valid Unexecuted instantiation: parser.c:jv_is_valid Unexecuted instantiation: builtin.c:jv_is_valid Unexecuted instantiation: bytecode.c:jv_is_valid Unexecuted instantiation: compile.c:jv_is_valid Unexecuted instantiation: jv_file.c:jv_is_valid Unexecuted instantiation: lexer.c:jv_is_valid |
53 | | |
54 | | jv jv_copy(jv); |
55 | | void jv_free(jv); |
56 | | |
57 | | int jv_get_refcnt(jv); |
58 | | |
59 | | int jv_equal(jv, jv); |
60 | | int jv_identical(jv, jv); |
61 | | int jv_contains(jv, jv); |
62 | | |
63 | | jv jv_invalid(void); |
64 | | jv jv_invalid_with_msg(jv); |
65 | | jv jv_invalid_get_msg(jv); |
66 | | int jv_invalid_has_msg(jv); |
67 | | |
68 | | jv jv_null(void); |
69 | | jv jv_true(void); |
70 | | jv jv_false(void); |
71 | | jv jv_bool(int); |
72 | | |
73 | | jv jv_number(double); |
74 | | jv jv_number_with_literal(const char*); |
75 | | double jv_number_value(jv); |
76 | | int jv_is_integer(jv); |
77 | | jv jv_number_abs(jv); |
78 | | jv jv_number_negate(jv); |
79 | | |
80 | | int jv_number_has_literal(jv); |
81 | | const char* jv_number_get_literal(jv); |
82 | | |
83 | | jv jv_array(void); |
84 | | jv jv_array_sized(int); |
85 | | int jv_array_length(jv); |
86 | | jv jv_array_get(jv, int); |
87 | | jv jv_array_set(jv, int, jv); |
88 | | jv jv_array_append(jv, jv); |
89 | | jv jv_array_concat(jv, jv); |
90 | | jv jv_array_slice(jv, int, int); |
91 | | jv jv_array_indexes(jv, jv); |
92 | | #define jv_array_foreach(a, i, x) \ |
93 | 0 | for (int jv_len__ = jv_array_length(jv_copy(a)), i=0, jv_j__ = 1; \ |
94 | 0 | jv_j__; jv_j__ = 0) \ |
95 | 0 | for (jv x; \ |
96 | 0 | i < jv_len__ ? \ |
97 | 0 | (x = jv_array_get(jv_copy(a), i), 1) : 0; \ |
98 | 0 | i++) |
99 | | |
100 | 1.76k | #define JV_ARRAY_1(e) (jv_array_append(jv_array(),e)) |
101 | 1.76k | #define JV_ARRAY_2(e1,e2) (jv_array_append(JV_ARRAY_1(e1),e2)) |
102 | 11 | #define JV_ARRAY_3(e1,e2,e3) (jv_array_append(JV_ARRAY_2(e1,e2),e3)) |
103 | 0 | #define JV_ARRAY_4(e1,e2,e3,e4) (jv_array_append(JV_ARRAY_3(e1,e2,e3),e4)) |
104 | 0 | #define JV_ARRAY_5(e1,e2,e3,e4,e5) (jv_array_append(JV_ARRAY_4(e1,e2,e3,e4),e5)) |
105 | 0 | #define JV_ARRAY_6(e1,e2,e3,e4,e5,e6) (jv_array_append(JV_ARRAY_5(e1,e2,e3,e4,e5),e6)) |
106 | 0 | #define JV_ARRAY_7(e1,e2,e3,e4,e5,e6,e7) (jv_array_append(JV_ARRAY_6(e1,e2,e3,e4,e5,e6),e7)) |
107 | 0 | #define JV_ARRAY_8(e1,e2,e3,e4,e5,e6,e7,e8) (jv_array_append(JV_ARRAY_7(e1,e2,e3,e4,e5,e6,e7),e8)) |
108 | | #define JV_ARRAY_9(e1,e2,e3,e4,e5,e6,e7,e8,e9) (jv_array_append(JV_ARRAY_8(e1,e2,e3,e4,e5,e6,e7,e8),e9)) |
109 | 1.76k | #define JV_ARRAY_IDX(_1,_2,_3,_4,_5,_6,_7,_8,_9,NAME,...) NAME |
110 | | #define JV_ARRAY(...) \ |
111 | 1.76k | JV_ARRAY_IDX(__VA_ARGS__, JV_ARRAY_9, JV_ARRAY_8, JV_ARRAY_7, JV_ARRAY_6, JV_ARRAY_5, JV_ARRAY_4, JV_ARRAY_3, JV_ARRAY_2, JV_ARRAY_1, dummy)(__VA_ARGS__) |
112 | | |
113 | | #ifdef __GNUC__ |
114 | | #define JV_PRINTF_LIKE(fmt_arg_num, args_num) \ |
115 | | __attribute__ ((__format__( __printf__, fmt_arg_num, args_num))) |
116 | | #define JV_VPRINTF_LIKE(fmt_arg_num) \ |
117 | | __attribute__ ((__format__( __printf__, fmt_arg_num, 0))) |
118 | | #else |
119 | | #define JV_PRINTF_LIKE(fmt_arg_num, args_num) |
120 | | #define JV_VPRINTF_LIKE(fmt_arg_num) |
121 | | #endif |
122 | | |
123 | | |
124 | | jv jv_string(const char*); |
125 | | jv jv_string_sized(const char*, int); |
126 | | jv jv_string_empty(int len); |
127 | | int jv_string_length_bytes(jv); |
128 | | int jv_string_length_codepoints(jv); |
129 | | unsigned long jv_string_hash(jv); |
130 | | const char* jv_string_value(jv); |
131 | | jv jv_string_indexes(jv j, jv k); |
132 | | jv jv_string_slice(jv j, int start, int end); |
133 | | jv jv_string_concat(jv, jv); |
134 | | jv jv_string_vfmt(const char*, va_list) JV_VPRINTF_LIKE(1); |
135 | | jv jv_string_fmt(const char*, ...) JV_PRINTF_LIKE(1, 2); |
136 | | jv jv_string_append_codepoint(jv a, uint32_t c); |
137 | | jv jv_string_append_buf(jv a, const char* buf, int len); |
138 | | jv jv_string_append_str(jv a, const char* str); |
139 | | jv jv_string_repeat(jv j, int n); |
140 | | jv jv_string_split(jv j, jv sep); |
141 | | jv jv_string_explode(jv j); |
142 | | jv jv_string_implode(jv j); |
143 | | |
144 | | jv jv_object(void); |
145 | | jv jv_object_get(jv object, jv key); |
146 | | int jv_object_has(jv object, jv key); |
147 | | jv jv_object_set(jv object, jv key, jv value); |
148 | | jv jv_object_delete(jv object, jv key); |
149 | | int jv_object_length(jv object); |
150 | | jv jv_object_merge(jv, jv); |
151 | | jv jv_object_merge_recursive(jv, jv); |
152 | | |
153 | | int jv_object_iter(jv); |
154 | | int jv_object_iter_next(jv, int); |
155 | | int jv_object_iter_valid(jv, int); |
156 | | jv jv_object_iter_key(jv, int); |
157 | | jv jv_object_iter_value(jv, int); |
158 | | #define jv_object_foreach(t, k, v) \ |
159 | 0 | for (int jv_i__ = jv_object_iter(t), jv_j__ = 1; jv_j__; jv_j__ = 0) \ |
160 | 0 | for (jv k, v; \ |
161 | 0 | jv_object_iter_valid((t), jv_i__) ? \ |
162 | 0 | (k = jv_object_iter_key(t, jv_i__), \ |
163 | 0 | v = jv_object_iter_value(t, jv_i__), \ |
164 | 0 | 1) \ |
165 | 0 | : 0; \ |
166 | 0 | jv_i__ = jv_object_iter_next(t, jv_i__)) \ |
167 | | |
168 | | #define jv_object_keys_foreach(t, k) \ |
169 | 0 | for (int jv_i__ = jv_object_iter(t), jv_j__ = 1; jv_j__; jv_j__ = 0) \ |
170 | 0 | for (jv k; \ |
171 | 0 | jv_object_iter_valid((t), jv_i__) ? \ |
172 | 0 | (k = jv_object_iter_key(t, jv_i__), \ |
173 | 0 | 1) \ |
174 | 0 | : 0; \ |
175 | 0 | jv_i__ = jv_object_iter_next(t, jv_i__)) |
176 | | |
177 | | #define JV_OBJECT_1(k1) (jv_object_set(jv_object(),(k1),jv_null())) |
178 | 0 | #define JV_OBJECT_2(k1,v1) (jv_object_set(jv_object(),(k1),(v1))) |
179 | | #define JV_OBJECT_3(k1,v1,k2) (jv_object_set(JV_OBJECT_2((k1),(v1)),(k2),jv_null())) |
180 | 0 | #define JV_OBJECT_4(k1,v1,k2,v2) (jv_object_set(JV_OBJECT_2((k1),(v1)),(k2),(v2))) |
181 | | #define JV_OBJECT_5(k1,v1,k2,v2,k3) (jv_object_set(JV_OBJECT_4((k1),(v1),(k2),(v2)),(k3),jv_null())) |
182 | | #define JV_OBJECT_6(k1,v1,k2,v2,k3,v3) (jv_object_set(JV_OBJECT_4((k1),(v1),(k2),(v2)),(k3),(v3))) |
183 | | #define JV_OBJECT_7(k1,v1,k2,v2,k3,v3,k4) (jv_object_set(JV_OBJECT_6((k1),(v1),(k2),(v2),(k3),(v3)),(k4),jv_null())) |
184 | | #define JV_OBJECT_8(k1,v1,k2,v2,k3,v3,k4,v4) (jv_object_set(JV_OBJECT_6((k1),(v1),(k2),(v2),(k3),(v3)),(k4),(v4))) |
185 | | #define JV_OBJECT_9(k1,v1,k2,v2,k3,v3,k4,v4,k5) \ |
186 | | (jv_object_set(JV_OBJECT_8((k1),(v1),(k2),(v2),(k3),(v3),(k4),(v4)),(k5),jv_null())) |
187 | | #define JV_OBJECT_10(k1,v1,k2,v2,k3,v3,k4,v4,k5,v5) \ |
188 | | (jv_object_set(JV_OBJECT_8((k1),(v1),(k2),(v2),(k3),(v3),(k4),(v4)),(k5),(v5))) |
189 | | #define JV_OBJECT_11(k1,v1,k2,v2,k3,v3,k4,v4,k5,v5,k6) \ |
190 | | (jv_object_set(JV_OBJECT_10((k1),(v1),(k2),(v2),(k3),(v3),(k4),(v4),(k5),(v5)),(k6),jv_null())) |
191 | | #define JV_OBJECT_12(k1,v1,k2,v2,k3,v3,k4,v4,k5,v5,k6,v6) \ |
192 | | (jv_object_set(JV_OBJECT_10((k1),(v1),(k2),(v2),(k3),(v3),(k4),(v4),(k5),(v5)),(k6),(v6))) |
193 | | #define JV_OBJECT_13(k1,v1,k2,v2,k3,v3,k4,v4,k5,v5,k6,v6,k7) \ |
194 | | (jv_object_set(JV_OBJECT_12((k1),(v1),(k2),(v2),(k3),(v3),(k4),(v4),(k5),(v5),(k6),(v6)),(k7),jv_null())) |
195 | | #define JV_OBJECT_14(k1,v1,k2,v2,k3,v3,k4,v4,k5,v5,k6,v6,k7,v7) \ |
196 | | (jv_object_set(JV_OBJECT_12((k1),(v1),(k2),(v2),(k3),(v3),(k4),(v4),(k5),(v5),(k6),(v6)),(k7),(v7))) |
197 | | #define JV_OBJECT_15(k1,v1,k2,v2,k3,v3,k4,v4,k5,v5,k6,v6,k7,v7,k8) \ |
198 | | (jv_object_set(JV_OBJECT_14((k1),(v1),(k2),(v2),(k3),(v3),(k4),(v4),(k5),(v5),(k6),(v6),(k7),(v7)),(k8),jv_null())) |
199 | | #define JV_OBJECT_16(k1,v1,k2,v2,k3,v3,k4,v4,k5,v5,k6,v6,k7,v7,k8,v8) \ |
200 | | (jv_object_set(JV_OBJECT_14((k1),(v1),(k2),(v2),(k3),(v3),(k4),(v4),(k5),(v5),(k6),(v6),(k7),(v7)),(k8),(v8))) |
201 | | #define JV_OBJECT_17(k1,v1,k2,v2,k3,v3,k4,v4,k5,v5,k6,v6,k7,v7,k8,v8,k9) \ |
202 | | (jv_object_set(JV_OBJECT_16((k1),(v1),(k2),(v2),(k3),(v3),(k4),(v4),(k5),(v5),(k6),(v6),(k7),(v7),(k8),(v8)),(k9),jv_null())) |
203 | | #define JV_OBJECT_18(k1,v1,k2,v2,k3,v3,k4,v4,k5,v5,k6,v6,k7,v7,k8,v8,k9,v9) \ |
204 | | (jv_object_set(JV_OBJECT_16((k1),(v1),(k2),(v2),(k3),(v3),(k4),(v4),(k5),(v5),(k6),(v6),(k7),(v7),(k8),(v8)),(k9),(v9))) |
205 | 0 | #define JV_OBJECT_IDX(_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,NAME,...) NAME |
206 | | #define JV_OBJECT(...) \ |
207 | 0 | JV_OBJECT_IDX(__VA_ARGS__, \ |
208 | 0 | JV_OBJECT_18, JV_OBJECT_17, JV_OBJECT_16, JV_OBJECT_15, \ |
209 | 0 | JV_OBJECT_14, JV_OBJECT_13, JV_OBJECT_12, JV_OBJECT_11, \ |
210 | 0 | JV_OBJECT_10, JV_OBJECT_9, JV_OBJECT_8, JV_OBJECT_7, \ |
211 | 0 | JV_OBJECT_6, JV_OBJECT_5, JV_OBJECT_4, JV_OBJECT_3, \ |
212 | 0 | JV_OBJECT_2, JV_OBJECT_1)(__VA_ARGS__) |
213 | | |
214 | | |
215 | | |
216 | | int jv_get_refcnt(jv); |
217 | | |
218 | | enum jv_print_flags { |
219 | | JV_PRINT_PRETTY = 1, |
220 | | JV_PRINT_ASCII = 2, |
221 | | JV_PRINT_COLOR = 4, JV_PRINT_COLOUR = 4, |
222 | | JV_PRINT_SORTED = 8, |
223 | | JV_PRINT_INVALID = 16, |
224 | | JV_PRINT_REFCOUNT = 32, |
225 | | JV_PRINT_TAB = 64, |
226 | | JV_PRINT_ISATTY = 128, |
227 | | JV_PRINT_SPACE0 = 256, |
228 | | JV_PRINT_SPACE1 = 512, |
229 | | JV_PRINT_SPACE2 = 1024, |
230 | | }; |
231 | | #define JV_PRINT_INDENT_FLAGS(n) \ |
232 | 0 | ((n) < 0 || (n) > 7 ? JV_PRINT_TAB | JV_PRINT_PRETTY : (n) << 8 | JV_PRINT_PRETTY) |
233 | | void jv_dumpf(jv, FILE *f, int flags); |
234 | | void jv_dump(jv, int flags); |
235 | | void jv_show(jv, int flags); |
236 | | jv jv_dump_string(jv, int flags); |
237 | | char *jv_dump_string_trunc(jv x, char *outbuf, size_t bufsize); |
238 | | |
239 | | enum { |
240 | | JV_PARSE_SEQ = 1, |
241 | | JV_PARSE_STREAMING = 2, |
242 | | JV_PARSE_STREAM_ERRORS = 4, |
243 | | }; |
244 | | |
245 | | jv jv_parse(const char* string); |
246 | | jv jv_parse_sized(const char* string, int length); |
247 | | jv jv_parse_custom_flags(const char* string, int flags); |
248 | | |
249 | | typedef void (*jv_nomem_handler_f)(void *); |
250 | | void jv_nomem_handler(jv_nomem_handler_f, void *); |
251 | | |
252 | | jv jv_load_file(const char *, int); |
253 | | |
254 | | typedef struct jv_parser jv_parser; |
255 | | jv_parser* jv_parser_new(int); |
256 | | void jv_parser_set_buf(jv_parser*, const char*, int, int); |
257 | | int jv_parser_remaining(jv_parser*); |
258 | | jv jv_parser_next(jv_parser*); |
259 | | void jv_parser_free(jv_parser*); |
260 | | |
261 | | jv jv_get(jv, jv); |
262 | | jv jv_set(jv, jv, jv); |
263 | | jv jv_has(jv, jv); |
264 | | jv jv_setpath(jv, jv, jv); |
265 | | jv jv_getpath(jv, jv); |
266 | | jv jv_delpaths(jv, jv); |
267 | | jv jv_keys(jv /*object or array*/); |
268 | | jv jv_keys_unsorted(jv /*object or array*/); |
269 | | int jv_cmp(jv, jv); |
270 | | jv jv_sort(jv, jv); |
271 | | jv jv_group(jv, jv); |
272 | | jv jv_unique(jv, jv); |
273 | | |
274 | | #ifdef __cplusplus |
275 | | } |
276 | | #endif |
277 | | |
278 | | #endif |
279 | | |
280 | | |
281 | | /* |
282 | | |
283 | | true/false/null: |
284 | | check kind |
285 | | |
286 | | number: |
287 | | introduce/eliminate jv |
288 | | to integer |
289 | | |
290 | | array: |
291 | | copy |
292 | | free |
293 | | slice |
294 | | index |
295 | | update |
296 | | |
297 | | updateslice? |
298 | | |
299 | | |
300 | | */ |