56#ifndef CTOON_DISABLE_READER
64#ifndef CTOON_DISABLE_WRITER
71#ifndef CTOON_DISABLE_INCR_READER
78#ifndef CTOON_DISABLE_UTILS
86#ifndef CTOON_DISABLE_JSON
87#define CTOON_ENABLE_JSON 1
97#ifndef CTOON_DISABLE_FAST_FP_CONV
106#ifndef CTOON_DISABLE_NON_STANDARD
126#ifndef CTOON_DISABLE_UTF8_VALIDATION
135#ifndef CTOON_DISABLE_UNALIGNED_MEMORY_ACCESS
147#ifndef CTOON_HAS_STDINT_H
151#ifndef CTOON_HAS_STDBOOL_H
155#ifndef CTOON_READER_DEPTH_LIMIT
165# define CTOON_MSC_VER _MSC_VER
167# define CTOON_MSC_VER 0
172# define CTOON_GCC_VER __GNUC__
173# if defined(__GNUC_PATCHLEVEL__)
174# define ctoon_gcc_available(major, minor, patch) \
175 ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) \
176 >= (major * 10000 + minor * 100 + patch))
178# define ctoon_gcc_available(major, minor, patch) \
179 ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100) \
180 >= (major * 10000 + minor * 100 + patch))
183# define CTOON_GCC_VER 0
184# define ctoon_gcc_available(major, minor, patch) 0
188#if defined(__GNUC__) && defined(__GNUC_MINOR__) && \
189 !defined(__clang__) && !defined(__llvm__) && \
190 !defined(__INTEL_COMPILER) && !defined(__ICC) && \
191 !defined(__NVCC__) && !defined(__PGI) && !defined(__TINYC__)
192# define CTOON_IS_REAL_GCC 1
194# define CTOON_IS_REAL_GCC 0
198#if defined(__STDC__) && (__STDC__ >= 1) && defined(__STDC_VERSION__)
199# define CTOON_STDC_VER __STDC_VERSION__
201# define CTOON_STDC_VER 0
205#if defined(__cplusplus)
206# define CTOON_CPP_VER __cplusplus
208# define CTOON_CPP_VER 0
212#ifndef ctoon_has_builtin
214# define ctoon_has_builtin(x) __has_builtin(x)
216# define ctoon_has_builtin(x) 0
221#ifndef ctoon_has_attribute
222# ifdef __has_attribute
223# define ctoon_has_attribute(x) __has_attribute(x)
225# define ctoon_has_attribute(x) 0
230#ifndef ctoon_has_feature
232# define ctoon_has_feature(x) __has_feature(x)
234# define ctoon_has_feature(x) 0
239#ifndef ctoon_has_include
241# define ctoon_has_include(x) __has_include(x)
243# define ctoon_has_include(x) 0
249# if CTOON_MSC_VER >= 1200
250# define ctoon_inline __forceinline
251# elif defined(_MSC_VER)
252# define ctoon_inline __inline
253# elif ctoon_has_attribute(always_inline) || CTOON_GCC_VER >= 4
254# define ctoon_inline __inline__ __attribute__((always_inline))
255# elif defined(__clang__) || defined(__GNUC__)
256# define ctoon_inline __inline__
257# elif defined(__cplusplus) || CTOON_STDC_VER >= 199901L
258# define ctoon_inline inline
265#ifndef ctoon_noinline
266# if CTOON_MSC_VER >= 1400
267# define ctoon_noinline __declspec(noinline)
268# elif ctoon_has_attribute(noinline) || CTOON_GCC_VER >= 4
269# define ctoon_noinline __attribute__((noinline))
271# define ctoon_noinline
277# if CTOON_MSC_VER >= 1300
278# define ctoon_align(x) __declspec(align(x))
279# elif ctoon_has_attribute(aligned) || defined(__GNUC__)
280# define ctoon_align(x) __attribute__((aligned(x)))
281# elif CTOON_CPP_VER >= 201103L
282# define ctoon_align(x) alignas(x)
284# define ctoon_align(x)
290# if ctoon_has_builtin(__builtin_expect) || \
291 (CTOON_GCC_VER >= 4 && CTOON_GCC_VER != 5)
292# define ctoon_likely(expr) __builtin_expect(!!(expr), 1)
294# define ctoon_likely(expr) (expr)
299#ifndef ctoon_unlikely
300# if ctoon_has_builtin(__builtin_expect) || \
301 (CTOON_GCC_VER >= 4 && CTOON_GCC_VER != 5)
302# define ctoon_unlikely(expr) __builtin_expect(!!(expr), 0)
304# define ctoon_unlikely(expr) (expr)
309#ifndef ctoon_constant_p
310# if ctoon_has_builtin(__builtin_constant_p) || (CTOON_GCC_VER >= 3)
311# define CTOON_HAS_CONSTANT_P 1
312# define ctoon_constant_p(value) __builtin_constant_p(value)
314# define CTOON_HAS_CONSTANT_P 0
315# define ctoon_constant_p(value) 0
320#ifndef ctoon_deprecated
321# if CTOON_MSC_VER >= 1400
322# define ctoon_deprecated(msg) __declspec(deprecated(msg))
323# elif ctoon_has_feature(attribute_deprecated_with_message) || \
324 (CTOON_GCC_VER > 4 || (CTOON_GCC_VER == 4 && __GNUC_MINOR__ >= 5))
325# define ctoon_deprecated(msg) __attribute__((deprecated(msg)))
326# elif CTOON_GCC_VER >= 3
327# define ctoon_deprecated(msg) __attribute__((deprecated))
329# define ctoon_deprecated(msg)
336# if defined(CTOON_EXPORTS) && CTOON_EXPORTS
337# define ctoon_api __declspec(dllexport)
338# elif defined(CTOON_IMPORTS) && CTOON_IMPORTS
339# define ctoon_api __declspec(dllimport)
343# elif ctoon_has_attribute(visibility) || CTOON_GCC_VER >= 4
344# define ctoon_api __attribute__((visibility("default")))
351#ifndef ctoon_api_inline
352# define ctoon_api_inline static ctoon_inline
356#if (defined(CTOON_HAS_STDINT_H) && CTOON_HAS_STDINT_H) || \
357 CTOON_MSC_VER >= 1600 || CTOON_STDC_VER >= 199901L || \
358 defined(_STDINT_H) || defined(_STDINT_H_) || \
359 defined(__CLANG_STDINT_H) || defined(_STDINT_H_INCLUDED) || \
360 ctoon_has_include(<stdint.h>)
362#elif defined(_MSC_VER)
364 typedef signed char int8_t;
365 typedef signed short int16_t;
366 typedef signed int int32_t;
367 typedef unsigned char uint8_t;
368 typedef unsigned short uint16_t;
369 typedef unsigned int uint32_t;
370 typedef signed __int64 int64_t;
371 typedef unsigned __int64 uint64_t;
373 typedef signed __int8 int8_t;
374 typedef signed __int16 int16_t;
375 typedef signed __int32 int32_t;
376 typedef unsigned __int8 uint8_t;
377 typedef unsigned __int16 uint16_t;
378 typedef unsigned __int32 uint32_t;
379 typedef signed __int64 int64_t;
380 typedef unsigned __int64 uint64_t;
383# if UCHAR_MAX == 0xFFU
384 typedef signed char int8_t;
385 typedef unsigned char uint8_t;
387# error cannot find 8-bit integer type
389# if USHRT_MAX == 0xFFFFU
390 typedef unsigned short uint16_t;
391 typedef signed short int16_t;
392# elif UINT_MAX == 0xFFFFU
393 typedef unsigned int uint16_t;
394 typedef signed int int16_t;
396# error cannot find 16-bit integer type
398# if UINT_MAX == 0xFFFFFFFFUL
399 typedef unsigned int uint32_t;
400 typedef signed int int32_t;
401# elif ULONG_MAX == 0xFFFFFFFFUL
402 typedef unsigned long uint32_t;
403 typedef signed long int32_t;
404# elif USHRT_MAX == 0xFFFFFFFFUL
405 typedef unsigned short uint32_t;
406 typedef signed short int32_t;
408# error cannot find 32-bit integer type
410# if defined(__INT64_TYPE__) && defined(__UINT64_TYPE__)
411 typedef __INT64_TYPE__ int64_t;
412 typedef __UINT64_TYPE__ uint64_t;
413# elif defined(__GNUC__) || defined(__clang__)
414# if !defined(_SYS_TYPES_H) && !defined(__int8_t_defined)
415 __extension__
typedef long long int64_t;
417 __extension__
typedef unsigned long long uint64_t;
418# elif defined(_LONG_LONG) || defined(__MWERKS__) || defined(_CRAYC) || \
419 defined(__SUNPRO_C) || defined(__SUNPRO_CC)
420 typedef long long int64_t;
421 typedef unsigned long long uint64_t;
422# elif (defined(__BORLANDC__) && __BORLANDC__ > 0x460) || \
423 defined(__WATCOM_INT64__) || defined (__alpha) || defined (__DECC)
424 typedef __int64 int64_t;
425 typedef unsigned __int64 uint64_t;
427# error cannot find 64-bit integer type
432#if (defined(CTOON_HAS_STDBOOL_H) && CTOON_HAS_STDBOOL_H) || \
433 CTOON_MSC_VER >= 1800 || CTOON_STDC_VER >= 199901L || \
434 (ctoon_has_include(<stdbool.h>) && !defined(__STRICT_ANSI__))
436#elif !defined(__bool_true_false_are_defined)
437# define __bool_true_false_are_defined 1
438# if defined(__cplusplus)
439# if defined(__GNUC__) && !defined(__STRICT_ANSI__)
441# if __cplusplus < 201103L
448# define bool unsigned char
457# error non 8-bit char is not supported
465#ifndef CTOON_U64_TO_F64_NO_IMPL
466# if (0 < CTOON_MSC_VER) && (CTOON_MSC_VER <= 1200)
467# define CTOON_U64_TO_F64_NO_IMPL 1
469# define CTOON_U64_TO_F64_NO_IMPL 0
489#define CTOON_VERSION_MAJOR 0
492#define CTOON_VERSION_MINOR 9
495#define CTOON_VERSION_PATCH 0
497#define CTOON_VERSION_ENCODE(maj,min,pat) (((maj)*10000)+((min)*100)+(pat))
498#define CTOON_VERSION \
499 CTOON_VERSION_ENCODE(CTOON_VERSION_MAJOR,CTOON_VERSION_MINOR,CTOON_VERSION_PATCH)
502#define CTOON_VERSION_HEX \
503 ((CTOON_VERSION_MAJOR << 16) | (CTOON_VERSION_MINOR << 8) | CTOON_VERSION_PATCH)
506#define _CTOON_VERSION_XSTR(a,b,c) #a"."#b"."#c
507#define _CTOON_VERSION_STR(a,b,c) _CTOON_VERSION_XSTR(a,b,c)
510#define CTOON_VERSION_STRING \
511 _CTOON_VERSION_STR(CTOON_VERSION_MAJOR,CTOON_VERSION_MINOR,CTOON_VERSION_PATCH)
530#define CTOON_SPEC_VERSION_STRING "4.4"
531#define CTOON_SPEC_DATE_STRING "2026-10-08"
532#define CTOON_SPEC_TAG_MAJOR 4
533#define CTOON_SPEC_TAG_MINOR 4
534#define CTOON_SPEC_TAG_PATCH 0
538#define CTOON_SPEC_TAG_STRING \
539 "v" _CTOON_VERSION_STR(CTOON_SPEC_TAG_MAJOR,CTOON_SPEC_TAG_MINOR,CTOON_SPEC_TAG_PATCH)
542#define CTOON_SPEC_TAG_HEX \
543 ((CTOON_SPEC_TAG_MAJOR << 16) | (CTOON_SPEC_TAG_MINOR << 8) | CTOON_SPEC_TAG_PATCH)
563#define CTOON_TYPE_NONE ((uint8_t)0)
565#define CTOON_TYPE_RAW ((uint8_t)1)
567#define CTOON_TYPE_NULL ((uint8_t)2)
569#define CTOON_TYPE_BOOL ((uint8_t)3)
571#define CTOON_TYPE_NUM ((uint8_t)4)
573#define CTOON_TYPE_STR ((uint8_t)5)
575#define CTOON_TYPE_ARR ((uint8_t)6)
577#define CTOON_TYPE_OBJ ((uint8_t)7)
582#define CTOON_SUBTYPE_NONE ((uint8_t)(0 << 3))
584#define CTOON_SUBTYPE_FALSE ((uint8_t)(0 << 3))
586#define CTOON_SUBTYPE_TRUE ((uint8_t)(1 << 3))
588#define CTOON_SUBTYPE_UINT ((uint8_t)(0 << 3))
590#define CTOON_SUBTYPE_SINT ((uint8_t)(1 << 3))
592#define CTOON_SUBTYPE_REAL ((uint8_t)(2 << 3))
594#define CTOON_SUBTYPE_NOESC ((uint8_t)(1 << 3))
597#define CTOON_TYPE_MASK ((uint8_t)0x07)
599#define CTOON_TYPE_BIT ((uint8_t)3)
601#define CTOON_SUBTYPE_MASK ((uint8_t)0x18)
603#define CTOON_SUBTYPE_BIT ((uint8_t)2)
605#define CTOON_RESERVED_MASK ((uint8_t)0xE0)
607#define CTOON_RESERVED_BIT ((uint8_t)3)
609#define CTOON_TAG_MASK ((uint8_t)0xFF)
611#define CTOON_TAG_BIT ((uint8_t)8)
614#define CTOON_PADDING_SIZE 4
630 void *(*malloc)(
void *
ctx,
size_t size);
632 void *(*realloc)(
void *
ctx,
void *ptr,
size_t old_size,
size_t size);
722 size_t *line,
size_t *col,
size_t *chr);
949#if !defined(CTOON_DISABLE_READER) || !CTOON_DISABLE_READER
1080 flg &= ~CTOON_READ_INSITU;
1082 len, flg, NULL, NULL);
1087#if !defined(CTOON_DISABLE_INCR_READER) || !CTOON_DISABLE_INCR_READER
1198 size_t max = (size_t)(~(
size_t)0);
1200 if (len >= (max - pad - mul) / mul)
return 0;
1201 return len * mul + pad;
1279#define CTOON_WRITE_FP_FLAG_BITS 8
1280#define CTOON_WRITE_FP_PREC_BITS 4
1283#define CTOON_WRITE_FP_TO_FIXED(prec) ((ctoon_write_flag)( \
1284 (uint32_t)((uint32_t)(prec)) << (32 - 4) ))
1287#define CTOON_WRITE_FP_TO_FLOAT ((ctoon_write_flag)(1 << (32 - 5)))
1322#if !defined(CTOON_DISABLE_WRITER) || !CTOON_DISABLE_WRITER
1466#if defined(CTOON_ENABLE_JSON) && CTOON_ENABLE_JSON
1509 flg &= ~CTOON_READ_INSITU;
1511 len, flg, NULL, NULL);
1564#if defined(CTOON_ENABLE_JSON) && CTOON_ENABLE_JSON && \
1565 (!defined(CTOON_DISABLE_READER) || !CTOON_DISABLE_READER) && \
1566 (!defined(CTOON_DISABLE_WRITER) || !CTOON_DISABLE_WRITER)
1610 const char *toon_path);
1614 const char *toon_path,
1646 const char *json_path);
1650 const char *json_path,
1828 const char *raw,
size_t len);
1891 const char *str,
size_t len);
2001#define ctoon_arr_foreach(arr, idx, max, val) \
2003 (max) = ctoon_arr_size(arr), \
2004 (val) = ctoon_arr_get_first(arr); \
2007 (val) = unsafe_ctoon_get_next(val))
2172#define ctoon_obj_foreach(obj, idx, max, key, val) \
2174 (max) = ctoon_obj_size(obj), \
2175 (key) = (obj) ? unsafe_ctoon_get_first(obj) : NULL, \
2176 (val) = (key) + 1; \
2179 (key) = unsafe_ctoon_get_next(val), \
2417 const char *str,
size_t len);
2431 const char *raw,
size_t len);
2496 const char *str,
size_t len);
2736#define ctoon_mut_arr_foreach(arr, idx, max, val) \
2738 (max) = ctoon_mut_arr_size(arr), \
2739 (val) = ctoon_mut_arr_get_first(arr); \
2742 (val) = (val)->next)
3059 ctoon_mut_doc *doc,
const char **vals,
const size_t *lens,
size_t count);
3103 ctoon_mut_doc *doc,
const char **vals,
const size_t *lens,
size_t count);
3198 size_t idx,
size_t len);
3608#define ctoon_mut_obj_foreach(obj, idx, max, key, val) \
3610 (max) = ctoon_mut_obj_size(obj), \
3611 (key) = (max) ? ((ctoon_mut_val *)(obj)->uni.ptr)->next->next : NULL, \
3612 (val) = (key) ? (key)->next : NULL; \
3615 (key) = (val)->next, \
3616 (val) = (key)->next)
3662 const char **kv_pairs,
3819 const char *key,
bool val);
3829 const char *key, uint64_t val);
3839 const char *key, int64_t val);
3849 const char *key, int64_t val);
3859 const char *key,
float val);
3869 const char *key,
double val);
3879 const char *key,
double val);
3889 const char *key,
const char *val);
3902 const char *val,
size_t len);
3927 const char *val,
size_t len);
3996 const char *new_key);
4010 const char *new_key,
4015#if !defined(CTOON_DISABLE_UTILS) || !CTOON_DISABLE_UTILS
4119 const char *ptr,
size_t len);
4131 const char *ptr,
size_t len,
4153 const char *ptr,
size_t len);
4165 const char *ptr,
size_t len,
4266 const char *ptr,
size_t len,
4281 const char *ptr,
size_t len,
4312 const char *ptr,
size_t len,
4329 const char *ptr,
size_t len,
4360 const char *ptr,
size_t len,
4376 const char *ptr,
size_t len,
4409 const char *ptr,
size_t len,
4427 const char *ptr,
size_t len,
4760#if CTOON_HAS_CONSTANT_P && \
4761 (!CTOON_IS_REAL_GCC || ctoon_gcc_available(4, 4, 0))
4775# define ctoon_repeat32_incr(x) \
4776 x(0) x(1) x(2) x(3) x(4) x(5) x(6) x(7) \
4777 x(8) x(9) x(10) x(11) x(12) x(13) x(14) x(15) \
4778 x(16) x(17) x(18) x(19) x(20) x(21) x(22) x(23) \
4779 x(24) x(25) x(26) x(27) x(28) x(29) x(30) x(31)
4780# define ctoon_check_char_noesc(i) \
4783 if (c < ' ' || c > '~' || c == '"' || c == '\\') return false; }
4784 ctoon_repeat32_incr(ctoon_check_char_noesc)
4785# undef ctoon_repeat32_incr
4786# undef ctoon_check_char_noesc
4796ctoon_api_inline double unsafe_ctoon_u64_to_f64(uint64_t num) {
4797#if CTOON_U64_TO_F64_NO_IMPL
4798 uint64_t msb = ((uint64_t)1) << 63;
4799 if ((num & msb) == 0) {
4800 return (double)(int64_t)num;
4802 return ((double)(int64_t)((num >> 1) | (num & 1))) * (double)2.0;
4809ctoon_api_inline ctoon_type unsafe_ctoon_get_type(void *val) {
4810 uint8_t tag = (uint8_t)((ctoon_val *)val)->tag;
4811 return (ctoon_type)(tag & CTOON_TYPE_MASK);
4814ctoon_api_inline ctoon_subtype unsafe_ctoon_get_subtype(void *val) {
4815 uint8_t tag = (uint8_t)((ctoon_val *)val)->tag;
4816 return (ctoon_subtype)(tag & CTOON_SUBTYPE_MASK);
4819ctoon_api_inline uint8_t unsafe_ctoon_get_tag(void *val) {
4820 uint8_t tag = (uint8_t)((ctoon_val *)val)->tag;
4821 return (uint8_t)(tag & CTOON_TAG_MASK);
4824ctoon_api_inline bool unsafe_ctoon_is_raw(void *val) {
4825 return unsafe_ctoon_get_type(val) == CTOON_TYPE_RAW;
4828ctoon_api_inline bool unsafe_ctoon_is_null(void *val) {
4829 return unsafe_ctoon_get_type(val) == CTOON_TYPE_NULL;
4832ctoon_api_inline bool unsafe_ctoon_is_bool(void *val) {
4833 return unsafe_ctoon_get_type(val) == CTOON_TYPE_BOOL;
4836ctoon_api_inline bool unsafe_ctoon_is_num(void *val) {
4837 return unsafe_ctoon_get_type(val) == CTOON_TYPE_NUM;
4840ctoon_api_inline bool unsafe_ctoon_is_str(void *val) {
4841 return unsafe_ctoon_get_type(val) == CTOON_TYPE_STR;
4844ctoon_api_inline bool unsafe_ctoon_is_arr(void *val) {
4845 return unsafe_ctoon_get_type(val) == CTOON_TYPE_ARR;
4848ctoon_api_inline bool unsafe_ctoon_is_obj(void *val) {
4849 return unsafe_ctoon_get_type(val) == CTOON_TYPE_OBJ;
4852ctoon_api_inline bool unsafe_ctoon_is_ctn(void *val) {
4853 uint8_t mask = CTOON_TYPE_ARR & CTOON_TYPE_OBJ;
4854 return (unsafe_ctoon_get_tag(val) & mask) == mask;
4857ctoon_api_inline bool unsafe_ctoon_is_uint(void *val) {
4858 const uint8_t patt = CTOON_TYPE_NUM | CTOON_SUBTYPE_UINT;
4859 return unsafe_ctoon_get_tag(val) == patt;
4862ctoon_api_inline bool unsafe_ctoon_is_sint(void *val) {
4863 const uint8_t patt = CTOON_TYPE_NUM | CTOON_SUBTYPE_SINT;
4864 return unsafe_ctoon_get_tag(val) == patt;
4867ctoon_api_inline bool unsafe_ctoon_is_int(void *val) {
4868 const uint8_t mask = CTOON_TAG_MASK & (~CTOON_SUBTYPE_SINT);
4869 const uint8_t patt = CTOON_TYPE_NUM | CTOON_SUBTYPE_UINT;
4870 return (unsafe_ctoon_get_tag(val) & mask) == patt;
4873ctoon_api_inline bool unsafe_ctoon_is_real(void *val) {
4874 const uint8_t patt = CTOON_TYPE_NUM | CTOON_SUBTYPE_REAL;
4875 return unsafe_ctoon_get_tag(val) == patt;
4878ctoon_api_inline bool unsafe_ctoon_is_true(void *val) {
4879 const uint8_t patt = CTOON_TYPE_BOOL | CTOON_SUBTYPE_TRUE;
4880 return unsafe_ctoon_get_tag(val) == patt;
4883ctoon_api_inline bool unsafe_ctoon_is_false(void *val) {
4884 const uint8_t patt = CTOON_TYPE_BOOL | CTOON_SUBTYPE_FALSE;
4885 return unsafe_ctoon_get_tag(val) == patt;
4888ctoon_api_inline bool unsafe_ctoon_arr_is_flat(ctoon_val *val) {
4889 size_t ofs = val->uni.ofs;
4890 size_t len = (size_t)(val->tag >> CTOON_TAG_BIT);
4891 return len * sizeof(ctoon_val) + sizeof(ctoon_val) == ofs;
4894ctoon_api_inline const char *unsafe_ctoon_get_raw(void *val) {
4895 return ((ctoon_val *)val)->uni.str;
4898ctoon_api_inline bool unsafe_ctoon_get_bool(void *val) {
4899 uint8_t tag = unsafe_ctoon_get_tag(val);
4900 return (bool)((tag & CTOON_SUBTYPE_MASK) >> CTOON_TYPE_BIT);
4903ctoon_api_inline uint64_t unsafe_ctoon_get_uint(void *val) {
4904 return ((ctoon_val *)val)->uni.u64;
4907ctoon_api_inline int64_t unsafe_ctoon_get_sint(void *val) {
4908 return ((ctoon_val *)val)->uni.i64;
4911ctoon_api_inline int unsafe_ctoon_get_int(void *val) {
4912 return (int)((ctoon_val *)val)->uni.i64;
4915ctoon_api_inline double unsafe_ctoon_get_real(void *val) {
4916 return ((ctoon_val *)val)->uni.f64;
4919ctoon_api_inline double unsafe_ctoon_get_num(void *val) {
4920 uint8_t tag = unsafe_ctoon_get_tag(val);
4921 if (tag == (CTOON_TYPE_NUM | CTOON_SUBTYPE_REAL)) {
4922 return ((ctoon_val *)val)->uni.f64;
4923 } else if (tag == (CTOON_TYPE_NUM | CTOON_SUBTYPE_SINT)) {
4924 return (double)((ctoon_val *)val)->uni.i64;
4925 } else if (tag == (CTOON_TYPE_NUM | CTOON_SUBTYPE_UINT)) {
4926 return unsafe_ctoon_u64_to_f64(((ctoon_val *)val)->uni.u64);
4931ctoon_api_inline const char *unsafe_ctoon_get_str(void *val) {
4932 return ((ctoon_val *)val)->uni.str;
4935ctoon_api_inline size_t unsafe_ctoon_get_len(void *val) {
4936 return (size_t)(((ctoon_val *)val)->tag >> CTOON_TAG_BIT);
4939ctoon_api_inline ctoon_val *unsafe_ctoon_get_first(ctoon_val *ctn) {
4943ctoon_api_inline ctoon_val *unsafe_ctoon_get_next(ctoon_val *val) {
4944 bool is_ctn = unsafe_ctoon_is_ctn(val);
4945 size_t ctn_ofs = val->uni.ofs;
4946 size_t ofs = (is_ctn ? ctn_ofs : sizeof(ctoon_val));
4947 return (ctoon_val *)(void *)((uint8_t *)val + ofs);
4950ctoon_api_inline bool unsafe_ctoon_equals_strn(void *val, const char *str,
4952 return unsafe_ctoon_get_len(val) == len &&
4953 memcmp(((ctoon_val *)val)->uni.str, str, len) == 0;
4956ctoon_api_inline bool unsafe_ctoon_equals_str(void *val, const char *str) {
4957 return unsafe_ctoon_equals_strn(val, str, strlen(str));
4960ctoon_api_inline void unsafe_ctoon_set_type(void *val, ctoon_type type,
4961 ctoon_subtype subtype) {
4962 uint8_t tag = (type | subtype);
4963 uint64_t new_tag = ((ctoon_val *)val)->tag;
4964 new_tag = (new_tag & (~(uint64_t)CTOON_TAG_MASK)) | (uint64_t)tag;
4965 ((ctoon_val *)val)->tag = new_tag;
4968ctoon_api_inline void unsafe_ctoon_set_len(void *val, size_t len) {
4969 uint64_t tag = ((ctoon_val *)val)->tag & CTOON_TAG_MASK;
4970 tag |= (uint64_t)len << CTOON_TAG_BIT;
4971 ((ctoon_val *)val)->tag = tag;
4974ctoon_api_inline void unsafe_ctoon_set_tag(void *val, ctoon_type type,
4975 ctoon_subtype subtype,
4977 uint64_t tag = (uint64_t)len << CTOON_TAG_BIT;
4978 tag |= (type | subtype);
4979 ((ctoon_val *)val)->tag = tag;
4982ctoon_api_inline void unsafe_ctoon_inc_len(void *val) {
4983 uint64_t tag = ((ctoon_val *)val)->tag;
4984 tag += (uint64_t)(1 << CTOON_TAG_BIT);
4985 ((ctoon_val *)val)->tag = tag;
4988ctoon_api_inline void unsafe_ctoon_set_raw(void *val, const char *raw,
4990 unsafe_ctoon_set_tag(val, CTOON_TYPE_RAW, CTOON_SUBTYPE_NONE, len);
4991 ((ctoon_val *)val)->uni.str = raw;
4994ctoon_api_inline void unsafe_ctoon_set_null(void *val) {
4995 unsafe_ctoon_set_tag(val, CTOON_TYPE_NULL, CTOON_SUBTYPE_NONE, 0);
4998ctoon_api_inline void unsafe_ctoon_set_bool(void *val, bool num) {
4999 ctoon_subtype subtype = num ? CTOON_SUBTYPE_TRUE : CTOON_SUBTYPE_FALSE;
5000 unsafe_ctoon_set_tag(val, CTOON_TYPE_BOOL, subtype, 0);
5003ctoon_api_inline void unsafe_ctoon_set_uint(void *val, uint64_t num) {
5004 unsafe_ctoon_set_tag(val, CTOON_TYPE_NUM, CTOON_SUBTYPE_UINT, 0);
5005 ((ctoon_val *)val)->uni.u64 = num;
5008ctoon_api_inline void unsafe_ctoon_set_sint(void *val, int64_t num) {
5009 unsafe_ctoon_set_tag(val, CTOON_TYPE_NUM, CTOON_SUBTYPE_SINT, 0);
5010 ((ctoon_val *)val)->uni.i64 = num;
5013ctoon_api_inline void unsafe_ctoon_set_fp_to_fixed(void *val, int prec) {
5014 ((ctoon_val *)val)->tag &= ~((uint64_t)CTOON_WRITE_FP_TO_FIXED(15) << 32);
5015 ((ctoon_val *)val)->tag |= (uint64_t)CTOON_WRITE_FP_TO_FIXED(prec) << 32;
5018ctoon_api_inline void unsafe_ctoon_set_fp_to_float(void *val, bool flt) {
5019 uint64_t flag = (uint64_t)CTOON_WRITE_FP_TO_FLOAT << 32;
5020 if (flt) ((ctoon_val *)val)->tag |= flag;
5021 else ((ctoon_val *)val)->tag &= ~flag;
5024ctoon_api_inline void unsafe_ctoon_set_float(void *val, float num) {
5025 unsafe_ctoon_set_tag(val, CTOON_TYPE_NUM, CTOON_SUBTYPE_REAL, 0);
5026 ((ctoon_val *)val)->tag |= (uint64_t)CTOON_WRITE_FP_TO_FLOAT << 32;
5027 ((ctoon_val *)val)->uni.f64 = (double)num;
5030ctoon_api_inline void unsafe_ctoon_set_double(void *val, double num) {
5031 unsafe_ctoon_set_tag(val, CTOON_TYPE_NUM, CTOON_SUBTYPE_REAL, 0);
5032 ((ctoon_val *)val)->uni.f64 = num;
5035ctoon_api_inline void unsafe_ctoon_set_real(void *val, double num) {
5036 unsafe_ctoon_set_tag(val, CTOON_TYPE_NUM, CTOON_SUBTYPE_REAL, 0);
5037 ((ctoon_val *)val)->uni.f64 = num;
5040ctoon_api_inline void unsafe_ctoon_set_str_noesc(void *val, bool noesc) {
5041 ((ctoon_val *)val)->tag &= ~(uint64_t)CTOON_SUBTYPE_MASK;
5042 if (noesc) ((ctoon_val *)val)->tag |= (uint64_t)CTOON_SUBTYPE_NOESC;
5045ctoon_api_inline void unsafe_ctoon_set_strn(void *val, const char *str,
5047 unsafe_ctoon_set_tag(val, CTOON_TYPE_STR, CTOON_SUBTYPE_NONE, len);
5048 ((ctoon_val *)val)->uni.str = str;
5051ctoon_api_inline void unsafe_ctoon_set_str(void *val, const char *str) {
5052 size_t len = strlen(str);
5053 bool noesc = unsafe_ctoon_is_str_noesc(str, len);
5054 ctoon_subtype subtype = noesc ? CTOON_SUBTYPE_NOESC : CTOON_SUBTYPE_NONE;
5055 unsafe_ctoon_set_tag(val, CTOON_TYPE_STR, subtype, len);
5056 ((ctoon_val *)val)->uni.str = str;
5059ctoon_api_inline void unsafe_ctoon_set_arr(void *val, size_t size) {
5060 unsafe_ctoon_set_tag(val, CTOON_TYPE_ARR, CTOON_SUBTYPE_NONE, size);
5063ctoon_api_inline void unsafe_ctoon_set_obj(void *val, size_t size) {
5064 unsafe_ctoon_set_tag(val, CTOON_TYPE_OBJ, CTOON_SUBTYPE_NONE, size);
5069/*==============================================================================
5070 * MARK: - TOON Document API (Implementation)
5071 *============================================================================*/
5073ctoon_api_inline ctoon_val *ctoon_doc_get_root(ctoon_doc *doc) {
5074 return doc ? doc->root : NULL;
5077ctoon_api_inline size_t ctoon_doc_get_read_size(ctoon_doc *doc) {
5078 return doc ? doc->dat_read : 0;
5081ctoon_api_inline size_t ctoon_doc_get_val_count(ctoon_doc *doc) {
5082 return doc ? doc->val_read : 0;
5085ctoon_api_inline void ctoon_doc_free(ctoon_doc *doc) {
5087 ctoon_alc alc = doc->alc;
5088 memset(&doc->alc, 0, sizeof(alc));
5089 if (doc->str_pool) alc.free(alc.ctx, doc->str_pool);
5090 alc.free(alc.ctx, doc);
5096/*==============================================================================
5097 * MARK: - TOON Value Type API (Implementation)
5098 *============================================================================*/
5100ctoon_api_inline bool ctoon_is_raw(ctoon_val *val) {
5101 return val ? unsafe_ctoon_is_raw(val) : false;
5104ctoon_api_inline bool ctoon_is_null(ctoon_val *val) {
5105 return val ? unsafe_ctoon_is_null(val) : false;
5108ctoon_api_inline bool ctoon_is_true(ctoon_val *val) {
5109 return val ? unsafe_ctoon_is_true(val) : false;
5112ctoon_api_inline bool ctoon_is_false(ctoon_val *val) {
5113 return val ? unsafe_ctoon_is_false(val) : false;
5116ctoon_api_inline bool ctoon_is_bool(ctoon_val *val) {
5117 return val ? unsafe_ctoon_is_bool(val) : false;
5120ctoon_api_inline bool ctoon_is_uint(ctoon_val *val) {
5121 return val ? unsafe_ctoon_is_uint(val) : false;
5124ctoon_api_inline bool ctoon_is_sint(ctoon_val *val) {
5125 return val ? unsafe_ctoon_is_sint(val) : false;
5128ctoon_api_inline bool ctoon_is_int(ctoon_val *val) {
5129 return val ? unsafe_ctoon_is_int(val) : false;
5132ctoon_api_inline bool ctoon_is_real(ctoon_val *val) {
5133 return val ? unsafe_ctoon_is_real(val) : false;
5136ctoon_api_inline bool ctoon_is_num(ctoon_val *val) {
5137 return val ? unsafe_ctoon_is_num(val) : false;
5140ctoon_api_inline bool ctoon_is_str(ctoon_val *val) {
5141 return val ? unsafe_ctoon_is_str(val) : false;
5144ctoon_api_inline bool ctoon_is_arr(ctoon_val *val) {
5145 return val ? unsafe_ctoon_is_arr(val) : false;
5148ctoon_api_inline bool ctoon_is_obj(ctoon_val *val) {
5149 return val ? unsafe_ctoon_is_obj(val) : false;
5152ctoon_api_inline bool ctoon_is_ctn(ctoon_val *val) {
5153 return val ? unsafe_ctoon_is_ctn(val) : false;
5158/*==============================================================================
5159 * MARK: - TOON Value Content API (Implementation)
5160 *============================================================================*/
5162ctoon_api_inline ctoon_type ctoon_get_type(ctoon_val *val) {
5163 return val ? unsafe_ctoon_get_type(val) : CTOON_TYPE_NONE;
5166ctoon_api_inline ctoon_subtype ctoon_get_subtype(ctoon_val *val) {
5167 return val ? unsafe_ctoon_get_subtype(val) : CTOON_SUBTYPE_NONE;
5170ctoon_api_inline uint8_t ctoon_get_tag(ctoon_val *val) {
5171 return val ? unsafe_ctoon_get_tag(val) : 0;
5174ctoon_api_inline const char *ctoon_get_type_desc(ctoon_val *val) {
5175 switch (ctoon_get_tag(val)) {
5176 case CTOON_TYPE_RAW | CTOON_SUBTYPE_NONE: return "raw";
5177 case CTOON_TYPE_NULL | CTOON_SUBTYPE_NONE: return "null";
5178 case CTOON_TYPE_STR | CTOON_SUBTYPE_NONE: return "string";
5179 case CTOON_TYPE_STR | CTOON_SUBTYPE_NOESC: return "string";
5180 case CTOON_TYPE_ARR | CTOON_SUBTYPE_NONE: return "array";
5181 case CTOON_TYPE_OBJ | CTOON_SUBTYPE_NONE: return "object";
5182 case CTOON_TYPE_BOOL | CTOON_SUBTYPE_TRUE: return "true";
5183 case CTOON_TYPE_BOOL | CTOON_SUBTYPE_FALSE: return "false";
5184 case CTOON_TYPE_NUM | CTOON_SUBTYPE_UINT: return "uint";
5185 case CTOON_TYPE_NUM | CTOON_SUBTYPE_SINT: return "sint";
5186 case CTOON_TYPE_NUM | CTOON_SUBTYPE_REAL: return "real";
5187 default: return "unknown";
5191ctoon_api_inline const char *ctoon_get_raw(ctoon_val *val) {
5192 return ctoon_is_raw(val) ? unsafe_ctoon_get_raw(val) : NULL;
5195ctoon_api_inline bool ctoon_get_bool(ctoon_val *val) {
5196 return ctoon_is_bool(val) ? unsafe_ctoon_get_bool(val) : false;
5199ctoon_api_inline uint64_t ctoon_get_uint(ctoon_val *val) {
5200 return ctoon_is_int(val) ? unsafe_ctoon_get_uint(val) : 0;
5203ctoon_api_inline int64_t ctoon_get_sint(ctoon_val *val) {
5204 return ctoon_is_int(val) ? unsafe_ctoon_get_sint(val) : 0;
5207ctoon_api_inline int ctoon_get_int(ctoon_val *val) {
5208 return ctoon_is_int(val) ? unsafe_ctoon_get_int(val) : 0;
5211ctoon_api_inline double ctoon_get_real(ctoon_val *val) {
5212 return ctoon_is_real(val) ? unsafe_ctoon_get_real(val) : 0.0;
5215ctoon_api_inline double ctoon_get_num(ctoon_val *val) {
5216 return val ? unsafe_ctoon_get_num(val) : 0.0;
5219ctoon_api_inline const char *ctoon_get_str(ctoon_val *val) {
5220 return ctoon_is_str(val) ? unsafe_ctoon_get_str(val) : NULL;
5223ctoon_api_inline size_t ctoon_get_len(ctoon_val *val) {
5224 return val ? unsafe_ctoon_get_len(val) : 0;
5227ctoon_api_inline bool ctoon_equals_str(ctoon_val *val, const char *str) {
5228 if (ctoon_likely(val && str)) {
5229 return unsafe_ctoon_is_str(val) &&
5230 unsafe_ctoon_equals_str(val, str);
5235ctoon_api_inline bool ctoon_equals_strn(ctoon_val *val, const char *str,
5237 if (ctoon_likely(val && str)) {
5238 return unsafe_ctoon_is_str(val) &&
5239 unsafe_ctoon_equals_strn(val, str, len);
5244ctoon_api bool unsafe_ctoon_equals(ctoon_val *lhs, ctoon_val *rhs);
5246ctoon_api_inline bool ctoon_equals(ctoon_val *lhs, ctoon_val *rhs) {
5247 if (ctoon_unlikely(!lhs || !rhs)) return false;
5248 return unsafe_ctoon_equals(lhs, rhs);
5251ctoon_api_inline bool ctoon_set_raw(ctoon_val *val,
5252 const char *raw, size_t len) {
5253 if (ctoon_unlikely(!val || unsafe_ctoon_is_ctn(val))) return false;
5254 unsafe_ctoon_set_raw(val, raw, len);
5258ctoon_api_inline bool ctoon_set_null(ctoon_val *val) {
5259 if (ctoon_unlikely(!val || unsafe_ctoon_is_ctn(val))) return false;
5260 unsafe_ctoon_set_null(val);
5264ctoon_api_inline bool ctoon_set_bool(ctoon_val *val, bool num) {
5265 if (ctoon_unlikely(!val || unsafe_ctoon_is_ctn(val))) return false;
5266 unsafe_ctoon_set_bool(val, num);
5270ctoon_api_inline bool ctoon_set_uint(ctoon_val *val, uint64_t num) {
5271 if (ctoon_unlikely(!val || unsafe_ctoon_is_ctn(val))) return false;
5272 unsafe_ctoon_set_uint(val, num);
5276ctoon_api_inline bool ctoon_set_sint(ctoon_val *val, int64_t num) {
5277 if (ctoon_unlikely(!val || unsafe_ctoon_is_ctn(val))) return false;
5278 unsafe_ctoon_set_sint(val, num);
5282ctoon_api_inline bool ctoon_set_int(ctoon_val *val, int num) {
5283 if (ctoon_unlikely(!val || unsafe_ctoon_is_ctn(val))) return false;
5284 unsafe_ctoon_set_sint(val, (int64_t)num);
5288ctoon_api_inline bool ctoon_set_float(ctoon_val *val, float num) {
5289 if (ctoon_unlikely(!val || unsafe_ctoon_is_ctn(val))) return false;
5290 unsafe_ctoon_set_float(val, num);
5294ctoon_api_inline bool ctoon_set_double(ctoon_val *val, double num) {
5295 if (ctoon_unlikely(!val || unsafe_ctoon_is_ctn(val))) return false;
5296 unsafe_ctoon_set_double(val, num);
5300ctoon_api_inline bool ctoon_set_real(ctoon_val *val, double num) {
5301 if (ctoon_unlikely(!val || unsafe_ctoon_is_ctn(val))) return false;
5302 unsafe_ctoon_set_real(val, num);
5306ctoon_api_inline bool ctoon_set_fp_to_fixed(ctoon_val *val, int prec) {
5307 if (ctoon_unlikely(!ctoon_is_real(val))) return false;
5308 unsafe_ctoon_set_fp_to_fixed(val, prec);
5312ctoon_api_inline bool ctoon_set_fp_to_float(ctoon_val *val, bool flt) {
5313 if (ctoon_unlikely(!ctoon_is_real(val))) return false;
5314 unsafe_ctoon_set_fp_to_float(val, flt);
5318ctoon_api_inline bool ctoon_set_str(ctoon_val *val, const char *str) {
5319 if (ctoon_unlikely(!val || unsafe_ctoon_is_ctn(val))) return false;
5320 if (ctoon_unlikely(!str)) return false;
5321 unsafe_ctoon_set_str(val, str);
5325ctoon_api_inline bool ctoon_set_strn(ctoon_val *val,
5326 const char *str, size_t len) {
5327 if (ctoon_unlikely(!val || unsafe_ctoon_is_ctn(val))) return false;
5328 if (ctoon_unlikely(!str)) return false;
5329 unsafe_ctoon_set_strn(val, str, len);
5333ctoon_api_inline bool ctoon_set_str_noesc(ctoon_val *val, bool noesc) {
5334 if (ctoon_unlikely(!ctoon_is_str(val))) return false;
5335 unsafe_ctoon_set_str_noesc(val, noesc);
5341/*==============================================================================
5342 * MARK: - TOON Array API (Implementation)
5343 *============================================================================*/
5345ctoon_api_inline size_t ctoon_arr_size(ctoon_val *arr) {
5346 return ctoon_is_arr(arr) ? unsafe_ctoon_get_len(arr) : 0;
5349ctoon_api_inline ctoon_val *ctoon_arr_get(ctoon_val *arr, size_t idx) {
5350 if (ctoon_likely(ctoon_is_arr(arr))) {
5351 if (ctoon_likely(unsafe_ctoon_get_len(arr) > idx)) {
5352 ctoon_val *val = unsafe_ctoon_get_first(arr);
5353 if (unsafe_ctoon_arr_is_flat(arr)) {
5356 while (idx-- > 0) val = unsafe_ctoon_get_next(val);
5364ctoon_api_inline ctoon_val *ctoon_arr_get_first(ctoon_val *arr) {
5365 if (ctoon_likely(ctoon_is_arr(arr))) {
5366 if (ctoon_likely(unsafe_ctoon_get_len(arr) > 0)) {
5367 return unsafe_ctoon_get_first(arr);
5373ctoon_api_inline ctoon_val *ctoon_arr_get_last(ctoon_val *arr) {
5374 if (ctoon_likely(ctoon_is_arr(arr))) {
5375 size_t len = unsafe_ctoon_get_len(arr);
5376 if (ctoon_likely(len > 0)) {
5377 ctoon_val *val = unsafe_ctoon_get_first(arr);
5378 if (unsafe_ctoon_arr_is_flat(arr)) {
5379 return val + (len - 1);
5381 while (len-- > 1) val = unsafe_ctoon_get_next(val);
5391/*==============================================================================
5392 * MARK: - TOON Array Iterator API (Implementation)
5393 *============================================================================*/
5395ctoon_api_inline bool ctoon_arr_iter_init(ctoon_val *arr,
5396 ctoon_arr_iter *iter) {
5397 if (ctoon_likely(ctoon_is_arr(arr) && iter)) {
5399 iter->max = unsafe_ctoon_get_len(arr);
5400 iter->cur = unsafe_ctoon_get_first(arr);
5403 if (iter) memset(iter, 0, sizeof(ctoon_arr_iter));
5407ctoon_api_inline ctoon_arr_iter ctoon_arr_iter_with(ctoon_val *arr) {
5408 ctoon_arr_iter iter;
5409 ctoon_arr_iter_init(arr, &iter);
5413ctoon_api_inline bool ctoon_arr_iter_has_next(ctoon_arr_iter *iter) {
5414 return iter ? iter->idx < iter->max : false;
5417ctoon_api_inline ctoon_val *ctoon_arr_iter_next(ctoon_arr_iter *iter) {
5419 if (iter && iter->idx < iter->max) {
5421 iter->cur = unsafe_ctoon_get_next(val);
5430/*==============================================================================
5431 * MARK: - TOON Object API (Implementation)
5432 *============================================================================*/
5434ctoon_api_inline size_t ctoon_obj_size(ctoon_val *obj) {
5435 return ctoon_is_obj(obj) ? unsafe_ctoon_get_len(obj) : 0;
5438ctoon_api_inline ctoon_val *ctoon_obj_get(ctoon_val *obj,
5440 return ctoon_obj_getn(obj, key, key ? strlen(key) : 0);
5443ctoon_api_inline ctoon_val *ctoon_obj_getn(ctoon_val *obj,
5446 if (ctoon_likely(ctoon_is_obj(obj) && _key)) {
5447 size_t len = unsafe_ctoon_get_len(obj);
5448 ctoon_val *key = unsafe_ctoon_get_first(obj);
5450 if (unsafe_ctoon_equals_strn(key, _key, key_len)) return key + 1;
5451 key = unsafe_ctoon_get_next(key + 1);
5459/*==============================================================================
5460 * MARK: - TOON Object Iterator API (Implementation)
5461 *============================================================================*/
5463ctoon_api_inline bool ctoon_obj_iter_init(ctoon_val *obj,
5464 ctoon_obj_iter *iter) {
5465 if (ctoon_likely(ctoon_is_obj(obj) && iter)) {
5467 iter->max = unsafe_ctoon_get_len(obj);
5468 iter->cur = unsafe_ctoon_get_first(obj);
5472 if (iter) memset(iter, 0, sizeof(ctoon_obj_iter));
5476ctoon_api_inline ctoon_obj_iter ctoon_obj_iter_with(ctoon_val *obj) {
5477 ctoon_obj_iter iter;
5478 ctoon_obj_iter_init(obj, &iter);
5482ctoon_api_inline bool ctoon_obj_iter_has_next(ctoon_obj_iter *iter) {
5483 return iter ? iter->idx < iter->max : false;
5486ctoon_api_inline ctoon_val *ctoon_obj_iter_next(ctoon_obj_iter *iter) {
5487 if (iter && iter->idx < iter->max) {
5488 ctoon_val *key = iter->cur;
5490 iter->cur = unsafe_ctoon_get_next(key + 1);
5496ctoon_api_inline ctoon_val *ctoon_obj_iter_get_val(ctoon_val *key) {
5497 return key ? key + 1 : NULL;
5500ctoon_api_inline ctoon_val *ctoon_obj_iter_get(ctoon_obj_iter *iter,
5502 return ctoon_obj_iter_getn(iter, key, key ? strlen(key) : 0);
5505ctoon_api_inline ctoon_val *ctoon_obj_iter_getn(ctoon_obj_iter *iter,
5509 size_t idx = iter->idx;
5510 size_t max = iter->max;
5511 ctoon_val *cur = iter->cur;
5512 if (ctoon_unlikely(idx == max)) {
5514 cur = unsafe_ctoon_get_first(iter->obj);
5516 while (idx++ < max) {
5517 ctoon_val *next = unsafe_ctoon_get_next(cur + 1);
5518 if (unsafe_ctoon_equals_strn(cur, key, key_len)) {
5524 if (idx == iter->max && iter->idx < iter->max) {
5527 cur = unsafe_ctoon_get_first(iter->obj);
5536/*==============================================================================
5537 * MARK: - Mutable TOON Structure (Implementation)
5538 *============================================================================*/
5545struct ctoon_mut_val {
5546 uint64_t tag; /**< type, subtype and length */
5547 ctoon_val_uni uni; /**< payload */
5548 ctoon_mut_val *next; /**< the next value in circular linked list */
5554typedef struct ctoon_str_chunk {
5555 struct ctoon_str_chunk *next; /* next chunk linked list */
5556 size_t chunk_size; /* chunk size in bytes */
5557 /* char str[]; flexible array member */
5563typedef struct ctoon_str_pool {
5564 char *cur; /* cursor inside current chunk */
5565 char *end; /* the end of current chunk */
5566 size_t chunk_size; /* chunk size in bytes while creating new chunk */
5567 size_t chunk_size_max; /* maximum chunk size in bytes */
5568 ctoon_str_chunk *chunks; /* a linked list of chunks, nullable */
5575typedef struct ctoon_val_chunk {
5576 struct ctoon_val_chunk *next; /* next chunk linked list */
5577 size_t chunk_size; /* chunk size in bytes */
5578 /* char pad[sizeof(ctoon_mut_val) - sizeof(ctoon_val_chunk)]; padding */
5579 /* ctoon_mut_val vals[]; flexible array member */
5585typedef struct ctoon_val_pool {
5586 ctoon_mut_val *cur; /* cursor inside current chunk */
5587 ctoon_mut_val *end; /* the end of current chunk */
5588 size_t chunk_size; /* chunk size in bytes while creating new chunk */
5589 size_t chunk_size_max; /* maximum chunk size in bytes */
5590 ctoon_val_chunk *chunks; /* a linked list of chunks, nullable */
5593struct ctoon_mut_doc {
5594 ctoon_mut_val *root; /**< root value of the TOON document, nullable */
5595 ctoon_alc alc; /**< a valid allocator, nonnull */
5596 ctoon_str_pool str_pool; /**< string memory pool */
5597 ctoon_val_pool val_pool; /**< value memory pool */
5600/* Ensures the capacity to at least equal to the specified byte length. */
5601ctoon_api bool unsafe_ctoon_str_pool_grow(ctoon_str_pool *pool,
5602 const ctoon_alc *alc,
5605/* Ensures the capacity to at least equal to the specified value count. */
5606ctoon_api bool unsafe_ctoon_val_pool_grow(ctoon_val_pool *pool,
5607 const ctoon_alc *alc,
5610/* Allocate memory for string. */
5611ctoon_api_inline char *unsafe_ctoon_mut_str_alc(ctoon_mut_doc *doc,
5614 const ctoon_alc *alc = &doc->alc;
5615 ctoon_str_pool *pool = &doc->str_pool;
5616 if (ctoon_unlikely((size_t)(pool->end - pool->cur) <= len)) {
5617 if (ctoon_unlikely(!unsafe_ctoon_str_pool_grow(pool, alc, len + 1))) {
5622 pool->cur = mem + len + 1;
5626ctoon_api_inline char *unsafe_ctoon_mut_strncpy(ctoon_mut_doc *doc,
5627 const char *str, size_t len) {
5628 char *mem = unsafe_ctoon_mut_str_alc(doc, len);
5629 if (ctoon_unlikely(!mem)) return NULL;
5630 memcpy((void *)mem, (const void *)str, len);
5635ctoon_api_inline ctoon_mut_val *unsafe_ctoon_mut_val(ctoon_mut_doc *doc,
5638 ctoon_alc *alc = &doc->alc;
5639 ctoon_val_pool *pool = &doc->val_pool;
5640 if (ctoon_unlikely((size_t)(pool->end - pool->cur) < count)) {
5641 if (ctoon_unlikely(!unsafe_ctoon_val_pool_grow(pool, alc, count))) {
5652/*==============================================================================
5653 * MARK: - Mutable TOON Document API (Implementation)
5654 *============================================================================*/
5656ctoon_api_inline ctoon_mut_val *ctoon_mut_doc_get_root(ctoon_mut_doc *doc) {
5657 return doc ? doc->root : NULL;
5660ctoon_api_inline void ctoon_mut_doc_set_root(ctoon_mut_doc *doc,
5661 ctoon_mut_val *root) {
5662 if (doc) doc->root = root;
5667/*==============================================================================
5668 * MARK: - Mutable TOON Value Type API (Implementation)
5669 *============================================================================*/
5671ctoon_api_inline bool ctoon_mut_is_raw(ctoon_mut_val *val) {
5672 return val ? unsafe_ctoon_is_raw(val) : false;
5675ctoon_api_inline bool ctoon_mut_is_null(ctoon_mut_val *val) {
5676 return val ? unsafe_ctoon_is_null(val) : false;
5679ctoon_api_inline bool ctoon_mut_is_true(ctoon_mut_val *val) {
5680 return val ? unsafe_ctoon_is_true(val) : false;
5683ctoon_api_inline bool ctoon_mut_is_false(ctoon_mut_val *val) {
5684 return val ? unsafe_ctoon_is_false(val) : false;
5687ctoon_api_inline bool ctoon_mut_is_bool(ctoon_mut_val *val) {
5688 return val ? unsafe_ctoon_is_bool(val) : false;
5691ctoon_api_inline bool ctoon_mut_is_uint(ctoon_mut_val *val) {
5692 return val ? unsafe_ctoon_is_uint(val) : false;
5695ctoon_api_inline bool ctoon_mut_is_sint(ctoon_mut_val *val) {
5696 return val ? unsafe_ctoon_is_sint(val) : false;
5699ctoon_api_inline bool ctoon_mut_is_int(ctoon_mut_val *val) {
5700 return val ? unsafe_ctoon_is_int(val) : false;
5703ctoon_api_inline bool ctoon_mut_is_real(ctoon_mut_val *val) {
5704 return val ? unsafe_ctoon_is_real(val) : false;
5707ctoon_api_inline bool ctoon_mut_is_num(ctoon_mut_val *val) {
5708 return val ? unsafe_ctoon_is_num(val) : false;
5711ctoon_api_inline bool ctoon_mut_is_str(ctoon_mut_val *val) {
5712 return val ? unsafe_ctoon_is_str(val) : false;
5715ctoon_api_inline bool ctoon_mut_is_arr(ctoon_mut_val *val) {
5716 return val ? unsafe_ctoon_is_arr(val) : false;
5719ctoon_api_inline bool ctoon_mut_is_obj(ctoon_mut_val *val) {
5720 return val ? unsafe_ctoon_is_obj(val) : false;
5723ctoon_api_inline bool ctoon_mut_is_ctn(ctoon_mut_val *val) {
5724 return val ? unsafe_ctoon_is_ctn(val) : false;
5729/*==============================================================================
5730 * MARK: - Mutable TOON Value Content API (Implementation)
5731 *============================================================================*/
5733ctoon_api_inline ctoon_type ctoon_mut_get_type(ctoon_mut_val *val) {
5734 return ctoon_get_type((ctoon_val *)val);
5737ctoon_api_inline ctoon_subtype ctoon_mut_get_subtype(ctoon_mut_val *val) {
5738 return ctoon_get_subtype((ctoon_val *)val);
5741ctoon_api_inline uint8_t ctoon_mut_get_tag(ctoon_mut_val *val) {
5742 return ctoon_get_tag((ctoon_val *)val);
5745ctoon_api_inline const char *ctoon_mut_get_type_desc(ctoon_mut_val *val) {
5746 return ctoon_get_type_desc((ctoon_val *)val);
5749ctoon_api_inline const char *ctoon_mut_get_raw(ctoon_mut_val *val) {
5750 return ctoon_get_raw((ctoon_val *)val);
5753ctoon_api_inline bool ctoon_mut_get_bool(ctoon_mut_val *val) {
5754 return ctoon_get_bool((ctoon_val *)val);
5757ctoon_api_inline uint64_t ctoon_mut_get_uint(ctoon_mut_val *val) {
5758 return ctoon_get_uint((ctoon_val *)val);
5761ctoon_api_inline int64_t ctoon_mut_get_sint(ctoon_mut_val *val) {
5762 return ctoon_get_sint((ctoon_val *)val);
5765ctoon_api_inline int ctoon_mut_get_int(ctoon_mut_val *val) {
5766 return ctoon_get_int((ctoon_val *)val);
5769ctoon_api_inline double ctoon_mut_get_real(ctoon_mut_val *val) {
5770 return ctoon_get_real((ctoon_val *)val);
5773ctoon_api_inline double ctoon_mut_get_num(ctoon_mut_val *val) {
5774 return ctoon_get_num((ctoon_val *)val);
5777ctoon_api_inline const char *ctoon_mut_get_str(ctoon_mut_val *val) {
5778 return ctoon_get_str((ctoon_val *)val);
5781ctoon_api_inline size_t ctoon_mut_get_len(ctoon_mut_val *val) {
5782 return ctoon_get_len((ctoon_val *)val);
5785ctoon_api_inline bool ctoon_mut_equals_str(ctoon_mut_val *val,
5787 return ctoon_equals_str((ctoon_val *)val, str);
5790ctoon_api_inline bool ctoon_mut_equals_strn(ctoon_mut_val *val,
5791 const char *str, size_t len) {
5792 return ctoon_equals_strn((ctoon_val *)val, str, len);
5795ctoon_api bool unsafe_ctoon_mut_equals(ctoon_mut_val *lhs,
5796 ctoon_mut_val *rhs);
5798ctoon_api_inline bool ctoon_mut_equals(ctoon_mut_val *lhs,
5799 ctoon_mut_val *rhs) {
5800 if (ctoon_unlikely(!lhs || !rhs)) return false;
5801 return unsafe_ctoon_mut_equals(lhs, rhs);
5804ctoon_api_inline bool ctoon_mut_set_raw(ctoon_mut_val *val,
5805 const char *raw, size_t len) {
5806 if (ctoon_unlikely(!val || !raw)) return false;
5807 unsafe_ctoon_set_raw(val, raw, len);
5811ctoon_api_inline bool ctoon_mut_set_null(ctoon_mut_val *val) {
5812 if (ctoon_unlikely(!val)) return false;
5813 unsafe_ctoon_set_null(val);
5817ctoon_api_inline bool ctoon_mut_set_bool(ctoon_mut_val *val, bool num) {
5818 if (ctoon_unlikely(!val)) return false;
5819 unsafe_ctoon_set_bool(val, num);
5823ctoon_api_inline bool ctoon_mut_set_uint(ctoon_mut_val *val, uint64_t num) {
5824 if (ctoon_unlikely(!val)) return false;
5825 unsafe_ctoon_set_uint(val, num);
5829ctoon_api_inline bool ctoon_mut_set_sint(ctoon_mut_val *val, int64_t num) {
5830 if (ctoon_unlikely(!val)) return false;
5831 unsafe_ctoon_set_sint(val, num);
5835ctoon_api_inline bool ctoon_mut_set_int(ctoon_mut_val *val, int num) {
5836 if (ctoon_unlikely(!val)) return false;
5837 unsafe_ctoon_set_sint(val, (int64_t)num);
5841ctoon_api_inline bool ctoon_mut_set_float(ctoon_mut_val *val, float num) {
5842 if (ctoon_unlikely(!val)) return false;
5843 unsafe_ctoon_set_float(val, num);
5847ctoon_api_inline bool ctoon_mut_set_double(ctoon_mut_val *val, double num) {
5848 if (ctoon_unlikely(!val)) return false;
5849 unsafe_ctoon_set_double(val, num);
5853ctoon_api_inline bool ctoon_mut_set_real(ctoon_mut_val *val, double num) {
5854 if (ctoon_unlikely(!val)) return false;
5855 unsafe_ctoon_set_real(val, num);
5859ctoon_api_inline bool ctoon_mut_set_fp_to_fixed(ctoon_mut_val *val,
5861 if (ctoon_unlikely(!ctoon_mut_is_real(val))) return false;
5862 unsafe_ctoon_set_fp_to_fixed(val, prec);
5866ctoon_api_inline bool ctoon_mut_set_fp_to_float(ctoon_mut_val *val,
5868 if (ctoon_unlikely(!ctoon_mut_is_real(val))) return false;
5869 unsafe_ctoon_set_fp_to_float(val, flt);
5873ctoon_api_inline bool ctoon_mut_set_str(ctoon_mut_val *val,
5875 if (ctoon_unlikely(!val || !str)) return false;
5876 unsafe_ctoon_set_str(val, str);
5880ctoon_api_inline bool ctoon_mut_set_strn(ctoon_mut_val *val,
5881 const char *str, size_t len) {
5882 if (ctoon_unlikely(!val || !str)) return false;
5883 unsafe_ctoon_set_strn(val, str, len);
5887ctoon_api_inline bool ctoon_mut_set_str_noesc(ctoon_mut_val *val,
5889 if (ctoon_unlikely(!ctoon_mut_is_str(val))) return false;
5890 unsafe_ctoon_set_str_noesc(val, noesc);
5894ctoon_api_inline bool ctoon_mut_set_arr(ctoon_mut_val *val) {
5895 if (ctoon_unlikely(!val)) return false;
5896 unsafe_ctoon_set_arr(val, 0);
5900ctoon_api_inline bool ctoon_mut_set_obj(ctoon_mut_val *val) {
5901 if (ctoon_unlikely(!val)) return false;
5902 unsafe_ctoon_set_obj(val, 0);
5908/*==============================================================================
5909 * MARK: - Mutable TOON Value Creation API (Implementation)
5910 *============================================================================*/
5912#define ctoon_mut_val_one(func) \
5913 if (ctoon_likely(doc)) { \
5914 ctoon_mut_val *val = unsafe_ctoon_mut_val(doc, 1); \
5915 if (ctoon_likely(val)) { \
5922#define ctoon_mut_val_one_str(func) \
5923 if (ctoon_likely(doc && str)) { \
5924 ctoon_mut_val *val = unsafe_ctoon_mut_val(doc, 1); \
5925 if (ctoon_likely(val)) { \
5932ctoon_api_inline ctoon_mut_val *ctoon_mut_raw(ctoon_mut_doc *doc,
5934 ctoon_mut_val_one_str({ unsafe_ctoon_set_raw(val, str, strlen(str)); });
5937ctoon_api_inline ctoon_mut_val *ctoon_mut_rawn(ctoon_mut_doc *doc,
5940 ctoon_mut_val_one_str({ unsafe_ctoon_set_raw(val, str, len); });
5943ctoon_api_inline ctoon_mut_val *ctoon_mut_rawcpy(ctoon_mut_doc *doc,
5945 ctoon_mut_val_one_str({
5946 size_t len = strlen(str);
5947 char *new_str = unsafe_ctoon_mut_strncpy(doc, str, len);
5948 if (ctoon_unlikely(!new_str)) return NULL;
5949 unsafe_ctoon_set_raw(val, new_str, len);
5953ctoon_api_inline ctoon_mut_val *ctoon_mut_rawncpy(ctoon_mut_doc *doc,
5956 ctoon_mut_val_one_str({
5957 char *new_str = unsafe_ctoon_mut_strncpy(doc, str, len);
5958 if (ctoon_unlikely(!new_str)) return NULL;
5959 unsafe_ctoon_set_raw(val, new_str, len);
5963ctoon_api_inline ctoon_mut_val *ctoon_mut_null(ctoon_mut_doc *doc) {
5964 ctoon_mut_val_one({ unsafe_ctoon_set_null(val); });
5967ctoon_api_inline ctoon_mut_val *ctoon_mut_true(ctoon_mut_doc *doc) {
5968 ctoon_mut_val_one({ unsafe_ctoon_set_bool(val, true); });
5971ctoon_api_inline ctoon_mut_val *ctoon_mut_false(ctoon_mut_doc *doc) {
5972 ctoon_mut_val_one({ unsafe_ctoon_set_bool(val, false); });
5975ctoon_api_inline ctoon_mut_val *ctoon_mut_bool(ctoon_mut_doc *doc,
5977 ctoon_mut_val_one({ unsafe_ctoon_set_bool(val, _val); });
5980ctoon_api_inline ctoon_mut_val *ctoon_mut_uint(ctoon_mut_doc *doc,
5982 ctoon_mut_val_one({ unsafe_ctoon_set_uint(val, num); });
5985ctoon_api_inline ctoon_mut_val *ctoon_mut_sint(ctoon_mut_doc *doc,
5987 ctoon_mut_val_one({ unsafe_ctoon_set_sint(val, num); });
5990ctoon_api_inline ctoon_mut_val *ctoon_mut_int(ctoon_mut_doc *doc,
5992 ctoon_mut_val_one({ unsafe_ctoon_set_sint(val, num); });
5995ctoon_api_inline ctoon_mut_val *ctoon_mut_float(ctoon_mut_doc *doc,
5997 ctoon_mut_val_one({ unsafe_ctoon_set_float(val, num); });
6000ctoon_api_inline ctoon_mut_val *ctoon_mut_double(ctoon_mut_doc *doc,
6002 ctoon_mut_val_one({ unsafe_ctoon_set_double(val, num); });
6005ctoon_api_inline ctoon_mut_val *ctoon_mut_real(ctoon_mut_doc *doc,
6007 ctoon_mut_val_one({ unsafe_ctoon_set_real(val, num); });
6010ctoon_api_inline ctoon_mut_val *ctoon_mut_str(ctoon_mut_doc *doc,
6012 ctoon_mut_val_one_str({ unsafe_ctoon_set_str(val, str); });
6015ctoon_api_inline ctoon_mut_val *ctoon_mut_strn(ctoon_mut_doc *doc,
6018 ctoon_mut_val_one_str({ unsafe_ctoon_set_strn(val, str, len); });
6021ctoon_api_inline ctoon_mut_val *ctoon_mut_strcpy(ctoon_mut_doc *doc,
6023 ctoon_mut_val_one_str({
6024 size_t len = strlen(str);
6025 bool noesc = unsafe_ctoon_is_str_noesc(str, len);
6026 ctoon_subtype sub = noesc ? CTOON_SUBTYPE_NOESC : CTOON_SUBTYPE_NONE;
6027 char *new_str = unsafe_ctoon_mut_strncpy(doc, str, len);
6028 if (ctoon_unlikely(!new_str)) return NULL;
6029 unsafe_ctoon_set_tag(val, CTOON_TYPE_STR, sub, len);
6030 val->uni.str = new_str;
6034ctoon_api_inline ctoon_mut_val *ctoon_mut_strncpy(ctoon_mut_doc *doc,
6037 ctoon_mut_val_one_str({
6038 char *new_str = unsafe_ctoon_mut_strncpy(doc, str, len);
6039 if (ctoon_unlikely(!new_str)) return NULL;
6040 unsafe_ctoon_set_strn(val, new_str, len);
6044#undef ctoon_mut_val_one
6045#undef ctoon_mut_val_one_str
6049/*==============================================================================
6050 * MARK: - Mutable TOON Array API (Implementation)
6051 *============================================================================*/
6053ctoon_api_inline size_t ctoon_mut_arr_size(ctoon_mut_val *arr) {
6054 return ctoon_mut_is_arr(arr) ? unsafe_ctoon_get_len(arr) : 0;
6057ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_get(ctoon_mut_val *arr,
6059 if (ctoon_likely(idx < ctoon_mut_arr_size(arr))) {
6060 ctoon_mut_val *val = (ctoon_mut_val *)arr->uni.ptr;
6061 while (idx-- > 0) val = val->next;
6067ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_get_first(
6068 ctoon_mut_val *arr) {
6069 if (ctoon_likely(ctoon_mut_arr_size(arr) > 0)) {
6070 return ((ctoon_mut_val *)arr->uni.ptr)->next;
6075ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_get_last(
6076 ctoon_mut_val *arr) {
6077 if (ctoon_likely(ctoon_mut_arr_size(arr) > 0)) {
6078 return ((ctoon_mut_val *)arr->uni.ptr);
6085/*==============================================================================
6086 * MARK: - Mutable TOON Array Iterator API (Implementation)
6087 *============================================================================*/
6089ctoon_api_inline bool ctoon_mut_arr_iter_init(ctoon_mut_val *arr,
6090 ctoon_mut_arr_iter *iter) {
6091 if (ctoon_likely(ctoon_mut_is_arr(arr) && iter)) {
6093 iter->max = unsafe_ctoon_get_len(arr);
6094 iter->cur = iter->max ? (ctoon_mut_val *)arr->uni.ptr : NULL;
6099 if (iter) memset(iter, 0, sizeof(ctoon_mut_arr_iter));
6103ctoon_api_inline ctoon_mut_arr_iter ctoon_mut_arr_iter_with(
6104 ctoon_mut_val *arr) {
6105 ctoon_mut_arr_iter iter;
6106 ctoon_mut_arr_iter_init(arr, &iter);
6110ctoon_api_inline bool ctoon_mut_arr_iter_has_next(ctoon_mut_arr_iter *iter) {
6111 return iter ? iter->idx < iter->max : false;
6114ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_iter_next(
6115 ctoon_mut_arr_iter *iter) {
6116 if (iter && iter->idx < iter->max) {
6117 ctoon_mut_val *val = iter->cur;
6119 iter->cur = val->next;
6126ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_iter_remove(
6127 ctoon_mut_arr_iter *iter) {
6128 if (ctoon_likely(iter && 0 < iter->idx && iter->idx <= iter->max)) {
6129 ctoon_mut_val *prev = iter->pre;
6130 ctoon_mut_val *cur = iter->cur;
6131 ctoon_mut_val *next = cur->next;
6132 if (ctoon_unlikely(iter->idx == iter->max)) iter->arr->uni.ptr = prev;
6135 unsafe_ctoon_set_len(iter->arr, iter->max);
6145/*==============================================================================
6146 * MARK: - Mutable TOON Array Creation API (Implementation)
6147 *============================================================================*/
6149ctoon_api_inline ctoon_mut_val *ctoon_mut_arr(ctoon_mut_doc *doc) {
6150 if (ctoon_likely(doc)) {
6151 ctoon_mut_val *val = unsafe_ctoon_mut_val(doc, 1);
6152 if (ctoon_likely(val)) {
6153 val->tag = CTOON_TYPE_ARR | CTOON_SUBTYPE_NONE;
6160#define ctoon_mut_arr_with_func(func) \
6161 if (ctoon_likely(doc && ((0 < count && count < \
6162 (~(size_t)0) / sizeof(ctoon_mut_val) && vals) || count == 0))) { \
6163 ctoon_mut_val *arr = unsafe_ctoon_mut_val(doc, 1 + count); \
6164 if (ctoon_likely(arr)) { \
6165 arr->tag = ((uint64_t)count << CTOON_TAG_BIT) | CTOON_TYPE_ARR; \
6168 for (i = 0; i < count; i++) { \
6169 ctoon_mut_val *val = arr + i + 1; \
6171 val->next = val + 1; \
6173 arr[count].next = arr + 1; \
6174 arr->uni.ptr = arr + count; \
6181ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_with_bool(
6182 ctoon_mut_doc *doc, const bool *vals, size_t count) {
6183 ctoon_mut_arr_with_func({
6184 unsafe_ctoon_set_bool(val, vals[i]);
6188ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_with_sint(
6189 ctoon_mut_doc *doc, const int64_t *vals, size_t count) {
6190 return ctoon_mut_arr_with_sint64(doc, vals, count);
6193ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_with_uint(
6194 ctoon_mut_doc *doc, const uint64_t *vals, size_t count) {
6195 return ctoon_mut_arr_with_uint64(doc, vals, count);
6198ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_with_real(
6199 ctoon_mut_doc *doc, const double *vals, size_t count) {
6200 ctoon_mut_arr_with_func({
6201 unsafe_ctoon_set_real(val, vals[i]);
6205ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_with_sint8(
6206 ctoon_mut_doc *doc, const int8_t *vals, size_t count) {
6207 ctoon_mut_arr_with_func({
6208 unsafe_ctoon_set_sint(val, vals[i]);
6212ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_with_sint16(
6213 ctoon_mut_doc *doc, const int16_t *vals, size_t count) {
6214 ctoon_mut_arr_with_func({
6215 unsafe_ctoon_set_sint(val, vals[i]);
6219ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_with_sint32(
6220 ctoon_mut_doc *doc, const int32_t *vals, size_t count) {
6221 ctoon_mut_arr_with_func({
6222 unsafe_ctoon_set_sint(val, vals[i]);
6226ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_with_sint64(
6227 ctoon_mut_doc *doc, const int64_t *vals, size_t count) {
6228 ctoon_mut_arr_with_func({
6229 unsafe_ctoon_set_sint(val, vals[i]);
6233ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_with_uint8(
6234 ctoon_mut_doc *doc, const uint8_t *vals, size_t count) {
6235 ctoon_mut_arr_with_func({
6236 unsafe_ctoon_set_uint(val, vals[i]);
6240ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_with_uint16(
6241 ctoon_mut_doc *doc, const uint16_t *vals, size_t count) {
6242 ctoon_mut_arr_with_func({
6243 unsafe_ctoon_set_uint(val, vals[i]);
6247ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_with_uint32(
6248 ctoon_mut_doc *doc, const uint32_t *vals, size_t count) {
6249 ctoon_mut_arr_with_func({
6250 unsafe_ctoon_set_uint(val, vals[i]);
6254ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_with_uint64(
6255 ctoon_mut_doc *doc, const uint64_t *vals, size_t count) {
6256 ctoon_mut_arr_with_func({
6257 unsafe_ctoon_set_uint(val, vals[i]);
6261ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_with_float(
6262 ctoon_mut_doc *doc, const float *vals, size_t count) {
6263 ctoon_mut_arr_with_func({
6264 unsafe_ctoon_set_float(val, vals[i]);
6268ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_with_double(
6269 ctoon_mut_doc *doc, const double *vals, size_t count) {
6270 ctoon_mut_arr_with_func({
6271 unsafe_ctoon_set_double(val, vals[i]);
6275ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_with_str(
6276 ctoon_mut_doc *doc, const char **vals, size_t count) {
6277 ctoon_mut_arr_with_func({
6278 if (ctoon_unlikely(!vals[i])) return NULL;
6279 unsafe_ctoon_set_str(val, vals[i]);
6283ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_with_strn(
6284 ctoon_mut_doc *doc, const char **vals, const size_t *lens, size_t count) {
6285 if (ctoon_unlikely(count > 0 && !lens)) return NULL;
6286 ctoon_mut_arr_with_func({
6287 if (ctoon_unlikely(!vals[i])) return NULL;
6288 unsafe_ctoon_set_strn(val, vals[i], lens[i]);
6292ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_with_strcpy(
6293 ctoon_mut_doc *doc, const char **vals, size_t count) {
6295 const char *str, *new_str;
6296 ctoon_mut_arr_with_func({
6298 if (ctoon_unlikely(!str)) return NULL;
6300 new_str = unsafe_ctoon_mut_strncpy(doc, str, len);
6301 if (ctoon_unlikely(!new_str)) return NULL;
6302 unsafe_ctoon_set_strn(val, new_str, len);
6306ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_with_strncpy(
6307 ctoon_mut_doc *doc, const char **vals, const size_t *lens, size_t count) {
6309 const char *str, *new_str;
6310 if (ctoon_unlikely(count > 0 && !lens)) return NULL;
6311 ctoon_mut_arr_with_func({
6313 if (ctoon_unlikely(!str)) return NULL;
6315 new_str = unsafe_ctoon_mut_strncpy(doc, str, len);
6316 if (ctoon_unlikely(!new_str)) return NULL;
6317 unsafe_ctoon_set_strn(val, new_str, len);
6321#undef ctoon_mut_arr_with_func
6325/*==============================================================================
6326 * MARK: - Mutable TOON Array Modification API (Implementation)
6327 *============================================================================*/
6329ctoon_api_inline bool ctoon_mut_arr_insert(ctoon_mut_val *arr,
6330 ctoon_mut_val *val, size_t idx) {
6331 if (ctoon_likely(ctoon_mut_is_arr(arr) && val)) {
6332 size_t len = unsafe_ctoon_get_len(arr);
6333 if (ctoon_likely(idx <= len)) {
6334 unsafe_ctoon_set_len(arr, len + 1);
6339 ctoon_mut_val *prev = ((ctoon_mut_val *)arr->uni.ptr);
6340 ctoon_mut_val *next = prev->next;
6360ctoon_api_inline bool ctoon_mut_arr_append(ctoon_mut_val *arr,
6361 ctoon_mut_val *val) {
6362 if (ctoon_likely(ctoon_mut_is_arr(arr) && val)) {
6363 size_t len = unsafe_ctoon_get_len(arr);
6364 unsafe_ctoon_set_len(arr, len + 1);
6368 ctoon_mut_val *prev = ((ctoon_mut_val *)arr->uni.ptr);
6369 ctoon_mut_val *next = prev->next;
6379ctoon_api_inline bool ctoon_mut_arr_prepend(ctoon_mut_val *arr,
6380 ctoon_mut_val *val) {
6381 if (ctoon_likely(ctoon_mut_is_arr(arr) && val)) {
6382 size_t len = unsafe_ctoon_get_len(arr);
6383 unsafe_ctoon_set_len(arr, len + 1);
6388 ctoon_mut_val *prev = ((ctoon_mut_val *)arr->uni.ptr);
6389 ctoon_mut_val *next = prev->next;
6398ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_replace(ctoon_mut_val *arr,
6400 ctoon_mut_val *val) {
6401 if (ctoon_likely(ctoon_mut_is_arr(arr) && val)) {
6402 size_t len = unsafe_ctoon_get_len(arr);
6403 if (ctoon_likely(idx < len)) {
6404 if (ctoon_likely(len > 1)) {
6405 ctoon_mut_val *prev = ((ctoon_mut_val *)arr->uni.ptr);
6406 ctoon_mut_val *next = prev->next;
6412 val->next = next->next;
6413 if ((void *)next == arr->uni.ptr) arr->uni.ptr = val;
6416 ctoon_mut_val *prev = ((ctoon_mut_val *)arr->uni.ptr);
6426ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_remove(ctoon_mut_val *arr,
6428 if (ctoon_likely(ctoon_mut_is_arr(arr))) {
6429 size_t len = unsafe_ctoon_get_len(arr);
6430 if (ctoon_likely(idx < len)) {
6431 unsafe_ctoon_set_len(arr, len - 1);
6432 if (ctoon_likely(len > 1)) {
6433 ctoon_mut_val *prev = ((ctoon_mut_val *)arr->uni.ptr);
6434 ctoon_mut_val *next = prev->next;
6439 prev->next = next->next;
6440 if ((void *)next == arr->uni.ptr) arr->uni.ptr = prev;
6443 return ((ctoon_mut_val *)arr->uni.ptr);
6450ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_remove_first(
6451 ctoon_mut_val *arr) {
6452 if (ctoon_likely(ctoon_mut_is_arr(arr))) {
6453 size_t len = unsafe_ctoon_get_len(arr);
6455 ctoon_mut_val *prev = ((ctoon_mut_val *)arr->uni.ptr);
6456 ctoon_mut_val *next = prev->next;
6457 prev->next = next->next;
6458 unsafe_ctoon_set_len(arr, len - 1);
6460 } else if (len == 1) {
6461 ctoon_mut_val *prev = ((ctoon_mut_val *)arr->uni.ptr);
6462 unsafe_ctoon_set_len(arr, 0);
6469ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_remove_last(
6470 ctoon_mut_val *arr) {
6471 if (ctoon_likely(ctoon_mut_is_arr(arr))) {
6472 size_t len = unsafe_ctoon_get_len(arr);
6473 if (ctoon_likely(len > 1)) {
6474 ctoon_mut_val *prev = ((ctoon_mut_val *)arr->uni.ptr);
6475 ctoon_mut_val *next = prev->next;
6476 unsafe_ctoon_set_len(arr, len - 1);
6477 while (--len > 0) prev = prev->next;
6479 next = (ctoon_mut_val *)arr->uni.ptr;
6480 arr->uni.ptr = prev;
6482 } else if (len == 1) {
6483 ctoon_mut_val *prev = ((ctoon_mut_val *)arr->uni.ptr);
6484 unsafe_ctoon_set_len(arr, 0);
6491ctoon_api_inline bool ctoon_mut_arr_remove_range(ctoon_mut_val *arr,
6492 size_t _idx, size_t _len) {
6493 if (ctoon_likely(ctoon_mut_is_arr(arr))) {
6494 ctoon_mut_val *prev, *next;
6496 size_t len = unsafe_ctoon_get_len(arr);
6497 if (ctoon_unlikely(_idx + _len > len)) return false;
6498 if (ctoon_unlikely(_len == 0)) return true;
6499 unsafe_ctoon_set_len(arr, len - _len);
6500 if (ctoon_unlikely(len == _len)) return true;
6501 tail_removed = (_idx + _len == len);
6502 prev = ((ctoon_mut_val *)arr->uni.ptr);
6503 while (_idx-- > 0) prev = prev->next;
6505 while (_len-- > 0) next = next->next;
6507 if (ctoon_unlikely(tail_removed)) arr->uni.ptr = prev;
6513ctoon_api_inline bool ctoon_mut_arr_clear(ctoon_mut_val *arr) {
6514 if (ctoon_likely(ctoon_mut_is_arr(arr))) {
6515 unsafe_ctoon_set_len(arr, 0);
6521ctoon_api_inline bool ctoon_mut_arr_rotate(ctoon_mut_val *arr,
6523 if (ctoon_likely(ctoon_mut_is_arr(arr) &&
6524 unsafe_ctoon_get_len(arr) > idx)) {
6525 ctoon_mut_val *val = (ctoon_mut_val *)arr->uni.ptr;
6526 while (idx-- > 0) val = val->next;
6527 arr->uni.ptr = (void *)val;
6535/*==============================================================================
6536 * MARK: - Mutable TOON Array Modification Convenience API (Implementation)
6537 *============================================================================*/
6539ctoon_api_inline bool ctoon_mut_arr_add_val(ctoon_mut_val *arr,
6540 ctoon_mut_val *val) {
6541 return ctoon_mut_arr_append(arr, val);
6544ctoon_api_inline bool ctoon_mut_arr_add_null(ctoon_mut_doc *doc,
6545 ctoon_mut_val *arr) {
6546 if (ctoon_likely(doc && ctoon_mut_is_arr(arr))) {
6547 ctoon_mut_val *val = ctoon_mut_null(doc);
6548 return ctoon_mut_arr_append(arr, val);
6553ctoon_api_inline bool ctoon_mut_arr_add_true(ctoon_mut_doc *doc,
6554 ctoon_mut_val *arr) {
6555 if (ctoon_likely(doc && ctoon_mut_is_arr(arr))) {
6556 ctoon_mut_val *val = ctoon_mut_true(doc);
6557 return ctoon_mut_arr_append(arr, val);
6562ctoon_api_inline bool ctoon_mut_arr_add_false(ctoon_mut_doc *doc,
6563 ctoon_mut_val *arr) {
6564 if (ctoon_likely(doc && ctoon_mut_is_arr(arr))) {
6565 ctoon_mut_val *val = ctoon_mut_false(doc);
6566 return ctoon_mut_arr_append(arr, val);
6571ctoon_api_inline bool ctoon_mut_arr_add_bool(ctoon_mut_doc *doc,
6574 if (ctoon_likely(doc && ctoon_mut_is_arr(arr))) {
6575 ctoon_mut_val *val = ctoon_mut_bool(doc, _val);
6576 return ctoon_mut_arr_append(arr, val);
6581ctoon_api_inline bool ctoon_mut_arr_add_uint(ctoon_mut_doc *doc,
6584 if (ctoon_likely(doc && ctoon_mut_is_arr(arr))) {
6585 ctoon_mut_val *val = ctoon_mut_uint(doc, num);
6586 return ctoon_mut_arr_append(arr, val);
6591ctoon_api_inline bool ctoon_mut_arr_add_sint(ctoon_mut_doc *doc,
6594 if (ctoon_likely(doc && ctoon_mut_is_arr(arr))) {
6595 ctoon_mut_val *val = ctoon_mut_sint(doc, num);
6596 return ctoon_mut_arr_append(arr, val);
6601ctoon_api_inline bool ctoon_mut_arr_add_int(ctoon_mut_doc *doc,
6604 if (ctoon_likely(doc && ctoon_mut_is_arr(arr))) {
6605 ctoon_mut_val *val = ctoon_mut_sint(doc, num);
6606 return ctoon_mut_arr_append(arr, val);
6611ctoon_api_inline bool ctoon_mut_arr_add_float(ctoon_mut_doc *doc,
6614 if (ctoon_likely(doc && ctoon_mut_is_arr(arr))) {
6615 ctoon_mut_val *val = ctoon_mut_float(doc, num);
6616 return ctoon_mut_arr_append(arr, val);
6621ctoon_api_inline bool ctoon_mut_arr_add_double(ctoon_mut_doc *doc,
6624 if (ctoon_likely(doc && ctoon_mut_is_arr(arr))) {
6625 ctoon_mut_val *val = ctoon_mut_double(doc, num);
6626 return ctoon_mut_arr_append(arr, val);
6631ctoon_api_inline bool ctoon_mut_arr_add_real(ctoon_mut_doc *doc,
6634 if (ctoon_likely(doc && ctoon_mut_is_arr(arr))) {
6635 ctoon_mut_val *val = ctoon_mut_real(doc, num);
6636 return ctoon_mut_arr_append(arr, val);
6641ctoon_api_inline bool ctoon_mut_arr_add_str(ctoon_mut_doc *doc,
6644 if (ctoon_likely(doc && ctoon_mut_is_arr(arr))) {
6645 ctoon_mut_val *val = ctoon_mut_str(doc, str);
6646 return ctoon_mut_arr_append(arr, val);
6651ctoon_api_inline bool ctoon_mut_arr_add_strn(ctoon_mut_doc *doc,
6653 const char *str, size_t len) {
6654 if (ctoon_likely(doc && ctoon_mut_is_arr(arr))) {
6655 ctoon_mut_val *val = ctoon_mut_strn(doc, str, len);
6656 return ctoon_mut_arr_append(arr, val);
6661ctoon_api_inline bool ctoon_mut_arr_add_strcpy(ctoon_mut_doc *doc,
6664 if (ctoon_likely(doc && ctoon_mut_is_arr(arr))) {
6665 ctoon_mut_val *val = ctoon_mut_strcpy(doc, str);
6666 return ctoon_mut_arr_append(arr, val);
6671ctoon_api_inline bool ctoon_mut_arr_add_strncpy(ctoon_mut_doc *doc,
6673 const char *str, size_t len) {
6674 if (ctoon_likely(doc && ctoon_mut_is_arr(arr))) {
6675 ctoon_mut_val *val = ctoon_mut_strncpy(doc, str, len);
6676 return ctoon_mut_arr_append(arr, val);
6681ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_add_arr(ctoon_mut_doc *doc,
6682 ctoon_mut_val *arr) {
6683 if (ctoon_likely(doc && ctoon_mut_is_arr(arr))) {
6684 ctoon_mut_val *val = ctoon_mut_arr(doc);
6685 return ctoon_mut_arr_append(arr, val) ? val : NULL;
6690ctoon_api_inline ctoon_mut_val *ctoon_mut_arr_add_obj(ctoon_mut_doc *doc,
6691 ctoon_mut_val *arr) {
6692 if (ctoon_likely(doc && ctoon_mut_is_arr(arr))) {
6693 ctoon_mut_val *val = ctoon_mut_obj(doc);
6694 return ctoon_mut_arr_append(arr, val) ? val : NULL;
6701/*==============================================================================
6702 * MARK: - Mutable TOON Object API (Implementation)
6703 *============================================================================*/
6705ctoon_api_inline size_t ctoon_mut_obj_size(ctoon_mut_val *obj) {
6706 return ctoon_mut_is_obj(obj) ? unsafe_ctoon_get_len(obj) : 0;
6709ctoon_api_inline ctoon_mut_val *ctoon_mut_obj_get(ctoon_mut_val *obj,
6711 return ctoon_mut_obj_getn(obj, key, key ? strlen(key) : 0);
6714ctoon_api_inline ctoon_mut_val *ctoon_mut_obj_getn(ctoon_mut_val *obj,
6717 size_t len = ctoon_mut_obj_size(obj);
6718 if (ctoon_likely(len && _key)) {
6719 ctoon_mut_val *key = ((ctoon_mut_val *)obj->uni.ptr)->next->next;
6721 if (unsafe_ctoon_equals_strn(key, _key, key_len)) return key->next;
6722 key = key->next->next;
6730/*==============================================================================
6731 * MARK: - Mutable TOON Object Iterator API (Implementation)
6732 *============================================================================*/
6734ctoon_api_inline bool ctoon_mut_obj_iter_init(ctoon_mut_val *obj,
6735 ctoon_mut_obj_iter *iter) {
6736 if (ctoon_likely(ctoon_mut_is_obj(obj) && iter)) {
6738 iter->max = unsafe_ctoon_get_len(obj);
6739 iter->cur = iter->max ? (ctoon_mut_val *)obj->uni.ptr : NULL;
6744 if (iter) memset(iter, 0, sizeof(ctoon_mut_obj_iter));
6748ctoon_api_inline ctoon_mut_obj_iter ctoon_mut_obj_iter_with(
6749 ctoon_mut_val *obj) {
6750 ctoon_mut_obj_iter iter;
6751 ctoon_mut_obj_iter_init(obj, &iter);
6755ctoon_api_inline bool ctoon_mut_obj_iter_has_next(ctoon_mut_obj_iter *iter) {
6756 return iter ? iter->idx < iter->max : false;
6759ctoon_api_inline ctoon_mut_val *ctoon_mut_obj_iter_next(
6760 ctoon_mut_obj_iter *iter) {
6761 if (iter && iter->idx < iter->max) {
6762 ctoon_mut_val *key = iter->cur;
6764 iter->cur = key->next->next;
6771ctoon_api_inline ctoon_mut_val *ctoon_mut_obj_iter_get_val(
6772 ctoon_mut_val *key) {
6773 return key ? key->next : NULL;
6776ctoon_api_inline ctoon_mut_val *ctoon_mut_obj_iter_remove(
6777 ctoon_mut_obj_iter *iter) {
6778 if (ctoon_likely(iter && 0 < iter->idx && iter->idx <= iter->max)) {
6779 ctoon_mut_val *prev = iter->pre;
6780 ctoon_mut_val *cur = iter->cur;
6781 ctoon_mut_val *next = cur->next->next;
6782 if (ctoon_unlikely(iter->idx == iter->max)) iter->obj->uni.ptr = prev;
6785 unsafe_ctoon_set_len(iter->obj, iter->max);
6786 prev->next->next = next;
6793ctoon_api_inline ctoon_mut_val *ctoon_mut_obj_iter_get(
6794 ctoon_mut_obj_iter *iter, const char *key) {
6795 return ctoon_mut_obj_iter_getn(iter, key, key ? strlen(key) : 0);
6798ctoon_api_inline ctoon_mut_val *ctoon_mut_obj_iter_getn(
6799 ctoon_mut_obj_iter *iter, const char *key, size_t key_len) {
6802 size_t max = iter->max;
6803 ctoon_mut_val *pre, *cur = iter->cur;
6804 while (idx++ < max) {
6806 cur = cur->next->next;
6807 if (unsafe_ctoon_equals_strn(cur, key, key_len)) {
6809 if (iter->idx > max) iter->idx -= max + 1;
6821/*==============================================================================
6822 * MARK: - Mutable TOON Object Creation API (Implementation)
6823 *============================================================================*/
6825ctoon_api_inline ctoon_mut_val *ctoon_mut_obj(ctoon_mut_doc *doc) {
6826 if (ctoon_likely(doc)) {
6827 ctoon_mut_val *val = unsafe_ctoon_mut_val(doc, 1);
6828 if (ctoon_likely(val)) {
6829 val->tag = CTOON_TYPE_OBJ | CTOON_SUBTYPE_NONE;
6836ctoon_api_inline ctoon_mut_val *ctoon_mut_obj_with_str(ctoon_mut_doc *doc,
6840 if (ctoon_likely(doc && ((count > 0 && keys && vals) || (count == 0)))) {
6841 ctoon_mut_val *obj = unsafe_ctoon_mut_val(doc, 1 + count * 2);
6842 if (ctoon_likely(obj)) {
6843 obj->tag = ((uint64_t)count << CTOON_TAG_BIT) | CTOON_TYPE_OBJ;
6846 for (i = 0; i < count; i++) {
6847 ctoon_mut_val *key = obj + (i * 2 + 1);
6848 ctoon_mut_val *val = obj + (i * 2 + 2);
6849 uint64_t key_len = (uint64_t)strlen(keys[i]);
6850 uint64_t val_len = (uint64_t)strlen(vals[i]);
6851 key->tag = (key_len << CTOON_TAG_BIT) | CTOON_TYPE_STR;
6852 val->tag = (val_len << CTOON_TAG_BIT) | CTOON_TYPE_STR;
6853 key->uni.str = keys[i];
6854 val->uni.str = vals[i];
6856 val->next = val + 1;
6858 obj[count * 2].next = obj + 1;
6859 obj->uni.ptr = obj + (count * 2 - 1);
6867ctoon_api_inline ctoon_mut_val *ctoon_mut_obj_with_kv(ctoon_mut_doc *doc,
6870 if (ctoon_likely(doc && ((count > 0 && pairs) || (count == 0)))) {
6871 ctoon_mut_val *obj = unsafe_ctoon_mut_val(doc, 1 + count * 2);
6872 if (ctoon_likely(obj)) {
6873 obj->tag = ((uint64_t)count << CTOON_TAG_BIT) | CTOON_TYPE_OBJ;
6876 for (i = 0; i < count; i++) {
6877 ctoon_mut_val *key = obj + (i * 2 + 1);
6878 ctoon_mut_val *val = obj + (i * 2 + 2);
6879 const char *key_str = pairs[i * 2 + 0];
6880 const char *val_str = pairs[i * 2 + 1];
6881 uint64_t key_len = (uint64_t)strlen(key_str);
6882 uint64_t val_len = (uint64_t)strlen(val_str);
6883 key->tag = (key_len << CTOON_TAG_BIT) | CTOON_TYPE_STR;
6884 val->tag = (val_len << CTOON_TAG_BIT) | CTOON_TYPE_STR;
6885 key->uni.str = key_str;
6886 val->uni.str = val_str;
6888 val->next = val + 1;
6890 obj[count * 2].next = obj + 1;
6891 obj->uni.ptr = obj + (count * 2 - 1);
6901/*==============================================================================
6902 * MARK: - Mutable TOON Object Modification API (Implementation)
6903 *============================================================================*/
6905ctoon_api_inline void unsafe_ctoon_mut_obj_add(ctoon_mut_val *obj,
6909 if (ctoon_likely(len)) {
6910 ctoon_mut_val *prev_val = ((ctoon_mut_val *)obj->uni.ptr)->next;
6911 ctoon_mut_val *next_key = prev_val->next;
6912 prev_val->next = key;
6913 val->next = next_key;
6918 obj->uni.ptr = (void *)key;
6919 unsafe_ctoon_set_len(obj, len + 1);
6922ctoon_api_inline ctoon_mut_val *unsafe_ctoon_mut_obj_remove(
6923 ctoon_mut_val *obj, const char *key, size_t key_len) {
6924 size_t obj_len = unsafe_ctoon_get_len(obj);
6926 ctoon_mut_val *pre_key = (ctoon_mut_val *)obj->uni.ptr;
6927 ctoon_mut_val *cur_key = pre_key->next->next;
6928 ctoon_mut_val *removed_item = NULL;
6930 for (i = 0; i < obj_len; i++) {
6931 if (unsafe_ctoon_equals_strn(cur_key, key, key_len)) {
6932 if (!removed_item) removed_item = cur_key->next;
6933 cur_key = cur_key->next->next;
6934 pre_key->next->next = cur_key;
6935 if (i + 1 == obj_len) obj->uni.ptr = pre_key;
6940 cur_key = cur_key->next->next;
6943 unsafe_ctoon_set_len(obj, obj_len);
6944 return removed_item;
6950ctoon_api_inline bool unsafe_ctoon_mut_obj_replace(ctoon_mut_val *obj,
6952 ctoon_mut_val *val) {
6953 size_t key_len = unsafe_ctoon_get_len(key);
6954 size_t obj_len = unsafe_ctoon_get_len(obj);
6956 ctoon_mut_val *pre_key = (ctoon_mut_val *)obj->uni.ptr;
6957 ctoon_mut_val *cur_key = pre_key->next->next;
6959 for (i = 0; i < obj_len; i++) {
6960 if (unsafe_ctoon_equals_strn(cur_key, key->uni.str, key_len)) {
6961 cur_key->next->tag = val->tag;
6962 cur_key->next->uni.u64 = val->uni.u64;
6965 cur_key = cur_key->next->next;
6972ctoon_api_inline void unsafe_ctoon_mut_obj_rotate(ctoon_mut_val *obj,
6974 ctoon_mut_val *key = (ctoon_mut_val *)obj->uni.ptr;
6975 while (idx-- > 0) key = key->next->next;
6976 obj->uni.ptr = (void *)key;
6979ctoon_api_inline bool ctoon_mut_obj_add(ctoon_mut_val *obj,
6981 ctoon_mut_val *val) {
6982 if (ctoon_likely(ctoon_mut_is_obj(obj) &&
6983 ctoon_mut_is_str(key) && val)) {
6984 unsafe_ctoon_mut_obj_add(obj, key, val, unsafe_ctoon_get_len(obj));
6990ctoon_api_inline bool ctoon_mut_obj_put(ctoon_mut_val *obj,
6992 ctoon_mut_val *val) {
6993 bool replaced = false;
6995 ctoon_mut_obj_iter iter;
6996 ctoon_mut_val *cur_key;
6997 if (ctoon_unlikely(!ctoon_mut_is_obj(obj) ||
6998 !ctoon_mut_is_str(key))) return false;
6999 key_len = unsafe_ctoon_get_len(key);
7000 ctoon_mut_obj_iter_init(obj, &iter);
7001 while ((cur_key = ctoon_mut_obj_iter_next(&iter)) != 0) {
7002 if (unsafe_ctoon_equals_strn(cur_key, key->uni.str, key_len)) {
7003 if (!replaced && val) {
7005 val->next = cur_key->next->next;
7006 cur_key->next = val;
7008 ctoon_mut_obj_iter_remove(&iter);
7012 if (!replaced && val) unsafe_ctoon_mut_obj_add(obj, key, val, iter.max);
7016ctoon_api_inline bool ctoon_mut_obj_insert(ctoon_mut_val *obj,
7020 if (ctoon_likely(ctoon_mut_is_obj(obj) &&
7021 ctoon_mut_is_str(key) && val)) {
7022 size_t len = unsafe_ctoon_get_len(obj);
7023 if (ctoon_likely(len >= idx)) {
7025 void *ptr = obj->uni.ptr;
7026 unsafe_ctoon_mut_obj_rotate(obj, idx);
7027 unsafe_ctoon_mut_obj_add(obj, key, val, len);
7030 unsafe_ctoon_mut_obj_add(obj, key, val, len);
7038ctoon_api_inline ctoon_mut_val *ctoon_mut_obj_remove(ctoon_mut_val *obj,
7039 ctoon_mut_val *key) {
7040 if (ctoon_likely(ctoon_mut_is_obj(obj) && ctoon_mut_is_str(key))) {
7041 return unsafe_ctoon_mut_obj_remove(obj, key->uni.str,
7042 unsafe_ctoon_get_len(key));
7047ctoon_api_inline ctoon_mut_val *ctoon_mut_obj_remove_key(
7048 ctoon_mut_val *obj, const char *key) {
7049 if (ctoon_likely(ctoon_mut_is_obj(obj) && key)) {
7050 size_t key_len = strlen(key);
7051 return unsafe_ctoon_mut_obj_remove(obj, key, key_len);
7056ctoon_api_inline ctoon_mut_val *ctoon_mut_obj_remove_keyn(
7057 ctoon_mut_val *obj, const char *key, size_t key_len) {
7058 if (ctoon_likely(ctoon_mut_is_obj(obj) && key)) {
7059 return unsafe_ctoon_mut_obj_remove(obj, key, key_len);
7064ctoon_api_inline bool ctoon_mut_obj_clear(ctoon_mut_val *obj) {
7065 if (ctoon_likely(ctoon_mut_is_obj(obj))) {
7066 unsafe_ctoon_set_len(obj, 0);
7072ctoon_api_inline bool ctoon_mut_obj_replace(ctoon_mut_val *obj,
7074 ctoon_mut_val *val) {
7075 if (ctoon_likely(ctoon_mut_is_obj(obj) &&
7076 ctoon_mut_is_str(key) && val)) {
7077 return unsafe_ctoon_mut_obj_replace(obj, key, val);
7082ctoon_api_inline bool ctoon_mut_obj_rotate(ctoon_mut_val *obj,
7084 if (ctoon_likely(ctoon_mut_is_obj(obj) &&
7085 unsafe_ctoon_get_len(obj) > idx)) {
7086 unsafe_ctoon_mut_obj_rotate(obj, idx);
7094/*==============================================================================
7095 * MARK: - Mutable TOON Object Modification Convenience API (Implementation)
7096 *============================================================================*/
7098#define ctoon_mut_obj_add_func(func) \
7099 if (ctoon_likely(doc && ctoon_mut_is_obj(obj) && _key)) { \
7100 ctoon_mut_val *key = unsafe_ctoon_mut_val(doc, 2); \
7101 if (ctoon_likely(key)) { \
7102 size_t len = unsafe_ctoon_get_len(obj); \
7103 ctoon_mut_val *val = key + 1; \
7104 size_t key_len = strlen(_key); \
7105 bool noesc = unsafe_ctoon_is_str_noesc(_key, key_len); \
7106 key->tag = CTOON_TYPE_STR; \
7107 key->tag |= noesc ? CTOON_SUBTYPE_NOESC : CTOON_SUBTYPE_NONE; \
7108 key->tag |= (uint64_t)strlen(_key) << CTOON_TAG_BIT; \
7109 key->uni.str = _key; \
7111 unsafe_ctoon_mut_obj_add(obj, key, val, len); \
7117ctoon_api_inline bool ctoon_mut_obj_add_null(ctoon_mut_doc *doc,
7120 ctoon_mut_obj_add_func({ unsafe_ctoon_set_null(val); });
7123ctoon_api_inline bool ctoon_mut_obj_add_true(ctoon_mut_doc *doc,
7126 ctoon_mut_obj_add_func({ unsafe_ctoon_set_bool(val, true); });
7129ctoon_api_inline bool ctoon_mut_obj_add_false(ctoon_mut_doc *doc,
7132 ctoon_mut_obj_add_func({ unsafe_ctoon_set_bool(val, false); });
7135ctoon_api_inline bool ctoon_mut_obj_add_bool(ctoon_mut_doc *doc,
7139 ctoon_mut_obj_add_func({ unsafe_ctoon_set_bool(val, _val); });
7142ctoon_api_inline bool ctoon_mut_obj_add_uint(ctoon_mut_doc *doc,
7146 ctoon_mut_obj_add_func({ unsafe_ctoon_set_uint(val, _val); });
7149ctoon_api_inline bool ctoon_mut_obj_add_sint(ctoon_mut_doc *doc,
7153 ctoon_mut_obj_add_func({ unsafe_ctoon_set_sint(val, _val); });
7156ctoon_api_inline bool ctoon_mut_obj_add_int(ctoon_mut_doc *doc,
7160 ctoon_mut_obj_add_func({ unsafe_ctoon_set_sint(val, _val); });
7163ctoon_api_inline bool ctoon_mut_obj_add_float(ctoon_mut_doc *doc,
7167 ctoon_mut_obj_add_func({ unsafe_ctoon_set_float(val, _val); });
7170ctoon_api_inline bool ctoon_mut_obj_add_double(ctoon_mut_doc *doc,
7174 ctoon_mut_obj_add_func({ unsafe_ctoon_set_double(val, _val); });
7177ctoon_api_inline bool ctoon_mut_obj_add_real(ctoon_mut_doc *doc,
7181 ctoon_mut_obj_add_func({ unsafe_ctoon_set_real(val, _val); });
7184ctoon_api_inline bool ctoon_mut_obj_add_str(ctoon_mut_doc *doc,
7188 if (ctoon_unlikely(!_val)) return false;
7189 ctoon_mut_obj_add_func({
7190 size_t val_len = strlen(_val);
7191 bool val_noesc = unsafe_ctoon_is_str_noesc(_val, val_len);
7192 val->tag = ((uint64_t)strlen(_val) << CTOON_TAG_BIT) | CTOON_TYPE_STR;
7193 val->tag |= val_noesc ? CTOON_SUBTYPE_NOESC : CTOON_SUBTYPE_NONE;
7194 val->uni.str = _val;
7198ctoon_api_inline bool ctoon_mut_obj_add_strn(ctoon_mut_doc *doc,
7203 if (ctoon_unlikely(!_val)) return false;
7204 ctoon_mut_obj_add_func({
7205 val->tag = ((uint64_t)_len << CTOON_TAG_BIT) | CTOON_TYPE_STR;
7206 val->uni.str = _val;
7210ctoon_api_inline bool ctoon_mut_obj_add_strcpy(ctoon_mut_doc *doc,
7214 if (ctoon_unlikely(!_val)) return false;
7215 ctoon_mut_obj_add_func({
7216 size_t _len = strlen(_val);
7217 val->uni.str = unsafe_ctoon_mut_strncpy(doc, _val, _len);
7218 if (ctoon_unlikely(!val->uni.str)) return false;
7219 val->tag = ((uint64_t)_len << CTOON_TAG_BIT) | CTOON_TYPE_STR;
7223ctoon_api_inline bool ctoon_mut_obj_add_strncpy(ctoon_mut_doc *doc,
7228 if (ctoon_unlikely(!_val)) return false;
7229 ctoon_mut_obj_add_func({
7230 val->uni.str = unsafe_ctoon_mut_strncpy(doc, _val, _len);
7231 if (ctoon_unlikely(!val->uni.str)) return false;
7232 val->tag = ((uint64_t)_len << CTOON_TAG_BIT) | CTOON_TYPE_STR;
7236ctoon_api_inline ctoon_mut_val *ctoon_mut_obj_add_arr(ctoon_mut_doc *doc,
7239 ctoon_mut_val *key = ctoon_mut_str(doc, _key);
7240 ctoon_mut_val *val = ctoon_mut_arr(doc);
7241 return ctoon_mut_obj_add(obj, key, val) ? val : NULL;
7244ctoon_api_inline ctoon_mut_val *ctoon_mut_obj_add_obj(ctoon_mut_doc *doc,
7247 ctoon_mut_val *key = ctoon_mut_str(doc, _key);
7248 ctoon_mut_val *val = ctoon_mut_obj(doc);
7249 return ctoon_mut_obj_add(obj, key, val) ? val : NULL;
7252ctoon_api_inline bool ctoon_mut_obj_add_val(ctoon_mut_doc *doc,
7255 ctoon_mut_val *_val) {
7256 if (ctoon_unlikely(!_val)) return false;
7257 ctoon_mut_obj_add_func({
7262ctoon_api_inline ctoon_mut_val *ctoon_mut_obj_remove_str(ctoon_mut_val *obj,
7264 return ctoon_mut_obj_remove_strn(obj, key, key ? strlen(key) : 0);
7267ctoon_api_inline ctoon_mut_val *ctoon_mut_obj_remove_strn(
7268 ctoon_mut_val *obj, const char *_key, size_t _len) {
7269 if (ctoon_likely(ctoon_mut_is_obj(obj) && _key)) {
7271 ctoon_mut_obj_iter iter;
7272 ctoon_mut_val *val_removed = NULL;
7273 ctoon_mut_obj_iter_init(obj, &iter);
7274 while ((key = ctoon_mut_obj_iter_next(&iter)) != NULL) {
7275 if (unsafe_ctoon_equals_strn(key, _key, _len)) {
7276 if (!val_removed) val_removed = key->next;
7277 ctoon_mut_obj_iter_remove(&iter);
7285ctoon_api_inline bool ctoon_mut_obj_rename_key(ctoon_mut_doc *doc,
7288 const char *new_key) {
7289 if (!key || !new_key) return false;
7290 return ctoon_mut_obj_rename_keyn(doc, obj, key, strlen(key),
7291 new_key, strlen(new_key));
7294ctoon_api_inline bool ctoon_mut_obj_rename_keyn(ctoon_mut_doc *doc,
7298 const char *new_key,
7300 char *cpy_key = NULL;
7301 ctoon_mut_val *old_key;
7302 ctoon_mut_obj_iter iter;
7303 if (!doc || !obj || !key || !new_key) return false;
7304 ctoon_mut_obj_iter_init(obj, &iter);
7305 while ((old_key = ctoon_mut_obj_iter_next(&iter))) {
7306 if (unsafe_ctoon_equals_strn((void *)old_key, key, len)) {
7308 cpy_key = unsafe_ctoon_mut_strncpy(doc, new_key, new_len);
7309 if (!cpy_key) return false;
7311 ctoon_mut_set_strn(old_key, cpy_key, new_len);
7314 return cpy_key != NULL;
7319#if !defined(CTOON_DISABLE_UTILS) || !CTOON_DISABLE_UTILS
7321/*==============================================================================
7322 * MARK: - TOON Pointer API (Implementation)
7323 *============================================================================*/
7325#define ctoon_ptr_set_err(_code, _msg) do { \
7327 err->code = CTOON_PTR_ERR_##_code; \
7333/* require: val != NULL, *ptr == '/', len > 0 */
7334ctoon_api ctoon_val *unsafe_ctoon_ptr_getx(ctoon_val *val,
7335 const char *ptr, size_t len,
7336 ctoon_ptr_err *err);
7338/* require: val != NULL, *ptr == '/', len > 0 */
7339ctoon_api ctoon_mut_val *unsafe_ctoon_mut_ptr_getx(ctoon_mut_val *val,
7343 ctoon_ptr_err *err);
7345/* require: val/new_val/doc != NULL, *ptr == '/', len > 0 */
7346ctoon_api bool unsafe_ctoon_mut_ptr_putx(ctoon_mut_val *val,
7347 const char *ptr, size_t len,
7348 ctoon_mut_val *new_val,
7350 bool create_parent, bool insert_new,
7352 ctoon_ptr_err *err);
7354/* require: val/err != NULL, *ptr == '/', len > 0 */
7355ctoon_api ctoon_mut_val *unsafe_ctoon_mut_ptr_replacex(
7356 ctoon_mut_val *val, const char *ptr, size_t len, ctoon_mut_val *new_val,
7357 ctoon_ptr_ctx *ctx, ctoon_ptr_err *err);
7359/* require: val/err != NULL, *ptr == '/', len > 0 */
7360ctoon_api ctoon_mut_val *unsafe_ctoon_mut_ptr_removex(ctoon_mut_val *val,
7364 ctoon_ptr_err *err);
7366ctoon_api_inline ctoon_val *ctoon_doc_ptr_get(ctoon_doc *doc,
7368 if (ctoon_unlikely(!ptr)) return NULL;
7369 return ctoon_doc_ptr_getn(doc, ptr, strlen(ptr));
7372ctoon_api_inline ctoon_val *ctoon_doc_ptr_getn(ctoon_doc *doc,
7373 const char *ptr, size_t len) {
7374 return ctoon_doc_ptr_getx(doc, ptr, len, NULL);
7377ctoon_api_inline ctoon_val *ctoon_doc_ptr_getx(ctoon_doc *doc,
7378 const char *ptr, size_t len,
7379 ctoon_ptr_err *err) {
7380 ctoon_ptr_set_err(NONE, NULL);
7381 if (ctoon_unlikely(!doc || !ptr)) {
7382 ctoon_ptr_set_err(PARAMETER, "input parameter is NULL");
7385 if (ctoon_unlikely(!doc->root)) {
7386 ctoon_ptr_set_err(NULL_ROOT, "document's root is NULL");
7389 if (ctoon_unlikely(len == 0)) {
7392 if (ctoon_unlikely(*ptr != '/')) {
7393 ctoon_ptr_set_err(SYNTAX, "no prefix '/'");
7396 return unsafe_ctoon_ptr_getx(doc->root, ptr, len, err);
7399ctoon_api_inline ctoon_val *ctoon_ptr_get(ctoon_val *val,
7401 if (ctoon_unlikely(!ptr)) return NULL;
7402 return ctoon_ptr_getn(val, ptr, strlen(ptr));
7405ctoon_api_inline ctoon_val *ctoon_ptr_getn(ctoon_val *val,
7406 const char *ptr, size_t len) {
7407 return ctoon_ptr_getx(val, ptr, len, NULL);
7410ctoon_api_inline ctoon_val *ctoon_ptr_getx(ctoon_val *val,
7411 const char *ptr, size_t len,
7412 ctoon_ptr_err *err) {
7413 ctoon_ptr_set_err(NONE, NULL);
7414 if (ctoon_unlikely(!val || !ptr)) {
7415 ctoon_ptr_set_err(PARAMETER, "input parameter is NULL");
7418 if (ctoon_unlikely(len == 0)) {
7421 if (ctoon_unlikely(*ptr != '/')) {
7422 ctoon_ptr_set_err(SYNTAX, "no prefix '/'");
7425 return unsafe_ctoon_ptr_getx(val, ptr, len, err);
7428ctoon_api_inline ctoon_mut_val *ctoon_mut_doc_ptr_get(ctoon_mut_doc *doc,
7430 if (!ptr) return NULL;
7431 return ctoon_mut_doc_ptr_getn(doc, ptr, strlen(ptr));
7434ctoon_api_inline ctoon_mut_val *ctoon_mut_doc_ptr_getn(ctoon_mut_doc *doc,
7437 return ctoon_mut_doc_ptr_getx(doc, ptr, len, NULL, NULL);
7440ctoon_api_inline ctoon_mut_val *ctoon_mut_doc_ptr_getx(ctoon_mut_doc *doc,
7444 ctoon_ptr_err *err) {
7445 ctoon_ptr_set_err(NONE, NULL);
7446 if (ctx) memset(ctx, 0, sizeof(*ctx));
7448 if (ctoon_unlikely(!doc || !ptr)) {
7449 ctoon_ptr_set_err(PARAMETER, "input parameter is NULL");
7452 if (ctoon_unlikely(!doc->root)) {
7453 ctoon_ptr_set_err(NULL_ROOT, "document's root is NULL");
7456 if (ctoon_unlikely(len == 0)) {
7459 if (ctoon_unlikely(*ptr != '/')) {
7460 ctoon_ptr_set_err(SYNTAX, "no prefix '/'");
7463 return unsafe_ctoon_mut_ptr_getx(doc->root, ptr, len, ctx, err);
7466ctoon_api_inline ctoon_mut_val *ctoon_mut_ptr_get(ctoon_mut_val *val,
7468 if (!ptr) return NULL;
7469 return ctoon_mut_ptr_getn(val, ptr, strlen(ptr));
7472ctoon_api_inline ctoon_mut_val *ctoon_mut_ptr_getn(ctoon_mut_val *val,
7475 return ctoon_mut_ptr_getx(val, ptr, len, NULL, NULL);
7478ctoon_api_inline ctoon_mut_val *ctoon_mut_ptr_getx(ctoon_mut_val *val,
7482 ctoon_ptr_err *err) {
7483 ctoon_ptr_set_err(NONE, NULL);
7484 if (ctx) memset(ctx, 0, sizeof(*ctx));
7486 if (ctoon_unlikely(!val || !ptr)) {
7487 ctoon_ptr_set_err(PARAMETER, "input parameter is NULL");
7490 if (ctoon_unlikely(len == 0)) {
7493 if (ctoon_unlikely(*ptr != '/')) {
7494 ctoon_ptr_set_err(SYNTAX, "no prefix '/'");
7497 return unsafe_ctoon_mut_ptr_getx(val, ptr, len, ctx, err);
7500ctoon_api_inline bool ctoon_mut_doc_ptr_add(ctoon_mut_doc *doc,
7502 ctoon_mut_val *new_val) {
7503 if (ctoon_unlikely(!ptr)) return false;
7504 return ctoon_mut_doc_ptr_addn(doc, ptr, strlen(ptr), new_val);
7507ctoon_api_inline bool ctoon_mut_doc_ptr_addn(ctoon_mut_doc *doc,
7510 ctoon_mut_val *new_val) {
7511 return ctoon_mut_doc_ptr_addx(doc, ptr, len, new_val, true, NULL, NULL);
7514ctoon_api_inline bool ctoon_mut_doc_ptr_addx(ctoon_mut_doc *doc,
7515 const char *ptr, size_t len,
7516 ctoon_mut_val *new_val,
7519 ctoon_ptr_err *err) {
7520 ctoon_ptr_set_err(NONE, NULL);
7521 if (ctx) memset(ctx, 0, sizeof(*ctx));
7523 if (ctoon_unlikely(!doc || !ptr || !new_val)) {
7524 ctoon_ptr_set_err(PARAMETER, "input parameter is NULL");
7527 if (ctoon_unlikely(len == 0)) {
7529 ctoon_ptr_set_err(SET_ROOT, "cannot set document's root");
7532 doc->root = new_val;
7536 if (ctoon_unlikely(*ptr != '/')) {
7537 ctoon_ptr_set_err(SYNTAX, "no prefix '/'");
7540 if (ctoon_unlikely(!doc->root && !create_parent)) {
7541 ctoon_ptr_set_err(NULL_ROOT, "document's root is NULL");
7544 if (ctoon_unlikely(!doc->root)) {
7545 ctoon_mut_val *root = ctoon_mut_obj(doc);
7546 if (ctoon_unlikely(!root)) {
7547 ctoon_ptr_set_err(MEMORY_ALLOCATION, "failed to create value");
7550 if (unsafe_ctoon_mut_ptr_putx(root, ptr, len, new_val, doc,
7551 create_parent, true, ctx, err)) {
7557 return unsafe_ctoon_mut_ptr_putx(doc->root, ptr, len, new_val, doc,
7558 create_parent, true, ctx, err);
7561ctoon_api_inline bool ctoon_mut_ptr_add(ctoon_mut_val *val,
7563 ctoon_mut_val *new_val,
7564 ctoon_mut_doc *doc) {
7565 if (ctoon_unlikely(!ptr)) return false;
7566 return ctoon_mut_ptr_addn(val, ptr, strlen(ptr), new_val, doc);
7569ctoon_api_inline bool ctoon_mut_ptr_addn(ctoon_mut_val *val,
7570 const char *ptr, size_t len,
7571 ctoon_mut_val *new_val,
7572 ctoon_mut_doc *doc) {
7573 return ctoon_mut_ptr_addx(val, ptr, len, new_val, doc, true, NULL, NULL);
7576ctoon_api_inline bool ctoon_mut_ptr_addx(ctoon_mut_val *val,
7577 const char *ptr, size_t len,
7578 ctoon_mut_val *new_val,
7582 ctoon_ptr_err *err) {
7583 ctoon_ptr_set_err(NONE, NULL);
7584 if (ctx) memset(ctx, 0, sizeof(*ctx));
7586 if (ctoon_unlikely(!val || !ptr || !new_val || !doc)) {
7587 ctoon_ptr_set_err(PARAMETER, "input parameter is NULL");
7590 if (ctoon_unlikely(len == 0)) {
7591 ctoon_ptr_set_err(SET_ROOT, "cannot set root");
7594 if (ctoon_unlikely(*ptr != '/')) {
7595 ctoon_ptr_set_err(SYNTAX, "no prefix '/'");
7598 return unsafe_ctoon_mut_ptr_putx(val, ptr, len, new_val,
7599 doc, create_parent, true, ctx, err);
7602ctoon_api_inline bool ctoon_mut_doc_ptr_set(ctoon_mut_doc *doc,
7604 ctoon_mut_val *new_val) {
7605 if (ctoon_unlikely(!ptr)) return false;
7606 return ctoon_mut_doc_ptr_setn(doc, ptr, strlen(ptr), new_val);
7609ctoon_api_inline bool ctoon_mut_doc_ptr_setn(ctoon_mut_doc *doc,
7610 const char *ptr, size_t len,
7611 ctoon_mut_val *new_val) {
7612 return ctoon_mut_doc_ptr_setx(doc, ptr, len, new_val, true, NULL, NULL);
7615ctoon_api_inline bool ctoon_mut_doc_ptr_setx(ctoon_mut_doc *doc,
7616 const char *ptr, size_t len,
7617 ctoon_mut_val *new_val,
7620 ctoon_ptr_err *err) {
7621 ctoon_ptr_set_err(NONE, NULL);
7622 if (ctx) memset(ctx, 0, sizeof(*ctx));
7624 if (ctoon_unlikely(!doc || !ptr)) {
7625 ctoon_ptr_set_err(PARAMETER, "input parameter is NULL");
7628 if (ctoon_unlikely(len == 0)) {
7629 if (ctx) ctx->old = doc->root;
7630 doc->root = new_val;
7633 if (ctoon_unlikely(*ptr != '/')) {
7634 ctoon_ptr_set_err(SYNTAX, "no prefix '/'");
7639 ctoon_ptr_set_err(RESOLVE, "TOON pointer cannot be resolved");
7642 return !!unsafe_ctoon_mut_ptr_removex(doc->root, ptr, len, ctx, err);
7644 if (ctoon_unlikely(!doc->root && !create_parent)) {
7645 ctoon_ptr_set_err(NULL_ROOT, "document's root is NULL");
7648 if (ctoon_unlikely(!doc->root)) {
7649 ctoon_mut_val *root = ctoon_mut_obj(doc);
7650 if (ctoon_unlikely(!root)) {
7651 ctoon_ptr_set_err(MEMORY_ALLOCATION, "failed to create value");
7654 if (unsafe_ctoon_mut_ptr_putx(root, ptr, len, new_val, doc,
7655 create_parent, false, ctx, err)) {
7661 return unsafe_ctoon_mut_ptr_putx(doc->root, ptr, len, new_val, doc,
7662 create_parent, false, ctx, err);
7665ctoon_api_inline bool ctoon_mut_ptr_set(ctoon_mut_val *val,
7667 ctoon_mut_val *new_val,
7668 ctoon_mut_doc *doc) {
7669 if (ctoon_unlikely(!ptr)) return false;
7670 return ctoon_mut_ptr_setn(val, ptr, strlen(ptr), new_val, doc);
7673ctoon_api_inline bool ctoon_mut_ptr_setn(ctoon_mut_val *val,
7674 const char *ptr, size_t len,
7675 ctoon_mut_val *new_val,
7676 ctoon_mut_doc *doc) {
7677 return ctoon_mut_ptr_setx(val, ptr, len, new_val, doc, true, NULL, NULL);
7680ctoon_api_inline bool ctoon_mut_ptr_setx(ctoon_mut_val *val,
7681 const char *ptr, size_t len,
7682 ctoon_mut_val *new_val,
7686 ctoon_ptr_err *err) {
7687 ctoon_ptr_set_err(NONE, NULL);
7688 if (ctx) memset(ctx, 0, sizeof(*ctx));
7690 if (ctoon_unlikely(!val || !ptr || !doc)) {
7691 ctoon_ptr_set_err(PARAMETER, "input parameter is NULL");
7694 if (ctoon_unlikely(len == 0)) {
7695 ctoon_ptr_set_err(SET_ROOT, "cannot set root");
7698 if (ctoon_unlikely(*ptr != '/')) {
7699 ctoon_ptr_set_err(SYNTAX, "no prefix '/'");
7703 return !!unsafe_ctoon_mut_ptr_removex(val, ptr, len, ctx, err);
7705 return unsafe_ctoon_mut_ptr_putx(val, ptr, len, new_val, doc,
7706 create_parent, false, ctx, err);
7709ctoon_api_inline ctoon_mut_val *ctoon_mut_doc_ptr_replace(
7710 ctoon_mut_doc *doc, const char *ptr, ctoon_mut_val *new_val) {
7711 if (!ptr) return NULL;
7712 return ctoon_mut_doc_ptr_replacen(doc, ptr, strlen(ptr), new_val);
7715ctoon_api_inline ctoon_mut_val *ctoon_mut_doc_ptr_replacen(
7716 ctoon_mut_doc *doc, const char *ptr, size_t len, ctoon_mut_val *new_val) {
7717 return ctoon_mut_doc_ptr_replacex(doc, ptr, len, new_val, NULL, NULL);
7720ctoon_api_inline ctoon_mut_val *ctoon_mut_doc_ptr_replacex(
7721 ctoon_mut_doc *doc, const char *ptr, size_t len, ctoon_mut_val *new_val,
7722 ctoon_ptr_ctx *ctx, ctoon_ptr_err *err) {
7724 ctoon_ptr_set_err(NONE, NULL);
7725 if (ctx) memset(ctx, 0, sizeof(*ctx));
7727 if (ctoon_unlikely(!doc || !ptr || !new_val)) {
7728 ctoon_ptr_set_err(PARAMETER, "input parameter is NULL");
7731 if (ctoon_unlikely(len == 0)) {
7732 ctoon_mut_val *root = doc->root;
7733 if (ctoon_unlikely(!root)) {
7734 ctoon_ptr_set_err(RESOLVE, "TOON pointer cannot be resolved");
7737 if (ctx) ctx->old = root;
7738 doc->root = new_val;
7741 if (ctoon_unlikely(!doc->root)) {
7742 ctoon_ptr_set_err(NULL_ROOT, "document's root is NULL");
7745 if (ctoon_unlikely(*ptr != '/')) {
7746 ctoon_ptr_set_err(SYNTAX, "no prefix '/'");
7749 return unsafe_ctoon_mut_ptr_replacex(doc->root, ptr, len, new_val,
7753ctoon_api_inline ctoon_mut_val *ctoon_mut_ptr_replace(
7754 ctoon_mut_val *val, const char *ptr, ctoon_mut_val *new_val) {
7755 if (!ptr) return NULL;
7756 return ctoon_mut_ptr_replacen(val, ptr, strlen(ptr), new_val);
7759ctoon_api_inline ctoon_mut_val *ctoon_mut_ptr_replacen(
7760 ctoon_mut_val *val, const char *ptr, size_t len, ctoon_mut_val *new_val) {
7761 return ctoon_mut_ptr_replacex(val, ptr, len, new_val, NULL, NULL);
7764ctoon_api_inline ctoon_mut_val *ctoon_mut_ptr_replacex(
7765 ctoon_mut_val *val, const char *ptr, size_t len, ctoon_mut_val *new_val,
7766 ctoon_ptr_ctx *ctx, ctoon_ptr_err *err) {
7768 ctoon_ptr_set_err(NONE, NULL);
7769 if (ctx) memset(ctx, 0, sizeof(*ctx));
7771 if (ctoon_unlikely(!val || !ptr || !new_val)) {
7772 ctoon_ptr_set_err(PARAMETER, "input parameter is NULL");
7775 if (ctoon_unlikely(len == 0)) {
7776 ctoon_ptr_set_err(SET_ROOT, "cannot set root");
7779 if (ctoon_unlikely(*ptr != '/')) {
7780 ctoon_ptr_set_err(SYNTAX, "no prefix '/'");
7783 return unsafe_ctoon_mut_ptr_replacex(val, ptr, len, new_val, ctx, err);
7786ctoon_api_inline ctoon_mut_val *ctoon_mut_doc_ptr_remove(
7787 ctoon_mut_doc *doc, const char *ptr) {
7788 if (!ptr) return NULL;
7789 return ctoon_mut_doc_ptr_removen(doc, ptr, strlen(ptr));
7792ctoon_api_inline ctoon_mut_val *ctoon_mut_doc_ptr_removen(
7793 ctoon_mut_doc *doc, const char *ptr, size_t len) {
7794 return ctoon_mut_doc_ptr_removex(doc, ptr, len, NULL, NULL);
7797ctoon_api_inline ctoon_mut_val *ctoon_mut_doc_ptr_removex(
7798 ctoon_mut_doc *doc, const char *ptr, size_t len,
7799 ctoon_ptr_ctx *ctx, ctoon_ptr_err *err) {
7801 ctoon_ptr_set_err(NONE, NULL);
7802 if (ctx) memset(ctx, 0, sizeof(*ctx));
7804 if (ctoon_unlikely(!doc || !ptr)) {
7805 ctoon_ptr_set_err(PARAMETER, "input parameter is NULL");
7808 if (ctoon_unlikely(!doc->root)) {
7809 ctoon_ptr_set_err(NULL_ROOT, "document's root is NULL");
7812 if (ctoon_unlikely(len == 0)) {
7813 ctoon_mut_val *root = doc->root;
7814 if (ctx) ctx->old = root;
7818 if (ctoon_unlikely(*ptr != '/')) {
7819 ctoon_ptr_set_err(SYNTAX, "no prefix '/'");
7822 return unsafe_ctoon_mut_ptr_removex(doc->root, ptr, len, ctx, err);
7825ctoon_api_inline ctoon_mut_val *ctoon_mut_ptr_remove(ctoon_mut_val *val,
7827 if (!ptr) return NULL;
7828 return ctoon_mut_ptr_removen(val, ptr, strlen(ptr));
7831ctoon_api_inline ctoon_mut_val *ctoon_mut_ptr_removen(ctoon_mut_val *val,
7834 return ctoon_mut_ptr_removex(val, ptr, len, NULL, NULL);
7837ctoon_api_inline ctoon_mut_val *ctoon_mut_ptr_removex(ctoon_mut_val *val,
7841 ctoon_ptr_err *err) {
7842 ctoon_ptr_set_err(NONE, NULL);
7843 if (ctx) memset(ctx, 0, sizeof(*ctx));
7845 if (ctoon_unlikely(!val || !ptr)) {
7846 ctoon_ptr_set_err(PARAMETER, "input parameter is NULL");
7849 if (ctoon_unlikely(len == 0)) {
7850 ctoon_ptr_set_err(SET_ROOT, "cannot set root");
7853 if (ctoon_unlikely(*ptr != '/')) {
7854 ctoon_ptr_set_err(SYNTAX, "no prefix '/'");
7857 return unsafe_ctoon_mut_ptr_removex(val, ptr, len, ctx, err);
7860ctoon_api_inline bool ctoon_ptr_ctx_append(ctoon_ptr_ctx *ctx,
7862 ctoon_mut_val *val) {
7863 ctoon_mut_val *ctn, *pre_key, *pre_val, *cur_key, *cur_val;
7864 if (!ctx || !ctx->ctn || !val) return false;
7867 if (ctoon_mut_is_obj(ctn)) {
7868 if (!key) return false;
7871 if (unsafe_ctoon_get_len(ctn) == 0) {
7875 } else if (!pre_key) {
7876 pre_key = (ctoon_mut_val *)ctn->uni.ptr;
7877 pre_val = pre_key->next;
7878 val->next = pre_val->next;
7879 pre_val->next = key;
7883 cur_key = pre_key->next->next;
7884 cur_val = cur_key->next;
7885 val->next = cur_val->next;
7886 cur_val->next = key;
7887 if (ctn->uni.ptr == cur_key) ctn->uni.ptr = key;
7892 if (unsafe_ctoon_get_len(ctn) == 0) {
7896 } else if (!pre_val) {
7897 pre_val = (ctoon_mut_val *)ctn->uni.ptr;
7898 val->next = pre_val->next;
7899 pre_val->next = val;
7903 cur_val = pre_val->next;
7904 val->next = cur_val->next;
7905 cur_val->next = val;
7906 if (ctn->uni.ptr == cur_val) ctn->uni.ptr = val;
7910 unsafe_ctoon_inc_len(ctn);
7914ctoon_api_inline bool ctoon_ptr_ctx_replace(ctoon_ptr_ctx *ctx,
7915 ctoon_mut_val *val) {
7916 ctoon_mut_val *ctn, *pre_key, *cur_key, *pre_val, *cur_val;
7917 if (!ctx || !ctx->ctn || !ctx->pre || !val) return false;
7919 if (ctoon_mut_is_obj(ctn)) {
7921 pre_val = pre_key->next;
7922 cur_key = pre_val->next;
7923 cur_val = cur_key->next;
7924 /* replace current value */
7925 cur_key->next = val;
7926 val->next = cur_val->next;
7930 cur_val = pre_val->next;
7931 /* replace current value */
7932 if (pre_val != cur_val) {
7933 val->next = cur_val->next;
7934 pre_val->next = val;
7935 if (ctn->uni.ptr == cur_val) ctn->uni.ptr = val;
7946ctoon_api_inline bool ctoon_ptr_ctx_remove(ctoon_ptr_ctx *ctx) {
7947 ctoon_mut_val *ctn, *pre_key, *pre_val, *cur_key, *cur_val;
7949 if (!ctx || !ctx->ctn || !ctx->pre) return false;
7951 if (ctoon_mut_is_obj(ctn)) {
7953 pre_val = pre_key->next;
7954 cur_key = pre_val->next;
7955 cur_val = cur_key->next;
7956 /* remove current key-value */
7957 pre_val->next = cur_val->next;
7958 if (ctn->uni.ptr == cur_key) ctn->uni.ptr = pre_key;
7963 cur_val = pre_val->next;
7964 /* remove current key-value */
7965 pre_val->next = cur_val->next;
7966 if (ctn->uni.ptr == cur_val) ctn->uni.ptr = pre_val;
7970 len = unsafe_ctoon_get_len(ctn) - 1;
7971 if (len == 0) ctn->uni.ptr = NULL;
7972 unsafe_ctoon_set_len(ctn, len);
7976#undef ctoon_ptr_set_err
7980/*==============================================================================
7981 * MARK: - TOON Value at Pointer API (Implementation)
7982 *============================================================================*/
7988ctoon_api_inline bool ctoon_ptr_get_bool(
7989 ctoon_val *root, const char *ptr, bool *value) {
7990 ctoon_val *val = ctoon_ptr_get(root, ptr);
7991 if (value && ctoon_is_bool(val)) {
7992 *value = unsafe_ctoon_get_bool(val);
8003ctoon_api_inline bool ctoon_ptr_get_uint(
8004 ctoon_val *root, const char *ptr, uint64_t *value) {
8005 ctoon_val *val = ctoon_ptr_get(root, ptr);
8007 uint64_t ret = val->uni.u64;
8008 if (unsafe_ctoon_is_uint(val) ||
8009 (unsafe_ctoon_is_sint(val) && !(ret >> 63))) {
8021ctoon_api_inline bool ctoon_ptr_get_sint(
8022 ctoon_val *root, const char *ptr, int64_t *value) {
8023 ctoon_val *val = ctoon_ptr_get(root, ptr);
8025 int64_t ret = val->uni.i64;
8026 if (unsafe_ctoon_is_sint(val) ||
8027 (unsafe_ctoon_is_uint(val) && ret >= 0)) {
8039ctoon_api_inline bool ctoon_ptr_get_real(
8040 ctoon_val *root, const char *ptr, double *value) {
8041 ctoon_val *val = ctoon_ptr_get(root, ptr);
8042 if (value && ctoon_is_real(val)) {
8043 *value = unsafe_ctoon_get_real(val);
8055ctoon_api_inline bool ctoon_ptr_get_num(
8056 ctoon_val *root, const char *ptr, double *value) {
8057 ctoon_val *val = ctoon_ptr_get(root, ptr);
8058 if (value && ctoon_is_num(val)) {
8059 *value = unsafe_ctoon_get_num(val);
8070ctoon_api_inline bool ctoon_ptr_get_str(
8071 ctoon_val *root, const char *ptr, const char **value) {
8072 ctoon_val *val = ctoon_ptr_get(root, ptr);
8073 if (value && ctoon_is_str(val)) {
8074 *value = unsafe_ctoon_get_str(val);
8083/*==============================================================================
8084 * MARK: - Deprecated
8085 *============================================================================*/
8088ctoon_deprecated("renamed to ctoon_doc_ptr_get")
8089ctoon_api_inline ctoon_val *ctoon_doc_get_pointer(ctoon_doc *doc,
8091 return ctoon_doc_ptr_get(doc, ptr);
8095ctoon_deprecated("renamed to ctoon_doc_ptr_getn")
8096ctoon_api_inline ctoon_val *ctoon_doc_get_pointern(ctoon_doc *doc,
8099 return ctoon_doc_ptr_getn(doc, ptr, len);
8103ctoon_deprecated("renamed to ctoon_mut_doc_ptr_get")
8104ctoon_api_inline ctoon_mut_val *ctoon_mut_doc_get_pointer(
8105 ctoon_mut_doc *doc, const char *ptr) {
8106 return ctoon_mut_doc_ptr_get(doc, ptr);
8110ctoon_deprecated("renamed to ctoon_mut_doc_ptr_getn")
8111ctoon_api_inline ctoon_mut_val *ctoon_mut_doc_get_pointern(
8112 ctoon_mut_doc *doc, const char *ptr, size_t len) {
8113 return ctoon_mut_doc_ptr_getn(doc, ptr, len);
8117ctoon_deprecated("renamed to ctoon_ptr_get")
8118ctoon_api_inline ctoon_val *ctoon_get_pointer(ctoon_val *val,
8120 return ctoon_ptr_get(val, ptr);
8124ctoon_deprecated("renamed to ctoon_ptr_getn")
8125ctoon_api_inline ctoon_val *ctoon_get_pointern(ctoon_val *val,
8128 return ctoon_ptr_getn(val, ptr, len);
8132ctoon_deprecated("renamed to ctoon_mut_ptr_get")
8133ctoon_api_inline ctoon_mut_val *ctoon_mut_get_pointer(ctoon_mut_val *val,
8135 return ctoon_mut_ptr_get(val, ptr);
8139ctoon_deprecated("renamed to ctoon_mut_ptr_getn")
8140ctoon_api_inline ctoon_mut_val *ctoon_mut_get_pointern(ctoon_mut_val *val,
8143 return ctoon_mut_ptr_getn(val, ptr, len);
8147ctoon_deprecated("renamed to unsafe_ctoon_ptr_getn")
8148ctoon_api_inline ctoon_val *unsafe_ctoon_get_pointer(ctoon_val *val,
8152 return unsafe_ctoon_ptr_getx(val, ptr, len, &err);
8156ctoon_deprecated("renamed to unsafe_ctoon_mut_ptr_getx")
8157ctoon_api_inline ctoon_mut_val *unsafe_ctoon_mut_get_pointer(
8158 ctoon_mut_val *val, const char *ptr, size_t len) {
8160 return unsafe_ctoon_mut_ptr_getx(val, ptr, len, NULL, &err);
8163#endif /* CTOON_DISABLE_UTILS */
8167/*==============================================================================
8168 * MARK: - Compiler Hint End
8169 *============================================================================*/
8173#endif /* extern "C" end */
uint32_t ctoon_spec_tag_hex(void)
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_json_file(const char *path, ctoon_read_flag flg, const ctoon_alc *alc, ctoon_read_err *err)
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)
unsigned char ctoon_json_to_toon_file(const char *json_path, const char *toon_path)
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)
static const ctoon_read_flag CTOON_READ_NON_STRICT
const char * ctoon_spec_date_string(void)
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)
const char * ctoon_spec_version_string(void)
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
char * ctoon_write_json_mut(const ctoon_mut_doc *doc, int indent, ctoon_write_flag flg, const ctoon_alc *alc, size_t *len, ctoon_write_err *err)
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
unsigned char ctoon_toon_to_json_file(const char *toon_path, const char *json_path)
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)
unsigned char ctoon_toon_to_json_file_opts(const char *toon_path, const char *json_path, ctoon_read_flag rflg, int indent, ctoon_write_flag wflg, const ctoon_alc *alc, ctoon_read_err *rerr, ctoon_write_err *werr)
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)
char * ctoon_json_to_toon(const char *json, size_t len, size_t *out_len)
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)
char * ctoon_json_to_toon_opts(const char *json, size_t len, ctoon_read_flag rflg, const ctoon_write_options *wopts, const ctoon_alc *alc, size_t *out_len, ctoon_read_err *rerr, ctoon_write_err *werr)
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)
char * ctoon_toon_to_json(const char *toon, size_t len, size_t *out_len)
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)
char * ctoon_write_json(const ctoon_doc *doc, int indent, ctoon_write_flag flg, const ctoon_alc *alc, size_t *len, ctoon_write_err *err)
char * ctoon_toon_to_json_opts(const char *toon, size_t len, ctoon_read_flag rflg, int indent, ctoon_write_flag wflg, const ctoon_alc *alc, size_t *out_len, ctoon_read_err *rerr, ctoon_write_err *werr)
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
ctoon_doc * ctoon_read_json_fp(FILE *fp, ctoon_read_flag flg, const ctoon_alc *alc, ctoon_read_err *err)
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)
ctoon_doc * ctoon_read_json(char *dat, size_t len, ctoon_read_flag flg, const ctoon_alc *alc, ctoon_read_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)
unsigned char ctoon_json_to_toon_file_opts(const char *json_path, const char *toon_path, ctoon_read_flag rflg, const ctoon_write_options *wopts, const ctoon_alc *alc, ctoon_read_err *rerr, ctoon_write_err *werr)
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 ctoon_doc * ctoon_read_json_const(const char *dat, size_t len, ctoon_read_flag flg)
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