JSON-YY
view release on metacpan or search on metacpan
#ifndef YYJSON_DISABLE_NON_STANDARD
#define YYJSON_DISABLE_NON_STANDARD 0
#endif
#ifndef YYJSON_DISABLE_UTF8_VALIDATION
#define YYJSON_DISABLE_UTF8_VALIDATION 0
#endif
/*==============================================================================
* MARK: - Macros (Private)
*============================================================================*/
/* Macros used for loop unrolling and other purpose. */
#define repeat2(x) { x x }
#define repeat4(x) { x x x x }
#define repeat8(x) { x x x x x x x x }
#define repeat16(x) { x x x x x x x x x x x x x x x x }
#define repeat2_incr(x) { x(0) x(1) }
#define repeat4_incr(x) { x(0) x(1) x(2) x(3) }
#define repeat8_incr(x) { x(0) x(1) x(2) x(3) x(4) x(5) x(6) x(7) }
#define repeat16_incr(x) { x(0) x(1) x(2) x(3) x(4) x(5) x(6) x(7) \
x(8) x(9) x(10) x(11) x(12) x(13) x(14) x(15) }
#define repeat_in_1_18(x) { x(1) x(2) x(3) x(4) x(5) x(6) x(7) x(8) \
x(9) x(10) x(11) x(12) x(13) x(14) x(15) x(16) \
x(17) x(18) }
/* Macros used to provide branch prediction information for compiler. */
#undef likely
#define likely(x) yyjson_likely(x)
#undef unlikely
#define unlikely(x) yyjson_unlikely(x)
/* Macros used to provide inline information for compiler. */
#undef static_inline
#define static_inline static yyjson_inline
#undef static_noinline
#define static_noinline static yyjson_noinline
/* Macros for min and max. */
#undef yyjson_min
#define yyjson_min(x, y) ((x) < (y) ? (x) : (y))
#undef yyjson_max
#define yyjson_max(x, y) ((x) > (y) ? (x) : (y))
/* Used to write u64 literal for C89 which doesn't support "ULL" suffix. */
#undef U64
#define U64(hi, lo) ((((u64)hi##UL) << 32U) + lo##UL)
#undef U32
#define U32(hi) ((u32)(hi##UL))
/*==============================================================================
* MARK: - UTF8 Validation (Private)
* Each Unicode code point is encoded using 1 to 4 bytes in UTF-8.
* Validation is performed using a 4-byte mask and pattern-based approach,
* which requires the input data to be padded with four zero bytes at the end.
*============================================================================*/
/* Macro for concatenating four u8 into a u32 and keeping the byte order. */
#if YYJSON_ENDIAN == YYJSON_LITTLE_ENDIAN
# define utf8_seq_def(name, a, b, c, d) \
static const u32 utf8_seq_##name = 0x##d##c##b##a##UL;
# define utf8_seq(name) utf8_seq_##name
#elif YYJSON_ENDIAN == YYJSON_BIG_ENDIAN
# define utf8_seq_def(name, a, b, c, d) \
static const u32 utf8_seq_##name = 0x##a##b##c##d##UL;
# define utf8_seq(name) utf8_seq_##name
#else
# define utf8_seq_def(name, a, b, c, d) \
#ifndef YYJSON_HAS_STDINT_H
#endif
/* Define as 1 to include <stdbool.h> for compilers without C99 support. */
#ifndef YYJSON_HAS_STDBOOL_H
#endif
/*==============================================================================
* MARK: - Compiler Macros
*============================================================================*/
/** compiler version (MSVC) */
#ifdef _MSC_VER
# define YYJSON_MSC_VER _MSC_VER
#else
# define YYJSON_MSC_VER 0
#endif
/** compiler version (GCC) */
*/
yyjson_api_inline bool yyjson_arr_iter_has_next(yyjson_arr_iter *iter);
/**
Returns the next element in the iteration, or NULL on end.
If `iter` is NULL, this function will return NULL.
*/
yyjson_api_inline yyjson_val *yyjson_arr_iter_next(yyjson_arr_iter *iter);
/**
Macro for iterating over an array.
It works like iterator, but with a more intuitive API.
@b Example
@code
size_t idx, max;
yyjson_val *val;
yyjson_arr_foreach(arr, idx, max, val) {
your_func(idx, val);
}
@endcode
@return The value to which the specified key is mapped.
NULL if this object contains no mapping for the key or input is invalid.
@warning This function takes a linear search time if the key is not nearby.
*/
yyjson_api_inline yyjson_val *yyjson_obj_iter_getn(yyjson_obj_iter *iter,
const char *key,
size_t key_len);
/**
Macro for iterating over an object.
It works like iterator, but with a more intuitive API.
@b Example
@code
size_t idx, max;
yyjson_val *key, *val;
yyjson_obj_foreach(obj, idx, max, key, val) {
your_func(key, val);
}
@endcode
yyjson_mut_arr_iter *iter);
/**
Removes and returns current element in the iteration.
If `iter` is NULL, this function will return NULL.
*/
yyjson_api_inline yyjson_mut_val *yyjson_mut_arr_iter_remove(
yyjson_mut_arr_iter *iter);
/**
Macro for iterating over an array.
It works like iterator, but with a more intuitive API.
@warning You should not modify the array while iterating over it.
@b Example
@code
size_t idx, max;
yyjson_mut_val *val;
yyjson_mut_arr_foreach(arr, idx, max, val) {
your_func(idx, val);
@param key_len The the length of `key`, in bytes.
@return The value to which the specified key is mapped.
NULL if this object contains no mapping for the key or input is invalid.
@warning This function takes a linear search time if the key is not nearby.
*/
yyjson_api_inline yyjson_mut_val *yyjson_mut_obj_iter_getn(
yyjson_mut_obj_iter *iter, const char *key, size_t key_len);
/**
Macro for iterating over an object.
It works like iterator, but with a more intuitive API.
@warning You should not modify the object while iterating over it.
@b Example
@code
size_t idx, max;
yyjson_mut_val *key, *val;
yyjson_mut_obj_foreach(obj, idx, max, key, val) {
your_func(key, val);
( run in 0.342 second using v1.01-cache-2.11-cpan-483215c6ad5 )