56#ifndef CTOON_DISABLE_READER
64#ifndef CTOON_DISABLE_WRITER
71#ifndef CTOON_DISABLE_INCR_READER
78#ifndef CTOON_DISABLE_UTILS
85#ifndef CTOON_ENABLE_JSON
95#ifndef CTOON_DISABLE_FAST_FP_CONV
104#ifndef CTOON_DISABLE_NON_STANDARD
124#ifndef CTOON_DISABLE_UTF8_VALIDATION
133#ifndef CTOON_DISABLE_UNALIGNED_MEMORY_ACCESS
145#ifndef CTOON_HAS_STDINT_H
149#ifndef CTOON_HAS_STDBOOL_H
153#ifndef CTOON_READER_DEPTH_LIMIT
163# define CTOON_MSC_VER _MSC_VER
165# define CTOON_MSC_VER 0
170# define CTOON_GCC_VER __GNUC__
171# if defined(__GNUC_PATCHLEVEL__)
172# define ctoon_gcc_available(major, minor, patch) \
173 ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) \
174 >= (major * 10000 + minor * 100 + patch))
176# define ctoon_gcc_available(major, minor, patch) \
177 ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100) \
178 >= (major * 10000 + minor * 100 + patch))
181# define CTOON_GCC_VER 0
182# define ctoon_gcc_available(major, minor, patch) 0
186#if defined(__GNUC__) && defined(__GNUC_MINOR__) && \
187 !defined(__clang__) && !defined(__llvm__) && \
188 !defined(__INTEL_COMPILER) && !defined(__ICC) && \
189 !defined(__NVCC__) && !defined(__PGI) && !defined(__TINYC__)
190# define CTOON_IS_REAL_GCC 1
192# define CTOON_IS_REAL_GCC 0
196#if defined(__STDC__) && (__STDC__ >= 1) && defined(__STDC_VERSION__)
197# define CTOON_STDC_VER __STDC_VERSION__
199# define CTOON_STDC_VER 0
203#if defined(__cplusplus)
204# define CTOON_CPP_VER __cplusplus
206# define CTOON_CPP_VER 0
210#ifndef ctoon_has_builtin
212# define ctoon_has_builtin(x) __has_builtin(x)
214# define ctoon_has_builtin(x) 0
219#ifndef ctoon_has_attribute
220# ifdef __has_attribute
221# define ctoon_has_attribute(x) __has_attribute(x)
223# define ctoon_has_attribute(x) 0
228#ifndef ctoon_has_feature
230# define ctoon_has_feature(x) __has_feature(x)
232# define ctoon_has_feature(x) 0
237#ifndef ctoon_has_include
239# define ctoon_has_include(x) __has_include(x)
241# define ctoon_has_include(x) 0
247# if CTOON_MSC_VER >= 1200
248# define ctoon_inline __forceinline
249# elif defined(_MSC_VER)
250# define ctoon_inline __inline
251# elif ctoon_has_attribute(always_inline) || CTOON_GCC_VER >= 4
252# define ctoon_inline __inline__ __attribute__((always_inline))
253# elif defined(__clang__) || defined(__GNUC__)
254# define ctoon_inline __inline__
255# elif defined(__cplusplus) || CTOON_STDC_VER >= 199901L
256# define ctoon_inline inline
263#ifndef ctoon_noinline
264# if CTOON_MSC_VER >= 1400
265# define ctoon_noinline __declspec(noinline)
266# elif ctoon_has_attribute(noinline) || CTOON_GCC_VER >= 4
267# define ctoon_noinline __attribute__((noinline))
269# define ctoon_noinline
275# if CTOON_MSC_VER >= 1300
276# define ctoon_align(x) __declspec(align(x))
277# elif ctoon_has_attribute(aligned) || defined(__GNUC__)
278# define ctoon_align(x) __attribute__((aligned(x)))
279# elif CTOON_CPP_VER >= 201103L
280# define ctoon_align(x) alignas(x)
282# define ctoon_align(x)
288# if ctoon_has_builtin(__builtin_expect) || \
289 (CTOON_GCC_VER >= 4 && CTOON_GCC_VER != 5)
290# define ctoon_likely(expr) __builtin_expect(!!(expr), 1)
292# define ctoon_likely(expr) (expr)
297#ifndef ctoon_unlikely
298# if ctoon_has_builtin(__builtin_expect) || \
299 (CTOON_GCC_VER >= 4 && CTOON_GCC_VER != 5)
300# define ctoon_unlikely(expr) __builtin_expect(!!(expr), 0)
302# define ctoon_unlikely(expr) (expr)
307#ifndef ctoon_constant_p
308# if ctoon_has_builtin(__builtin_constant_p) || (CTOON_GCC_VER >= 3)
309# define CTOON_HAS_CONSTANT_P 1
310# define ctoon_constant_p(value) __builtin_constant_p(value)
312# define CTOON_HAS_CONSTANT_P 0
313# define ctoon_constant_p(value) 0
318#ifndef ctoon_deprecated
319# if CTOON_MSC_VER >= 1400
320# define ctoon_deprecated(msg) __declspec(deprecated(msg))
321# elif ctoon_has_feature(attribute_deprecated_with_message) || \
322 (CTOON_GCC_VER > 4 || (CTOON_GCC_VER == 4 && __GNUC_MINOR__ >= 5))
323# define ctoon_deprecated(msg) __attribute__((deprecated(msg)))
324# elif CTOON_GCC_VER >= 3
325# define ctoon_deprecated(msg) __attribute__((deprecated))
327# define ctoon_deprecated(msg)
334# if defined(CTOON_EXPORTS) && CTOON_EXPORTS
335# define ctoon_api __declspec(dllexport)
336# elif defined(CTOON_IMPORTS) && CTOON_IMPORTS
337# define ctoon_api __declspec(dllimport)
341# elif ctoon_has_attribute(visibility) || CTOON_GCC_VER >= 4
342# define ctoon_api __attribute__((visibility("default")))
349#ifndef ctoon_api_inline
350# define ctoon_api_inline static ctoon_inline
354#if (defined(CTOON_HAS_STDINT_H) && CTOON_HAS_STDINT_H) || \
355 CTOON_MSC_VER >= 1600 || CTOON_STDC_VER >= 199901L || \
356 defined(_STDINT_H) || defined(_STDINT_H_) || \
357 defined(__CLANG_STDINT_H) || defined(_STDINT_H_INCLUDED) || \
358 ctoon_has_include(<stdint.h>)
360#elif defined(_MSC_VER)
362 typedef signed char int8_t;
363 typedef signed short int16_t;
364 typedef signed int int32_t;
365 typedef unsigned char uint8_t;
366 typedef unsigned short uint16_t;
367 typedef unsigned int uint32_t;
368 typedef signed __int64 int64_t;
369 typedef unsigned __int64 uint64_t;
371 typedef signed __int8 int8_t;
372 typedef signed __int16 int16_t;
373 typedef signed __int32 int32_t;
374 typedef unsigned __int8 uint8_t;
375 typedef unsigned __int16 uint16_t;
376 typedef unsigned __int32 uint32_t;
377 typedef signed __int64 int64_t;
378 typedef unsigned __int64 uint64_t;
381# if UCHAR_MAX == 0xFFU
382 typedef signed char int8_t;
383 typedef unsigned char uint8_t;
385# error cannot find 8-bit integer type
387# if USHRT_MAX == 0xFFFFU
388 typedef unsigned short uint16_t;
389 typedef signed short int16_t;
390# elif UINT_MAX == 0xFFFFU
391 typedef unsigned int uint16_t;
392 typedef signed int int16_t;
394# error cannot find 16-bit integer type
396# if UINT_MAX == 0xFFFFFFFFUL
397 typedef unsigned int uint32_t;
398 typedef signed int int32_t;
399# elif ULONG_MAX == 0xFFFFFFFFUL
400 typedef unsigned long uint32_t;
401 typedef signed long int32_t;
402# elif USHRT_MAX == 0xFFFFFFFFUL
403 typedef unsigned short uint32_t;
404 typedef signed short int32_t;
406# error cannot find 32-bit integer type
408# if defined(__INT64_TYPE__) && defined(__UINT64_TYPE__)
409 typedef __INT64_TYPE__ int64_t;
410 typedef __UINT64_TYPE__ uint64_t;
411# elif defined(__GNUC__) || defined(__clang__)
412# if !defined(_SYS_TYPES_H) && !defined(__int8_t_defined)
413 __extension__
typedef long long int64_t;
415 __extension__
typedef unsigned long long uint64_t;
416# elif defined(_LONG_LONG) || defined(__MWERKS__) || defined(_CRAYC) || \
417 defined(__SUNPRO_C) || defined(__SUNPRO_CC)
418 typedef long long int64_t;
419 typedef unsigned long long uint64_t;
420# elif (defined(__BORLANDC__) && __BORLANDC__ > 0x460) || \
421 defined(__WATCOM_INT64__) || defined (__alpha) || defined (__DECC)
422 typedef __int64 int64_t;
423 typedef unsigned __int64 uint64_t;
425# error cannot find 64-bit integer type
430#if (defined(CTOON_HAS_STDBOOL_H) && CTOON_HAS_STDBOOL_H) || \
431 CTOON_MSC_VER >= 1800 || CTOON_STDC_VER >= 199901L || \
432 (ctoon_has_include(<stdbool.h>) && !defined(__STRICT_ANSI__))
434#elif !defined(__bool_true_false_are_defined)
435# define __bool_true_false_are_defined 1
436# if defined(__cplusplus)
437# if defined(__GNUC__) && !defined(__STRICT_ANSI__)
439# if __cplusplus < 201103L
446# define bool unsigned char
455# error non 8-bit char is not supported
463#ifndef CTOON_U64_TO_F64_NO_IMPL
464# if (0 < CTOON_MSC_VER) && (CTOON_MSC_VER <= 1200)
465# define CTOON_U64_TO_F64_NO_IMPL 1
467# define CTOON_U64_TO_F64_NO_IMPL 0
487#define CTOON_VERSION_MAJOR 0
490#define CTOON_VERSION_MINOR 6
493#define CTOON_VERSION_PATCH 1
495#define CTOON_VERSION_ENCODE(maj,min,pat) (((maj)*10000)+((min)*100)+(pat))
496#define CTOON_VERSION \
497 CTOON_VERSION_ENCODE(CTOON_VERSION_MAJOR,CTOON_VERSION_MINOR,CTOON_VERSION_PATCH)
500#define CTOON_VERSION_HEX \
501 ((CTOON_VERSION_MAJOR << 16) | (CTOON_VERSION_MINOR << 8) | CTOON_VERSION_PATCH)
504#define _CTOON_VERSION_XSTR(a,b,c) #a"."#b"."#c
505#define _CTOON_VERSION_STR(a,b,c) _CTOON_VERSION_XSTR(a,b,c)
508#define CTOON_VERSION_STRING \
509 _CTOON_VERSION_STR(CTOON_VERSION_MAJOR,CTOON_VERSION_MINOR,CTOON_VERSION_PATCH)
523#define CTOON_TYPE_NONE ((uint8_t)0)
525#define CTOON_TYPE_RAW ((uint8_t)1)
527#define CTOON_TYPE_NULL ((uint8_t)2)
529#define CTOON_TYPE_BOOL ((uint8_t)3)
531#define CTOON_TYPE_NUM ((uint8_t)4)
533#define CTOON_TYPE_STR ((uint8_t)5)
535#define CTOON_TYPE_ARR ((uint8_t)6)
537#define CTOON_TYPE_OBJ ((uint8_t)7)
542#define CTOON_SUBTYPE_NONE ((uint8_t)(0 << 3))
544#define CTOON_SUBTYPE_FALSE ((uint8_t)(0 << 3))
546#define CTOON_SUBTYPE_TRUE ((uint8_t)(1 << 3))
548#define CTOON_SUBTYPE_UINT ((uint8_t)(0 << 3))
550#define CTOON_SUBTYPE_SINT ((uint8_t)(1 << 3))
552#define CTOON_SUBTYPE_REAL ((uint8_t)(2 << 3))
554#define CTOON_SUBTYPE_NOESC ((uint8_t)(1 << 3))
557#define CTOON_TYPE_MASK ((uint8_t)0x07)
559#define CTOON_TYPE_BIT ((uint8_t)3)
561#define CTOON_SUBTYPE_MASK ((uint8_t)0x18)
563#define CTOON_SUBTYPE_BIT ((uint8_t)2)
565#define CTOON_RESERVED_MASK ((uint8_t)0xE0)
567#define CTOON_RESERVED_BIT ((uint8_t)3)
569#define CTOON_TAG_MASK ((uint8_t)0xFF)
571#define CTOON_TAG_BIT ((uint8_t)8)
574#define CTOON_PADDING_SIZE 4
590 void *(*malloc)(
void *
ctx,
size_t size);
592 void *(*realloc)(
void *
ctx,
void *ptr,
size_t old_size,
size_t size);
682 size_t *line,
size_t *col,
size_t *chr);
895#if !defined(CTOON_DISABLE_READER) || !CTOON_DISABLE_READER
1026 flg &= ~CTOON_READ_INSITU;
1028 len, flg, NULL, NULL);
1033#if !defined(CTOON_DISABLE_INCR_READER) || !CTOON_DISABLE_INCR_READER
1144 size_t max = (size_t)(~(
size_t)0);
1146 if (len >= (max - pad - mul) / mul)
return 0;
1147 return len * mul + pad;
1225#define CTOON_WRITE_FP_FLAG_BITS 8
1226#define CTOON_WRITE_FP_PREC_BITS 4
1229#define CTOON_WRITE_FP_TO_FIXED(prec) ((ctoon_write_flag)( \
1230 (uint32_t)((uint32_t)(prec)) << (32 - 4) ))
1233#define CTOON_WRITE_FP_TO_FLOAT ((ctoon_write_flag)(1 << (32 - 5)))
1268#if !defined(CTOON_DISABLE_WRITER) || !CTOON_DISABLE_WRITER
1412#if defined(CTOON_ENABLE_JSON) && CTOON_ENABLE_JSON
1644 const char *raw,
size_t len);
1707 const char *str,
size_t len);
1817#define ctoon_arr_foreach(arr, idx, max, val) \
1819 (max) = ctoon_arr_size(arr), \
1820 (val) = ctoon_arr_get_first(arr); \
1823 (val) = unsafe_ctoon_get_next(val))
1988#define ctoon_obj_foreach(obj, idx, max, key, val) \
1990 (max) = ctoon_obj_size(obj), \
1991 (key) = (obj) ? unsafe_ctoon_get_first(obj) : NULL, \
1992 (val) = (key) + 1; \
1995 (key) = unsafe_ctoon_get_next(val), \
2233 const char *str,
size_t len);
2247 const char *raw,
size_t len);
2312 const char *str,
size_t len);
2552#define ctoon_mut_arr_foreach(arr, idx, max, val) \
2554 (max) = ctoon_mut_arr_size(arr), \
2555 (val) = ctoon_mut_arr_get_first(arr); \
2558 (val) = (val)->next)
2875 ctoon_mut_doc *doc,
const char **vals,
const size_t *lens,
size_t count);
2919 ctoon_mut_doc *doc,
const char **vals,
const size_t *lens,
size_t count);
3014 size_t idx,
size_t len);
3424#define ctoon_mut_obj_foreach(obj, idx, max, key, val) \
3426 (max) = ctoon_mut_obj_size(obj), \
3427 (key) = (max) ? ((ctoon_mut_val *)(obj)->uni.ptr)->next->next : NULL, \
3428 (val) = (key) ? (key)->next : NULL; \
3431 (key) = (val)->next, \
3432 (val) = (key)->next)
3478 const char **kv_pairs,
3635 const char *key,
bool val);
3645 const char *key, uint64_t val);
3655 const char *key, int64_t val);
3665 const char *key, int64_t val);
3675 const char *key,
float val);
3685 const char *key,
double val);
3695 const char *key,
double val);
3705 const char *key,
const char *val);
3718 const char *val,
size_t len);
3743 const char *val,
size_t len);
3812 const char *new_key);
3826 const char *new_key,
3831#if !defined(CTOON_DISABLE_UTILS) || !CTOON_DISABLE_UTILS
3935 const char *ptr,
size_t len);
3947 const char *ptr,
size_t len,
3969 const char *ptr,
size_t len);
3981 const char *ptr,
size_t len,
4082 const char *ptr,
size_t len,
4097 const char *ptr,
size_t len,
4128 const char *ptr,
size_t len,
4145 const char *ptr,
size_t len,
4176 const char *ptr,
size_t len,
4192 const char *ptr,
size_t len,
4225 const char *ptr,
size_t len,
4243 const char *ptr,
size_t len,
4576#if CTOON_HAS_CONSTANT_P && \
4577 (!CTOON_IS_REAL_GCC || ctoon_gcc_available(4, 4, 0))
4591# define ctoon_repeat32_incr(x) \
4592 x(0) x(1) x(2) x(3) x(4) x(5) x(6) x(7) \
4593 x(8) x(9) x(10) x(11) x(12) x(13) x(14) x(15) \
4594 x(16) x(17) x(18) x(19) x(20) x(21) x(22) x(23) \
4595 x(24) x(25) x(26) x(27) x(28) x(29) x(30) x(31)
4596# define ctoon_check_char_noesc(i) \
4599 if (c < ' ' || c > '~' || c == '"' || c == '\\') return false; }
4600 ctoon_repeat32_incr(ctoon_check_char_noesc)
4601# undef ctoon_repeat32_incr
4602# undef ctoon_check_char_noesc
4612ctoon_api_inline double unsafe_ctoon_u64_to_f64(uint64_t num) {
4613#if CTOON_U64_TO_F64_NO_IMPL
4614 uint64_t msb = ((uint64_t)1) << 63;
4615 if ((num & msb) == 0) {
4616 return (double)(int64_t)num;
4618 return ((double)(int64_t)((num >> 1) | (num & 1))) * (double)2.0;
4625ctoon_api_inline ctoon_type unsafe_ctoon_get_type(void *val) {
4626 uint8_t tag = (uint8_t)((ctoon_val *)val)->tag;
4627 return (ctoon_type)(tag & CTOON_TYPE_MASK);
4630ctoon_api_inline ctoon_subtype unsafe_ctoon_get_subtype(void *val) {
4631 uint8_t tag = (uint8_t)((ctoon_val *)val)->tag;
4632 return (ctoon_subtype)(tag & CTOON_SUBTYPE_MASK);
4635ctoon_api_inline uint8_t unsafe_ctoon_get_tag(void *val) {
4636 uint8_t tag = (uint8_t)((ctoon_val *)val)->tag;
4637 return (uint8_t)(tag & CTOON_TAG_MASK);
4640ctoon_api_inline bool unsafe_ctoon_is_raw(void *val) {
4641 return unsafe_ctoon_get_type(val) == CTOON_TYPE_RAW;
4644ctoon_api_inline bool unsafe_ctoon_is_null(void *val) {
4645 return unsafe_ctoon_get_type(val) == CTOON_TYPE_NULL;
4648ctoon_api_inline bool unsafe_ctoon_is_bool(void *val) {
4649 return unsafe_ctoon_get_type(val) == CTOON_TYPE_BOOL;
4652ctoon_api_inline bool unsafe_ctoon_is_num(void *val) {
4653 return unsafe_ctoon_get_type(val) == CTOON_TYPE_NUM;
4656ctoon_api_inline bool unsafe_ctoon_is_str(void *val) {
4657 return unsafe_ctoon_get_type(val) == CTOON_TYPE_STR;
4660ctoon_api_inline bool unsafe_ctoon_is_arr(void *val) {
4661 return unsafe_ctoon_get_type(val) == CTOON_TYPE_ARR;
4664ctoon_api_inline bool unsafe_ctoon_is_obj(void *val) {
4665 return unsafe_ctoon_get_type(val) == CTOON_TYPE_OBJ;
4668ctoon_api_inline bool unsafe_ctoon_is_ctn(void *val) {
4669 uint8_t mask = CTOON_TYPE_ARR & CTOON_TYPE_OBJ;
4670 return (unsafe_ctoon_get_tag(val) & mask) == mask;
4673ctoon_api_inline bool unsafe_ctoon_is_uint(void *val) {
4674 const uint8_t patt = CTOON_TYPE_NUM | CTOON_SUBTYPE_UINT;
4675 return unsafe_ctoon_get_tag(val) == patt;
4678ctoon_api_inline bool unsafe_ctoon_is_sint(void *val) {
4679 const uint8_t patt = CTOON_TYPE_NUM | CTOON_SUBTYPE_SINT;
4680 return unsafe_ctoon_get_tag(val) == patt;
4683ctoon_api_inline bool unsafe_ctoon_is_int(void *val) {
4684 const uint8_t mask = CTOON_TAG_MASK & (~CTOON_SUBTYPE_SINT);
4685 const uint8_t patt = CTOON_TYPE_NUM | CTOON_SUBTYPE_UINT;
4686 return (unsafe_ctoon_get_tag(val) & mask) == patt;
4689ctoon_api_inline bool unsafe_ctoon_is_real(void *val) {
4690 const uint8_t patt = CTOON_TYPE_NUM | CTOON_SUBTYPE_REAL;
4691 return unsafe_ctoon_get_tag(val) == patt;
4694ctoon_api_inline bool unsafe_ctoon_is_true(void *val) {
4695 const uint8_t patt = CTOON_TYPE_BOOL | CTOON_SUBTYPE_TRUE;
4696 return unsafe_ctoon_get_tag(val) == patt;
4699ctoon_api_inline bool unsafe_ctoon_is_false(void *val) {
4700 const uint8_t patt = CTOON_TYPE_BOOL | CTOON_SUBTYPE_FALSE;
4701 return unsafe_ctoon_get_tag(val) == patt;
4704ctoon_api_inline bool unsafe_ctoon_arr_is_flat(ctoon_val *val) {
4705 size_t ofs = val->uni.ofs;
4706 size_t len = (size_t)(val->tag >> CTOON_TAG_BIT);
4707 return len * sizeof(ctoon_val) + sizeof(ctoon_val) == ofs;
4710ctoon_api_inline const char *unsafe_ctoon_get_raw(void *val) {
4711 return ((ctoon_val *)val)->uni.str;
4714ctoon_api_inline bool unsafe_ctoon_get_bool(void *val) {
4715 uint8_t tag = unsafe_ctoon_get_tag(val);
4716 return (bool)((tag & CTOON_SUBTYPE_MASK) >> CTOON_TYPE_BIT);
4719ctoon_api_inline uint64_t unsafe_ctoon_get_uint(void *val) {
4720 return ((ctoon_val *)val)->uni.u64;
4723ctoon_api_inline int64_t unsafe_ctoon_get_sint(void *val) {
4724 return ((ctoon_val *)val)->uni.i64;
4727ctoon_api_inline int unsafe_ctoon_get_int(void *val) {
4728 return (int)((ctoon_val *)val)->uni.i64;
4731ctoon_api_inline double unsafe_ctoon_get_real(void *val) {
4732 return ((ctoon_val *)val)->uni.f64;
4735ctoon_api_inline double unsafe_ctoon_get_num(void *val) {
4736 uint8_t tag = unsafe_ctoon_get_tag(val);
4737 if (tag == (CTOON_TYPE_NUM | CTOON_SUBTYPE_REAL)) {
4738 return ((ctoon_val *)val)->uni.f64;
4739 } else if (tag == (CTOON_TYPE_NUM | CTOON_SUBTYPE_SINT)) {
4740 return (double)((ctoon_val *)val)->uni.i64;
4741 } else if (tag == (CTOON_TYPE_NUM | CTOON_SUBTYPE_UINT)) {
4742 return unsafe_ctoon_u64_to_f64(((ctoon_val *)val)->uni.u64);
4747ctoon_api_inline const char *unsafe_ctoon_get_str(void *val) {
4748 return ((ctoon_val *)val)->uni.str;
4751ctoon_api_inline size_t unsafe_ctoon_get_len(void *val) {
4752 return (size_t)(((ctoon_val *)val)->tag >> CTOON_TAG_BIT);
4755ctoon_api_inline ctoon_val *unsafe_ctoon_get_first(ctoon_val *ctn) {
4759ctoon_api_inline ctoon_val *unsafe_ctoon_get_next(ctoon_val *val) {
4760 bool is_ctn = unsafe_ctoon_is_ctn(val);
4761 size_t ctn_ofs = val->uni.ofs;
4762 size_t ofs = (is_ctn ? ctn_ofs : sizeof(ctoon_val));
4763 return (ctoon_val *)(void *)((uint8_t *)val + ofs);
4766ctoon_api_inline bool unsafe_ctoon_equals_strn(void *val, const char *str,
4768 return unsafe_ctoon_get_len(val) == len &&
4769 memcmp(((ctoon_val *)val)->uni.str, str, len) == 0;
4772ctoon_api_inline bool unsafe_ctoon_equals_str(void *val, const char *str) {
4773 return unsafe_ctoon_equals_strn(val, str, strlen(str));
4776ctoon_api_inline void unsafe_ctoon_set_type(void *val, ctoon_type type,
4777 ctoon_subtype subtype) {
4778 uint8_t tag = (type | subtype);
4779 uint64_t new_tag = ((ctoon_val *)val)->tag;
4780 new_tag = (new_tag & (~(uint64_t)CTOON_TAG_MASK)) | (uint64_t)tag;
4781 ((ctoon_val *)val)->tag = new_tag;
4784ctoon_api_inline void unsafe_ctoon_set_len(void *val, size_t len) {
4785 uint64_t tag = ((ctoon_val *)val)->tag & CTOON_TAG_MASK;
4786 tag |= (uint64_t)len << CTOON_TAG_BIT;
4787 ((ctoon_val *)val)->tag = tag;
4790ctoon_api_inline void unsafe_ctoon_set_tag(void *val, ctoon_type type,
4791 ctoon_subtype subtype,
4793 uint64_t tag = (uint64_t)len << CTOON_TAG_BIT;
4794 tag |= (type | subtype);
4795 ((ctoon_val *)val)->tag = tag;
4798ctoon_api_inline void unsafe_ctoon_inc_len(void *val) {
4799 uint64_t tag = ((ctoon_val *)val)->tag;
4800 tag += (uint64_t)(1 << CTOON_TAG_BIT);
4801 ((ctoon_val *)val)->tag = tag;
4804ctoon_api_inline void unsafe_ctoon_set_raw(void *val, const char *raw,
4806 unsafe_ctoon_set_tag(val, CTOON_TYPE_RAW, CTOON_SUBTYPE_NONE, len);
4807 ((ctoon_val *)val)->uni.str = raw;
4810ctoon_api_inline void unsafe_ctoon_set_null(void *val) {
4811 unsafe_ctoon_set_tag(val, CTOON_TYPE_NULL, CTOON_SUBTYPE_NONE, 0);
4814ctoon_api_inline void unsafe_ctoon_set_bool(void *val, bool num) {
4815 ctoon_subtype subtype = num ? CTOON_SUBTYPE_TRUE : CTOON_SUBTYPE_FALSE;
4816 unsafe_ctoon_set_tag(val, CTOON_TYPE_BOOL, subtype, 0);
4819ctoon_api_inline void unsafe_ctoon_set_uint(void *val, uint64_t num) {
4820 unsafe_ctoon_set_tag(val, CTOON_TYPE_NUM, CTOON_SUBTYPE_UINT, 0);
4821 ((ctoon_val *)val)->uni.u64 = num;
4824ctoon_api_inline void unsafe_ctoon_set_sint(void *val, int64_t num) {
4825 unsafe_ctoon_set_tag(val, CTOON_TYPE_NUM, CTOON_SUBTYPE_SINT, 0);
4826 ((ctoon_val *)val)->uni.i64 = num;
4829ctoon_api_inline void unsafe_ctoon_set_fp_to_fixed(void *val, int prec) {
4830 ((ctoon_val *)val)->tag &= ~((uint64_t)CTOON_WRITE_FP_TO_FIXED(15) << 32);
4831 ((ctoon_val *)val)->tag |= (uint64_t)CTOON_WRITE_FP_TO_FIXED(prec) << 32;
4834ctoon_api_inline void unsafe_ctoon_set_fp_to_float(void *val, bool flt) {
4835 uint64_t flag = (uint64_t)CTOON_WRITE_FP_TO_FLOAT << 32;
4836 if (flt) ((ctoon_val *)val)->tag |= flag;
4837 else ((ctoon_val *)val)->tag &= ~flag;
4840ctoon_api_inline void unsafe_ctoon_set_float(void *val, float num) {
4841 unsafe_ctoon_set_tag(val, CTOON_TYPE_NUM, CTOON_SUBTYPE_REAL, 0);
4842 ((ctoon_val *)val)->tag |= (uint64_t)CTOON_WRITE_FP_TO_FLOAT << 32;
4843 ((ctoon_val *)val)->uni.f64 = (double)num;
4846ctoon_api_inline void unsafe_ctoon_set_double(void *val, double num) {
4847 unsafe_ctoon_set_tag(val, CTOON_TYPE_NUM, CTOON_SUBTYPE_REAL, 0);
4848 ((ctoon_val *)val)->uni.f64 = num;
4851ctoon_api_inline void unsafe_ctoon_set_real(void *val, double num) {
4852 unsafe_ctoon_set_tag(val, CTOON_TYPE_NUM, CTOON_SUBTYPE_REAL, 0);
4853 ((ctoon_val *)val)->uni.f64 = num;
4856ctoon_api_inline void unsafe_ctoon_set_str_noesc(void *val, bool noesc) {
4857 ((ctoon_val *)val)->tag &= ~(uint64_t)CTOON_SUBTYPE_MASK;
4858 if (noesc) ((ctoon_val *)val)->tag |= (uint64_t)CTOON_SUBTYPE_NOESC;
4861ctoon_api_inline void unsafe_ctoon_set_strn(void *val, const char *str,
4863 unsafe_ctoon_set_tag(val, CTOON_TYPE_STR, CTOON_SUBTYPE_NONE, len);
4864 ((ctoon_val *)val)->uni.str = str;
4867ctoon_api_inline void unsafe_ctoon_set_str(void *val, const char *str) {
4868 size_t len = strlen(str);
4869 bool noesc = unsafe_ctoon_is_str_noesc(str, len);
4870 ctoon_subtype subtype = noesc ? CTOON_SUBTYPE_NOESC : CTOON_SUBTYPE_NONE;
4871 unsafe_ctoon_set_tag(val, CTOON_TYPE_STR, subtype, len);
4872 ((ctoon_val *)val)->uni.str = str;
4875ctoon_api_inline void unsafe_ctoon_set_arr(void *val, size_t size) {
4876 unsafe_ctoon_set_tag(val, CTOON_TYPE_ARR, CTOON_SUBTYPE_NONE, size);
4879ctoon_api_inline void unsafe_ctoon_set_obj(void *val, size_t size) {
4880 unsafe_ctoon_set_tag(val, CTOON_TYPE_OBJ, CTOON_SUBTYPE_NONE, size);
4885/*==============================================================================
4886 * MARK: - TOON Document API (Implementation)
4887 *============================================================================*/
4889ctoon_api_inline ctoon_val *ctoon_doc_get_root(ctoon_doc *doc) {
4890 return doc ? doc->root : NULL;
4893ctoon_api_inline size_t ctoon_doc_get_read_size(ctoon_doc *doc) {
4894 return doc ? doc->dat_read : 0;
4897ctoon_api_inline size_t ctoon_doc_get_val_count(ctoon_doc *doc) {
4898 return doc ? doc->val_read : 0;
4901ctoon_api_inline void ctoon_doc_free(ctoon_doc *doc) {
4903 ctoon_alc alc = doc->alc;
4904 memset(&doc->alc, 0, sizeof(alc));
4905 if (doc->str_pool) alc.free(alc.ctx, doc->str_pool);
4906 alc.free(alc.ctx, doc);
4912/*==============================================================================
4913 * MARK: - TOON Value Type API (Implementation)
4914 *============================================================================*/
4916ctoon_api_inline bool ctoon_is_raw(ctoon_val *val) {
4917 return val ? unsafe_ctoon_is_raw(val) : false;
4920ctoon_api_inline bool ctoon_is_null(ctoon_val *val) {
4921 return val ? unsafe_ctoon_is_null(val) : false;
4924ctoon_api_inline bool ctoon_is_true(ctoon_val *val) {
4925 return val ? unsafe_ctoon_is_true(val) : false;
4928ctoon_api_inline bool ctoon_is_false(ctoon_val *val) {
4929 return val ? unsafe_ctoon_is_false(val) : false;
4932ctoon_api_inline bool ctoon_is_bool(ctoon_val *val) {
4933 return val ? unsafe_ctoon_is_bool(val) : false;
4936ctoon_api_inline bool ctoon_is_uint(ctoon_val *val) {
4937 return val ? unsafe_ctoon_is_uint(val) : false;
4940ctoon_api_inline bool ctoon_is_sint(ctoon_val *val) {
4941 return val ? unsafe_ctoon_is_sint(val) : false;
4944ctoon_api_inline bool ctoon_is_int(ctoon_val *val) {
4945 return val ? unsafe_ctoon_is_int(val) : false;
4948ctoon_api_inline bool ctoon_is_real(ctoon_val *val) {
4949 return val ? unsafe_ctoon_is_real(val) : false;
4952ctoon_api_inline bool ctoon_is_num(ctoon_val *val) {
4953 return val ? unsafe_ctoon_is_num(val) : false;
4956ctoon_api_inline bool ctoon_is_str(ctoon_val *val) {
4957 return val ? unsafe_ctoon_is_str(val) : false;
4960ctoon_api_inline bool ctoon_is_arr(ctoon_val *val) {
4961 return val ? unsafe_ctoon_is_arr(val) : false;
4964ctoon_api_inline bool ctoon_is_obj(ctoon_val *val) {
4965 return val ? unsafe_ctoon_is_obj(val) : false;
4968ctoon_api_inline bool ctoon_is_ctn(ctoon_val *val) {
4969 return val ? unsafe_ctoon_is_ctn(val) : false;
4974/*==============================================================================
4975 * MARK: - TOON Value Content API (Implementation)
4976 *============================================================================*/
4978ctoon_api_inline ctoon_type ctoon_get_type(ctoon_val *val) {
4979 return val ? unsafe_ctoon_get_type(val) : CTOON_TYPE_NONE;
4982ctoon_api_inline ctoon_subtype ctoon_get_subtype(ctoon_val *val) {
4983 return val ? unsafe_ctoon_get_subtype(val) : CTOON_SUBTYPE_NONE;
4986ctoon_api_inline uint8_t ctoon_get_tag(ctoon_val *val) {
4987 return val ? unsafe_ctoon_get_tag(val) : 0;
4990ctoon_api_inline const char *ctoon_get_type_desc(ctoon_val *val) {
4991 switch (ctoon_get_tag(val)) {
4992 case CTOON_TYPE_RAW | CTOON_SUBTYPE_NONE: return "raw";
4993 case CTOON_TYPE_NULL | CTOON_SUBTYPE_NONE: return "null";
4994 case CTOON_TYPE_STR | CTOON_SUBTYPE_NONE: return "string";
4995 case CTOON_TYPE_STR | CTOON_SUBTYPE_NOESC: return "string";
4996 case CTOON_TYPE_ARR | CTOON_SUBTYPE_NONE: return "array";
4997 case CTOON_TYPE_OBJ | CTOON_SUBTYPE_NONE: return "object";
4998 case CTOON_TYPE_BOOL | CTOON_SUBTYPE_TRUE: return "true";
4999 case CTOON_TYPE_BOOL | CTOON_SUBTYPE_FALSE: return "false";
5000 case CTOON_TYPE_NUM | CTOON_SUBTYPE_UINT: return "uint";
5001 case CTOON_TYPE_NUM | CTOON_SUBTYPE_SINT: return "sint";
5002 case CTOON_TYPE_NUM | CTOON_SUBTYPE_REAL: return "real";
5003 default: return "unknown";
5007ctoon_api_inline const char *ctoon_get_raw(ctoon_val *val) {
5008 return ctoon_is_raw(val) ? unsafe_ctoon_get_raw(val) : NULL;
5011ctoon_api_inline bool ctoon_get_bool(ctoon_val *val) {
5012 return ctoon_is_bool(val) ? unsafe_ctoon_get_bool(val) : false;
5015ctoon_api_inline uint64_t ctoon_get_uint(ctoon_val *val) {
5016 return ctoon_is_int(val) ? unsafe_ctoon_get_uint(val) : 0;
5019ctoon_api_inline int64_t ctoon_get_sint(ctoon_val *val) {
5020 return ctoon_is_int(val) ? unsafe_ctoon_get_sint(val) : 0;
5023ctoon_api_inline int ctoon_get_int(ctoon_val *val) {
5024 return ctoon_is_int(val) ? unsafe_ctoon_get_int(val) : 0;
5027ctoon_api_inline double ctoon_get_real(ctoon_val *val) {
5028 return ctoon_is_real(val) ? unsafe_ctoon_get_real(val) : 0.0;
5031ctoon_api_inline double ctoon_get_num(ctoon_val *val) {
5032 return val ? unsafe_ctoon_get_num(val) : 0.0;
5035ctoon_api_inline const char *ctoon_get_str(ctoon_val *val) {
5036 return ctoon_is_str(val) ? unsafe_ctoon_get_str(val) : NULL;
5039ctoon_api_inline size_t ctoon_get_len(ctoon_val *val) {
5040 return val ? unsafe_ctoon_get_len(val) : 0;
5043ctoon_api_inline bool ctoon_equals_str(ctoon_val *val, const char *str) {
5044 if (ctoon_likely(val && str)) {
5045 return unsafe_ctoon_is_str(val) &&
5046 unsafe_ctoon_equals_str(val, str);
5051ctoon_api_inline bool ctoon_equals_strn(ctoon_val *val, const char *str,
5053 if (ctoon_likely(val && str)) {
5054 return unsafe_ctoon_is_str(val) &&
5055 unsafe_ctoon_equals_strn(val, str, len);
5060ctoon_api bool unsafe_ctoon_equals(ctoon_val *lhs, ctoon_val *rhs);
5062ctoon_api_inline bool ctoon_equals(ctoon_val *lhs, ctoon_val *rhs) {
5063 if (ctoon_unlikely(!lhs || !rhs)) return false;
5064 return unsafe_ctoon_equals(lhs, rhs);
5067ctoon_api_inline bool ctoon_set_raw(ctoon_val *val,
5068 const char *raw, size_t len) {
5069 if (ctoon_unlikely(!val || unsafe_ctoon_is_ctn(val))) return false;
5070 unsafe_ctoon_set_raw(val, raw, len);
5074ctoon_api_inline bool ctoon_set_null(ctoon_val *val) {
5075 if (ctoon_unlikely(!val || unsafe_ctoon_is_ctn(val))) return false;
5076 unsafe_ctoon_set_null(val);
5080ctoon_api_inline bool ctoon_set_bool(ctoon_val *val, bool num) {
5081 if (ctoon_unlikely(!val || unsafe_ctoon_is_ctn(val))) return false;
5082 unsafe_ctoon_set_bool(val, num);
5086ctoon_api_inline bool ctoon_set_uint(ctoon_val *val, uint64_t num) {
5087 if (ctoon_unlikely(!val || unsafe_ctoon_is_ctn(val))) return false;
5088 unsafe_ctoon_set_uint(val, num);
5092ctoon_api_inline bool ctoon_set_sint(ctoon_val *val, int64_t num) {
5093 if (ctoon_unlikely(!val || unsafe_ctoon_is_ctn(val))) return false;
5094 unsafe_ctoon_set_sint(val, num);
5098ctoon_api_inline bool ctoon_set_int(ctoon_val *val, int num) {
5099 if (ctoon_unlikely(!val || unsafe_ctoon_is_ctn(val))) return false;
5100 unsafe_ctoon_set_sint(val, (int64_t)num);
5104ctoon_api_inline bool ctoon_set_float(ctoon_val *val, float num) {
5105 if (ctoon_unlikely(!val || unsafe_ctoon_is_ctn(val))) return false;
5106 unsafe_ctoon_set_float(val, num);
5110ctoon_api_inline bool ctoon_set_double(ctoon_val *val, double num) {
5111 if (ctoon_unlikely(!val || unsafe_ctoon_is_ctn(val))) return false;
5112 unsafe_ctoon_set_double(val, num);
5116ctoon_api_inline bool ctoon_set_real(ctoon_val *val, double num) {
5117 if (ctoon_unlikely(!val || unsafe_ctoon_is_ctn(val))) return false;
5118 unsafe_ctoon_set_real(val, num);
5122ctoon_api_inline bool ctoon_set_fp_to_fixed(ctoon_val *val, int prec) {
5123 if (ctoon_unlikely(!ctoon_is_real(val))) return false;
5124 unsafe_ctoon_set_fp_to_fixed(val, prec);
5128ctoon_api_inline bool ctoon_set_fp_to_float(ctoon_val *val, bool flt) {
5129 if (ctoon_unlikely(!ctoon_is_real(val))) return false;
5130 unsafe_ctoon_set_fp_to_float(val, flt);
5134ctoon_api_inline bool ctoon_set_str(ctoon_val *val, const char *str) {
5135 if (ctoon_unlikely(!val || unsafe_ctoon_is_ctn(val))) return false;
5136 if (ctoon_unlikely(!str)) return false;
5137 unsafe_ctoon_set_str(val, str);
5141ctoon_api_inline bool ctoon_set_strn(ctoon_val *val,
5142 const char *str, size_t len) {
5143 if (ctoon_unlikely(!val || unsafe_ctoon_is_ctn(val))) return false;
5144 if (ctoon_unlikely(!str)) return false;
5145 unsafe_ctoon_set_strn(val, str, len);
5149ctoon_api_inline bool ctoon_set_str_noesc(ctoon_val *val, bool noesc) {
5150 if (ctoon_unlikely(!ctoon_is_str(val))) return false;
5151 unsafe_ctoon_set_str_noesc(val, noesc);
5157/*==============================================================================
5158 * MARK: - TOON Array API (Implementation)
5159 *============================================================================*/
5161ctoon_api_inline size_t ctoon_arr_size(ctoon_val *arr) {
5162 return ctoon_is_arr(arr) ? unsafe_ctoon_get_len(arr) : 0;
5165ctoon_api_inline ctoon_val *ctoon_arr_get(ctoon_val *arr, size_t idx) {
5166 if (ctoon_likely(ctoon_is_arr(arr))) {
5167 if (ctoon_likely(unsafe_ctoon_get_len(arr) > idx)) {
5168 ctoon_val *val = unsafe_ctoon_get_first(arr);
5169 if (unsafe_ctoon_arr_is_flat(arr)) {
5172 while (idx-- > 0) val = unsafe_ctoon_get_next(val);
5180ctoon_api_inline ctoon_val *ctoon_arr_get_first(ctoon_val *arr) {
5181 if (ctoon_likely(ctoon_is_arr(arr))) {
5182 if (ctoon_likely(unsafe_ctoon_get_len(arr) > 0)) {
5183 return unsafe_ctoon_get_first(arr);
5189ctoon_api_inline ctoon_val *ctoon_arr_get_last(ctoon_val *arr) {
5190 if (ctoon_likely(ctoon_is_arr(arr))) {
5191 size_t len = unsafe_ctoon_get_len(arr);
5192 if (ctoon_likely(len > 0)) {
5193 ctoon_val *val = unsafe_ctoon_get_first(arr);
5194 if (unsafe_ctoon_arr_is_flat(arr)) {
5195 return val + (len - 1);
5197 while (len-- > 1) val = unsafe_ctoon_get_next(val);
5207/*==============================================================================
5208 * MARK: - TOON Array Iterator API (Implementation)
5209 *============================================================================*/
5211ctoon_api_inline bool ctoon_arr_iter_init(ctoon_val *arr,
5212 ctoon_arr_iter *iter) {
5213 if (ctoon_likely(ctoon_is_arr(arr) && iter)) {
5215 iter->max = unsafe_ctoon_get_len(arr);
5216 iter->cur = unsafe_ctoon_get_first(arr);
5219 if (iter) memset(iter, 0, sizeof(ctoon_arr_iter));
5223ctoon_api_inline ctoon_arr_iter ctoon_arr_iter_with(ctoon_val *arr) {
5224 ctoon_arr_iter iter;
5225 ctoon_arr_iter_init(arr, &iter);
5229ctoon_api_inline bool ctoon_arr_iter_has_next(ctoon_arr_iter *iter) {
5230 return iter ? iter->idx < iter->max : false;
5233ctoon_api_inline ctoon_val *ctoon_arr_iter_next(ctoon_arr_iter *iter) {
5235 if (iter && iter->idx < iter->max) {
5237 iter->cur = unsafe_ctoon_get_next(val);
5246/*==============================================================================
5247 * MARK: - TOON Object API (Implementation)
5248 *============================================================================*/
5250ctoon_api_inline size_t ctoon_obj_size(ctoon_val *obj) {
5251 return ctoon_is_obj(obj) ? unsafe_ctoon_get_len(obj) : 0;
5254ctoon_api_inline ctoon_val *ctoon_obj_get(ctoon_val *obj,
5256 return ctoon_obj_getn(obj, key, key ? strlen(key) : 0);
5259ctoon_api_inline ctoon_val *ctoon_obj_getn(ctoon_val *obj,
5262 if (ctoon_likely(ctoon_is_obj(obj) && _key)) {
5263 size_t len = unsafe_ctoon_get_len(obj);
5264 ctoon_val *key = unsafe_ctoon_get_first(obj);
5266 if (unsafe_ctoon_equals_strn(key, _key, key_len)) return key + 1;
5267 key = unsafe_ctoon_get_next(key + 1);
5275/*==============================================================================
5276 * MARK: - TOON Object Iterator API (Implementation)
5277 *============================================================================*/
5279ctoon_api_inline bool ctoon_obj_iter_init(ctoon_val *obj,
5280 ctoon_obj_iter *iter) {
5281 if (ctoon_likely(ctoon_is_obj(obj) && iter)) {
5283 iter->max = unsafe_ctoon_get_len(obj);
5284 iter->cur = unsafe_ctoon_get_first(obj);
5288 if (iter) memset(iter, 0, sizeof(ctoon_obj_iter));
5292ctoon_api_inline ctoon_obj_iter ctoon_obj_iter_with(ctoon_val *obj) {
5293 ctoon_obj_iter iter;
5294 ctoon_obj_iter_init(obj, &iter);
5298ctoon_api_inline bool ctoon_obj_iter_has_next(ctoon_obj_iter *iter) {
5299 return iter ? iter->idx < iter->max : false;
5302ctoon_api_inline ctoon_val *ctoon_obj_iter_next(ctoon_obj_iter *iter) {
5303 if (iter && iter->idx < iter->max) {
5304 ctoon_val *key = iter->cur;
5306 iter->cur = unsafe_ctoon_get_next(key + 1);
5312ctoon_api_inline ctoon_val *ctoon_obj_iter_get_val(ctoon_val *key) {
5313 return key ? key + 1 : NULL;
5316ctoon_api_inline ctoon_val *ctoon_obj_iter_get(ctoon_obj_iter *iter,
5318 return ctoon_obj_iter_getn(iter, key, key ? strlen(key) : 0);
5321ctoon_api_inline ctoon_val *ctoon_obj_iter_getn(ctoon_obj_iter *iter,
5325 size_t idx = iter->idx;
5326 size_t max = iter->max;
5327 ctoon_val *cur = iter->cur;
5328 if (ctoon_unlikely(idx == max)) {
5330 cur = unsafe_ctoon_get_first(iter->obj);
5332 while (idx++ < max) {
5333 ctoon_val *next = unsafe_ctoon_get_next(cur + 1);
5334 if (unsafe_ctoon_equals_strn(cur, key, key_len)) {
5340 if (idx == iter->max && iter->idx < iter->max) {
5343 cur = unsafe_ctoon_get_first(iter->obj);
5352/*==============================================================================
5353 * MARK: - Mutable TOON Structure (Implementation)
5354 *============================================================================*/
5361struct ctoon_mut_val {
5362 uint64_t tag; /**< type, subtype and length */
5363 ctoon_val_uni uni; /**< payload */
5364 ctoon_mut_val *next; /**< the next value in circular linked list */
5370typedef struct ctoon_str_chunk {
5371 struct ctoon_str_chunk *next; /* next chunk linked list */
5372 size_t chunk_size; /* chunk size in bytes */
5373 /* char str[]; flexible array member */
5379typedef struct ctoon_str_pool {
5380 char *cur; /* cursor inside current chunk */
5381 char *end; /* the end of current chunk */
5382 size_t chunk_size; /* chunk size in bytes while creating new chunk */
5383 size_t chunk_size_max; /* maximum chunk size in bytes */
5384 ctoon_str_chunk *chunks; /* a linked list of chunks, nullable */
5391typedef struct ctoon_val_chunk {
5392 struct ctoon_val_chunk *next; /* next chunk linked list */
5393 size_t chunk_size; /* chunk size in bytes */
5394 /* char pad[sizeof(ctoon_mut_val) - sizeof(ctoon_val_chunk)]; padding */
5395 /* ctoon_mut_val vals[]; flexible array member */
5401typedef struct ctoon_val_pool {
5402 ctoon_mut_val *cur; /* cursor inside current chunk */
5403 ctoon_mut_val *end; /* the end of current chunk */
5404 size_t chunk_size; /* chunk size in bytes while creating new chunk */
5405 size_t chunk_size_max; /* maximum chunk size in bytes */
5406 ctoon_val_chunk *chunks; /* a linked list of chunks, nullable */
5409struct ctoon_mut_doc {
5410 ctoon_mut_val *root; /**< root value of the TOON document, nullable */
5411 ctoon_alc alc; /**< a valid allocator, nonnull */
5412 ctoon_str_pool str_pool; /**< string memory pool */
5413 ctoon_val_pool val_pool; /**< value memory pool */
5416/* Ensures the capacity to at least equal to the specified byte length. */
5417ctoon_api bool unsafe_ctoon_str_pool_grow(ctoon_str_pool *pool,
5418 const ctoon_alc *alc,
5421/* Ensures the capacity to at least equal to the specified value count. */
5422ctoon_api bool unsafe_ctoon_val_pool_grow(ctoon_val_pool *pool,
5423 const ctoon_alc *alc,
5426/* Allocate memory for string. */
5427ctoon_api_inline char *unsafe_ctoon_mut_str_alc(ctoon_mut_doc *doc,
5430 const ctoon_alc *alc = &doc->alc;
5431 ctoon_str_pool *pool = &doc->str_pool;
5432 if (ctoon_unlikely((size_t)(pool->end - pool->cur) <= len)) {
5433 if (ctoon_unlikely(!unsafe_ctoon_str_pool_grow(pool, alc, len + 1))) {
5438 pool->cur = mem + len + 1;
5442ctoon_api_inline char *unsafe_ctoon_mut_strncpy(ctoon_mut_doc *doc,
5443 const char *str, size_t len) {
5444 char *mem = unsafe_ctoon_mut_str_alc(doc, len);
5445 if (ctoon_unlikely(!mem)) return NULL;
5446 memcpy((void *)mem, (const void *)str, len);
5451ctoon_api_inline ctoon_mut_val *unsafe_ctoon_mut_val(ctoon_mut_doc *doc,
5454 ctoon_alc *alc = &doc->alc;
5455 ctoon_val_pool *pool = &doc->val_pool;
5456 if (ctoon_unlikely((size_t)(pool->end - pool->cur) < count)) {
5457 if (ctoon_unlikely(!unsafe_ctoon_val_pool_grow(pool, alc, count))) {
5468/*==============================================================================
5469 * MARK: - Mutable TOON Document API (Implementation)
5470 *============================================================================*/
5472ctoon_api_inline ctoon_mut_val *ctoon_mut_doc_get_root(ctoon_mut_doc *doc) {
5473 return doc ? doc->root : NULL;
5476ctoon_api_inline void ctoon_mut_doc_set_root(ctoon_mut_doc *doc,
5477 ctoon_mut_val *root) {
5478 if (doc) doc->root = root;
5483/*==============================================================================
5484 * MARK: - Mutable TOON Value Type API (Implementation)
5485 *============================================================================*/
5487ctoon_api_inline bool ctoon_mut_is_raw(ctoon_mut_val *val) {
5488 return val ? unsafe_ctoon_is_raw(val) : false;
5491ctoon_api_inline bool ctoon_mut_is_null(ctoon_mut_val *val) {
5492 return val ? unsafe_ctoon_is_null(val) : false;
5495ctoon_api_inline bool ctoon_mut_is_true(ctoon_mut_val *val) {
5496 return val ? unsafe_ctoon_is_true(val) : false;
5499ctoon_api_inline bool ctoon_mut_is_false(ctoon_mut_val *val) {
5500 return val ? unsafe_ctoon_is_false(val) : false;
5503ctoon_api_inline bool ctoon_mut_is_bool(ctoon_mut_val *val) {
5504 return val ? unsafe_ctoon_is_bool(val) : false;
5507ctoon_api_inline bool ctoon_mut_is_uint(ctoon_mut_val *val) {
5508 return val ? unsafe_ctoon_is_uint(val) : false;
5511ctoon_api_inline bool ctoon_mut_is_sint(ctoon_mut_val *val) {
5512 return val ? unsafe_ctoon_is_sint(val) : false;
5515ctoon_api_inline bool ctoon_mut_is_int(ctoon_mut_val *val) {
5516 return val ? unsafe_ctoon_is_int(val) : false;
5519ctoon_api_inline bool ctoon_mut_is_real(ctoon_mut_val *val) {
5520 return val ? unsafe_ctoon_is_real(val) : false;
5523ctoon_api_inline bool ctoon_mut_is_num(ctoon_mut_val *val) {
5524 return val ? unsafe_ctoon_is_num(val) : false;
5527ctoon_api_inline bool ctoon_mut_is_str(ctoon_mut_val *val) {
5528 return val ? unsafe_ctoon_is_str(val) : false;
5531ctoon_api_inline bool ctoon_mut_is_arr(ctoon_mut_val *val) {
5532 return val ? unsafe_ctoon_is_arr(val) : false;
5535ctoon_api_inline bool ctoon_mut_is_obj(ctoon_mut_val *val) {
5536 return val ? unsafe_ctoon_is_obj(val) : false;
5539ctoon_api_inline bool ctoon_mut_is_ctn(ctoon_mut_val *val) {
5540 return val ? unsafe_ctoon_is_ctn(val) : false;
5545/*==============================================================================
5546 * MARK: - Mutable TOON Value Content API (Implementation)
5547 *============================================================================*/
5549ctoon_api_inline ctoon_type ctoon_mut_get_type(ctoon_mut_val *val) {
5550 return ctoon_get_type((ctoon_val *)val);
5553ctoon_api_inline ctoon_subtype ctoon_mut_get_subtype(ctoon_mut_val *val) {
5554 return ctoon_get_subtype((ctoon_val *)val);
5557ctoon_api_inline uint8_t ctoon_mut_get_tag(ctoon_mut_val *val) {
5558 return ctoon_get_tag((ctoon_val *)val);
5561ctoon_api_inline const char *ctoon_mut_get_type_desc(ctoon_mut_val *val) {
5562 return ctoon_get_type_desc((ctoon_val *)val);
5565ctoon_api_inline const char *ctoon_mut_get_raw(ctoon_mut_val *val) {
5566 return ctoon_get_raw((ctoon_val *)val);
5569ctoon_api_inline bool ctoon_mut_get_bool(ctoon_mut_val *val) {
5570 return ctoon_get_bool((ctoon_val *)val);
5573ctoon_api_inline uint64_t ctoon_mut_get_uint(ctoon_mut_val *val) {
5574 return ctoon_get_uint((ctoon_val *)val);
5577ctoon_api_inline int64_t ctoon_mut_get_sint(ctoon_mut_val *val) {
5578 return ctoon_get_sint((ctoon_val *)val);
5581ctoon_api_inline int ctoon_mut_get_int(ctoon_mut_val *val) {
5582 return ctoon_get_int((ctoon_val *)val);
5585ctoon_api_inline double ctoon_mut_get_real(ctoon_mut_val *val) {
5586 return ctoon_get_real((ctoon_val *)val);
5589ctoon_api_inline double ctoon_mut_get_num(ctoon_mut_val *val) {
5590 return ctoon_get_num((ctoon_val *)val);
5593ctoon_api_inline const char *ctoon_mut_get_str(ctoon_mut_val *val) {
5594 return ctoon_get_str((ctoon_val *)val);
5597ctoon_api_inline size_t ctoon_mut_get_len(ctoon_mut_val *val) {
5598 return ctoon_get_len((ctoon_val *)val);
5601ctoon_api_inline bool ctoon_mut_equals_str(ctoon_mut_val *val,
5603 return ctoon_equals_str((ctoon_val *)val, str);
5606ctoon_api_inline bool ctoon_mut_equals_strn(ctoon_mut_val *val,
5607 const char *str, size_t len) {
5608 return ctoon_equals_strn((ctoon_val *)val, str, len);
5611ctoon_api bool unsafe_ctoon_mut_equals(ctoon_mut_val *lhs,
5612 ctoon_mut_val *rhs);
5614ctoon_api_inline bool ctoon_mut_equals(ctoon_mut_val *lhs,
5615 ctoon_mut_val *rhs) {
5616 if (ctoon_unlikely(!lhs || !rhs)) return false;
5617 return unsafe_ctoon_mut_equals(lhs, rhs);
5620ctoon_api_inline bool ctoon_mut_set_raw(ctoon_mut_val *val,
5621 const char *raw, size_t len) {
5622 if (ctoon_unlikely(!val || !raw)) return false;
5623 unsafe_ctoon_set_raw(val, raw, len);
5627ctoon_api_inline bool ctoon_mut_set_null(ctoon_mut_val *val) {
5628 if (ctoon_unlikely(!val)) return false;
5629 unsafe_ctoon_set_null(val);
5633ctoon_api_inline bool ctoon_mut_set_bool(ctoon_mut_val *val, bool num) {
5634 if (ctoon_unlikely(!val)) return false;
5635 unsafe_ctoon_set_bool(val, num);
5639ctoon_api_inline bool ctoon_mut_set_uint(ctoon_mut_val *val, uint64_t num) {
5640 if (ctoon_unlikely(!val)) return false;
5641 unsafe_ctoon_set_uint(val, num);
5645ctoon_api_inline bool ctoon_mut_set_sint(ctoon_mut_val *val, int64_t num) {
5646 if (ctoon_unlikely(!val)) return false;
5647 unsafe_ctoon_set_sint(val, num);
5651ctoon_api_inline bool ctoon_mut_set_int(ctoon_mut_val *val, int num) {
5652 if (ctoon_unlikely(!val)) return false;
5653 unsafe_ctoon_set_sint(val, (int64_t)num);
5657ctoon_api_inline bool ctoon_mut_set_float(ctoon_mut_val *val, float num) {
5658 if (ctoon_unlikely(!val)) return false;
5659 unsafe_ctoon_set_float(val, num);
5663ctoon_api_inline bool ctoon_mut_set_double(ctoon_mut_val *val, double num) {
5664 if (ctoon_unlikely(!val)) return false;
5665 unsafe_ctoon_set_double(val, num);
5669ctoon_api_inline bool ctoon_mut_set_real(ctoon_mut_val *val, double num) {
5670 if (ctoon_unlikely(!val)) return false;
5671 unsafe_ctoon_set_real(val, num);
5675ctoon_api_inline bool ctoon_mut_set_fp_to_fixed(ctoon_mut_val *val,
5677 if (ctoon_unlikely(!ctoon_mut_is_real(val))) return false;
5678 unsafe_ctoon_set_fp_to_fixed(val, prec);
5682ctoon_api_inline bool ctoon_mut_set_fp_to_float(ctoon_mut_val *val,
5684 if (ctoon_unlikely(!ctoon_mut_is_real(val))) return false;
5685 unsafe_ctoon_set_fp_to_float(val, flt);
5689ctoon_api_inline bool ctoon_mut_set_str(ctoon_mut_val *val,
5691 if (ctoon_unlikely(!val || !str)) return false;
5692 unsafe_ctoon_set_str(val, str);
5696ctoon_api_inline bool ctoon_mut_set_strn(ctoon_mut_val *val,
5697 const char *str, size_t len) {
5698 if (ctoon_unlikely(!val || !str)) return false;
5699 unsafe_ctoon_set_strn(val, str, len);
5703ctoon_api_inline bool ctoon_mut_set_str_noesc(ctoon_mut_val *val,
5705 if (ctoon_unlikely(!ctoon_mut_is_str(val))) return false;
5706 unsafe_ctoon_set_str_noesc(val, noesc);
5710ctoon_api_inline bool ctoon_mut_set_arr(ctoon_mut_val *val) {
5711 if (ctoon_unlikely(!val)) return false;
5712 unsafe_ctoon_set_arr(val, 0);
5716ctoon_api_inline bool ctoon_mut_set_obj(ctoon_mut_val *val) {
5717 if (ctoon_unlikely(!val)) return false;
5718 unsafe_ctoon_set_obj(val, 0);
5724/*==============================================================================
5725 * MARK: - Mutable TOON Value Creation API (Implementation)
5726 *============================================================================*/
5728#define ctoon_mut_val_one(func) \
5729 if (ctoon_likely(doc)) { \
5730 ctoon_mut_val *val = unsafe_ctoon_mut_val(doc, 1); \
5731 if (ctoon_likely(val)) { \
5738#define ctoon_mut_val_one_str(func) \
5739 if (ctoon_likely(doc && str)) { \
5740 ctoon_mut_val *val = unsafe_ctoon_mut_val(doc, 1); \
5741 if (ctoon_likely(val)) { \
5748ctoon_api_inline ctoon_mut_val *ctoon_mut_raw(ctoon_mut_doc *doc,
5750 ctoon_mut_val_one_str({ unsafe_ctoon_set_raw(val, str, strlen(str)); });
5753ctoon_api_inline ctoon_mut_val *ctoon_mut_rawn(ctoon_mut_doc *doc,
5756 ctoon_mut_val_one_str({ unsafe_ctoon_set_raw(val, str, len); });
5759ctoon_api_inline ctoon_mut_val *ctoon_mut_rawcpy(ctoon_mut_doc *doc,
5761 ctoon_mut_val_one_str({
5762 size_t len = strlen(str);
5763 char *new_str = unsafe_ctoon_mut_strncpy(doc, str, len);
5764 if (ctoon_unlikely(!new_str)) return NULL;
5765 unsafe_ctoon_set_raw(val, new_str, len);
5769ctoon_api_inline ctoon_mut_val *ctoon_mut_rawncpy(ctoon_mut_doc *doc,
5772 ctoon_mut_val_one_str({
5773 char *new_str = unsafe_ctoon_mut_strncpy(doc, str, len);
5774 if (ctoon_unlikely(!new_str)) return NULL;
5775 unsafe_ctoon_set_raw(val, new_str, len);
5779ctoon_api_inline ctoon_mut_val *ctoon_mut_null(ctoon_mut_doc *doc) {
5780 ctoon_mut_val_one({ unsafe_ctoon_set_null(val); });
5783ctoon_api_inline ctoon_mut_val *ctoon_mut_true(ctoon_mut_doc *doc) {
5784 ctoon_mut_val_one({ unsafe_ctoon_set_bool(val, true); });
5787ctoon_api_inline ctoon_mut_val *ctoon_mut_false(ctoon_mut_doc *doc) {
5788 ctoon_mut_val_one({ unsafe_ctoon_set_bool(val, false); });
5791ctoon_api_inline ctoon_mut_val *ctoon_mut_bool(ctoon_mut_doc *doc,
5793 ctoon_mut_val_one({ unsafe_ctoon_set_bool(val, _val); });
5796ctoon_api_inline ctoon_mut_val *ctoon_mut_uint(ctoon_mut_doc *doc,
5798 ctoon_mut_val_one({ unsafe_ctoon_set_uint(val, num); });
5801ctoon_api_inline ctoon_mut_val *ctoon_mut_sint(ctoon_mut_doc *doc,
5803 ctoon_mut_val_one({ unsafe_ctoon_set_sint(val, num); });
5806ctoon_api_inline ctoon_mut_val *ctoon_mut_int(ctoon_mut_doc *doc,
5808 ctoon_mut_val_one({ unsafe_ctoon_set_sint(val, num); });
5811ctoon_api_inline ctoon_mut_val *ctoon_mut_float(ctoon_mut_doc *doc,
5813 ctoon_mut_val_one({ unsafe_ctoon_set_float(val, num); });
5816ctoon_api_inline ctoon_mut_val *ctoon_mut_double(ctoon_mut_doc *doc,
5818 ctoon_mut_val_one({ unsafe_ctoon_set_double(val, num); });
5821ctoon_api_inline ctoon_mut_val *ctoon_mut_real(ctoon_mut_doc *doc,
5823 ctoon_mut_val_one({ unsafe_ctoon_set_real(val, num); });
5826ctoon_api_inline ctoon_mut_val *ctoon_mut_str(ctoon_mut_doc *doc,
5828 ctoon_mut_val_one_str({ unsafe_ctoon_set_str(val, str); });
5831ctoon_api_inline ctoon_mut_val *ctoon_mut_strn(ctoon_mut_doc *doc,
5834 ctoon_mut_val_one_str({ unsafe_ctoon_set_strn(val, str, len); });
5837ctoon_api_inline ctoon_mut_val *ctoon_mut_strcpy(ctoon_mut_doc *doc,
5839 ctoon_mut_val_one_str({
5840 size_t len = strlen(str);
5841 bool noesc = unsafe_ctoon_is_str_noesc(str, len);
5842 ctoon_subtype sub = noesc ? CTOON_SUBTYPE_NOESC : CTOON_SUBTYPE_NONE;
5843 char *new_str = unsafe_ctoon_mut_strncpy(doc, str, len);
5844 if (ctoon_unlikely(!new_str)) return NULL;
5845 unsafe_ctoon_set_tag(val, CTOON_TYPE_STR, sub, len);
5846 val->uni.str = new_str;
5850ctoon_api_inline ctoon_mut_val *ctoon_mut_strncpy(ctoon_mut_doc *doc,
5853 ctoon_mut_val_one_str({
5854 char *new_str = unsafe_ctoon_mut_strncpy(doc, str, len);
5855 if (ctoon_unlikely(!new_str)) return NULL;
5856 unsafe_ctoon_set_strn(val, new_str, len);
5860#undef ctoon_mut_val_one
5861#undef ctoon_mut_val_one_str
5865/*==============================================================================
5866 * MARK: - Mutable TOON Array API (Implementation)
5867 *============================================================================*/
5869ctoon_api_inline size_t ctoon_mut_arr_size(ctoon_mut_val *arr) {
5870 return ctoon_mut_is_arr(arr) ? unsafe_ctoon_get_len(arr) : 0;
5873ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_get(ctoon_mut_val *arr,
5875 if (ctoon_likely(idx < ctoon_mut_arr_size(arr))) {
5876 ctoon_mut_val *val = (ctoon_mut_val *)arr->uni.ptr;
5877 while (idx-- > 0) val = val->next;
5883ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_get_first(
5884 ctoon_mut_val *arr) {
5885 if (ctoon_likely(ctoon_mut_arr_size(arr) > 0)) {
5886 return ((ctoon_mut_val *)arr->uni.ptr)->next;
5891ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_get_last(
5892 ctoon_mut_val *arr) {
5893 if (ctoon_likely(ctoon_mut_arr_size(arr) > 0)) {
5894 return ((ctoon_mut_val *)arr->uni.ptr);
5901/*==============================================================================
5902 * MARK: - Mutable TOON Array Iterator API (Implementation)
5903 *============================================================================*/
5905ctoon_api_inline bool ctoon_mut_arr_iter_init(ctoon_mut_val *arr,
5906 ctoon_mut_arr_iter *iter) {
5907 if (ctoon_likely(ctoon_mut_is_arr(arr) && iter)) {
5909 iter->max = unsafe_ctoon_get_len(arr);
5910 iter->cur = iter->max ? (ctoon_mut_val *)arr->uni.ptr : NULL;
5915 if (iter) memset(iter, 0, sizeof(ctoon_mut_arr_iter));
5919ctoon_api_inline ctoon_mut_arr_iter ctoon_mut_arr_iter_with(
5920 ctoon_mut_val *arr) {
5921 ctoon_mut_arr_iter iter;
5922 ctoon_mut_arr_iter_init(arr, &iter);
5926ctoon_api_inline bool ctoon_mut_arr_iter_has_next(ctoon_mut_arr_iter *iter) {
5927 return iter ? iter->idx < iter->max : false;
5930ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_iter_next(
5931 ctoon_mut_arr_iter *iter) {
5932 if (iter && iter->idx < iter->max) {
5933 ctoon_mut_val *val = iter->cur;
5935 iter->cur = val->next;
5942ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_iter_remove(
5943 ctoon_mut_arr_iter *iter) {
5944 if (ctoon_likely(iter && 0 < iter->idx && iter->idx <= iter->max)) {
5945 ctoon_mut_val *prev = iter->pre;
5946 ctoon_mut_val *cur = iter->cur;
5947 ctoon_mut_val *next = cur->next;
5948 if (ctoon_unlikely(iter->idx == iter->max)) iter->arr->uni.ptr = prev;
5951 unsafe_ctoon_set_len(iter->arr, iter->max);
5961/*==============================================================================
5962 * MARK: - Mutable TOON Array Creation API (Implementation)
5963 *============================================================================*/
5965ctoon_api_inline ctoon_mut_val *ctoon_mut_arr(ctoon_mut_doc *doc) {
5966 if (ctoon_likely(doc)) {
5967 ctoon_mut_val *val = unsafe_ctoon_mut_val(doc, 1);
5968 if (ctoon_likely(val)) {
5969 val->tag = CTOON_TYPE_ARR | CTOON_SUBTYPE_NONE;
5976#define ctoon_mut_arr_with_func(func) \
5977 if (ctoon_likely(doc && ((0 < count && count < \
5978 (~(size_t)0) / sizeof(ctoon_mut_val) && vals) || count == 0))) { \
5979 ctoon_mut_val *arr = unsafe_ctoon_mut_val(doc, 1 + count); \
5980 if (ctoon_likely(arr)) { \
5981 arr->tag = ((uint64_t)count << CTOON_TAG_BIT) | CTOON_TYPE_ARR; \
5984 for (i = 0; i < count; i++) { \
5985 ctoon_mut_val *val = arr + i + 1; \
5987 val->next = val + 1; \
5989 arr[count].next = arr + 1; \
5990 arr->uni.ptr = arr + count; \
5997ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_with_bool(
5998 ctoon_mut_doc *doc, const bool *vals, size_t count) {
5999 ctoon_mut_arr_with_func({
6000 unsafe_ctoon_set_bool(val, vals[i]);
6004ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_with_sint(
6005 ctoon_mut_doc *doc, const int64_t *vals, size_t count) {
6006 return ctoon_mut_arr_with_sint64(doc, vals, count);
6009ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_with_uint(
6010 ctoon_mut_doc *doc, const uint64_t *vals, size_t count) {
6011 return ctoon_mut_arr_with_uint64(doc, vals, count);
6014ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_with_real(
6015 ctoon_mut_doc *doc, const double *vals, size_t count) {
6016 ctoon_mut_arr_with_func({
6017 unsafe_ctoon_set_real(val, vals[i]);
6021ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_with_sint8(
6022 ctoon_mut_doc *doc, const int8_t *vals, size_t count) {
6023 ctoon_mut_arr_with_func({
6024 unsafe_ctoon_set_sint(val, vals[i]);
6028ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_with_sint16(
6029 ctoon_mut_doc *doc, const int16_t *vals, size_t count) {
6030 ctoon_mut_arr_with_func({
6031 unsafe_ctoon_set_sint(val, vals[i]);
6035ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_with_sint32(
6036 ctoon_mut_doc *doc, const int32_t *vals, size_t count) {
6037 ctoon_mut_arr_with_func({
6038 unsafe_ctoon_set_sint(val, vals[i]);
6042ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_with_sint64(
6043 ctoon_mut_doc *doc, const int64_t *vals, size_t count) {
6044 ctoon_mut_arr_with_func({
6045 unsafe_ctoon_set_sint(val, vals[i]);
6049ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_with_uint8(
6050 ctoon_mut_doc *doc, const uint8_t *vals, size_t count) {
6051 ctoon_mut_arr_with_func({
6052 unsafe_ctoon_set_uint(val, vals[i]);
6056ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_with_uint16(
6057 ctoon_mut_doc *doc, const uint16_t *vals, size_t count) {
6058 ctoon_mut_arr_with_func({
6059 unsafe_ctoon_set_uint(val, vals[i]);
6063ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_with_uint32(
6064 ctoon_mut_doc *doc, const uint32_t *vals, size_t count) {
6065 ctoon_mut_arr_with_func({
6066 unsafe_ctoon_set_uint(val, vals[i]);
6070ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_with_uint64(
6071 ctoon_mut_doc *doc, const uint64_t *vals, size_t count) {
6072 ctoon_mut_arr_with_func({
6073 unsafe_ctoon_set_uint(val, vals[i]);
6077ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_with_float(
6078 ctoon_mut_doc *doc, const float *vals, size_t count) {
6079 ctoon_mut_arr_with_func({
6080 unsafe_ctoon_set_float(val, vals[i]);
6084ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_with_double(
6085 ctoon_mut_doc *doc, const double *vals, size_t count) {
6086 ctoon_mut_arr_with_func({
6087 unsafe_ctoon_set_double(val, vals[i]);
6091ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_with_str(
6092 ctoon_mut_doc *doc, const char **vals, size_t count) {
6093 ctoon_mut_arr_with_func({
6094 if (ctoon_unlikely(!vals[i])) return NULL;
6095 unsafe_ctoon_set_str(val, vals[i]);
6099ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_with_strn(
6100 ctoon_mut_doc *doc, const char **vals, const size_t *lens, size_t count) {
6101 if (ctoon_unlikely(count > 0 && !lens)) return NULL;
6102 ctoon_mut_arr_with_func({
6103 if (ctoon_unlikely(!vals[i])) return NULL;
6104 unsafe_ctoon_set_strn(val, vals[i], lens[i]);
6108ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_with_strcpy(
6109 ctoon_mut_doc *doc, const char **vals, size_t count) {
6111 const char *str, *new_str;
6112 ctoon_mut_arr_with_func({
6114 if (ctoon_unlikely(!str)) return NULL;
6116 new_str = unsafe_ctoon_mut_strncpy(doc, str, len);
6117 if (ctoon_unlikely(!new_str)) return NULL;
6118 unsafe_ctoon_set_strn(val, new_str, len);
6122ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_with_strncpy(
6123 ctoon_mut_doc *doc, const char **vals, const size_t *lens, size_t count) {
6125 const char *str, *new_str;
6126 if (ctoon_unlikely(count > 0 && !lens)) return NULL;
6127 ctoon_mut_arr_with_func({
6129 if (ctoon_unlikely(!str)) return NULL;
6131 new_str = unsafe_ctoon_mut_strncpy(doc, str, len);
6132 if (ctoon_unlikely(!new_str)) return NULL;
6133 unsafe_ctoon_set_strn(val, new_str, len);
6137#undef ctoon_mut_arr_with_func
6141/*==============================================================================
6142 * MARK: - Mutable TOON Array Modification API (Implementation)
6143 *============================================================================*/
6145ctoon_api_inline bool ctoon_mut_arr_insert(ctoon_mut_val *arr,
6146 ctoon_mut_val *val, size_t idx) {
6147 if (ctoon_likely(ctoon_mut_is_arr(arr) && val)) {
6148 size_t len = unsafe_ctoon_get_len(arr);
6149 if (ctoon_likely(idx <= len)) {
6150 unsafe_ctoon_set_len(arr, len + 1);
6155 ctoon_mut_val *prev = ((ctoon_mut_val *)arr->uni.ptr);
6156 ctoon_mut_val *next = prev->next;
6176ctoon_api_inline bool ctoon_mut_arr_append(ctoon_mut_val *arr,
6177 ctoon_mut_val *val) {
6178 if (ctoon_likely(ctoon_mut_is_arr(arr) && val)) {
6179 size_t len = unsafe_ctoon_get_len(arr);
6180 unsafe_ctoon_set_len(arr, len + 1);
6184 ctoon_mut_val *prev = ((ctoon_mut_val *)arr->uni.ptr);
6185 ctoon_mut_val *next = prev->next;
6195ctoon_api_inline bool ctoon_mut_arr_prepend(ctoon_mut_val *arr,
6196 ctoon_mut_val *val) {
6197 if (ctoon_likely(ctoon_mut_is_arr(arr) && val)) {
6198 size_t len = unsafe_ctoon_get_len(arr);
6199 unsafe_ctoon_set_len(arr, len + 1);
6204 ctoon_mut_val *prev = ((ctoon_mut_val *)arr->uni.ptr);
6205 ctoon_mut_val *next = prev->next;
6214ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_replace(ctoon_mut_val *arr,
6216 ctoon_mut_val *val) {
6217 if (ctoon_likely(ctoon_mut_is_arr(arr) && val)) {
6218 size_t len = unsafe_ctoon_get_len(arr);
6219 if (ctoon_likely(idx < len)) {
6220 if (ctoon_likely(len > 1)) {
6221 ctoon_mut_val *prev = ((ctoon_mut_val *)arr->uni.ptr);
6222 ctoon_mut_val *next = prev->next;
6228 val->next = next->next;
6229 if ((void *)next == arr->uni.ptr) arr->uni.ptr = val;
6232 ctoon_mut_val *prev = ((ctoon_mut_val *)arr->uni.ptr);
6242ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_remove(ctoon_mut_val *arr,
6244 if (ctoon_likely(ctoon_mut_is_arr(arr))) {
6245 size_t len = unsafe_ctoon_get_len(arr);
6246 if (ctoon_likely(idx < len)) {
6247 unsafe_ctoon_set_len(arr, len - 1);
6248 if (ctoon_likely(len > 1)) {
6249 ctoon_mut_val *prev = ((ctoon_mut_val *)arr->uni.ptr);
6250 ctoon_mut_val *next = prev->next;
6255 prev->next = next->next;
6256 if ((void *)next == arr->uni.ptr) arr->uni.ptr = prev;
6259 return ((ctoon_mut_val *)arr->uni.ptr);
6266ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_remove_first(
6267 ctoon_mut_val *arr) {
6268 if (ctoon_likely(ctoon_mut_is_arr(arr))) {
6269 size_t len = unsafe_ctoon_get_len(arr);
6271 ctoon_mut_val *prev = ((ctoon_mut_val *)arr->uni.ptr);
6272 ctoon_mut_val *next = prev->next;
6273 prev->next = next->next;
6274 unsafe_ctoon_set_len(arr, len - 1);
6276 } else if (len == 1) {
6277 ctoon_mut_val *prev = ((ctoon_mut_val *)arr->uni.ptr);
6278 unsafe_ctoon_set_len(arr, 0);
6285ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_remove_last(
6286 ctoon_mut_val *arr) {
6287 if (ctoon_likely(ctoon_mut_is_arr(arr))) {
6288 size_t len = unsafe_ctoon_get_len(arr);
6289 if (ctoon_likely(len > 1)) {
6290 ctoon_mut_val *prev = ((ctoon_mut_val *)arr->uni.ptr);
6291 ctoon_mut_val *next = prev->next;
6292 unsafe_ctoon_set_len(arr, len - 1);
6293 while (--len > 0) prev = prev->next;
6295 next = (ctoon_mut_val *)arr->uni.ptr;
6296 arr->uni.ptr = prev;
6298 } else if (len == 1) {
6299 ctoon_mut_val *prev = ((ctoon_mut_val *)arr->uni.ptr);
6300 unsafe_ctoon_set_len(arr, 0);
6307ctoon_api_inline bool ctoon_mut_arr_remove_range(ctoon_mut_val *arr,
6308 size_t _idx, size_t _len) {
6309 if (ctoon_likely(ctoon_mut_is_arr(arr))) {
6310 ctoon_mut_val *prev, *next;
6312 size_t len = unsafe_ctoon_get_len(arr);
6313 if (ctoon_unlikely(_idx + _len > len)) return false;
6314 if (ctoon_unlikely(_len == 0)) return true;
6315 unsafe_ctoon_set_len(arr, len - _len);
6316 if (ctoon_unlikely(len == _len)) return true;
6317 tail_removed = (_idx + _len == len);
6318 prev = ((ctoon_mut_val *)arr->uni.ptr);
6319 while (_idx-- > 0) prev = prev->next;
6321 while (_len-- > 0) next = next->next;
6323 if (ctoon_unlikely(tail_removed)) arr->uni.ptr = prev;
6329ctoon_api_inline bool ctoon_mut_arr_clear(ctoon_mut_val *arr) {
6330 if (ctoon_likely(ctoon_mut_is_arr(arr))) {
6331 unsafe_ctoon_set_len(arr, 0);
6337ctoon_api_inline bool ctoon_mut_arr_rotate(ctoon_mut_val *arr,
6339 if (ctoon_likely(ctoon_mut_is_arr(arr) &&
6340 unsafe_ctoon_get_len(arr) > idx)) {
6341 ctoon_mut_val *val = (ctoon_mut_val *)arr->uni.ptr;
6342 while (idx-- > 0) val = val->next;
6343 arr->uni.ptr = (void *)val;
6351/*==============================================================================
6352 * MARK: - Mutable TOON Array Modification Convenience API (Implementation)
6353 *============================================================================*/
6355ctoon_api_inline bool ctoon_mut_arr_add_val(ctoon_mut_val *arr,
6356 ctoon_mut_val *val) {
6357 return ctoon_mut_arr_append(arr, val);
6360ctoon_api_inline bool ctoon_mut_arr_add_null(ctoon_mut_doc *doc,
6361 ctoon_mut_val *arr) {
6362 if (ctoon_likely(doc && ctoon_mut_is_arr(arr))) {
6363 ctoon_mut_val *val = ctoon_mut_null(doc);
6364 return ctoon_mut_arr_append(arr, val);
6369ctoon_api_inline bool ctoon_mut_arr_add_true(ctoon_mut_doc *doc,
6370 ctoon_mut_val *arr) {
6371 if (ctoon_likely(doc && ctoon_mut_is_arr(arr))) {
6372 ctoon_mut_val *val = ctoon_mut_true(doc);
6373 return ctoon_mut_arr_append(arr, val);
6378ctoon_api_inline bool ctoon_mut_arr_add_false(ctoon_mut_doc *doc,
6379 ctoon_mut_val *arr) {
6380 if (ctoon_likely(doc && ctoon_mut_is_arr(arr))) {
6381 ctoon_mut_val *val = ctoon_mut_false(doc);
6382 return ctoon_mut_arr_append(arr, val);
6387ctoon_api_inline bool ctoon_mut_arr_add_bool(ctoon_mut_doc *doc,
6390 if (ctoon_likely(doc && ctoon_mut_is_arr(arr))) {
6391 ctoon_mut_val *val = ctoon_mut_bool(doc, _val);
6392 return ctoon_mut_arr_append(arr, val);
6397ctoon_api_inline bool ctoon_mut_arr_add_uint(ctoon_mut_doc *doc,
6400 if (ctoon_likely(doc && ctoon_mut_is_arr(arr))) {
6401 ctoon_mut_val *val = ctoon_mut_uint(doc, num);
6402 return ctoon_mut_arr_append(arr, val);
6407ctoon_api_inline bool ctoon_mut_arr_add_sint(ctoon_mut_doc *doc,
6410 if (ctoon_likely(doc && ctoon_mut_is_arr(arr))) {
6411 ctoon_mut_val *val = ctoon_mut_sint(doc, num);
6412 return ctoon_mut_arr_append(arr, val);
6417ctoon_api_inline bool ctoon_mut_arr_add_int(ctoon_mut_doc *doc,
6420 if (ctoon_likely(doc && ctoon_mut_is_arr(arr))) {
6421 ctoon_mut_val *val = ctoon_mut_sint(doc, num);
6422 return ctoon_mut_arr_append(arr, val);
6427ctoon_api_inline bool ctoon_mut_arr_add_float(ctoon_mut_doc *doc,
6430 if (ctoon_likely(doc && ctoon_mut_is_arr(arr))) {
6431 ctoon_mut_val *val = ctoon_mut_float(doc, num);
6432 return ctoon_mut_arr_append(arr, val);
6437ctoon_api_inline bool ctoon_mut_arr_add_double(ctoon_mut_doc *doc,
6440 if (ctoon_likely(doc && ctoon_mut_is_arr(arr))) {
6441 ctoon_mut_val *val = ctoon_mut_double(doc, num);
6442 return ctoon_mut_arr_append(arr, val);
6447ctoon_api_inline bool ctoon_mut_arr_add_real(ctoon_mut_doc *doc,
6450 if (ctoon_likely(doc && ctoon_mut_is_arr(arr))) {
6451 ctoon_mut_val *val = ctoon_mut_real(doc, num);
6452 return ctoon_mut_arr_append(arr, val);
6457ctoon_api_inline bool ctoon_mut_arr_add_str(ctoon_mut_doc *doc,
6460 if (ctoon_likely(doc && ctoon_mut_is_arr(arr))) {
6461 ctoon_mut_val *val = ctoon_mut_str(doc, str);
6462 return ctoon_mut_arr_append(arr, val);
6467ctoon_api_inline bool ctoon_mut_arr_add_strn(ctoon_mut_doc *doc,
6469 const char *str, size_t len) {
6470 if (ctoon_likely(doc && ctoon_mut_is_arr(arr))) {
6471 ctoon_mut_val *val = ctoon_mut_strn(doc, str, len);
6472 return ctoon_mut_arr_append(arr, val);
6477ctoon_api_inline bool ctoon_mut_arr_add_strcpy(ctoon_mut_doc *doc,
6480 if (ctoon_likely(doc && ctoon_mut_is_arr(arr))) {
6481 ctoon_mut_val *val = ctoon_mut_strcpy(doc, str);
6482 return ctoon_mut_arr_append(arr, val);
6487ctoon_api_inline bool ctoon_mut_arr_add_strncpy(ctoon_mut_doc *doc,
6489 const char *str, size_t len) {
6490 if (ctoon_likely(doc && ctoon_mut_is_arr(arr))) {
6491 ctoon_mut_val *val = ctoon_mut_strncpy(doc, str, len);
6492 return ctoon_mut_arr_append(arr, val);
6497ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_add_arr(ctoon_mut_doc *doc,
6498 ctoon_mut_val *arr) {
6499 if (ctoon_likely(doc && ctoon_mut_is_arr(arr))) {
6500 ctoon_mut_val *val = ctoon_mut_arr(doc);
6501 return ctoon_mut_arr_append(arr, val) ? val : NULL;
6506ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_add_obj(ctoon_mut_doc *doc,
6507 ctoon_mut_val *arr) {
6508 if (ctoon_likely(doc && ctoon_mut_is_arr(arr))) {
6509 ctoon_mut_val *val = ctoon_mut_obj(doc);
6510 return ctoon_mut_arr_append(arr, val) ? val : NULL;
6517/*==============================================================================
6518 * MARK: - Mutable TOON Object API (Implementation)
6519 *============================================================================*/
6521ctoon_api_inline size_t ctoon_mut_obj_size(ctoon_mut_val *obj) {
6522 return ctoon_mut_is_obj(obj) ? unsafe_ctoon_get_len(obj) : 0;
6525ctoon_api_inline ctoon_mut_val *ctoon_mut_obj_get(ctoon_mut_val *obj,
6527 return ctoon_mut_obj_getn(obj, key, key ? strlen(key) : 0);
6530ctoon_api_inline ctoon_mut_val *ctoon_mut_obj_getn(ctoon_mut_val *obj,
6533 size_t len = ctoon_mut_obj_size(obj);
6534 if (ctoon_likely(len && _key)) {
6535 ctoon_mut_val *key = ((ctoon_mut_val *)obj->uni.ptr)->next->next;
6537 if (unsafe_ctoon_equals_strn(key, _key, key_len)) return key->next;
6538 key = key->next->next;
6546/*==============================================================================
6547 * MARK: - Mutable TOON Object Iterator API (Implementation)
6548 *============================================================================*/
6550ctoon_api_inline bool ctoon_mut_obj_iter_init(ctoon_mut_val *obj,
6551 ctoon_mut_obj_iter *iter) {
6552 if (ctoon_likely(ctoon_mut_is_obj(obj) && iter)) {
6554 iter->max = unsafe_ctoon_get_len(obj);
6555 iter->cur = iter->max ? (ctoon_mut_val *)obj->uni.ptr : NULL;
6560 if (iter) memset(iter, 0, sizeof(ctoon_mut_obj_iter));
6564ctoon_api_inline ctoon_mut_obj_iter ctoon_mut_obj_iter_with(
6565 ctoon_mut_val *obj) {
6566 ctoon_mut_obj_iter iter;
6567 ctoon_mut_obj_iter_init(obj, &iter);
6571ctoon_api_inline bool ctoon_mut_obj_iter_has_next(ctoon_mut_obj_iter *iter) {
6572 return iter ? iter->idx < iter->max : false;
6575ctoon_api_inline ctoon_mut_val *ctoon_mut_obj_iter_next(
6576 ctoon_mut_obj_iter *iter) {
6577 if (iter && iter->idx < iter->max) {
6578 ctoon_mut_val *key = iter->cur;
6580 iter->cur = key->next->next;
6587ctoon_api_inline ctoon_mut_val *ctoon_mut_obj_iter_get_val(
6588 ctoon_mut_val *key) {
6589 return key ? key->next : NULL;
6592ctoon_api_inline ctoon_mut_val *ctoon_mut_obj_iter_remove(
6593 ctoon_mut_obj_iter *iter) {
6594 if (ctoon_likely(iter && 0 < iter->idx && iter->idx <= iter->max)) {
6595 ctoon_mut_val *prev = iter->pre;
6596 ctoon_mut_val *cur = iter->cur;
6597 ctoon_mut_val *next = cur->next->next;
6598 if (ctoon_unlikely(iter->idx == iter->max)) iter->obj->uni.ptr = prev;
6601 unsafe_ctoon_set_len(iter->obj, iter->max);
6602 prev->next->next = next;
6609ctoon_api_inline ctoon_mut_val *ctoon_mut_obj_iter_get(
6610 ctoon_mut_obj_iter *iter, const char *key) {
6611 return ctoon_mut_obj_iter_getn(iter, key, key ? strlen(key) : 0);
6614ctoon_api_inline ctoon_mut_val *ctoon_mut_obj_iter_getn(
6615 ctoon_mut_obj_iter *iter, const char *key, size_t key_len) {
6618 size_t max = iter->max;
6619 ctoon_mut_val *pre, *cur = iter->cur;
6620 while (idx++ < max) {
6622 cur = cur->next->next;
6623 if (unsafe_ctoon_equals_strn(cur, key, key_len)) {
6625 if (iter->idx > max) iter->idx -= max + 1;
6637/*==============================================================================
6638 * MARK: - Mutable TOON Object Creation API (Implementation)
6639 *============================================================================*/
6641ctoon_api_inline ctoon_mut_val *ctoon_mut_obj(ctoon_mut_doc *doc) {
6642 if (ctoon_likely(doc)) {
6643 ctoon_mut_val *val = unsafe_ctoon_mut_val(doc, 1);
6644 if (ctoon_likely(val)) {
6645 val->tag = CTOON_TYPE_OBJ | CTOON_SUBTYPE_NONE;
6652ctoon_api_inline ctoon_mut_val *ctoon_mut_obj_with_str(ctoon_mut_doc *doc,
6656 if (ctoon_likely(doc && ((count > 0 && keys && vals) || (count == 0)))) {
6657 ctoon_mut_val *obj = unsafe_ctoon_mut_val(doc, 1 + count * 2);
6658 if (ctoon_likely(obj)) {
6659 obj->tag = ((uint64_t)count << CTOON_TAG_BIT) | CTOON_TYPE_OBJ;
6662 for (i = 0; i < count; i++) {
6663 ctoon_mut_val *key = obj + (i * 2 + 1);
6664 ctoon_mut_val *val = obj + (i * 2 + 2);
6665 uint64_t key_len = (uint64_t)strlen(keys[i]);
6666 uint64_t val_len = (uint64_t)strlen(vals[i]);
6667 key->tag = (key_len << CTOON_TAG_BIT) | CTOON_TYPE_STR;
6668 val->tag = (val_len << CTOON_TAG_BIT) | CTOON_TYPE_STR;
6669 key->uni.str = keys[i];
6670 val->uni.str = vals[i];
6672 val->next = val + 1;
6674 obj[count * 2].next = obj + 1;
6675 obj->uni.ptr = obj + (count * 2 - 1);
6683ctoon_api_inline ctoon_mut_val *ctoon_mut_obj_with_kv(ctoon_mut_doc *doc,
6686 if (ctoon_likely(doc && ((count > 0 && pairs) || (count == 0)))) {
6687 ctoon_mut_val *obj = unsafe_ctoon_mut_val(doc, 1 + count * 2);
6688 if (ctoon_likely(obj)) {
6689 obj->tag = ((uint64_t)count << CTOON_TAG_BIT) | CTOON_TYPE_OBJ;
6692 for (i = 0; i < count; i++) {
6693 ctoon_mut_val *key = obj + (i * 2 + 1);
6694 ctoon_mut_val *val = obj + (i * 2 + 2);
6695 const char *key_str = pairs[i * 2 + 0];
6696 const char *val_str = pairs[i * 2 + 1];
6697 uint64_t key_len = (uint64_t)strlen(key_str);
6698 uint64_t val_len = (uint64_t)strlen(val_str);
6699 key->tag = (key_len << CTOON_TAG_BIT) | CTOON_TYPE_STR;
6700 val->tag = (val_len << CTOON_TAG_BIT) | CTOON_TYPE_STR;
6701 key->uni.str = key_str;
6702 val->uni.str = val_str;
6704 val->next = val + 1;
6706 obj[count * 2].next = obj + 1;
6707 obj->uni.ptr = obj + (count * 2 - 1);
6717/*==============================================================================
6718 * MARK: - Mutable TOON Object Modification API (Implementation)
6719 *============================================================================*/
6721ctoon_api_inline void unsafe_ctoon_mut_obj_add(ctoon_mut_val *obj,
6725 if (ctoon_likely(len)) {
6726 ctoon_mut_val *prev_val = ((ctoon_mut_val *)obj->uni.ptr)->next;
6727 ctoon_mut_val *next_key = prev_val->next;
6728 prev_val->next = key;
6729 val->next = next_key;
6734 obj->uni.ptr = (void *)key;
6735 unsafe_ctoon_set_len(obj, len + 1);
6738ctoon_api_inline ctoon_mut_val *unsafe_ctoon_mut_obj_remove(
6739 ctoon_mut_val *obj, const char *key, size_t key_len) {
6740 size_t obj_len = unsafe_ctoon_get_len(obj);
6742 ctoon_mut_val *pre_key = (ctoon_mut_val *)obj->uni.ptr;
6743 ctoon_mut_val *cur_key = pre_key->next->next;
6744 ctoon_mut_val *removed_item = NULL;
6746 for (i = 0; i < obj_len; i++) {
6747 if (unsafe_ctoon_equals_strn(cur_key, key, key_len)) {
6748 if (!removed_item) removed_item = cur_key->next;
6749 cur_key = cur_key->next->next;
6750 pre_key->next->next = cur_key;
6751 if (i + 1 == obj_len) obj->uni.ptr = pre_key;
6756 cur_key = cur_key->next->next;
6759 unsafe_ctoon_set_len(obj, obj_len);
6760 return removed_item;
6766ctoon_api_inline bool unsafe_ctoon_mut_obj_replace(ctoon_mut_val *obj,
6768 ctoon_mut_val *val) {
6769 size_t key_len = unsafe_ctoon_get_len(key);
6770 size_t obj_len = unsafe_ctoon_get_len(obj);
6772 ctoon_mut_val *pre_key = (ctoon_mut_val *)obj->uni.ptr;
6773 ctoon_mut_val *cur_key = pre_key->next->next;
6775 for (i = 0; i < obj_len; i++) {
6776 if (unsafe_ctoon_equals_strn(cur_key, key->uni.str, key_len)) {
6777 cur_key->next->tag = val->tag;
6778 cur_key->next->uni.u64 = val->uni.u64;
6781 cur_key = cur_key->next->next;
6788ctoon_api_inline void unsafe_ctoon_mut_obj_rotate(ctoon_mut_val *obj,
6790 ctoon_mut_val *key = (ctoon_mut_val *)obj->uni.ptr;
6791 while (idx-- > 0) key = key->next->next;
6792 obj->uni.ptr = (void *)key;
6795ctoon_api_inline bool ctoon_mut_obj_add(ctoon_mut_val *obj,
6797 ctoon_mut_val *val) {
6798 if (ctoon_likely(ctoon_mut_is_obj(obj) &&
6799 ctoon_mut_is_str(key) && val)) {
6800 unsafe_ctoon_mut_obj_add(obj, key, val, unsafe_ctoon_get_len(obj));
6806ctoon_api_inline bool ctoon_mut_obj_put(ctoon_mut_val *obj,
6808 ctoon_mut_val *val) {
6809 bool replaced = false;
6811 ctoon_mut_obj_iter iter;
6812 ctoon_mut_val *cur_key;
6813 if (ctoon_unlikely(!ctoon_mut_is_obj(obj) ||
6814 !ctoon_mut_is_str(key))) return false;
6815 key_len = unsafe_ctoon_get_len(key);
6816 ctoon_mut_obj_iter_init(obj, &iter);
6817 while ((cur_key = ctoon_mut_obj_iter_next(&iter)) != 0) {
6818 if (unsafe_ctoon_equals_strn(cur_key, key->uni.str, key_len)) {
6819 if (!replaced && val) {
6821 val->next = cur_key->next->next;
6822 cur_key->next = val;
6824 ctoon_mut_obj_iter_remove(&iter);
6828 if (!replaced && val) unsafe_ctoon_mut_obj_add(obj, key, val, iter.max);
6832ctoon_api_inline bool ctoon_mut_obj_insert(ctoon_mut_val *obj,
6836 if (ctoon_likely(ctoon_mut_is_obj(obj) &&
6837 ctoon_mut_is_str(key) && val)) {
6838 size_t len = unsafe_ctoon_get_len(obj);
6839 if (ctoon_likely(len >= idx)) {
6841 void *ptr = obj->uni.ptr;
6842 unsafe_ctoon_mut_obj_rotate(obj, idx);
6843 unsafe_ctoon_mut_obj_add(obj, key, val, len);
6846 unsafe_ctoon_mut_obj_add(obj, key, val, len);
6854ctoon_api_inline ctoon_mut_val *ctoon_mut_obj_remove(ctoon_mut_val *obj,
6855 ctoon_mut_val *key) {
6856 if (ctoon_likely(ctoon_mut_is_obj(obj) && ctoon_mut_is_str(key))) {
6857 return unsafe_ctoon_mut_obj_remove(obj, key->uni.str,
6858 unsafe_ctoon_get_len(key));
6863ctoon_api_inline ctoon_mut_val *ctoon_mut_obj_remove_key(
6864 ctoon_mut_val *obj, const char *key) {
6865 if (ctoon_likely(ctoon_mut_is_obj(obj) && key)) {
6866 size_t key_len = strlen(key);
6867 return unsafe_ctoon_mut_obj_remove(obj, key, key_len);
6872ctoon_api_inline ctoon_mut_val *ctoon_mut_obj_remove_keyn(
6873 ctoon_mut_val *obj, const char *key, size_t key_len) {
6874 if (ctoon_likely(ctoon_mut_is_obj(obj) && key)) {
6875 return unsafe_ctoon_mut_obj_remove(obj, key, key_len);
6880ctoon_api_inline bool ctoon_mut_obj_clear(ctoon_mut_val *obj) {
6881 if (ctoon_likely(ctoon_mut_is_obj(obj))) {
6882 unsafe_ctoon_set_len(obj, 0);
6888ctoon_api_inline bool ctoon_mut_obj_replace(ctoon_mut_val *obj,
6890 ctoon_mut_val *val) {
6891 if (ctoon_likely(ctoon_mut_is_obj(obj) &&
6892 ctoon_mut_is_str(key) && val)) {
6893 return unsafe_ctoon_mut_obj_replace(obj, key, val);
6898ctoon_api_inline bool ctoon_mut_obj_rotate(ctoon_mut_val *obj,
6900 if (ctoon_likely(ctoon_mut_is_obj(obj) &&
6901 unsafe_ctoon_get_len(obj) > idx)) {
6902 unsafe_ctoon_mut_obj_rotate(obj, idx);
6910/*==============================================================================
6911 * MARK: - Mutable TOON Object Modification Convenience API (Implementation)
6912 *============================================================================*/
6914#define ctoon_mut_obj_add_func(func) \
6915 if (ctoon_likely(doc && ctoon_mut_is_obj(obj) && _key)) { \
6916 ctoon_mut_val *key = unsafe_ctoon_mut_val(doc, 2); \
6917 if (ctoon_likely(key)) { \
6918 size_t len = unsafe_ctoon_get_len(obj); \
6919 ctoon_mut_val *val = key + 1; \
6920 size_t key_len = strlen(_key); \
6921 bool noesc = unsafe_ctoon_is_str_noesc(_key, key_len); \
6922 key->tag = CTOON_TYPE_STR; \
6923 key->tag |= noesc ? CTOON_SUBTYPE_NOESC : CTOON_SUBTYPE_NONE; \
6924 key->tag |= (uint64_t)strlen(_key) << CTOON_TAG_BIT; \
6925 key->uni.str = _key; \
6927 unsafe_ctoon_mut_obj_add(obj, key, val, len); \
6933ctoon_api_inline bool ctoon_mut_obj_add_null(ctoon_mut_doc *doc,
6936 ctoon_mut_obj_add_func({ unsafe_ctoon_set_null(val); });
6939ctoon_api_inline bool ctoon_mut_obj_add_true(ctoon_mut_doc *doc,
6942 ctoon_mut_obj_add_func({ unsafe_ctoon_set_bool(val, true); });
6945ctoon_api_inline bool ctoon_mut_obj_add_false(ctoon_mut_doc *doc,
6948 ctoon_mut_obj_add_func({ unsafe_ctoon_set_bool(val, false); });
6951ctoon_api_inline bool ctoon_mut_obj_add_bool(ctoon_mut_doc *doc,
6955 ctoon_mut_obj_add_func({ unsafe_ctoon_set_bool(val, _val); });
6958ctoon_api_inline bool ctoon_mut_obj_add_uint(ctoon_mut_doc *doc,
6962 ctoon_mut_obj_add_func({ unsafe_ctoon_set_uint(val, _val); });
6965ctoon_api_inline bool ctoon_mut_obj_add_sint(ctoon_mut_doc *doc,
6969 ctoon_mut_obj_add_func({ unsafe_ctoon_set_sint(val, _val); });
6972ctoon_api_inline bool ctoon_mut_obj_add_int(ctoon_mut_doc *doc,
6976 ctoon_mut_obj_add_func({ unsafe_ctoon_set_sint(val, _val); });
6979ctoon_api_inline bool ctoon_mut_obj_add_float(ctoon_mut_doc *doc,
6983 ctoon_mut_obj_add_func({ unsafe_ctoon_set_float(val, _val); });
6986ctoon_api_inline bool ctoon_mut_obj_add_double(ctoon_mut_doc *doc,
6990 ctoon_mut_obj_add_func({ unsafe_ctoon_set_double(val, _val); });
6993ctoon_api_inline bool ctoon_mut_obj_add_real(ctoon_mut_doc *doc,
6997 ctoon_mut_obj_add_func({ unsafe_ctoon_set_real(val, _val); });
7000ctoon_api_inline bool ctoon_mut_obj_add_str(ctoon_mut_doc *doc,
7004 if (ctoon_unlikely(!_val)) return false;
7005 ctoon_mut_obj_add_func({
7006 size_t val_len = strlen(_val);
7007 bool val_noesc = unsafe_ctoon_is_str_noesc(_val, val_len);
7008 val->tag = ((uint64_t)strlen(_val) << CTOON_TAG_BIT) | CTOON_TYPE_STR;
7009 val->tag |= val_noesc ? CTOON_SUBTYPE_NOESC : CTOON_SUBTYPE_NONE;
7010 val->uni.str = _val;
7014ctoon_api_inline bool ctoon_mut_obj_add_strn(ctoon_mut_doc *doc,
7019 if (ctoon_unlikely(!_val)) return false;
7020 ctoon_mut_obj_add_func({
7021 val->tag = ((uint64_t)_len << CTOON_TAG_BIT) | CTOON_TYPE_STR;
7022 val->uni.str = _val;
7026ctoon_api_inline bool ctoon_mut_obj_add_strcpy(ctoon_mut_doc *doc,
7030 if (ctoon_unlikely(!_val)) return false;
7031 ctoon_mut_obj_add_func({
7032 size_t _len = strlen(_val);
7033 val->uni.str = unsafe_ctoon_mut_strncpy(doc, _val, _len);
7034 if (ctoon_unlikely(!val->uni.str)) return false;
7035 val->tag = ((uint64_t)_len << CTOON_TAG_BIT) | CTOON_TYPE_STR;
7039ctoon_api_inline bool ctoon_mut_obj_add_strncpy(ctoon_mut_doc *doc,
7044 if (ctoon_unlikely(!_val)) return false;
7045 ctoon_mut_obj_add_func({
7046 val->uni.str = unsafe_ctoon_mut_strncpy(doc, _val, _len);
7047 if (ctoon_unlikely(!val->uni.str)) return false;
7048 val->tag = ((uint64_t)_len << CTOON_TAG_BIT) | CTOON_TYPE_STR;
7052ctoon_api_inline ctoon_mut_val *ctoon_mut_obj_add_arr(ctoon_mut_doc *doc,
7055 ctoon_mut_val *key = ctoon_mut_str(doc, _key);
7056 ctoon_mut_val *val = ctoon_mut_arr(doc);
7057 return ctoon_mut_obj_add(obj, key, val) ? val : NULL;
7060ctoon_api_inline ctoon_mut_val *ctoon_mut_obj_add_obj(ctoon_mut_doc *doc,
7063 ctoon_mut_val *key = ctoon_mut_str(doc, _key);
7064 ctoon_mut_val *val = ctoon_mut_obj(doc);
7065 return ctoon_mut_obj_add(obj, key, val) ? val : NULL;
7068ctoon_api_inline bool ctoon_mut_obj_add_val(ctoon_mut_doc *doc,
7071 ctoon_mut_val *_val) {
7072 if (ctoon_unlikely(!_val)) return false;
7073 ctoon_mut_obj_add_func({
7078ctoon_api_inline ctoon_mut_val *ctoon_mut_obj_remove_str(ctoon_mut_val *obj,
7080 return ctoon_mut_obj_remove_strn(obj, key, key ? strlen(key) : 0);
7083ctoon_api_inline ctoon_mut_val *ctoon_mut_obj_remove_strn(
7084 ctoon_mut_val *obj, const char *_key, size_t _len) {
7085 if (ctoon_likely(ctoon_mut_is_obj(obj) && _key)) {
7087 ctoon_mut_obj_iter iter;
7088 ctoon_mut_val *val_removed = NULL;
7089 ctoon_mut_obj_iter_init(obj, &iter);
7090 while ((key = ctoon_mut_obj_iter_next(&iter)) != NULL) {
7091 if (unsafe_ctoon_equals_strn(key, _key, _len)) {
7092 if (!val_removed) val_removed = key->next;
7093 ctoon_mut_obj_iter_remove(&iter);
7101ctoon_api_inline bool ctoon_mut_obj_rename_key(ctoon_mut_doc *doc,
7104 const char *new_key) {
7105 if (!key || !new_key) return false;
7106 return ctoon_mut_obj_rename_keyn(doc, obj, key, strlen(key),
7107 new_key, strlen(new_key));
7110ctoon_api_inline bool ctoon_mut_obj_rename_keyn(ctoon_mut_doc *doc,
7114 const char *new_key,
7116 char *cpy_key = NULL;
7117 ctoon_mut_val *old_key;
7118 ctoon_mut_obj_iter iter;
7119 if (!doc || !obj || !key || !new_key) return false;
7120 ctoon_mut_obj_iter_init(obj, &iter);
7121 while ((old_key = ctoon_mut_obj_iter_next(&iter))) {
7122 if (unsafe_ctoon_equals_strn((void *)old_key, key, len)) {
7124 cpy_key = unsafe_ctoon_mut_strncpy(doc, new_key, new_len);
7125 if (!cpy_key) return false;
7127 ctoon_mut_set_strn(old_key, cpy_key, new_len);
7130 return cpy_key != NULL;
7135#if !defined(CTOON_DISABLE_UTILS) || !CTOON_DISABLE_UTILS
7137/*==============================================================================
7138 * MARK: - TOON Pointer API (Implementation)
7139 *============================================================================*/
7141#define ctoon_ptr_set_err(_code, _msg) do { \
7143 err->code = CTOON_PTR_ERR_##_code; \
7149/* require: val != NULL, *ptr == '/', len > 0 */
7150ctoon_api ctoon_val *unsafe_ctoon_ptr_getx(ctoon_val *val,
7151 const char *ptr, size_t len,
7152 ctoon_ptr_err *err);
7154/* require: val != NULL, *ptr == '/', len > 0 */
7155ctoon_api ctoon_mut_val *unsafe_ctoon_mut_ptr_getx(ctoon_mut_val *val,
7159 ctoon_ptr_err *err);
7161/* require: val/new_val/doc != NULL, *ptr == '/', len > 0 */
7162ctoon_api bool unsafe_ctoon_mut_ptr_putx(ctoon_mut_val *val,
7163 const char *ptr, size_t len,
7164 ctoon_mut_val *new_val,
7166 bool create_parent, bool insert_new,
7168 ctoon_ptr_err *err);
7170/* require: val/err != NULL, *ptr == '/', len > 0 */
7171ctoon_api ctoon_mut_val *unsafe_ctoon_mut_ptr_replacex(
7172 ctoon_mut_val *val, const char *ptr, size_t len, ctoon_mut_val *new_val,
7173 ctoon_ptr_ctx *ctx, ctoon_ptr_err *err);
7175/* require: val/err != NULL, *ptr == '/', len > 0 */
7176ctoon_api ctoon_mut_val *unsafe_ctoon_mut_ptr_removex(ctoon_mut_val *val,
7180 ctoon_ptr_err *err);
7182ctoon_api_inline ctoon_val *ctoon_doc_ptr_get(ctoon_doc *doc,
7184 if (ctoon_unlikely(!ptr)) return NULL;
7185 return ctoon_doc_ptr_getn(doc, ptr, strlen(ptr));
7188ctoon_api_inline ctoon_val *ctoon_doc_ptr_getn(ctoon_doc *doc,
7189 const char *ptr, size_t len) {
7190 return ctoon_doc_ptr_getx(doc, ptr, len, NULL);
7193ctoon_api_inline ctoon_val *ctoon_doc_ptr_getx(ctoon_doc *doc,
7194 const char *ptr, size_t len,
7195 ctoon_ptr_err *err) {
7196 ctoon_ptr_set_err(NONE, NULL);
7197 if (ctoon_unlikely(!doc || !ptr)) {
7198 ctoon_ptr_set_err(PARAMETER, "input parameter is NULL");
7201 if (ctoon_unlikely(!doc->root)) {
7202 ctoon_ptr_set_err(NULL_ROOT, "document's root is NULL");
7205 if (ctoon_unlikely(len == 0)) {
7208 if (ctoon_unlikely(*ptr != '/')) {
7209 ctoon_ptr_set_err(SYNTAX, "no prefix '/'");
7212 return unsafe_ctoon_ptr_getx(doc->root, ptr, len, err);
7215ctoon_api_inline ctoon_val *ctoon_ptr_get(ctoon_val *val,
7217 if (ctoon_unlikely(!ptr)) return NULL;
7218 return ctoon_ptr_getn(val, ptr, strlen(ptr));
7221ctoon_api_inline ctoon_val *ctoon_ptr_getn(ctoon_val *val,
7222 const char *ptr, size_t len) {
7223 return ctoon_ptr_getx(val, ptr, len, NULL);
7226ctoon_api_inline ctoon_val *ctoon_ptr_getx(ctoon_val *val,
7227 const char *ptr, size_t len,
7228 ctoon_ptr_err *err) {
7229 ctoon_ptr_set_err(NONE, NULL);
7230 if (ctoon_unlikely(!val || !ptr)) {
7231 ctoon_ptr_set_err(PARAMETER, "input parameter is NULL");
7234 if (ctoon_unlikely(len == 0)) {
7237 if (ctoon_unlikely(*ptr != '/')) {
7238 ctoon_ptr_set_err(SYNTAX, "no prefix '/'");
7241 return unsafe_ctoon_ptr_getx(val, ptr, len, err);
7244ctoon_api_inline ctoon_mut_val *ctoon_mut_doc_ptr_get(ctoon_mut_doc *doc,
7246 if (!ptr) return NULL;
7247 return ctoon_mut_doc_ptr_getn(doc, ptr, strlen(ptr));
7250ctoon_api_inline ctoon_mut_val *ctoon_mut_doc_ptr_getn(ctoon_mut_doc *doc,
7253 return ctoon_mut_doc_ptr_getx(doc, ptr, len, NULL, NULL);
7256ctoon_api_inline ctoon_mut_val *ctoon_mut_doc_ptr_getx(ctoon_mut_doc *doc,
7260 ctoon_ptr_err *err) {
7261 ctoon_ptr_set_err(NONE, NULL);
7262 if (ctx) memset(ctx, 0, sizeof(*ctx));
7264 if (ctoon_unlikely(!doc || !ptr)) {
7265 ctoon_ptr_set_err(PARAMETER, "input parameter is NULL");
7268 if (ctoon_unlikely(!doc->root)) {
7269 ctoon_ptr_set_err(NULL_ROOT, "document's root is NULL");
7272 if (ctoon_unlikely(len == 0)) {
7275 if (ctoon_unlikely(*ptr != '/')) {
7276 ctoon_ptr_set_err(SYNTAX, "no prefix '/'");
7279 return unsafe_ctoon_mut_ptr_getx(doc->root, ptr, len, ctx, err);
7282ctoon_api_inline ctoon_mut_val *ctoon_mut_ptr_get(ctoon_mut_val *val,
7284 if (!ptr) return NULL;
7285 return ctoon_mut_ptr_getn(val, ptr, strlen(ptr));
7288ctoon_api_inline ctoon_mut_val *ctoon_mut_ptr_getn(ctoon_mut_val *val,
7291 return ctoon_mut_ptr_getx(val, ptr, len, NULL, NULL);
7294ctoon_api_inline ctoon_mut_val *ctoon_mut_ptr_getx(ctoon_mut_val *val,
7298 ctoon_ptr_err *err) {
7299 ctoon_ptr_set_err(NONE, NULL);
7300 if (ctx) memset(ctx, 0, sizeof(*ctx));
7302 if (ctoon_unlikely(!val || !ptr)) {
7303 ctoon_ptr_set_err(PARAMETER, "input parameter is NULL");
7306 if (ctoon_unlikely(len == 0)) {
7309 if (ctoon_unlikely(*ptr != '/')) {
7310 ctoon_ptr_set_err(SYNTAX, "no prefix '/'");
7313 return unsafe_ctoon_mut_ptr_getx(val, ptr, len, ctx, err);
7316ctoon_api_inline bool ctoon_mut_doc_ptr_add(ctoon_mut_doc *doc,
7318 ctoon_mut_val *new_val) {
7319 if (ctoon_unlikely(!ptr)) return false;
7320 return ctoon_mut_doc_ptr_addn(doc, ptr, strlen(ptr), new_val);
7323ctoon_api_inline bool ctoon_mut_doc_ptr_addn(ctoon_mut_doc *doc,
7326 ctoon_mut_val *new_val) {
7327 return ctoon_mut_doc_ptr_addx(doc, ptr, len, new_val, true, NULL, NULL);
7330ctoon_api_inline bool ctoon_mut_doc_ptr_addx(ctoon_mut_doc *doc,
7331 const char *ptr, size_t len,
7332 ctoon_mut_val *new_val,
7335 ctoon_ptr_err *err) {
7336 ctoon_ptr_set_err(NONE, NULL);
7337 if (ctx) memset(ctx, 0, sizeof(*ctx));
7339 if (ctoon_unlikely(!doc || !ptr || !new_val)) {
7340 ctoon_ptr_set_err(PARAMETER, "input parameter is NULL");
7343 if (ctoon_unlikely(len == 0)) {
7345 ctoon_ptr_set_err(SET_ROOT, "cannot set document's root");
7348 doc->root = new_val;
7352 if (ctoon_unlikely(*ptr != '/')) {
7353 ctoon_ptr_set_err(SYNTAX, "no prefix '/'");
7356 if (ctoon_unlikely(!doc->root && !create_parent)) {
7357 ctoon_ptr_set_err(NULL_ROOT, "document's root is NULL");
7360 if (ctoon_unlikely(!doc->root)) {
7361 ctoon_mut_val *root = ctoon_mut_obj(doc);
7362 if (ctoon_unlikely(!root)) {
7363 ctoon_ptr_set_err(MEMORY_ALLOCATION, "failed to create value");
7366 if (unsafe_ctoon_mut_ptr_putx(root, ptr, len, new_val, doc,
7367 create_parent, true, ctx, err)) {
7373 return unsafe_ctoon_mut_ptr_putx(doc->root, ptr, len, new_val, doc,
7374 create_parent, true, ctx, err);
7377ctoon_api_inline bool ctoon_mut_ptr_add(ctoon_mut_val *val,
7379 ctoon_mut_val *new_val,
7380 ctoon_mut_doc *doc) {
7381 if (ctoon_unlikely(!ptr)) return false;
7382 return ctoon_mut_ptr_addn(val, ptr, strlen(ptr), new_val, doc);
7385ctoon_api_inline bool ctoon_mut_ptr_addn(ctoon_mut_val *val,
7386 const char *ptr, size_t len,
7387 ctoon_mut_val *new_val,
7388 ctoon_mut_doc *doc) {
7389 return ctoon_mut_ptr_addx(val, ptr, len, new_val, doc, true, NULL, NULL);
7392ctoon_api_inline bool ctoon_mut_ptr_addx(ctoon_mut_val *val,
7393 const char *ptr, size_t len,
7394 ctoon_mut_val *new_val,
7398 ctoon_ptr_err *err) {
7399 ctoon_ptr_set_err(NONE, NULL);
7400 if (ctx) memset(ctx, 0, sizeof(*ctx));
7402 if (ctoon_unlikely(!val || !ptr || !new_val || !doc)) {
7403 ctoon_ptr_set_err(PARAMETER, "input parameter is NULL");
7406 if (ctoon_unlikely(len == 0)) {
7407 ctoon_ptr_set_err(SET_ROOT, "cannot set root");
7410 if (ctoon_unlikely(*ptr != '/')) {
7411 ctoon_ptr_set_err(SYNTAX, "no prefix '/'");
7414 return unsafe_ctoon_mut_ptr_putx(val, ptr, len, new_val,
7415 doc, create_parent, true, ctx, err);
7418ctoon_api_inline bool ctoon_mut_doc_ptr_set(ctoon_mut_doc *doc,
7420 ctoon_mut_val *new_val) {
7421 if (ctoon_unlikely(!ptr)) return false;
7422 return ctoon_mut_doc_ptr_setn(doc, ptr, strlen(ptr), new_val);
7425ctoon_api_inline bool ctoon_mut_doc_ptr_setn(ctoon_mut_doc *doc,
7426 const char *ptr, size_t len,
7427 ctoon_mut_val *new_val) {
7428 return ctoon_mut_doc_ptr_setx(doc, ptr, len, new_val, true, NULL, NULL);
7431ctoon_api_inline bool ctoon_mut_doc_ptr_setx(ctoon_mut_doc *doc,
7432 const char *ptr, size_t len,
7433 ctoon_mut_val *new_val,
7436 ctoon_ptr_err *err) {
7437 ctoon_ptr_set_err(NONE, NULL);
7438 if (ctx) memset(ctx, 0, sizeof(*ctx));
7440 if (ctoon_unlikely(!doc || !ptr)) {
7441 ctoon_ptr_set_err(PARAMETER, "input parameter is NULL");
7444 if (ctoon_unlikely(len == 0)) {
7445 if (ctx) ctx->old = doc->root;
7446 doc->root = new_val;
7449 if (ctoon_unlikely(*ptr != '/')) {
7450 ctoon_ptr_set_err(SYNTAX, "no prefix '/'");
7455 ctoon_ptr_set_err(RESOLVE, "TOON pointer cannot be resolved");
7458 return !!unsafe_ctoon_mut_ptr_removex(doc->root, ptr, len, ctx, err);
7460 if (ctoon_unlikely(!doc->root && !create_parent)) {
7461 ctoon_ptr_set_err(NULL_ROOT, "document's root is NULL");
7464 if (ctoon_unlikely(!doc->root)) {
7465 ctoon_mut_val *root = ctoon_mut_obj(doc);
7466 if (ctoon_unlikely(!root)) {
7467 ctoon_ptr_set_err(MEMORY_ALLOCATION, "failed to create value");
7470 if (unsafe_ctoon_mut_ptr_putx(root, ptr, len, new_val, doc,
7471 create_parent, false, ctx, err)) {
7477 return unsafe_ctoon_mut_ptr_putx(doc->root, ptr, len, new_val, doc,
7478 create_parent, false, ctx, err);
7481ctoon_api_inline bool ctoon_mut_ptr_set(ctoon_mut_val *val,
7483 ctoon_mut_val *new_val,
7484 ctoon_mut_doc *doc) {
7485 if (ctoon_unlikely(!ptr)) return false;
7486 return ctoon_mut_ptr_setn(val, ptr, strlen(ptr), new_val, doc);
7489ctoon_api_inline bool ctoon_mut_ptr_setn(ctoon_mut_val *val,
7490 const char *ptr, size_t len,
7491 ctoon_mut_val *new_val,
7492 ctoon_mut_doc *doc) {
7493 return ctoon_mut_ptr_setx(val, ptr, len, new_val, doc, true, NULL, NULL);
7496ctoon_api_inline bool ctoon_mut_ptr_setx(ctoon_mut_val *val,
7497 const char *ptr, size_t len,
7498 ctoon_mut_val *new_val,
7502 ctoon_ptr_err *err) {
7503 ctoon_ptr_set_err(NONE, NULL);
7504 if (ctx) memset(ctx, 0, sizeof(*ctx));
7506 if (ctoon_unlikely(!val || !ptr || !doc)) {
7507 ctoon_ptr_set_err(PARAMETER, "input parameter is NULL");
7510 if (ctoon_unlikely(len == 0)) {
7511 ctoon_ptr_set_err(SET_ROOT, "cannot set root");
7514 if (ctoon_unlikely(*ptr != '/')) {
7515 ctoon_ptr_set_err(SYNTAX, "no prefix '/'");
7519 return !!unsafe_ctoon_mut_ptr_removex(val, ptr, len, ctx, err);
7521 return unsafe_ctoon_mut_ptr_putx(val, ptr, len, new_val, doc,
7522 create_parent, false, ctx, err);
7525ctoon_api_inline ctoon_mut_val *ctoon_mut_doc_ptr_replace(
7526 ctoon_mut_doc *doc, const char *ptr, ctoon_mut_val *new_val) {
7527 if (!ptr) return NULL;
7528 return ctoon_mut_doc_ptr_replacen(doc, ptr, strlen(ptr), new_val);
7531ctoon_api_inline ctoon_mut_val *ctoon_mut_doc_ptr_replacen(
7532 ctoon_mut_doc *doc, const char *ptr, size_t len, ctoon_mut_val *new_val) {
7533 return ctoon_mut_doc_ptr_replacex(doc, ptr, len, new_val, NULL, NULL);
7536ctoon_api_inline ctoon_mut_val *ctoon_mut_doc_ptr_replacex(
7537 ctoon_mut_doc *doc, const char *ptr, size_t len, ctoon_mut_val *new_val,
7538 ctoon_ptr_ctx *ctx, ctoon_ptr_err *err) {
7540 ctoon_ptr_set_err(NONE, NULL);
7541 if (ctx) memset(ctx, 0, sizeof(*ctx));
7543 if (ctoon_unlikely(!doc || !ptr || !new_val)) {
7544 ctoon_ptr_set_err(PARAMETER, "input parameter is NULL");
7547 if (ctoon_unlikely(len == 0)) {
7548 ctoon_mut_val *root = doc->root;
7549 if (ctoon_unlikely(!root)) {
7550 ctoon_ptr_set_err(RESOLVE, "TOON pointer cannot be resolved");
7553 if (ctx) ctx->old = root;
7554 doc->root = new_val;
7557 if (ctoon_unlikely(!doc->root)) {
7558 ctoon_ptr_set_err(NULL_ROOT, "document's root is NULL");
7561 if (ctoon_unlikely(*ptr != '/')) {
7562 ctoon_ptr_set_err(SYNTAX, "no prefix '/'");
7565 return unsafe_ctoon_mut_ptr_replacex(doc->root, ptr, len, new_val,
7569ctoon_api_inline ctoon_mut_val *ctoon_mut_ptr_replace(
7570 ctoon_mut_val *val, const char *ptr, ctoon_mut_val *new_val) {
7571 if (!ptr) return NULL;
7572 return ctoon_mut_ptr_replacen(val, ptr, strlen(ptr), new_val);
7575ctoon_api_inline ctoon_mut_val *ctoon_mut_ptr_replacen(
7576 ctoon_mut_val *val, const char *ptr, size_t len, ctoon_mut_val *new_val) {
7577 return ctoon_mut_ptr_replacex(val, ptr, len, new_val, NULL, NULL);
7580ctoon_api_inline ctoon_mut_val *ctoon_mut_ptr_replacex(
7581 ctoon_mut_val *val, const char *ptr, size_t len, ctoon_mut_val *new_val,
7582 ctoon_ptr_ctx *ctx, ctoon_ptr_err *err) {
7584 ctoon_ptr_set_err(NONE, NULL);
7585 if (ctx) memset(ctx, 0, sizeof(*ctx));
7587 if (ctoon_unlikely(!val || !ptr || !new_val)) {
7588 ctoon_ptr_set_err(PARAMETER, "input parameter is NULL");
7591 if (ctoon_unlikely(len == 0)) {
7592 ctoon_ptr_set_err(SET_ROOT, "cannot set root");
7595 if (ctoon_unlikely(*ptr != '/')) {
7596 ctoon_ptr_set_err(SYNTAX, "no prefix '/'");
7599 return unsafe_ctoon_mut_ptr_replacex(val, ptr, len, new_val, ctx, err);
7602ctoon_api_inline ctoon_mut_val *ctoon_mut_doc_ptr_remove(
7603 ctoon_mut_doc *doc, const char *ptr) {
7604 if (!ptr) return NULL;
7605 return ctoon_mut_doc_ptr_removen(doc, ptr, strlen(ptr));
7608ctoon_api_inline ctoon_mut_val *ctoon_mut_doc_ptr_removen(
7609 ctoon_mut_doc *doc, const char *ptr, size_t len) {
7610 return ctoon_mut_doc_ptr_removex(doc, ptr, len, NULL, NULL);
7613ctoon_api_inline ctoon_mut_val *ctoon_mut_doc_ptr_removex(
7614 ctoon_mut_doc *doc, const char *ptr, size_t len,
7615 ctoon_ptr_ctx *ctx, ctoon_ptr_err *err) {
7617 ctoon_ptr_set_err(NONE, NULL);
7618 if (ctx) memset(ctx, 0, sizeof(*ctx));
7620 if (ctoon_unlikely(!doc || !ptr)) {
7621 ctoon_ptr_set_err(PARAMETER, "input parameter is NULL");
7624 if (ctoon_unlikely(!doc->root)) {
7625 ctoon_ptr_set_err(NULL_ROOT, "document's root is NULL");
7628 if (ctoon_unlikely(len == 0)) {
7629 ctoon_mut_val *root = doc->root;
7630 if (ctx) ctx->old = root;
7634 if (ctoon_unlikely(*ptr != '/')) {
7635 ctoon_ptr_set_err(SYNTAX, "no prefix '/'");
7638 return unsafe_ctoon_mut_ptr_removex(doc->root, ptr, len, ctx, err);
7641ctoon_api_inline ctoon_mut_val *ctoon_mut_ptr_remove(ctoon_mut_val *val,
7643 if (!ptr) return NULL;
7644 return ctoon_mut_ptr_removen(val, ptr, strlen(ptr));
7647ctoon_api_inline ctoon_mut_val *ctoon_mut_ptr_removen(ctoon_mut_val *val,
7650 return ctoon_mut_ptr_removex(val, ptr, len, NULL, NULL);
7653ctoon_api_inline ctoon_mut_val *ctoon_mut_ptr_removex(ctoon_mut_val *val,
7657 ctoon_ptr_err *err) {
7658 ctoon_ptr_set_err(NONE, NULL);
7659 if (ctx) memset(ctx, 0, sizeof(*ctx));
7661 if (ctoon_unlikely(!val || !ptr)) {
7662 ctoon_ptr_set_err(PARAMETER, "input parameter is NULL");
7665 if (ctoon_unlikely(len == 0)) {
7666 ctoon_ptr_set_err(SET_ROOT, "cannot set root");
7669 if (ctoon_unlikely(*ptr != '/')) {
7670 ctoon_ptr_set_err(SYNTAX, "no prefix '/'");
7673 return unsafe_ctoon_mut_ptr_removex(val, ptr, len, ctx, err);
7676ctoon_api_inline bool ctoon_ptr_ctx_append(ctoon_ptr_ctx *ctx,
7678 ctoon_mut_val *val) {
7679 ctoon_mut_val *ctn, *pre_key, *pre_val, *cur_key, *cur_val;
7680 if (!ctx || !ctx->ctn || !val) return false;
7683 if (ctoon_mut_is_obj(ctn)) {
7684 if (!key) return false;
7687 if (unsafe_ctoon_get_len(ctn) == 0) {
7691 } else if (!pre_key) {
7692 pre_key = (ctoon_mut_val *)ctn->uni.ptr;
7693 pre_val = pre_key->next;
7694 val->next = pre_val->next;
7695 pre_val->next = key;
7699 cur_key = pre_key->next->next;
7700 cur_val = cur_key->next;
7701 val->next = cur_val->next;
7702 cur_val->next = key;
7703 if (ctn->uni.ptr == cur_key) ctn->uni.ptr = key;
7708 if (unsafe_ctoon_get_len(ctn) == 0) {
7712 } else if (!pre_val) {
7713 pre_val = (ctoon_mut_val *)ctn->uni.ptr;
7714 val->next = pre_val->next;
7715 pre_val->next = val;
7719 cur_val = pre_val->next;
7720 val->next = cur_val->next;
7721 cur_val->next = val;
7722 if (ctn->uni.ptr == cur_val) ctn->uni.ptr = val;
7726 unsafe_ctoon_inc_len(ctn);
7730ctoon_api_inline bool ctoon_ptr_ctx_replace(ctoon_ptr_ctx *ctx,
7731 ctoon_mut_val *val) {
7732 ctoon_mut_val *ctn, *pre_key, *cur_key, *pre_val, *cur_val;
7733 if (!ctx || !ctx->ctn || !ctx->pre || !val) return false;
7735 if (ctoon_mut_is_obj(ctn)) {
7737 pre_val = pre_key->next;
7738 cur_key = pre_val->next;
7739 cur_val = cur_key->next;
7740 /* replace current value */
7741 cur_key->next = val;
7742 val->next = cur_val->next;
7746 cur_val = pre_val->next;
7747 /* replace current value */
7748 if (pre_val != cur_val) {
7749 val->next = cur_val->next;
7750 pre_val->next = val;
7751 if (ctn->uni.ptr == cur_val) ctn->uni.ptr = val;
7762ctoon_api_inline bool ctoon_ptr_ctx_remove(ctoon_ptr_ctx *ctx) {
7763 ctoon_mut_val *ctn, *pre_key, *pre_val, *cur_key, *cur_val;
7765 if (!ctx || !ctx->ctn || !ctx->pre) return false;
7767 if (ctoon_mut_is_obj(ctn)) {
7769 pre_val = pre_key->next;
7770 cur_key = pre_val->next;
7771 cur_val = cur_key->next;
7772 /* remove current key-value */
7773 pre_val->next = cur_val->next;
7774 if (ctn->uni.ptr == cur_key) ctn->uni.ptr = pre_key;
7779 cur_val = pre_val->next;
7780 /* remove current key-value */
7781 pre_val->next = cur_val->next;
7782 if (ctn->uni.ptr == cur_val) ctn->uni.ptr = pre_val;
7786 len = unsafe_ctoon_get_len(ctn) - 1;
7787 if (len == 0) ctn->uni.ptr = NULL;
7788 unsafe_ctoon_set_len(ctn, len);
7792#undef ctoon_ptr_set_err
7796/*==============================================================================
7797 * MARK: - TOON Value at Pointer API (Implementation)
7798 *============================================================================*/
7804ctoon_api_inline bool ctoon_ptr_get_bool(
7805 ctoon_val *root, const char *ptr, bool *value) {
7806 ctoon_val *val = ctoon_ptr_get(root, ptr);
7807 if (value && ctoon_is_bool(val)) {
7808 *value = unsafe_ctoon_get_bool(val);
7819ctoon_api_inline bool ctoon_ptr_get_uint(
7820 ctoon_val *root, const char *ptr, uint64_t *value) {
7821 ctoon_val *val = ctoon_ptr_get(root, ptr);
7823 uint64_t ret = val->uni.u64;
7824 if (unsafe_ctoon_is_uint(val) ||
7825 (unsafe_ctoon_is_sint(val) && !(ret >> 63))) {
7837ctoon_api_inline bool ctoon_ptr_get_sint(
7838 ctoon_val *root, const char *ptr, int64_t *value) {
7839 ctoon_val *val = ctoon_ptr_get(root, ptr);
7841 int64_t ret = val->uni.i64;
7842 if (unsafe_ctoon_is_sint(val) ||
7843 (unsafe_ctoon_is_uint(val) && ret >= 0)) {
7855ctoon_api_inline bool ctoon_ptr_get_real(
7856 ctoon_val *root, const char *ptr, double *value) {
7857 ctoon_val *val = ctoon_ptr_get(root, ptr);
7858 if (value && ctoon_is_real(val)) {
7859 *value = unsafe_ctoon_get_real(val);
7871ctoon_api_inline bool ctoon_ptr_get_num(
7872 ctoon_val *root, const char *ptr, double *value) {
7873 ctoon_val *val = ctoon_ptr_get(root, ptr);
7874 if (value && ctoon_is_num(val)) {
7875 *value = unsafe_ctoon_get_num(val);
7886ctoon_api_inline bool ctoon_ptr_get_str(
7887 ctoon_val *root, const char *ptr, const char **value) {
7888 ctoon_val *val = ctoon_ptr_get(root, ptr);
7889 if (value && ctoon_is_str(val)) {
7890 *value = unsafe_ctoon_get_str(val);
7899/*==============================================================================
7900 * MARK: - Deprecated
7901 *============================================================================*/
7904ctoon_deprecated("renamed to ctoon_doc_ptr_get")
7905ctoon_api_inline ctoon_val *ctoon_doc_get_pointer(ctoon_doc *doc,
7907 return ctoon_doc_ptr_get(doc, ptr);
7911ctoon_deprecated("renamed to ctoon_doc_ptr_getn")
7912ctoon_api_inline ctoon_val *ctoon_doc_get_pointern(ctoon_doc *doc,
7915 return ctoon_doc_ptr_getn(doc, ptr, len);
7919ctoon_deprecated("renamed to ctoon_mut_doc_ptr_get")
7920ctoon_api_inline ctoon_mut_val *ctoon_mut_doc_get_pointer(
7921 ctoon_mut_doc *doc, const char *ptr) {
7922 return ctoon_mut_doc_ptr_get(doc, ptr);
7926ctoon_deprecated("renamed to ctoon_mut_doc_ptr_getn")
7927ctoon_api_inline ctoon_mut_val *ctoon_mut_doc_get_pointern(
7928 ctoon_mut_doc *doc, const char *ptr, size_t len) {
7929 return ctoon_mut_doc_ptr_getn(doc, ptr, len);
7933ctoon_deprecated("renamed to ctoon_ptr_get")
7934ctoon_api_inline ctoon_val *ctoon_get_pointer(ctoon_val *val,
7936 return ctoon_ptr_get(val, ptr);
7940ctoon_deprecated("renamed to ctoon_ptr_getn")
7941ctoon_api_inline ctoon_val *ctoon_get_pointern(ctoon_val *val,
7944 return ctoon_ptr_getn(val, ptr, len);
7948ctoon_deprecated("renamed to ctoon_mut_ptr_get")
7949ctoon_api_inline ctoon_mut_val *ctoon_mut_get_pointer(ctoon_mut_val *val,
7951 return ctoon_mut_ptr_get(val, ptr);
7955ctoon_deprecated("renamed to ctoon_mut_ptr_getn")
7956ctoon_api_inline ctoon_mut_val *ctoon_mut_get_pointern(ctoon_mut_val *val,
7959 return ctoon_mut_ptr_getn(val, ptr, len);
7963ctoon_deprecated("renamed to unsafe_ctoon_ptr_getn")
7964ctoon_api_inline ctoon_val *unsafe_ctoon_get_pointer(ctoon_val *val,
7968 return unsafe_ctoon_ptr_getx(val, ptr, len, &err);
7972ctoon_deprecated("renamed to unsafe_ctoon_mut_ptr_getx")
7973ctoon_api_inline ctoon_mut_val *unsafe_ctoon_mut_get_pointer(
7974 ctoon_mut_val *val, const char *ptr, size_t len) {
7976 return unsafe_ctoon_mut_ptr_getx(val, ptr, len, NULL, &err);
7979#endif /* CTOON_DISABLE_UTILS */
7983/*==============================================================================
7984 * MARK: - Compiler Hint End
7985 *============================================================================*/
7989#endif /* extern "C" end */
static ctoon_mut_val * ctoon_mut_obj_getn(ctoon_mut_val *obj, const char *key, size_t key_len)
static unsigned char ctoon_mut_set_bool(ctoon_mut_val *val, unsigned char num)
static const ctoon_read_flag CTOON_READ_STOP_WHEN_DONE
static const ctoon_write_flag CTOON_WRITE_INF_AND_NAN_AS_NULL
ctoon_doc * ctoon_read_file(const char *path, ctoon_read_flag flg, const ctoon_alc *alc, ctoon_read_err *err)
static ctoon_mut_val * ctoon_mut_arr_with_str(ctoon_mut_doc *doc, const char **vals, size_t count)
static unsigned char ctoon_arr_iter_init(ctoon_val *arr, ctoon_arr_iter *iter)
static unsigned char ctoon_mut_set_int(ctoon_mut_val *val, int num)
static ctoon_val * ctoon_doc_ptr_getx(ctoon_doc *doc, const char *ptr, size_t len, ctoon_ptr_err *err)
static unsigned char ctoon_arr_iter_has_next(ctoon_arr_iter *iter)
static unsigned char ctoon_set_uint(ctoon_val *val, uint64_t num)
static unsigned char ctoon_mut_arr_add_strn(ctoon_mut_doc *doc, ctoon_mut_val *arr, const char *str, size_t len)
static unsigned char ctoon_set_int(ctoon_val *val, int num)
static unsigned char ctoon_set_fp_to_float(ctoon_val *val, unsigned char flt)
static const ctoon_ptr_code CTOON_PTR_ERR_SYNTAX
ctoon_doc * ctoon_read_opts(char *dat, size_t len, ctoon_read_flag flg, const ctoon_alc *alc, ctoon_read_err *err)
static unsigned char ctoon_mut_arr_iter_has_next(ctoon_mut_arr_iter *iter)
static unsigned char ctoon_mut_arr_add_real(ctoon_mut_doc *doc, ctoon_mut_val *arr, double num)
static ctoon_mut_val * ctoon_mut_arr_with_uint16(ctoon_mut_doc *doc, const uint16_t *vals, size_t count)
static ctoon_val * ctoon_doc_get_root(ctoon_doc *doc)
static const ctoon_read_code CTOON_READ_ERROR_MEMORY_ALLOCATION
static unsigned char ctoon_ptr_ctx_remove(ctoon_ptr_ctx *ctx)
static const ctoon_write_flag CTOON_WRITE_ALLOW_INVALID_UNICODE
static ctoon_mut_val * ctoon_mut_arr_with_strn(ctoon_mut_doc *doc, const char **vals, const size_t *lens, size_t count)
static ctoon_mut_val * ctoon_mut_doc_ptr_removex(ctoon_mut_doc *doc, const char *ptr, size_t len, ctoon_ptr_ctx *ctx, ctoon_ptr_err *err)
static unsigned char ctoon_mut_arr_add_val(ctoon_mut_val *arr, ctoon_mut_val *val)
static unsigned char ctoon_set_str_noesc(ctoon_val *val, unsigned char noesc)
static ctoon_mut_val * ctoon_mut_arr_with_double(ctoon_mut_doc *doc, const double *vals, size_t count)
static unsigned char ctoon_set_sint(ctoon_val *val, int64_t num)
char * ctoon_mut_doc_to_json(const ctoon_mut_doc *doc, int indent, ctoon_write_flag flags, const ctoon_alc *alc, size_t *len, ctoon_write_err *err)
static ctoon_val * ctoon_ptr_getn(ctoon_val *val, const char *ptr, size_t len)
static ctoon_mut_val * ctoon_mut_arr_add_arr(ctoon_mut_doc *doc, ctoon_mut_val *arr)
char * ctoon_doc_to_json(const ctoon_doc *doc, int indent, ctoon_write_flag flags, const ctoon_alc *alc, size_t *len, ctoon_write_err *err)
static ctoon_val * ctoon_doc_ptr_get(ctoon_doc *doc, const char *ptr)
static unsigned char ctoon_mut_is_obj(ctoon_mut_val *val)
static ctoon_mut_val * ctoon_mut_arr_with_sint64(ctoon_mut_doc *doc, const int64_t *vals, size_t count)
static ctoon_mut_val * ctoon_mut_arr_iter_next(ctoon_mut_arr_iter *iter)
static unsigned char ctoon_ptr_ctx_replace(ctoon_ptr_ctx *ctx, ctoon_mut_val *val)
static ctoon_mut_val * ctoon_mut_ptr_getx(ctoon_mut_val *val, const char *ptr, size_t len, ctoon_ptr_ctx *ctx, ctoon_ptr_err *err)
static const char * ctoon_mut_get_str(ctoon_mut_val *val)
#define ctoon_constant_p(value)
static unsigned char ctoon_mut_arr_add_sint(ctoon_mut_doc *doc, ctoon_mut_val *arr, int64_t num)
static ctoon_mut_val * ctoon_mut_arr(ctoon_mut_doc *doc)
static unsigned char ctoon_mut_set_arr(ctoon_mut_val *val)
static ctoon_mut_val * ctoon_mut_obj_remove_strn(ctoon_mut_val *obj, const char *key, size_t len)
static unsigned char ctoon_ptr_ctx_append(ctoon_ptr_ctx *ctx, ctoon_mut_val *key, ctoon_mut_val *val)
static ctoon_mut_val * ctoon_mut_obj_iter_get_val(ctoon_mut_val *key)
static unsigned char ctoon_mut_obj_add_val(ctoon_mut_doc *doc, ctoon_mut_val *obj, const char *key, ctoon_mut_val *val)
static ctoon_type ctoon_get_type(ctoon_val *val)
static const ctoon_read_flag CTOON_READ_INSITU
static const ctoon_ptr_code CTOON_PTR_ERR_NULL_ROOT
static unsigned char ctoon_is_arr(ctoon_val *val)
static unsigned char ctoon_mut_is_str(ctoon_mut_val *val)
ctoon_mut_doc * ctoon_doc_mut_copy(ctoon_doc *doc, const ctoon_alc *alc)
static ctoon_mut_val * ctoon_mut_strcpy(ctoon_mut_doc *doc, const char *str)
char * ctoon_val_write_opts(const ctoon_val *val, const ctoon_write_options *opts, const ctoon_alc *alc, size_t *len, ctoon_write_err *err)
static unsigned char ctoon_mut_arr_add_double(ctoon_mut_doc *doc, ctoon_mut_val *arr, double num)
static unsigned char ctoon_mut_equals_str(ctoon_mut_val *val, const char *str)
static unsigned char ctoon_mut_set_strn(ctoon_mut_val *val, const char *str, size_t len)
static unsigned char ctoon_mut_obj_add_null(ctoon_mut_doc *doc, ctoon_mut_val *obj, const char *key)
static ctoon_mut_val * ctoon_mut_doc_ptr_removen(ctoon_mut_doc *doc, const char *ptr, size_t len)
static unsigned char ctoon_mut_ptr_addx(ctoon_mut_val *val, const char *ptr, size_t len, ctoon_mut_val *new_val, ctoon_mut_doc *doc, unsigned char create_parent, ctoon_ptr_ctx *ctx, ctoon_ptr_err *err)
static ctoon_arr_iter ctoon_arr_iter_with(ctoon_val *arr)
static ctoon_mut_val * ctoon_mut_obj_iter_get(ctoon_mut_obj_iter *iter, const char *key)
ctoon_mut_val * ctoon_mut_val_mut_copy(ctoon_mut_doc *doc, ctoon_mut_val *val)
static ctoon_mut_val * ctoon_mut_arr_iter_remove(ctoon_mut_arr_iter *iter)
static const ctoon_write_flag CTOON_WRITE_NEWLINE_AT_END
static unsigned char ctoon_mut_set_obj(ctoon_mut_val *val)
static ctoon_mut_val * ctoon_mut_arr_with_bool(ctoon_mut_doc *doc, const unsigned char *vals, size_t count)
static unsigned char ctoon_mut_is_arr(ctoon_mut_val *val)
ctoon_doc * ctoon_mut_val_imut_copy(ctoon_mut_val *val, const ctoon_alc *alc)
static ctoon_val * ctoon_obj_iter_getn(ctoon_obj_iter *iter, const char *key, size_t key_len)
struct ctoon_incr_state ctoon_incr_state
unsigned char ctoon_mut_doc_set_val_pool_size(ctoon_mut_doc *doc, size_t count)
static unsigned char ctoon_mut_is_num(ctoon_mut_val *val)
static unsigned char ctoon_mut_arr_add_float(ctoon_mut_doc *doc, ctoon_mut_val *arr, float num)
static unsigned char ctoon_mut_set_sint(ctoon_mut_val *val, int64_t num)
static int64_t ctoon_mut_get_sint(ctoon_mut_val *val)
static const ctoon_read_code CTOON_READ_ERROR_UNEXPECTED_CONTENT
static unsigned char ctoon_mut_set_uint(ctoon_mut_val *val, uint64_t num)
static const char * ctoon_get_type_desc(ctoon_val *val)
static const ctoon_ptr_code CTOON_PTR_ERR_PARAMETER
ctoon_mut_val * ctoon_patch(ctoon_mut_doc *doc, ctoon_val *orig, ctoon_val *patch, ctoon_patch_err *err)
ctoon_mut_val * ctoon_mut_merge_patch(ctoon_mut_doc *doc, ctoon_mut_val *orig, ctoon_mut_val *patch)
static ctoon_mut_val * ctoon_mut_arr_with_sint(ctoon_mut_doc *doc, const int64_t *vals, size_t count)
static unsigned char ctoon_mut_set_double(ctoon_mut_val *val, double num)
static ctoon_mut_val * ctoon_mut_obj_iter_remove(ctoon_mut_obj_iter *iter)
static ctoon_mut_val * ctoon_mut_obj_remove_key(ctoon_mut_val *obj, const char *key)
static const ctoon_read_flag CTOON_READ_BIGNUM_AS_RAW
static ctoon_mut_val * ctoon_mut_arr_with_sint32(ctoon_mut_doc *doc, const int32_t *vals, size_t count)
unsigned char ctoon_mut_doc_set_str_pool_size(ctoon_mut_doc *doc, size_t len)
static unsigned char ctoon_mut_doc_ptr_addx(ctoon_mut_doc *doc, const char *ptr, size_t len, ctoon_mut_val *new_val, unsigned char create_parent, ctoon_ptr_ctx *ctx, ctoon_ptr_err *err)
static unsigned char ctoon_mut_arr_add_int(ctoon_mut_doc *doc, ctoon_mut_val *arr, int64_t num)
static unsigned char ctoon_mut_obj_add(ctoon_mut_val *obj, ctoon_mut_val *key, ctoon_mut_val *val)
static int ctoon_mut_get_int(ctoon_mut_val *val)
static const ctoon_read_code CTOON_READ_ERROR_LITERAL
static unsigned char ctoon_mut_is_ctn(ctoon_mut_val *val)
static unsigned char ctoon_mut_obj_insert(ctoon_mut_val *obj, ctoon_mut_val *key, ctoon_mut_val *val, size_t idx)
static unsigned char ctoon_mut_doc_ptr_add(ctoon_mut_doc *doc, const char *ptr, ctoon_mut_val *new_val)
static unsigned char ctoon_is_raw(ctoon_val *val)
static ctoon_mut_val * ctoon_mut_arr_with_strncpy(ctoon_mut_doc *doc, const char **vals, const size_t *lens, size_t count)
static ctoon_mut_val * ctoon_mut_obj_iter_next(ctoon_mut_obj_iter *iter)
void ctoon_mut_doc_free(ctoon_mut_doc *doc)
static unsigned char ctoon_mut_is_uint(ctoon_mut_val *val)
static unsigned char ctoon_get_bool(ctoon_val *val)
static unsigned char ctoon_mut_is_sint(ctoon_mut_val *val)
static ctoon_mut_val * ctoon_mut_doc_ptr_getn(ctoon_mut_doc *doc, const char *ptr, size_t len)
static unsigned char ctoon_mut_arr_add_uint(ctoon_mut_doc *doc, ctoon_mut_val *arr, uint64_t num)
static ctoon_val * ctoon_obj_iter_get_val(ctoon_val *key)
static ctoon_mut_val * ctoon_mut_int(ctoon_mut_doc *doc, int64_t num)
static unsigned char ctoon_mut_obj_iter_has_next(ctoon_mut_obj_iter *iter)
static ctoon_val * ctoon_doc_ptr_getn(ctoon_doc *doc, const char *ptr, size_t len)
static ctoon_mut_val * ctoon_mut_arr_remove(ctoon_mut_val *arr, size_t idx)
static const ctoon_read_flag CTOON_READ_ALLOW_BOM
static double ctoon_get_num(ctoon_val *val)
static unsigned char ctoon_is_uint(ctoon_val *val)
unsigned char ctoon_locate_pos(const char *str, size_t len, size_t pos, size_t *line, size_t *col, size_t *chr)
static unsigned char ctoon_mut_ptr_setx(ctoon_mut_val *val, const char *ptr, size_t len, ctoon_mut_val *new_val, ctoon_mut_doc *doc, unsigned char create_parent, ctoon_ptr_ctx *ctx, ctoon_ptr_err *err)
static int64_t ctoon_get_sint(ctoon_val *val)
char * ctoon_mut_write_opts(const ctoon_mut_doc *doc, const ctoon_write_options *opts, const ctoon_alc *alc, size_t *len, ctoon_write_err *err)
static unsigned char ctoon_obj_iter_init(ctoon_val *obj, ctoon_obj_iter *iter)
static const ctoon_patch_code CTOON_PATCH_ERROR_POINTER
static ctoon_val * ctoon_arr_get(ctoon_val *arr, size_t idx)
static unsigned char ctoon_mut_obj_rename_key(ctoon_mut_doc *doc, ctoon_mut_val *obj, const char *key, const char *new_key)
static ctoon_type ctoon_mut_get_type(ctoon_mut_val *val)
static unsigned char ctoon_is_false(ctoon_val *val)
static unsigned char ctoon_mut_obj_add_real(ctoon_mut_doc *doc, ctoon_mut_val *obj, const char *key, double val)
static char * ctoon_mut_val_write(const ctoon_mut_val *val, size_t *len)
unsigned char ctoon_write_file(const char *path, const ctoon_doc *doc, const ctoon_write_options *opts, const ctoon_alc *alc, ctoon_write_err *err)
static unsigned char ctoon_is_null(ctoon_val *val)
static unsigned char ctoon_mut_set_null(ctoon_mut_val *val)
unsigned char ctoon_write_fp(FILE *fp, const ctoon_doc *doc, const ctoon_write_options *opts, const ctoon_alc *alc, ctoon_write_err *err)
static ctoon_mut_val * ctoon_mut_ptr_remove(ctoon_mut_val *val, const char *ptr)
static unsigned char ctoon_mut_arr_add_str(ctoon_mut_doc *doc, ctoon_mut_val *arr, const char *str)
static ctoon_mut_val * ctoon_mut_ptr_removen(ctoon_mut_val *val, const char *ptr, size_t len)
static ctoon_mut_val * ctoon_mut_ptr_replacen(ctoon_mut_val *val, const char *ptr, size_t len, ctoon_mut_val *new_val)
static const ctoon_write_flag CTOON_WRITE_ESCAPE_SLASHES
static ctoon_mut_val * ctoon_mut_real(ctoon_mut_doc *doc, double num)
static ctoon_mut_val * ctoon_mut_doc_ptr_replace(ctoon_mut_doc *doc, const char *ptr, ctoon_mut_val *new_val)
static unsigned char ctoon_mut_obj_clear(ctoon_mut_val *obj)
ctoon_doc * ctoon_mut_doc_imut_copy(ctoon_mut_doc *doc, const ctoon_alc *alc)
static const ctoon_patch_code CTOON_PATCH_SUCCESS
static unsigned char ctoon_set_bool(ctoon_val *val, unsigned char num)
static unsigned char ctoon_mut_obj_add_double(ctoon_mut_doc *doc, ctoon_mut_val *obj, const char *key, double val)
static int ctoon_get_int(ctoon_val *val)
static char * ctoon_mut_write(const ctoon_mut_doc *doc, size_t *len)
static unsigned char ctoon_set_double(ctoon_val *val, double num)
static const ctoon_write_flag CTOON_WRITE_ALLOW_INF_AND_NAN
static const char * ctoon_mut_read_number(const char *dat, ctoon_mut_val *val, ctoon_read_flag flg, const ctoon_alc *alc, ctoon_read_err *err)
static const ctoon_read_flag CTOON_READ_ALLOW_SINGLE_QUOTED_STR
static ctoon_mut_val * ctoon_mut_arr_with_sint16(ctoon_mut_doc *doc, const int16_t *vals, size_t count)
static ctoon_mut_val * ctoon_mut_arr_replace(ctoon_mut_val *arr, size_t idx, ctoon_mut_val *val)
static unsigned char ctoon_mut_obj_add_bool(ctoon_mut_doc *doc, ctoon_mut_val *obj, const char *key, unsigned char val)
static unsigned char ctoon_mut_arr_clear(ctoon_mut_val *arr)
static ctoon_mut_val * ctoon_mut_arr_with_strcpy(ctoon_mut_doc *doc, const char **vals, size_t count)
static const ctoon_write_flag CTOON_WRITE_LENGTH_MARKER
static ctoon_doc * ctoon_read(const char *dat, size_t len, ctoon_read_flag flg)
static const ctoon_read_code CTOON_READ_ERROR_UNEXPECTED_END
static ctoon_mut_val * ctoon_mut_obj_with_str(ctoon_mut_doc *doc, const char **keys, const char **vals, size_t count)
ctoon_mut_val * ctoon_val_mut_copy(ctoon_mut_doc *doc, ctoon_val *val)
static const ctoon_patch_code CTOON_PATCH_ERROR_INVALID_MEMBER
static const ctoon_write_code CTOON_WRITE_ERROR_FILE_WRITE
static ctoon_mut_val * ctoon_mut_raw(ctoon_mut_doc *doc, const char *str)
static const ctoon_write_code CTOON_WRITE_SUCCESS
static const char * ctoon_get_raw(ctoon_val *val)
static ctoon_mut_val * ctoon_mut_arr_with_uint64(ctoon_mut_doc *doc, const uint64_t *vals, size_t count)
static ctoon_mut_val * ctoon_mut_double(ctoon_mut_doc *doc, double num)
static unsigned char ctoon_mut_doc_ptr_set(ctoon_mut_doc *doc, const char *ptr, ctoon_mut_val *new_val)
static const ctoon_read_flag CTOON_READ_ALLOW_UNQUOTED_KEY
static double ctoon_mut_get_num(ctoon_mut_val *val)
static unsigned char ctoon_mut_arr_add_false(ctoon_mut_doc *doc, ctoon_mut_val *arr)
static const ctoon_read_flag CTOON_READ_ALLOW_EXT_WHITESPACE
static const char * ctoon_mut_get_type_desc(ctoon_mut_val *val)
ctoon_mut_doc * ctoon_mut_doc_mut_copy(ctoon_mut_doc *doc, const ctoon_alc *alc)
static size_t ctoon_mut_arr_size(ctoon_mut_val *arr)
static const ctoon_read_code CTOON_READ_ERROR_DEPTH
static unsigned char ctoon_mut_arr_append(ctoon_mut_val *arr, ctoon_mut_val *val)
static ctoon_val * ctoon_obj_iter_next(ctoon_obj_iter *iter)
static size_t ctoon_get_len(ctoon_val *val)
static ctoon_mut_obj_iter ctoon_mut_obj_iter_with(ctoon_mut_val *obj)
static uint64_t ctoon_mut_get_uint(ctoon_mut_val *val)
static const ctoon_write_code CTOON_WRITE_ERROR_INVALID_PARAMETER
static const ctoon_read_flag CTOON_READ_ALLOW_EXT_NUMBER
static unsigned char ctoon_mut_set_str(ctoon_mut_val *val, const char *str)
static unsigned char ctoon_mut_obj_add_strn(ctoon_mut_doc *doc, ctoon_mut_val *obj, const char *key, const char *val, size_t len)
static unsigned char ctoon_mut_is_true(ctoon_mut_val *val)
static unsigned char ctoon_mut_ptr_addn(ctoon_mut_val *val, const char *ptr, size_t len, ctoon_mut_val *new_val, ctoon_mut_doc *doc)
static size_t ctoon_arr_size(ctoon_val *arr)
static const ctoon_read_code CTOON_READ_ERROR_EMPTY_CONTENT
static unsigned char ctoon_mut_ptr_setn(ctoon_mut_val *val, const char *ptr, size_t len, ctoon_mut_val *new_val, ctoon_mut_doc *doc)
static unsigned char ctoon_mut_set_str_noesc(ctoon_mut_val *val, unsigned char noesc)
static ctoon_mut_val * ctoon_mut_obj_iter_getn(ctoon_mut_obj_iter *iter, const char *key, size_t key_len)
static ctoon_mut_val * ctoon_mut_obj_with_kv(ctoon_mut_doc *doc, const char **kv_pairs, size_t pair_count)
static unsigned char ctoon_mut_obj_add_true(ctoon_mut_doc *doc, ctoon_mut_val *obj, const char *key)
static unsigned char ctoon_mut_is_bool(ctoon_mut_val *val)
static char * ctoon_write(const ctoon_doc *doc, size_t *len)
static unsigned char ctoon_mut_is_raw(ctoon_mut_val *val)
static ctoon_mut_val * ctoon_mut_arr_remove_first(ctoon_mut_val *arr)
static unsigned char ctoon_equals_strn(ctoon_val *val, const char *str, size_t len)
static ctoon_mut_val * ctoon_mut_arr_with_uint8(ctoon_mut_doc *doc, const uint8_t *vals, size_t count)
static unsigned char ctoon_mut_obj_add_str(ctoon_mut_doc *doc, ctoon_mut_val *obj, const char *key, const char *val)
static double ctoon_mut_get_real(ctoon_mut_val *val)
static ctoon_val * ctoon_obj_iter_get(ctoon_obj_iter *iter, const char *key)
static const ctoon_ptr_code CTOON_PTR_ERR_MEMORY_ALLOCATION
static unsigned char ctoon_set_null(ctoon_val *val)
static unsigned char ctoon_mut_obj_add_float(ctoon_mut_doc *doc, ctoon_mut_val *obj, const char *key, float val)
unsigned char ctoon_mut_write_file(const char *path, const ctoon_mut_doc *doc, const ctoon_write_options *opts, const ctoon_alc *alc, ctoon_write_err *err)
static unsigned char ctoon_mut_equals(ctoon_mut_val *lhs, ctoon_mut_val *rhs)
ctoon_mut_val * ctoon_merge_patch(ctoon_mut_doc *doc, ctoon_val *orig, ctoon_val *patch)
static const ctoon_read_code CTOON_READ_ERROR_FILE_READ
static unsigned char ctoon_obj_iter_has_next(ctoon_obj_iter *iter)
static ctoon_mut_val * ctoon_mut_arr_remove_last(ctoon_mut_val *arr)
static unsigned char ctoon_mut_is_null(ctoon_mut_val *val)
static const ctoon_read_flag CTOON_READ_NUMBER_AS_RAW
static unsigned char ctoon_mut_obj_add_strncpy(ctoon_mut_doc *doc, ctoon_mut_val *obj, const char *key, const char *val, size_t len)
static unsigned char ctoon_mut_set_raw(ctoon_mut_val *val, const char *raw, size_t len)
static unsigned char ctoon_mut_obj_add_int(ctoon_mut_doc *doc, ctoon_mut_val *obj, const char *key, int64_t val)
static ctoon_mut_val * ctoon_mut_rawncpy(ctoon_mut_doc *doc, const char *str, size_t len)
static unsigned char ctoon_is_str(ctoon_val *val)
static const ctoon_ptr_code CTOON_PTR_ERR_RESOLVE
static unsigned char ctoon_mut_arr_rotate(ctoon_mut_val *arr, size_t idx)
static unsigned char ctoon_mut_arr_remove_range(ctoon_mut_val *arr, size_t idx, size_t len)
static ctoon_val * ctoon_ptr_get(ctoon_val *val, const char *ptr)
static ctoon_mut_val * ctoon_mut_ptr_replace(ctoon_mut_val *val, const char *ptr, ctoon_mut_val *new_val)
static unsigned char ctoon_mut_ptr_set(ctoon_mut_val *val, const char *ptr, ctoon_mut_val *new_val, ctoon_mut_doc *doc)
static const ctoon_patch_code CTOON_PATCH_ERROR_EQUAL
static ctoon_mut_val * ctoon_mut_arr_get_first(ctoon_mut_val *arr)
static unsigned char ctoon_mut_is_false(ctoon_mut_val *val)
static const ctoon_write_code CTOON_WRITE_ERROR_INVALID_VALUE_TYPE
static unsigned char ctoon_is_int(ctoon_val *val)
static const ctoon_read_code CTOON_READ_ERROR_FILE_OPEN
static unsigned char ctoon_mut_obj_replace(ctoon_mut_val *obj, ctoon_mut_val *key, ctoon_mut_val *val)
void ctoon_incr_free(ctoon_incr_state *state)
static const ctoon_write_flag CTOON_WRITE_ESCAPE_UNICODE
static ctoon_mut_val * ctoon_mut_arr_with_uint32(ctoon_mut_doc *doc, const uint32_t *vals, size_t count)
static double ctoon_get_real(ctoon_val *val)
static ctoon_mut_val * ctoon_mut_obj_add_obj(ctoon_mut_doc *doc, ctoon_mut_val *obj, const char *key)
static const ctoon_read_flag CTOON_READ_ALLOW_TRAILING_COMMAS
static ctoon_mut_val * ctoon_mut_arr_with_uint(ctoon_mut_doc *doc, const uint64_t *vals, size_t count)
static uint8_t ctoon_get_tag(ctoon_val *val)
static unsigned char ctoon_mut_obj_add_sint(ctoon_mut_doc *doc, ctoon_mut_val *obj, const char *key, int64_t val)
static ctoon_mut_val * ctoon_mut_doc_ptr_replacen(ctoon_mut_doc *doc, const char *ptr, size_t len, ctoon_mut_val *new_val)
char * ctoon_write_opts(const ctoon_doc *doc, const ctoon_write_options *opts, const ctoon_alc *alc, size_t *len, ctoon_write_err *err)
ctoon_mut_val * ctoon_mut_patch(ctoon_mut_doc *doc, ctoon_mut_val *orig, ctoon_mut_val *patch, ctoon_patch_err *err)
static ctoon_mut_val * ctoon_mut_arr_get(ctoon_mut_val *arr, size_t idx)
static unsigned char ctoon_mut_arr_insert(ctoon_mut_val *arr, ctoon_mut_val *val, size_t idx)
static const ctoon_read_code CTOON_READ_ERROR_INVALID_NUMBER
static ctoon_mut_val * ctoon_mut_sint(ctoon_mut_doc *doc, int64_t num)
static ctoon_mut_val * ctoon_mut_true(ctoon_mut_doc *doc)
static ctoon_mut_val * ctoon_mut_ptr_replacex(ctoon_mut_val *val, const char *ptr, size_t len, ctoon_mut_val *new_val, ctoon_ptr_ctx *ctx, ctoon_ptr_err *err)
static uint64_t ctoon_get_uint(ctoon_val *val)
ctoon_alc * ctoon_alc_dyn_new(void)
static size_t ctoon_read_max_memory_usage(size_t len, ctoon_read_flag flg)
static unsigned char ctoon_mut_obj_iter_init(ctoon_mut_val *obj, ctoon_mut_obj_iter *iter)
static ctoon_mut_val * ctoon_mut_false(ctoon_mut_doc *doc)
char * ctoon_mut_val_write_opts(const ctoon_mut_val *val, const ctoon_write_options *opts, const ctoon_alc *alc, size_t *len, ctoon_write_err *err)
static ctoon_mut_val * ctoon_mut_doc_ptr_get(ctoon_mut_doc *doc, const char *ptr)
ctoon_incr_state * ctoon_incr_new(char *buf, size_t buf_len, ctoon_read_flag flg, const ctoon_alc *alc)
static size_t ctoon_doc_get_val_count(ctoon_doc *doc)
char * ctoon_write_number(const ctoon_val *val, char *buf)
static const ctoon_read_flag CTOON_READ_ALLOW_INVALID_UNICODE
static unsigned char ctoon_mut_is_int(ctoon_mut_val *val)
static void ctoon_mut_doc_set_root(ctoon_mut_doc *doc, ctoon_mut_val *root)
static ctoon_mut_val * ctoon_mut_uint(ctoon_mut_doc *doc, uint64_t num)
static size_t ctoon_mut_obj_size(ctoon_mut_val *obj)
static unsigned char ctoon_mut_doc_ptr_addn(ctoon_mut_doc *doc, const char *ptr, size_t len, ctoon_mut_val *new_val)
uint32_t ctoon_patch_code
static ctoon_val * ctoon_arr_iter_next(ctoon_arr_iter *iter)
static const ctoon_read_flag CTOON_READ_ALLOW_INF_AND_NAN
static const ctoon_ptr_code CTOON_PTR_ERR_SET_ROOT
static unsigned char ctoon_mut_arr_prepend(ctoon_mut_val *arr, ctoon_mut_val *val)
void ctoon_alc_dyn_free(ctoon_alc *alc)
static ctoon_obj_iter ctoon_obj_iter_with(ctoon_val *obj)
ctoon_doc * ctoon_read_fp(FILE *fp, ctoon_read_flag flg, const ctoon_alc *alc, ctoon_read_err *err)
static ctoon_mut_val * ctoon_mut_ptr_getn(ctoon_mut_val *val, const char *ptr, size_t len)
static unsigned char ctoon_mut_ptr_add(ctoon_mut_val *val, const char *ptr, ctoon_mut_val *new_val, ctoon_mut_doc *doc)
static unsigned char ctoon_mut_is_real(ctoon_mut_val *val)
static ctoon_mut_val * ctoon_mut_null(ctoon_mut_doc *doc)
static const ctoon_patch_code CTOON_PATCH_ERROR_INVALID_PARAMETER
static ctoon_mut_val * ctoon_mut_obj_get(ctoon_mut_val *obj, const char *key)
static unsigned char ctoon_mut_arr_add_null(ctoon_mut_doc *doc, ctoon_mut_val *arr)
static uint8_t ctoon_mut_get_tag(ctoon_mut_val *val)
static const ctoon_read_code CTOON_READ_ERROR_INVALID_COMMENT
static unsigned char ctoon_mut_obj_add_uint(ctoon_mut_doc *doc, ctoon_mut_val *obj, const char *key, uint64_t val)
static unsigned char ctoon_is_sint(ctoon_val *val)
static unsigned char ctoon_mut_obj_add_strcpy(ctoon_mut_doc *doc, ctoon_mut_val *obj, const char *key, const char *val)
unsigned char ctoon_alc_pool_init(ctoon_alc *alc, void *buf, size_t size)
static unsigned char ctoon_is_bool(ctoon_val *val)
static const ctoon_read_flag CTOON_READ_NOFLAG
static unsigned char ctoon_mut_doc_ptr_setx(ctoon_mut_doc *doc, const char *ptr, size_t len, ctoon_mut_val *new_val, unsigned char create_parent, ctoon_ptr_ctx *ctx, ctoon_ptr_err *err)
static const ctoon_read_flag CTOON_READ_ALLOW_EXT_ESCAPE
static const ctoon_read_code CTOON_READ_SUCCESS
static size_t ctoon_obj_size(ctoon_val *obj)
static const ctoon_write_code CTOON_WRITE_ERROR_INVALID_STRING
static ctoon_mut_val * ctoon_mut_obj_add_arr(ctoon_mut_doc *doc, ctoon_mut_val *obj, const char *key)
static unsigned char ctoon_set_float(ctoon_val *val, float num)
static unsigned char ctoon_set_fp_to_fixed(ctoon_val *val, int prec)
static unsigned char ctoon_mut_obj_rotate(ctoon_mut_val *obj, size_t idx)
static const ctoon_read_code CTOON_READ_ERROR_UNEXPECTED_CHARACTER
ctoon_mut_doc * ctoon_mut_doc_new(const ctoon_alc *alc)
static const ctoon_ptr_code CTOON_PTR_ERR_NONE
static ctoon_val * ctoon_obj_getn(ctoon_val *obj, const char *key, size_t key_len)
static char * ctoon_val_write(const ctoon_val *val, size_t *len)
static ctoon_mut_val * ctoon_mut_obj_remove_keyn(ctoon_mut_val *obj, const char *key, size_t key_len)
unsigned char ctoon_mut_write_fp(FILE *fp, const ctoon_mut_doc *doc, const ctoon_write_options *opts, const ctoon_alc *alc, ctoon_write_err *err)
static const ctoon_read_flag CTOON_READ_ALLOW_COMMENTS
static unsigned char ctoon_set_str(ctoon_val *val, const char *str)
static ctoon_mut_val * ctoon_mut_ptr_get(ctoon_mut_val *val, const char *ptr)
static ctoon_mut_val * ctoon_mut_arr_get_last(ctoon_mut_val *arr)
static unsigned char ctoon_mut_doc_ptr_setn(ctoon_mut_doc *doc, const char *ptr, size_t len, ctoon_mut_val *new_val)
static unsigned char ctoon_set_real(ctoon_val *val, double num)
static ctoon_val * ctoon_ptr_getx(ctoon_val *val, const char *ptr, size_t len, ctoon_ptr_err *err)
static ctoon_mut_arr_iter ctoon_mut_arr_iter_with(ctoon_mut_val *arr)
static unsigned char ctoon_is_num(ctoon_val *val)
uint32_t ctoon_write_code
static ctoon_mut_val * ctoon_mut_arr_with_float(ctoon_mut_doc *doc, const float *vals, size_t count)
static unsigned char ctoon_mut_arr_add_strncpy(ctoon_mut_doc *doc, ctoon_mut_val *arr, const char *str, size_t len)
static unsigned char ctoon_equals_str(ctoon_val *val, const char *str)
static const ctoon_write_flag CTOON_WRITE_NOFLAG
static ctoon_mut_val * ctoon_mut_arr_add_obj(ctoon_mut_doc *doc, ctoon_mut_val *arr)
static const ctoon_patch_code CTOON_PATCH_ERROR_INVALID_OPERATION
static ctoon_mut_val * ctoon_mut_ptr_removex(ctoon_mut_val *val, const char *ptr, size_t len, ctoon_ptr_ctx *ctx, ctoon_ptr_err *err)
static ctoon_mut_val * ctoon_mut_arr_with_real(ctoon_mut_doc *doc, const double *vals, size_t count)
static unsigned char ctoon_mut_equals_strn(ctoon_mut_val *val, const char *str, size_t len)
static ctoon_subtype ctoon_mut_get_subtype(ctoon_mut_val *val)
static unsigned char ctoon_mut_arr_add_true(ctoon_mut_doc *doc, ctoon_mut_val *arr)
static const ctoon_write_code CTOON_WRITE_ERROR_MEMORY_ALLOCATION
static ctoon_mut_val * ctoon_mut_str(ctoon_mut_doc *doc, const char *str)
static size_t ctoon_mut_get_len(ctoon_mut_val *val)
static const ctoon_read_code CTOON_READ_ERROR_TOON_STRUCTURE
static unsigned char ctoon_mut_set_fp_to_float(ctoon_mut_val *val, unsigned char flt)
uint32_t ctoon_write_flag
static unsigned char ctoon_mut_arr_iter_init(ctoon_mut_val *arr, ctoon_mut_arr_iter *iter)
static unsigned char ctoon_mut_arr_add_bool(ctoon_mut_doc *doc, ctoon_mut_val *arr, unsigned char val)
uint32_t ctoon_version(void)
static const ctoon_write_code CTOON_WRITE_ERROR_FILE_OPEN
static ctoon_mut_val * ctoon_mut_doc_ptr_remove(ctoon_mut_doc *doc, const char *ptr)
static ctoon_mut_val * ctoon_mut_doc_ptr_replacex(ctoon_mut_doc *doc, const char *ptr, size_t len, ctoon_mut_val *new_val, ctoon_ptr_ctx *ctx, ctoon_ptr_err *err)
static ctoon_mut_val * ctoon_mut_strn(ctoon_mut_doc *doc, const char *str, size_t len)
static const ctoon_patch_code CTOON_PATCH_ERROR_MISSING_KEY
static ctoon_mut_val * ctoon_mut_doc_get_root(ctoon_mut_doc *doc)
static unsigned char ctoon_mut_get_bool(ctoon_mut_val *val)
const char * ctoon_read_number(const char *dat, ctoon_val *val, ctoon_read_flag flg, const ctoon_alc *alc, ctoon_read_err *err)
static unsigned char ctoon_mut_arr_add_strcpy(ctoon_mut_doc *doc, ctoon_mut_val *arr, const char *str)
static const ctoon_read_code CTOON_READ_ERROR_MORE
static ctoon_val * ctoon_obj_get(ctoon_val *obj, const char *key)
ctoon_doc * ctoon_read_opts_indent(char *dat, size_t len, ctoon_read_flag flg, int indent_size, const ctoon_alc *alc, ctoon_read_err *err)
static unsigned char ctoon_is_obj(ctoon_val *val)
static ctoon_mut_val * ctoon_mut_strncpy(ctoon_mut_doc *doc, const char *str, size_t len)
static const ctoon_read_code CTOON_READ_ERROR_INVALID_STRING
static unsigned char ctoon_set_raw(ctoon_val *val, const char *raw, size_t len)
static void ctoon_doc_free(ctoon_doc *doc)
static ctoon_mut_val * ctoon_mut_obj_remove_str(ctoon_mut_val *obj, const char *key)
static unsigned char ctoon_mut_obj_put(ctoon_mut_val *obj, ctoon_mut_val *key, ctoon_mut_val *val)
static unsigned char ctoon_equals(ctoon_val *lhs, ctoon_val *rhs)
static ctoon_mut_val * ctoon_mut_arr_with_sint8(ctoon_mut_doc *doc, const int8_t *vals, size_t count)
static const ctoon_patch_code CTOON_PATCH_ERROR_MEMORY_ALLOCATION
static unsigned char ctoon_is_real(ctoon_val *val)
static unsigned char ctoon_mut_set_float(ctoon_mut_val *val, float num)
static ctoon_mut_val * ctoon_mut_rawn(ctoon_mut_doc *doc, const char *str, size_t len)
static ctoon_mut_val * ctoon_mut_bool(ctoon_mut_doc *doc, unsigned char val)
static ctoon_mut_val * ctoon_mut_obj_remove(ctoon_mut_val *obj, ctoon_mut_val *key)
static unsigned char ctoon_mut_obj_add_false(ctoon_mut_doc *doc, ctoon_mut_val *obj, const char *key)
static const ctoon_read_code CTOON_READ_ERROR_INVALID_PARAMETER
static unsigned char unsafe_ctoon_is_str_noesc(const char *str, size_t len)
ctoon_doc * ctoon_incr_read(ctoon_incr_state *state, size_t len, ctoon_read_err *err)
static ctoon_mut_val * ctoon_mut_obj(ctoon_mut_doc *doc)
static ctoon_val * ctoon_arr_get_last(ctoon_val *arr)
static ctoon_mut_val * ctoon_mut_rawcpy(ctoon_mut_doc *doc, const char *str)
static unsigned char ctoon_is_ctn(ctoon_val *val)
static unsigned char ctoon_mut_set_real(ctoon_mut_val *val, double num)
static unsigned char ctoon_is_true(ctoon_val *val)
static ctoon_mut_val * ctoon_mut_float(ctoon_mut_doc *doc, float num)
static size_t ctoon_doc_get_read_size(ctoon_doc *doc)
static const ctoon_read_flag CTOON_READ_TOON5
static const char * ctoon_get_str(ctoon_val *val)
static unsigned char ctoon_set_strn(ctoon_val *val, const char *str, size_t len)
static unsigned char ctoon_mut_set_fp_to_fixed(ctoon_mut_val *val, int prec)
static unsigned char ctoon_mut_obj_rename_keyn(ctoon_mut_doc *doc, ctoon_mut_val *obj, const char *key, size_t len, const char *new_key, size_t new_len)
static const char * ctoon_mut_get_raw(ctoon_mut_val *val)
static ctoon_val * ctoon_arr_get_first(ctoon_val *arr)
static const ctoon_write_code CTOON_WRITE_ERROR_NAN_OR_INF
static ctoon_subtype ctoon_get_subtype(ctoon_val *val)
static ctoon_mut_val * ctoon_mut_doc_ptr_getx(ctoon_mut_doc *doc, const char *ptr, size_t len, ctoon_ptr_ctx *ctx, ctoon_ptr_err *err)
void(* free)(void *ctx, void *ptr)
ctoon_delimiter delimiter