41#ifndef YYJSON_DISABLE_READER
42#define YYJSON_DISABLE_READER 0
48#ifndef YYJSON_DISABLE_WRITER
49#define YYJSON_DISABLE_WRITER 0
54#ifndef YYJSON_DISABLE_INCR_READER
55#define YYJSON_DISABLE_INCR_READER 0
59#ifndef YYJSON_DISABLE_FILE
60#define YYJSON_DISABLE_FILE 0
65#ifndef YYJSON_DISABLE_UTILS
66#define YYJSON_DISABLE_UTILS 0
74#ifndef YYJSON_DISABLE_FAST_FP_CONV
75#define YYJSON_DISABLE_FAST_FP_CONV 0
82#ifndef YYJSON_DISABLE_NON_STANDARD
83#define YYJSON_DISABLE_NON_STANDARD 0
101#ifndef YYJSON_DISABLE_UTF8_VALIDATION
102#define YYJSON_DISABLE_UTF8_VALIDATION 0
109#ifndef YYJSON_DISABLE_UNALIGNED_MEMORY_ACCESS
114#ifndef YYJSON_READER_DEPTH_LIMIT
115#define YYJSON_READER_DEPTH_LIMIT 0
125#ifndef YYJSON_FREESTANDING
126#define YYJSON_FREESTANDING 0
130#ifndef YYJSON_EXPORTS
134#ifndef YYJSON_IMPORTS
138#ifndef YYJSON_HAS_STDINT_H
142#ifndef YYJSON_HAS_STDBOOL_H
153# define YYJSON_MSC_VER _MSC_VER
155# define YYJSON_MSC_VER 0
160# define YYJSON_GCC_VER __GNUC__
161# if defined(__GNUC_PATCHLEVEL__)
162# define yyjson_gcc_available(major, minor, patch) \
163 ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) \
164 >= (major * 10000 + minor * 100 + patch))
166# define yyjson_gcc_available(major, minor, patch) \
167 ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100) \
168 >= (major * 10000 + minor * 100 + patch))
171# define YYJSON_GCC_VER 0
172# define yyjson_gcc_available(major, minor, patch) 0
176#if defined(__GNUC__) && defined(__GNUC_MINOR__) && \
177 !defined(__clang__) && !defined(__llvm__) && \
178 !defined(__INTEL_COMPILER) && !defined(__ICC) && \
179 !defined(__NVCC__) && !defined(__PGI) && !defined(__TINYC__)
180# define YYJSON_IS_REAL_GCC 1
182# define YYJSON_IS_REAL_GCC 0
186#if defined(__STDC__) && (__STDC__ >= 1) && defined(__STDC_VERSION__)
187# define YYJSON_STDC_VER __STDC_VERSION__
189# define YYJSON_STDC_VER 0
193#if defined(__cplusplus)
194# define YYJSON_CPP_VER __cplusplus
196# define YYJSON_CPP_VER 0
200#ifndef yyjson_has_builtin
202# define yyjson_has_builtin(x) __has_builtin(x)
204# define yyjson_has_builtin(x) 0
209#ifndef yyjson_has_attribute
210# ifdef __has_attribute
211# define yyjson_has_attribute(x) __has_attribute(x)
213# define yyjson_has_attribute(x) 0
218#ifndef yyjson_has_feature
220# define yyjson_has_feature(x) __has_feature(x)
222# define yyjson_has_feature(x) 0
227#ifndef yyjson_has_include
229# define yyjson_has_include(x) __has_include(x)
231# define yyjson_has_include(x) 0
237# if YYJSON_MSC_VER >= 1200
238# define yyjson_inline __forceinline
239# elif defined(_MSC_VER)
240# define yyjson_inline __inline
241# elif yyjson_has_attribute(always_inline) || YYJSON_GCC_VER >= 4
242# define yyjson_inline __inline__ __attribute__((always_inline))
243# elif defined(__clang__) || defined(__GNUC__)
244# define yyjson_inline __inline__
245# elif defined(__cplusplus) || YYJSON_STDC_VER >= 199901L
246# define yyjson_inline inline
248# define yyjson_inline
253#ifndef yyjson_noinline
254# if YYJSON_MSC_VER >= 1400
255# define yyjson_noinline __declspec(noinline)
256# elif yyjson_has_attribute(noinline) || YYJSON_GCC_VER >= 4
257# define yyjson_noinline __attribute__((noinline))
259# define yyjson_noinline
265# if YYJSON_MSC_VER >= 1300
266# define yyjson_align(x) __declspec(align(x))
267# elif yyjson_has_attribute(aligned) || defined(__GNUC__)
268# define yyjson_align(x) __attribute__((aligned(x)))
269# elif YYJSON_CPP_VER >= 201103L
270# define yyjson_align(x) alignas(x)
272# define yyjson_align(x)
278# if yyjson_has_builtin(__builtin_expect) || \
279 (YYJSON_GCC_VER >= 4 && YYJSON_GCC_VER != 5)
280# define yyjson_likely(expr) __builtin_expect(!!(expr), 1)
282# define yyjson_likely(expr) (expr)
287#ifndef yyjson_unlikely
288# if yyjson_has_builtin(__builtin_expect) || \
289 (YYJSON_GCC_VER >= 4 && YYJSON_GCC_VER != 5)
290# define yyjson_unlikely(expr) __builtin_expect(!!(expr), 0)
292# define yyjson_unlikely(expr) (expr)
298#if yyjson_has_builtin(__builtin_unreachable) || yyjson_gcc_available(4, 5, 0)
299# define yyjson_assume(expr) ((expr) ? (void)0 : __builtin_unreachable())
300#elif YYJSON_MSC_VER >= 1300
301# define yyjson_assume(expr) __assume(expr)
303# define yyjson_assume(expr) ((void)0)
307#ifndef yyjson_constant_p
308# if yyjson_has_builtin(__builtin_constant_p) || (YYJSON_GCC_VER >= 3)
309# define YYJSON_HAS_CONSTANT_P 1
310# define yyjson_constant_p(value) __builtin_constant_p(value)
312# define YYJSON_HAS_CONSTANT_P 0
313# define yyjson_constant_p(value) 0
318#ifndef yyjson_deprecated
319# if YYJSON_MSC_VER >= 1400
320# define yyjson_deprecated(msg) __declspec(deprecated(msg))
321# elif yyjson_has_feature(attribute_deprecated_with_message) || \
322 (YYJSON_GCC_VER > 4 || (YYJSON_GCC_VER == 4 && __GNUC_MINOR__ >= 5))
323# define yyjson_deprecated(msg) __attribute__((deprecated(msg)))
324# elif YYJSON_GCC_VER >= 3
325# define yyjson_deprecated(msg) __attribute__((deprecated))
327# define yyjson_deprecated(msg)
334# if defined(YYJSON_EXPORTS) && YYJSON_EXPORTS
335# define yyjson_api __declspec(dllexport)
336# elif defined(YYJSON_IMPORTS) && YYJSON_IMPORTS
337# define yyjson_api __declspec(dllimport)
341# elif yyjson_has_attribute(visibility) || YYJSON_GCC_VER >= 4
342# define yyjson_api __attribute__((visibility("default")))
349#ifndef yyjson_api_inline
350# define yyjson_api_inline static yyjson_inline
354#ifndef yyjson_constcast
355# define yyjson_constcast(type) (type)(void *)(size_t)(const void *)
360#ifndef YYJSON_U64_TO_F64_NO_IMPL
361# if (0 < YYJSON_MSC_VER) && (YYJSON_MSC_VER <= 1200)
362# define YYJSON_U64_TO_F64_NO_IMPL 1
364# define YYJSON_U64_TO_F64_NO_IMPL 0
379#if !YYJSON_FREESTANDING && !YYJSON_DISABLE_FILE
382#if !YYJSON_FREESTANDING
386#elif defined(YYJSON_FREESTANDING_HEADER)
387# include YYJSON_FREESTANDING_HEADER
390# define memcpy(d,s,n) yyjson_memcpy(d,s,n)
393# define memmove(d,s,n) yyjson_memmove(d,s,n)
396# define memset(d,v,n) yyjson_memset(d,v,n)
399# define memcmp(a,b,n) yyjson_memcmp(a,b,n)
402# define strlen(s) yyjson_strlen(s)
405 char *p = (
char *)d;
const char *q = (
const char *)s;
406 while (n--) *p++ = *q++;
return d;
409 char *p = (
char *)d;
const char *q = (
const char *)s;
410 if (p == q || !n)
return d;
411 if (p < q) {
while (n--) *p++ = *q++; }
412 else { p += n; q += n;
while (n--) *--p = *--q; }
416 char *p = (
char *)d, x = (
char)v;
417 while (n--) *p++ = x;
return d;
420 const unsigned char *p = (
const unsigned char *)a;
421 const unsigned char *q = (
const unsigned char *)b;
422 while (n--) {
if (*p != *q)
return (
int)(*p - *q); p++; q++; }
return 0;
425 const char *p = s;
while (*p) p++;
return (
size_t)(p - s);
430#if (defined(YYJSON_HAS_STDINT_H) && YYJSON_HAS_STDINT_H) || \
431 YYJSON_MSC_VER >= 1600 || YYJSON_STDC_VER >= 199901L || \
432 defined(_STDINT_H) || defined(_STDINT_H_) || \
433 defined(__CLANG_STDINT_H) || defined(_STDINT_H_INCLUDED) || \
434 yyjson_has_include(<stdint.h>)
436#elif defined(_MSC_VER)
438 typedef signed char int8_t;
439 typedef signed short int16_t;
440 typedef signed int int32_t;
441 typedef unsigned char uint8_t;
442 typedef unsigned short uint16_t;
443 typedef unsigned int uint32_t;
444 typedef signed __int64 int64_t;
445 typedef unsigned __int64 uint64_t;
447 typedef signed __int8 int8_t;
448 typedef signed __int16 int16_t;
449 typedef signed __int32 int32_t;
450 typedef unsigned __int8 uint8_t;
451 typedef unsigned __int16 uint16_t;
452 typedef unsigned __int32 uint32_t;
453 typedef signed __int64 int64_t;
454 typedef unsigned __int64 uint64_t;
457# if UCHAR_MAX == 0xFFU
458 typedef signed char int8_t;
459 typedef unsigned char uint8_t;
461# error cannot find 8-bit integer type
463# if USHRT_MAX == 0xFFFFU
464 typedef unsigned short uint16_t;
465 typedef signed short int16_t;
466# elif UINT_MAX == 0xFFFFU
467 typedef unsigned int uint16_t;
468 typedef signed int int16_t;
470# error cannot find 16-bit integer type
472# if UINT_MAX == 0xFFFFFFFFUL
473 typedef unsigned int uint32_t;
474 typedef signed int int32_t;
475# elif ULONG_MAX == 0xFFFFFFFFUL
476 typedef unsigned long uint32_t;
477 typedef signed long int32_t;
478# elif USHRT_MAX == 0xFFFFFFFFUL
479 typedef unsigned short uint32_t;
480 typedef signed short int32_t;
482# error cannot find 32-bit integer type
484# if defined(__INT64_TYPE__) && defined(__UINT64_TYPE__)
485 typedef __INT64_TYPE__ int64_t;
486 typedef __UINT64_TYPE__ uint64_t;
487# elif defined(__GNUC__) || defined(__clang__)
488# if !defined(_SYS_TYPES_H) && !defined(__int8_t_defined)
489 __extension__
typedef long long int64_t;
491 __extension__
typedef unsigned long long uint64_t;
492# elif defined(_LONG_LONG) || defined(__MWERKS__) || defined(_CRAYC) || \
493 defined(__SUNPRO_C) || defined(__SUNPRO_CC)
494 typedef long long int64_t;
495 typedef unsigned long long uint64_t;
496# elif (defined(__BORLANDC__) && __BORLANDC__ > 0x460) || \
497 defined(__WATCOM_INT64__) || defined (__alpha) || defined (__DECC)
498 typedef __int64 int64_t;
499 typedef unsigned __int64 uint64_t;
501# error cannot find 64-bit integer type
506#if (defined(YYJSON_HAS_STDBOOL_H) && YYJSON_HAS_STDBOOL_H) || \
507 YYJSON_MSC_VER >= 1800 || YYJSON_STDC_VER >= 199901L || \
508 (yyjson_has_include(<stdbool.h>) && !defined(__STRICT_ANSI__))
510#elif !defined(__bool_true_false_are_defined)
511# define __bool_true_false_are_defined 1
512# if defined(__cplusplus)
513# if defined(__GNUC__) && !defined(__STRICT_ANSI__)
515# if __cplusplus < 201103L
522# define bool unsigned char
531# error non 8-bit char is not supported
547#if defined(__clang__)
548# pragma clang diagnostic push
549# pragma clang diagnostic ignored "-Wunused-function"
550# pragma clang diagnostic ignored "-Wunused-parameter"
551#elif YYJSON_IS_REAL_GCC
552# if yyjson_gcc_available(4, 6, 0)
553# pragma GCC diagnostic push
555# if yyjson_gcc_available(4, 2, 0)
556# pragma GCC diagnostic ignored "-Wunused-function"
557# pragma GCC diagnostic ignored "-Wunused-parameter"
559#elif defined(_MSC_VER)
560# pragma warning(push)
561# pragma warning(disable:4800)
571#define YYJSON_VERSION_MAJOR 0
574#define YYJSON_VERSION_MINOR 12
577#define YYJSON_VERSION_PATCH 0
580#define YYJSON_VERSION_HEX 0x000C00
583#define YYJSON_VERSION_STRING "0.12.0"
597#define YYJSON_TYPE_NONE ((uint8_t)0)
599#define YYJSON_TYPE_RAW ((uint8_t)1)
601#define YYJSON_TYPE_NULL ((uint8_t)2)
603#define YYJSON_TYPE_BOOL ((uint8_t)3)
605#define YYJSON_TYPE_NUM ((uint8_t)4)
607#define YYJSON_TYPE_STR ((uint8_t)5)
609#define YYJSON_TYPE_ARR ((uint8_t)6)
611#define YYJSON_TYPE_OBJ ((uint8_t)7)
616#define YYJSON_SUBTYPE_NONE ((uint8_t)(0 << 3))
618#define YYJSON_SUBTYPE_FALSE ((uint8_t)(0 << 3))
620#define YYJSON_SUBTYPE_TRUE ((uint8_t)(1 << 3))
622#define YYJSON_SUBTYPE_UINT ((uint8_t)(0 << 3))
624#define YYJSON_SUBTYPE_SINT ((uint8_t)(1 << 3))
626#define YYJSON_SUBTYPE_REAL ((uint8_t)(2 << 3))
628#define YYJSON_SUBTYPE_NOESC ((uint8_t)(1 << 3))
631#define YYJSON_TYPE_MASK ((uint8_t)0x07)
633#define YYJSON_TYPE_BIT ((uint8_t)3)
635#define YYJSON_SUBTYPE_MASK ((uint8_t)0x18)
637#define YYJSON_SUBTYPE_BIT ((uint8_t)2)
639#define YYJSON_RESERVED_MASK ((uint8_t)0xE0)
641#define YYJSON_RESERVED_BIT ((uint8_t)3)
643#define YYJSON_TAG_MASK ((uint8_t)0xFF)
645#define YYJSON_TAG_BIT ((uint8_t)8)
648#define YYJSON_PADDING_SIZE 4
664 void *(*malloc)(
void *
ctx,
size_t size);
666 void *(*realloc)(
void *
ctx,
void *
ptr,
size_t old_size,
size_t size);
756 size_t *line,
size_t *col,
size_t *chr);
969#if !defined(YYJSON_DISABLE_READER) || !YYJSON_DISABLE_READER
1000#if !YYJSON_FREESTANDING && !YYJSON_DISABLE_FILE
1071 len, flg, NULL, NULL);
1076#if !defined(YYJSON_DISABLE_INCR_READER) || !YYJSON_DISABLE_INCR_READER
1187 size_t max = (size_t)(~(
size_t)0);
1189 if (
len >= (max - pad - mul) / mul)
return 0;
1190 return len * mul + pad;
1286#define YYJSON_WRITE_FP_FLAG_BITS 8
1289#define YYJSON_WRITE_FP_PREC_BITS 4
1295#define YYJSON_WRITE_FP_TO_FIXED(prec) ((yyjson_write_flag)( \
1296 (uint32_t)((uint32_t)(prec)) << (32 - 4) ))
1302#define YYJSON_WRITE_FP_TO_FLOAT ((yyjson_write_flag)(1 << (32 - 5)))
1343#if !defined(YYJSON_DISABLE_WRITER) || !YYJSON_DISABLE_WRITER
1375#if !YYJSON_FREESTANDING && !YYJSON_DISABLE_FILE
1506#if !YYJSON_FREESTANDING && !YYJSON_DISABLE_FILE
1642#if !YYJSON_FREESTANDING && !YYJSON_DISABLE_FILE
1771#if !YYJSON_FREESTANDING && !YYJSON_DISABLE_FILE
2060 const char *str,
size_t len);
2074 const char *raw,
size_t len);
2137 const char *str,
size_t len);
2247#define yyjson_arr_foreach(arr, idx, max, val) \
2249 (max) = yyjson_arr_size(arr), \
2250 (val) = yyjson_arr_get_first(arr); \
2253 (val) = unsafe_yyjson_get_next(val))
2284 const char *key,
size_t key_len);
2419#define yyjson_obj_foreach(obj, idx, max, key, val) \
2421 (max) = yyjson_obj_size(obj), \
2422 (key) = (obj) ? unsafe_yyjson_get_first(obj) : NULL, \
2423 (val) = (key) + 1; \
2426 (key) = unsafe_yyjson_get_next(val), \
2666 const char *str,
size_t len);
2680 const char *raw,
size_t len);
2745 const char *str,
size_t len);
2987#define yyjson_mut_arr_foreach(arr, idx, max, val) \
2989 (max) = yyjson_mut_arr_size(arr), \
2990 (val) = yyjson_mut_arr_get_first(arr); \
2993 (val) = (val)->next)
3310 yyjson_mut_doc *doc,
const char **vals,
const size_t *lens,
size_t count);
3354 yyjson_mut_doc *doc,
const char **vals,
const size_t *lens,
size_t count);
3449 size_t idx,
size_t len);
3859#define yyjson_mut_obj_foreach(obj, idx, max, key, val) \
3861 (max) = yyjson_mut_obj_size(obj), \
3862 (key) = (max) ? ((yyjson_mut_val *)(obj)->uni.ptr)->next->next : NULL, \
3863 (val) = (key) ? (key)->next : NULL; \
3866 (key) = (val)->next, \
3867 (val) = (key)->next)
3913 const char **kv_pairs,
4070 const char *key,
bool val);
4080 const char *key, uint64_t val);
4090 const char *key, int64_t val);
4100 const char *key, int64_t val);
4110 const char *key,
float val);
4120 const char *key,
double val);
4130 const char *key,
double val);
4140 const char *key,
const char *val);
4153 const char *val,
size_t len);
4178 const char *val,
size_t len);
4247 const char *new_key);
4261 const char *new_key,
4266#if !defined(YYJSON_DISABLE_UTILS) || !YYJSON_DISABLE_UTILS
4370 const char *
ptr,
size_t len);
4382 const char *
ptr,
size_t len,
4404 const char *
ptr,
size_t len);
4416 const char *
ptr,
size_t len,
4514 const char *
ptr,
size_t len,
4529 const char *
ptr,
size_t len,
4560 const char *
ptr,
size_t len,
4577 const char *
ptr,
size_t len,
4608 const char *
ptr,
size_t len,
4624 const char *
ptr,
size_t len,
4657 const char *
ptr,
size_t len,
4675 const char *
ptr,
size_t len,
5008#if YYJSON_HAS_CONSTANT_P && \
5009 (!YYJSON_IS_REAL_GCC || yyjson_gcc_available(4, 4, 0))
5023# define yyjson_repeat32_incr(x) \
5024 x(0) x(1) x(2) x(3) x(4) x(5) x(6) x(7) \
5025 x(8) x(9) x(10) x(11) x(12) x(13) x(14) x(15) \
5026 x(16) x(17) x(18) x(19) x(20) x(21) x(22) x(23) \
5027 x(24) x(25) x(26) x(27) x(28) x(29) x(30) x(31)
5028# define yyjson_check_char_noesc(i) \
5031 if (c < ' ' || c > '~' || c == '"' || c == '\\') return false; }
5032 yyjson_repeat32_incr(yyjson_check_char_noesc)
5033# undef yyjson_repeat32_incr
5034# undef yyjson_check_char_noesc
5044yyjson_api_inline double unsafe_yyjson_u64_to_f64(uint64_t num) {
5045#if YYJSON_U64_TO_F64_NO_IMPL
5046 uint64_t msb = ((uint64_t)1) << 63;
5047 if ((num & msb) == 0) {
5048 return (double)(int64_t)num;
5050 return ((double)(int64_t)((num >> 1) | (num & 1))) * (double)2.0;
5057yyjson_api_inline yyjson_type unsafe_yyjson_get_type(const void *val) {
5058 uint8_t tag = (uint8_t)((const yyjson_val *)val)->tag;
5059 return (yyjson_type)(tag & YYJSON_TYPE_MASK);
5062yyjson_api_inline yyjson_subtype unsafe_yyjson_get_subtype(const void *val) {
5063 uint8_t tag = (uint8_t)((const yyjson_val *)val)->tag;
5064 return (yyjson_subtype)(tag & YYJSON_SUBTYPE_MASK);
5067yyjson_api_inline uint8_t unsafe_yyjson_get_tag(const void *val) {
5068 uint8_t tag = (uint8_t)((const yyjson_val *)val)->tag;
5069 return (uint8_t)(tag & YYJSON_TAG_MASK);
5072yyjson_api_inline bool unsafe_yyjson_is_raw(const void *val) {
5073 return unsafe_yyjson_get_type(val) == YYJSON_TYPE_RAW;
5076yyjson_api_inline bool unsafe_yyjson_is_null(const void *val) {
5077 return unsafe_yyjson_get_type(val) == YYJSON_TYPE_NULL;
5080yyjson_api_inline bool unsafe_yyjson_is_bool(const void *val) {
5081 return unsafe_yyjson_get_type(val) == YYJSON_TYPE_BOOL;
5084yyjson_api_inline bool unsafe_yyjson_is_num(const void *val) {
5085 return unsafe_yyjson_get_type(val) == YYJSON_TYPE_NUM;
5088yyjson_api_inline bool unsafe_yyjson_is_str(const void *val) {
5089 return unsafe_yyjson_get_type(val) == YYJSON_TYPE_STR;
5092yyjson_api_inline bool unsafe_yyjson_is_arr(const void *val) {
5093 return unsafe_yyjson_get_type(val) == YYJSON_TYPE_ARR;
5096yyjson_api_inline bool unsafe_yyjson_is_obj(const void *val) {
5097 return unsafe_yyjson_get_type(val) == YYJSON_TYPE_OBJ;
5100yyjson_api_inline bool unsafe_yyjson_is_ctn(const void *val) {
5101 uint8_t mask = YYJSON_TYPE_ARR & YYJSON_TYPE_OBJ;
5102 return (unsafe_yyjson_get_tag(val) & mask) == mask;
5105yyjson_api_inline bool unsafe_yyjson_is_uint(const void *val) {
5106 const uint8_t patt = YYJSON_TYPE_NUM | YYJSON_SUBTYPE_UINT;
5107 return unsafe_yyjson_get_tag(val) == patt;
5110yyjson_api_inline bool unsafe_yyjson_is_sint(const void *val) {
5111 const uint8_t patt = YYJSON_TYPE_NUM | YYJSON_SUBTYPE_SINT;
5112 return unsafe_yyjson_get_tag(val) == patt;
5115yyjson_api_inline bool unsafe_yyjson_is_int(const void *val) {
5116 const uint8_t mask = YYJSON_TAG_MASK & (~YYJSON_SUBTYPE_SINT);
5117 const uint8_t patt = YYJSON_TYPE_NUM | YYJSON_SUBTYPE_UINT;
5118 return (unsafe_yyjson_get_tag(val) & mask) == patt;
5121yyjson_api_inline bool unsafe_yyjson_is_real(const void *val) {
5122 const uint8_t patt = YYJSON_TYPE_NUM | YYJSON_SUBTYPE_REAL;
5123 return unsafe_yyjson_get_tag(val) == patt;
5126yyjson_api_inline bool unsafe_yyjson_is_true(const void *val) {
5127 const uint8_t patt = YYJSON_TYPE_BOOL | YYJSON_SUBTYPE_TRUE;
5128 return unsafe_yyjson_get_tag(val) == patt;
5131yyjson_api_inline bool unsafe_yyjson_is_false(const void *val) {
5132 const uint8_t patt = YYJSON_TYPE_BOOL | YYJSON_SUBTYPE_FALSE;
5133 return unsafe_yyjson_get_tag(val) == patt;
5136yyjson_api_inline bool unsafe_yyjson_arr_is_flat(const yyjson_val *val) {
5137 size_t ofs = val->uni.ofs;
5138 size_t len = (size_t)(val->tag >> YYJSON_TAG_BIT);
5139 return len * sizeof(yyjson_val) + sizeof(yyjson_val) == ofs;
5142yyjson_api_inline const char *unsafe_yyjson_get_raw(const void *val) {
5143 return ((const yyjson_val *)val)->uni.str;
5146yyjson_api_inline bool unsafe_yyjson_get_bool(const void *val) {
5147 uint8_t tag = unsafe_yyjson_get_tag(val);
5148 return (bool)((tag & YYJSON_SUBTYPE_MASK) >> YYJSON_TYPE_BIT);
5151yyjson_api_inline uint64_t unsafe_yyjson_get_uint(const void *val) {
5152 return ((const yyjson_val *)val)->uni.u64;
5155yyjson_api_inline int64_t unsafe_yyjson_get_sint(const void *val) {
5156 return ((const yyjson_val *)val)->uni.i64;
5159yyjson_api_inline int unsafe_yyjson_get_int(const void *val) {
5160 return (int)((const yyjson_val *)val)->uni.i64;
5163yyjson_api_inline double unsafe_yyjson_get_real(const void *val) {
5164 return ((const yyjson_val *)val)->uni.f64;
5167yyjson_api_inline double unsafe_yyjson_get_num(const void *val) {
5168 uint8_t tag = unsafe_yyjson_get_tag(val);
5169 if (tag == (YYJSON_TYPE_NUM | YYJSON_SUBTYPE_REAL)) {
5170 return ((const yyjson_val *)val)->uni.f64;
5171 } else if (tag == (YYJSON_TYPE_NUM | YYJSON_SUBTYPE_SINT)) {
5172 return (double)((const yyjson_val *)val)->uni.i64;
5173 } else if (tag == (YYJSON_TYPE_NUM | YYJSON_SUBTYPE_UINT)) {
5174 return unsafe_yyjson_u64_to_f64(((const yyjson_val *)val)->uni.u64);
5179yyjson_api_inline const char *unsafe_yyjson_get_str(const void *val) {
5180 return ((const yyjson_val *)val)->uni.str;
5183yyjson_api_inline size_t unsafe_yyjson_get_len(const void *val) {
5184 return (size_t)(((const yyjson_val *)val)->tag >> YYJSON_TAG_BIT);
5187yyjson_api_inline yyjson_val *unsafe_yyjson_get_first(const yyjson_val *ctn) {
5188 return yyjson_constcast(yyjson_val *)ctn + 1;
5191yyjson_api_inline yyjson_val *unsafe_yyjson_get_next(const yyjson_val *val) {
5192 bool is_ctn = unsafe_yyjson_is_ctn(val);
5193 size_t ctn_ofs = val->uni.ofs;
5194 size_t ofs = (is_ctn ? ctn_ofs : sizeof(yyjson_val));
5195 uint8_t *ptr = yyjson_constcast(uint8_t *)val;
5196 return (yyjson_val *)(void *)(ptr + ofs);
5199yyjson_api_inline bool unsafe_yyjson_equals_strn(const void *val,
5200 const char *str, size_t len) {
5201 return unsafe_yyjson_get_len(val) == len &&
5202 memcmp(((const yyjson_val *)val)->uni.str, str, len) == 0;
5205yyjson_api_inline bool unsafe_yyjson_equals_str(const void *val,
5207 return unsafe_yyjson_equals_strn(val, str, strlen(str));
5210yyjson_api_inline void unsafe_yyjson_set_type(void *val, yyjson_type type,
5211 yyjson_subtype subtype) {
5212 uint8_t tag = (type | subtype);
5213 uint64_t new_tag = ((yyjson_val *)val)->tag;
5214 new_tag = (new_tag & (~(uint64_t)YYJSON_TAG_MASK)) | (uint64_t)tag;
5215 ((yyjson_val *)val)->tag = new_tag;
5218yyjson_api_inline void unsafe_yyjson_set_len(void *val, size_t len) {
5219 uint64_t tag = ((yyjson_val *)val)->tag & YYJSON_TAG_MASK;
5220 tag |= (uint64_t)len << YYJSON_TAG_BIT;
5221 ((yyjson_val *)val)->tag = tag;
5224yyjson_api_inline void unsafe_yyjson_set_tag(void *val, yyjson_type type,
5225 yyjson_subtype subtype,
5227 uint64_t tag = (uint64_t)len << YYJSON_TAG_BIT;
5228 tag |= (type | subtype);
5229 ((yyjson_val *)val)->tag = tag;
5232yyjson_api_inline void unsafe_yyjson_inc_len(void *val) {
5233 uint64_t tag = ((yyjson_val *)val)->tag;
5234 tag += (uint64_t)(1 << YYJSON_TAG_BIT);
5235 ((yyjson_val *)val)->tag = tag;
5238yyjson_api_inline void unsafe_yyjson_set_raw(void *val, const char *raw,
5240 unsafe_yyjson_set_tag(val, YYJSON_TYPE_RAW, YYJSON_SUBTYPE_NONE, len);
5241 ((yyjson_val *)val)->uni.str = raw;
5244yyjson_api_inline void unsafe_yyjson_set_null(void *val) {
5245 unsafe_yyjson_set_tag(val, YYJSON_TYPE_NULL, YYJSON_SUBTYPE_NONE, 0);
5248yyjson_api_inline void unsafe_yyjson_set_bool(void *val, bool num) {
5249 yyjson_subtype subtype = num ? YYJSON_SUBTYPE_TRUE : YYJSON_SUBTYPE_FALSE;
5250 unsafe_yyjson_set_tag(val, YYJSON_TYPE_BOOL, subtype, 0);
5253yyjson_api_inline void unsafe_yyjson_set_uint(void *val, uint64_t num) {
5254 unsafe_yyjson_set_tag(val, YYJSON_TYPE_NUM, YYJSON_SUBTYPE_UINT, 0);
5255 ((yyjson_val *)val)->uni.u64 = num;
5258yyjson_api_inline void unsafe_yyjson_set_sint(void *val, int64_t num) {
5259 unsafe_yyjson_set_tag(val, YYJSON_TYPE_NUM, YYJSON_SUBTYPE_SINT, 0);
5260 ((yyjson_val *)val)->uni.i64 = num;
5263yyjson_api_inline void unsafe_yyjson_set_fp_to_fixed(void *val, int prec) {
5264 ((yyjson_val *)val)->tag &= ~((uint64_t)YYJSON_WRITE_FP_TO_FIXED(15) << 32);
5265 ((yyjson_val *)val)->tag |= (uint64_t)YYJSON_WRITE_FP_TO_FIXED(prec) << 32;
5268yyjson_api_inline void unsafe_yyjson_set_fp_to_float(void *val, bool flt) {
5269 uint64_t flag = (uint64_t)YYJSON_WRITE_FP_TO_FLOAT << 32;
5270 if (flt) ((yyjson_val *)val)->tag |= flag;
5271 else ((yyjson_val *)val)->tag &= ~flag;
5274yyjson_api_inline void unsafe_yyjson_set_float(void *val, float num) {
5275 unsafe_yyjson_set_tag(val, YYJSON_TYPE_NUM, YYJSON_SUBTYPE_REAL, 0);
5276 ((yyjson_val *)val)->tag |= (uint64_t)YYJSON_WRITE_FP_TO_FLOAT << 32;
5277 ((yyjson_val *)val)->uni.f64 = (double)num;
5280yyjson_api_inline void unsafe_yyjson_set_double(void *val, double num) {
5281 unsafe_yyjson_set_tag(val, YYJSON_TYPE_NUM, YYJSON_SUBTYPE_REAL, 0);
5282 ((yyjson_val *)val)->uni.f64 = num;
5285yyjson_api_inline void unsafe_yyjson_set_real(void *val, double num) {
5286 unsafe_yyjson_set_tag(val, YYJSON_TYPE_NUM, YYJSON_SUBTYPE_REAL, 0);
5287 ((yyjson_val *)val)->uni.f64 = num;
5290yyjson_api_inline void unsafe_yyjson_set_str_noesc(void *val, bool noesc) {
5291 ((yyjson_val *)val)->tag &= ~(uint64_t)YYJSON_SUBTYPE_MASK;
5292 if (noesc) ((yyjson_val *)val)->tag |= (uint64_t)YYJSON_SUBTYPE_NOESC;
5295yyjson_api_inline void unsafe_yyjson_set_strn(void *val, const char *str,
5297 unsafe_yyjson_set_tag(val, YYJSON_TYPE_STR, YYJSON_SUBTYPE_NONE, len);
5298 ((yyjson_val *)val)->uni.str = str;
5301yyjson_api_inline void unsafe_yyjson_set_str(void *val, const char *str) {
5302 size_t len = strlen(str);
5303 bool noesc = unsafe_yyjson_is_str_noesc(str, len);
5304 yyjson_subtype subtype = noesc ? YYJSON_SUBTYPE_NOESC : YYJSON_SUBTYPE_NONE;
5305 unsafe_yyjson_set_tag(val, YYJSON_TYPE_STR, subtype, len);
5306 ((yyjson_val *)val)->uni.str = str;
5309yyjson_api_inline void unsafe_yyjson_set_arr(void *val, size_t size) {
5310 unsafe_yyjson_set_tag(val, YYJSON_TYPE_ARR, YYJSON_SUBTYPE_NONE, size);
5313yyjson_api_inline void unsafe_yyjson_set_obj(void *val, size_t size) {
5314 unsafe_yyjson_set_tag(val, YYJSON_TYPE_OBJ, YYJSON_SUBTYPE_NONE, size);
5319/*==============================================================================
5320 * MARK: - JSON Document API (Implementation)
5321 *============================================================================*/
5323yyjson_api_inline yyjson_val *yyjson_doc_get_root(const yyjson_doc *doc) {
5324 return doc ? doc->root : NULL;
5327yyjson_api_inline size_t yyjson_doc_get_read_size(const yyjson_doc *doc) {
5328 return doc ? doc->dat_read : 0;
5331yyjson_api_inline size_t yyjson_doc_get_val_count(const yyjson_doc *doc) {
5332 return doc ? doc->val_read : 0;
5335yyjson_api_inline void yyjson_doc_free(yyjson_doc *doc) {
5337 yyjson_alc alc = doc->alc;
5338 memset(&doc->alc, 0, sizeof(alc));
5339 if (doc->str_pool) alc.free(alc.ctx, doc->str_pool);
5340 alc.free(alc.ctx, doc);
5346/*==============================================================================
5347 * MARK: - JSON Value Type API (Implementation)
5348 *============================================================================*/
5350yyjson_api_inline bool yyjson_is_raw(const yyjson_val *val) {
5351 return val ? unsafe_yyjson_is_raw(val) : false;
5354yyjson_api_inline bool yyjson_is_null(const yyjson_val *val) {
5355 return val ? unsafe_yyjson_is_null(val) : false;
5358yyjson_api_inline bool yyjson_is_true(const yyjson_val *val) {
5359 return val ? unsafe_yyjson_is_true(val) : false;
5362yyjson_api_inline bool yyjson_is_false(const yyjson_val *val) {
5363 return val ? unsafe_yyjson_is_false(val) : false;
5366yyjson_api_inline bool yyjson_is_bool(const yyjson_val *val) {
5367 return val ? unsafe_yyjson_is_bool(val) : false;
5370yyjson_api_inline bool yyjson_is_uint(const yyjson_val *val) {
5371 return val ? unsafe_yyjson_is_uint(val) : false;
5374yyjson_api_inline bool yyjson_is_sint(const yyjson_val *val) {
5375 return val ? unsafe_yyjson_is_sint(val) : false;
5378yyjson_api_inline bool yyjson_is_int(const yyjson_val *val) {
5379 return val ? unsafe_yyjson_is_int(val) : false;
5382yyjson_api_inline bool yyjson_is_real(const yyjson_val *val) {
5383 return val ? unsafe_yyjson_is_real(val) : false;
5386yyjson_api_inline bool yyjson_is_num(const yyjson_val *val) {
5387 return val ? unsafe_yyjson_is_num(val) : false;
5390yyjson_api_inline bool yyjson_is_str(const yyjson_val *val) {
5391 return val ? unsafe_yyjson_is_str(val) : false;
5394yyjson_api_inline bool yyjson_is_arr(const yyjson_val *val) {
5395 return val ? unsafe_yyjson_is_arr(val) : false;
5398yyjson_api_inline bool yyjson_is_obj(const yyjson_val *val) {
5399 return val ? unsafe_yyjson_is_obj(val) : false;
5402yyjson_api_inline bool yyjson_is_ctn(const yyjson_val *val) {
5403 return val ? unsafe_yyjson_is_ctn(val) : false;
5408/*==============================================================================
5409 * MARK: - JSON Value Content API (Implementation)
5410 *============================================================================*/
5412yyjson_api_inline yyjson_type yyjson_get_type(const yyjson_val *val) {
5413 return val ? unsafe_yyjson_get_type(val) : YYJSON_TYPE_NONE;
5416yyjson_api_inline yyjson_subtype yyjson_get_subtype(const yyjson_val *val) {
5417 return val ? unsafe_yyjson_get_subtype(val) : YYJSON_SUBTYPE_NONE;
5420yyjson_api_inline uint8_t yyjson_get_tag(const yyjson_val *val) {
5421 return val ? unsafe_yyjson_get_tag(val) : 0;
5424yyjson_api_inline const char *yyjson_get_type_desc(const yyjson_val *val) {
5425 switch (yyjson_get_tag(val)) {
5426 case YYJSON_TYPE_RAW | YYJSON_SUBTYPE_NONE: return "raw";
5427 case YYJSON_TYPE_NULL | YYJSON_SUBTYPE_NONE: return "null";
5428 case YYJSON_TYPE_STR | YYJSON_SUBTYPE_NONE: return "string";
5429 case YYJSON_TYPE_STR | YYJSON_SUBTYPE_NOESC: return "string";
5430 case YYJSON_TYPE_ARR | YYJSON_SUBTYPE_NONE: return "array";
5431 case YYJSON_TYPE_OBJ | YYJSON_SUBTYPE_NONE: return "object";
5432 case YYJSON_TYPE_BOOL | YYJSON_SUBTYPE_TRUE: return "true";
5433 case YYJSON_TYPE_BOOL | YYJSON_SUBTYPE_FALSE: return "false";
5434 case YYJSON_TYPE_NUM | YYJSON_SUBTYPE_UINT: return "uint";
5435 case YYJSON_TYPE_NUM | YYJSON_SUBTYPE_SINT: return "sint";
5436 case YYJSON_TYPE_NUM | YYJSON_SUBTYPE_REAL: return "real";
5437 default: return "unknown";
5441yyjson_api_inline const char *yyjson_get_raw(const yyjson_val *val) {
5442 return yyjson_is_raw(val) ? unsafe_yyjson_get_raw(val) : NULL;
5445yyjson_api_inline bool yyjson_get_bool(const yyjson_val *val) {
5446 return yyjson_is_bool(val) ? unsafe_yyjson_get_bool(val) : false;
5449yyjson_api_inline uint64_t yyjson_get_uint(const yyjson_val *val) {
5450 return yyjson_is_int(val) ? unsafe_yyjson_get_uint(val) : 0;
5453yyjson_api_inline int64_t yyjson_get_sint(const yyjson_val *val) {
5454 return yyjson_is_int(val) ? unsafe_yyjson_get_sint(val) : 0;
5457yyjson_api_inline int yyjson_get_int(const yyjson_val *val) {
5458 return yyjson_is_int(val) ? unsafe_yyjson_get_int(val) : 0;
5461yyjson_api_inline double yyjson_get_real(const yyjson_val *val) {
5462 return yyjson_is_real(val) ? unsafe_yyjson_get_real(val) : 0.0;
5465yyjson_api_inline double yyjson_get_num(const yyjson_val *val) {
5466 return val ? unsafe_yyjson_get_num(val) : 0.0;
5469yyjson_api_inline const char *yyjson_get_str(const yyjson_val *val) {
5470 return yyjson_is_str(val) ? unsafe_yyjson_get_str(val) : NULL;
5473yyjson_api_inline size_t yyjson_get_len(const yyjson_val *val) {
5474 return val ? unsafe_yyjson_get_len(val) : 0;
5477yyjson_api_inline bool yyjson_equals_str(const yyjson_val *val,
5479 if (yyjson_likely(val && str)) {
5480 return unsafe_yyjson_is_str(val) &&
5481 unsafe_yyjson_equals_str(val, str);
5486yyjson_api_inline bool yyjson_equals_strn(const yyjson_val *val,
5487 const char *str, size_t len) {
5488 if (yyjson_likely(val && str)) {
5489 return unsafe_yyjson_is_str(val) &&
5490 unsafe_yyjson_equals_strn(val, str, len);
5495yyjson_api bool unsafe_yyjson_equals(const yyjson_val *lhs,
5496 const yyjson_val *rhs);
5498yyjson_api_inline bool yyjson_equals(const yyjson_val *lhs,
5499 const yyjson_val *rhs) {
5500 if (yyjson_unlikely(!lhs || !rhs)) return false;
5501 return unsafe_yyjson_equals(lhs, rhs);
5504yyjson_api_inline bool yyjson_set_raw(yyjson_val *val,
5505 const char *raw, size_t len) {
5506 if (yyjson_unlikely(!val || unsafe_yyjson_is_ctn(val))) return false;
5507 if (yyjson_unlikely(!raw)) return false;
5508 unsafe_yyjson_set_raw(val, raw, len);
5512yyjson_api_inline bool yyjson_set_null(yyjson_val *val) {
5513 if (yyjson_unlikely(!val || unsafe_yyjson_is_ctn(val))) return false;
5514 unsafe_yyjson_set_null(val);
5518yyjson_api_inline bool yyjson_set_bool(yyjson_val *val, bool num) {
5519 if (yyjson_unlikely(!val || unsafe_yyjson_is_ctn(val))) return false;
5520 unsafe_yyjson_set_bool(val, num);
5524yyjson_api_inline bool yyjson_set_uint(yyjson_val *val, uint64_t num) {
5525 if (yyjson_unlikely(!val || unsafe_yyjson_is_ctn(val))) return false;
5526 unsafe_yyjson_set_uint(val, num);
5530yyjson_api_inline bool yyjson_set_sint(yyjson_val *val, int64_t num) {
5531 if (yyjson_unlikely(!val || unsafe_yyjson_is_ctn(val))) return false;
5532 unsafe_yyjson_set_sint(val, num);
5536yyjson_api_inline bool yyjson_set_int(yyjson_val *val, int64_t num) {
5537 if (yyjson_unlikely(!val || unsafe_yyjson_is_ctn(val))) return false;
5538 unsafe_yyjson_set_sint(val, num);
5542yyjson_api_inline bool yyjson_set_float(yyjson_val *val, float num) {
5543 if (yyjson_unlikely(!val || unsafe_yyjson_is_ctn(val))) return false;
5544 unsafe_yyjson_set_float(val, num);
5548yyjson_api_inline bool yyjson_set_double(yyjson_val *val, double num) {
5549 if (yyjson_unlikely(!val || unsafe_yyjson_is_ctn(val))) return false;
5550 unsafe_yyjson_set_double(val, num);
5554yyjson_api_inline bool yyjson_set_real(yyjson_val *val, double num) {
5555 if (yyjson_unlikely(!val || unsafe_yyjson_is_ctn(val))) return false;
5556 unsafe_yyjson_set_real(val, num);
5560yyjson_api_inline bool yyjson_set_fp_to_fixed(yyjson_val *val, int prec) {
5561 if (yyjson_unlikely(!yyjson_is_real(val))) return false;
5562 unsafe_yyjson_set_fp_to_fixed(val, prec);
5566yyjson_api_inline bool yyjson_set_fp_to_float(yyjson_val *val, bool flt) {
5567 if (yyjson_unlikely(!yyjson_is_real(val))) return false;
5568 unsafe_yyjson_set_fp_to_float(val, flt);
5572yyjson_api_inline bool yyjson_set_str(yyjson_val *val, const char *str) {
5573 if (yyjson_unlikely(!val || unsafe_yyjson_is_ctn(val))) return false;
5574 if (yyjson_unlikely(!str)) return false;
5575 unsafe_yyjson_set_str(val, str);
5579yyjson_api_inline bool yyjson_set_strn(yyjson_val *val,
5580 const char *str, size_t len) {
5581 if (yyjson_unlikely(!val || unsafe_yyjson_is_ctn(val))) return false;
5582 if (yyjson_unlikely(!str)) return false;
5583 unsafe_yyjson_set_strn(val, str, len);
5587yyjson_api_inline bool yyjson_set_str_noesc(yyjson_val *val, bool noesc) {
5588 if (yyjson_unlikely(!yyjson_is_str(val))) return false;
5589 unsafe_yyjson_set_str_noesc(val, noesc);
5595/*==============================================================================
5596 * MARK: - JSON Array API (Implementation)
5597 *============================================================================*/
5599yyjson_api_inline size_t yyjson_arr_size(const yyjson_val *arr) {
5600 return yyjson_is_arr(arr) ? unsafe_yyjson_get_len(arr) : 0;
5603yyjson_api_inline yyjson_val *yyjson_arr_get(const yyjson_val *arr,
5605 if (yyjson_likely(yyjson_is_arr(arr))) {
5606 if (yyjson_likely(unsafe_yyjson_get_len(arr) > idx)) {
5607 yyjson_val *val = unsafe_yyjson_get_first(arr);
5608 if (unsafe_yyjson_arr_is_flat(arr)) {
5611 while (idx-- > 0) val = unsafe_yyjson_get_next(val);
5619yyjson_api_inline yyjson_val *yyjson_arr_get_first(const yyjson_val *arr) {
5620 if (yyjson_likely(yyjson_is_arr(arr))) {
5621 if (yyjson_likely(unsafe_yyjson_get_len(arr) > 0)) {
5622 return unsafe_yyjson_get_first(arr);
5628yyjson_api_inline yyjson_val *yyjson_arr_get_last(const yyjson_val *arr) {
5629 if (yyjson_likely(yyjson_is_arr(arr))) {
5630 size_t len = unsafe_yyjson_get_len(arr);
5631 if (yyjson_likely(len > 0)) {
5632 yyjson_val *val = unsafe_yyjson_get_first(arr);
5633 if (unsafe_yyjson_arr_is_flat(arr)) {
5634 return val + (len - 1);
5636 while (len-- > 1) val = unsafe_yyjson_get_next(val);
5646/*==============================================================================
5647 * MARK: - JSON Array Iterator API (Implementation)
5648 *============================================================================*/
5650yyjson_api_inline bool yyjson_arr_iter_init(const yyjson_val *arr,
5651 yyjson_arr_iter *iter) {
5652 if (yyjson_likely(yyjson_is_arr(arr) && iter)) {
5654 iter->max = unsafe_yyjson_get_len(arr);
5655 iter->cur = unsafe_yyjson_get_first(arr);
5658 if (iter) memset(iter, 0, sizeof(yyjson_arr_iter));
5662yyjson_api_inline yyjson_arr_iter yyjson_arr_iter_with(const yyjson_val *arr) {
5663 yyjson_arr_iter iter;
5664 yyjson_arr_iter_init(arr, &iter);
5668yyjson_api_inline bool yyjson_arr_iter_has_next(yyjson_arr_iter *iter) {
5669 return iter ? iter->idx < iter->max : false;
5672yyjson_api_inline yyjson_val *yyjson_arr_iter_next(yyjson_arr_iter *iter) {
5674 if (iter && iter->idx < iter->max) {
5676 iter->cur = unsafe_yyjson_get_next(val);
5685/*==============================================================================
5686 * MARK: - JSON Object API (Implementation)
5687 *============================================================================*/
5689yyjson_api_inline size_t yyjson_obj_size(const yyjson_val *obj) {
5690 return yyjson_is_obj(obj) ? unsafe_yyjson_get_len(obj) : 0;
5693yyjson_api_inline yyjson_val *yyjson_obj_get(const yyjson_val *obj,
5695 return yyjson_obj_getn(obj, key, key ? strlen(key) : 0);
5698yyjson_api_inline yyjson_val *yyjson_obj_getn(const yyjson_val *obj,
5701 if (yyjson_likely(yyjson_is_obj(obj) && _key)) {
5702 size_t len = unsafe_yyjson_get_len(obj);
5703 yyjson_val *key = unsafe_yyjson_get_first(obj);
5705 if (unsafe_yyjson_equals_strn(key, _key, key_len)) return key + 1;
5706 key = unsafe_yyjson_get_next(key + 1);
5714/*==============================================================================
5715 * MARK: - JSON Object Iterator API (Implementation)
5716 *============================================================================*/
5718yyjson_api_inline bool yyjson_obj_iter_init(const yyjson_val *obj,
5719 yyjson_obj_iter *iter) {
5720 if (yyjson_likely(yyjson_is_obj(obj) && iter)) {
5722 iter->max = unsafe_yyjson_get_len(obj);
5723 iter->cur = unsafe_yyjson_get_first(obj);
5724 iter->obj = yyjson_constcast(yyjson_val *)obj;
5727 if (iter) memset(iter, 0, sizeof(yyjson_obj_iter));
5731yyjson_api_inline yyjson_obj_iter yyjson_obj_iter_with(const yyjson_val *obj) {
5732 yyjson_obj_iter iter;
5733 yyjson_obj_iter_init(obj, &iter);
5737yyjson_api_inline bool yyjson_obj_iter_has_next(yyjson_obj_iter *iter) {
5738 return iter ? iter->idx < iter->max : false;
5741yyjson_api_inline yyjson_val *yyjson_obj_iter_next(yyjson_obj_iter *iter) {
5742 if (iter && iter->idx < iter->max) {
5743 yyjson_val *key = iter->cur;
5745 iter->cur = unsafe_yyjson_get_next(key + 1);
5751yyjson_api_inline yyjson_val *yyjson_obj_iter_get_val(yyjson_val *key) {
5752 return key ? key + 1 : NULL;
5755yyjson_api_inline yyjson_val *yyjson_obj_iter_get(yyjson_obj_iter *iter,
5757 return yyjson_obj_iter_getn(iter, key, key ? strlen(key) : 0);
5760yyjson_api_inline yyjson_val *yyjson_obj_iter_getn(yyjson_obj_iter *iter,
5764 size_t idx = iter->idx;
5765 size_t max = iter->max;
5766 yyjson_val *cur = iter->cur;
5767 if (yyjson_unlikely(idx == max)) {
5769 cur = unsafe_yyjson_get_first(iter->obj);
5771 while (idx++ < max) {
5772 yyjson_val *next = unsafe_yyjson_get_next(cur + 1);
5773 if (unsafe_yyjson_equals_strn(cur, key, key_len)) {
5779 if (idx == iter->max && iter->idx < iter->max) {
5782 cur = unsafe_yyjson_get_first(iter->obj);
5791/*==============================================================================
5792 * MARK: - Mutable JSON Structure (Implementation)
5793 *============================================================================*/
5800struct yyjson_mut_val {
5801 uint64_t tag; /**< type, subtype and length */
5802 yyjson_val_uni uni; /**< payload */
5803 yyjson_mut_val *next; /**< the next value in circular linked list */
5809typedef struct yyjson_str_chunk {
5810 struct yyjson_str_chunk *next; /* next chunk linked list */
5811 size_t chunk_size; /* chunk size in bytes */
5812 /* char str[]; flexible array member */
5818typedef struct yyjson_str_pool {
5819 char *cur; /* cursor inside current chunk */
5820 char *end; /* the end of current chunk */
5821 size_t chunk_size; /* chunk size in bytes while creating new chunk */
5822 size_t chunk_size_max; /* maximum chunk size in bytes */
5823 yyjson_str_chunk *chunks; /* a linked list of chunks, nullable */
5830typedef struct yyjson_val_chunk {
5831 struct yyjson_val_chunk *next; /* next chunk linked list */
5832 size_t chunk_size; /* chunk size in bytes */
5833 /* char pad[sizeof(yyjson_mut_val) - sizeof(yyjson_val_chunk)]; padding */
5834 /* yyjson_mut_val vals[]; flexible array member */
5840typedef struct yyjson_val_pool {
5841 yyjson_mut_val *cur; /* cursor inside current chunk */
5842 yyjson_mut_val *end; /* the end of current chunk */
5843 size_t chunk_size; /* chunk size in bytes while creating new chunk */
5844 size_t chunk_size_max; /* maximum chunk size in bytes */
5845 yyjson_val_chunk *chunks; /* a linked list of chunks, nullable */
5848struct yyjson_mut_doc {
5849 yyjson_mut_val *root; /**< root value of the JSON document, nullable */
5850 yyjson_alc alc; /**< a valid allocator, nonnull */
5851 yyjson_str_pool str_pool; /**< string memory pool */
5852 yyjson_val_pool val_pool; /**< value memory pool */
5855/* Ensures the capacity to at least equal to the specified byte length. */
5856yyjson_api bool unsafe_yyjson_str_pool_grow(yyjson_str_pool *pool,
5857 const yyjson_alc *alc,
5860/* Ensures the capacity to at least equal to the specified value count. */
5861yyjson_api bool unsafe_yyjson_val_pool_grow(yyjson_val_pool *pool,
5862 const yyjson_alc *alc,
5865/* Allocate memory for string. */
5866yyjson_api_inline char *unsafe_yyjson_mut_str_alc(yyjson_mut_doc *doc,
5869 const yyjson_alc *alc = &doc->alc;
5870 yyjson_str_pool *pool = &doc->str_pool;
5871 /* `len + 1` is used below to reserve space for a null terminator;
5872 reject the value that would wrap it to 0 and produce an under-sized
5873 allocation with an out-of-bounds memcpy at the call sites. */
5874 if (yyjson_unlikely(len == (size_t)-1)) return NULL;
5875 if (yyjson_unlikely((size_t)(pool->end - pool->cur) <= len)) {
5876 if (yyjson_unlikely(!unsafe_yyjson_str_pool_grow(pool, alc, len + 1))) {
5881 pool->cur = mem + len + 1;
5885yyjson_api_inline char *unsafe_yyjson_mut_strncpy(yyjson_mut_doc *doc,
5886 const char *str, size_t len) {
5887 char *mem = unsafe_yyjson_mut_str_alc(doc, len);
5888 if (yyjson_unlikely(!mem)) return NULL;
5889 memcpy((void *)mem, (const void *)str, len);
5894yyjson_api_inline yyjson_mut_val *unsafe_yyjson_mut_val(yyjson_mut_doc *doc,
5896 yyjson_mut_val *val;
5897 yyjson_alc *alc = &doc->alc;
5898 yyjson_val_pool *pool = &doc->val_pool;
5899 if (yyjson_unlikely((size_t)(pool->end - pool->cur) < count)) {
5900 if (yyjson_unlikely(!unsafe_yyjson_val_pool_grow(pool, alc, count))) {
5911/*==============================================================================
5912 * MARK: - Mutable JSON Document API (Implementation)
5913 *============================================================================*/
5915yyjson_api_inline yyjson_mut_val *yyjson_mut_doc_get_root(yyjson_mut_doc *doc) {
5916 return doc ? doc->root : NULL;
5919yyjson_api_inline void yyjson_mut_doc_set_root(yyjson_mut_doc *doc,
5920 yyjson_mut_val *root) {
5921 if (doc) doc->root = root;
5926/*==============================================================================
5927 * MARK: - Mutable JSON Value Type API (Implementation)
5928 *============================================================================*/
5930yyjson_api_inline bool yyjson_mut_is_raw(const yyjson_mut_val *val) {
5931 return val ? unsafe_yyjson_is_raw(val) : false;
5934yyjson_api_inline bool yyjson_mut_is_null(const yyjson_mut_val *val) {
5935 return val ? unsafe_yyjson_is_null(val) : false;
5938yyjson_api_inline bool yyjson_mut_is_true(const yyjson_mut_val *val) {
5939 return val ? unsafe_yyjson_is_true(val) : false;
5942yyjson_api_inline bool yyjson_mut_is_false(const yyjson_mut_val *val) {
5943 return val ? unsafe_yyjson_is_false(val) : false;
5946yyjson_api_inline bool yyjson_mut_is_bool(const yyjson_mut_val *val) {
5947 return val ? unsafe_yyjson_is_bool(val) : false;
5950yyjson_api_inline bool yyjson_mut_is_uint(const yyjson_mut_val *val) {
5951 return val ? unsafe_yyjson_is_uint(val) : false;
5954yyjson_api_inline bool yyjson_mut_is_sint(const yyjson_mut_val *val) {
5955 return val ? unsafe_yyjson_is_sint(val) : false;
5958yyjson_api_inline bool yyjson_mut_is_int(const yyjson_mut_val *val) {
5959 return val ? unsafe_yyjson_is_int(val) : false;
5962yyjson_api_inline bool yyjson_mut_is_real(const yyjson_mut_val *val) {
5963 return val ? unsafe_yyjson_is_real(val) : false;
5966yyjson_api_inline bool yyjson_mut_is_num(const yyjson_mut_val *val) {
5967 return val ? unsafe_yyjson_is_num(val) : false;
5970yyjson_api_inline bool yyjson_mut_is_str(const yyjson_mut_val *val) {
5971 return val ? unsafe_yyjson_is_str(val) : false;
5974yyjson_api_inline bool yyjson_mut_is_arr(const yyjson_mut_val *val) {
5975 return val ? unsafe_yyjson_is_arr(val) : false;
5978yyjson_api_inline bool yyjson_mut_is_obj(const yyjson_mut_val *val) {
5979 return val ? unsafe_yyjson_is_obj(val) : false;
5982yyjson_api_inline bool yyjson_mut_is_ctn(const yyjson_mut_val *val) {
5983 return val ? unsafe_yyjson_is_ctn(val) : false;
5988/*==============================================================================
5989 * MARK: - Mutable JSON Value Content API (Implementation)
5990 *============================================================================*/
5992yyjson_api_inline yyjson_type yyjson_mut_get_type(const yyjson_mut_val *val) {
5993 return yyjson_get_type((const yyjson_val *)val);
5996yyjson_api_inline yyjson_subtype yyjson_mut_get_subtype(
5997 const yyjson_mut_val *val) {
5998 return yyjson_get_subtype((const yyjson_val *)val);
6001yyjson_api_inline uint8_t yyjson_mut_get_tag(const yyjson_mut_val *val) {
6002 return yyjson_get_tag((const yyjson_val *)val);
6005yyjson_api_inline const char *yyjson_mut_get_type_desc(
6006 const yyjson_mut_val *val) {
6007 return yyjson_get_type_desc((const yyjson_val *)val);
6010yyjson_api_inline const char *yyjson_mut_get_raw(const yyjson_mut_val *val) {
6011 return yyjson_get_raw((const yyjson_val *)val);
6014yyjson_api_inline bool yyjson_mut_get_bool(const yyjson_mut_val *val) {
6015 return yyjson_get_bool((const yyjson_val *)val);
6018yyjson_api_inline uint64_t yyjson_mut_get_uint(const yyjson_mut_val *val) {
6019 return yyjson_get_uint((const yyjson_val *)val);
6022yyjson_api_inline int64_t yyjson_mut_get_sint(const yyjson_mut_val *val) {
6023 return yyjson_get_sint((const yyjson_val *)val);
6026yyjson_api_inline int yyjson_mut_get_int(const yyjson_mut_val *val) {
6027 return yyjson_get_int((const yyjson_val *)val);
6030yyjson_api_inline double yyjson_mut_get_real(const yyjson_mut_val *val) {
6031 return yyjson_get_real((const yyjson_val *)val);
6034yyjson_api_inline double yyjson_mut_get_num(const yyjson_mut_val *val) {
6035 return yyjson_get_num((const yyjson_val *)val);
6038yyjson_api_inline const char *yyjson_mut_get_str(const yyjson_mut_val *val) {
6039 return yyjson_get_str((const yyjson_val *)val);
6042yyjson_api_inline size_t yyjson_mut_get_len(const yyjson_mut_val *val) {
6043 return yyjson_get_len((const yyjson_val *)val);
6046yyjson_api_inline bool yyjson_mut_equals_str(const yyjson_mut_val *val,
6048 return yyjson_equals_str((const yyjson_val *)val, str);
6051yyjson_api_inline bool yyjson_mut_equals_strn(const yyjson_mut_val *val,
6052 const char *str, size_t len) {
6053 return yyjson_equals_strn((const yyjson_val *)val, str, len);
6056yyjson_api bool unsafe_yyjson_mut_equals(const yyjson_mut_val *lhs,
6057 const yyjson_mut_val *rhs);
6059yyjson_api_inline bool yyjson_mut_equals(const yyjson_mut_val *lhs,
6060 const yyjson_mut_val *rhs) {
6061 if (yyjson_unlikely(!lhs || !rhs)) return false;
6062 return unsafe_yyjson_mut_equals(lhs, rhs);
6065yyjson_api_inline bool yyjson_mut_set_raw(yyjson_mut_val *val,
6066 const char *raw, size_t len) {
6067 if (yyjson_unlikely(!val || !raw)) return false;
6068 unsafe_yyjson_set_raw(val, raw, len);
6072yyjson_api_inline bool yyjson_mut_set_null(yyjson_mut_val *val) {
6073 if (yyjson_unlikely(!val)) return false;
6074 unsafe_yyjson_set_null(val);
6078yyjson_api_inline bool yyjson_mut_set_bool(yyjson_mut_val *val, bool num) {
6079 if (yyjson_unlikely(!val)) return false;
6080 unsafe_yyjson_set_bool(val, num);
6084yyjson_api_inline bool yyjson_mut_set_uint(yyjson_mut_val *val, uint64_t num) {
6085 if (yyjson_unlikely(!val)) return false;
6086 unsafe_yyjson_set_uint(val, num);
6090yyjson_api_inline bool yyjson_mut_set_sint(yyjson_mut_val *val, int64_t num) {
6091 if (yyjson_unlikely(!val)) return false;
6092 unsafe_yyjson_set_sint(val, num);
6096yyjson_api_inline bool yyjson_mut_set_int(yyjson_mut_val *val, int64_t num) {
6097 if (yyjson_unlikely(!val)) return false;
6098 unsafe_yyjson_set_sint(val, num);
6102yyjson_api_inline bool yyjson_mut_set_float(yyjson_mut_val *val, float num) {
6103 if (yyjson_unlikely(!val)) return false;
6104 unsafe_yyjson_set_float(val, num);
6108yyjson_api_inline bool yyjson_mut_set_double(yyjson_mut_val *val, double num) {
6109 if (yyjson_unlikely(!val)) return false;
6110 unsafe_yyjson_set_double(val, num);
6114yyjson_api_inline bool yyjson_mut_set_real(yyjson_mut_val *val, double num) {
6115 if (yyjson_unlikely(!val)) return false;
6116 unsafe_yyjson_set_real(val, num);
6120yyjson_api_inline bool yyjson_mut_set_fp_to_fixed(yyjson_mut_val *val,
6122 if (yyjson_unlikely(!yyjson_mut_is_real(val))) return false;
6123 unsafe_yyjson_set_fp_to_fixed(val, prec);
6127yyjson_api_inline bool yyjson_mut_set_fp_to_float(yyjson_mut_val *val,
6129 if (yyjson_unlikely(!yyjson_mut_is_real(val))) return false;
6130 unsafe_yyjson_set_fp_to_float(val, flt);
6134yyjson_api_inline bool yyjson_mut_set_str(yyjson_mut_val *val,
6136 if (yyjson_unlikely(!val || !str)) return false;
6137 unsafe_yyjson_set_str(val, str);
6141yyjson_api_inline bool yyjson_mut_set_strn(yyjson_mut_val *val,
6142 const char *str, size_t len) {
6143 if (yyjson_unlikely(!val || !str)) return false;
6144 unsafe_yyjson_set_strn(val, str, len);
6148yyjson_api_inline bool yyjson_mut_set_str_noesc(yyjson_mut_val *val,
6150 if (yyjson_unlikely(!yyjson_mut_is_str(val))) return false;
6151 unsafe_yyjson_set_str_noesc(val, noesc);
6155yyjson_api_inline bool yyjson_mut_set_arr(yyjson_mut_val *val) {
6156 if (yyjson_unlikely(!val)) return false;
6157 unsafe_yyjson_set_arr(val, 0);
6161yyjson_api_inline bool yyjson_mut_set_obj(yyjson_mut_val *val) {
6162 if (yyjson_unlikely(!val)) return false;
6163 unsafe_yyjson_set_obj(val, 0);
6169/*==============================================================================
6170 * MARK: - Mutable JSON Value Creation API (Implementation)
6171 *============================================================================*/
6173#define yyjson_mut_val_one(func) \
6174 if (yyjson_likely(doc)) { \
6175 yyjson_mut_val *val = unsafe_yyjson_mut_val(doc, 1); \
6176 if (yyjson_likely(val)) { \
6183#define yyjson_mut_val_one_str(func) \
6184 if (yyjson_likely(doc && str)) { \
6185 yyjson_mut_val *val = unsafe_yyjson_mut_val(doc, 1); \
6186 if (yyjson_likely(val)) { \
6193yyjson_api_inline yyjson_mut_val *yyjson_mut_raw(yyjson_mut_doc *doc,
6195 yyjson_mut_val_one_str({ unsafe_yyjson_set_raw(val, str, strlen(str)); });
6198yyjson_api_inline yyjson_mut_val *yyjson_mut_rawn(yyjson_mut_doc *doc,
6201 yyjson_mut_val_one_str({ unsafe_yyjson_set_raw(val, str, len); });
6204yyjson_api_inline yyjson_mut_val *yyjson_mut_rawcpy(yyjson_mut_doc *doc,
6206 yyjson_mut_val_one_str({
6207 size_t len = strlen(str);
6208 char *new_str = unsafe_yyjson_mut_strncpy(doc, str, len);
6209 if (yyjson_unlikely(!new_str)) return NULL;
6210 unsafe_yyjson_set_raw(val, new_str, len);
6214yyjson_api_inline yyjson_mut_val *yyjson_mut_rawncpy(yyjson_mut_doc *doc,
6217 yyjson_mut_val_one_str({
6218 char *new_str = unsafe_yyjson_mut_strncpy(doc, str, len);
6219 if (yyjson_unlikely(!new_str)) return NULL;
6220 unsafe_yyjson_set_raw(val, new_str, len);
6224yyjson_api_inline yyjson_mut_val *yyjson_mut_null(yyjson_mut_doc *doc) {
6225 yyjson_mut_val_one({ unsafe_yyjson_set_null(val); });
6228yyjson_api_inline yyjson_mut_val *yyjson_mut_true(yyjson_mut_doc *doc) {
6229 yyjson_mut_val_one({ unsafe_yyjson_set_bool(val, true); });
6232yyjson_api_inline yyjson_mut_val *yyjson_mut_false(yyjson_mut_doc *doc) {
6233 yyjson_mut_val_one({ unsafe_yyjson_set_bool(val, false); });
6236yyjson_api_inline yyjson_mut_val *yyjson_mut_bool(yyjson_mut_doc *doc,
6238 yyjson_mut_val_one({ unsafe_yyjson_set_bool(val, _val); });
6241yyjson_api_inline yyjson_mut_val *yyjson_mut_uint(yyjson_mut_doc *doc,
6243 yyjson_mut_val_one({ unsafe_yyjson_set_uint(val, num); });
6246yyjson_api_inline yyjson_mut_val *yyjson_mut_sint(yyjson_mut_doc *doc,
6248 yyjson_mut_val_one({ unsafe_yyjson_set_sint(val, num); });
6251yyjson_api_inline yyjson_mut_val *yyjson_mut_int(yyjson_mut_doc *doc,
6253 yyjson_mut_val_one({ unsafe_yyjson_set_sint(val, num); });
6256yyjson_api_inline yyjson_mut_val *yyjson_mut_float(yyjson_mut_doc *doc,
6258 yyjson_mut_val_one({ unsafe_yyjson_set_float(val, num); });
6261yyjson_api_inline yyjson_mut_val *yyjson_mut_double(yyjson_mut_doc *doc,
6263 yyjson_mut_val_one({ unsafe_yyjson_set_double(val, num); });
6266yyjson_api_inline yyjson_mut_val *yyjson_mut_real(yyjson_mut_doc *doc,
6268 yyjson_mut_val_one({ unsafe_yyjson_set_real(val, num); });
6271yyjson_api_inline yyjson_mut_val *yyjson_mut_str(yyjson_mut_doc *doc,
6273 yyjson_mut_val_one_str({ unsafe_yyjson_set_str(val, str); });
6276yyjson_api_inline yyjson_mut_val *yyjson_mut_strn(yyjson_mut_doc *doc,
6279 yyjson_mut_val_one_str({ unsafe_yyjson_set_strn(val, str, len); });
6282yyjson_api_inline yyjson_mut_val *yyjson_mut_strcpy(yyjson_mut_doc *doc,
6284 yyjson_mut_val_one_str({
6285 size_t len = strlen(str);
6286 bool noesc = unsafe_yyjson_is_str_noesc(str, len);
6287 yyjson_subtype sub = noesc ? YYJSON_SUBTYPE_NOESC : YYJSON_SUBTYPE_NONE;
6288 char *new_str = unsafe_yyjson_mut_strncpy(doc, str, len);
6289 if (yyjson_unlikely(!new_str)) return NULL;
6290 unsafe_yyjson_set_tag(val, YYJSON_TYPE_STR, sub, len);
6291 val->uni.str = new_str;
6295yyjson_api_inline yyjson_mut_val *yyjson_mut_strncpy(yyjson_mut_doc *doc,
6298 yyjson_mut_val_one_str({
6299 char *new_str = unsafe_yyjson_mut_strncpy(doc, str, len);
6300 if (yyjson_unlikely(!new_str)) return NULL;
6301 unsafe_yyjson_set_strn(val, new_str, len);
6305#undef yyjson_mut_val_one
6306#undef yyjson_mut_val_one_str
6310/*==============================================================================
6311 * MARK: - Mutable JSON Array API (Implementation)
6312 *============================================================================*/
6314yyjson_api_inline size_t yyjson_mut_arr_size(const yyjson_mut_val *arr) {
6315 return yyjson_mut_is_arr(arr) ? unsafe_yyjson_get_len(arr) : 0;
6318yyjson_api_inline yyjson_mut_val *yyjson_mut_arr_get(const yyjson_mut_val *arr,
6320 if (yyjson_likely(idx < yyjson_mut_arr_size(arr))) {
6321 yyjson_mut_val *val = (yyjson_mut_val *)arr->uni.ptr;
6322 while (idx-- > 0) val = val->next;
6328yyjson_api_inline yyjson_mut_val *yyjson_mut_arr_get_first(
6329 const yyjson_mut_val *arr) {
6330 if (yyjson_likely(yyjson_mut_arr_size(arr) > 0)) {
6331 return ((yyjson_mut_val *)arr->uni.ptr)->next;
6336yyjson_api_inline yyjson_mut_val *yyjson_mut_arr_get_last(
6337 const yyjson_mut_val *arr) {
6338 if (yyjson_likely(yyjson_mut_arr_size(arr) > 0)) {
6339 return ((yyjson_mut_val *)arr->uni.ptr);
6346/*==============================================================================
6347 * MARK: - Mutable JSON Array Iterator API (Implementation)
6348 *============================================================================*/
6350yyjson_api_inline bool yyjson_mut_arr_iter_init(yyjson_mut_val *arr,
6351 yyjson_mut_arr_iter *iter) {
6352 if (yyjson_likely(yyjson_mut_is_arr(arr) && iter)) {
6354 iter->max = unsafe_yyjson_get_len(arr);
6355 iter->cur = iter->max ? (yyjson_mut_val *)arr->uni.ptr : NULL;
6360 if (iter) memset(iter, 0, sizeof(yyjson_mut_arr_iter));
6364yyjson_api_inline yyjson_mut_arr_iter yyjson_mut_arr_iter_with(
6365 yyjson_mut_val *arr) {
6366 yyjson_mut_arr_iter iter;
6367 yyjson_mut_arr_iter_init(arr, &iter);
6371yyjson_api_inline bool yyjson_mut_arr_iter_has_next(yyjson_mut_arr_iter *iter) {
6372 return iter ? iter->idx < iter->max : false;
6375yyjson_api_inline yyjson_mut_val *yyjson_mut_arr_iter_next(
6376 yyjson_mut_arr_iter *iter) {
6377 if (iter && iter->idx < iter->max) {
6378 yyjson_mut_val *val = iter->cur;
6380 iter->cur = val->next;
6387yyjson_api_inline yyjson_mut_val *yyjson_mut_arr_iter_remove(
6388 yyjson_mut_arr_iter *iter) {
6389 if (yyjson_likely(iter && 0 < iter->idx && iter->idx <= iter->max)) {
6390 yyjson_mut_val *prev = iter->pre;
6391 yyjson_mut_val *cur = iter->cur;
6392 yyjson_mut_val *next = cur->next;
6393 if (yyjson_unlikely(iter->idx == iter->max)) iter->arr->uni.ptr = prev;
6396 unsafe_yyjson_set_len(iter->arr, iter->max);
6406/*==============================================================================
6407 * MARK: - Mutable JSON Array Creation API (Implementation)
6408 *============================================================================*/
6410yyjson_api_inline yyjson_mut_val *yyjson_mut_arr(yyjson_mut_doc *doc) {
6411 if (yyjson_likely(doc)) {
6412 yyjson_mut_val *val = unsafe_yyjson_mut_val(doc, 1);
6413 if (yyjson_likely(val)) {
6414 val->tag = YYJSON_TYPE_ARR | YYJSON_SUBTYPE_NONE;
6421#define yyjson_mut_arr_with_func(func) \
6422 if (yyjson_likely(doc && ((0 < count && count < \
6423 (~(size_t)0) / sizeof(yyjson_mut_val) && vals) || count == 0))) { \
6424 yyjson_mut_val *arr = unsafe_yyjson_mut_val(doc, 1 + count); \
6425 if (yyjson_likely(arr)) { \
6426 arr->tag = ((uint64_t)count << YYJSON_TAG_BIT) | YYJSON_TYPE_ARR; \
6429 for (i = 0; i < count; i++) { \
6430 yyjson_mut_val *val = arr + i + 1; \
6432 val->next = val + 1; \
6434 arr[count].next = arr + 1; \
6435 arr->uni.ptr = arr + count; \
6442yyjson_api_inline yyjson_mut_val *yyjson_mut_arr_with_bool(
6443 yyjson_mut_doc *doc, const bool *vals, size_t count) {
6444 yyjson_mut_arr_with_func({
6445 unsafe_yyjson_set_bool(val, vals[i]);
6449yyjson_api_inline yyjson_mut_val *yyjson_mut_arr_with_sint(
6450 yyjson_mut_doc *doc, const int64_t *vals, size_t count) {
6451 return yyjson_mut_arr_with_sint64(doc, vals, count);
6454yyjson_api_inline yyjson_mut_val *yyjson_mut_arr_with_uint(
6455 yyjson_mut_doc *doc, const uint64_t *vals, size_t count) {
6456 return yyjson_mut_arr_with_uint64(doc, vals, count);
6459yyjson_api_inline yyjson_mut_val *yyjson_mut_arr_with_real(
6460 yyjson_mut_doc *doc, const double *vals, size_t count) {
6461 yyjson_mut_arr_with_func({
6462 unsafe_yyjson_set_real(val, vals[i]);
6466yyjson_api_inline yyjson_mut_val *yyjson_mut_arr_with_sint8(
6467 yyjson_mut_doc *doc, const int8_t *vals, size_t count) {
6468 yyjson_mut_arr_with_func({
6469 unsafe_yyjson_set_sint(val, vals[i]);
6473yyjson_api_inline yyjson_mut_val *yyjson_mut_arr_with_sint16(
6474 yyjson_mut_doc *doc, const int16_t *vals, size_t count) {
6475 yyjson_mut_arr_with_func({
6476 unsafe_yyjson_set_sint(val, vals[i]);
6480yyjson_api_inline yyjson_mut_val *yyjson_mut_arr_with_sint32(
6481 yyjson_mut_doc *doc, const int32_t *vals, size_t count) {
6482 yyjson_mut_arr_with_func({
6483 unsafe_yyjson_set_sint(val, vals[i]);
6487yyjson_api_inline yyjson_mut_val *yyjson_mut_arr_with_sint64(
6488 yyjson_mut_doc *doc, const int64_t *vals, size_t count) {
6489 yyjson_mut_arr_with_func({
6490 unsafe_yyjson_set_sint(val, vals[i]);
6494yyjson_api_inline yyjson_mut_val *yyjson_mut_arr_with_uint8(
6495 yyjson_mut_doc *doc, const uint8_t *vals, size_t count) {
6496 yyjson_mut_arr_with_func({
6497 unsafe_yyjson_set_uint(val, vals[i]);
6501yyjson_api_inline yyjson_mut_val *yyjson_mut_arr_with_uint16(
6502 yyjson_mut_doc *doc, const uint16_t *vals, size_t count) {
6503 yyjson_mut_arr_with_func({
6504 unsafe_yyjson_set_uint(val, vals[i]);
6508yyjson_api_inline yyjson_mut_val *yyjson_mut_arr_with_uint32(
6509 yyjson_mut_doc *doc, const uint32_t *vals, size_t count) {
6510 yyjson_mut_arr_with_func({
6511 unsafe_yyjson_set_uint(val, vals[i]);
6515yyjson_api_inline yyjson_mut_val *yyjson_mut_arr_with_uint64(
6516 yyjson_mut_doc *doc, const uint64_t *vals, size_t count) {
6517 yyjson_mut_arr_with_func({
6518 unsafe_yyjson_set_uint(val, vals[i]);
6522yyjson_api_inline yyjson_mut_val *yyjson_mut_arr_with_float(
6523 yyjson_mut_doc *doc, const float *vals, size_t count) {
6524 yyjson_mut_arr_with_func({
6525 unsafe_yyjson_set_float(val, vals[i]);
6529yyjson_api_inline yyjson_mut_val *yyjson_mut_arr_with_double(
6530 yyjson_mut_doc *doc, const double *vals, size_t count) {
6531 yyjson_mut_arr_with_func({
6532 unsafe_yyjson_set_double(val, vals[i]);
6536yyjson_api_inline yyjson_mut_val *yyjson_mut_arr_with_str(
6537 yyjson_mut_doc *doc, const char **vals, size_t count) {
6538 yyjson_mut_arr_with_func({
6539 if (yyjson_unlikely(!vals[i])) return NULL;
6540 unsafe_yyjson_set_str(val, vals[i]);
6544yyjson_api_inline yyjson_mut_val *yyjson_mut_arr_with_strn(
6545 yyjson_mut_doc *doc, const char **vals, const size_t *lens, size_t count) {
6546 if (yyjson_unlikely(count > 0 && !lens)) return NULL;
6547 yyjson_mut_arr_with_func({
6548 if (yyjson_unlikely(!vals[i])) return NULL;
6549 unsafe_yyjson_set_strn(val, vals[i], lens[i]);
6553yyjson_api_inline yyjson_mut_val *yyjson_mut_arr_with_strcpy(
6554 yyjson_mut_doc *doc, const char **vals, size_t count) {
6556 const char *str, *new_str;
6557 yyjson_mut_arr_with_func({
6559 if (yyjson_unlikely(!str)) return NULL;
6561 new_str = unsafe_yyjson_mut_strncpy(doc, str, len);
6562 if (yyjson_unlikely(!new_str)) return NULL;
6563 unsafe_yyjson_set_strn(val, new_str, len);
6567yyjson_api_inline yyjson_mut_val *yyjson_mut_arr_with_strncpy(
6568 yyjson_mut_doc *doc, const char **vals, const size_t *lens, size_t count) {
6570 const char *str, *new_str;
6571 if (yyjson_unlikely(count > 0 && !lens)) return NULL;
6572 yyjson_mut_arr_with_func({
6574 if (yyjson_unlikely(!str)) return NULL;
6576 new_str = unsafe_yyjson_mut_strncpy(doc, str, len);
6577 if (yyjson_unlikely(!new_str)) return NULL;
6578 unsafe_yyjson_set_strn(val, new_str, len);
6582#undef yyjson_mut_arr_with_func
6586/*==============================================================================
6587 * MARK: - Mutable JSON Array Modification API (Implementation)
6588 *============================================================================*/
6590yyjson_api_inline bool yyjson_mut_arr_insert(yyjson_mut_val *arr,
6591 yyjson_mut_val *val, size_t idx) {
6592 if (yyjson_likely(yyjson_mut_is_arr(arr) && val)) {
6593 size_t len = unsafe_yyjson_get_len(arr);
6594 if (yyjson_likely(idx <= len)) {
6595 unsafe_yyjson_set_len(arr, len + 1);
6600 yyjson_mut_val *prev = ((yyjson_mut_val *)arr->uni.ptr);
6601 yyjson_mut_val *next = prev->next;
6621yyjson_api_inline bool yyjson_mut_arr_append(yyjson_mut_val *arr,
6622 yyjson_mut_val *val) {
6623 if (yyjson_likely(yyjson_mut_is_arr(arr) && val)) {
6624 size_t len = unsafe_yyjson_get_len(arr);
6625 unsafe_yyjson_set_len(arr, len + 1);
6629 yyjson_mut_val *prev = ((yyjson_mut_val *)arr->uni.ptr);
6630 yyjson_mut_val *next = prev->next;
6640yyjson_api_inline bool yyjson_mut_arr_prepend(yyjson_mut_val *arr,
6641 yyjson_mut_val *val) {
6642 if (yyjson_likely(yyjson_mut_is_arr(arr) && val)) {
6643 size_t len = unsafe_yyjson_get_len(arr);
6644 unsafe_yyjson_set_len(arr, len + 1);
6649 yyjson_mut_val *prev = ((yyjson_mut_val *)arr->uni.ptr);
6650 yyjson_mut_val *next = prev->next;
6659yyjson_api_inline yyjson_mut_val *yyjson_mut_arr_replace(yyjson_mut_val *arr,
6661 yyjson_mut_val *val) {
6662 if (yyjson_likely(yyjson_mut_is_arr(arr) && val)) {
6663 size_t len = unsafe_yyjson_get_len(arr);
6664 if (yyjson_likely(idx < len)) {
6665 if (yyjson_likely(len > 1)) {
6666 yyjson_mut_val *prev = ((yyjson_mut_val *)arr->uni.ptr);
6667 yyjson_mut_val *next = prev->next;
6673 val->next = next->next;
6674 if ((void *)next == arr->uni.ptr) arr->uni.ptr = val;
6677 yyjson_mut_val *prev = ((yyjson_mut_val *)arr->uni.ptr);
6687yyjson_api_inline yyjson_mut_val *yyjson_mut_arr_remove(yyjson_mut_val *arr,
6689 if (yyjson_likely(yyjson_mut_is_arr(arr))) {
6690 size_t len = unsafe_yyjson_get_len(arr);
6691 if (yyjson_likely(idx < len)) {
6692 unsafe_yyjson_set_len(arr, len - 1);
6693 if (yyjson_likely(len > 1)) {
6694 yyjson_mut_val *prev = ((yyjson_mut_val *)arr->uni.ptr);
6695 yyjson_mut_val *next = prev->next;
6700 prev->next = next->next;
6701 if ((void *)next == arr->uni.ptr) arr->uni.ptr = prev;
6704 return ((yyjson_mut_val *)arr->uni.ptr);
6711yyjson_api_inline yyjson_mut_val *yyjson_mut_arr_remove_first(
6712 yyjson_mut_val *arr) {
6713 if (yyjson_likely(yyjson_mut_is_arr(arr))) {
6714 size_t len = unsafe_yyjson_get_len(arr);
6716 yyjson_mut_val *prev = ((yyjson_mut_val *)arr->uni.ptr);
6717 yyjson_mut_val *next = prev->next;
6718 prev->next = next->next;
6719 unsafe_yyjson_set_len(arr, len - 1);
6721 } else if (len == 1) {
6722 yyjson_mut_val *prev = ((yyjson_mut_val *)arr->uni.ptr);
6723 unsafe_yyjson_set_len(arr, 0);
6730yyjson_api_inline yyjson_mut_val *yyjson_mut_arr_remove_last(
6731 yyjson_mut_val *arr) {
6732 if (yyjson_likely(yyjson_mut_is_arr(arr))) {
6733 size_t len = unsafe_yyjson_get_len(arr);
6734 if (yyjson_likely(len > 1)) {
6735 yyjson_mut_val *prev = ((yyjson_mut_val *)arr->uni.ptr);
6736 yyjson_mut_val *next = prev->next;
6737 unsafe_yyjson_set_len(arr, len - 1);
6738 while (--len > 0) prev = prev->next;
6740 next = (yyjson_mut_val *)arr->uni.ptr;
6741 arr->uni.ptr = prev;
6743 } else if (len == 1) {
6744 yyjson_mut_val *prev = ((yyjson_mut_val *)arr->uni.ptr);
6745 unsafe_yyjson_set_len(arr, 0);
6752yyjson_api_inline bool yyjson_mut_arr_remove_range(yyjson_mut_val *arr,
6753 size_t _idx, size_t _len) {
6754 if (yyjson_likely(yyjson_mut_is_arr(arr))) {
6755 yyjson_mut_val *prev, *next;
6757 size_t len = unsafe_yyjson_get_len(arr);
6758 if (yyjson_unlikely(_len > len || _idx > len - _len)) return false;
6759 if (yyjson_unlikely(_len == 0)) return true;
6760 unsafe_yyjson_set_len(arr, len - _len);
6761 if (yyjson_unlikely(len == _len)) return true;
6762 tail_removed = (_idx + _len == len);
6763 prev = ((yyjson_mut_val *)arr->uni.ptr);
6764 while (_idx-- > 0) prev = prev->next;
6766 while (_len-- > 0) next = next->next;
6768 if (yyjson_unlikely(tail_removed)) arr->uni.ptr = prev;
6774yyjson_api_inline bool yyjson_mut_arr_clear(yyjson_mut_val *arr) {
6775 if (yyjson_likely(yyjson_mut_is_arr(arr))) {
6776 unsafe_yyjson_set_len(arr, 0);
6782yyjson_api_inline bool yyjson_mut_arr_rotate(yyjson_mut_val *arr,
6784 if (yyjson_likely(yyjson_mut_is_arr(arr) &&
6785 unsafe_yyjson_get_len(arr) > idx)) {
6786 yyjson_mut_val *val = (yyjson_mut_val *)arr->uni.ptr;
6787 while (idx-- > 0) val = val->next;
6788 arr->uni.ptr = (void *)val;
6796/*==============================================================================
6797 * MARK: - Mutable JSON Array Modification Convenience API (Implementation)
6798 *============================================================================*/
6800yyjson_api_inline bool yyjson_mut_arr_add_val(yyjson_mut_val *arr,
6801 yyjson_mut_val *val) {
6802 return yyjson_mut_arr_append(arr, val);
6805yyjson_api_inline bool yyjson_mut_arr_add_null(yyjson_mut_doc *doc,
6806 yyjson_mut_val *arr) {
6807 if (yyjson_likely(doc && yyjson_mut_is_arr(arr))) {
6808 yyjson_mut_val *val = yyjson_mut_null(doc);
6809 return yyjson_mut_arr_append(arr, val);
6814yyjson_api_inline bool yyjson_mut_arr_add_true(yyjson_mut_doc *doc,
6815 yyjson_mut_val *arr) {
6816 if (yyjson_likely(doc && yyjson_mut_is_arr(arr))) {
6817 yyjson_mut_val *val = yyjson_mut_true(doc);
6818 return yyjson_mut_arr_append(arr, val);
6823yyjson_api_inline bool yyjson_mut_arr_add_false(yyjson_mut_doc *doc,
6824 yyjson_mut_val *arr) {
6825 if (yyjson_likely(doc && yyjson_mut_is_arr(arr))) {
6826 yyjson_mut_val *val = yyjson_mut_false(doc);
6827 return yyjson_mut_arr_append(arr, val);
6832yyjson_api_inline bool yyjson_mut_arr_add_bool(yyjson_mut_doc *doc,
6833 yyjson_mut_val *arr,
6835 if (yyjson_likely(doc && yyjson_mut_is_arr(arr))) {
6836 yyjson_mut_val *val = yyjson_mut_bool(doc, _val);
6837 return yyjson_mut_arr_append(arr, val);
6842yyjson_api_inline bool yyjson_mut_arr_add_uint(yyjson_mut_doc *doc,
6843 yyjson_mut_val *arr,
6845 if (yyjson_likely(doc && yyjson_mut_is_arr(arr))) {
6846 yyjson_mut_val *val = yyjson_mut_uint(doc, num);
6847 return yyjson_mut_arr_append(arr, val);
6852yyjson_api_inline bool yyjson_mut_arr_add_sint(yyjson_mut_doc *doc,
6853 yyjson_mut_val *arr,
6855 if (yyjson_likely(doc && yyjson_mut_is_arr(arr))) {
6856 yyjson_mut_val *val = yyjson_mut_sint(doc, num);
6857 return yyjson_mut_arr_append(arr, val);
6862yyjson_api_inline bool yyjson_mut_arr_add_int(yyjson_mut_doc *doc,
6863 yyjson_mut_val *arr,
6865 if (yyjson_likely(doc && yyjson_mut_is_arr(arr))) {
6866 yyjson_mut_val *val = yyjson_mut_sint(doc, num);
6867 return yyjson_mut_arr_append(arr, val);
6872yyjson_api_inline bool yyjson_mut_arr_add_float(yyjson_mut_doc *doc,
6873 yyjson_mut_val *arr,
6875 if (yyjson_likely(doc && yyjson_mut_is_arr(arr))) {
6876 yyjson_mut_val *val = yyjson_mut_float(doc, num);
6877 return yyjson_mut_arr_append(arr, val);
6882yyjson_api_inline bool yyjson_mut_arr_add_double(yyjson_mut_doc *doc,
6883 yyjson_mut_val *arr,
6885 if (yyjson_likely(doc && yyjson_mut_is_arr(arr))) {
6886 yyjson_mut_val *val = yyjson_mut_double(doc, num);
6887 return yyjson_mut_arr_append(arr, val);
6892yyjson_api_inline bool yyjson_mut_arr_add_real(yyjson_mut_doc *doc,
6893 yyjson_mut_val *arr,
6895 if (yyjson_likely(doc && yyjson_mut_is_arr(arr))) {
6896 yyjson_mut_val *val = yyjson_mut_real(doc, num);
6897 return yyjson_mut_arr_append(arr, val);
6902yyjson_api_inline bool yyjson_mut_arr_add_str(yyjson_mut_doc *doc,
6903 yyjson_mut_val *arr,
6905 if (yyjson_likely(doc && yyjson_mut_is_arr(arr))) {
6906 yyjson_mut_val *val = yyjson_mut_str(doc, str);
6907 return yyjson_mut_arr_append(arr, val);
6912yyjson_api_inline bool yyjson_mut_arr_add_strn(yyjson_mut_doc *doc,
6913 yyjson_mut_val *arr,
6914 const char *str, size_t len) {
6915 if (yyjson_likely(doc && yyjson_mut_is_arr(arr))) {
6916 yyjson_mut_val *val = yyjson_mut_strn(doc, str, len);
6917 return yyjson_mut_arr_append(arr, val);
6922yyjson_api_inline bool yyjson_mut_arr_add_strcpy(yyjson_mut_doc *doc,
6923 yyjson_mut_val *arr,
6925 if (yyjson_likely(doc && yyjson_mut_is_arr(arr))) {
6926 yyjson_mut_val *val = yyjson_mut_strcpy(doc, str);
6927 return yyjson_mut_arr_append(arr, val);
6932yyjson_api_inline bool yyjson_mut_arr_add_strncpy(yyjson_mut_doc *doc,
6933 yyjson_mut_val *arr,
6934 const char *str, size_t len) {
6935 if (yyjson_likely(doc && yyjson_mut_is_arr(arr))) {
6936 yyjson_mut_val *val = yyjson_mut_strncpy(doc, str, len);
6937 return yyjson_mut_arr_append(arr, val);
6942yyjson_api_inline yyjson_mut_val *yyjson_mut_arr_add_arr(yyjson_mut_doc *doc,
6943 yyjson_mut_val *arr) {
6944 if (yyjson_likely(doc && yyjson_mut_is_arr(arr))) {
6945 yyjson_mut_val *val = yyjson_mut_arr(doc);
6946 return yyjson_mut_arr_append(arr, val) ? val : NULL;
6951yyjson_api_inline yyjson_mut_val *yyjson_mut_arr_add_obj(yyjson_mut_doc *doc,
6952 yyjson_mut_val *arr) {
6953 if (yyjson_likely(doc && yyjson_mut_is_arr(arr))) {
6954 yyjson_mut_val *val = yyjson_mut_obj(doc);
6955 return yyjson_mut_arr_append(arr, val) ? val : NULL;
6962/*==============================================================================
6963 * MARK: - Mutable JSON Object API (Implementation)
6964 *============================================================================*/
6966yyjson_api_inline size_t yyjson_mut_obj_size(const yyjson_mut_val *obj) {
6967 return yyjson_mut_is_obj(obj) ? unsafe_yyjson_get_len(obj) : 0;
6970yyjson_api_inline yyjson_mut_val *yyjson_mut_obj_get(const yyjson_mut_val *obj,
6972 return yyjson_mut_obj_getn(obj, key, key ? strlen(key) : 0);
6975yyjson_api_inline yyjson_mut_val *yyjson_mut_obj_getn(const yyjson_mut_val *obj,
6978 size_t len = yyjson_mut_obj_size(obj);
6979 if (yyjson_likely(len && _key)) {
6980 yyjson_mut_val *key = ((yyjson_mut_val *)obj->uni.ptr)->next->next;
6982 if (unsafe_yyjson_equals_strn(key, _key, key_len)) return key->next;
6983 key = key->next->next;
6991/*==============================================================================
6992 * MARK: - Mutable JSON Object Iterator API (Implementation)
6993 *============================================================================*/
6995yyjson_api_inline bool yyjson_mut_obj_iter_init(yyjson_mut_val *obj,
6996 yyjson_mut_obj_iter *iter) {
6997 if (yyjson_likely(yyjson_mut_is_obj(obj) && iter)) {
6999 iter->max = unsafe_yyjson_get_len(obj);
7000 iter->cur = iter->max ? (yyjson_mut_val *)obj->uni.ptr : NULL;
7005 if (iter) memset(iter, 0, sizeof(yyjson_mut_obj_iter));
7009yyjson_api_inline yyjson_mut_obj_iter yyjson_mut_obj_iter_with(
7010 yyjson_mut_val *obj) {
7011 yyjson_mut_obj_iter iter;
7012 yyjson_mut_obj_iter_init(obj, &iter);
7016yyjson_api_inline bool yyjson_mut_obj_iter_has_next(yyjson_mut_obj_iter *iter) {
7017 return iter ? iter->idx < iter->max : false;
7020yyjson_api_inline yyjson_mut_val *yyjson_mut_obj_iter_next(
7021 yyjson_mut_obj_iter *iter) {
7022 if (iter && iter->idx < iter->max) {
7023 yyjson_mut_val *key = iter->cur;
7025 iter->cur = key->next->next;
7032yyjson_api_inline yyjson_mut_val *yyjson_mut_obj_iter_get_val(
7033 yyjson_mut_val *key) {
7034 return key ? key->next : NULL;
7037yyjson_api_inline yyjson_mut_val *yyjson_mut_obj_iter_remove(
7038 yyjson_mut_obj_iter *iter) {
7039 if (yyjson_likely(iter && 0 < iter->idx && iter->idx <= iter->max)) {
7040 yyjson_mut_val *prev = iter->pre;
7041 yyjson_mut_val *cur = iter->cur;
7042 yyjson_mut_val *next = cur->next->next;
7043 if (yyjson_unlikely(iter->idx == iter->max)) iter->obj->uni.ptr = prev;
7046 unsafe_yyjson_set_len(iter->obj, iter->max);
7047 prev->next->next = next;
7054yyjson_api_inline yyjson_mut_val *yyjson_mut_obj_iter_get(
7055 yyjson_mut_obj_iter *iter, const char *key) {
7056 return yyjson_mut_obj_iter_getn(iter, key, key ? strlen(key) : 0);
7059yyjson_api_inline yyjson_mut_val *yyjson_mut_obj_iter_getn(
7060 yyjson_mut_obj_iter *iter, const char *key, size_t key_len) {
7063 size_t max = iter->max;
7064 yyjson_mut_val *pre, *cur = iter->cur;
7065 while (idx++ < max) {
7067 cur = cur->next->next;
7068 if (unsafe_yyjson_equals_strn(cur, key, key_len)) {
7070 if (iter->idx > max) iter->idx -= max;
7082/*==============================================================================
7083 * MARK: - Mutable JSON Object Creation API (Implementation)
7084 *============================================================================*/
7086yyjson_api_inline yyjson_mut_val *yyjson_mut_obj(yyjson_mut_doc *doc) {
7087 if (yyjson_likely(doc)) {
7088 yyjson_mut_val *val = unsafe_yyjson_mut_val(doc, 1);
7089 if (yyjson_likely(val)) {
7090 val->tag = YYJSON_TYPE_OBJ | YYJSON_SUBTYPE_NONE;
7097yyjson_api_inline yyjson_mut_val *yyjson_mut_obj_with_str(yyjson_mut_doc *doc,
7101 if (yyjson_likely(doc && ((count > 0 && count <
7102 (~(size_t)0) / sizeof(yyjson_mut_val) / 2 &&
7103 keys && vals) || (count == 0)))) {
7104 yyjson_mut_val *obj = unsafe_yyjson_mut_val(doc, 1 + count * 2);
7105 if (yyjson_likely(obj)) {
7106 obj->tag = ((uint64_t)count << YYJSON_TAG_BIT) | YYJSON_TYPE_OBJ;
7109 for (i = 0; i < count; i++) {
7110 yyjson_mut_val *key = obj + (i * 2 + 1);
7111 yyjson_mut_val *val = obj + (i * 2 + 2);
7112 uint64_t key_len, val_len;
7113 if (yyjson_unlikely(!keys[i] || !vals[i])) return NULL;
7114 key_len = (uint64_t)strlen(keys[i]);
7115 val_len = (uint64_t)strlen(vals[i]);
7116 key->tag = (key_len << YYJSON_TAG_BIT) | YYJSON_TYPE_STR;
7117 val->tag = (val_len << YYJSON_TAG_BIT) | YYJSON_TYPE_STR;
7118 key->uni.str = keys[i];
7119 val->uni.str = vals[i];
7121 val->next = val + 1;
7123 obj[count * 2].next = obj + 1;
7124 obj->uni.ptr = obj + (count * 2 - 1);
7132yyjson_api_inline yyjson_mut_val *yyjson_mut_obj_with_kv(yyjson_mut_doc *doc,
7135 if (yyjson_likely(doc && ((count > 0 && count <
7136 (~(size_t)0) / sizeof(yyjson_mut_val) / 2 &&
7137 pairs) || (count == 0)))) {
7138 yyjson_mut_val *obj = unsafe_yyjson_mut_val(doc, 1 + count * 2);
7139 if (yyjson_likely(obj)) {
7140 obj->tag = ((uint64_t)count << YYJSON_TAG_BIT) | YYJSON_TYPE_OBJ;
7143 for (i = 0; i < count; i++) {
7144 yyjson_mut_val *key = obj + (i * 2 + 1);
7145 yyjson_mut_val *val = obj + (i * 2 + 2);
7146 const char *key_str = pairs[i * 2 + 0];
7147 const char *val_str = pairs[i * 2 + 1];
7148 uint64_t key_len, val_len;
7149 if (yyjson_unlikely(!key_str || !val_str)) return NULL;
7150 key_len = (uint64_t)strlen(key_str);
7151 val_len = (uint64_t)strlen(val_str);
7152 key->tag = (key_len << YYJSON_TAG_BIT) | YYJSON_TYPE_STR;
7153 val->tag = (val_len << YYJSON_TAG_BIT) | YYJSON_TYPE_STR;
7154 key->uni.str = key_str;
7155 val->uni.str = val_str;
7157 val->next = val + 1;
7159 obj[count * 2].next = obj + 1;
7160 obj->uni.ptr = obj + (count * 2 - 1);
7170/*==============================================================================
7171 * MARK: - Mutable JSON Object Modification API (Implementation)
7172 *============================================================================*/
7174yyjson_api_inline void unsafe_yyjson_mut_obj_add(yyjson_mut_val *obj,
7175 yyjson_mut_val *key,
7176 yyjson_mut_val *val,
7178 if (yyjson_likely(len)) {
7179 yyjson_mut_val *prev_val = ((yyjson_mut_val *)obj->uni.ptr)->next;
7180 yyjson_mut_val *next_key = prev_val->next;
7181 prev_val->next = key;
7182 val->next = next_key;
7187 obj->uni.ptr = (void *)key;
7188 unsafe_yyjson_set_len(obj, len + 1);
7191yyjson_api_inline yyjson_mut_val *unsafe_yyjson_mut_obj_remove(
7192 yyjson_mut_val *obj, const char *key, size_t key_len) {
7193 size_t obj_len = unsafe_yyjson_get_len(obj);
7195 yyjson_mut_val *pre_key = (yyjson_mut_val *)obj->uni.ptr;
7196 yyjson_mut_val *cur_key = pre_key->next->next;
7197 yyjson_mut_val *removed_item = NULL;
7199 for (i = 0; i < obj_len; i++) {
7200 if (unsafe_yyjson_equals_strn(cur_key, key, key_len)) {
7201 if (!removed_item) removed_item = cur_key->next;
7202 cur_key = cur_key->next->next;
7203 pre_key->next->next = cur_key;
7204 if (i + 1 == obj_len) obj->uni.ptr = pre_key;
7209 cur_key = cur_key->next->next;
7212 unsafe_yyjson_set_len(obj, obj_len);
7213 return removed_item;
7219yyjson_api_inline bool unsafe_yyjson_mut_obj_replace(yyjson_mut_val *obj,
7220 yyjson_mut_val *key,
7221 yyjson_mut_val *val) {
7222 size_t key_len = unsafe_yyjson_get_len(key);
7223 size_t obj_len = unsafe_yyjson_get_len(obj);
7225 yyjson_mut_val *pre_key = (yyjson_mut_val *)obj->uni.ptr;
7226 yyjson_mut_val *cur_key = pre_key->next->next;
7228 for (i = 0; i < obj_len; i++) {
7229 if (unsafe_yyjson_equals_strn(cur_key, key->uni.str, key_len)) {
7230 cur_key->next->tag = val->tag;
7231 cur_key->next->uni.u64 = val->uni.u64;
7234 cur_key = cur_key->next->next;
7241yyjson_api_inline void unsafe_yyjson_mut_obj_rotate(yyjson_mut_val *obj,
7243 yyjson_mut_val *key = (yyjson_mut_val *)obj->uni.ptr;
7244 while (idx-- > 0) key = key->next->next;
7245 obj->uni.ptr = (void *)key;
7248yyjson_api_inline bool yyjson_mut_obj_add(yyjson_mut_val *obj,
7249 yyjson_mut_val *key,
7250 yyjson_mut_val *val) {
7251 if (yyjson_likely(yyjson_mut_is_obj(obj) &&
7252 yyjson_mut_is_str(key) && val)) {
7253 unsafe_yyjson_mut_obj_add(obj, key, val, unsafe_yyjson_get_len(obj));
7259yyjson_api_inline bool yyjson_mut_obj_put(yyjson_mut_val *obj,
7260 yyjson_mut_val *key,
7261 yyjson_mut_val *val) {
7262 bool replaced = false;
7264 yyjson_mut_obj_iter iter;
7265 yyjson_mut_val *cur_key;
7266 if (yyjson_unlikely(!yyjson_mut_is_obj(obj) ||
7267 !yyjson_mut_is_str(key))) return false;
7268 key_len = unsafe_yyjson_get_len(key);
7269 yyjson_mut_obj_iter_init(obj, &iter);
7270 while ((cur_key = yyjson_mut_obj_iter_next(&iter)) != 0) {
7271 if (unsafe_yyjson_equals_strn(cur_key, key->uni.str, key_len)) {
7272 if (!replaced && val) {
7274 val->next = cur_key->next->next;
7275 cur_key->next = val;
7277 yyjson_mut_obj_iter_remove(&iter);
7281 if (!replaced && val) unsafe_yyjson_mut_obj_add(obj, key, val, iter.max);
7285yyjson_api_inline bool yyjson_mut_obj_insert(yyjson_mut_val *obj,
7286 yyjson_mut_val *key,
7287 yyjson_mut_val *val,
7289 if (yyjson_likely(yyjson_mut_is_obj(obj) &&
7290 yyjson_mut_is_str(key) && val)) {
7291 size_t len = unsafe_yyjson_get_len(obj);
7292 if (yyjson_likely(len >= idx)) {
7294 void *ptr = obj->uni.ptr;
7295 unsafe_yyjson_mut_obj_rotate(obj, idx);
7296 unsafe_yyjson_mut_obj_add(obj, key, val, len);
7299 unsafe_yyjson_mut_obj_add(obj, key, val, len);
7307yyjson_api_inline yyjson_mut_val *yyjson_mut_obj_remove(yyjson_mut_val *obj,
7308 yyjson_mut_val *key) {
7309 if (yyjson_likely(yyjson_mut_is_obj(obj) && yyjson_mut_is_str(key))) {
7310 return unsafe_yyjson_mut_obj_remove(obj, key->uni.str,
7311 unsafe_yyjson_get_len(key));
7316yyjson_api_inline yyjson_mut_val *yyjson_mut_obj_remove_key(
7317 yyjson_mut_val *obj, const char *key) {
7318 if (yyjson_likely(yyjson_mut_is_obj(obj) && key)) {
7319 size_t key_len = strlen(key);
7320 return unsafe_yyjson_mut_obj_remove(obj, key, key_len);
7325yyjson_api_inline yyjson_mut_val *yyjson_mut_obj_remove_keyn(
7326 yyjson_mut_val *obj, const char *key, size_t key_len) {
7327 if (yyjson_likely(yyjson_mut_is_obj(obj) && key)) {
7328 return unsafe_yyjson_mut_obj_remove(obj, key, key_len);
7333yyjson_api_inline bool yyjson_mut_obj_clear(yyjson_mut_val *obj) {
7334 if (yyjson_likely(yyjson_mut_is_obj(obj))) {
7335 unsafe_yyjson_set_len(obj, 0);
7341yyjson_api_inline bool yyjson_mut_obj_replace(yyjson_mut_val *obj,
7342 yyjson_mut_val *key,
7343 yyjson_mut_val *val) {
7344 if (yyjson_likely(yyjson_mut_is_obj(obj) &&
7345 yyjson_mut_is_str(key) && val)) {
7346 return unsafe_yyjson_mut_obj_replace(obj, key, val);
7351yyjson_api_inline bool yyjson_mut_obj_rotate(yyjson_mut_val *obj,
7353 if (yyjson_likely(yyjson_mut_is_obj(obj) &&
7354 unsafe_yyjson_get_len(obj) > idx)) {
7355 unsafe_yyjson_mut_obj_rotate(obj, idx);
7363/*==============================================================================
7364 * MARK: - Mutable JSON Object Modification Convenience API (Implementation)
7365 *============================================================================*/
7367#define yyjson_mut_obj_add_func(func) \
7368 if (yyjson_likely(doc && yyjson_mut_is_obj(obj) && _key)) { \
7369 yyjson_mut_val *key = unsafe_yyjson_mut_val(doc, 2); \
7370 if (yyjson_likely(key)) { \
7371 size_t len = unsafe_yyjson_get_len(obj); \
7372 yyjson_mut_val *val = key + 1; \
7373 size_t key_len = strlen(_key); \
7374 bool noesc = unsafe_yyjson_is_str_noesc(_key, key_len); \
7375 key->tag = YYJSON_TYPE_STR; \
7376 key->tag |= noesc ? YYJSON_SUBTYPE_NOESC : YYJSON_SUBTYPE_NONE; \
7377 key->tag |= (uint64_t)strlen(_key) << YYJSON_TAG_BIT; \
7378 key->uni.str = _key; \
7380 unsafe_yyjson_mut_obj_add(obj, key, val, len); \
7386yyjson_api_inline bool yyjson_mut_obj_add_null(yyjson_mut_doc *doc,
7387 yyjson_mut_val *obj,
7389 yyjson_mut_obj_add_func({ unsafe_yyjson_set_null(val); });
7392yyjson_api_inline bool yyjson_mut_obj_add_true(yyjson_mut_doc *doc,
7393 yyjson_mut_val *obj,
7395 yyjson_mut_obj_add_func({ unsafe_yyjson_set_bool(val, true); });
7398yyjson_api_inline bool yyjson_mut_obj_add_false(yyjson_mut_doc *doc,
7399 yyjson_mut_val *obj,
7401 yyjson_mut_obj_add_func({ unsafe_yyjson_set_bool(val, false); });
7404yyjson_api_inline bool yyjson_mut_obj_add_bool(yyjson_mut_doc *doc,
7405 yyjson_mut_val *obj,
7408 yyjson_mut_obj_add_func({ unsafe_yyjson_set_bool(val, _val); });
7411yyjson_api_inline bool yyjson_mut_obj_add_uint(yyjson_mut_doc *doc,
7412 yyjson_mut_val *obj,
7415 yyjson_mut_obj_add_func({ unsafe_yyjson_set_uint(val, _val); });
7418yyjson_api_inline bool yyjson_mut_obj_add_sint(yyjson_mut_doc *doc,
7419 yyjson_mut_val *obj,
7422 yyjson_mut_obj_add_func({ unsafe_yyjson_set_sint(val, _val); });
7425yyjson_api_inline bool yyjson_mut_obj_add_int(yyjson_mut_doc *doc,
7426 yyjson_mut_val *obj,
7429 yyjson_mut_obj_add_func({ unsafe_yyjson_set_sint(val, _val); });
7432yyjson_api_inline bool yyjson_mut_obj_add_float(yyjson_mut_doc *doc,
7433 yyjson_mut_val *obj,
7436 yyjson_mut_obj_add_func({ unsafe_yyjson_set_float(val, _val); });
7439yyjson_api_inline bool yyjson_mut_obj_add_double(yyjson_mut_doc *doc,
7440 yyjson_mut_val *obj,
7443 yyjson_mut_obj_add_func({ unsafe_yyjson_set_double(val, _val); });
7446yyjson_api_inline bool yyjson_mut_obj_add_real(yyjson_mut_doc *doc,
7447 yyjson_mut_val *obj,
7450 yyjson_mut_obj_add_func({ unsafe_yyjson_set_real(val, _val); });
7453yyjson_api_inline bool yyjson_mut_obj_add_str(yyjson_mut_doc *doc,
7454 yyjson_mut_val *obj,
7457 if (yyjson_unlikely(!_val)) return false;
7458 yyjson_mut_obj_add_func({
7459 size_t val_len = strlen(_val);
7460 bool val_noesc = unsafe_yyjson_is_str_noesc(_val, val_len);
7461 val->tag = ((uint64_t)strlen(_val) << YYJSON_TAG_BIT) | YYJSON_TYPE_STR;
7462 val->tag |= val_noesc ? YYJSON_SUBTYPE_NOESC : YYJSON_SUBTYPE_NONE;
7463 val->uni.str = _val;
7467yyjson_api_inline bool yyjson_mut_obj_add_strn(yyjson_mut_doc *doc,
7468 yyjson_mut_val *obj,
7472 if (yyjson_unlikely(!_val)) return false;
7473 yyjson_mut_obj_add_func({
7474 val->tag = ((uint64_t)_len << YYJSON_TAG_BIT) | YYJSON_TYPE_STR;
7475 val->uni.str = _val;
7479yyjson_api_inline bool yyjson_mut_obj_add_strcpy(yyjson_mut_doc *doc,
7480 yyjson_mut_val *obj,
7483 if (yyjson_unlikely(!_val)) return false;
7484 yyjson_mut_obj_add_func({
7485 size_t _len = strlen(_val);
7486 val->uni.str = unsafe_yyjson_mut_strncpy(doc, _val, _len);
7487 if (yyjson_unlikely(!val->uni.str)) return false;
7488 val->tag = ((uint64_t)_len << YYJSON_TAG_BIT) | YYJSON_TYPE_STR;
7492yyjson_api_inline bool yyjson_mut_obj_add_strncpy(yyjson_mut_doc *doc,
7493 yyjson_mut_val *obj,
7497 if (yyjson_unlikely(!_val)) return false;
7498 yyjson_mut_obj_add_func({
7499 val->uni.str = unsafe_yyjson_mut_strncpy(doc, _val, _len);
7500 if (yyjson_unlikely(!val->uni.str)) return false;
7501 val->tag = ((uint64_t)_len << YYJSON_TAG_BIT) | YYJSON_TYPE_STR;
7505yyjson_api_inline yyjson_mut_val *yyjson_mut_obj_add_arr(yyjson_mut_doc *doc,
7506 yyjson_mut_val *obj,
7508 yyjson_mut_val *key = yyjson_mut_str(doc, _key);
7509 yyjson_mut_val *val = yyjson_mut_arr(doc);
7510 return yyjson_mut_obj_add(obj, key, val) ? val : NULL;
7513yyjson_api_inline yyjson_mut_val *yyjson_mut_obj_add_obj(yyjson_mut_doc *doc,
7514 yyjson_mut_val *obj,
7516 yyjson_mut_val *key = yyjson_mut_str(doc, _key);
7517 yyjson_mut_val *val = yyjson_mut_obj(doc);
7518 return yyjson_mut_obj_add(obj, key, val) ? val : NULL;
7521yyjson_api_inline bool yyjson_mut_obj_add_val(yyjson_mut_doc *doc,
7522 yyjson_mut_val *obj,
7524 yyjson_mut_val *_val) {
7525 if (yyjson_unlikely(!_val)) return false;
7526 yyjson_mut_obj_add_func({
7531yyjson_api_inline yyjson_mut_val *yyjson_mut_obj_remove_str(yyjson_mut_val *obj,
7533 return yyjson_mut_obj_remove_strn(obj, key, key ? strlen(key) : 0);
7536yyjson_api_inline yyjson_mut_val *yyjson_mut_obj_remove_strn(
7537 yyjson_mut_val *obj, const char *_key, size_t _len) {
7538 if (yyjson_likely(yyjson_mut_is_obj(obj) && _key)) {
7539 yyjson_mut_val *key;
7540 yyjson_mut_obj_iter iter;
7541 yyjson_mut_val *val_removed = NULL;
7542 yyjson_mut_obj_iter_init(obj, &iter);
7543 while ((key = yyjson_mut_obj_iter_next(&iter)) != NULL) {
7544 if (unsafe_yyjson_equals_strn(key, _key, _len)) {
7545 if (!val_removed) val_removed = key->next;
7546 yyjson_mut_obj_iter_remove(&iter);
7554yyjson_api_inline bool yyjson_mut_obj_rename_key(yyjson_mut_doc *doc,
7555 yyjson_mut_val *obj,
7557 const char *new_key) {
7558 if (!key || !new_key) return false;
7559 return yyjson_mut_obj_rename_keyn(doc, obj, key, strlen(key),
7560 new_key, strlen(new_key));
7563yyjson_api_inline bool yyjson_mut_obj_rename_keyn(yyjson_mut_doc *doc,
7564 yyjson_mut_val *obj,
7567 const char *new_key,
7569 char *cpy_key = NULL;
7570 yyjson_mut_val *old_key;
7571 yyjson_mut_obj_iter iter;
7572 if (!doc || !obj || !key || !new_key) return false;
7573 yyjson_mut_obj_iter_init(obj, &iter);
7574 while ((old_key = yyjson_mut_obj_iter_next(&iter))) {
7575 if (unsafe_yyjson_equals_strn((void *)old_key, key, len)) {
7577 cpy_key = unsafe_yyjson_mut_strncpy(doc, new_key, new_len);
7578 if (!cpy_key) return false;
7580 yyjson_mut_set_strn(old_key, cpy_key, new_len);
7583 return cpy_key != NULL;
7588#if !defined(YYJSON_DISABLE_UTILS) || !YYJSON_DISABLE_UTILS
7590/*==============================================================================
7591 * MARK: - JSON Pointer API (Implementation)
7592 *============================================================================*/
7594#define yyjson_ptr_set_err(_code, _msg) do { \
7596 err->code = YYJSON_PTR_ERR_##_code; \
7602/* require: val != NULL, *ptr == '/', len > 0 */
7603yyjson_api yyjson_val *unsafe_yyjson_ptr_getx(const yyjson_val *val,
7604 const char *ptr, size_t len,
7605 yyjson_ptr_err *err);
7607/* require: val != NULL, *ptr == '/', len > 0 */
7608yyjson_api yyjson_mut_val *unsafe_yyjson_mut_ptr_getx(const yyjson_mut_val *val,
7611 yyjson_ptr_ctx *ctx,
7612 yyjson_ptr_err *err);
7614/* require: val/new_val/doc != NULL, *ptr == '/', len > 0 */
7615yyjson_api bool unsafe_yyjson_mut_ptr_putx(yyjson_mut_val *val,
7616 const char *ptr, size_t len,
7617 yyjson_mut_val *new_val,
7618 yyjson_mut_doc *doc,
7619 bool create_parent, bool insert_new,
7620 yyjson_ptr_ctx *ctx,
7621 yyjson_ptr_err *err);
7623/* require: val/err != NULL, *ptr == '/', len > 0 */
7624yyjson_api yyjson_mut_val *unsafe_yyjson_mut_ptr_replacex(
7625 yyjson_mut_val *val, const char *ptr, size_t len, yyjson_mut_val *new_val,
7626 yyjson_ptr_ctx *ctx, yyjson_ptr_err *err);
7628/* require: val/err != NULL, *ptr == '/', len > 0 */
7629yyjson_api yyjson_mut_val *unsafe_yyjson_mut_ptr_removex(yyjson_mut_val *val,
7632 yyjson_ptr_ctx *ctx,
7633 yyjson_ptr_err *err);
7635yyjson_api_inline yyjson_val *yyjson_doc_ptr_get(const yyjson_doc *doc,
7637 if (yyjson_unlikely(!ptr)) return NULL;
7638 return yyjson_doc_ptr_getn(doc, ptr, strlen(ptr));
7641yyjson_api_inline yyjson_val *yyjson_doc_ptr_getn(const yyjson_doc *doc,
7642 const char *ptr, size_t len) {
7643 return yyjson_doc_ptr_getx(doc, ptr, len, NULL);
7646yyjson_api_inline yyjson_val *yyjson_doc_ptr_getx(const yyjson_doc *doc,
7647 const char *ptr, size_t len,
7648 yyjson_ptr_err *err) {
7649 yyjson_ptr_set_err(NONE, NULL);
7650 if (yyjson_unlikely(!doc || !ptr)) {
7651 yyjson_ptr_set_err(PARAMETER, "input parameter is NULL");
7654 if (yyjson_unlikely(!doc->root)) {
7655 yyjson_ptr_set_err(NULL_ROOT, "document's root is NULL");
7658 if (yyjson_unlikely(len == 0)) {
7661 if (yyjson_unlikely(*ptr != '/')) {
7662 yyjson_ptr_set_err(SYNTAX, "no prefix '/'");
7665 return unsafe_yyjson_ptr_getx(doc->root, ptr, len, err);
7668yyjson_api_inline yyjson_val *yyjson_ptr_get(const yyjson_val *val,
7670 if (yyjson_unlikely(!ptr)) return NULL;
7671 return yyjson_ptr_getn(val, ptr, strlen(ptr));
7674yyjson_api_inline yyjson_val *yyjson_ptr_getn(const yyjson_val *val,
7675 const char *ptr, size_t len) {
7676 return yyjson_ptr_getx(val, ptr, len, NULL);
7679yyjson_api_inline yyjson_val *yyjson_ptr_getx(const yyjson_val *val,
7680 const char *ptr, size_t len,
7681 yyjson_ptr_err *err) {
7682 yyjson_ptr_set_err(NONE, NULL);
7683 if (yyjson_unlikely(!val || !ptr)) {
7684 yyjson_ptr_set_err(PARAMETER, "input parameter is NULL");
7687 if (yyjson_unlikely(len == 0)) {
7688 return yyjson_constcast(yyjson_val *)val;
7690 if (yyjson_unlikely(*ptr != '/')) {
7691 yyjson_ptr_set_err(SYNTAX, "no prefix '/'");
7694 return unsafe_yyjson_ptr_getx(val, ptr, len, err);
7697yyjson_api_inline yyjson_mut_val *yyjson_mut_doc_ptr_get(
7698 const yyjson_mut_doc *doc, const char *ptr) {
7699 if (!ptr) return NULL;
7700 return yyjson_mut_doc_ptr_getn(doc, ptr, strlen(ptr));
7703yyjson_api_inline yyjson_mut_val *yyjson_mut_doc_ptr_getn(
7704 const yyjson_mut_doc *doc, const char *ptr, size_t len) {
7705 return yyjson_mut_doc_ptr_getx(doc, ptr, len, NULL, NULL);
7708yyjson_api_inline yyjson_mut_val *yyjson_mut_doc_ptr_getx(
7709 const yyjson_mut_doc *doc, const char *ptr, size_t len,
7710 yyjson_ptr_ctx *ctx, yyjson_ptr_err *err) {
7711 yyjson_ptr_set_err(NONE, NULL);
7712 if (ctx) memset(ctx, 0, sizeof(*ctx));
7714 if (yyjson_unlikely(!doc || !ptr)) {
7715 yyjson_ptr_set_err(PARAMETER, "input parameter is NULL");
7718 if (yyjson_unlikely(!doc->root)) {
7719 yyjson_ptr_set_err(NULL_ROOT, "document's root is NULL");
7722 if (yyjson_unlikely(len == 0)) {
7725 if (yyjson_unlikely(*ptr != '/')) {
7726 yyjson_ptr_set_err(SYNTAX, "no prefix '/'");
7729 return unsafe_yyjson_mut_ptr_getx(doc->root, ptr, len, ctx, err);
7732yyjson_api_inline yyjson_mut_val *yyjson_mut_ptr_get(const yyjson_mut_val *val,
7734 if (!ptr) return NULL;
7735 return yyjson_mut_ptr_getn(val, ptr, strlen(ptr));
7738yyjson_api_inline yyjson_mut_val *yyjson_mut_ptr_getn(const yyjson_mut_val *val,
7741 return yyjson_mut_ptr_getx(val, ptr, len, NULL, NULL);
7744yyjson_api_inline yyjson_mut_val *yyjson_mut_ptr_getx(const yyjson_mut_val *val,
7747 yyjson_ptr_ctx *ctx,
7748 yyjson_ptr_err *err) {
7749 yyjson_ptr_set_err(NONE, NULL);
7750 if (ctx) memset(ctx, 0, sizeof(*ctx));
7752 if (yyjson_unlikely(!val || !ptr)) {
7753 yyjson_ptr_set_err(PARAMETER, "input parameter is NULL");
7756 if (yyjson_unlikely(len == 0)) {
7757 return yyjson_constcast(yyjson_mut_val *)val;
7759 if (yyjson_unlikely(*ptr != '/')) {
7760 yyjson_ptr_set_err(SYNTAX, "no prefix '/'");
7763 return unsafe_yyjson_mut_ptr_getx(val, ptr, len, ctx, err);
7766yyjson_api_inline bool yyjson_mut_doc_ptr_add(yyjson_mut_doc *doc,
7768 yyjson_mut_val *new_val) {
7769 if (yyjson_unlikely(!ptr)) return false;
7770 return yyjson_mut_doc_ptr_addn(doc, ptr, strlen(ptr), new_val);
7773yyjson_api_inline bool yyjson_mut_doc_ptr_addn(yyjson_mut_doc *doc,
7776 yyjson_mut_val *new_val) {
7777 return yyjson_mut_doc_ptr_addx(doc, ptr, len, new_val, true, NULL, NULL);
7780yyjson_api_inline bool yyjson_mut_doc_ptr_addx(yyjson_mut_doc *doc,
7781 const char *ptr, size_t len,
7782 yyjson_mut_val *new_val,
7784 yyjson_ptr_ctx *ctx,
7785 yyjson_ptr_err *err) {
7786 yyjson_ptr_set_err(NONE, NULL);
7787 if (ctx) memset(ctx, 0, sizeof(*ctx));
7789 if (yyjson_unlikely(!doc || !ptr || !new_val)) {
7790 yyjson_ptr_set_err(PARAMETER, "input parameter is NULL");
7793 if (yyjson_unlikely(len == 0)) {
7795 yyjson_ptr_set_err(SET_ROOT, "cannot set document's root");
7798 doc->root = new_val;
7802 if (yyjson_unlikely(*ptr != '/')) {
7803 yyjson_ptr_set_err(SYNTAX, "no prefix '/'");
7806 if (yyjson_unlikely(!doc->root && !create_parent)) {
7807 yyjson_ptr_set_err(NULL_ROOT, "document's root is NULL");
7810 if (yyjson_unlikely(!doc->root)) {
7811 yyjson_mut_val *root = yyjson_mut_obj(doc);
7812 if (yyjson_unlikely(!root)) {
7813 yyjson_ptr_set_err(MEMORY_ALLOCATION, "failed to create value");
7816 if (unsafe_yyjson_mut_ptr_putx(root, ptr, len, new_val, doc,
7817 create_parent, true, ctx, err)) {
7823 return unsafe_yyjson_mut_ptr_putx(doc->root, ptr, len, new_val, doc,
7824 create_parent, true, ctx, err);
7827yyjson_api_inline bool yyjson_mut_ptr_add(yyjson_mut_val *val,
7829 yyjson_mut_val *new_val,
7830 yyjson_mut_doc *doc) {
7831 if (yyjson_unlikely(!ptr)) return false;
7832 return yyjson_mut_ptr_addn(val, ptr, strlen(ptr), new_val, doc);
7835yyjson_api_inline bool yyjson_mut_ptr_addn(yyjson_mut_val *val,
7836 const char *ptr, size_t len,
7837 yyjson_mut_val *new_val,
7838 yyjson_mut_doc *doc) {
7839 return yyjson_mut_ptr_addx(val, ptr, len, new_val, doc, true, NULL, NULL);
7842yyjson_api_inline bool yyjson_mut_ptr_addx(yyjson_mut_val *val,
7843 const char *ptr, size_t len,
7844 yyjson_mut_val *new_val,
7845 yyjson_mut_doc *doc,
7847 yyjson_ptr_ctx *ctx,
7848 yyjson_ptr_err *err) {
7849 yyjson_ptr_set_err(NONE, NULL);
7850 if (ctx) memset(ctx, 0, sizeof(*ctx));
7852 if (yyjson_unlikely(!val || !ptr || !new_val || !doc)) {
7853 yyjson_ptr_set_err(PARAMETER, "input parameter is NULL");
7856 if (yyjson_unlikely(len == 0)) {
7857 yyjson_ptr_set_err(SET_ROOT, "cannot set root");
7860 if (yyjson_unlikely(*ptr != '/')) {
7861 yyjson_ptr_set_err(SYNTAX, "no prefix '/'");
7864 return unsafe_yyjson_mut_ptr_putx(val, ptr, len, new_val,
7865 doc, create_parent, true, ctx, err);
7868yyjson_api_inline bool yyjson_mut_doc_ptr_set(yyjson_mut_doc *doc,
7870 yyjson_mut_val *new_val) {
7871 if (yyjson_unlikely(!ptr)) return false;
7872 return yyjson_mut_doc_ptr_setn(doc, ptr, strlen(ptr), new_val);
7875yyjson_api_inline bool yyjson_mut_doc_ptr_setn(yyjson_mut_doc *doc,
7876 const char *ptr, size_t len,
7877 yyjson_mut_val *new_val) {
7878 return yyjson_mut_doc_ptr_setx(doc, ptr, len, new_val, true, NULL, NULL);
7881yyjson_api_inline bool yyjson_mut_doc_ptr_setx(yyjson_mut_doc *doc,
7882 const char *ptr, size_t len,
7883 yyjson_mut_val *new_val,
7885 yyjson_ptr_ctx *ctx,
7886 yyjson_ptr_err *err) {
7887 yyjson_ptr_set_err(NONE, NULL);
7888 if (ctx) memset(ctx, 0, sizeof(*ctx));
7890 if (yyjson_unlikely(!doc || !ptr)) {
7891 yyjson_ptr_set_err(PARAMETER, "input parameter is NULL");
7894 if (yyjson_unlikely(len == 0)) {
7895 if (ctx) ctx->old = doc->root;
7896 doc->root = new_val;
7899 if (yyjson_unlikely(*ptr != '/')) {
7900 yyjson_ptr_set_err(SYNTAX, "no prefix '/'");
7905 yyjson_ptr_set_err(RESOLVE, "JSON pointer cannot be resolved");
7908 return !!unsafe_yyjson_mut_ptr_removex(doc->root, ptr, len, ctx, err);
7910 if (yyjson_unlikely(!doc->root && !create_parent)) {
7911 yyjson_ptr_set_err(NULL_ROOT, "document's root is NULL");
7914 if (yyjson_unlikely(!doc->root)) {
7915 yyjson_mut_val *root = yyjson_mut_obj(doc);
7916 if (yyjson_unlikely(!root)) {
7917 yyjson_ptr_set_err(MEMORY_ALLOCATION, "failed to create value");
7920 if (unsafe_yyjson_mut_ptr_putx(root, ptr, len, new_val, doc,
7921 create_parent, false, ctx, err)) {
7927 return unsafe_yyjson_mut_ptr_putx(doc->root, ptr, len, new_val, doc,
7928 create_parent, false, ctx, err);
7931yyjson_api_inline bool yyjson_mut_ptr_set(yyjson_mut_val *val,
7933 yyjson_mut_val *new_val,
7934 yyjson_mut_doc *doc) {
7935 if (yyjson_unlikely(!ptr)) return false;
7936 return yyjson_mut_ptr_setn(val, ptr, strlen(ptr), new_val, doc);
7939yyjson_api_inline bool yyjson_mut_ptr_setn(yyjson_mut_val *val,
7940 const char *ptr, size_t len,
7941 yyjson_mut_val *new_val,
7942 yyjson_mut_doc *doc) {
7943 return yyjson_mut_ptr_setx(val, ptr, len, new_val, doc, true, NULL, NULL);
7946yyjson_api_inline bool yyjson_mut_ptr_setx(yyjson_mut_val *val,
7947 const char *ptr, size_t len,
7948 yyjson_mut_val *new_val,
7949 yyjson_mut_doc *doc,
7951 yyjson_ptr_ctx *ctx,
7952 yyjson_ptr_err *err) {
7953 yyjson_ptr_set_err(NONE, NULL);
7954 if (ctx) memset(ctx, 0, sizeof(*ctx));
7956 if (yyjson_unlikely(!val || !ptr || !doc)) {
7957 yyjson_ptr_set_err(PARAMETER, "input parameter is NULL");
7960 if (yyjson_unlikely(len == 0)) {
7961 yyjson_ptr_set_err(SET_ROOT, "cannot set root");
7964 if (yyjson_unlikely(*ptr != '/')) {
7965 yyjson_ptr_set_err(SYNTAX, "no prefix '/'");
7969 return !!unsafe_yyjson_mut_ptr_removex(val, ptr, len, ctx, err);
7971 return unsafe_yyjson_mut_ptr_putx(val, ptr, len, new_val, doc,
7972 create_parent, false, ctx, err);
7975yyjson_api_inline yyjson_mut_val *yyjson_mut_doc_ptr_replace(
7976 yyjson_mut_doc *doc, const char *ptr, yyjson_mut_val *new_val) {
7977 if (!ptr) return NULL;
7978 return yyjson_mut_doc_ptr_replacen(doc, ptr, strlen(ptr), new_val);
7981yyjson_api_inline yyjson_mut_val *yyjson_mut_doc_ptr_replacen(
7982 yyjson_mut_doc *doc, const char *ptr, size_t len, yyjson_mut_val *new_val) {
7983 return yyjson_mut_doc_ptr_replacex(doc, ptr, len, new_val, NULL, NULL);
7986yyjson_api_inline yyjson_mut_val *yyjson_mut_doc_ptr_replacex(
7987 yyjson_mut_doc *doc, const char *ptr, size_t len, yyjson_mut_val *new_val,
7988 yyjson_ptr_ctx *ctx, yyjson_ptr_err *err) {
7990 yyjson_ptr_set_err(NONE, NULL);
7991 if (ctx) memset(ctx, 0, sizeof(*ctx));
7993 if (yyjson_unlikely(!doc || !ptr || !new_val)) {
7994 yyjson_ptr_set_err(PARAMETER, "input parameter is NULL");
7997 if (yyjson_unlikely(len == 0)) {
7998 yyjson_mut_val *root = doc->root;
7999 if (yyjson_unlikely(!root)) {
8000 yyjson_ptr_set_err(RESOLVE, "JSON pointer cannot be resolved");
8003 if (ctx) ctx->old = root;
8004 doc->root = new_val;
8007 if (yyjson_unlikely(!doc->root)) {
8008 yyjson_ptr_set_err(NULL_ROOT, "document's root is NULL");
8011 if (yyjson_unlikely(*ptr != '/')) {
8012 yyjson_ptr_set_err(SYNTAX, "no prefix '/'");
8015 return unsafe_yyjson_mut_ptr_replacex(doc->root, ptr, len, new_val,
8019yyjson_api_inline yyjson_mut_val *yyjson_mut_ptr_replace(
8020 yyjson_mut_val *val, const char *ptr, yyjson_mut_val *new_val) {
8021 if (!ptr) return NULL;
8022 return yyjson_mut_ptr_replacen(val, ptr, strlen(ptr), new_val);
8025yyjson_api_inline yyjson_mut_val *yyjson_mut_ptr_replacen(
8026 yyjson_mut_val *val, const char *ptr, size_t len, yyjson_mut_val *new_val) {
8027 return yyjson_mut_ptr_replacex(val, ptr, len, new_val, NULL, NULL);
8030yyjson_api_inline yyjson_mut_val *yyjson_mut_ptr_replacex(
8031 yyjson_mut_val *val, const char *ptr, size_t len, yyjson_mut_val *new_val,
8032 yyjson_ptr_ctx *ctx, yyjson_ptr_err *err) {
8034 yyjson_ptr_set_err(NONE, NULL);
8035 if (ctx) memset(ctx, 0, sizeof(*ctx));
8037 if (yyjson_unlikely(!val || !ptr || !new_val)) {
8038 yyjson_ptr_set_err(PARAMETER, "input parameter is NULL");
8041 if (yyjson_unlikely(len == 0)) {
8042 yyjson_ptr_set_err(SET_ROOT, "cannot set root");
8045 if (yyjson_unlikely(*ptr != '/')) {
8046 yyjson_ptr_set_err(SYNTAX, "no prefix '/'");
8049 return unsafe_yyjson_mut_ptr_replacex(val, ptr, len, new_val, ctx, err);
8052yyjson_api_inline yyjson_mut_val *yyjson_mut_doc_ptr_remove(
8053 yyjson_mut_doc *doc, const char *ptr) {
8054 if (!ptr) return NULL;
8055 return yyjson_mut_doc_ptr_removen(doc, ptr, strlen(ptr));
8058yyjson_api_inline yyjson_mut_val *yyjson_mut_doc_ptr_removen(
8059 yyjson_mut_doc *doc, const char *ptr, size_t len) {
8060 return yyjson_mut_doc_ptr_removex(doc, ptr, len, NULL, NULL);
8063yyjson_api_inline yyjson_mut_val *yyjson_mut_doc_ptr_removex(
8064 yyjson_mut_doc *doc, const char *ptr, size_t len,
8065 yyjson_ptr_ctx *ctx, yyjson_ptr_err *err) {
8067 yyjson_ptr_set_err(NONE, NULL);
8068 if (ctx) memset(ctx, 0, sizeof(*ctx));
8070 if (yyjson_unlikely(!doc || !ptr)) {
8071 yyjson_ptr_set_err(PARAMETER, "input parameter is NULL");
8074 if (yyjson_unlikely(!doc->root)) {
8075 yyjson_ptr_set_err(NULL_ROOT, "document's root is NULL");
8078 if (yyjson_unlikely(len == 0)) {
8079 yyjson_mut_val *root = doc->root;
8080 if (ctx) ctx->old = root;
8084 if (yyjson_unlikely(*ptr != '/')) {
8085 yyjson_ptr_set_err(SYNTAX, "no prefix '/'");
8088 return unsafe_yyjson_mut_ptr_removex(doc->root, ptr, len, ctx, err);
8091yyjson_api_inline yyjson_mut_val *yyjson_mut_ptr_remove(yyjson_mut_val *val,
8093 if (!ptr) return NULL;
8094 return yyjson_mut_ptr_removen(val, ptr, strlen(ptr));
8097yyjson_api_inline yyjson_mut_val *yyjson_mut_ptr_removen(yyjson_mut_val *val,
8100 return yyjson_mut_ptr_removex(val, ptr, len, NULL, NULL);
8103yyjson_api_inline yyjson_mut_val *yyjson_mut_ptr_removex(yyjson_mut_val *val,
8106 yyjson_ptr_ctx *ctx,
8107 yyjson_ptr_err *err) {
8108 yyjson_ptr_set_err(NONE, NULL);
8109 if (ctx) memset(ctx, 0, sizeof(*ctx));
8111 if (yyjson_unlikely(!val || !ptr)) {
8112 yyjson_ptr_set_err(PARAMETER, "input parameter is NULL");
8115 if (yyjson_unlikely(len == 0)) {
8116 yyjson_ptr_set_err(SET_ROOT, "cannot set root");
8119 if (yyjson_unlikely(*ptr != '/')) {
8120 yyjson_ptr_set_err(SYNTAX, "no prefix '/'");
8123 return unsafe_yyjson_mut_ptr_removex(val, ptr, len, ctx, err);
8126yyjson_api_inline bool yyjson_ptr_ctx_append(yyjson_ptr_ctx *ctx,
8127 yyjson_mut_val *key,
8128 yyjson_mut_val *val) {
8129 yyjson_mut_val *ctn, *pre_key, *pre_val, *cur_key, *cur_val;
8130 if (!ctx || !ctx->ctn || !val) return false;
8133 if (yyjson_mut_is_obj(ctn)) {
8134 if (!key) return false;
8137 if (unsafe_yyjson_get_len(ctn) == 0) {
8141 } else if (!pre_key) {
8142 pre_key = (yyjson_mut_val *)ctn->uni.ptr;
8143 pre_val = pre_key->next;
8144 val->next = pre_val->next;
8145 pre_val->next = key;
8149 cur_key = pre_key->next->next;
8150 cur_val = cur_key->next;
8151 val->next = cur_val->next;
8152 cur_val->next = key;
8153 if (ctn->uni.ptr == cur_key) ctn->uni.ptr = key;
8158 if (unsafe_yyjson_get_len(ctn) == 0) {
8162 } else if (!pre_val) {
8163 pre_val = (yyjson_mut_val *)ctn->uni.ptr;
8164 val->next = pre_val->next;
8165 pre_val->next = val;
8169 cur_val = pre_val->next;
8170 val->next = cur_val->next;
8171 cur_val->next = val;
8172 if (ctn->uni.ptr == cur_val) ctn->uni.ptr = val;
8176 unsafe_yyjson_inc_len(ctn);
8180yyjson_api_inline bool yyjson_ptr_ctx_replace(yyjson_ptr_ctx *ctx,
8181 yyjson_mut_val *val) {
8182 yyjson_mut_val *ctn, *pre_key, *cur_key, *pre_val, *cur_val;
8183 if (!ctx || !ctx->ctn || !ctx->pre || !val) return false;
8185 if (yyjson_mut_is_obj(ctn)) {
8187 pre_val = pre_key->next;
8188 cur_key = pre_val->next;
8189 cur_val = cur_key->next;
8190 /* replace current value */
8191 cur_key->next = val;
8192 val->next = cur_val->next;
8196 cur_val = pre_val->next;
8197 /* replace current value */
8198 if (pre_val != cur_val) {
8199 val->next = cur_val->next;
8200 pre_val->next = val;
8201 if (ctn->uni.ptr == cur_val) ctn->uni.ptr = val;
8212yyjson_api_inline bool yyjson_ptr_ctx_remove(yyjson_ptr_ctx *ctx) {
8213 yyjson_mut_val *ctn, *pre_key, *pre_val, *cur_key, *cur_val;
8215 if (!ctx || !ctx->ctn || !ctx->pre) return false;
8217 if (yyjson_mut_is_obj(ctn)) {
8219 pre_val = pre_key->next;
8220 cur_key = pre_val->next;
8221 cur_val = cur_key->next;
8222 /* remove current key-value */
8223 pre_val->next = cur_val->next;
8224 if (ctn->uni.ptr == cur_key) ctn->uni.ptr = pre_key;
8229 cur_val = pre_val->next;
8230 /* remove current key-value */
8231 pre_val->next = cur_val->next;
8232 if (ctn->uni.ptr == cur_val) ctn->uni.ptr = pre_val;
8236 len = unsafe_yyjson_get_len(ctn) - 1;
8237 if (len == 0) ctn->uni.ptr = NULL;
8238 unsafe_yyjson_set_len(ctn, len);
8242#undef yyjson_ptr_set_err
8246/*==============================================================================
8247 * MARK: - JSON Value at Pointer API (Implementation)
8248 *============================================================================*/
8254yyjson_api_inline bool yyjson_ptr_get_bool(
8255 const yyjson_val *root, const char *ptr, bool *value) {
8256 yyjson_val *val = yyjson_ptr_get(root, ptr);
8257 if (value && yyjson_is_bool(val)) {
8258 *value = unsafe_yyjson_get_bool(val);
8269yyjson_api_inline bool yyjson_ptr_get_uint(
8270 const yyjson_val *root, const char *ptr, uint64_t *value) {
8271 yyjson_val *val = yyjson_ptr_get(root, ptr);
8273 uint64_t ret = val->uni.u64;
8274 if (unsafe_yyjson_is_uint(val) ||
8275 (unsafe_yyjson_is_sint(val) && !(ret >> 63))) {
8287yyjson_api_inline bool yyjson_ptr_get_sint(
8288 const yyjson_val *root, const char *ptr, int64_t *value) {
8289 yyjson_val *val = yyjson_ptr_get(root, ptr);
8291 int64_t ret = val->uni.i64;
8292 if (unsafe_yyjson_is_sint(val) ||
8293 (unsafe_yyjson_is_uint(val) && ret >= 0)) {
8305yyjson_api_inline bool yyjson_ptr_get_real(
8306 const yyjson_val *root, const char *ptr, double *value) {
8307 yyjson_val *val = yyjson_ptr_get(root, ptr);
8308 if (value && yyjson_is_real(val)) {
8309 *value = unsafe_yyjson_get_real(val);
8321yyjson_api_inline bool yyjson_ptr_get_num(
8322 const yyjson_val *root, const char *ptr, double *value) {
8323 yyjson_val *val = yyjson_ptr_get(root, ptr);
8324 if (value && yyjson_is_num(val)) {
8325 *value = unsafe_yyjson_get_num(val);
8336yyjson_api_inline bool yyjson_ptr_get_str(
8337 const yyjson_val *root, const char *ptr, const char **value) {
8338 yyjson_val *val = yyjson_ptr_get(root, ptr);
8339 if (value && yyjson_is_str(val)) {
8340 *value = unsafe_yyjson_get_str(val);
8349/*==============================================================================
8350 * MARK: - Deprecated
8351 *============================================================================*/
8354yyjson_deprecated("renamed to yyjson_doc_ptr_get")
8355yyjson_api_inline yyjson_val *yyjson_doc_get_pointer(yyjson_doc *doc,
8357 return yyjson_doc_ptr_get(doc, ptr);
8361yyjson_deprecated("renamed to yyjson_doc_ptr_getn")
8362yyjson_api_inline yyjson_val *yyjson_doc_get_pointern(yyjson_doc *doc,
8365 return yyjson_doc_ptr_getn(doc, ptr, len);
8369yyjson_deprecated("renamed to yyjson_mut_doc_ptr_get")
8370yyjson_api_inline yyjson_mut_val *yyjson_mut_doc_get_pointer(
8371 yyjson_mut_doc *doc, const char *ptr) {
8372 return yyjson_mut_doc_ptr_get(doc, ptr);
8376yyjson_deprecated("renamed to yyjson_mut_doc_ptr_getn")
8377yyjson_api_inline yyjson_mut_val *yyjson_mut_doc_get_pointern(
8378 yyjson_mut_doc *doc, const char *ptr, size_t len) {
8379 return yyjson_mut_doc_ptr_getn(doc, ptr, len);
8383yyjson_deprecated("renamed to yyjson_ptr_get")
8384yyjson_api_inline yyjson_val *yyjson_get_pointer(yyjson_val *val,
8386 return yyjson_ptr_get(val, ptr);
8390yyjson_deprecated("renamed to yyjson_ptr_getn")
8391yyjson_api_inline yyjson_val *yyjson_get_pointern(yyjson_val *val,
8394 return yyjson_ptr_getn(val, ptr, len);
8398yyjson_deprecated("renamed to yyjson_mut_ptr_get")
8399yyjson_api_inline yyjson_mut_val *yyjson_mut_get_pointer(yyjson_mut_val *val,
8401 return yyjson_mut_ptr_get(val, ptr);
8405yyjson_deprecated("renamed to yyjson_mut_ptr_getn")
8406yyjson_api_inline yyjson_mut_val *yyjson_mut_get_pointern(yyjson_mut_val *val,
8409 return yyjson_mut_ptr_getn(val, ptr, len);
8413yyjson_deprecated("renamed to unsafe_yyjson_ptr_getn")
8414yyjson_api_inline yyjson_val *unsafe_yyjson_get_pointer(yyjson_val *val,
8418 return unsafe_yyjson_ptr_getx(val, ptr, len, &err);
8422yyjson_deprecated("renamed to unsafe_yyjson_mut_ptr_getx")
8423yyjson_api_inline yyjson_mut_val *unsafe_yyjson_mut_get_pointer(
8424 yyjson_mut_val *val, const char *ptr, size_t len) {
8426 return unsafe_yyjson_mut_ptr_getx(val, ptr, len, NULL, &err);
8429#endif /* YYJSON_DISABLE_UTILS */
8433/*==============================================================================
8434 * MARK: - Compiler Hint End
8435 *============================================================================*/
8437#if defined(__clang__)
8438# pragma clang diagnostic pop
8439#elif YYJSON_IS_REAL_GCC
8440# if yyjson_gcc_available(4, 6, 0)
8441# pragma GCC diagnostic pop
8443#elif defined(_MSC_VER)
8444# pragma warning(pop)
8445#endif /* warning suppress end */
8449#endif /* extern "C" end */
8451#endif /* YYJSON_H */
void(* free)(void *ctx, void *ptr)
yyjson_api_inline size_t yyjson_mut_get_len(const yyjson_mut_val *val)
yyjson_api_inline bool yyjson_is_ctn(const yyjson_val *val)
yyjson_api_inline char * yyjson_val_write(const yyjson_val *val, yyjson_write_flag flg, size_t *len)
yyjson_api_inline yyjson_mut_val * yyjson_mut_ptr_get(const yyjson_mut_val *val, const char *ptr)
yyjson_api_inline size_t yyjson_mut_arr_size(const yyjson_mut_val *arr)
yyjson_api_inline yyjson_mut_val * yyjson_mut_true(yyjson_mut_doc *doc)
yyjson_api_inline yyjson_mut_val * yyjson_mut_doc_ptr_remove(yyjson_mut_doc *doc, const char *ptr)
yyjson_api_inline bool yyjson_mut_is_int(const yyjson_mut_val *val)
static const yyjson_read_flag YYJSON_READ_ALLOW_TRAILING_COMMAS
yyjson_api_inline yyjson_mut_val * yyjson_mut_arr_with_sint(yyjson_mut_doc *doc, const int64_t *vals, size_t count)
uint32_t yyjson_read_code
yyjson_api_inline bool yyjson_set_fp_to_float(yyjson_val *val, bool flt)
yyjson_api_inline bool yyjson_set_null(yyjson_val *val)
yyjson_api_inline int yyjson_get_int(const yyjson_val *val)
yyjson_api_inline bool yyjson_mut_arr_add_str(yyjson_mut_doc *doc, yyjson_mut_val *arr, const char *str)
static const yyjson_read_code YYJSON_READ_ERROR_MEMORY_ALLOCATION
yyjson_api yyjson_mut_val * yyjson_mut_val_mut_copy(yyjson_mut_doc *doc, const yyjson_mut_val *val)
yyjson_api_inline bool yyjson_mut_set_fp_to_fixed(yyjson_mut_val *val, int prec)
yyjson_api_inline bool yyjson_mut_set_real(yyjson_mut_val *val, double num)
static const yyjson_read_code YYJSON_READ_ERROR_UNEXPECTED_CONTENT
yyjson_api yyjson_mut_val * yyjson_mut_merge_patch(yyjson_mut_doc *doc, const yyjson_mut_val *orig, const yyjson_mut_val *patch)
static const yyjson_write_flag YYJSON_WRITE_ESCAPE_SLASHES
yyjson_api_inline bool yyjson_mut_obj_rotate(yyjson_mut_val *obj, size_t idx)
static const yyjson_patch_code YYJSON_PATCH_ERROR_INVALID_PARAMETER
yyjson_api_inline bool yyjson_mut_set_bool(yyjson_mut_val *val, bool num)
yyjson_api_inline bool yyjson_mut_arr_add_true(yyjson_mut_doc *doc, yyjson_mut_val *arr)
yyjson_api_inline yyjson_mut_val * yyjson_mut_strn(yyjson_mut_doc *doc, const char *str, size_t len)
yyjson_api_inline yyjson_mut_val * yyjson_mut_obj_remove_key(yyjson_mut_val *obj, const char *key)
yyjson_api_inline bool yyjson_mut_equals_str(const yyjson_mut_val *val, const char *str)
static const yyjson_patch_code YYJSON_PATCH_ERROR_INVALID_MEMBER
yyjson_api_inline bool yyjson_is_str(const yyjson_val *val)
yyjson_api_inline bool yyjson_mut_arr_prepend(yyjson_mut_val *arr, yyjson_mut_val *val)
yyjson_api_inline bool yyjson_mut_set_fp_to_float(yyjson_mut_val *val, bool flt)
yyjson_api_inline yyjson_mut_val * yyjson_mut_strncpy(yyjson_mut_doc *doc, const char *str, size_t len)
yyjson_api_inline bool yyjson_mut_arr_add_strncpy(yyjson_mut_doc *doc, yyjson_mut_val *arr, const char *str, size_t len)
yyjson_api_inline bool yyjson_is_obj(const yyjson_val *val)
static const yyjson_read_flag YYJSON_READ_ALLOW_EXT_NUMBER
yyjson_api_inline yyjson_mut_val * yyjson_mut_real(yyjson_mut_doc *doc, double num)
static const yyjson_write_code YYJSON_WRITE_ERROR_NAN_OR_INF
yyjson_api_inline bool yyjson_mut_ptr_setx(yyjson_mut_val *val, const char *ptr, size_t len, yyjson_mut_val *new_val, yyjson_mut_doc *doc, bool create_parent, yyjson_ptr_ctx *ctx, yyjson_ptr_err *err)
yyjson_api_inline yyjson_mut_val * yyjson_mut_false(yyjson_mut_doc *doc)
yyjson_api_inline bool yyjson_mut_set_double(yyjson_mut_val *val, double num)
static const yyjson_read_code YYJSON_READ_ERROR_LITERAL
yyjson_api_inline yyjson_mut_val * yyjson_mut_doc_ptr_replace(yyjson_mut_doc *doc, const char *ptr, yyjson_mut_val *new_val)
yyjson_api_inline const char * yyjson_get_type_desc(const yyjson_val *val)
static const yyjson_read_flag YYJSON_READ_NUMBER_AS_RAW
yyjson_api_inline yyjson_mut_val * yyjson_mut_obj_add_arr(yyjson_mut_doc *doc, yyjson_mut_val *obj, const char *key)
yyjson_api_inline bool yyjson_mut_obj_add_strncpy(yyjson_mut_doc *doc, yyjson_mut_val *obj, const char *key, const char *val, size_t len)
yyjson_api_inline yyjson_val * yyjson_obj_iter_get(yyjson_obj_iter *iter, const char *key)
yyjson_api_inline bool yyjson_set_fp_to_fixed(yyjson_val *val, int prec)
static const yyjson_write_code YYJSON_WRITE_SUCCESS
yyjson_api_inline yyjson_mut_val * yyjson_mut_arr_iter_remove(yyjson_mut_arr_iter *iter)
yyjson_api_inline bool yyjson_mut_obj_add_val(yyjson_mut_doc *doc, yyjson_mut_val *obj, const char *key, yyjson_mut_val *val)
yyjson_api_inline bool yyjson_mut_arr_iter_has_next(yyjson_mut_arr_iter *iter)
yyjson_api_inline bool yyjson_arr_iter_has_next(yyjson_arr_iter *iter)
yyjson_api_inline bool yyjson_mut_doc_ptr_setn(yyjson_mut_doc *doc, const char *ptr, size_t len, yyjson_mut_val *new_val)
yyjson_api_inline bool yyjson_mut_set_float(yyjson_mut_val *val, float num)
yyjson_api_inline size_t yyjson_mut_obj_size(const yyjson_mut_val *obj)
yyjson_api_inline bool yyjson_mut_ptr_addx(yyjson_mut_val *val, const char *ptr, size_t len, yyjson_mut_val *new_val, yyjson_mut_doc *doc, bool create_parent, yyjson_ptr_ctx *ctx, yyjson_ptr_err *err)
yyjson_api char * yyjson_write_number(const yyjson_val *val, char *buf)
yyjson_api_inline yyjson_mut_val * yyjson_mut_arr_remove(yyjson_mut_val *arr, size_t idx)
yyjson_api_inline yyjson_mut_val * yyjson_mut_doc_ptr_getx(const yyjson_mut_doc *doc, const char *ptr, size_t len, yyjson_ptr_ctx *ctx, yyjson_ptr_err *err)
yyjson_api_inline bool yyjson_mut_arr_clear(yyjson_mut_val *arr)
yyjson_api_inline bool yyjson_mut_is_bool(const yyjson_mut_val *val)
yyjson_api_inline yyjson_mut_val * yyjson_mut_doc_ptr_removex(yyjson_mut_doc *doc, const char *ptr, size_t len, yyjson_ptr_ctx *ctx, yyjson_ptr_err *err)
yyjson_api_inline bool yyjson_mut_arr_add_strcpy(yyjson_mut_doc *doc, yyjson_mut_val *arr, const char *str)
yyjson_api_inline bool yyjson_mut_set_strn(yyjson_mut_val *val, const char *str, size_t len)
yyjson_api_inline bool yyjson_mut_obj_add_double(yyjson_mut_doc *doc, yyjson_mut_val *obj, const char *key, double val)
yyjson_api bool yyjson_write_fp(FILE *fp, const yyjson_doc *doc, yyjson_write_flag flg, const yyjson_alc *alc, yyjson_write_err *err)
yyjson_api yyjson_mut_val * yyjson_mut_patch(yyjson_mut_doc *doc, const yyjson_mut_val *orig, const yyjson_mut_val *patch, yyjson_patch_err *err)
static const yyjson_ptr_code YYJSON_PTR_ERR_PARAMETER
yyjson_api_inline yyjson_mut_val * yyjson_mut_arr_with_uint8(yyjson_mut_doc *doc, const uint8_t *vals, size_t count)
yyjson_api const char * yyjson_read_number(const char *dat, yyjson_val *val, yyjson_read_flag flg, const yyjson_alc *alc, yyjson_read_err *err)
static const yyjson_read_code YYJSON_READ_ERROR_FILE_READ
yyjson_api bool yyjson_write_file(const char *path, const yyjson_doc *doc, yyjson_write_flag flg, const yyjson_alc *alc, yyjson_write_err *err)
yyjson_api size_t yyjson_write_buf(char *buf, size_t buf_len, const yyjson_doc *doc, yyjson_write_flag flg, yyjson_write_err *err)
static const yyjson_patch_code YYJSON_PATCH_SUCCESS
yyjson_api_inline const char * yyjson_mut_get_str(const yyjson_mut_val *val)
yyjson_api yyjson_mut_doc * yyjson_mut_doc_mut_copy(const yyjson_mut_doc *doc, const yyjson_alc *alc)
yyjson_api_inline bool yyjson_is_sint(const yyjson_val *val)
static const yyjson_read_flag YYJSON_READ_BIGNUM_AS_RAW
yyjson_api_inline yyjson_mut_val * yyjson_mut_obj_get(const yyjson_mut_val *obj, const char *key)
yyjson_api_inline uint64_t yyjson_get_uint(const yyjson_val *val)
yyjson_api void yyjson_incr_free(yyjson_incr_state *state)
yyjson_api_inline bool yyjson_mut_obj_rename_keyn(yyjson_mut_doc *doc, yyjson_mut_val *obj, const char *key, size_t len, const char *new_key, size_t new_len)
yyjson_api_inline yyjson_mut_val * yyjson_mut_arr_replace(yyjson_mut_val *arr, size_t idx, yyjson_mut_val *val)
yyjson_api_inline yyjson_val * yyjson_obj_iter_get_val(yyjson_val *key)
yyjson_api_inline yyjson_mut_val * yyjson_mut_ptr_removen(yyjson_mut_val *val, const char *ptr, size_t len)
yyjson_api_inline yyjson_mut_val * yyjson_mut_float(yyjson_mut_doc *doc, float num)
yyjson_api_inline yyjson_mut_val * yyjson_mut_rawcpy(yyjson_mut_doc *doc, const char *str)
uint32_t yyjson_read_flag
yyjson_api_inline yyjson_mut_val * yyjson_mut_obj_remove_keyn(yyjson_mut_val *obj, const char *key, size_t key_len)
yyjson_api_inline yyjson_mut_val * yyjson_mut_arr_with_sint64(yyjson_mut_doc *doc, const int64_t *vals, size_t count)
yyjson_api_inline int64_t yyjson_get_sint(const yyjson_val *val)
static const yyjson_read_flag YYJSON_READ_ALLOW_UNQUOTED_KEY
static const yyjson_write_flag YYJSON_WRITE_ALLOW_INF_AND_NAN
yyjson_api_inline bool yyjson_mut_arr_add_double(yyjson_mut_doc *doc, yyjson_mut_val *arr, double num)
static const yyjson_patch_code YYJSON_PATCH_ERROR_INVALID_OPERATION
yyjson_api_inline yyjson_val * yyjson_arr_get_first(const yyjson_val *arr)
yyjson_api_inline yyjson_mut_val * yyjson_mut_obj_iter_getn(yyjson_mut_obj_iter *iter, const char *key, size_t key_len)
yyjson_api bool yyjson_val_write_fp(FILE *fp, const yyjson_val *val, yyjson_write_flag flg, const yyjson_alc *alc, yyjson_write_err *err)
yyjson_api_inline yyjson_mut_val * yyjson_mut_rawn(yyjson_mut_doc *doc, const char *str, size_t len)
yyjson_api yyjson_mut_doc * yyjson_doc_mut_copy(const yyjson_doc *doc, const yyjson_alc *alc)
yyjson_api_inline bool yyjson_mut_obj_add_sint(yyjson_mut_doc *doc, yyjson_mut_val *obj, const char *key, int64_t val)
static const yyjson_write_code YYJSON_WRITE_ERROR_INVALID_VALUE_TYPE
yyjson_api_inline yyjson_mut_val * yyjson_mut_arr_with_strn(yyjson_mut_doc *doc, const char **vals, const size_t *lens, size_t count)
static const yyjson_ptr_code YYJSON_PTR_ERR_NONE
static const yyjson_write_code YYJSON_WRITE_ERROR_FILE_OPEN
yyjson_api_inline yyjson_mut_val * yyjson_mut_ptr_replacex(yyjson_mut_val *val, const char *ptr, size_t len, yyjson_mut_val *new_val, yyjson_ptr_ctx *ctx, yyjson_ptr_err *err)
yyjson_api_inline yyjson_val * yyjson_doc_ptr_getn(const yyjson_doc *doc, const char *ptr, size_t len)
yyjson_api char * yyjson_write_opts(const yyjson_doc *doc, yyjson_write_flag flg, const yyjson_alc *alc, size_t *len, yyjson_write_err *err)
static const yyjson_write_flag YYJSON_WRITE_INF_AND_NAN_AS_NULL
yyjson_api_inline int64_t yyjson_mut_get_sint(const yyjson_mut_val *val)
yyjson_api_inline bool yyjson_set_str_noesc(yyjson_val *val, bool noesc)
yyjson_api_inline bool yyjson_mut_obj_add_strn(yyjson_mut_doc *doc, yyjson_mut_val *obj, const char *key, const char *val, size_t len)
yyjson_api size_t yyjson_mut_val_write_buf(char *buf, size_t buf_len, const yyjson_mut_val *val, yyjson_write_flag flg, yyjson_write_err *err)
yyjson_api_inline bool yyjson_mut_is_ctn(const yyjson_mut_val *val)
yyjson_api_inline bool yyjson_mut_doc_ptr_setx(yyjson_mut_doc *doc, const char *ptr, size_t len, yyjson_mut_val *new_val, bool create_parent, yyjson_ptr_ctx *ctx, yyjson_ptr_err *err)
static const yyjson_read_code YYJSON_READ_ERROR_MORE
yyjson_api_inline yyjson_val * yyjson_arr_get(const yyjson_val *arr, size_t idx)
yyjson_api yyjson_incr_state * yyjson_incr_new(char *buf, size_t buf_len, yyjson_read_flag flg, const yyjson_alc *alc)
yyjson_api_inline yyjson_mut_val * yyjson_mut_obj_with_str(yyjson_mut_doc *doc, const char **keys, const char **vals, size_t count)
static const yyjson_read_flag YYJSON_READ_ALLOW_INF_AND_NAN
yyjson_api size_t yyjson_val_write_buf(char *buf, size_t buf_len, const yyjson_val *val, yyjson_write_flag flg, yyjson_write_err *err)
static const yyjson_write_code YYJSON_WRITE_ERROR_MEMORY_ALLOCATION
yyjson_api_inline bool yyjson_mut_ptr_set(yyjson_mut_val *val, const char *ptr, yyjson_mut_val *new_val, yyjson_mut_doc *doc)
static const yyjson_ptr_code YYJSON_PTR_ERR_SYNTAX
yyjson_api_inline yyjson_mut_val * yyjson_mut_doc_ptr_removen(yyjson_mut_doc *doc, const char *ptr, size_t len)
yyjson_api_inline yyjson_val * yyjson_doc_ptr_get(const yyjson_doc *doc, const char *ptr)
yyjson_api_inline yyjson_mut_val * yyjson_mut_arr_with_float(yyjson_mut_doc *doc, const float *vals, size_t count)
yyjson_api_inline bool yyjson_mut_set_raw(yyjson_mut_val *val, const char *raw, size_t len)
yyjson_api_inline bool yyjson_mut_obj_add_false(yyjson_mut_doc *doc, yyjson_mut_val *obj, const char *key)
yyjson_api_inline bool yyjson_mut_set_obj(yyjson_mut_val *val)
yyjson_api_inline yyjson_mut_val * yyjson_mut_arr_with_sint32(yyjson_mut_doc *doc, const int32_t *vals, size_t count)
yyjson_api_inline double yyjson_mut_get_num(const yyjson_mut_val *val)
yyjson_api_inline yyjson_mut_val * yyjson_mut_obj_iter_next(yyjson_mut_obj_iter *iter)
yyjson_api_inline bool yyjson_mut_obj_add_int(yyjson_mut_doc *doc, yyjson_mut_val *obj, const char *key, int64_t val)
yyjson_api_inline yyjson_mut_val * yyjson_mut_bool(yyjson_mut_doc *doc, bool val)
yyjson_api_inline bool yyjson_mut_is_real(const yyjson_mut_val *val)
static const yyjson_read_code YYJSON_READ_SUCCESS
yyjson_api_inline bool yyjson_mut_arr_add_bool(yyjson_mut_doc *doc, yyjson_mut_val *arr, bool val)
static const yyjson_ptr_code YYJSON_PTR_ERR_NULL_ROOT
yyjson_api_inline bool yyjson_equals_strn(const yyjson_val *val, const char *str, size_t len)
yyjson_api_inline yyjson_mut_val * yyjson_mut_arr_get_first(const yyjson_mut_val *arr)
yyjson_api yyjson_doc * yyjson_mut_doc_imut_copy(const yyjson_mut_doc *doc, const yyjson_alc *alc)
static const yyjson_patch_code YYJSON_PATCH_ERROR_MISSING_KEY
yyjson_api_inline bool yyjson_mut_doc_ptr_addn(yyjson_mut_doc *doc, const char *ptr, size_t len, yyjson_mut_val *new_val)
yyjson_api_inline bool yyjson_mut_obj_add_uint(yyjson_mut_doc *doc, yyjson_mut_val *obj, const char *key, uint64_t val)
yyjson_api_inline bool yyjson_is_true(const yyjson_val *val)
yyjson_api_inline yyjson_val * yyjson_obj_iter_next(yyjson_obj_iter *iter)
yyjson_api yyjson_doc * yyjson_read_file(const char *path, yyjson_read_flag flg, const yyjson_alc *alc, yyjson_read_err *err)
yyjson_api bool yyjson_alc_pool_init(yyjson_alc *alc, void *buf, size_t size)
yyjson_api_inline yyjson_mut_val * yyjson_mut_obj_remove_str(yyjson_mut_val *obj, const char *key)
static const yyjson_read_flag YYJSON_READ_ALLOW_EXT_WHITESPACE
static const yyjson_read_code YYJSON_READ_ERROR_DEPTH
yyjson_api_inline yyjson_mut_val * yyjson_mut_obj_remove(yyjson_mut_val *obj, yyjson_mut_val *key)
yyjson_api_inline size_t yyjson_obj_size(const yyjson_val *obj)
#define yyjson_api_inline
yyjson_api_inline yyjson_mut_val * yyjson_mut_ptr_removex(yyjson_mut_val *val, const char *ptr, size_t len, yyjson_ptr_ctx *ctx, yyjson_ptr_err *err)
yyjson_api_inline yyjson_val * yyjson_doc_get_root(const yyjson_doc *doc)
yyjson_api_inline bool yyjson_mut_is_uint(const yyjson_mut_val *val)
yyjson_api yyjson_alc * yyjson_alc_dyn_new(void)
yyjson_api_inline bool yyjson_mut_equals_strn(const yyjson_mut_val *val, const char *str, size_t len)
yyjson_api_inline bool yyjson_mut_doc_ptr_set(yyjson_mut_doc *doc, const char *ptr, yyjson_mut_val *new_val)
yyjson_api_inline bool yyjson_mut_arr_rotate(yyjson_mut_val *arr, size_t idx)
yyjson_api_inline bool yyjson_mut_set_null(yyjson_mut_val *val)
static const yyjson_patch_code YYJSON_PATCH_ERROR_POINTER
yyjson_api_inline yyjson_mut_val * yyjson_mut_obj_iter_remove(yyjson_mut_obj_iter *iter)
yyjson_api_inline yyjson_val * yyjson_ptr_getx(const yyjson_val *val, const char *ptr, size_t len, yyjson_ptr_err *err)
yyjson_api_inline bool yyjson_mut_arr_add_uint(yyjson_mut_doc *doc, yyjson_mut_val *arr, uint64_t num)
yyjson_api_inline bool yyjson_mut_obj_add_null(yyjson_mut_doc *doc, yyjson_mut_val *obj, const char *key)
yyjson_api_inline bool yyjson_is_arr(const yyjson_val *val)
yyjson_api_inline char * yyjson_mut_val_write(const yyjson_mut_val *val, yyjson_write_flag flg, size_t *len)
static const yyjson_read_code YYJSON_READ_ERROR_INVALID_COMMENT
yyjson_api_inline int yyjson_mut_get_int(const yyjson_mut_val *val)
yyjson_api_inline yyjson_mut_val * yyjson_mut_arr_with_real(yyjson_mut_doc *doc, const double *vals, size_t count)
yyjson_api_inline yyjson_mut_val * yyjson_mut_doc_ptr_replacen(yyjson_mut_doc *doc, const char *ptr, size_t len, yyjson_mut_val *new_val)
yyjson_api_inline yyjson_mut_val * yyjson_mut_obj(yyjson_mut_doc *doc)
yyjson_api_inline yyjson_mut_val * yyjson_mut_obj_add_obj(yyjson_mut_doc *doc, yyjson_mut_val *obj, const char *key)
yyjson_api bool yyjson_val_write_file(const char *path, const yyjson_val *val, yyjson_write_flag flg, const yyjson_alc *alc, yyjson_write_err *err)
yyjson_api_inline yyjson_mut_val * yyjson_mut_arr_with_sint16(yyjson_mut_doc *doc, const int16_t *vals, size_t count)
yyjson_api_inline bool yyjson_is_false(const yyjson_val *val)
yyjson_api_inline yyjson_val * yyjson_obj_get(const yyjson_val *obj, const char *key)
yyjson_api_inline yyjson_mut_val * yyjson_mut_null(yyjson_mut_doc *doc)
yyjson_api_inline bool yyjson_mut_set_int(yyjson_mut_val *val, int64_t num)
yyjson_api_inline yyjson_mut_val * yyjson_mut_raw(yyjson_mut_doc *doc, const char *str)
yyjson_api_inline yyjson_type yyjson_get_type(const yyjson_val *val)
yyjson_api_inline bool yyjson_set_raw(yyjson_val *val, const char *raw, size_t len)
static const yyjson_read_code YYJSON_READ_ERROR_FILE_OPEN
static const yyjson_write_code YYJSON_WRITE_ERROR_FILE_WRITE
yyjson_api_inline yyjson_mut_val * yyjson_mut_arr_iter_next(yyjson_mut_arr_iter *iter)
yyjson_api char * yyjson_val_write_opts(const yyjson_val *val, yyjson_write_flag flg, const yyjson_alc *alc, size_t *len, yyjson_write_err *err)
yyjson_api_inline yyjson_val * yyjson_obj_iter_getn(yyjson_obj_iter *iter, const char *key, size_t key_len)
yyjson_api void yyjson_mut_doc_free(yyjson_mut_doc *doc)
yyjson_api char * yyjson_mut_write_opts(const yyjson_mut_doc *doc, yyjson_write_flag flg, const yyjson_alc *alc, size_t *len, yyjson_write_err *err)
static const yyjson_write_flag YYJSON_WRITE_PRETTY_TWO_SPACES
yyjson_api_inline bool yyjson_is_int(const yyjson_val *val)
yyjson_api_inline bool yyjson_is_real(const yyjson_val *val)
yyjson_api_inline bool yyjson_obj_iter_init(const yyjson_val *obj, yyjson_obj_iter *iter)
static const yyjson_write_code YYJSON_WRITE_ERROR_INVALID_PARAMETER
yyjson_api yyjson_doc * yyjson_read_fp(FILE *fp, yyjson_read_flag flg, const yyjson_alc *alc, yyjson_read_err *err)
yyjson_api_inline bool yyjson_mut_obj_add_true(yyjson_mut_doc *doc, yyjson_mut_val *obj, const char *key)
yyjson_api_inline yyjson_mut_val * yyjson_mut_ptr_getn(const yyjson_mut_val *val, const char *ptr, size_t len)
static const yyjson_read_code YYJSON_READ_ERROR_INVALID_PARAMETER
yyjson_api_inline bool yyjson_mut_set_uint(yyjson_mut_val *val, uint64_t num)
yyjson_api_inline bool yyjson_mut_set_str(yyjson_mut_val *val, const char *str)
yyjson_api_inline yyjson_mut_val * yyjson_mut_ptr_remove(yyjson_mut_val *val, const char *ptr)
yyjson_api_inline yyjson_mut_val * yyjson_mut_arr_with_uint16(yyjson_mut_doc *doc, const uint16_t *vals, size_t count)
static const yyjson_read_flag YYJSON_READ_JSON5
yyjson_api uint32_t yyjson_version(void)
yyjson_api_inline char * yyjson_mut_write(const yyjson_mut_doc *doc, yyjson_write_flag flg, size_t *len)
yyjson_api_inline yyjson_mut_val * yyjson_mut_uint(yyjson_mut_doc *doc, uint64_t num)
static const yyjson_read_flag YYJSON_READ_NOFLAG
yyjson_api_inline yyjson_mut_val * yyjson_mut_rawncpy(yyjson_mut_doc *doc, const char *str, size_t len)
yyjson_api_inline void yyjson_mut_doc_set_root(yyjson_mut_doc *doc, yyjson_mut_val *root)
yyjson_api_inline yyjson_mut_val * yyjson_mut_arr_add_arr(yyjson_mut_doc *doc, yyjson_mut_val *arr)
static const yyjson_read_code YYJSON_READ_ERROR_INVALID_NUMBER
yyjson_api_inline bool yyjson_set_uint(yyjson_val *val, uint64_t num)
yyjson_api_inline yyjson_mut_val * yyjson_mut_arr_with_strcpy(yyjson_mut_doc *doc, const char **vals, size_t count)
yyjson_api_inline yyjson_mut_val * yyjson_mut_arr_remove_last(yyjson_mut_val *arr)
yyjson_api_inline bool yyjson_ptr_ctx_remove(yyjson_ptr_ctx *ctx)
yyjson_api_inline yyjson_mut_val * yyjson_mut_int(yyjson_mut_doc *doc, int64_t num)
yyjson_api_inline bool yyjson_mut_arr_add_false(yyjson_mut_doc *doc, yyjson_mut_val *arr)
yyjson_api_inline yyjson_mut_val * yyjson_mut_strcpy(yyjson_mut_doc *doc, const char *str)
yyjson_api_inline bool yyjson_equals_str(const yyjson_val *val, const char *str)
yyjson_api_inline bool yyjson_mut_obj_replace(yyjson_mut_val *obj, yyjson_mut_val *key, yyjson_mut_val *val)
yyjson_api_inline bool yyjson_mut_arr_add_strn(yyjson_mut_doc *doc, yyjson_mut_val *arr, const char *str, size_t len)
yyjson_api_inline yyjson_mut_val * yyjson_mut_double(yyjson_mut_doc *doc, double num)
yyjson_api_inline bool yyjson_mut_obj_insert(yyjson_mut_val *obj, yyjson_mut_val *key, yyjson_mut_val *val, size_t idx)
yyjson_api_inline bool yyjson_mut_is_obj(const yyjson_mut_val *val)
yyjson_api_inline bool yyjson_mut_obj_add_str(yyjson_mut_doc *doc, yyjson_mut_val *obj, const char *key, const char *val)
yyjson_api_inline size_t yyjson_doc_get_read_size(const yyjson_doc *doc)
yyjson_api_inline bool yyjson_set_str(yyjson_val *val, const char *str)
yyjson_api_inline yyjson_mut_val * yyjson_mut_arr_get_last(const yyjson_mut_val *arr)
yyjson_api_inline bool yyjson_equals(const yyjson_val *lhs, const yyjson_val *rhs)
yyjson_api_inline yyjson_mut_arr_iter yyjson_mut_arr_iter_with(yyjson_mut_val *arr)
yyjson_api bool yyjson_mut_doc_set_val_pool_size(yyjson_mut_doc *doc, size_t count)
yyjson_api_inline char * yyjson_mut_write_number(const yyjson_mut_val *val, char *buf)
yyjson_api_inline bool yyjson_set_strn(yyjson_val *val, const char *str, size_t len)
yyjson_api_inline yyjson_mut_val * yyjson_mut_obj_iter_get(yyjson_mut_obj_iter *iter, const char *key)
yyjson_api_inline bool yyjson_ptr_ctx_append(yyjson_ptr_ctx *ctx, yyjson_mut_val *key, yyjson_mut_val *val)
static const yyjson_read_flag YYJSON_READ_ALLOW_EXT_ESCAPE
yyjson_api_inline const char * yyjson_mut_get_type_desc(const yyjson_mut_val *val)
yyjson_api_inline yyjson_mut_val * yyjson_mut_doc_get_root(yyjson_mut_doc *doc)
static const yyjson_read_flag YYJSON_READ_INSITU
yyjson_api_inline bool yyjson_mut_arr_add_real(yyjson_mut_doc *doc, yyjson_mut_val *arr, double num)
yyjson_api_inline bool yyjson_mut_obj_add_real(yyjson_mut_doc *doc, yyjson_mut_val *obj, const char *key, double val)
yyjson_api_inline bool yyjson_mut_ptr_addn(yyjson_mut_val *val, const char *ptr, size_t len, yyjson_mut_val *new_val, yyjson_mut_doc *doc)
yyjson_api_inline yyjson_mut_val * yyjson_mut_obj_iter_get_val(yyjson_mut_val *key)
yyjson_api void yyjson_alc_dyn_free(yyjson_alc *alc)
yyjson_api yyjson_doc * yyjson_mut_val_imut_copy(const yyjson_mut_val *val, const yyjson_alc *alc)
yyjson_api_inline yyjson_val * yyjson_ptr_get(const yyjson_val *val, const char *ptr)
yyjson_api_inline bool yyjson_is_uint(const yyjson_val *val)
yyjson_api_inline yyjson_mut_val * yyjson_mut_arr_with_uint64(yyjson_mut_doc *doc, const uint64_t *vals, size_t count)
yyjson_api_inline bool yyjson_set_float(yyjson_val *val, float num)
yyjson_api_inline bool yyjson_mut_arr_add_float(yyjson_mut_doc *doc, yyjson_mut_val *arr, float num)
yyjson_api_inline yyjson_subtype yyjson_mut_get_subtype(const yyjson_mut_val *val)
yyjson_api_inline yyjson_mut_val * yyjson_mut_doc_ptr_getn(const yyjson_mut_doc *doc, const char *ptr, size_t len)
static const yyjson_write_flag YYJSON_WRITE_NEWLINE_AT_END
yyjson_api_inline uint64_t yyjson_mut_get_uint(const yyjson_mut_val *val)
yyjson_api_inline bool yyjson_mut_equals(const yyjson_mut_val *lhs, const yyjson_mut_val *rhs)
yyjson_api_inline yyjson_mut_val * yyjson_mut_arr_with_uint(yyjson_mut_doc *doc, const uint64_t *vals, size_t count)
yyjson_api_inline bool yyjson_mut_arr_add_val(yyjson_mut_val *arr, yyjson_mut_val *val)
yyjson_api yyjson_mut_val * yyjson_val_mut_copy(yyjson_mut_doc *doc, const yyjson_val *val)
yyjson_api_inline bool yyjson_mut_arr_add_sint(yyjson_mut_doc *doc, yyjson_mut_val *arr, int64_t num)
yyjson_api_inline bool yyjson_mut_ptr_add(yyjson_mut_val *val, const char *ptr, yyjson_mut_val *new_val, yyjson_mut_doc *doc)
static const yyjson_read_code YYJSON_READ_ERROR_INVALID_STRING
yyjson_api_inline yyjson_mut_val * yyjson_mut_doc_ptr_get(const yyjson_mut_doc *doc, const char *ptr)
yyjson_api_inline yyjson_val * yyjson_arr_iter_next(yyjson_arr_iter *iter)
yyjson_api_inline bool yyjson_is_num(const yyjson_val *val)
yyjson_api_inline bool yyjson_obj_iter_has_next(yyjson_obj_iter *iter)
yyjson_api_inline yyjson_mut_val * yyjson_mut_ptr_getx(const yyjson_mut_val *val, const char *ptr, size_t len, yyjson_ptr_ctx *ctx, yyjson_ptr_err *err)
static const yyjson_write_code YYJSON_WRITE_ERROR_INVALID_STRING
yyjson_api_inline bool yyjson_mut_arr_remove_range(yyjson_mut_val *arr, size_t idx, size_t len)
yyjson_api_inline bool yyjson_is_null(const yyjson_val *val)
yyjson_api_inline yyjson_mut_val * yyjson_mut_arr_with_sint8(yyjson_mut_doc *doc, const int8_t *vals, size_t count)
yyjson_api_inline uint8_t yyjson_get_tag(const yyjson_val *val)
yyjson_api_inline bool yyjson_mut_is_num(const yyjson_mut_val *val)
yyjson_api_inline bool yyjson_set_int(yyjson_val *val, int64_t num)
yyjson_api_inline yyjson_mut_val * yyjson_mut_arr_get(const yyjson_mut_val *arr, size_t idx)
yyjson_api_inline size_t yyjson_get_len(const yyjson_val *val)
yyjson_api char * yyjson_mut_val_write_opts(const yyjson_mut_val *val, yyjson_write_flag flg, const yyjson_alc *alc, size_t *len, yyjson_write_err *err)
static const yyjson_read_flag YYJSON_READ_ALLOW_INVALID_UNICODE
yyjson_api_inline bool yyjson_mut_obj_add_bool(yyjson_mut_doc *doc, yyjson_mut_val *obj, const char *key, bool val)
yyjson_api_inline bool yyjson_mut_obj_add_strcpy(yyjson_mut_doc *doc, yyjson_mut_val *obj, const char *key, const char *val)
yyjson_api_inline bool yyjson_mut_obj_add(yyjson_mut_val *obj, yyjson_mut_val *key, yyjson_mut_val *val)
yyjson_api_inline yyjson_mut_val * yyjson_mut_obj_getn(const yyjson_mut_val *obj, const char *key, size_t key_len)
static const yyjson_write_flag YYJSON_WRITE_ESCAPE_UNICODE
yyjson_api_inline yyjson_mut_val * yyjson_mut_arr_with_uint32(yyjson_mut_doc *doc, const uint32_t *vals, size_t count)
yyjson_api_inline yyjson_arr_iter yyjson_arr_iter_with(const yyjson_val *arr)
static const yyjson_ptr_code YYJSON_PTR_ERR_MEMORY_ALLOCATION
yyjson_api_inline bool yyjson_ptr_ctx_replace(yyjson_ptr_ctx *ctx, yyjson_mut_val *val)
yyjson_api_inline size_t yyjson_arr_size(const yyjson_val *arr)
yyjson_api bool yyjson_locate_pos(const char *str, size_t len, size_t pos, size_t *line, size_t *col, size_t *chr)
yyjson_api_inline bool yyjson_set_real(yyjson_val *val, double num)
yyjson_api_inline yyjson_mut_val * yyjson_mut_arr_with_double(yyjson_mut_doc *doc, const double *vals, size_t count)
yyjson_api_inline bool yyjson_mut_ptr_setn(yyjson_mut_val *val, const char *ptr, size_t len, yyjson_mut_val *new_val, yyjson_mut_doc *doc)
yyjson_api bool yyjson_mut_write_fp(FILE *fp, const yyjson_mut_doc *doc, yyjson_write_flag flg, const yyjson_alc *alc, yyjson_write_err *err)
yyjson_api size_t yyjson_mut_write_buf(char *buf, size_t buf_len, const yyjson_mut_doc *doc, yyjson_write_flag flg, yyjson_write_err *err)
yyjson_api_inline bool yyjson_mut_obj_iter_has_next(yyjson_mut_obj_iter *iter)
yyjson_api_inline const char * yyjson_get_raw(const yyjson_val *val)
yyjson_api_inline bool yyjson_mut_set_str_noesc(yyjson_mut_val *val, bool noesc)
yyjson_api bool yyjson_mut_val_write_fp(FILE *fp, const yyjson_mut_val *val, yyjson_write_flag flg, const yyjson_alc *alc, yyjson_write_err *err)
yyjson_api yyjson_mut_val * yyjson_patch(yyjson_mut_doc *doc, const yyjson_val *orig, const yyjson_val *patch, yyjson_patch_err *err)
yyjson_api_inline bool yyjson_mut_obj_put(yyjson_mut_val *obj, yyjson_mut_val *key, yyjson_mut_val *val)
yyjson_api_inline bool yyjson_mut_is_str(const yyjson_mut_val *val)
yyjson_api_inline bool yyjson_mut_is_false(const yyjson_mut_val *val)
yyjson_api_inline yyjson_mut_val * yyjson_mut_arr_add_obj(yyjson_mut_doc *doc, yyjson_mut_val *arr)
yyjson_api_inline yyjson_mut_val * yyjson_mut_sint(yyjson_mut_doc *doc, int64_t num)
yyjson_api yyjson_doc * yyjson_read_opts(char *dat, size_t len, yyjson_read_flag flg, const yyjson_alc *alc, yyjson_read_err *err)
yyjson_api_inline yyjson_obj_iter yyjson_obj_iter_with(const yyjson_val *obj)
yyjson_api_inline bool yyjson_set_double(yyjson_val *val, double num)
#define yyjson_constant_p(value)
yyjson_api_inline size_t yyjson_doc_get_val_count(const yyjson_doc *doc)
yyjson_api_inline bool yyjson_set_sint(yyjson_val *val, int64_t num)
yyjson_api_inline bool yyjson_mut_arr_add_int(yyjson_mut_doc *doc, yyjson_mut_val *arr, int64_t num)
yyjson_api_inline char * yyjson_write(const yyjson_doc *doc, yyjson_write_flag flg, size_t *len)
yyjson_api_inline bool yyjson_mut_doc_ptr_addx(yyjson_mut_doc *doc, const char *ptr, size_t len, yyjson_mut_val *new_val, bool create_parent, yyjson_ptr_ctx *ctx, yyjson_ptr_err *err)
yyjson_api bool yyjson_mut_write_file(const char *path, const yyjson_mut_doc *doc, yyjson_write_flag flg, const yyjson_alc *alc, yyjson_write_err *err)
static const yyjson_read_flag YYJSON_READ_STOP_WHEN_DONE
yyjson_api_inline bool yyjson_mut_obj_iter_init(yyjson_mut_val *obj, yyjson_mut_obj_iter *iter)
yyjson_api_inline bool yyjson_mut_set_sint(yyjson_mut_val *val, int64_t num)
yyjson_api yyjson_mut_val * yyjson_merge_patch(yyjson_mut_doc *doc, const yyjson_val *orig, const yyjson_val *patch)
yyjson_api_inline yyjson_val * yyjson_obj_getn(const yyjson_val *obj, const char *key, size_t key_len)
yyjson_api_inline double yyjson_mut_get_real(const yyjson_mut_val *val)
uint32_t yyjson_patch_code
static const yyjson_read_code YYJSON_READ_ERROR_JSON_STRUCTURE
yyjson_api_inline yyjson_mut_val * yyjson_mut_ptr_replace(yyjson_mut_val *val, const char *ptr, yyjson_mut_val *new_val)
static const yyjson_patch_code YYJSON_PATCH_ERROR_MEMORY_ALLOCATION
yyjson_api_inline bool yyjson_mut_arr_iter_init(yyjson_mut_val *arr, yyjson_mut_arr_iter *iter)
yyjson_api_inline yyjson_mut_val * yyjson_mut_arr_with_strncpy(yyjson_mut_doc *doc, const char **vals, const size_t *lens, size_t count)
static const yyjson_read_code YYJSON_READ_ERROR_EMPTY_CONTENT
yyjson_api_inline bool yyjson_set_bool(yyjson_val *val, bool num)
yyjson_api_inline yyjson_type yyjson_mut_get_type(const yyjson_mut_val *val)
yyjson_api_inline void yyjson_doc_free(yyjson_doc *doc)
static const yyjson_patch_code YYJSON_PATCH_ERROR_EQUAL
static const yyjson_read_flag YYJSON_READ_ALLOW_SINGLE_QUOTED_STR
yyjson_api_inline bool yyjson_is_raw(const yyjson_val *val)
yyjson_api yyjson_doc * yyjson_incr_read(yyjson_incr_state *state, size_t len, yyjson_read_err *err)
yyjson_api_inline yyjson_val * yyjson_doc_ptr_getx(const yyjson_doc *doc, const char *ptr, size_t len, yyjson_ptr_err *err)
yyjson_api bool yyjson_mut_val_write_file(const char *path, const yyjson_mut_val *val, yyjson_write_flag flg, const yyjson_alc *alc, yyjson_write_err *err)
yyjson_api_inline bool yyjson_mut_arr_insert(yyjson_mut_val *arr, yyjson_mut_val *val, size_t idx)
static const yyjson_write_flag YYJSON_WRITE_NOFLAG
uint32_t yyjson_write_code
yyjson_api_inline bool yyjson_mut_doc_ptr_add(yyjson_mut_doc *doc, const char *ptr, yyjson_mut_val *new_val)
static const yyjson_write_flag YYJSON_WRITE_ALLOW_INVALID_UNICODE
yyjson_api yyjson_mut_doc * yyjson_mut_doc_new(const yyjson_alc *alc)
yyjson_api_inline const char * yyjson_get_str(const yyjson_val *val)
yyjson_api_inline bool yyjson_mut_is_raw(const yyjson_mut_val *val)
yyjson_api_inline const char * yyjson_mut_get_raw(const yyjson_mut_val *val)
yyjson_api_inline uint8_t yyjson_mut_get_tag(const yyjson_mut_val *val)
yyjson_api_inline size_t yyjson_read_max_memory_usage(size_t len, yyjson_read_flag flg)
yyjson_api_inline yyjson_mut_val * yyjson_mut_obj_remove_strn(yyjson_mut_val *obj, const char *key, size_t len)
yyjson_api_inline bool yyjson_mut_is_sint(const yyjson_mut_val *val)
static const yyjson_read_code YYJSON_READ_ERROR_UNEXPECTED_END
yyjson_api_inline double yyjson_get_real(const yyjson_val *val)
yyjson_api_inline yyjson_mut_val * yyjson_mut_str(yyjson_mut_doc *doc, const char *str)
yyjson_api_inline bool yyjson_mut_is_arr(const yyjson_mut_val *val)
yyjson_api_inline bool yyjson_mut_obj_rename_key(yyjson_mut_doc *doc, yyjson_mut_val *obj, const char *key, const char *new_key)
yyjson_api_inline yyjson_doc * yyjson_read(const char *dat, size_t len, yyjson_read_flag flg)
yyjson_api_inline bool yyjson_mut_obj_add_float(yyjson_mut_doc *doc, yyjson_mut_val *obj, const char *key, float val)
static const yyjson_write_flag YYJSON_WRITE_PRETTY
yyjson_api_inline yyjson_mut_val * yyjson_mut_arr(yyjson_mut_doc *doc)
static const yyjson_read_code YYJSON_READ_ERROR_UNEXPECTED_CHARACTER
yyjson_api bool yyjson_mut_doc_set_str_pool_size(yyjson_mut_doc *doc, size_t len)
yyjson_api_inline bool yyjson_mut_get_bool(const yyjson_mut_val *val)
yyjson_api_inline const char * yyjson_mut_read_number(const char *dat, yyjson_mut_val *val, yyjson_read_flag flg, const yyjson_alc *alc, yyjson_read_err *err)
yyjson_api_inline yyjson_mut_val * yyjson_mut_doc_ptr_replacex(yyjson_mut_doc *doc, const char *ptr, size_t len, yyjson_mut_val *new_val, yyjson_ptr_ctx *ctx, yyjson_ptr_err *err)
yyjson_api_inline yyjson_mut_obj_iter yyjson_mut_obj_iter_with(yyjson_mut_val *obj)
yyjson_api_inline bool yyjson_mut_obj_clear(yyjson_mut_val *obj)
yyjson_api_inline yyjson_val * yyjson_arr_get_last(const yyjson_val *arr)
yyjson_api_inline yyjson_subtype yyjson_get_subtype(const yyjson_val *val)
yyjson_api_inline bool yyjson_mut_arr_append(yyjson_mut_val *arr, yyjson_mut_val *val)
yyjson_api_inline bool yyjson_arr_iter_init(const yyjson_val *arr, yyjson_arr_iter *iter)
yyjson_api_inline yyjson_val * yyjson_ptr_getn(const yyjson_val *val, const char *ptr, size_t len)
static const yyjson_read_flag YYJSON_READ_ALLOW_BOM
yyjson_api_inline bool yyjson_mut_is_null(const yyjson_mut_val *val)
yyjson_api_inline yyjson_mut_val * yyjson_mut_ptr_replacen(yyjson_mut_val *val, const char *ptr, size_t len, yyjson_mut_val *new_val)
yyjson_api_inline double yyjson_get_num(const yyjson_val *val)
yyjson_api_inline bool yyjson_mut_is_true(const yyjson_mut_val *val)
yyjson_api_inline bool unsafe_yyjson_is_str_noesc(const char *str, size_t len)
static const yyjson_write_flag YYJSON_WRITE_LOWERCASE_HEX
yyjson_api_inline bool yyjson_mut_set_arr(yyjson_mut_val *val)
yyjson_api_inline yyjson_mut_val * yyjson_mut_arr_remove_first(yyjson_mut_val *arr)
yyjson_api_inline yyjson_mut_val * yyjson_mut_arr_with_str(yyjson_mut_doc *doc, const char **vals, size_t count)
static const yyjson_ptr_code YYJSON_PTR_ERR_SET_ROOT
yyjson_api_inline bool yyjson_mut_arr_add_null(yyjson_mut_doc *doc, yyjson_mut_val *arr)
uint32_t yyjson_write_flag
yyjson_api_inline yyjson_mut_val * yyjson_mut_obj_with_kv(yyjson_mut_doc *doc, const char **kv_pairs, size_t pair_count)
yyjson_api_inline bool yyjson_get_bool(const yyjson_val *val)
yyjson_api_inline yyjson_mut_val * yyjson_mut_arr_with_bool(yyjson_mut_doc *doc, const bool *vals, size_t count)
yyjson_api_inline bool yyjson_is_bool(const yyjson_val *val)
static const yyjson_read_flag YYJSON_READ_ALLOW_COMMENTS
static const yyjson_ptr_code YYJSON_PTR_ERR_RESOLVE