From d704c8755ef46c0d8cb99bbb7cca402ed8faff43 Mon Sep 17 00:00:00 2001 From: Stephan Sundermann Date: Wed, 14 Aug 2024 16:16:34 +0200 Subject: [PATCH 1/8] Build flatcc as part of build --- CMakeLists.txt | 5 +- fbs/CMakeLists.txt | 81 + fbs/flatbuffers_common_builder.h | 672 ------ fbs/flatbuffers_common_reader.h | 571 ----- fbs/hyperion_reply_builder.h | 58 - fbs/hyperion_reply_reader.h | 48 - fbs/hyperion_request_builder.h | 273 --- fbs/hyperion_request_reader.h | 203 -- flatccrt/.gitignore | 1 - flatccrt/CMakeLists.txt | 5 - flatccrt/include/flatcc/flatcc.h | 266 --- flatccrt/include/flatcc/flatcc_accessors.h | 98 - flatccrt/include/flatcc/flatcc_alloc.h | 127 -- flatccrt/include/flatcc/flatcc_builder.h | 1894 ----------------- flatccrt/include/flatcc/flatcc_emitter.h | 215 -- flatccrt/include/flatcc/flatcc_endian.h | 125 -- flatccrt/include/flatcc/flatcc_epilogue.h | 8 - flatccrt/include/flatcc/flatcc_flatbuffers.h | 51 - flatccrt/include/flatcc/flatcc_identifier.h | 144 -- flatccrt/include/flatcc/flatcc_iov.h | 31 - flatccrt/include/flatcc/flatcc_json_parser.h | 896 -------- flatccrt/include/flatcc/flatcc_json_printer.h | 754 ------- flatccrt/include/flatcc/flatcc_portable.h | 14 - flatccrt/include/flatcc/flatcc_prologue.h | 8 - flatccrt/include/flatcc/flatcc_refmap.h | 144 -- flatccrt/include/flatcc/flatcc_rtconfig.h | 162 -- flatccrt/include/flatcc/flatcc_types.h | 97 - flatccrt/include/flatcc/flatcc_unaligned.h | 16 - flatccrt/include/flatcc/flatcc_verifier.h | 239 --- flatccrt/include/flatcc/flatcc_version.h | 14 - flatccrt/include/flatcc/portable/LICENSE | 14 - flatccrt/include/flatcc/portable/README.md | 57 - .../include/flatcc/portable/grisu3_math.h | 320 --- .../include/flatcc/portable/grisu3_parse.h | 583 ----- .../include/flatcc/portable/grisu3_print.h | 265 --- .../include/flatcc/portable/include/README | 4 - .../flatcc/portable/include/linux/endian.h | 1 - .../flatcc/portable/include/std/inttypes.h | 1 - .../flatcc/portable/include/std/stdalign.h | 1 - .../flatcc/portable/include/std/stdbool.h | 1 - .../flatcc/portable/include/std/stdint.h | 1 - .../include/flatcc/portable/paligned_alloc.h | 177 -- flatccrt/include/flatcc/portable/pbase64.h | 448 ---- .../include/flatcc/portable/pdiagnostic.h | 72 - .../include/flatcc/portable/pdiagnostic_pop.h | 15 - .../flatcc/portable/pdiagnostic_push.h | 46 - flatccrt/include/flatcc/portable/pendian.h | 185 -- .../include/flatcc/portable/pendian_detect.h | 118 - flatccrt/include/flatcc/portable/pinline.h | 19 - flatccrt/include/flatcc/portable/pinttypes.h | 52 - flatccrt/include/flatcc/portable/portable.h | 2 - .../include/flatcc/portable/portable_basic.h | 25 - flatccrt/include/flatcc/portable/pparsefp.h | 128 -- flatccrt/include/flatcc/portable/pparseint.h | 374 ---- flatccrt/include/flatcc/portable/pprintfp.h | 39 - flatccrt/include/flatcc/portable/pprintint.h | 633 ------ .../include/flatcc/portable/pstatic_assert.h | 67 - .../flatcc/portable/pstatic_assert_scope.h | 280 --- flatccrt/include/flatcc/portable/pstdalign.h | 139 -- flatccrt/include/flatcc/portable/pstdbool.h | 37 - flatccrt/include/flatcc/portable/pstdint.h | 898 -------- flatccrt/include/flatcc/portable/punaligned.h | 190 -- flatccrt/include/flatcc/portable/pversion.h | 6 - flatccrt/include/flatcc/portable/pwarnings.h | 52 - flatccrt/include/flatcc/reflection/README | 19 - .../reflection/flatbuffers_common_builder.h | 672 ------ .../reflection/flatbuffers_common_reader.h | 571 ----- .../flatcc/reflection/reflection_builder.h | 344 --- .../flatcc/reflection/reflection_reader.h | 284 --- .../flatcc/reflection/reflection_verifier.h | 239 --- flatccrt/include/flatcc/support/README | 1 - flatccrt/include/flatcc/support/cdump.h | 39 - flatccrt/include/flatcc/support/elapsed.h | 73 - flatccrt/include/flatcc/support/hexdump.h | 47 - flatccrt/include/flatcc/support/readfile.h | 63 - flatccrt/lib/libflatccrt.a | Bin 736632 -> 0 bytes libyuv/.gitignore | 2 - libyuv/CMakeLists.txt | 9 +- libyuv/include/.gitignore | 2 - 79 files changed, 89 insertions(+), 14746 deletions(-) create mode 100644 fbs/CMakeLists.txt delete mode 100644 fbs/flatbuffers_common_builder.h delete mode 100644 fbs/flatbuffers_common_reader.h delete mode 100644 fbs/hyperion_reply_builder.h delete mode 100644 fbs/hyperion_reply_reader.h delete mode 100644 fbs/hyperion_request_builder.h delete mode 100644 fbs/hyperion_request_reader.h delete mode 100644 flatccrt/.gitignore delete mode 100644 flatccrt/CMakeLists.txt delete mode 100644 flatccrt/include/flatcc/flatcc.h delete mode 100644 flatccrt/include/flatcc/flatcc_accessors.h delete mode 100644 flatccrt/include/flatcc/flatcc_alloc.h delete mode 100644 flatccrt/include/flatcc/flatcc_builder.h delete mode 100644 flatccrt/include/flatcc/flatcc_emitter.h delete mode 100644 flatccrt/include/flatcc/flatcc_endian.h delete mode 100644 flatccrt/include/flatcc/flatcc_epilogue.h delete mode 100644 flatccrt/include/flatcc/flatcc_flatbuffers.h delete mode 100644 flatccrt/include/flatcc/flatcc_identifier.h delete mode 100644 flatccrt/include/flatcc/flatcc_iov.h delete mode 100644 flatccrt/include/flatcc/flatcc_json_parser.h delete mode 100644 flatccrt/include/flatcc/flatcc_json_printer.h delete mode 100644 flatccrt/include/flatcc/flatcc_portable.h delete mode 100644 flatccrt/include/flatcc/flatcc_prologue.h delete mode 100644 flatccrt/include/flatcc/flatcc_refmap.h delete mode 100644 flatccrt/include/flatcc/flatcc_rtconfig.h delete mode 100644 flatccrt/include/flatcc/flatcc_types.h delete mode 100644 flatccrt/include/flatcc/flatcc_unaligned.h delete mode 100644 flatccrt/include/flatcc/flatcc_verifier.h delete mode 100644 flatccrt/include/flatcc/flatcc_version.h delete mode 100644 flatccrt/include/flatcc/portable/LICENSE delete mode 100644 flatccrt/include/flatcc/portable/README.md delete mode 100644 flatccrt/include/flatcc/portable/grisu3_math.h delete mode 100644 flatccrt/include/flatcc/portable/grisu3_parse.h delete mode 100644 flatccrt/include/flatcc/portable/grisu3_print.h delete mode 100644 flatccrt/include/flatcc/portable/include/README delete mode 100644 flatccrt/include/flatcc/portable/include/linux/endian.h delete mode 100644 flatccrt/include/flatcc/portable/include/std/inttypes.h delete mode 100644 flatccrt/include/flatcc/portable/include/std/stdalign.h delete mode 100644 flatccrt/include/flatcc/portable/include/std/stdbool.h delete mode 100644 flatccrt/include/flatcc/portable/include/std/stdint.h delete mode 100644 flatccrt/include/flatcc/portable/paligned_alloc.h delete mode 100644 flatccrt/include/flatcc/portable/pbase64.h delete mode 100644 flatccrt/include/flatcc/portable/pdiagnostic.h delete mode 100644 flatccrt/include/flatcc/portable/pdiagnostic_pop.h delete mode 100644 flatccrt/include/flatcc/portable/pdiagnostic_push.h delete mode 100644 flatccrt/include/flatcc/portable/pendian.h delete mode 100644 flatccrt/include/flatcc/portable/pendian_detect.h delete mode 100644 flatccrt/include/flatcc/portable/pinline.h delete mode 100644 flatccrt/include/flatcc/portable/pinttypes.h delete mode 100644 flatccrt/include/flatcc/portable/portable.h delete mode 100644 flatccrt/include/flatcc/portable/portable_basic.h delete mode 100644 flatccrt/include/flatcc/portable/pparsefp.h delete mode 100644 flatccrt/include/flatcc/portable/pparseint.h delete mode 100644 flatccrt/include/flatcc/portable/pprintfp.h delete mode 100644 flatccrt/include/flatcc/portable/pprintint.h delete mode 100644 flatccrt/include/flatcc/portable/pstatic_assert.h delete mode 100644 flatccrt/include/flatcc/portable/pstatic_assert_scope.h delete mode 100644 flatccrt/include/flatcc/portable/pstdalign.h delete mode 100644 flatccrt/include/flatcc/portable/pstdbool.h delete mode 100644 flatccrt/include/flatcc/portable/pstdint.h delete mode 100644 flatccrt/include/flatcc/portable/punaligned.h delete mode 100644 flatccrt/include/flatcc/portable/pversion.h delete mode 100644 flatccrt/include/flatcc/portable/pwarnings.h delete mode 100644 flatccrt/include/flatcc/reflection/README delete mode 100644 flatccrt/include/flatcc/reflection/flatbuffers_common_builder.h delete mode 100644 flatccrt/include/flatcc/reflection/flatbuffers_common_reader.h delete mode 100644 flatccrt/include/flatcc/reflection/reflection_builder.h delete mode 100644 flatccrt/include/flatcc/reflection/reflection_reader.h delete mode 100644 flatccrt/include/flatcc/reflection/reflection_verifier.h delete mode 100644 flatccrt/include/flatcc/support/README delete mode 100644 flatccrt/include/flatcc/support/cdump.h delete mode 100644 flatccrt/include/flatcc/support/elapsed.h delete mode 100644 flatccrt/include/flatcc/support/hexdump.h delete mode 100644 flatccrt/include/flatcc/support/readfile.h delete mode 100644 flatccrt/lib/libflatccrt.a delete mode 100644 libyuv/.gitignore delete mode 100644 libyuv/include/.gitignore diff --git a/CMakeLists.txt b/CMakeLists.txt index cb326b5..e1e9960 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,7 +9,7 @@ list(JOIN _cflags_list " " COMMON_FLAGS) add_subdirectory(libyuv) add_subdirectory(tv-native-apis) -add_subdirectory(flatccrt) +add_subdirectory(fbs) add_compile_options(${_cflags_list} -Wall -Wextra -Wpedantic -Werror -DSECURITY_COMPATIBILITY) @@ -63,8 +63,7 @@ set_target_properties(hyperion-webos PROPERTIES # LINK_FLAGS "-Wl,-rpath,'$ORIGIN:$ORIGIN/lib' -Wl,-z,origin" ) target_include_directories(hyperion-webos PRIVATE ${CMAKE_BINARY_DIR}) -target_include_directories(hyperion-webos SYSTEM PUBLIC fbs) -target_link_libraries(hyperion-webos flatccrt pthread dl yuv rt ${GTHREAD2_LDFLAGS} ${PBNJSON_LDFLAGS} ${LS2_LDFLAGS} ${GLIB2_LDFLAGS} ${PMLOG_LDFLAGS}) +target_link_libraries(hyperion-webos fbs flatccrt pthread dl yuv rt ${GTHREAD2_LDFLAGS} ${PBNJSON_LDFLAGS} ${LS2_LDFLAGS} ${GLIB2_LDFLAGS} ${PMLOG_LDFLAGS}) add_dependencies(hyperion-webos version gm_backend dile_vt_backend halgal_backend vtcapture_backend) set_property(TARGET hyperion-webos PROPERTY ENABLE_EXPORTS 1) diff --git a/fbs/CMakeLists.txt b/fbs/CMakeLists.txt new file mode 100644 index 0000000..0e228c7 --- /dev/null +++ b/fbs/CMakeLists.txt @@ -0,0 +1,81 @@ +include(ExternalProject) + +if (CMAKE_BUILD_TYPE MATCHES "Debug") + SET(FLATCC_EXECUTABLE ${CMAKE_CURRENT_BINARY_DIR}/native/bin/flatcc_d) +else () + SET(FLATCC_EXECUTABLE ${CMAKE_CURRENT_BINARY_DIR}/native/bin/flatcc) +endif () + +ExternalProject_Add(flatcc-native + URL https://github.com/dvidelabs/flatcc/archive/v0.6.1.tar.gz + URL_HASH SHA512=46ba5ca75facc7d3360dba797d24ae7bfe539a854a48831e1c7b96528cf9594d8bea22b267678fd7c6d742b6636d9e52930987119b4c6b2e38d4abe89b990cae + DOWNLOAD_EXTRACT_TIMESTAMP TRUE + CMAKE_ARGS + -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} + -DBUILD_SHARED_LIBS=OFF + -DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}/native + -DFLATCC_TEST=OFF + -DFLATCC_INSTALL=ON + BUILD_BYPRODUCTS ${FLATCC_EXECUTABLE} +) + +SET(FLATCC_EXECUTABLE ${FLATCC_EXECUTABLE}) +add_custom_command( + OUTPUT hyperion_reply_builder.h hyperion_reply_reader.h flatbuffers_common_builder.h flatbuffers_common_reader.h + COMMAND ${FLATCC_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/hyperion_reply.fbs -w --common_reader --common_builder + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/hyperion_reply.fbs +) + +add_custom_command( + OUTPUT hyperion_request_builder.h hyperion_request_reader.h + COMMAND ${FLATCC_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/hyperion_request.fbs -w + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/hyperion_request.fbs +) + +add_custom_target(generate-fbs DEPENDS + flatbuffers_common_builder.h + flatbuffers_common_reader.h + hyperion_reply_builder.h + hyperion_reply_reader.h + hyperion_request_builder.h + hyperion_request_reader.h) +add_dependencies(generate-fbs flatcc-native) + +add_library(fbs INTERFACE) +target_include_directories(fbs SYSTEM INTERFACE ${CMAKE_CURRENT_BINARY_DIR}) +add_dependencies(fbs generate-fbs) + + +if (CMAKE_BUILD_TYPE MATCHES "Debug") + SET(FLATCC_LIB ${CMAKE_CURRENT_BINARY_DIR}/lib/libflatccrt_d.a) +else () + SET(FLATCC_LIB ${CMAKE_CURRENT_BINARY_DIR}/lib/libflatccrt.a) +endif () + +ExternalProject_Add(flatcc-target + URL https://github.com/dvidelabs/flatcc/archive/v0.6.1.tar.gz + URL_HASH SHA512=46ba5ca75facc7d3360dba797d24ae7bfe539a854a48831e1c7b96528cf9594d8bea22b267678fd7c6d742b6636d9e52930987119b4c6b2e38d4abe89b990cae + DOWNLOAD_EXTRACT_TIMESTAMP TRUE + CMAKE_ARGS + -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} + -DCMAKE_C_FLAGS=${COMMON_FLAGS} + -DCMAKE_CXX_FLAGS=${COMMON_FLAGS} + -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} + -DBUILD_SHARED_LIBS=OFF + -DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR} + -DFLATCC_TEST=OFF + -DFLATCC_RTONLY=ON + -DFLATCC_INSTALL=ON + -DCMAKE_POSITION_INDEPENDENT_CODE=ON + BUILD_BYPRODUCTS ${FLATCC_LIB} +) + +add_library(flatccrt IMPORTED STATIC GLOBAL) +add_dependencies(flatccrt flatcc-target) +set(FLATCCRT_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR}/include) +file(MAKE_DIRECTORY ${FLATCCRT_INCLUDE_DIRS}) +set_target_properties(flatccrt PROPERTIES + IMPORTED_LOCATION ${FLATCC_LIB} + INTERFACE_INCLUDE_DIRECTORIES ${FLATCCRT_INCLUDE_DIRS} + INTERFACE_SYSTEM_INCLUDE_DIRECTORIES ${FLATCCRT_INCLUDE_DIRS} +) diff --git a/fbs/flatbuffers_common_builder.h b/fbs/flatbuffers_common_builder.h deleted file mode 100644 index ea728ac..0000000 --- a/fbs/flatbuffers_common_builder.h +++ /dev/null @@ -1,672 +0,0 @@ -#ifndef FLATBUFFERS_COMMON_BUILDER_H -#define FLATBUFFERS_COMMON_BUILDER_H - -/* Generated by flatcc 0.6.0 FlatBuffers schema compiler for C by dvide.com */ - -/* Common FlatBuffers build functionality for C. */ - -#include "flatcc/flatcc_prologue.h" -#ifndef FLATBUILDER_H -#include "flatcc/flatcc_builder.h" -#endif -typedef flatcc_builder_t flatbuffers_builder_t; -typedef flatcc_builder_ref_t flatbuffers_ref_t; -typedef flatcc_builder_ref_t flatbuffers_vec_ref_t; -typedef flatcc_builder_union_ref_t flatbuffers_union_ref_t; -typedef flatcc_builder_union_vec_ref_t flatbuffers_union_vec_ref_t; -/* integer return code (ref and ptr always fail on 0) */ -#define flatbuffers_failed(x) ((x) < 0) -typedef flatbuffers_ref_t flatbuffers_root_t; -#define flatbuffers_root(ref) ((flatbuffers_root_t)(ref)) - -#define __flatbuffers_memoize_begin(B, src)\ -do { flatcc_builder_ref_t _ref; if ((_ref = flatcc_builder_refmap_find((B), (src)))) return _ref; } while (0) -#define __flatbuffers_memoize_end(B, src, op) do { return flatcc_builder_refmap_insert((B), (src), (op)); } while (0) -#define __flatbuffers_memoize(B, src, op) do { __flatbuffers_memoize_begin(B, src); __flatbuffers_memoize_end(B, src, op); } while (0) - -#define __flatbuffers_build_buffer(NS)\ -typedef NS ## ref_t NS ## buffer_ref_t;\ -static inline int NS ## buffer_start(NS ## builder_t *B, const NS ##fid_t fid)\ -{ return flatcc_builder_start_buffer(B, fid, 0, 0); }\ -static inline int NS ## buffer_start_with_size(NS ## builder_t *B, const NS ##fid_t fid)\ -{ return flatcc_builder_start_buffer(B, fid, 0, flatcc_builder_with_size); }\ -static inline int NS ## buffer_start_aligned(NS ## builder_t *B, NS ##fid_t fid, uint16_t block_align)\ -{ return flatcc_builder_start_buffer(B, fid, block_align, 0); }\ -static inline int NS ## buffer_start_aligned_with_size(NS ## builder_t *B, NS ##fid_t fid, uint16_t block_align)\ -{ return flatcc_builder_start_buffer(B, fid, block_align, flatcc_builder_with_size); }\ -static inline NS ## buffer_ref_t NS ## buffer_end(NS ## builder_t *B, NS ## ref_t root)\ -{ return flatcc_builder_end_buffer(B, root); } - -#define __flatbuffers_build_table_root(NS, N, FID, TFID)\ -static inline int N ## _start_as_root(NS ## builder_t *B)\ -{ return NS ## buffer_start(B, FID) ? -1 : N ## _start(B); }\ -static inline int N ## _start_as_root_with_size(NS ## builder_t *B)\ -{ return NS ## buffer_start_with_size(B, FID) ? -1 : N ## _start(B); }\ -static inline int N ## _start_as_typed_root(NS ## builder_t *B)\ -{ return NS ## buffer_start(B, TFID) ? -1 : N ## _start(B); }\ -static inline int N ## _start_as_typed_root_with_size(NS ## builder_t *B)\ -{ return NS ## buffer_start_with_size(B, TFID) ? -1 : N ## _start(B); }\ -static inline NS ## buffer_ref_t N ## _end_as_root(NS ## builder_t *B)\ -{ return NS ## buffer_end(B, N ## _end(B)); }\ -static inline NS ## buffer_ref_t N ## _end_as_typed_root(NS ## builder_t *B)\ -{ return NS ## buffer_end(B, N ## _end(B)); }\ -static inline NS ## buffer_ref_t N ## _create_as_root(NS ## builder_t *B __ ## N ## _formal_args)\ -{ if (NS ## buffer_start(B, FID)) return 0; return NS ## buffer_end(B, N ## _create(B __ ## N ## _call_args)); }\ -static inline NS ## buffer_ref_t N ## _create_as_root_with_size(NS ## builder_t *B __ ## N ## _formal_args)\ -{ if (NS ## buffer_start_with_size(B, FID)) return 0; return NS ## buffer_end(B, N ## _create(B __ ## N ## _call_args)); }\ -static inline NS ## buffer_ref_t N ## _create_as_typed_root(NS ## builder_t *B __ ## N ## _formal_args)\ -{ if (NS ## buffer_start(B, TFID)) return 0; return NS ## buffer_end(B, N ## _create(B __ ## N ## _call_args)); }\ -static inline NS ## buffer_ref_t N ## _create_as_typed_root_with_size(NS ## builder_t *B __ ## N ## _formal_args)\ -{ if (NS ## buffer_start_with_size(B, TFID)) return 0; return NS ## buffer_end(B, N ## _create(B __ ## N ## _call_args)); }\ -static inline NS ## buffer_ref_t N ## _clone_as_root(NS ## builder_t *B, N ## _table_t t)\ -{ if (NS ## buffer_start(B, FID)) return 0; return NS ## buffer_end(B, N ## _clone(B, t)); }\ -static inline NS ## buffer_ref_t N ## _clone_as_root_with_size(NS ## builder_t *B, N ## _table_t t)\ -{ if (NS ## buffer_start_with_size(B, FID)) return 0; return NS ## buffer_end(B, N ## _clone(B, t)); }\ -static inline NS ## buffer_ref_t N ## _clone_as_typed_root(NS ## builder_t *B, N ## _table_t t)\ -{ if (NS ## buffer_start(B, TFID)) return 0;return NS ## buffer_end(B, N ## _clone(B, t)); }\ -static inline NS ## buffer_ref_t N ## _clone_as_typed_root_with_size(NS ## builder_t *B, N ## _table_t t)\ -{ if (NS ## buffer_start_with_size(B, TFID)) return 0; return NS ## buffer_end(B, N ## _clone(B, t)); } - -#define __flatbuffers_build_table_prolog(NS, N, FID, TFID)\ -__flatbuffers_build_table_vector_ops(NS, N ## _vec, N)\ -__flatbuffers_build_table_root(NS, N, FID, TFID) - -#define __flatbuffers_build_struct_root(NS, N, A, FID, TFID)\ -static inline N ## _t *N ## _start_as_root(NS ## builder_t *B)\ -{ return NS ## buffer_start(B, FID) ? 0 : N ## _start(B); }\ -static inline N ## _t *N ## _start_as_root_with_size(NS ## builder_t *B)\ -{ return NS ## buffer_start_with_size(B, FID) ? 0 : N ## _start(B); }\ -static inline N ## _t *N ## _start_as_typed_root(NS ## builder_t *B)\ -{ return NS ## buffer_start(B, TFID) ? 0 : N ## _start(B); }\ -static inline N ## _t *N ## _start_as_typed_root_with_size(NS ## builder_t *B)\ -{ return NS ## buffer_start_with_size(B, TFID) ? 0 : N ## _start(B); }\ -static inline NS ## buffer_ref_t N ## _end_as_root(NS ## builder_t *B)\ -{ return NS ## buffer_end(B, N ## _end(B)); }\ -static inline NS ## buffer_ref_t N ## _end_as_typed_root(NS ## builder_t *B)\ -{ return NS ## buffer_end(B, N ## _end(B)); }\ -static inline NS ## buffer_ref_t N ## _end_pe_as_root(NS ## builder_t *B)\ -{ return NS ## buffer_end(B, N ## _end_pe(B)); }\ -static inline NS ## buffer_ref_t N ## _end_pe_as_typed_root(NS ## builder_t *B)\ -{ return NS ## buffer_end(B, N ## _end_pe(B)); }\ -static inline NS ## buffer_ref_t N ## _create_as_root(NS ## builder_t *B __ ## N ## _formal_args)\ -{ return flatcc_builder_create_buffer(B, FID, 0,\ - N ## _create(B __ ## N ## _call_args), A, 0); }\ -static inline NS ## buffer_ref_t N ## _create_as_root_with_size(NS ## builder_t *B __ ## N ## _formal_args)\ -{ return flatcc_builder_create_buffer(B, FID, 0,\ - N ## _create(B __ ## N ## _call_args), A, flatcc_builder_with_size); }\ -static inline NS ## buffer_ref_t N ## _create_as_typed_root(NS ## builder_t *B __ ## N ## _formal_args)\ -{ return flatcc_builder_create_buffer(B, TFID, 0,\ - N ## _create(B __ ## N ## _call_args), A, 0); }\ -static inline NS ## buffer_ref_t N ## _create_as_typed_root_with_size(NS ## builder_t *B __ ## N ## _formal_args)\ -{ return flatcc_builder_create_buffer(B, TFID, 0,\ - N ## _create(B __ ## N ## _call_args), A, flatcc_builder_with_size); }\ -static inline NS ## buffer_ref_t N ## _clone_as_root(NS ## builder_t *B, N ## _struct_t p)\ -{ return flatcc_builder_create_buffer(B, FID, 0, N ## _clone(B, p), A, 0); }\ -static inline NS ## buffer_ref_t N ## _clone_as_root_with_size(NS ## builder_t *B, N ## _struct_t p)\ -{ return flatcc_builder_create_buffer(B, FID, 0, N ## _clone(B, p), A, flatcc_builder_with_size); }\ -static inline NS ## buffer_ref_t N ## _clone_as_typed_root(NS ## builder_t *B, N ## _struct_t p)\ -{ return flatcc_builder_create_buffer(B, TFID, 0, N ## _clone(B, p), A, 0); }\ -static inline NS ## buffer_ref_t N ## _clone_as_typed_root_with_size(NS ## builder_t *B, N ## _struct_t p)\ -{ return flatcc_builder_create_buffer(B, TFID, 0, N ## _clone(B, p), A, flatcc_builder_with_size); } - -#define __flatbuffers_build_nested_table_root(NS, N, TN, FID, TFID)\ -static inline int N ## _start_as_root(NS ## builder_t *B)\ -{ return NS ## buffer_start(B, FID) ? -1 : TN ## _start(B); }\ -static inline int N ## _start_as_typed_root(NS ## builder_t *B)\ -{ return NS ## buffer_start(B, TFID) ? -1 : TN ## _start(B); }\ -static inline int N ## _end_as_root(NS ## builder_t *B)\ -{ return N ## _add(B, NS ## buffer_end(B, TN ## _end(B))); }\ -static inline int N ## _end_as_typed_root(NS ## builder_t *B)\ -{ return N ## _add(B, NS ## buffer_end(B, TN ## _end(B))); }\ -static inline int N ## _nest(NS ## builder_t *B, void *data, size_t size, uint16_t align)\ -{ return N ## _add(B, flatcc_builder_create_vector(B, data, size, 1,\ - align ? align : 8, FLATBUFFERS_COUNT_MAX(1))); }\ -static inline int N ## _typed_nest(NS ## builder_t *B, void *data, size_t size, uint16_t align)\ -{ return N ## _add(B, flatcc_builder_create_vector(B, data, size, 1,\ - align ? align : 8, FLATBUFFERS_COUNT_MAX(1))); }\ -static inline int N ## _clone_as_root(NS ## builder_t *B, TN ## _table_t t)\ -{ return N ## _add(B, TN ## _clone_as_root(B, t)); }\ -static inline int N ## _clone_as_typed_root(NS ## builder_t *B, TN ## _table_t t)\ -{ return N ## _add(B, TN ## _clone_as_typed_root(B, t)); } - -#define __flatbuffers_build_nested_struct_root(NS, N, TN, A, FID, TFID)\ -static inline TN ## _t *N ## _start_as_root(NS ## builder_t *B)\ -{ return NS ## buffer_start(B, FID) ? 0 : TN ## _start(B); }\ -static inline TN ## _t *N ## _start_as_typed_root(NS ## builder_t *B)\ -{ return NS ## buffer_start(B, FID) ? 0 : TN ## _start(B); }\ -static inline int N ## _end_as_root(NS ## builder_t *B)\ -{ return N ## _add(B, NS ## buffer_end(B, TN ## _end(B))); }\ -static inline int N ## _end_as_typed_root(NS ## builder_t *B)\ -{ return N ## _add(B, NS ## buffer_end(B, TN ## _end(B))); }\ -static inline int N ## _end_pe_as_root(NS ## builder_t *B)\ -{ return N ## _add(B, NS ## buffer_end(B, TN ## _end_pe(B))); }\ -static inline int N ## _create_as_root(NS ## builder_t *B __ ## TN ## _formal_args)\ -{ return N ## _add(B, flatcc_builder_create_buffer(B, FID, 0,\ - TN ## _create(B __ ## TN ## _call_args), A, flatcc_builder_is_nested)); }\ -static inline int N ## _create_as_typed_root(NS ## builder_t *B __ ## TN ## _formal_args)\ -{ return N ## _add(B, flatcc_builder_create_buffer(B, TFID, 0,\ - TN ## _create(B __ ## TN ## _call_args), A, flatcc_builder_is_nested)); }\ -static inline int N ## _nest(NS ## builder_t *B, void *data, size_t size, uint16_t align)\ -{ return N ## _add(B, flatcc_builder_create_vector(B, data, size, 1,\ - align < A ? A : align, FLATBUFFERS_COUNT_MAX(1))); }\ -static inline int N ## _typed_nest(NS ## builder_t *B, void *data, size_t size, uint16_t align)\ -{ return N ## _add(B, flatcc_builder_create_vector(B, data, size, 1,\ - align < A ? A : align, FLATBUFFERS_COUNT_MAX(1))); }\ -static inline int N ## _clone_as_root(NS ## builder_t *B, TN ## _struct_t p)\ -{ return N ## _add(B, TN ## _clone_as_root(B, p)); }\ -static inline int N ## _clone_as_typed_root(NS ## builder_t *B, TN ## _struct_t p)\ -{ return N ## _add(B, TN ## _clone_as_typed_root(B, p)); } - -#define __flatbuffers_build_vector_ops(NS, V, N, TN, T)\ -static inline T *V ## _extend(NS ## builder_t *B, size_t len)\ -{ return (T *)flatcc_builder_extend_vector(B, len); }\ -static inline T *V ## _append(NS ## builder_t *B, const T *data, size_t len)\ -{ return (T *)flatcc_builder_append_vector(B, data, len); }\ -static inline int V ## _truncate(NS ## builder_t *B, size_t len)\ -{ return flatcc_builder_truncate_vector(B, len); }\ -static inline T *V ## _edit(NS ## builder_t *B)\ -{ return (T *)flatcc_builder_vector_edit(B); }\ -static inline size_t V ## _reserved_len(NS ## builder_t *B)\ -{ return flatcc_builder_vector_count(B); }\ -static inline T *V ## _push(NS ## builder_t *B, const T *p)\ -{ T *_p; return (_p = (T *)flatcc_builder_extend_vector(B, 1)) ? (memcpy(_p, p, TN ## __size()), _p) : 0; }\ -static inline T *V ## _push_copy(NS ## builder_t *B, const T *p)\ -{ T *_p; return (_p = (T *)flatcc_builder_extend_vector(B, 1)) ? TN ## _copy(_p, p) : 0; }\ -static inline T *V ## _push_clone(NS ## builder_t *B, const T *p)\ -{ T *_p; return (_p = (T *)flatcc_builder_extend_vector(B, 1)) ? TN ## _copy(_p, p) : 0; }\ -static inline T *V ## _push_create(NS ## builder_t *B __ ## TN ## _formal_args)\ -{ T *_p; return (_p = (T *)flatcc_builder_extend_vector(B, 1)) ? TN ## _assign(_p __ ## TN ## _call_args) : 0; } - -#define __flatbuffers_build_vector(NS, N, T, S, A)\ -typedef NS ## ref_t N ## _vec_ref_t;\ -static inline int N ## _vec_start(NS ## builder_t *B)\ -{ return flatcc_builder_start_vector(B, S, A, FLATBUFFERS_COUNT_MAX(S)); }\ -static inline N ## _vec_ref_t N ## _vec_end_pe(NS ## builder_t *B)\ -{ return flatcc_builder_end_vector(B); }\ -static inline N ## _vec_ref_t N ## _vec_end(NS ## builder_t *B)\ -{ if (!NS ## is_native_pe()) { size_t i, n; T *p = (T *)flatcc_builder_vector_edit(B);\ - for (i = 0, n = flatcc_builder_vector_count(B); i < n; ++i)\ - { N ## _to_pe(N ## __ptr_add(p, i)); }} return flatcc_builder_end_vector(B); }\ -static inline N ## _vec_ref_t N ## _vec_create_pe(NS ## builder_t *B, const T *data, size_t len)\ -{ return flatcc_builder_create_vector(B, data, len, S, A, FLATBUFFERS_COUNT_MAX(S)); }\ -static inline N ## _vec_ref_t N ## _vec_create(NS ## builder_t *B, const T *data, size_t len)\ -{ if (!NS ## is_native_pe()) { size_t i; T *p; int ret = flatcc_builder_start_vector(B, S, A, FLATBUFFERS_COUNT_MAX(S)); if (ret) { return ret; }\ - p = (T *)flatcc_builder_extend_vector(B, len); if (!p) return 0;\ - for (i = 0; i < len; ++i) { N ## _copy_to_pe(N ## __ptr_add(p, i), N ## __const_ptr_add(data, i)); }\ - return flatcc_builder_end_vector(B); } else return flatcc_builder_create_vector(B, data, len, S, A, FLATBUFFERS_COUNT_MAX(S)); }\ -static inline N ## _vec_ref_t N ## _vec_clone(NS ## builder_t *B, N ##_vec_t vec)\ -{ __flatbuffers_memoize(B, vec, flatcc_builder_create_vector(B, vec, N ## _vec_len(vec), S, A, FLATBUFFERS_COUNT_MAX(S))); }\ -static inline N ## _vec_ref_t N ## _vec_slice(NS ## builder_t *B, N ##_vec_t vec, size_t index, size_t len)\ -{ size_t n = N ## _vec_len(vec); if (index >= n) index = n; n -= index; if (len > n) len = n;\ - return flatcc_builder_create_vector(B, N ## __const_ptr_add(vec, index), len, S, A, FLATBUFFERS_COUNT_MAX(S)); }\ -__flatbuffers_build_vector_ops(NS, N ## _vec, N, N, T) - -#define __flatbuffers_build_union_vector_ops(NS, V, N, TN)\ -static inline TN ## _union_ref_t *V ## _extend(NS ## builder_t *B, size_t len)\ -{ return flatcc_builder_extend_union_vector(B, len); }\ -static inline TN ## _union_ref_t *V ## _append(NS ## builder_t *B, const TN ## _union_ref_t *data, size_t len)\ -{ return flatcc_builder_append_union_vector(B, data, len); }\ -static inline int V ## _truncate(NS ## builder_t *B, size_t len)\ -{ return flatcc_builder_truncate_union_vector(B, len); }\ -static inline TN ## _union_ref_t *V ## _edit(NS ## builder_t *B)\ -{ return (TN ## _union_ref_t *) flatcc_builder_union_vector_edit(B); }\ -static inline size_t V ## _reserved_len(NS ## builder_t *B)\ -{ return flatcc_builder_union_vector_count(B); }\ -static inline TN ## _union_ref_t *V ## _push(NS ## builder_t *B, const TN ## _union_ref_t ref)\ -{ return flatcc_builder_union_vector_push(B, ref); }\ -static inline TN ## _union_ref_t *V ## _push_clone(NS ## builder_t *B, TN ## _union_t u)\ -{ return TN ## _vec_push(B, TN ## _clone(B, u)); } - -#define __flatbuffers_build_union_vector(NS, N)\ -static inline int N ## _vec_start(NS ## builder_t *B)\ -{ return flatcc_builder_start_union_vector(B); }\ -static inline N ## _union_vec_ref_t N ## _vec_end(NS ## builder_t *B)\ -{ return flatcc_builder_end_union_vector(B); }\ -static inline N ## _union_vec_ref_t N ## _vec_create(NS ## builder_t *B, const N ## _union_ref_t *data, size_t len)\ -{ return flatcc_builder_create_union_vector(B, data, len); }\ -__flatbuffers_build_union_vector_ops(NS, N ## _vec, N, N)\ -/* Preserves DAG structure separately for type and value vector, so a type vector could be shared for many value vectors. */\ -static inline N ## _union_vec_ref_t N ## _vec_clone(NS ## builder_t *B, N ##_union_vec_t vec)\ -{ N ## _union_vec_ref_t _uvref, _ret = { 0, 0 }; NS ## union_ref_t _uref; size_t _i, _len;\ - if (vec.type == 0) return _ret;\ - _uvref.type = flatcc_builder_refmap_find(B, vec.type); _uvref.value = flatcc_builder_refmap_find(B, vec.value);\ - _len = N ## _union_vec_len(vec); if (_uvref.type == 0) {\ - _uvref.type = flatcc_builder_refmap_insert(B, vec.type, (flatcc_builder_create_type_vector(B, vec.type, _len))); }\ - if (_uvref.type == 0) return _ret; if (_uvref.value == 0) {\ - if (flatcc_builder_start_offset_vector(B)) return _ret;\ - for (_i = 0; _i < _len; ++_i) { _uref = N ## _clone(B, N ## _union_vec_at(vec, _i));\ - if (!_uref.value || !(flatcc_builder_offset_vector_push(B, _uref.value))) return _ret; }\ - _uvref.value = flatcc_builder_refmap_insert(B, vec.value, flatcc_builder_end_offset_vector(B));\ - if (_uvref.value == 0) return _ret; } return _uvref; } - -#define __flatbuffers_build_string_vector_ops(NS, N)\ -static inline int N ## _push_start(NS ## builder_t *B)\ -{ return NS ## string_start(B); }\ -static inline NS ## string_ref_t *N ## _push_end(NS ## builder_t *B)\ -{ return NS ## string_vec_push(B, NS ## string_end(B)); }\ -static inline NS ## string_ref_t *N ## _push_create(NS ## builder_t *B, const char *s, size_t len)\ -{ return NS ## string_vec_push(B, NS ## string_create(B, s, len)); }\ -static inline NS ## string_ref_t *N ## _push_create_str(NS ## builder_t *B, const char *s)\ -{ return NS ## string_vec_push(B, NS ## string_create_str(B, s)); }\ -static inline NS ## string_ref_t *N ## _push_create_strn(NS ## builder_t *B, const char *s, size_t max_len)\ -{ return NS ## string_vec_push(B, NS ## string_create_strn(B, s, max_len)); }\ -static inline NS ## string_ref_t *N ## _push_clone(NS ## builder_t *B, NS ## string_t string)\ -{ return NS ## string_vec_push(B, NS ## string_clone(B, string)); }\ -static inline NS ## string_ref_t *N ## _push_slice(NS ## builder_t *B, NS ## string_t string, size_t index, size_t len)\ -{ return NS ## string_vec_push(B, NS ## string_slice(B, string, index, len)); } - -#define __flatbuffers_build_table_vector_ops(NS, N, TN)\ -static inline int N ## _push_start(NS ## builder_t *B)\ -{ return TN ## _start(B); }\ -static inline TN ## _ref_t *N ## _push_end(NS ## builder_t *B)\ -{ return N ## _push(B, TN ## _end(B)); }\ -static inline TN ## _ref_t *N ## _push_create(NS ## builder_t *B __ ## TN ##_formal_args)\ -{ return N ## _push(B, TN ## _create(B __ ## TN ## _call_args)); } - -#define __flatbuffers_build_offset_vector_ops(NS, V, N, TN)\ -static inline TN ## _ref_t *V ## _extend(NS ## builder_t *B, size_t len)\ -{ return flatcc_builder_extend_offset_vector(B, len); }\ -static inline TN ## _ref_t *V ## _append(NS ## builder_t *B, const TN ## _ref_t *data, size_t len)\ -{ return flatcc_builder_append_offset_vector(B, data, len); }\ -static inline int V ## _truncate(NS ## builder_t *B, size_t len)\ -{ return flatcc_builder_truncate_offset_vector(B, len); }\ -static inline TN ## _ref_t *V ## _edit(NS ## builder_t *B)\ -{ return (TN ## _ref_t *)flatcc_builder_offset_vector_edit(B); }\ -static inline size_t V ## _reserved_len(NS ## builder_t *B)\ -{ return flatcc_builder_offset_vector_count(B); }\ -static inline TN ## _ref_t *V ## _push(NS ## builder_t *B, const TN ## _ref_t ref)\ -{ return ref ? flatcc_builder_offset_vector_push(B, ref) : 0; } - -#define __flatbuffers_build_offset_vector(NS, N)\ -typedef NS ## ref_t N ## _vec_ref_t;\ -static inline int N ## _vec_start(NS ## builder_t *B)\ -{ return flatcc_builder_start_offset_vector(B); }\ -static inline N ## _vec_ref_t N ## _vec_end(NS ## builder_t *B)\ -{ return flatcc_builder_end_offset_vector(B); }\ -static inline N ## _vec_ref_t N ## _vec_create(NS ## builder_t *B, const N ## _ref_t *data, size_t len)\ -{ return flatcc_builder_create_offset_vector(B, data, len); }\ -__flatbuffers_build_offset_vector_ops(NS, N ## _vec, N, N)\ -static inline N ## _vec_ref_t N ## _vec_clone(NS ## builder_t *B, N ##_vec_t vec)\ -{ int _ret; N ## _ref_t _e; size_t _i, _len; __flatbuffers_memoize_begin(B, vec);\ - _len = N ## _vec_len(vec); if (flatcc_builder_start_offset_vector(B)) return 0;\ - for (_i = 0; _i < _len; ++_i) { if (!(_e = N ## _clone(B, N ## _vec_at(vec, _i)))) return 0;\ - if (!flatcc_builder_offset_vector_push(B, _e)) return 0; }\ - __flatbuffers_memoize_end(B, vec, flatcc_builder_end_offset_vector(B)); }\ - -#define __flatbuffers_build_string_ops(NS, N)\ -static inline char *N ## _append(NS ## builder_t *B, const char *s, size_t len)\ -{ return flatcc_builder_append_string(B, s, len); }\ -static inline char *N ## _append_str(NS ## builder_t *B, const char *s)\ -{ return flatcc_builder_append_string_str(B, s); }\ -static inline char *N ## _append_strn(NS ## builder_t *B, const char *s, size_t len)\ -{ return flatcc_builder_append_string_strn(B, s, len); }\ -static inline size_t N ## _reserved_len(NS ## builder_t *B)\ -{ return flatcc_builder_string_len(B); }\ -static inline char *N ## _extend(NS ## builder_t *B, size_t len)\ -{ return flatcc_builder_extend_string(B, len); }\ -static inline char *N ## _edit(NS ## builder_t *B)\ -{ return flatcc_builder_string_edit(B); }\ -static inline int N ## _truncate(NS ## builder_t *B, size_t len)\ -{ return flatcc_builder_truncate_string(B, len); } - -#define __flatbuffers_build_string(NS)\ -typedef NS ## ref_t NS ## string_ref_t;\ -static inline int NS ## string_start(NS ## builder_t *B)\ -{ return flatcc_builder_start_string(B); }\ -static inline NS ## string_ref_t NS ## string_end(NS ## builder_t *B)\ -{ return flatcc_builder_end_string(B); }\ -static inline NS ## ref_t NS ## string_create(NS ## builder_t *B, const char *s, size_t len)\ -{ return flatcc_builder_create_string(B, s, len); }\ -static inline NS ## ref_t NS ## string_create_str(NS ## builder_t *B, const char *s)\ -{ return flatcc_builder_create_string_str(B, s); }\ -static inline NS ## ref_t NS ## string_create_strn(NS ## builder_t *B, const char *s, size_t len)\ -{ return flatcc_builder_create_string_strn(B, s, len); }\ -static inline NS ## string_ref_t NS ## string_clone(NS ## builder_t *B, NS ## string_t string)\ -{ __flatbuffers_memoize(B, string, flatcc_builder_create_string(B, string, NS ## string_len(string))); }\ -static inline NS ## string_ref_t NS ## string_slice(NS ## builder_t *B, NS ## string_t string, size_t index, size_t len)\ -{ size_t n = NS ## string_len(string); if (index >= n) index = n; n -= index; if (len > n) len = n;\ - return flatcc_builder_create_string(B, string + index, len); }\ -__flatbuffers_build_string_ops(NS, NS ## string)\ -__flatbuffers_build_offset_vector(NS, NS ## string) - -#define __flatbuffers_copy_from_pe(P, P2, N) (*(P) = N ## _cast_from_pe(*P2), (P)) -#define __flatbuffers_from_pe(P, N) (*(P) = N ## _cast_from_pe(*P), (P)) -#define __flatbuffers_copy_to_pe(P, P2, N) (*(P) = N ## _cast_to_pe(*P2), (P)) -#define __flatbuffers_to_pe(P, N) (*(P) = N ## _cast_to_pe(*P), (P)) -#define __flatbuffers_define_fixed_array_primitives(NS, N, T)\ -static inline T *N ## _array_copy(T *p, const T *p2, size_t n)\ -{ memcpy(p, p2, n * sizeof(T)); return p; }\ -static inline T *N ## _array_copy_from_pe(T *p, const T *p2, size_t n)\ -{ size_t i; if (NS ## is_native_pe()) memcpy(p, p2, n * sizeof(T)); else\ - for (i = 0; i < n; ++i) N ## _copy_from_pe(&p[i], &p2[i]); return p; }\ -static inline T *N ## _array_copy_to_pe(T *p, const T *p2, size_t n)\ -{ size_t i; if (NS ## is_native_pe()) memcpy(p, p2, n * sizeof(T)); else\ - for (i = 0; i < n; ++i) N ## _copy_to_pe(&p[i], &p2[i]); return p; } -#define __flatbuffers_define_scalar_primitives(NS, N, T)\ -static inline T *N ## _from_pe(T *p) { return __ ## NS ## from_pe(p, N); }\ -static inline T *N ## _to_pe(T *p) { return __ ## NS ## to_pe(p, N); }\ -static inline T *N ## _copy(T *p, const T *p2) { *p = *p2; return p; }\ -static inline T *N ## _copy_from_pe(T *p, const T *p2)\ -{ return __ ## NS ## copy_from_pe(p, p2, N); }\ -static inline T *N ## _copy_to_pe(T *p, const T *p2) \ -{ return __ ## NS ## copy_to_pe(p, p2, N); }\ -static inline T *N ## _assign(T *p, const T v0) { *p = v0; return p; }\ -static inline T *N ## _assign_from_pe(T *p, T v0)\ -{ *p = N ## _cast_from_pe(v0); return p; }\ -static inline T *N ## _assign_to_pe(T *p, T v0)\ -{ *p = N ## _cast_to_pe(v0); return p; } -#define __flatbuffers_build_scalar(NS, N, T)\ -__ ## NS ## define_scalar_primitives(NS, N, T)\ -__ ## NS ## define_fixed_array_primitives(NS, N, T)\ -__ ## NS ## build_vector(NS, N, T, sizeof(T), sizeof(T)) -/* Depends on generated copy_to/from_pe functions, and the type. */ -#define __flatbuffers_define_struct_primitives(NS, N)\ -static inline N ## _t *N ##_to_pe(N ## _t *p)\ -{ if (!NS ## is_native_pe()) { N ## _copy_to_pe(p, p); }; return p; }\ -static inline N ## _t *N ##_from_pe(N ## _t *p)\ -{ if (!NS ## is_native_pe()) { N ## _copy_from_pe(p, p); }; return p; }\ -static inline N ## _t *N ## _clear(N ## _t *p) { return (N ## _t *)memset(p, 0, N ## __size()); } - -/* Depends on generated copy/assign_to/from_pe functions, and the type. */ -#define __flatbuffers_build_struct(NS, N, S, A, FID, TFID)\ -__ ## NS ## define_struct_primitives(NS, N)\ -typedef NS ## ref_t N ## _ref_t;\ -static inline N ## _t *N ## _start(NS ## builder_t *B)\ -{ return (N ## _t *)flatcc_builder_start_struct(B, S, A); }\ -static inline N ## _ref_t N ## _end(NS ## builder_t *B)\ -{ if (!NS ## is_native_pe()) { N ## _to_pe((N ## _t *)flatcc_builder_struct_edit(B)); }\ - return flatcc_builder_end_struct(B); }\ -static inline N ## _ref_t N ## _end_pe(NS ## builder_t *B)\ -{ return flatcc_builder_end_struct(B); }\ -static inline N ## _ref_t N ## _create(NS ## builder_t *B __ ## N ## _formal_args)\ -{ N ## _t *_p = N ## _start(B); if (!_p) return 0; N ##_assign_to_pe(_p __ ## N ## _call_args);\ - return N ## _end_pe(B); }\ -static inline N ## _ref_t N ## _clone(NS ## builder_t *B, N ## _struct_t p)\ -{ N ## _t *_p; __flatbuffers_memoize_begin(B, p); _p = N ## _start(B); if (!_p) return 0;\ - N ## _copy(_p, p); __flatbuffers_memoize_end(B, p, N ##_end_pe(B)); }\ -__flatbuffers_build_vector(NS, N, N ## _t, S, A)\ -__flatbuffers_build_struct_root(NS, N, A, FID, TFID)\ - -#define __flatbuffers_struct_clear_field(p) memset((p), 0, sizeof(*(p))) -#define __flatbuffers_build_table(NS, N, K)\ -static inline int N ## _start(NS ## builder_t *B)\ -{ return flatcc_builder_start_table(B, K); }\ -static inline N ## _ref_t N ## _end(NS ## builder_t *B)\ -{ assert(flatcc_builder_check_required(B, __ ## N ## _required,\ - sizeof(__ ## N ## _required) / sizeof(__ ## N ## _required[0]) - 1));\ - return flatcc_builder_end_table(B); }\ -__flatbuffers_build_offset_vector(NS, N) - -#define __flatbuffers_build_table_field(ID, NS, N, TN, TT)\ -static inline int N ## _add(NS ## builder_t *B, TN ## _ref_t ref)\ -{ TN ## _ref_t *_p; return (ref && (_p = flatcc_builder_table_add_offset(B, ID))) ?\ - ((*_p = ref), 0) : -1; }\ -static inline int N ## _start(NS ## builder_t *B)\ -{ return TN ## _start(B); }\ -static inline int N ## _end(NS ## builder_t *B)\ -{ return N ## _add(B, TN ## _end(B)); }\ -static inline TN ## _ref_t N ## _create(NS ## builder_t *B __ ## TN ##_formal_args)\ -{ return N ## _add(B, TN ## _create(B __ ## TN ## _call_args)); }\ -static inline int N ## _clone(NS ## builder_t *B, TN ## _table_t p)\ -{ return N ## _add(B, TN ## _clone(B, p)); }\ -static inline int N ## _pick(NS ## builder_t *B, TT ## _table_t t)\ -{ TN ## _table_t _p = N ## _get(t); return _p ? N ## _clone(B, _p) : 0; } - -#define __flatbuffers_build_union_field(ID, NS, N, TN, TT)\ -static inline int N ## _add(NS ## builder_t *B, TN ## _union_ref_t uref)\ -{ NS ## ref_t *_p; TN ## _union_type_t *_pt; if (uref.type == TN ## _NONE) return 0; if (uref.value == 0) return -1;\ - if (!(_pt = (TN ## _union_type_t *)flatcc_builder_table_add(B, ID - 1, sizeof(*_pt), sizeof(*_pt))) ||\ - !(_p = flatcc_builder_table_add_offset(B, ID))) return -1; *_pt = uref.type; *_p = uref.value; return 0; }\ -static inline int N ## _add_type(NS ## builder_t *B, TN ## _union_type_t type)\ -{ TN ## _union_type_t *_pt; if (type == TN ## _NONE) return 0; return (_pt = (TN ## _union_type_t *)flatcc_builder_table_add(B, ID - 1,\ - sizeof(*_pt), sizeof(*_pt))) ? ((*_pt = type), 0) : -1; }\ -static inline int N ## _add_value(NS ## builder_t *B, TN ## _union_ref_t uref)\ -{ NS ## ref_t *p; if (uref.type == TN ## _NONE) return 0; return (p = flatcc_builder_table_add_offset(B, ID)) ?\ - ((*p = uref.value), 0) : -1; }\ -static inline int N ## _clone(NS ## builder_t *B, TN ## _union_t p)\ -{ return N ## _add(B, TN ## _clone(B, p)); }\ -static inline int N ## _pick(NS ## builder_t *B, TT ## _table_t t)\ -{ TN ## _union_t _p = N ## _union(t); return _p.type ? N ## _clone(B, _p) : 0; } - -/* M is the union value name and T is its type, i.e. the qualified name. */ -#define __flatbuffers_build_union_table_value_field(NS, N, NU, M, T)\ -static inline int N ## _ ## M ## _add(NS ## builder_t *B, T ## _ref_t ref)\ -{ return N ## _add(B, NU ## _as_ ## M (ref)); }\ -static inline int N ## _ ## M ## _start(NS ## builder_t *B)\ -{ return T ## _start(B); }\ -static inline int N ## _ ## M ## _end(NS ## builder_t *B)\ -{ T ## _ref_t ref = T ## _end(B);\ - return ref ? N ## _ ## M ## _add(B, ref) : -1; }\ -static inline int N ## _ ## M ## _create(NS ## builder_t *B __ ## T ##_formal_args)\ -{ T ## _ref_t ref = T ## _create(B __ ## T ## _call_args);\ - return ref ? N ## _add(B, NU ## _as_ ## M(ref)) : -1; }\ -static inline int N ## _ ## M ## _clone(NS ## builder_t *B, T ## _table_t t)\ -{ T ## _ref_t ref = T ## _clone(B, t);\ - return ref ? N ## _add(B, NU ## _as_ ## M(ref)) : -1; } - -/* M is the union value name and T is its type, i.e. the qualified name. */ -#define __flatbuffers_build_union_struct_value_field(NS, N, NU, M, T)\ -static inline int N ## _ ## M ## _add(NS ## builder_t *B, T ## _ref_t ref)\ -{ return N ## _add(B, NU ## _as_ ## M (ref)); }\ -static inline T ## _t *N ## _ ## M ## _start(NS ## builder_t *B)\ -{ return T ## _start(B); }\ -static inline int N ## _ ## M ## _end(NS ## builder_t *B)\ -{ T ## _ref_t ref = T ## _end(B);\ - return ref ? N ## _ ## M ## _add(B, ref) : -1; }\ -static inline int N ## _ ## M ## _create(NS ## builder_t *B __ ## T ##_formal_args)\ -{ T ## _ref_t ref = T ## _create(B __ ## T ## _call_args);\ - return ref ? N ## _add(B, NU ## _as_ ## M(ref)) : -1; }\ -static inline int N ## _ ## M ## _end_pe(NS ## builder_t *B)\ -{ T ## _ref_t ref = T ## _end_pe(B);\ - return ref ? N ## _add(B, NU ## _as_ ## M(ref)) : -1; }\ -static inline int N ## _ ## M ## _clone(NS ## builder_t *B, T ## _struct_t p)\ -{ T ## _ref_t ref = T ## _clone(B, p);\ - return ref ? N ## _add(B, NU ## _as_ ## M(ref)) : -1; } -#define __flatbuffers_build_union_string_value_field(NS, N, NU, M)\ -static inline int N ## _ ## M ## _add(NS ## builder_t *B, NS ## string_ref_t ref)\ -{ return N ## _add(B, NU ## _as_ ## M (ref)); }\ -__flatbuffers_build_string_field_ops(NS, N ## _ ## M) - -/* NS: common namespace, ID: table field id (not offset), TN: name of type T, TT: name of table type - * S: sizeof of scalar type, A: alignment of type T, default value V of type T. */ -#define __flatbuffers_build_scalar_field(ID, NS, N, TN, T, S, A, V, TT)\ -static inline int N ## _add(NS ## builder_t *B, const T v)\ -{ T *_p; if (v == V) return 0; if (!(_p = (T *)flatcc_builder_table_add(B, ID, S, A))) return -1;\ - TN ## _assign_to_pe(_p, v); return 0; }\ -static inline int N ## _force_add(NS ## builder_t *B, const T v)\ -{ T *_p; if (!(_p = (T *)flatcc_builder_table_add(B, ID, S, A))) return -1;\ - TN ## _assign_to_pe(_p, v); return 0; }\ -/* Clone does not skip default values and expects pe endian content. */\ -static inline int N ## _clone(NS ## builder_t *B, const T *p)\ -{ return 0 == flatcc_builder_table_add_copy(B, ID, p, S, A) ? -1 : 0; }\ -/* Transferring a missing field is a nop success with 0 as result. */\ -static inline int N ## _pick(NS ## builder_t *B, TT ## _table_t t)\ -{ const T *_p = N ## _get_ptr(t); return _p ? N ## _clone(B, _p) : 0; } - -#define __flatbuffers_build_struct_field(ID, NS, N, TN, S, A, TT)\ -static inline TN ## _t *N ## _start(NS ## builder_t *B)\ -{ return (TN ## _t *)flatcc_builder_table_add(B, ID, S, A); }\ -static inline int N ## _end(NS ## builder_t *B)\ -{ if (!NS ## is_native_pe()) { TN ## _to_pe((TN ## _t *)flatcc_builder_table_edit(B, S)); } return 0; }\ -static inline int N ## _end_pe(NS ## builder_t *B) { return 0; }\ -static inline int N ## _create(NS ## builder_t *B __ ## TN ## _formal_args)\ -{ TN ## _t *_p = N ## _start(B); if (!_p) return -1; TN ##_assign_to_pe(_p __ ## TN ## _call_args);\ - return 0; }\ -static inline int N ## _add(NS ## builder_t *B, const TN ## _t *p)\ -{ TN ## _t *_p = N ## _start(B); if (!_p) return -1; TN ##_copy_to_pe(_p, p); return 0; }\ -static inline int N ## _clone(NS ## builder_t *B, TN ## _struct_t p)\ -{ return 0 == flatcc_builder_table_add_copy(B, ID, p, S, A) ? -1 : 0; }\ -static inline int N ## _pick(NS ## builder_t *B, TT ## _table_t t)\ -{ TN ## _struct_t _p = N ## _get(t); return _p ? N ## _clone(B, _p) : 0; } - -#define __flatbuffers_build_vector_field(ID, NS, N, TN, T, TT)\ -static inline int N ## _add(NS ## builder_t *B, TN ## _vec_ref_t ref)\ -{ TN ## _vec_ref_t *_p; return (ref && (_p = flatcc_builder_table_add_offset(B, ID))) ? ((*_p = ref), 0) : -1; }\ -static inline int N ## _start(NS ## builder_t *B)\ -{ return TN ## _vec_start(B); }\ -static inline int N ## _end_pe(NS ## builder_t *B)\ -{ return N ## _add(B, TN ## _vec_end_pe(B)); }\ -static inline int N ## _end(NS ## builder_t *B)\ -{ return N ## _add(B, TN ## _vec_end(B)); }\ -static inline int N ## _create_pe(NS ## builder_t *B, T *data, size_t len)\ -{ return N ## _add(B, TN ## _vec_create_pe(B, data, len)); }\ -static inline int N ## _create(NS ## builder_t *B, T *data, size_t len)\ -{ return N ## _add(B, TN ## _vec_create(B, data, len)); }\ -static inline int N ## _slice(NS ## builder_t *B, TN ## _vec_t vec, size_t index, size_t len)\ -{ return N ## _add(B, TN ## _vec_slice(B, vec, index, len)); }\ -static inline int N ## _clone(NS ## builder_t *B, TN ## _vec_t vec)\ -{ return N ## _add(B, TN ## _vec_clone(B, vec)); }\ -static inline int N ## _pick(NS ## builder_t *B, TT ## _table_t t)\ -{ TN ## _vec_t _p = N ## _get(t); return _p ? N ## _clone(B, _p) : 0; }\ -__flatbuffers_build_vector_ops(NS, N, N, TN, T)\ - -#define __flatbuffers_build_offset_vector_field(ID, NS, N, TN, TT)\ -static inline int N ## _add(NS ## builder_t *B, TN ## _vec_ref_t ref)\ -{ TN ## _vec_ref_t *_p; return (ref && (_p = flatcc_builder_table_add_offset(B, ID))) ? ((*_p = ref), 0) : -1; }\ -static inline int N ## _start(NS ## builder_t *B)\ -{ return flatcc_builder_start_offset_vector(B); }\ -static inline int N ## _end(NS ## builder_t *B)\ -{ return N ## _add(B, flatcc_builder_end_offset_vector(B)); }\ -static inline int N ## _create(NS ## builder_t *B, const TN ## _ref_t *data, size_t len)\ -{ return N ## _add(B, flatcc_builder_create_offset_vector(B, data, len)); }\ -__flatbuffers_build_offset_vector_ops(NS, N, N, TN)\ -static inline int N ## _clone(NS ## builder_t *B, TN ## _vec_t vec)\ -{ return N ## _add(B, TN ## _vec_clone(B, vec)); }\ -static inline int N ## _pick(NS ## builder_t *B, TT ## _table_t t)\ -{ TN ## _vec_t _p = N ## _get(t); return _p ? N ## _clone(B, _p) : 0; } - -/* depends on N ## _add which differs for union member fields and ordinary fields */\ -#define __flatbuffers_build_string_field_ops(NS, N)\ -static inline int N ## _start(NS ## builder_t *B)\ -{ return flatcc_builder_start_string(B); }\ -static inline int N ## _end(NS ## builder_t *B)\ -{ return N ## _add(B, flatcc_builder_end_string(B)); }\ -static inline int N ## _create(NS ## builder_t *B, const char *s, size_t len)\ -{ return N ## _add(B, flatcc_builder_create_string(B, s, len)); }\ -static inline int N ## _create_str(NS ## builder_t *B, const char *s)\ -{ return N ## _add(B, flatcc_builder_create_string_str(B, s)); }\ -static inline int N ## _create_strn(NS ## builder_t *B, const char *s, size_t max_len)\ -{ return N ## _add(B, flatcc_builder_create_string_strn(B, s, max_len)); }\ -static inline int N ## _clone(NS ## builder_t *B, NS ## string_t string)\ -{ return N ## _add(B, NS ## string_clone(B, string)); }\ -static inline int N ## _slice(NS ## builder_t *B, NS ## string_t string, size_t index, size_t len)\ -{ return N ## _add(B, NS ## string_slice(B, string, index, len)); }\ -__flatbuffers_build_string_ops(NS, N) - -#define __flatbuffers_build_string_field(ID, NS, N, TT)\ -static inline int N ## _add(NS ## builder_t *B, NS ## string_ref_t ref)\ -{ NS ## string_ref_t *_p; return (ref && (_p = flatcc_builder_table_add_offset(B, ID))) ? ((*_p = ref), 0) : -1; }\ -__flatbuffers_build_string_field_ops(NS, N)\ -static inline int N ## _pick(NS ## builder_t *B, TT ## _table_t t)\ -{ NS ## string_t _p = N ## _get(t); return _p ? N ## _clone(B, _p) : 0; } - -#define __flatbuffers_build_table_vector_field(ID, NS, N, TN, TT)\ -__flatbuffers_build_offset_vector_field(ID, NS, N, TN, TT)\ -__flatbuffers_build_table_vector_ops(NS, N, TN) - -#define __flatbuffers_build_union_vector_field(ID, NS, N, TN, TT)\ -static inline int N ## _add(NS ## builder_t *B, TN ## _union_vec_ref_t uvref)\ -{ NS ## vec_ref_t *_p; if (!uvref.type || !uvref.value) return uvref.type == uvref.value ? 0 : -1;\ - if (!(_p = flatcc_builder_table_add_offset(B, ID - 1))) return -1; *_p = uvref.type;\ - if (!(_p = flatcc_builder_table_add_offset(B, ID))) return -1; *_p = uvref.value; return 0; }\ -static inline int N ## _start(NS ## builder_t *B)\ -{ return flatcc_builder_start_union_vector(B); }\ -static inline int N ## _end(NS ## builder_t *B)\ -{ return N ## _add(B, flatcc_builder_end_union_vector(B)); }\ -static inline int N ## _create(NS ## builder_t *B, const TN ## _union_ref_t *data, size_t len)\ -{ return N ## _add(B, flatcc_builder_create_union_vector(B, data, len)); }\ -__flatbuffers_build_union_vector_ops(NS, N, N, TN)\ -static inline int N ## _clone(NS ## builder_t *B, TN ## _union_vec_t vec)\ -{ return N ## _add(B, TN ## _vec_clone(B, vec)); }\ -static inline int N ## _pick(NS ## builder_t *B, TT ## _table_t t)\ -{ TN ## _union_vec_t _p = N ## _union(t); return _p.type ? N ## _clone(B, _p) : 0; } - -#define __flatbuffers_build_union_table_vector_value_field(NS, N, NU, M, T)\ -static inline int N ## _ ## M ## _push_start(NS ## builder_t *B)\ -{ return T ## _start(B); }\ -static inline NU ## _union_ref_t *N ## _ ## M ## _push_end(NS ## builder_t *B)\ -{ return NU ## _vec_push(B, NU ## _as_ ## M (T ## _end(B))); }\ -static inline NU ## _union_ref_t *N ## _ ## M ## _push(NS ## builder_t *B, T ## _ref_t ref)\ -{ return NU ## _vec_push(B, NU ## _as_ ## M (ref)); }\ -static inline NU ## _union_ref_t *N ## _ ## M ## _push_create(NS ## builder_t *B __ ## T ##_formal_args)\ -{ return NU ## _vec_push(B, NU ## _as_ ## M(T ## _create(B __ ## T ## _call_args))); }\ -static inline NU ## _union_ref_t *N ## _ ## M ## _push_clone(NS ## builder_t *B, T ## _table_t t)\ -{ return NU ## _vec_push(B, NU ## _as_ ## M(T ## _clone(B, t))); } - -#define __flatbuffers_build_union_struct_vector_value_field(NS, N, NU, M, T)\ -static inline T ## _t *N ## _ ## M ## _push_start(NS ## builder_t *B)\ -{ return T ## _start(B); }\ -static inline NU ## _union_ref_t *N ## _ ## M ## _push_end(NS ## builder_t *B)\ -{ return NU ## _vec_push(B, NU ## _as_ ## M (T ## _end(B))); }\ -static inline NU ## _union_ref_t *N ## _ ## M ## _push(NS ## builder_t *B, T ## _ref_t ref)\ -{ return NU ## _vec_push(B, NU ## _as_ ## M (ref)); }\ -static inline NU ## _union_ref_t *N ## _ ## M ## _push_create(NS ## builder_t *B __ ## T ##_formal_args)\ -{ return NU ## _vec_push(B, NU ## _as_ ## M(T ## _create(B __ ## T ## _call_args))); }\ -static inline NU ## _union_ref_t *N ## _ ## M ## _push_clone(NS ## builder_t *B, T ## _struct_t p)\ -{ return NU ## _vec_push(B, NU ## _as_ ## M(T ## _clone(B, p))); } - -#define __flatbuffers_build_union_string_vector_value_field(NS, N, NU, M)\ -static inline NU ## _union_ref_t *N ## _ ## M ## _push(NS ## builder_t *B, NS ## string_ref_t ref)\ -{ return NU ## _vec_push(B, NU ## _as_ ## M (ref)); }\ -static inline int N ## _ ## M ## _push_start(NS ## builder_t *B)\ -{ return NS ## string_start(B); }\ -static inline NU ## _union_ref_t *N ## _ ## M ## _push_end(NS ## builder_t *B)\ -{ return NU ## _vec_push(B, NU ## _as_ ## M(NS ## string_end(B))); }\ -static inline NU ## _union_ref_t *N ## _ ## M ## _push_create(NS ## builder_t *B, const char *s, size_t len)\ -{ return NU ## _vec_push(B, NU ## _as_ ## M(NS ## string_create(B, s, len))); }\ -static inline NU ## _union_ref_t *N ## _ ## M ## _push_create_str(NS ## builder_t *B, const char *s)\ -{ return NU ## _vec_push(B, NU ## _as_ ## M(NS ## string_create_str(B, s))); }\ -static inline NU ## _union_ref_t *N ## _ ## M ## _push_create_strn(NS ## builder_t *B, const char *s, size_t max_len)\ -{ return NU ## _vec_push(B, NU ## _as_ ## M(NS ## string_create_strn(B, s, max_len))); }\ -static inline NU ## _union_ref_t *N ## _ ## M ## _push_clone(NS ## builder_t *B, NS ## string_t string)\ -{ return NU ## _vec_push(B, NU ## _as_ ## M(NS ## string_clone(B, string))); }\ -static inline NU ## _union_ref_t *N ## _ ## M ## _push_slice(NS ## builder_t *B, NS ## string_t string, size_t index, size_t len)\ -{ return NU ## _vec_push(B, NU ## _as_ ## M(NS ## string_slice(B, string, index, len))); } - -#define __flatbuffers_build_string_vector_field(ID, NS, N, TT)\ -__flatbuffers_build_offset_vector_field(ID, NS, N, NS ## string, TT)\ -__flatbuffers_build_string_vector_ops(NS, N) - -#define __flatbuffers_char_formal_args , char v0 -#define __flatbuffers_char_call_args , v0 -#define __flatbuffers_uint8_formal_args , uint8_t v0 -#define __flatbuffers_uint8_call_args , v0 -#define __flatbuffers_int8_formal_args , int8_t v0 -#define __flatbuffers_int8_call_args , v0 -#define __flatbuffers_bool_formal_args , flatbuffers_bool_t v0 -#define __flatbuffers_bool_call_args , v0 -#define __flatbuffers_uint16_formal_args , uint16_t v0 -#define __flatbuffers_uint16_call_args , v0 -#define __flatbuffers_uint32_formal_args , uint32_t v0 -#define __flatbuffers_uint32_call_args , v0 -#define __flatbuffers_uint64_formal_args , uint64_t v0 -#define __flatbuffers_uint64_call_args , v0 -#define __flatbuffers_int16_formal_args , int16_t v0 -#define __flatbuffers_int16_call_args , v0 -#define __flatbuffers_int32_formal_args , int32_t v0 -#define __flatbuffers_int32_call_args , v0 -#define __flatbuffers_int64_formal_args , int64_t v0 -#define __flatbuffers_int64_call_args , v0 -#define __flatbuffers_float_formal_args , float v0 -#define __flatbuffers_float_call_args , v0 -#define __flatbuffers_double_formal_args , double v0 -#define __flatbuffers_double_call_args , v0 - -__flatbuffers_build_scalar(flatbuffers_, flatbuffers_char, char) -__flatbuffers_build_scalar(flatbuffers_, flatbuffers_uint8, uint8_t) -__flatbuffers_build_scalar(flatbuffers_, flatbuffers_int8, int8_t) -__flatbuffers_build_scalar(flatbuffers_, flatbuffers_bool, flatbuffers_bool_t) -__flatbuffers_build_scalar(flatbuffers_, flatbuffers_uint16, uint16_t) -__flatbuffers_build_scalar(flatbuffers_, flatbuffers_uint32, uint32_t) -__flatbuffers_build_scalar(flatbuffers_, flatbuffers_uint64, uint64_t) -__flatbuffers_build_scalar(flatbuffers_, flatbuffers_int16, int16_t) -__flatbuffers_build_scalar(flatbuffers_, flatbuffers_int32, int32_t) -__flatbuffers_build_scalar(flatbuffers_, flatbuffers_int64, int64_t) -__flatbuffers_build_scalar(flatbuffers_, flatbuffers_float, float) -__flatbuffers_build_scalar(flatbuffers_, flatbuffers_double, double) - -__flatbuffers_build_string(flatbuffers_) - -__flatbuffers_build_buffer(flatbuffers_) -#include "flatcc/flatcc_epilogue.h" -#endif /* FLATBUFFERS_COMMON_BUILDER_H */ diff --git a/fbs/flatbuffers_common_reader.h b/fbs/flatbuffers_common_reader.h deleted file mode 100644 index 3dc3089..0000000 --- a/fbs/flatbuffers_common_reader.h +++ /dev/null @@ -1,571 +0,0 @@ -#ifndef FLATBUFFERS_COMMON_READER_H -#define FLATBUFFERS_COMMON_READER_H - -/* Generated by flatcc 0.6.0 FlatBuffers schema compiler for C by dvide.com */ - -/* Common FlatBuffers read functionality for C. */ - -#include "flatcc/flatcc_prologue.h" -#include "flatcc/flatcc_flatbuffers.h" - - -#define __flatbuffers_read_scalar_at_byteoffset(N, p, o) N ## _read_from_pe((uint8_t *)(p) + (o)) -#define __flatbuffers_read_scalar(N, p) N ## _read_from_pe(p) -#define __flatbuffers_read_vt(ID, offset, t)\ -flatbuffers_voffset_t offset = 0;\ -{ flatbuffers_voffset_t id__tmp, *vt__tmp;\ - assert(t != 0 && "null pointer table access");\ - id__tmp = ID;\ - vt__tmp = (flatbuffers_voffset_t *)((uint8_t *)(t) -\ - __flatbuffers_soffset_read_from_pe(t));\ - if (__flatbuffers_voffset_read_from_pe(vt__tmp) >= sizeof(vt__tmp[0]) * (id__tmp + 3)) {\ - offset = __flatbuffers_voffset_read_from_pe(vt__tmp + id__tmp + 2);\ - }\ -} -#define __flatbuffers_field_present(ID, t) { __flatbuffers_read_vt(ID, offset__tmp, t) return offset__tmp != 0; } -#define __flatbuffers_scalar_field(T, ID, t)\ -{\ - __flatbuffers_read_vt(ID, offset__tmp, t)\ - if (offset__tmp) {\ - return (const T *)((uint8_t *)(t) + offset__tmp);\ - }\ - return 0;\ -} -#define __flatbuffers_define_scalar_field(ID, N, NK, TK, T, V)\ -static inline T N ## _ ## NK ## _get(N ## _table_t t__tmp)\ -{ __flatbuffers_read_vt(ID, offset__tmp, t__tmp)\ - return offset__tmp ? __flatbuffers_read_scalar_at_byteoffset(TK, t__tmp, offset__tmp) : V;\ -}\ -static inline T N ## _ ## NK(N ## _table_t t__tmp)\ -{ __flatbuffers_read_vt(ID, offset__tmp, t__tmp)\ - return offset__tmp ? __flatbuffers_read_scalar_at_byteoffset(TK, t__tmp, offset__tmp) : V;\ -}\ -static inline const T *N ## _ ## NK ## _get_ptr(N ## _table_t t__tmp)\ -__flatbuffers_scalar_field(T, ID, t__tmp)\ -static inline int N ## _ ## NK ## _is_present(N ## _table_t t__tmp)\ -__flatbuffers_field_present(ID, t__tmp)\ -__flatbuffers_define_scan_by_scalar_field(N, NK, T) -#define __flatbuffers_struct_field(T, ID, t, r)\ -{\ - __flatbuffers_read_vt(ID, offset__tmp, t)\ - if (offset__tmp) {\ - return (T)((uint8_t *)(t) + offset__tmp);\ - }\ - assert(!(r) && "required field missing");\ - return 0;\ -} -#define __flatbuffers_offset_field(T, ID, t, r, adjust)\ -{\ - flatbuffers_uoffset_t *elem__tmp;\ - __flatbuffers_read_vt(ID, offset__tmp, t)\ - if (offset__tmp) {\ - elem__tmp = (flatbuffers_uoffset_t *)((uint8_t *)(t) + offset__tmp);\ - /* Add sizeof so C api can have raw access past header field. */\ - return (T)((uint8_t *)(elem__tmp) + adjust +\ - __flatbuffers_uoffset_read_from_pe(elem__tmp));\ - }\ - assert(!(r) && "required field missing");\ - return 0;\ -} -#define __flatbuffers_vector_field(T, ID, t, r) __flatbuffers_offset_field(T, ID, t, r, sizeof(flatbuffers_uoffset_t)) -#define __flatbuffers_table_field(T, ID, t, r) __flatbuffers_offset_field(T, ID, t, r, 0) -#define __flatbuffers_define_struct_field(ID, N, NK, T, r)\ -static inline T N ## _ ## NK ## _get(N ## _table_t t__tmp)\ -__flatbuffers_struct_field(T, ID, t__tmp, r)\ -static inline T N ## _ ## NK(N ## _table_t t__tmp)\ -__flatbuffers_struct_field(T, ID, t__tmp, r)\ -static inline int N ## _ ## NK ## _is_present(N ## _table_t t__tmp)\ -__flatbuffers_field_present(ID, t__tmp) -#define __flatbuffers_define_vector_field(ID, N, NK, T, r)\ -static inline T N ## _ ## NK ## _get(N ## _table_t t__tmp)\ -__flatbuffers_vector_field(T, ID, t__tmp, r)\ -static inline T N ## _ ## NK(N ## _table_t t__tmp)\ -__flatbuffers_vector_field(T, ID, t__tmp, r)\ -static inline int N ## _ ## NK ## _is_present(N ## _table_t t__tmp)\ -__flatbuffers_field_present(ID, t__tmp) -#define __flatbuffers_define_table_field(ID, N, NK, T, r)\ -static inline T N ## _ ## NK ## _get(N ## _table_t t__tmp)\ -__flatbuffers_table_field(T, ID, t__tmp, r)\ -static inline T N ## _ ## NK(N ## _table_t t__tmp)\ -__flatbuffers_table_field(T, ID, t__tmp, r)\ -static inline int N ## _ ## NK ## _is_present(N ## _table_t t__tmp)\ -__flatbuffers_field_present(ID, t__tmp) -#define __flatbuffers_define_string_field(ID, N, NK, r)\ -static inline flatbuffers_string_t N ## _ ## NK ## _get(N ## _table_t t__tmp)\ -__flatbuffers_vector_field(flatbuffers_string_t, ID, t__tmp, r)\ -static inline flatbuffers_string_t N ## _ ## NK(N ## _table_t t__tmp)\ -__flatbuffers_vector_field(flatbuffers_string_t, ID, t__tmp, r)\ -static inline int N ## _ ## NK ## _is_present(N ## _table_t t__tmp)\ -__flatbuffers_field_present(ID, t__tmp)\ -__flatbuffers_define_scan_by_string_field(N, NK) -#define __flatbuffers_vec_len(vec)\ -{ return (vec) ? (size_t)__flatbuffers_uoffset_read_from_pe((flatbuffers_uoffset_t *)vec - 1) : 0; } -#define __flatbuffers_string_len(s) __flatbuffers_vec_len(s) -static inline size_t flatbuffers_vec_len(const void *vec) -__flatbuffers_vec_len(vec) -#define __flatbuffers_scalar_vec_at(N, vec, i)\ -{ assert(flatbuffers_vec_len(vec) > (i) && "index out of range");\ - return __flatbuffers_read_scalar(N, &(vec)[i]); } -#define __flatbuffers_struct_vec_at(vec, i)\ -{ assert(flatbuffers_vec_len(vec) > (i) && "index out of range"); return (vec) + (i); } -/* `adjust` skips past the header for string vectors. */ -#define __flatbuffers_offset_vec_at(T, vec, i, adjust)\ -{ const flatbuffers_uoffset_t *elem__tmp = (vec) + (i);\ - assert(flatbuffers_vec_len(vec) > (i) && "index out of range");\ - return (T)((uint8_t *)(elem__tmp) + (size_t)__flatbuffers_uoffset_read_from_pe(elem__tmp) + (adjust)); } -#define __flatbuffers_define_scalar_vec_len(N)\ -static inline size_t N ## _vec_len(N ##_vec_t vec__tmp)\ -{ return flatbuffers_vec_len(vec__tmp); } -#define __flatbuffers_define_scalar_vec_at(N, T) \ -static inline T N ## _vec_at(N ## _vec_t vec__tmp, size_t i__tmp)\ -__flatbuffers_scalar_vec_at(N, vec__tmp, i__tmp) -typedef const char *flatbuffers_string_t; -static inline size_t flatbuffers_string_len(flatbuffers_string_t s) -__flatbuffers_string_len(s) -typedef const flatbuffers_uoffset_t *flatbuffers_string_vec_t; -typedef flatbuffers_uoffset_t *flatbuffers_string_mutable_vec_t; -static inline size_t flatbuffers_string_vec_len(flatbuffers_string_vec_t vec) -__flatbuffers_vec_len(vec) -static inline flatbuffers_string_t flatbuffers_string_vec_at(flatbuffers_string_vec_t vec, size_t i) -__flatbuffers_offset_vec_at(flatbuffers_string_t, vec, i, sizeof(vec[0])) -typedef const void *flatbuffers_generic_t; -typedef void *flatbuffers_mutable_generic_t; -static inline flatbuffers_string_t flatbuffers_string_cast_from_generic(const flatbuffers_generic_t p) -{ return p ? ((const char *)p) + __flatbuffers_uoffset__size() : 0; } -typedef const flatbuffers_uoffset_t *flatbuffers_generic_vec_t; -typedef flatbuffers_uoffset_t *flatbuffers_generic_table_mutable_vec_t; -static inline size_t flatbuffers_generic_vec_len(flatbuffers_generic_vec_t vec) -__flatbuffers_vec_len(vec) -static inline flatbuffers_generic_t flatbuffers_generic_vec_at(flatbuffers_generic_vec_t vec, size_t i) -__flatbuffers_offset_vec_at(flatbuffers_generic_t, vec, i, 0) -static inline flatbuffers_generic_t flatbuffers_generic_vec_at_as_string(flatbuffers_generic_vec_t vec, size_t i) -__flatbuffers_offset_vec_at(flatbuffers_generic_t, vec, i, sizeof(vec[0])) -typedef struct flatbuffers_union { - flatbuffers_union_type_t type; - flatbuffers_generic_t value; -} flatbuffers_union_t; -typedef struct flatbuffers_union_vec { - const flatbuffers_union_type_t *type; - const flatbuffers_uoffset_t *value; -} flatbuffers_union_vec_t; -typedef struct flatbuffers_mutable_union { - flatbuffers_union_type_t type; - flatbuffers_mutable_generic_t value; -} flatbuffers_mutable_union_t; -typedef struct flatbuffers_mutable_union_vec { - flatbuffers_union_type_t *type; - flatbuffers_uoffset_t *value; -} flatbuffers_mutable_union_vec_t; -static inline flatbuffers_mutable_union_t flatbuffers_mutable_union_cast(flatbuffers_union_t u__tmp)\ -{ flatbuffers_mutable_union_t mu = { u__tmp.type, (flatbuffers_mutable_generic_t)u__tmp.value };\ - return mu; } -static inline flatbuffers_mutable_union_vec_t flatbuffers_mutable_union_vec_cast(flatbuffers_union_vec_t uv__tmp)\ -{ flatbuffers_mutable_union_vec_t muv =\ - { (flatbuffers_union_type_t *)uv__tmp.type, (flatbuffers_uoffset_t *)uv__tmp.value }; return muv; } -#define __flatbuffers_union_type_field(ID, t)\ -{\ - __flatbuffers_read_vt(ID, offset__tmp, t)\ - return offset__tmp ? __flatbuffers_read_scalar_at_byteoffset(__flatbuffers_utype, t, offset__tmp) : 0;\ -} -static inline flatbuffers_string_t flatbuffers_string_cast_from_union(const flatbuffers_union_t u__tmp)\ -{ return flatbuffers_string_cast_from_generic(u__tmp.value); } -#define __flatbuffers_define_union_field(NS, ID, N, NK, T, r)\ -static inline T ## _union_type_t N ## _ ## NK ## _type_get(N ## _table_t t__tmp)\ -__## NS ## union_type_field(((ID) - 1), t__tmp)\ -static inline NS ## generic_t N ## _ ## NK ## _get(N ## _table_t t__tmp)\ -__## NS ## table_field(NS ## generic_t, ID, t__tmp, r)\ -static inline T ## _union_type_t N ## _ ## NK ## _type(N ## _table_t t__tmp)\ -__## NS ## union_type_field(((ID) - 1), t__tmp)\ -static inline NS ## generic_t N ## _ ## NK(N ## _table_t t__tmp)\ -__## NS ## table_field(NS ## generic_t, ID, t__tmp, r)\ -static inline int N ## _ ## NK ## _is_present(N ## _table_t t__tmp)\ -__## NS ## field_present(ID, t__tmp)\ -static inline T ## _union_t N ## _ ## NK ## _union(N ## _table_t t__tmp)\ -{ T ## _union_t u__tmp = { 0, 0 }; u__tmp.type = N ## _ ## NK ## _type_get(t__tmp);\ - if (u__tmp.type == 0) return u__tmp; u__tmp.value = N ## _ ## NK ## _get(t__tmp); return u__tmp; }\ -static inline NS ## string_t N ## _ ## NK ## _as_string(N ## _table_t t__tmp)\ -{ return NS ## string_cast_from_generic(N ## _ ## NK ## _get(t__tmp)); }\ - -#define __flatbuffers_define_union_vector_ops(NS, T)\ -static inline size_t T ## _union_vec_len(T ## _union_vec_t uv__tmp)\ -{ return NS ## vec_len(uv__tmp.type); }\ -static inline T ## _union_t T ## _union_vec_at(T ## _union_vec_t uv__tmp, size_t i__tmp)\ -{ T ## _union_t u__tmp = { 0, 0 }; size_t n__tmp = NS ## vec_len(uv__tmp.type);\ - assert(n__tmp > (i__tmp) && "index out of range"); u__tmp.type = uv__tmp.type[i__tmp];\ - /* Unknown type is treated as NONE for schema evolution. */\ - if (u__tmp.type == 0) return u__tmp;\ - u__tmp.value = NS ## generic_vec_at(uv__tmp.value, i__tmp); return u__tmp; }\ -static inline NS ## string_t T ## _union_vec_at_as_string(T ## _union_vec_t uv__tmp, size_t i__tmp)\ -{ return (NS ## string_t) NS ## generic_vec_at_as_string(uv__tmp.value, i__tmp); }\ - -#define __flatbuffers_define_union_vector(NS, T)\ -typedef NS ## union_vec_t T ## _union_vec_t;\ -typedef NS ## mutable_union_vec_t T ## _mutable_union_vec_t;\ -static inline T ## _mutable_union_vec_t T ## _mutable_union_vec_cast(T ## _union_vec_t u__tmp)\ -{ return NS ## mutable_union_vec_cast(u__tmp); }\ -__## NS ## define_union_vector_ops(NS, T) -#define __flatbuffers_define_union(NS, T)\ -typedef NS ## union_t T ## _union_t;\ -typedef NS ## mutable_union_t T ## _mutable_union_t;\ -static inline T ## _mutable_union_t T ## _mutable_union_cast(T ## _union_t u__tmp)\ -{ return NS ## mutable_union_cast(u__tmp); }\ -__## NS ## define_union_vector(NS, T) -#define __flatbuffers_define_union_vector_field(NS, ID, N, NK, T, r)\ -__## NS ## define_vector_field(ID - 1, N, NK ## _type, T ## _vec_t, r)\ -__## NS ## define_vector_field(ID, N, NK, flatbuffers_generic_vec_t, r)\ -static inline T ## _union_vec_t N ## _ ## NK ## _union(N ## _table_t t__tmp)\ -{ T ## _union_vec_t uv__tmp; uv__tmp.type = N ## _ ## NK ## _type_get(t__tmp);\ - uv__tmp.value = N ## _ ## NK(t__tmp);\ - assert(NS ## vec_len(uv__tmp.type) == NS ## vec_len(uv__tmp.value)\ - && "union vector type length mismatch"); return uv__tmp; } -#include -static const size_t flatbuffers_not_found = (size_t)-1; -static const size_t flatbuffers_end = (size_t)-1; -#define __flatbuffers_identity(n) (n) -#define __flatbuffers_min(a, b) ((a) < (b) ? (a) : (b)) -/* Subtraction doesn't work for unsigned types. */ -#define __flatbuffers_scalar_cmp(x, y, n) ((x) < (y) ? -1 : (x) > (y)) -static inline int __flatbuffers_string_n_cmp(flatbuffers_string_t v, const char *s, size_t n) -{ size_t nv = flatbuffers_string_len(v); int x = strncmp(v, s, nv < n ? nv : n); - return x != 0 ? x : nv < n ? -1 : nv > n; } -/* `n` arg unused, but needed by string find macro expansion. */ -static inline int __flatbuffers_string_cmp(flatbuffers_string_t v, const char *s, size_t n) { (void)n; return strcmp(v, s); } -/* A = identity if searching scalar vectors rather than key fields. */ -/* Returns lowest matching index or not_found. */ -#define __flatbuffers_find_by_field(A, V, E, L, K, Kn, T, D)\ -{ T v__tmp; size_t a__tmp = 0, b__tmp, m__tmp; if (!(b__tmp = L(V))) { return flatbuffers_not_found; }\ - --b__tmp;\ - while (a__tmp < b__tmp) {\ - m__tmp = a__tmp + ((b__tmp - a__tmp) >> 1);\ - v__tmp = A(E(V, m__tmp));\ - if ((D(v__tmp, (K), (Kn))) < 0) {\ - a__tmp = m__tmp + 1;\ - } else {\ - b__tmp = m__tmp;\ - }\ - }\ - if (a__tmp == b__tmp) {\ - v__tmp = A(E(V, a__tmp));\ - if (D(v__tmp, (K), (Kn)) == 0) {\ - return a__tmp;\ - }\ - }\ - return flatbuffers_not_found;\ -} -#define __flatbuffers_find_by_scalar_field(A, V, E, L, K, T)\ -__flatbuffers_find_by_field(A, V, E, L, K, 0, T, __flatbuffers_scalar_cmp) -#define __flatbuffers_find_by_string_field(A, V, E, L, K)\ -__flatbuffers_find_by_field(A, V, E, L, K, 0, flatbuffers_string_t, __flatbuffers_string_cmp) -#define __flatbuffers_find_by_string_n_field(A, V, E, L, K, Kn)\ -__flatbuffers_find_by_field(A, V, E, L, K, Kn, flatbuffers_string_t, __flatbuffers_string_n_cmp) -#define __flatbuffers_define_find_by_scalar_field(N, NK, TK)\ -static inline size_t N ## _vec_find_by_ ## NK(N ## _vec_t vec__tmp, TK key__tmp)\ -__flatbuffers_find_by_scalar_field(N ## _ ## NK, vec__tmp, N ## _vec_at, N ## _vec_len, key__tmp, TK) -#define __flatbuffers_define_scalar_find(N, T)\ -static inline size_t N ## _vec_find(N ## _vec_t vec__tmp, T key__tmp)\ -__flatbuffers_find_by_scalar_field(__flatbuffers_identity, vec__tmp, N ## _vec_at, N ## _vec_len, key__tmp, T) -#define __flatbuffers_define_find_by_string_field(N, NK) \ -/* Note: find only works on vectors sorted by this field. */\ -static inline size_t N ## _vec_find_by_ ## NK(N ## _vec_t vec__tmp, const char *s__tmp)\ -__flatbuffers_find_by_string_field(N ## _ ## NK, vec__tmp, N ## _vec_at, N ## _vec_len, s__tmp)\ -static inline size_t N ## _vec_find_n_by_ ## NK(N ## _vec_t vec__tmp, const char *s__tmp, int n__tmp)\ -__flatbuffers_find_by_string_n_field(N ## _ ## NK, vec__tmp, N ## _vec_at, N ## _vec_len, s__tmp, n__tmp) -#define __flatbuffers_define_default_find_by_scalar_field(N, NK, TK)\ -static inline size_t N ## _vec_find(N ## _vec_t vec__tmp, TK key__tmp)\ -{ return N ## _vec_find_by_ ## NK(vec__tmp, key__tmp); } -#define __flatbuffers_define_default_find_by_string_field(N, NK) \ -static inline size_t N ## _vec_find(N ## _vec_t vec__tmp, const char *s__tmp)\ -{ return N ## _vec_find_by_ ## NK(vec__tmp, s__tmp); }\ -static inline size_t N ## _vec_find_n(N ## _vec_t vec__tmp, const char *s__tmp, int n__tmp)\ -{ return N ## _vec_find_n_by_ ## NK(vec__tmp, s__tmp, n__tmp); } -/* A = identity if searching scalar vectors rather than key fields. */ -/* Returns lowest matching index or not_found. */ -#define __flatbuffers_scan_by_field(b, e, A, V, E, L, K, Kn, T, D)\ -{ T v__tmp; size_t i__tmp;\ - for (i__tmp = b; i__tmp < e; ++i__tmp) {\ - v__tmp = A(E(V, i__tmp));\ - if (D(v__tmp, (K), (Kn)) == 0) {\ - return i__tmp;\ - }\ - }\ - return flatbuffers_not_found;\ -} -#define __flatbuffers_rscan_by_field(b, e, A, V, E, L, K, Kn, T, D)\ -{ T v__tmp; size_t i__tmp = e;\ - while (i__tmp-- > b) {\ - v__tmp = A(E(V, i__tmp));\ - if (D(v__tmp, (K), (Kn)) == 0) {\ - return i__tmp;\ - }\ - }\ - return flatbuffers_not_found;\ -} -#define __flatbuffers_scan_by_scalar_field(b, e, A, V, E, L, K, T)\ -__flatbuffers_scan_by_field(b, e, A, V, E, L, K, 0, T, __flatbuffers_scalar_cmp) -#define __flatbuffers_scan_by_string_field(b, e, A, V, E, L, K)\ -__flatbuffers_scan_by_field(b, e, A, V, E, L, K, 0, flatbuffers_string_t, __flatbuffers_string_cmp) -#define __flatbuffers_scan_by_string_n_field(b, e, A, V, E, L, K, Kn)\ -__flatbuffers_scan_by_field(b, e, A, V, E, L, K, Kn, flatbuffers_string_t, __flatbuffers_string_n_cmp) -#define __flatbuffers_rscan_by_scalar_field(b, e, A, V, E, L, K, T)\ -__flatbuffers_rscan_by_field(b, e, A, V, E, L, K, 0, T, __flatbuffers_scalar_cmp) -#define __flatbuffers_rscan_by_string_field(b, e, A, V, E, L, K)\ -__flatbuffers_rscan_by_field(b, e, A, V, E, L, K, 0, flatbuffers_string_t, __flatbuffers_string_cmp) -#define __flatbuffers_rscan_by_string_n_field(b, e, A, V, E, L, K, Kn)\ -__flatbuffers_rscan_by_field(b, e, A, V, E, L, K, Kn, flatbuffers_string_t, __flatbuffers_string_n_cmp) -#define __flatbuffers_define_scan_by_scalar_field(N, NK, T)\ -static inline size_t N ## _vec_scan_by_ ## NK(N ## _vec_t vec__tmp, T key__tmp)\ -__flatbuffers_scan_by_scalar_field(0, N ## _vec_len(vec__tmp), N ## _ ## NK ## _get, vec__tmp, N ## _vec_at, N ## _vec_len, key__tmp, T)\ -static inline size_t N ## _vec_scan_ex_by_ ## NK(N ## _vec_t vec__tmp, size_t begin__tmp, size_t end__tmp, T key__tmp)\ -__flatbuffers_scan_by_scalar_field(begin__tmp, __flatbuffers_min(end__tmp, N ## _vec_len(vec__tmp)), N ## _ ## NK ## _get, vec__tmp, N ## _vec_at, N ## _vec_len, key__tmp, T)\ -static inline size_t N ## _vec_rscan_by_ ## NK(N ## _vec_t vec__tmp, T key__tmp)\ -__flatbuffers_rscan_by_scalar_field(0, N ## _vec_len(vec__tmp), N ## _ ## NK ## _get, vec__tmp, N ## _vec_at, N ## _vec_len, key__tmp, T)\ -static inline size_t N ## _vec_rscan_ex_by_ ## NK(N ## _vec_t vec__tmp, size_t begin__tmp, size_t end__tmp, T key__tmp)\ -__flatbuffers_rscan_by_scalar_field(begin__tmp, __flatbuffers_min(end__tmp, N ## _vec_len(vec__tmp)), N ## _ ## NK ## _get, vec__tmp, N ## _vec_at, N ## _vec_len, key__tmp, T) -#define __flatbuffers_define_scalar_scan(N, T)\ -static inline size_t N ## _vec_scan(N ## _vec_t vec__tmp, T key__tmp)\ -__flatbuffers_scan_by_scalar_field(0, N ## _vec_len(vec__tmp), __flatbuffers_identity, vec__tmp, N ## _vec_at, N ## _vec_len, key__tmp, T)\ -static inline size_t N ## _vec_scan_ex(N ## _vec_t vec__tmp, size_t begin__tmp, size_t end__tmp, T key__tmp)\ -__flatbuffers_scan_by_scalar_field(begin__tmp, __flatbuffers_min(end__tmp, N ## _vec_len(vec__tmp)), __flatbuffers_identity, vec__tmp, N ## _vec_at, N ## _vec_len, key__tmp, T)\ -static inline size_t N ## _vec_rscan(N ## _vec_t vec__tmp, T key__tmp)\ -__flatbuffers_rscan_by_scalar_field(0, N ## _vec_len(vec__tmp), __flatbuffers_identity, vec__tmp, N ## _vec_at, N ## _vec_len, key__tmp, T)\ -static inline size_t N ## _vec_rscan_ex(N ## _vec_t vec__tmp, size_t begin__tmp, size_t end__tmp, T key__tmp)\ -__flatbuffers_rscan_by_scalar_field(begin__tmp, __flatbuffers_min(end__tmp, N ## _vec_len(vec__tmp)), __flatbuffers_identity, vec__tmp, N ## _vec_at, N ## _vec_len, key__tmp, T) -#define __flatbuffers_define_scan_by_string_field(N, NK) \ -static inline size_t N ## _vec_scan_by_ ## NK(N ## _vec_t vec__tmp, const char *s__tmp)\ -__flatbuffers_scan_by_string_field(0, N ## _vec_len(vec__tmp), N ## _ ## NK ## _get, vec__tmp, N ## _vec_at, N ## _vec_len, s__tmp)\ -static inline size_t N ## _vec_scan_n_by_ ## NK(N ## _vec_t vec__tmp, const char *s__tmp, int n__tmp)\ -__flatbuffers_scan_by_string_n_field(0, N ## _vec_len(vec__tmp), N ## _ ## NK ## _get, vec__tmp, N ## _vec_at, N ## _vec_len, s__tmp, n__tmp)\ -static inline size_t N ## _vec_scan_ex_by_ ## NK(N ## _vec_t vec__tmp, size_t begin__tmp, size_t end__tmp, const char *s__tmp)\ -__flatbuffers_scan_by_string_field(begin__tmp, __flatbuffers_min(end__tmp, N ## _vec_len(vec__tmp)), N ## _ ## NK ## _get, vec__tmp, N ## _vec_at, N ## _vec_len, s__tmp)\ -static inline size_t N ## _vec_scan_ex_n_by_ ## NK(N ## _vec_t vec__tmp, size_t begin__tmp, size_t end__tmp, const char *s__tmp, int n__tmp)\ -__flatbuffers_scan_by_string_n_field(begin__tmp, __flatbuffers_min( end__tmp, N ## _vec_len(vec__tmp)), N ## _ ## NK ## _get, vec__tmp, N ## _vec_at, N ## _vec_len, s__tmp, n__tmp)\ -static inline size_t N ## _vec_rscan_by_ ## NK(N ## _vec_t vec__tmp, const char *s__tmp)\ -__flatbuffers_rscan_by_string_field(0, N ## _vec_len(vec__tmp), N ## _ ## NK ## _get, vec__tmp, N ## _vec_at, N ## _vec_len, s__tmp)\ -static inline size_t N ## _vec_rscan_n_by_ ## NK(N ## _vec_t vec__tmp, const char *s__tmp, int n__tmp)\ -__flatbuffers_rscan_by_string_n_field(0, N ## _vec_len(vec__tmp), N ## _ ## NK ## _get, vec__tmp, N ## _vec_at, N ## _vec_len, s__tmp, n__tmp)\ -static inline size_t N ## _vec_rscan_ex_by_ ## NK(N ## _vec_t vec__tmp, size_t begin__tmp, size_t end__tmp, const char *s__tmp)\ -__flatbuffers_rscan_by_string_field(begin__tmp, __flatbuffers_min(end__tmp, N ## _vec_len(vec__tmp)), N ## _ ## NK ## _get, vec__tmp, N ## _vec_at, N ## _vec_len, s__tmp)\ -static inline size_t N ## _vec_rscan_ex_n_by_ ## NK(N ## _vec_t vec__tmp, size_t begin__tmp, size_t end__tmp, const char *s__tmp, int n__tmp)\ -__flatbuffers_rscan_by_string_n_field(begin__tmp, __flatbuffers_min( end__tmp, N ## _vec_len(vec__tmp)), N ## _ ## NK ## _get, vec__tmp, N ## _vec_at, N ## _vec_len, s__tmp, n__tmp) -#define __flatbuffers_define_default_scan_by_scalar_field(N, NK, TK)\ -static inline size_t N ## _vec_scan(N ## _vec_t vec__tmp, TK key__tmp)\ -{ return N ## _vec_scan_by_ ## NK(vec__tmp, key__tmp); }\ -static inline size_t N ## _vec_scan_ex(N ## _vec_t vec__tmp, size_t begin__tmp, size_t end__tmp, TK key__tmp)\ -{ return N ## _vec_scan_ex_by_ ## NK(vec__tmp, begin__tmp, end__tmp, key__tmp); }\ -static inline size_t N ## _vec_rscan(N ## _vec_t vec__tmp, TK key__tmp)\ -{ return N ## _vec_rscan_by_ ## NK(vec__tmp, key__tmp); }\ -static inline size_t N ## _vec_rscan_ex(N ## _vec_t vec__tmp, size_t begin__tmp, size_t end__tmp, TK key__tmp)\ -{ return N ## _vec_rscan_ex_by_ ## NK(vec__tmp, begin__tmp, end__tmp, key__tmp); } -#define __flatbuffers_define_default_scan_by_string_field(N, NK) \ -static inline size_t N ## _vec_scan(N ## _vec_t vec__tmp, const char *s__tmp)\ -{ return N ## _vec_scan_by_ ## NK(vec__tmp, s__tmp); }\ -static inline size_t N ## _vec_scan_n(N ## _vec_t vec__tmp, const char *s__tmp, int n__tmp)\ -{ return N ## _vec_scan_n_by_ ## NK(vec__tmp, s__tmp, n__tmp); }\ -static inline size_t N ## _vec_scan_ex(N ## _vec_t vec__tmp, size_t begin__tmp, size_t end__tmp, const char *s__tmp)\ -{ return N ## _vec_scan_ex_by_ ## NK(vec__tmp, begin__tmp, end__tmp, s__tmp); }\ -static inline size_t N ## _vec_scan_ex_n(N ## _vec_t vec__tmp, size_t begin__tmp, size_t end__tmp, const char *s__tmp, int n__tmp)\ -{ return N ## _vec_scan_ex_n_by_ ## NK(vec__tmp, begin__tmp, end__tmp, s__tmp, n__tmp); }\ -static inline size_t N ## _vec_rscan(N ## _vec_t vec__tmp, const char *s__tmp)\ -{ return N ## _vec_rscan_by_ ## NK(vec__tmp, s__tmp); }\ -static inline size_t N ## _vec_rscan_n(N ## _vec_t vec__tmp, const char *s__tmp, int n__tmp)\ -{ return N ## _vec_rscan_n_by_ ## NK(vec__tmp, s__tmp, n__tmp); }\ -static inline size_t N ## _vec_rscan_ex(N ## _vec_t vec__tmp, size_t begin__tmp, size_t end__tmp, const char *s__tmp)\ -{ return N ## _vec_rscan_ex_by_ ## NK(vec__tmp, begin__tmp, end__tmp, s__tmp); }\ -static inline size_t N ## _vec_rscan_ex_n(N ## _vec_t vec__tmp, size_t begin__tmp, size_t end__tmp, const char *s__tmp, int n__tmp)\ -{ return N ## _vec_rscan_ex_n_by_ ## NK(vec__tmp, begin__tmp, end__tmp, s__tmp, n__tmp); } -#define __flatbuffers_heap_sort(N, X, A, E, L, TK, TE, D, S)\ -static inline void __ ## N ## X ## __heap_sift_down(\ - N ## _mutable_vec_t vec__tmp, size_t start__tmp, size_t end__tmp)\ -{ size_t child__tmp, root__tmp; TK v1__tmp, v2__tmp, vroot__tmp;\ - root__tmp = start__tmp;\ - while ((root__tmp << 1) <= end__tmp) {\ - child__tmp = root__tmp << 1;\ - if (child__tmp < end__tmp) {\ - v1__tmp = A(E(vec__tmp, child__tmp));\ - v2__tmp = A(E(vec__tmp, child__tmp + 1));\ - if (D(v1__tmp, v2__tmp) < 0) {\ - child__tmp++;\ - }\ - }\ - vroot__tmp = A(E(vec__tmp, root__tmp));\ - v1__tmp = A(E(vec__tmp, child__tmp));\ - if (D(vroot__tmp, v1__tmp) < 0) {\ - S(vec__tmp, root__tmp, child__tmp, TE);\ - root__tmp = child__tmp;\ - } else {\ - return;\ - }\ - }\ -}\ -static inline void __ ## N ## X ## __heap_sort(N ## _mutable_vec_t vec__tmp)\ -{ size_t start__tmp, end__tmp, size__tmp;\ - size__tmp = L(vec__tmp); if (size__tmp == 0) return; end__tmp = size__tmp - 1; start__tmp = size__tmp >> 1;\ - do { __ ## N ## X ## __heap_sift_down(vec__tmp, start__tmp, end__tmp); } while (start__tmp--);\ - while (end__tmp > 0) { \ - S(vec__tmp, 0, end__tmp, TE);\ - __ ## N ## X ## __heap_sift_down(vec__tmp, 0, --end__tmp); } } -#define __flatbuffers_define_sort_by_field(N, NK, TK, TE, D, S)\ - __flatbuffers_heap_sort(N, _sort_by_ ## NK, N ## _ ## NK ## _get, N ## _vec_at, N ## _vec_len, TK, TE, D, S)\ -static inline void N ## _vec_sort_by_ ## NK(N ## _mutable_vec_t vec__tmp)\ -{ __ ## N ## _sort_by_ ## NK ## __heap_sort(vec__tmp); } -#define __flatbuffers_define_sort(N, TK, TE, D, S)\ -__flatbuffers_heap_sort(N, , __flatbuffers_identity, N ## _vec_at, N ## _vec_len, TK, TE, D, S)\ -static inline void N ## _vec_sort(N ## _mutable_vec_t vec__tmp) { __ ## N ## __heap_sort(vec__tmp); } -#define __flatbuffers_scalar_diff(x, y) ((x) < (y) ? -1 : (x) > (y)) -#define __flatbuffers_string_diff(x, y) __flatbuffers_string_n_cmp((x), (const char *)(y), flatbuffers_string_len(y)) -#define __flatbuffers_value_swap(vec, a, b, TE) { TE x__tmp = vec[b]; vec[b] = vec[a]; vec[a] = x__tmp; } -#define __flatbuffers_uoffset_swap(vec, a, b, TE)\ -{ TE ta__tmp, tb__tmp, d__tmp;\ - d__tmp = (TE)((a - b) * sizeof(vec[0]));\ - ta__tmp = __flatbuffers_uoffset_read_from_pe(vec + b) - d__tmp;\ - tb__tmp = __flatbuffers_uoffset_read_from_pe(vec + a) + d__tmp;\ - __flatbuffers_uoffset_write_to_pe(vec + a, ta__tmp);\ - __flatbuffers_uoffset_write_to_pe(vec + b, tb__tmp); } -#define __flatbuffers_scalar_swap(vec, a, b, TE) __flatbuffers_value_swap(vec, a, b, TE) -#define __flatbuffers_string_swap(vec, a, b, TE) __flatbuffers_uoffset_swap(vec, a, b, TE) -#define __flatbuffers_struct_swap(vec, a, b, TE) __flatbuffers_value_swap(vec, a, b, TE) -#define __flatbuffers_table_swap(vec, a, b, TE) __flatbuffers_uoffset_swap(vec, a, b, TE) -#define __flatbuffers_define_struct_sort_by_scalar_field(N, NK, TK, TE)\ - __flatbuffers_define_sort_by_field(N, NK, TK, TE, __flatbuffers_scalar_diff, __flatbuffers_struct_swap) -#define __flatbuffers_define_table_sort_by_scalar_field(N, NK, TK)\ - __flatbuffers_define_sort_by_field(N, NK, TK, flatbuffers_uoffset_t, __flatbuffers_scalar_diff, __flatbuffers_table_swap) -#define __flatbuffers_define_table_sort_by_string_field(N, NK)\ - __flatbuffers_define_sort_by_field(N, NK, flatbuffers_string_t, flatbuffers_uoffset_t, __flatbuffers_string_diff, __flatbuffers_table_swap) -#define __flatbuffers_define_scalar_sort(N, T) __flatbuffers_define_sort(N, T, T, __flatbuffers_scalar_diff, __flatbuffers_scalar_swap) -#define __flatbuffers_define_string_sort() __flatbuffers_define_sort(flatbuffers_string, flatbuffers_string_t, flatbuffers_uoffset_t, __flatbuffers_string_diff, __flatbuffers_string_swap) -#define __flatbuffers_sort_vector_field(N, NK, T, t)\ -{ T ## _mutable_vec_t v__tmp = (T ## _mutable_vec_t) N ## _ ## NK ## _get(t);\ - if (v__tmp) T ## _vec_sort(v__tmp); } -#define __flatbuffers_sort_table_field(N, NK, T, t)\ -{ T ## _sort((T ## _mutable_table_t)N ## _ ## NK ## _get(t)); } -#define __flatbuffers_sort_union_field(N, NK, T, t)\ -{ T ## _sort(T ## _mutable_union_cast(N ## _ ## NK ## _union(t))); } -#define __flatbuffers_sort_table_vector_field_elements(N, NK, T, t)\ -{ T ## _vec_t v__tmp = N ## _ ## NK ## _get(t); size_t i__tmp, n__tmp;\ - n__tmp = T ## _vec_len(v__tmp); for (i__tmp = 0; i__tmp < n__tmp; ++i__tmp) {\ - T ## _sort((T ## _mutable_table_t)T ## _vec_at(v__tmp, i__tmp)); }} -#define __flatbuffers_sort_union_vector_field_elements(N, NK, T, t)\ -{ T ## _union_vec_t v__tmp = N ## _ ## NK ## _union(t); size_t i__tmp, n__tmp;\ - n__tmp = T ## _union_vec_len(v__tmp); for (i__tmp = 0; i__tmp < n__tmp; ++i__tmp) {\ - T ## _sort(T ## _mutable_union_cast(T ## _union_vec_at(v__tmp, i__tmp))); }} -#define __flatbuffers_define_scalar_vector(N, T)\ -typedef const T *N ## _vec_t;\ -typedef T *N ## _mutable_vec_t;\ -__flatbuffers_define_scalar_vec_len(N)\ -__flatbuffers_define_scalar_vec_at(N, T)\ -__flatbuffers_define_scalar_find(N, T)\ -__flatbuffers_define_scalar_scan(N, T)\ -__flatbuffers_define_scalar_sort(N, T) - -#define __flatbuffers_define_integer_type(N, T, W)\ -__flatcc_define_integer_accessors(N, T, W, flatbuffers_endian)\ -__flatbuffers_define_scalar_vector(N, T) -__flatbuffers_define_scalar_vector(flatbuffers_bool, flatbuffers_bool_t) -__flatbuffers_define_scalar_vector(flatbuffers_char, char) -__flatbuffers_define_scalar_vector(flatbuffers_uint8, uint8_t) -__flatbuffers_define_scalar_vector(flatbuffers_int8, int8_t) -__flatbuffers_define_scalar_vector(flatbuffers_uint16, uint16_t) -__flatbuffers_define_scalar_vector(flatbuffers_int16, int16_t) -__flatbuffers_define_scalar_vector(flatbuffers_uint32, uint32_t) -__flatbuffers_define_scalar_vector(flatbuffers_int32, int32_t) -__flatbuffers_define_scalar_vector(flatbuffers_uint64, uint64_t) -__flatbuffers_define_scalar_vector(flatbuffers_int64, int64_t) -__flatbuffers_define_scalar_vector(flatbuffers_float, float) -__flatbuffers_define_scalar_vector(flatbuffers_double, double) -__flatbuffers_define_scalar_vector(flatbuffers_union_type, flatbuffers_union_type_t) -static inline size_t flatbuffers_string_vec_find(flatbuffers_string_vec_t vec, const char *s) -__flatbuffers_find_by_string_field(__flatbuffers_identity, vec, flatbuffers_string_vec_at, flatbuffers_string_vec_len, s) -static inline size_t flatbuffers_string_vec_find_n(flatbuffers_string_vec_t vec, const char *s, size_t n) -__flatbuffers_find_by_string_n_field(__flatbuffers_identity, vec, flatbuffers_string_vec_at, flatbuffers_string_vec_len, s, n) -static inline size_t flatbuffers_string_vec_scan(flatbuffers_string_vec_t vec, const char *s) -__flatbuffers_scan_by_string_field(0, flatbuffers_string_vec_len(vec), __flatbuffers_identity, vec, flatbuffers_string_vec_at, flatbuffers_string_vec_len, s) -static inline size_t flatbuffers_string_vec_scan_n(flatbuffers_string_vec_t vec, const char *s, size_t n) -__flatbuffers_scan_by_string_n_field(0, flatbuffers_string_vec_len(vec), __flatbuffers_identity, vec, flatbuffers_string_vec_at, flatbuffers_string_vec_len, s, n) -static inline size_t flatbuffers_string_vec_scan_ex(flatbuffers_string_vec_t vec, size_t begin, size_t end, const char *s) -__flatbuffers_scan_by_string_field(begin, __flatbuffers_min(end, flatbuffers_string_vec_len(vec)), __flatbuffers_identity, vec, flatbuffers_string_vec_at, flatbuffers_string_vec_len, s) -static inline size_t flatbuffers_string_vec_scan_ex_n(flatbuffers_string_vec_t vec, size_t begin, size_t end, const char *s, size_t n) -__flatbuffers_scan_by_string_n_field(begin, __flatbuffers_min(end, flatbuffers_string_vec_len(vec)), __flatbuffers_identity, vec, flatbuffers_string_vec_at, flatbuffers_string_vec_len, s, n) -static inline size_t flatbuffers_string_vec_rscan(flatbuffers_string_vec_t vec, const char *s) -__flatbuffers_rscan_by_string_field(0, flatbuffers_string_vec_len(vec), __flatbuffers_identity, vec, flatbuffers_string_vec_at, flatbuffers_string_vec_len, s) -static inline size_t flatbuffers_string_vec_rscan_n(flatbuffers_string_vec_t vec, const char *s, size_t n) -__flatbuffers_rscan_by_string_n_field(0, flatbuffers_string_vec_len(vec), __flatbuffers_identity, vec, flatbuffers_string_vec_at, flatbuffers_string_vec_len, s, n) -static inline size_t flatbuffers_string_vec_rscan_ex(flatbuffers_string_vec_t vec, size_t begin, size_t end, const char *s) -__flatbuffers_rscan_by_string_field(begin, __flatbuffers_min(end, flatbuffers_string_vec_len(vec)), __flatbuffers_identity, vec, flatbuffers_string_vec_at, flatbuffers_string_vec_len, s) -static inline size_t flatbuffers_string_vec_rscan_ex_n(flatbuffers_string_vec_t vec, size_t begin, size_t end, const char *s, size_t n) -__flatbuffers_rscan_by_string_n_field(begin, __flatbuffers_min(end, flatbuffers_string_vec_len(vec)), __flatbuffers_identity, vec, flatbuffers_string_vec_at, flatbuffers_string_vec_len, s, n) -__flatbuffers_define_string_sort() -#define __flatbuffers_define_struct_scalar_fixed_array_field(N, NK, TK, T, L)\ -static inline T N ## _ ## NK ## _get(N ## _struct_t t__tmp, size_t i__tmp)\ -{ if (!t__tmp || i__tmp >= L) return 0;\ - return __flatbuffers_read_scalar(TK, &(t__tmp->NK[i__tmp])); }\ -static inline const T *N ## _ ## NK ## _get_ptr(N ## _struct_t t__tmp)\ -{ return t__tmp ? t__tmp->NK : 0; }\ -static inline size_t N ## _ ## NK ## _get_len(void) { return L; }\ -static inline T N ## _ ## NK (N ## _struct_t t__tmp, size_t i__tmp)\ -{ return N ## _ ## NK ## _get(t__tmp, i__tmp); } -#define __flatbuffers_define_struct_struct_fixed_array_field(N, NK, T, L)\ -static inline T N ## _ ## NK ## _get(N ## _struct_t t__tmp, size_t i__tmp)\ -{ if (!t__tmp || i__tmp >= L) return 0; return t__tmp->NK + i__tmp; }static inline T N ## _ ## NK ## _get_ptr(N ## _struct_t t__tmp)\ -{ return t__tmp ? t__tmp->NK : 0; }\ -static inline size_t N ## _ ## NK ## _get_len(void) { return L; }\ -static inline T N ## _ ## NK(N ## _struct_t t__tmp, size_t i__tmp)\ -{ if (!t__tmp || i__tmp >= L) return 0; return t__tmp->NK + i__tmp; } -#define __flatbuffers_define_struct_scalar_field(N, NK, TK, T)\ -static inline T N ## _ ## NK ## _get(N ## _struct_t t__tmp)\ -{ return t__tmp ? __flatbuffers_read_scalar(TK, &(t__tmp->NK)) : 0; }\ -static inline const T *N ## _ ## NK ## _get_ptr(N ## _struct_t t__tmp)\ -{ return t__tmp ? &(t__tmp->NK) : 0; }\ -static inline T N ## _ ## NK (N ## _struct_t t__tmp)\ -{ return t__tmp ? __flatbuffers_read_scalar(TK, &(t__tmp->NK)) : 0; }\ -__flatbuffers_define_scan_by_scalar_field(N, NK, T) -#define __flatbuffers_define_struct_struct_field(N, NK, T)\ -static inline T N ## _ ## NK ## _get(N ## _struct_t t__tmp) { return t__tmp ? &(t__tmp->NK) : 0; }\ -static inline T N ## _ ## NK (N ## _struct_t t__tmp) { return t__tmp ? &(t__tmp->NK) : 0; } -/* If fid is null, the function returns true without testing as buffer is not expected to have any id. */ -static inline int flatbuffers_has_identifier(const void *buffer, const char *fid) -{ flatbuffers_thash_t id, id2 = 0; if (fid == 0) { return 1; }; - id2 = flatbuffers_type_hash_from_string(fid); - id = __flatbuffers_thash_read_from_pe(((flatbuffers_uoffset_t *)buffer) + 1); - return id2 == 0 || id == id2; } -static inline int flatbuffers_has_type_hash(const void *buffer, flatbuffers_thash_t thash) -{ return thash == 0 || (__flatbuffers_thash_read_from_pe((flatbuffers_uoffset_t *)buffer + 1) == thash); } - -static inline flatbuffers_thash_t flatbuffers_get_type_hash(const void *buffer) -{ return __flatbuffers_thash_read_from_pe((flatbuffers_uoffset_t *)buffer + 1); } - -#define flatbuffers_verify_endian() flatbuffers_has_identifier("\x00\x00\x00\x00" "1234", "1234") -static inline void *flatbuffers_read_size_prefix(void *b, size_t *size_out) -{ if (size_out) { *size_out = (size_t)__flatbuffers_uoffset_read_from_pe(b); } - return (uint8_t *)b + sizeof(flatbuffers_uoffset_t); } -/* Null file identifier accepts anything, otherwise fid should be 4 characters. */ -#define __flatbuffers_read_root(T, K, buffer, fid)\ - ((!buffer || !flatbuffers_has_identifier(buffer, fid)) ? 0 :\ - ((T ## _ ## K ## t)(((uint8_t *)buffer) +\ - __flatbuffers_uoffset_read_from_pe(buffer)))) -#define __flatbuffers_read_typed_root(T, K, buffer, thash)\ - ((!buffer || !flatbuffers_has_type_hash(buffer, thash)) ? 0 :\ - ((T ## _ ## K ## t)(((uint8_t *)buffer) +\ - __flatbuffers_uoffset_read_from_pe(buffer)))) -#define __flatbuffers_nested_buffer_as_root(C, N, T, K)\ -static inline T ## _ ## K ## t C ## _ ## N ## _as_root_with_identifier(C ## _ ## table_t t__tmp, const char *fid__tmp)\ -{ const uint8_t *buffer__tmp = C ## _ ## N(t__tmp); return __flatbuffers_read_root(T, K, buffer__tmp, fid__tmp); }\ -static inline T ## _ ## K ## t C ## _ ## N ## _as_typed_root(C ## _ ## table_t t__tmp)\ -{ const uint8_t *buffer__tmp = C ## _ ## N(t__tmp); return __flatbuffers_read_root(T, K, buffer__tmp, C ## _ ## type_identifier); }\ -static inline T ## _ ## K ## t C ## _ ## N ## _as_root(C ## _ ## table_t t__tmp)\ -{ const char *fid__tmp = T ## _identifier;\ - const uint8_t *buffer__tmp = C ## _ ## N(t__tmp); return __flatbuffers_read_root(T, K, buffer__tmp, fid__tmp); } -#define __flatbuffers_buffer_as_root(N, K)\ -static inline N ## _ ## K ## t N ## _as_root_with_identifier(const void *buffer__tmp, const char *fid__tmp)\ -{ return __flatbuffers_read_root(N, K, buffer__tmp, fid__tmp); }\ -static inline N ## _ ## K ## t N ## _as_root_with_type_hash(const void *buffer__tmp, flatbuffers_thash_t thash__tmp)\ -{ return __flatbuffers_read_typed_root(N, K, buffer__tmp, thash__tmp); }\ -static inline N ## _ ## K ## t N ## _as_root(const void *buffer__tmp)\ -{ const char *fid__tmp = N ## _identifier;\ - return __flatbuffers_read_root(N, K, buffer__tmp, fid__tmp); }\ -static inline N ## _ ## K ## t N ## _as_typed_root(const void *buffer__tmp)\ -{ return __flatbuffers_read_typed_root(N, K, buffer__tmp, N ## _type_hash); } -#define __flatbuffers_struct_as_root(N) __flatbuffers_buffer_as_root(N, struct_) -#define __flatbuffers_table_as_root(N) __flatbuffers_buffer_as_root(N, table_) - -#include "flatcc/flatcc_epilogue.h" -#endif /* FLATBUFFERS_COMMON_H */ diff --git a/fbs/hyperion_reply_builder.h b/fbs/hyperion_reply_builder.h deleted file mode 100644 index 9e83644..0000000 --- a/fbs/hyperion_reply_builder.h +++ /dev/null @@ -1,58 +0,0 @@ -#ifndef HYPERION_REPLY_BUILDER_H -#define HYPERION_REPLY_BUILDER_H - -/* Generated by flatcc 0.6.0 FlatBuffers schema compiler for C by dvide.com */ - -#ifndef HYPERION_REPLY_READER_H -#include "hyperion_reply_reader.h" -#endif -#ifndef FLATBUFFERS_COMMON_BUILDER_H -#include "flatbuffers_common_builder.h" -#endif -#include "flatcc/flatcc_prologue.h" -#ifndef flatbuffers_identifier -#define flatbuffers_identifier 0 -#endif -#ifndef flatbuffers_extension -#define flatbuffers_extension ".bin" -#endif - -static const flatbuffers_voffset_t __hyperionnet_Reply_required[] = { 0 }; -typedef flatbuffers_ref_t hyperionnet_Reply_ref_t; -static hyperionnet_Reply_ref_t hyperionnet_Reply_clone(flatbuffers_builder_t *B, hyperionnet_Reply_table_t t); -__flatbuffers_build_table(flatbuffers_, hyperionnet_Reply, 3) - -#define __hyperionnet_Reply_formal_args , flatbuffers_string_ref_t v0, int32_t v1, int32_t v2 -#define __hyperionnet_Reply_call_args , v0, v1, v2 -static inline hyperionnet_Reply_ref_t hyperionnet_Reply_create(flatbuffers_builder_t *B __hyperionnet_Reply_formal_args); -__flatbuffers_build_table_prolog(flatbuffers_, hyperionnet_Reply, hyperionnet_Reply_identifier, hyperionnet_Reply_type_identifier) - -__flatbuffers_build_string_field(0, flatbuffers_, hyperionnet_Reply_error, hyperionnet_Reply) -__flatbuffers_build_scalar_field(1, flatbuffers_, hyperionnet_Reply_video, flatbuffers_int32, int32_t, 4, 4, INT32_C(-1), hyperionnet_Reply) -__flatbuffers_build_scalar_field(2, flatbuffers_, hyperionnet_Reply_registered, flatbuffers_int32, int32_t, 4, 4, INT32_C(-1), hyperionnet_Reply) - -static inline hyperionnet_Reply_ref_t hyperionnet_Reply_create(flatbuffers_builder_t *B __hyperionnet_Reply_formal_args) -{ - if (hyperionnet_Reply_start(B) - || hyperionnet_Reply_error_add(B, v0) - || hyperionnet_Reply_video_add(B, v1) - || hyperionnet_Reply_registered_add(B, v2)) { - return 0; - } - return hyperionnet_Reply_end(B); -} - -static hyperionnet_Reply_ref_t hyperionnet_Reply_clone(flatbuffers_builder_t *B, hyperionnet_Reply_table_t t) -{ - __flatbuffers_memoize_begin(B, t); - if (hyperionnet_Reply_start(B) - || hyperionnet_Reply_error_pick(B, t) - || hyperionnet_Reply_video_pick(B, t) - || hyperionnet_Reply_registered_pick(B, t)) { - return 0; - } - __flatbuffers_memoize_end(B, t, hyperionnet_Reply_end(B)); -} - -#include "flatcc/flatcc_epilogue.h" -#endif /* HYPERION_REPLY_BUILDER_H */ diff --git a/fbs/hyperion_reply_reader.h b/fbs/hyperion_reply_reader.h deleted file mode 100644 index 46cb1a1..0000000 --- a/fbs/hyperion_reply_reader.h +++ /dev/null @@ -1,48 +0,0 @@ -#ifndef HYPERION_REPLY_READER_H -#define HYPERION_REPLY_READER_H - -/* Generated by flatcc 0.6.0 FlatBuffers schema compiler for C by dvide.com */ - -#ifndef FLATBUFFERS_COMMON_READER_H -#include "flatbuffers_common_reader.h" -#endif -#include "flatcc/flatcc_flatbuffers.h" -#ifndef __alignas_is_defined -#include -#endif -#include "flatcc/flatcc_prologue.h" -#ifndef flatbuffers_identifier -#define flatbuffers_identifier 0 -#endif -#ifndef flatbuffers_extension -#define flatbuffers_extension ".bin" -#endif - - -typedef const struct hyperionnet_Reply_table *hyperionnet_Reply_table_t; -typedef struct hyperionnet_Reply_table *hyperionnet_Reply_mutable_table_t; -typedef const flatbuffers_uoffset_t *hyperionnet_Reply_vec_t; -typedef flatbuffers_uoffset_t *hyperionnet_Reply_mutable_vec_t; -#ifndef hyperionnet_Reply_identifier -#define hyperionnet_Reply_identifier flatbuffers_identifier -#endif -#define hyperionnet_Reply_type_hash ((flatbuffers_thash_t)0x39df98ba) -#define hyperionnet_Reply_type_identifier "\xba\x98\xdf\x39" - - - -struct hyperionnet_Reply_table { uint8_t unused__; }; - -static inline size_t hyperionnet_Reply_vec_len(hyperionnet_Reply_vec_t vec) -__flatbuffers_vec_len(vec) -static inline hyperionnet_Reply_table_t hyperionnet_Reply_vec_at(hyperionnet_Reply_vec_t vec, size_t i) -__flatbuffers_offset_vec_at(hyperionnet_Reply_table_t, vec, i, 0) -__flatbuffers_table_as_root(hyperionnet_Reply) - -__flatbuffers_define_string_field(0, hyperionnet_Reply, error, 0) -__flatbuffers_define_scalar_field(1, hyperionnet_Reply, video, flatbuffers_int32, int32_t, INT32_C(-1)) -__flatbuffers_define_scalar_field(2, hyperionnet_Reply, registered, flatbuffers_int32, int32_t, INT32_C(-1)) - - -#include "flatcc/flatcc_epilogue.h" -#endif /* HYPERION_REPLY_READER_H */ diff --git a/fbs/hyperion_request_builder.h b/fbs/hyperion_request_builder.h deleted file mode 100644 index 9325590..0000000 --- a/fbs/hyperion_request_builder.h +++ /dev/null @@ -1,273 +0,0 @@ -#ifndef HYPERION_REQUEST_BUILDER_H -#define HYPERION_REQUEST_BUILDER_H - -/* Generated by flatcc 0.6.0 FlatBuffers schema compiler for C by dvide.com */ - -#ifndef HYPERION_REQUEST_READER_H -#include "hyperion_request_reader.h" -#endif -#ifndef FLATBUFFERS_COMMON_BUILDER_H -#include "flatbuffers_common_builder.h" -#endif -#include "flatcc/flatcc_prologue.h" -#ifndef flatbuffers_identifier -#define flatbuffers_identifier 0 -#endif -#ifndef flatbuffers_extension -#define flatbuffers_extension ".bin" -#endif - -typedef flatbuffers_union_ref_t hyperionnet_ImageType_union_ref_t; -typedef flatbuffers_union_vec_ref_t hyperionnet_ImageType_union_vec_ref_t; -static hyperionnet_ImageType_union_ref_t hyperionnet_ImageType_clone(flatbuffers_builder_t *B, hyperionnet_ImageType_union_t t); -typedef flatbuffers_union_ref_t hyperionnet_Command_union_ref_t; -typedef flatbuffers_union_vec_ref_t hyperionnet_Command_union_vec_ref_t; -static hyperionnet_Command_union_ref_t hyperionnet_Command_clone(flatbuffers_builder_t *B, hyperionnet_Command_union_t t); - -static const flatbuffers_voffset_t __hyperionnet_Register_required[] = { 0, 0 }; -typedef flatbuffers_ref_t hyperionnet_Register_ref_t; -static hyperionnet_Register_ref_t hyperionnet_Register_clone(flatbuffers_builder_t *B, hyperionnet_Register_table_t t); -__flatbuffers_build_table(flatbuffers_, hyperionnet_Register, 2) - -static const flatbuffers_voffset_t __hyperionnet_RawImage_required[] = { 0 }; -typedef flatbuffers_ref_t hyperionnet_RawImage_ref_t; -static hyperionnet_RawImage_ref_t hyperionnet_RawImage_clone(flatbuffers_builder_t *B, hyperionnet_RawImage_table_t t); -__flatbuffers_build_table(flatbuffers_, hyperionnet_RawImage, 3) - -static const flatbuffers_voffset_t __hyperionnet_Image_required[] = { 1, 0 }; -typedef flatbuffers_ref_t hyperionnet_Image_ref_t; -static hyperionnet_Image_ref_t hyperionnet_Image_clone(flatbuffers_builder_t *B, hyperionnet_Image_table_t t); -__flatbuffers_build_table(flatbuffers_, hyperionnet_Image, 3) - -static const flatbuffers_voffset_t __hyperionnet_Clear_required[] = { 0 }; -typedef flatbuffers_ref_t hyperionnet_Clear_ref_t; -static hyperionnet_Clear_ref_t hyperionnet_Clear_clone(flatbuffers_builder_t *B, hyperionnet_Clear_table_t t); -__flatbuffers_build_table(flatbuffers_, hyperionnet_Clear, 1) - -static const flatbuffers_voffset_t __hyperionnet_Color_required[] = { 0 }; -typedef flatbuffers_ref_t hyperionnet_Color_ref_t; -static hyperionnet_Color_ref_t hyperionnet_Color_clone(flatbuffers_builder_t *B, hyperionnet_Color_table_t t); -__flatbuffers_build_table(flatbuffers_, hyperionnet_Color, 2) - -static const flatbuffers_voffset_t __hyperionnet_Request_required[] = { 1, 0 }; -typedef flatbuffers_ref_t hyperionnet_Request_ref_t; -static hyperionnet_Request_ref_t hyperionnet_Request_clone(flatbuffers_builder_t *B, hyperionnet_Request_table_t t); -__flatbuffers_build_table(flatbuffers_, hyperionnet_Request, 2) - -#define __hyperionnet_Register_formal_args , flatbuffers_string_ref_t v0, int32_t v1 -#define __hyperionnet_Register_call_args , v0, v1 -static inline hyperionnet_Register_ref_t hyperionnet_Register_create(flatbuffers_builder_t *B __hyperionnet_Register_formal_args); -__flatbuffers_build_table_prolog(flatbuffers_, hyperionnet_Register, hyperionnet_Register_identifier, hyperionnet_Register_type_identifier) - -#define __hyperionnet_RawImage_formal_args , flatbuffers_uint8_vec_ref_t v0, int32_t v1, int32_t v2 -#define __hyperionnet_RawImage_call_args , v0, v1, v2 -static inline hyperionnet_RawImage_ref_t hyperionnet_RawImage_create(flatbuffers_builder_t *B __hyperionnet_RawImage_formal_args); -__flatbuffers_build_table_prolog(flatbuffers_, hyperionnet_RawImage, hyperionnet_RawImage_identifier, hyperionnet_RawImage_type_identifier) - -#define __hyperionnet_Image_formal_args , hyperionnet_ImageType_union_ref_t v1, int32_t v2 -#define __hyperionnet_Image_call_args , v1, v2 -static inline hyperionnet_Image_ref_t hyperionnet_Image_create(flatbuffers_builder_t *B __hyperionnet_Image_formal_args); -__flatbuffers_build_table_prolog(flatbuffers_, hyperionnet_Image, hyperionnet_Image_identifier, hyperionnet_Image_type_identifier) - -#define __hyperionnet_Clear_formal_args , int32_t v0 -#define __hyperionnet_Clear_call_args , v0 -static inline hyperionnet_Clear_ref_t hyperionnet_Clear_create(flatbuffers_builder_t *B __hyperionnet_Clear_formal_args); -__flatbuffers_build_table_prolog(flatbuffers_, hyperionnet_Clear, hyperionnet_Clear_identifier, hyperionnet_Clear_type_identifier) - -#define __hyperionnet_Color_formal_args , int32_t v0, int32_t v1 -#define __hyperionnet_Color_call_args , v0, v1 -static inline hyperionnet_Color_ref_t hyperionnet_Color_create(flatbuffers_builder_t *B __hyperionnet_Color_formal_args); -__flatbuffers_build_table_prolog(flatbuffers_, hyperionnet_Color, hyperionnet_Color_identifier, hyperionnet_Color_type_identifier) - -#define __hyperionnet_Request_formal_args , hyperionnet_Command_union_ref_t v1 -#define __hyperionnet_Request_call_args , v1 -static inline hyperionnet_Request_ref_t hyperionnet_Request_create(flatbuffers_builder_t *B __hyperionnet_Request_formal_args); -__flatbuffers_build_table_prolog(flatbuffers_, hyperionnet_Request, hyperionnet_Request_identifier, hyperionnet_Request_type_identifier) - -static inline hyperionnet_ImageType_union_ref_t hyperionnet_ImageType_as_NONE() -{ hyperionnet_ImageType_union_ref_t uref; uref.type = hyperionnet_ImageType_NONE; uref.value = 0; return uref; } -static inline hyperionnet_ImageType_union_ref_t hyperionnet_ImageType_as_RawImage(hyperionnet_RawImage_ref_t ref) -{ hyperionnet_ImageType_union_ref_t uref; uref.type = hyperionnet_ImageType_RawImage; uref.value = ref; return uref; } -__flatbuffers_build_union_vector(flatbuffers_, hyperionnet_ImageType) - -static hyperionnet_ImageType_union_ref_t hyperionnet_ImageType_clone(flatbuffers_builder_t *B, hyperionnet_ImageType_union_t u) -{ - switch (u.type) { - case 1: return hyperionnet_ImageType_as_RawImage(hyperionnet_RawImage_clone(B, (hyperionnet_RawImage_table_t)u.value)); - default: return hyperionnet_ImageType_as_NONE(); - } -} - -static inline hyperionnet_Command_union_ref_t hyperionnet_Command_as_NONE() -{ hyperionnet_Command_union_ref_t uref; uref.type = hyperionnet_Command_NONE; uref.value = 0; return uref; } -static inline hyperionnet_Command_union_ref_t hyperionnet_Command_as_Color(hyperionnet_Color_ref_t ref) -{ hyperionnet_Command_union_ref_t uref; uref.type = hyperionnet_Command_Color; uref.value = ref; return uref; } -static inline hyperionnet_Command_union_ref_t hyperionnet_Command_as_Image(hyperionnet_Image_ref_t ref) -{ hyperionnet_Command_union_ref_t uref; uref.type = hyperionnet_Command_Image; uref.value = ref; return uref; } -static inline hyperionnet_Command_union_ref_t hyperionnet_Command_as_Clear(hyperionnet_Clear_ref_t ref) -{ hyperionnet_Command_union_ref_t uref; uref.type = hyperionnet_Command_Clear; uref.value = ref; return uref; } -static inline hyperionnet_Command_union_ref_t hyperionnet_Command_as_Register(hyperionnet_Register_ref_t ref) -{ hyperionnet_Command_union_ref_t uref; uref.type = hyperionnet_Command_Register; uref.value = ref; return uref; } -__flatbuffers_build_union_vector(flatbuffers_, hyperionnet_Command) - -static hyperionnet_Command_union_ref_t hyperionnet_Command_clone(flatbuffers_builder_t *B, hyperionnet_Command_union_t u) -{ - switch (u.type) { - case 1: return hyperionnet_Command_as_Color(hyperionnet_Color_clone(B, (hyperionnet_Color_table_t)u.value)); - case 2: return hyperionnet_Command_as_Image(hyperionnet_Image_clone(B, (hyperionnet_Image_table_t)u.value)); - case 3: return hyperionnet_Command_as_Clear(hyperionnet_Clear_clone(B, (hyperionnet_Clear_table_t)u.value)); - case 4: return hyperionnet_Command_as_Register(hyperionnet_Register_clone(B, (hyperionnet_Register_table_t)u.value)); - default: return hyperionnet_Command_as_NONE(); - } -} - -__flatbuffers_build_string_field(0, flatbuffers_, hyperionnet_Register_origin, hyperionnet_Register) -__flatbuffers_build_scalar_field(1, flatbuffers_, hyperionnet_Register_priority, flatbuffers_int32, int32_t, 4, 4, INT32_C(0), hyperionnet_Register) - -static inline hyperionnet_Register_ref_t hyperionnet_Register_create(flatbuffers_builder_t *B __hyperionnet_Register_formal_args) -{ - if (hyperionnet_Register_start(B) - || hyperionnet_Register_origin_add(B, v0) - || hyperionnet_Register_priority_add(B, v1)) { - return 0; - } - return hyperionnet_Register_end(B); -} - -static hyperionnet_Register_ref_t hyperionnet_Register_clone(flatbuffers_builder_t *B, hyperionnet_Register_table_t t) -{ - __flatbuffers_memoize_begin(B, t); - if (hyperionnet_Register_start(B) - || hyperionnet_Register_origin_pick(B, t) - || hyperionnet_Register_priority_pick(B, t)) { - return 0; - } - __flatbuffers_memoize_end(B, t, hyperionnet_Register_end(B)); -} - -__flatbuffers_build_vector_field(0, flatbuffers_, hyperionnet_RawImage_data, flatbuffers_uint8, uint8_t, hyperionnet_RawImage) -__flatbuffers_build_scalar_field(1, flatbuffers_, hyperionnet_RawImage_width, flatbuffers_int32, int32_t, 4, 4, INT32_C(-1), hyperionnet_RawImage) -__flatbuffers_build_scalar_field(2, flatbuffers_, hyperionnet_RawImage_height, flatbuffers_int32, int32_t, 4, 4, INT32_C(-1), hyperionnet_RawImage) - -static inline hyperionnet_RawImage_ref_t hyperionnet_RawImage_create(flatbuffers_builder_t *B __hyperionnet_RawImage_formal_args) -{ - if (hyperionnet_RawImage_start(B) - || hyperionnet_RawImage_data_add(B, v0) - || hyperionnet_RawImage_width_add(B, v1) - || hyperionnet_RawImage_height_add(B, v2)) { - return 0; - } - return hyperionnet_RawImage_end(B); -} - -static hyperionnet_RawImage_ref_t hyperionnet_RawImage_clone(flatbuffers_builder_t *B, hyperionnet_RawImage_table_t t) -{ - __flatbuffers_memoize_begin(B, t); - if (hyperionnet_RawImage_start(B) - || hyperionnet_RawImage_data_pick(B, t) - || hyperionnet_RawImage_width_pick(B, t) - || hyperionnet_RawImage_height_pick(B, t)) { - return 0; - } - __flatbuffers_memoize_end(B, t, hyperionnet_RawImage_end(B)); -} - -__flatbuffers_build_union_field(1, flatbuffers_, hyperionnet_Image_data, hyperionnet_ImageType, hyperionnet_Image) -__flatbuffers_build_union_table_value_field(flatbuffers_, hyperionnet_Image_data, hyperionnet_ImageType, RawImage, hyperionnet_RawImage) -__flatbuffers_build_scalar_field(2, flatbuffers_, hyperionnet_Image_duration, flatbuffers_int32, int32_t, 4, 4, INT32_C(-1), hyperionnet_Image) - -static inline hyperionnet_Image_ref_t hyperionnet_Image_create(flatbuffers_builder_t *B __hyperionnet_Image_formal_args) -{ - if (hyperionnet_Image_start(B) - || hyperionnet_Image_data_add_value(B, v1) - || hyperionnet_Image_duration_add(B, v2) - || hyperionnet_Image_data_add_type(B, v1.type)) { - return 0; - } - return hyperionnet_Image_end(B); -} - -static hyperionnet_Image_ref_t hyperionnet_Image_clone(flatbuffers_builder_t *B, hyperionnet_Image_table_t t) -{ - __flatbuffers_memoize_begin(B, t); - if (hyperionnet_Image_start(B) - || hyperionnet_Image_data_pick(B, t) - || hyperionnet_Image_duration_pick(B, t)) { - return 0; - } - __flatbuffers_memoize_end(B, t, hyperionnet_Image_end(B)); -} - -__flatbuffers_build_scalar_field(0, flatbuffers_, hyperionnet_Clear_priority, flatbuffers_int32, int32_t, 4, 4, INT32_C(0), hyperionnet_Clear) - -static inline hyperionnet_Clear_ref_t hyperionnet_Clear_create(flatbuffers_builder_t *B __hyperionnet_Clear_formal_args) -{ - if (hyperionnet_Clear_start(B) - || hyperionnet_Clear_priority_add(B, v0)) { - return 0; - } - return hyperionnet_Clear_end(B); -} - -static hyperionnet_Clear_ref_t hyperionnet_Clear_clone(flatbuffers_builder_t *B, hyperionnet_Clear_table_t t) -{ - __flatbuffers_memoize_begin(B, t); - if (hyperionnet_Clear_start(B) - || hyperionnet_Clear_priority_pick(B, t)) { - return 0; - } - __flatbuffers_memoize_end(B, t, hyperionnet_Clear_end(B)); -} - -__flatbuffers_build_scalar_field(0, flatbuffers_, hyperionnet_Color_data, flatbuffers_int32, int32_t, 4, 4, INT32_C(-1), hyperionnet_Color) -__flatbuffers_build_scalar_field(1, flatbuffers_, hyperionnet_Color_duration, flatbuffers_int32, int32_t, 4, 4, INT32_C(-1), hyperionnet_Color) - -static inline hyperionnet_Color_ref_t hyperionnet_Color_create(flatbuffers_builder_t *B __hyperionnet_Color_formal_args) -{ - if (hyperionnet_Color_start(B) - || hyperionnet_Color_data_add(B, v0) - || hyperionnet_Color_duration_add(B, v1)) { - return 0; - } - return hyperionnet_Color_end(B); -} - -static hyperionnet_Color_ref_t hyperionnet_Color_clone(flatbuffers_builder_t *B, hyperionnet_Color_table_t t) -{ - __flatbuffers_memoize_begin(B, t); - if (hyperionnet_Color_start(B) - || hyperionnet_Color_data_pick(B, t) - || hyperionnet_Color_duration_pick(B, t)) { - return 0; - } - __flatbuffers_memoize_end(B, t, hyperionnet_Color_end(B)); -} - -__flatbuffers_build_union_field(1, flatbuffers_, hyperionnet_Request_command, hyperionnet_Command, hyperionnet_Request) -__flatbuffers_build_union_table_value_field(flatbuffers_, hyperionnet_Request_command, hyperionnet_Command, Color, hyperionnet_Color) -__flatbuffers_build_union_table_value_field(flatbuffers_, hyperionnet_Request_command, hyperionnet_Command, Image, hyperionnet_Image) -__flatbuffers_build_union_table_value_field(flatbuffers_, hyperionnet_Request_command, hyperionnet_Command, Clear, hyperionnet_Clear) -__flatbuffers_build_union_table_value_field(flatbuffers_, hyperionnet_Request_command, hyperionnet_Command, Register, hyperionnet_Register) - -static inline hyperionnet_Request_ref_t hyperionnet_Request_create(flatbuffers_builder_t *B __hyperionnet_Request_formal_args) -{ - if (hyperionnet_Request_start(B) - || hyperionnet_Request_command_add_value(B, v1) - || hyperionnet_Request_command_add_type(B, v1.type)) { - return 0; - } - return hyperionnet_Request_end(B); -} - -static hyperionnet_Request_ref_t hyperionnet_Request_clone(flatbuffers_builder_t *B, hyperionnet_Request_table_t t) -{ - __flatbuffers_memoize_begin(B, t); - if (hyperionnet_Request_start(B) - || hyperionnet_Request_command_pick(B, t)) { - return 0; - } - __flatbuffers_memoize_end(B, t, hyperionnet_Request_end(B)); -} - -#include "flatcc/flatcc_epilogue.h" -#endif /* HYPERION_REQUEST_BUILDER_H */ diff --git a/fbs/hyperion_request_reader.h b/fbs/hyperion_request_reader.h deleted file mode 100644 index bc51aa4..0000000 --- a/fbs/hyperion_request_reader.h +++ /dev/null @@ -1,203 +0,0 @@ -#ifndef HYPERION_REQUEST_READER_H -#define HYPERION_REQUEST_READER_H - -/* Generated by flatcc 0.6.0 FlatBuffers schema compiler for C by dvide.com */ - -#ifndef FLATBUFFERS_COMMON_READER_H -#include "flatbuffers_common_reader.h" -#endif -#include "flatcc/flatcc_flatbuffers.h" -#ifndef __alignas_is_defined -#include -#endif -#include "flatcc/flatcc_prologue.h" -#ifndef flatbuffers_identifier -#define flatbuffers_identifier 0 -#endif -#ifndef flatbuffers_extension -#define flatbuffers_extension ".bin" -#endif - - -typedef const struct hyperionnet_Register_table *hyperionnet_Register_table_t; -typedef struct hyperionnet_Register_table *hyperionnet_Register_mutable_table_t; -typedef const flatbuffers_uoffset_t *hyperionnet_Register_vec_t; -typedef flatbuffers_uoffset_t *hyperionnet_Register_mutable_vec_t; -typedef const struct hyperionnet_RawImage_table *hyperionnet_RawImage_table_t; -typedef struct hyperionnet_RawImage_table *hyperionnet_RawImage_mutable_table_t; -typedef const flatbuffers_uoffset_t *hyperionnet_RawImage_vec_t; -typedef flatbuffers_uoffset_t *hyperionnet_RawImage_mutable_vec_t; -typedef const struct hyperionnet_Image_table *hyperionnet_Image_table_t; -typedef struct hyperionnet_Image_table *hyperionnet_Image_mutable_table_t; -typedef const flatbuffers_uoffset_t *hyperionnet_Image_vec_t; -typedef flatbuffers_uoffset_t *hyperionnet_Image_mutable_vec_t; -typedef const struct hyperionnet_Clear_table *hyperionnet_Clear_table_t; -typedef struct hyperionnet_Clear_table *hyperionnet_Clear_mutable_table_t; -typedef const flatbuffers_uoffset_t *hyperionnet_Clear_vec_t; -typedef flatbuffers_uoffset_t *hyperionnet_Clear_mutable_vec_t; -typedef const struct hyperionnet_Color_table *hyperionnet_Color_table_t; -typedef struct hyperionnet_Color_table *hyperionnet_Color_mutable_table_t; -typedef const flatbuffers_uoffset_t *hyperionnet_Color_vec_t; -typedef flatbuffers_uoffset_t *hyperionnet_Color_mutable_vec_t; -typedef const struct hyperionnet_Request_table *hyperionnet_Request_table_t; -typedef struct hyperionnet_Request_table *hyperionnet_Request_mutable_table_t; -typedef const flatbuffers_uoffset_t *hyperionnet_Request_vec_t; -typedef flatbuffers_uoffset_t *hyperionnet_Request_mutable_vec_t; -#ifndef hyperionnet_Register_identifier -#define hyperionnet_Register_identifier flatbuffers_identifier -#endif -#define hyperionnet_Register_type_hash ((flatbuffers_thash_t)0x7c76c8af) -#define hyperionnet_Register_type_identifier "\xaf\xc8\x76\x7c" -#ifndef hyperionnet_RawImage_identifier -#define hyperionnet_RawImage_identifier flatbuffers_identifier -#endif -#define hyperionnet_RawImage_type_hash ((flatbuffers_thash_t)0xe4f6f14d) -#define hyperionnet_RawImage_type_identifier "\x4d\xf1\xf6\xe4" -#ifndef hyperionnet_Image_identifier -#define hyperionnet_Image_identifier flatbuffers_identifier -#endif -#define hyperionnet_Image_type_hash ((flatbuffers_thash_t)0x947b2cb) -#define hyperionnet_Image_type_identifier "\xcb\xb2\x47\x09" -#ifndef hyperionnet_Clear_identifier -#define hyperionnet_Clear_identifier flatbuffers_identifier -#endif -#define hyperionnet_Clear_type_hash ((flatbuffers_thash_t)0x2ef9ebb7) -#define hyperionnet_Clear_type_identifier "\xb7\xeb\xf9\x2e" -#ifndef hyperionnet_Color_identifier -#define hyperionnet_Color_identifier flatbuffers_identifier -#endif -#define hyperionnet_Color_type_hash ((flatbuffers_thash_t)0x30986e49) -#define hyperionnet_Color_type_identifier "\x49\x6e\x98\x30" -#ifndef hyperionnet_Request_identifier -#define hyperionnet_Request_identifier flatbuffers_identifier -#endif -#define hyperionnet_Request_type_hash ((flatbuffers_thash_t)0x5aeb78cb) -#define hyperionnet_Request_type_identifier "\xcb\x78\xeb\x5a" - - - -struct hyperionnet_Register_table { uint8_t unused__; }; - -static inline size_t hyperionnet_Register_vec_len(hyperionnet_Register_vec_t vec) -__flatbuffers_vec_len(vec) -static inline hyperionnet_Register_table_t hyperionnet_Register_vec_at(hyperionnet_Register_vec_t vec, size_t i) -__flatbuffers_offset_vec_at(hyperionnet_Register_table_t, vec, i, 0) -__flatbuffers_table_as_root(hyperionnet_Register) - -__flatbuffers_define_string_field(0, hyperionnet_Register, origin, 1) -__flatbuffers_define_scalar_field(1, hyperionnet_Register, priority, flatbuffers_int32, int32_t, INT32_C(0)) - -struct hyperionnet_RawImage_table { uint8_t unused__; }; - -static inline size_t hyperionnet_RawImage_vec_len(hyperionnet_RawImage_vec_t vec) -__flatbuffers_vec_len(vec) -static inline hyperionnet_RawImage_table_t hyperionnet_RawImage_vec_at(hyperionnet_RawImage_vec_t vec, size_t i) -__flatbuffers_offset_vec_at(hyperionnet_RawImage_table_t, vec, i, 0) -__flatbuffers_table_as_root(hyperionnet_RawImage) - -__flatbuffers_define_vector_field(0, hyperionnet_RawImage, data, flatbuffers_uint8_vec_t, 0) -__flatbuffers_define_scalar_field(1, hyperionnet_RawImage, width, flatbuffers_int32, int32_t, INT32_C(-1)) -__flatbuffers_define_scalar_field(2, hyperionnet_RawImage, height, flatbuffers_int32, int32_t, INT32_C(-1)) -typedef uint8_t hyperionnet_ImageType_union_type_t; -__flatbuffers_define_integer_type(hyperionnet_ImageType, hyperionnet_ImageType_union_type_t, 8) -__flatbuffers_define_union(flatbuffers_, hyperionnet_ImageType) -#define hyperionnet_ImageType_NONE ((hyperionnet_ImageType_union_type_t)UINT8_C(0)) -#define hyperionnet_ImageType_RawImage ((hyperionnet_ImageType_union_type_t)UINT8_C(1)) - -static inline const char *hyperionnet_ImageType_type_name(hyperionnet_ImageType_union_type_t type) -{ - switch (type) { - case hyperionnet_ImageType_NONE: return "NONE"; - case hyperionnet_ImageType_RawImage: return "RawImage"; - default: return ""; - } -} - -static inline int hyperionnet_ImageType_is_known_type(hyperionnet_ImageType_union_type_t type) -{ - switch (type) { - case hyperionnet_ImageType_NONE: return 1; - case hyperionnet_ImageType_RawImage: return 1; - default: return 0; - } -} - - -struct hyperionnet_Image_table { uint8_t unused__; }; - -static inline size_t hyperionnet_Image_vec_len(hyperionnet_Image_vec_t vec) -__flatbuffers_vec_len(vec) -static inline hyperionnet_Image_table_t hyperionnet_Image_vec_at(hyperionnet_Image_vec_t vec, size_t i) -__flatbuffers_offset_vec_at(hyperionnet_Image_table_t, vec, i, 0) -__flatbuffers_table_as_root(hyperionnet_Image) - -__flatbuffers_define_union_field(flatbuffers_, 1, hyperionnet_Image, data, hyperionnet_ImageType, 1) -__flatbuffers_define_scalar_field(2, hyperionnet_Image, duration, flatbuffers_int32, int32_t, INT32_C(-1)) - -struct hyperionnet_Clear_table { uint8_t unused__; }; - -static inline size_t hyperionnet_Clear_vec_len(hyperionnet_Clear_vec_t vec) -__flatbuffers_vec_len(vec) -static inline hyperionnet_Clear_table_t hyperionnet_Clear_vec_at(hyperionnet_Clear_vec_t vec, size_t i) -__flatbuffers_offset_vec_at(hyperionnet_Clear_table_t, vec, i, 0) -__flatbuffers_table_as_root(hyperionnet_Clear) - -__flatbuffers_define_scalar_field(0, hyperionnet_Clear, priority, flatbuffers_int32, int32_t, INT32_C(0)) - -struct hyperionnet_Color_table { uint8_t unused__; }; - -static inline size_t hyperionnet_Color_vec_len(hyperionnet_Color_vec_t vec) -__flatbuffers_vec_len(vec) -static inline hyperionnet_Color_table_t hyperionnet_Color_vec_at(hyperionnet_Color_vec_t vec, size_t i) -__flatbuffers_offset_vec_at(hyperionnet_Color_table_t, vec, i, 0) -__flatbuffers_table_as_root(hyperionnet_Color) - -__flatbuffers_define_scalar_field(0, hyperionnet_Color, data, flatbuffers_int32, int32_t, INT32_C(-1)) -__flatbuffers_define_scalar_field(1, hyperionnet_Color, duration, flatbuffers_int32, int32_t, INT32_C(-1)) -typedef uint8_t hyperionnet_Command_union_type_t; -__flatbuffers_define_integer_type(hyperionnet_Command, hyperionnet_Command_union_type_t, 8) -__flatbuffers_define_union(flatbuffers_, hyperionnet_Command) -#define hyperionnet_Command_NONE ((hyperionnet_Command_union_type_t)UINT8_C(0)) -#define hyperionnet_Command_Color ((hyperionnet_Command_union_type_t)UINT8_C(1)) -#define hyperionnet_Command_Image ((hyperionnet_Command_union_type_t)UINT8_C(2)) -#define hyperionnet_Command_Clear ((hyperionnet_Command_union_type_t)UINT8_C(3)) -#define hyperionnet_Command_Register ((hyperionnet_Command_union_type_t)UINT8_C(4)) - -static inline const char *hyperionnet_Command_type_name(hyperionnet_Command_union_type_t type) -{ - switch (type) { - case hyperionnet_Command_NONE: return "NONE"; - case hyperionnet_Command_Color: return "Color"; - case hyperionnet_Command_Image: return "Image"; - case hyperionnet_Command_Clear: return "Clear"; - case hyperionnet_Command_Register: return "Register"; - default: return ""; - } -} - -static inline int hyperionnet_Command_is_known_type(hyperionnet_Command_union_type_t type) -{ - switch (type) { - case hyperionnet_Command_NONE: return 1; - case hyperionnet_Command_Color: return 1; - case hyperionnet_Command_Image: return 1; - case hyperionnet_Command_Clear: return 1; - case hyperionnet_Command_Register: return 1; - default: return 0; - } -} - - -struct hyperionnet_Request_table { uint8_t unused__; }; - -static inline size_t hyperionnet_Request_vec_len(hyperionnet_Request_vec_t vec) -__flatbuffers_vec_len(vec) -static inline hyperionnet_Request_table_t hyperionnet_Request_vec_at(hyperionnet_Request_vec_t vec, size_t i) -__flatbuffers_offset_vec_at(hyperionnet_Request_table_t, vec, i, 0) -__flatbuffers_table_as_root(hyperionnet_Request) - -__flatbuffers_define_union_field(flatbuffers_, 1, hyperionnet_Request, command, hyperionnet_Command, 1) - - -#include "flatcc/flatcc_epilogue.h" -#endif /* HYPERION_REQUEST_READER_H */ diff --git a/flatccrt/.gitignore b/flatccrt/.gitignore deleted file mode 100644 index 284aaaf..0000000 --- a/flatccrt/.gitignore +++ /dev/null @@ -1 +0,0 @@ -!**.a \ No newline at end of file diff --git a/flatccrt/CMakeLists.txt b/flatccrt/CMakeLists.txt deleted file mode 100644 index 34d5209..0000000 --- a/flatccrt/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ -add_library(flatccrt STATIC IMPORTED GLOBAL) -set_target_properties(flatccrt PROPERTIES - IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/lib/libflatccrt.a -) -set_target_properties(flatccrt PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR}/include) diff --git a/flatccrt/include/flatcc/flatcc.h b/flatccrt/include/flatcc/flatcc.h deleted file mode 100644 index 5003735..0000000 --- a/flatccrt/include/flatcc/flatcc.h +++ /dev/null @@ -1,266 +0,0 @@ -#ifndef FLATCC_H -#define FLATCC_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * This is the primary `flatcc` interface when compiling `flatcc` as a - * library. Functions and types in the this interface will be kept - * stable to the extend possible or reasonable, but do not rely on other - * interfaces except "config.h" used to set default options for this - * interface. - * - * This interface is unrelated to the standalone flatbuilder library - * which has a life of its own. - */ - -#ifndef UINT8_MAX -#include -#endif - -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable: 4820) /* x bytes padding added in struct */ -#endif - -typedef struct flatcc_options flatcc_options_t; -typedef void (*flatcc_error_fun) (void *err_ctx, const char *buf, int len); - -struct flatcc_options { - size_t max_schema_size; - int max_include_depth; - int max_include_count; - int disable_includes; - int allow_boolean_conversion; - int allow_enum_key; - int allow_enum_struct_field; - int allow_multiple_key_fields; - int allow_primary_key; - int allow_scan_for_all_fields; - int allow_string_key; - int allow_struct_field_deprecate; - int allow_struct_field_key; - int allow_struct_root; - int ascending_enum; - int hide_later_enum; - int hide_later_struct; - int offset_size; - int voffset_size; - int utype_size; - int bool_size; - int require_root_type; - int strict_enum_init; - uint64_t vt_max_count; - - const char *default_schema_ext; - const char *default_bin_schema_ext; - const char *default_bin_ext; - - /* Code Generator specific options. */ - int gen_stdout; - int gen_dep; - - const char *gen_depfile; - const char *gen_deptarget; - const char *gen_outfile; - - int gen_append; - - int cgen_pad; - int cgen_sort; - int cgen_pragmas; - - int cgen_common_reader; - int cgen_common_builder; - int cgen_reader; - int cgen_builder; - int cgen_verifier; - int cgen_json_parser; - int cgen_json_printer; - int cgen_recursive; - int cgen_spacing; - int cgen_no_conflicts; - - - int bgen_bfbs; - int bgen_qualify_names; - int bgen_length_prefix; - - /* Namespace args - these can override defaults so are null by default. */ - const char *ns; - const char *nsc; - - const char **inpaths; - const char **srcpaths; - int inpath_count; - int srcpath_count; - const char *outpath; -}; - -/* Runtime configurable optoins. */ -void flatcc_init_options(flatcc_options_t *opts); - -typedef void *flatcc_context_t; - -/* - * Call functions below in order listed one at a time. - * Each parse requires a new context. - * - * A reader file is named after the source base name, e.g. - * `monster.fbs` becomes `monster.h`. Builders are optional and created - * as `monster_builder.h`. A reader require a common header - * `flatbuffers_commoner.h` and a builder requires - * `flatbuffers_common_builder.h` in addition to the reader filers. A - * reader need no other source, but builders must link with the - * `flatbuilder` library and include files in `include/flatbuffers`. - * - * All the files may also be concatenated into one single file and then - * files will not be attempted included externally. This can be used - * with stdout output. The common builder can follow the common - * reader immediately, or at any later point before the first builder. - * The common files should only be included once, but not harm is done - * if duplication occurs. - * - * The outpath is prefixed every output filename. The containing - * directory must exist, but the prefix may have text following - * the directory, for example the namespace. If outpath = "stdout", - * files are generated to stdout. - * - * Note that const char * options must remain valid for the lifetime - * of the context since they are not copied. The options object itself - * is not used after initialization and may be reused. -*/ - -/* - * `name` is the name of the schema file or buffer. If it is path, the - * basename is extracted (leading path stripped), and the default schema - * extension is stripped if present. The resulting name is used - * internally when generating output files. Typically the `name` - * argument will be the same as a schema file path given to - * `flatcc_parse_file`, but it does not have to be. - * - * `name` may be null if only common files are generated. - * - * `error_out` is an optional error handler. If null output is truncated - * to a reasonable size and sent to stderr. `error_ctx` is provided as - * first argument to `error_out` if `error_out` is non-zero, otherwise - * it is ignored. - * - * Returns context or null on error. - */ -flatcc_context_t flatcc_create_context(flatcc_options_t *options, const char *name, - flatcc_error_fun error_out, void *error_ctx); - -/* Like `flatcc_create_context`, but with length argument for name. */ -/* - * Parse is optional - not needed for common files. If the input buffer version - * is called, the buffer must be zero terminated, otherwise an input - * path can be specified. The output path can be null. - * - * Only one parse can be called per context. - * - * The buffer size is limited to the max_schema_size option unless it is - * 0. The default is reasonable size like 64K depending on config flags. - * - * The buffer must remain valid for the duration of the context. - * - * The schema cannot contain include statements when parsed as a buffer. - * - * Returns 0 on success. - */ -int flatcc_parse_buffer(flatcc_context_t ctx, const char *buf, size_t buflen); - -/* - * If options contain a non-zero `inpath` option, the resulting filename is - * prefixed with that path unless the filename is an absolute path. - * - * Errors are sent to the error handler given during initialization, - * or to stderr. - * - * The file size is limited to the max_schema_size option unless it is - * 0. The default is reasonable size like 64K depending on config flags. - * - * Returns 0 on success. - */ -int flatcc_parse_file(flatcc_context_t ctx, const char *filename); - -/* - * Generate output files. The basename derived when the context was - * created is used used to name the output files with respective - * extensions. If the outpath option is not null it is prefixed the - * output files. The `cgen_common_reader, cgen_common_builder, - * cgen_reader, and cgen_builder` must be set or reset depending on what - * is to be generated. The common files do not require a parse, and the - * non-common files require a successfull parse or the result is - * undefined. - * - * Unlinke the parser, the code generator produce errors to stderr - * always. These errors are rare, such as using too long namespace - * names. - * - * If the `gen_stdout` option is set, all files are generated to stdout. - * In this case it is unwise to mix C and binary schema output options. - * - * If `bgen_bfbs` is set, a binary schema is generated to a file with - * the `.bfbs` extension. See also `flatcc_generate_binary_schema` for - * further details. Only `flatcc_generate_files` is called via the - * `flatcc` cli command. - * - * The option `bgen_length_prefix` option will cause a length prefix to be - * written to the each output binary schema. This option is only - * understood when writing to files. - * - * Returns 0 on success. - */ -int flatcc_generate_files(flatcc_context_t ctx); - -/* - * Returns a buffer with a binary schema for a previous parse. - * The user is responsible for calling `free` on the returned buffer - * unless it returns 0 on error. - * - * Can be called instead of generate files, before, or after, but a - * schema must be parsed first. - * - * Returns a binary schema in `reflection.fbs` format. Any included - * files will be contained in the schema and there are no separate - * schema files for included schema. - * - * All type names are scoped, mening that they are refixed their - * namespace using `.` as the namespace separator, for example: - * "MyGame.Example.Monster". Note that the this differs from the current - * `flatc` compiler which does not prefix names. Enum names are not - * scoped, but the scope is implied by the containing enum type. - * The option `bgen_qualify_names=0` changes this behavior. - * - * If the default option `ascending_enum` is disabled, the `flatcc` will - * accept duplicate values and overlapping ranges like the C programming - * language. In this case enum values in the binary schema will not be - * searchable. At any rate enum names are not searchable in the current - * schema format. - * - */ -void *flatcc_generate_binary_schema(flatcc_context_t ctx, size_t *size); - -/* - * Similar to `flatcc_generate_binary_schema` but copies the binary - * schema into a user supplied buffer. If the buffer is too small - * the return value will be negative and the buffer content undefined. - */ -int flatcc_generate_binary_schema_to_buffer(flatcc_context_t ctx, void *buf, size_t bufsiz); - -/* Must be called to deallocate resources eventually - it valid but - * without effect to call with a null context. */ -void flatcc_destroy_context(flatcc_context_t ctx); - -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* FLATCC_H */ diff --git a/flatccrt/include/flatcc/flatcc_accessors.h b/flatccrt/include/flatcc/flatcc_accessors.h deleted file mode 100644 index 8478579..0000000 --- a/flatccrt/include/flatcc/flatcc_accessors.h +++ /dev/null @@ -1,98 +0,0 @@ -#ifndef FLATCC_ACCESSORS -#define FLATCC_ACCESSORS - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef UINT8_MAX -#include -#endif - -#define __flatcc_basic_scalar_accessors_impl(N, T, W, E) \ -static inline size_t N ## __size(void) \ -{ return sizeof(T); } \ -static inline T *N ## __ptr_add(T *p, size_t i) \ -{ return p + i; } \ -static inline const T *N ## __const_ptr_add(const T *p, size_t i) \ -{ return p + i; } \ -static inline T N ## _read_from_pe(const void *p) \ -{ return N ## _cast_from_pe(*(T *)p); } \ -static inline T N ## _read_to_pe(const void *p) \ -{ return N ## _cast_to_pe(*(T *)p); } \ -static inline T N ## _read(const void *p) \ -{ return *(T *)p; } \ -static inline void N ## _write_from_pe(void *p, T v) \ -{ *(T *)p = N ## _cast_from_pe(v); } \ -static inline void N ## _write_to_pe(void *p, T v) \ -{ *(T *)p = N ## _cast_to_pe(v); } \ -static inline void N ## _write(void *p, T v) \ -{ *(T *)p = v; } - -#define __flatcc_define_integer_accessors_impl(N, T, W, E) \ -static inline T N ## _cast_from_pe(T v) \ -{ return (T) E ## W ## toh((uint ## W ## _t)v); } \ -static inline T N ## _cast_to_pe(T v) \ -{ return (T) hto ## E ## W((uint ## W ## _t)v); } \ -static inline T N ## _cast_from_le(T v) \ -{ return (T) le ## W ## toh((uint ## W ## _t)v); } \ -static inline T N ## _cast_to_le(T v) \ -{ return (T) htole ## W((uint ## W ## _t)v); } \ -static inline T N ## _cast_from_be(T v) \ -{ return (T) be ## W ## toh((uint ## W ## _t)v); } \ -static inline T N ## _cast_to_be(T v) \ -{ return (T) htobe ## W((uint ## W ## _t)v); } \ -__flatcc_basic_scalar_accessors_impl(N, T, W, E) - -#define __flatcc_define_real_accessors_impl(N, T, W, E) \ -union __ ## N ## _cast { T v; uint ## W ## _t u; }; \ -static inline T N ## _cast_from_pe(T v) \ -{ union __ ## N ## _cast x; \ - x.v = v; x.u = E ## W ## toh(x.u); return x.v; } \ -static inline T N ## _cast_to_pe(T v) \ -{ union __ ## N ## _cast x; \ - x.v = v; x.u = hto ## E ## W(x.u); return x.v; } \ -static inline T N ## _cast_from_le(T v) \ -{ union __ ## N ## _cast x; \ - x.v = v; x.u = le ## W ## toh(x.u); return x.v; } \ -static inline T N ## _cast_to_le(T v) \ -{ union __ ## N ## _cast x; \ - x.v = v; x.u = htole ## W(x.u); return x.v; } \ -static inline T N ## _cast_from_be(T v) \ -{ union __ ## N ## _cast x; \ - x.v = v; x.u = be ## W ## toh(x.u); return x.v; } \ -static inline T N ## _cast_to_be(T v) \ -{ union __ ## N ## _cast x; \ - x.v = v; x.u = htobe ## W(x.u); return x.v; } \ -__flatcc_basic_scalar_accessors_impl(N, T, W, E) - -#define __flatcc_define_integer_accessors(N, T, W, E) \ -__flatcc_define_integer_accessors_impl(N, T, W, E) - -#define __flatcc_define_real_accessors(N, T, W, E) \ -__flatcc_define_real_accessors_impl(N, T, W, E) - -#define __flatcc_define_basic_integer_accessors(NS, TN, T, W, E) \ -__flatcc_define_integer_accessors(NS ## TN, T, W, E) - -#define __flatcc_define_basic_real_accessors(NS, TN, T, W, E) \ -__flatcc_define_real_accessors(NS ## TN, T, W, E) - -#define __flatcc_define_basic_scalar_accessors(NS, E) \ -__flatcc_define_basic_integer_accessors(NS, char, char, 8, E) \ -__flatcc_define_basic_integer_accessors(NS, uint8, uint8_t, 8, E) \ -__flatcc_define_basic_integer_accessors(NS, uint16, uint16_t, 16, E) \ -__flatcc_define_basic_integer_accessors(NS, uint32, uint32_t, 32, E) \ -__flatcc_define_basic_integer_accessors(NS, uint64, uint64_t, 64, E) \ -__flatcc_define_basic_integer_accessors(NS, int8, int8_t, 8, E) \ -__flatcc_define_basic_integer_accessors(NS, int16, int16_t, 16, E) \ -__flatcc_define_basic_integer_accessors(NS, int32, int32_t, 32, E) \ -__flatcc_define_basic_integer_accessors(NS, int64, int64_t, 64, E) \ -__flatcc_define_basic_real_accessors(NS, float, float, 32, E) \ -__flatcc_define_basic_real_accessors(NS, double, double, 64, E) - -#ifdef __cplusplus -} -#endif - -#endif /* FLATCC_ACCESSORS */ diff --git a/flatccrt/include/flatcc/flatcc_alloc.h b/flatccrt/include/flatcc/flatcc_alloc.h deleted file mode 100644 index 155364c..0000000 --- a/flatccrt/include/flatcc/flatcc_alloc.h +++ /dev/null @@ -1,127 +0,0 @@ -#ifndef FLATCC_ALLOC_H -#define FLATCC_ALLOC_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * These allocation abstractions are __only__ for runtime libraries. - * - * The flatcc compiler uses Posix allocation routines regardless - * of how this file is configured. - * - * This header makes it possible to use systems where malloc is not - * valid to use. In this case the portable library will not help - * because it implements Posix / C11 abstractions. - * - * Systems like FreeRTOS do not work with Posix memory calls and here it - * can be helpful to override runtime allocation primitives. - * - * In general, it is better to customize the allocator and emitter via - * flatcc_builder_custom_init and to avoid using the default emitter - * specific high level calls the copy out a buffer that must later be - * deallocated. This provides full control of allocation withou the need - * for this file. - * - * - * IMPORTANT - * - * If you override malloc, free, etc., make sure your applications - * use the same allocation methods. For example, samples/monster.c - * and several test cases are no longer guaranteed to work out of the - * box. - * - * The changes must only affect target runtime compilation including the - * the runtime library libflatccrt. - * - * The host system flatcc compiler and the compiler library libflatcc - * should NOT be compiled with non-Posix allocation since the compiler - * has a dependency on the runtime library and the wrong free operation - * might be callled. The safest way to avoid this problem this is to - * compile flatcc with the CMake script and the runtime files with a - * dedicated build system for the target system. - */ - -#include - -#ifndef FLATCC_ALLOC -#define FLATCC_ALLOC(n) malloc(n) -#endif - -#ifndef FLATCC_FREE -#define FLATCC_FREE(p) free(p) -#endif - -#ifndef FLATCC_REALLOC -#define FLATCC_REALLOC(p, n) realloc(p, n) -#endif - -#ifndef FLATCC_CALLOC -#define FLATCC_CALLOC(nm, n) calloc(nm, n) -#endif - -/* - * Implements `aligned_alloc` and `aligned_free`. - * Even with C11, this implements non-standard aligned_free needed for portable - * aligned_alloc implementations. - */ -#ifndef FLATCC_USE_GENERIC_ALIGNED_ALLOC - -#ifndef FLATCC_NO_PALIGNED_ALLOC -#include "flatcc/portable/paligned_alloc.h" -#else -#if !defined(__aligned_free_is_defined) || !__aligned_free_is_defined -#define aligned_free free -#endif -#endif - -#else /* FLATCC_USE_GENERIC_ALIGNED_ALLOC */ - -#ifndef FLATCC_ALIGNED_ALLOC -static inline void *__flatcc_aligned_alloc(size_t alignment, size_t size) -{ - char *raw; - void *buf; - size_t total_size = (size + alignment - 1 + sizeof(void *)); - - if (alignment < sizeof(void *)) { - alignment = sizeof(void *); - } - raw = (char *)(size_t)FLATCC_ALLOC(total_size); - buf = raw + alignment - 1 + sizeof(void *); - buf = (void *)(((size_t)buf) & ~(alignment - 1)); - ((void **)buf)[-1] = raw; - return buf; -} -#define FLATCC_ALIGNED_ALLOC(alignment, size) __flatcc_aligned_alloc(alignment, size) -#endif /* FLATCC_USE_GENERIC_ALIGNED_ALLOC */ - -#ifndef FLATCC_ALIGNED_FREE -static inline void __flatcc_aligned_free(void *p) -{ - char *raw; - - if (!p) return; - raw = ((void **)p)[-1]; - - FLATCC_FREE(raw); -} -#define FLATCC_ALIGNED_FREE(p) __flatcc_aligned_free(p) -#endif - -#endif /* FLATCC_USE_GENERIC_ALIGNED_ALLOC */ - -#ifndef FLATCC_ALIGNED_ALLOC -#define FLATCC_ALIGNED_ALLOC(a, n) aligned_alloc(a, n) -#endif - -#ifndef FLATCC_ALIGNED_FREE -#define FLATCC_ALIGNED_FREE(p) aligned_free(p) -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* FLATCC_ALLOC_H */ diff --git a/flatccrt/include/flatcc/flatcc_builder.h b/flatccrt/include/flatcc/flatcc_builder.h deleted file mode 100644 index 6596116..0000000 --- a/flatccrt/include/flatcc/flatcc_builder.h +++ /dev/null @@ -1,1894 +0,0 @@ -#ifndef FLATCC_BUILDER_H -#define FLATCC_BUILDER_H - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * Library for building untyped FlatBuffers. Intended as a support - * library for generated C code to produce typed builders, but might - * also be useful in runtime environments and as support for scripting - * languages. - * - * The builder has two API layers: a stack based `start/end` approach, - * and a direct `create`, and they may be fixed freely. The direct - * approach may be used as part of more specialized optimizations such - * as rewriting buffers while the stack approach is convenient for state - * machine driven parsers without a stack, or with a very simple stack - * without extra allocations. - * - * The builder emits partial buffer sequences to a user provided emitter - * function and does not require a full buffer reprensenation in memory. - * For this reason it also does not support sorting or other operations - * that requires representing the buffer, but post-processors can easily - * do this, and the generated schema specific code and provide functions - * to handle this. - * - * A custom allocator with a default realloc implementation can place - * restraints on resource consumption and provide initial allocation - * sizes for various buffers and stacks in use. - * - * A buffer under construction uses a virtual address space for the - * completed part of the buffer, starting at 0 and growing in both - * directions, or just down depending on whether vtables should be - * clustered at the end or not. Clustering may help caching and - * preshipping that part of the buffer. - * - * Because an offset cannot be known before its reference location is - * defined, every completed table, vector, etc. returns a reference into - * the virtual address range. If the final buffer keeps the 0 offset, - * these references remain stable an may be used for external references - * into the buffer. - * - * The maximum buffer than can be constructed is in praxis limited to - * half the UOFFSET_MAX size, typically 2^31 bytes, not counting - * clustered vtables that may consume and additional 2^31 bytes - * (positive address range), but in praxis cannot because vtable - * references are signed and thus limited to 2^31 bytes (or equivalent - * depending on the flatbuffer types chosen). - * - * CORRECTION: in various places rules are mentioned about nesting and using - * a reference at most once. In fact, DAG's are also valid flatbuffers. - * This means a reference may be reused as long as each individual use - * obeys the rules and, for example, circular references are not - * constructed (circular types are ok, but objects graphs with cycles - * are not permitted). Be especially aware of the offset vector create - * call which translates the references into offsets - this can be - * reverted by noting the reference in vector and calculate the base - * used for the offset to restore the original references after the - * vector has been emitted. - */ - -#include -#ifndef UINT8_MAX -#include -#endif - -#include "flatcc_flatbuffers.h" -#include "flatcc_emitter.h" -#include "flatcc_refmap.h" - -/* It is possible to enable logging here. */ -#ifndef FLATCC_BUILDER_ASSERT -#define FLATCC_BUILDER_ASSERT(cond, reason) assert(cond) -#endif - -/* - * Eror handling is not convenient and correct use should not cause - * errors beyond possibly memory allocation, but assertions are a - * good way to trace problems. - * - * Note: some internal assertion will remain if disabled. - */ -#ifndef FLATCC_BUILDER_ASSERT_ON_ERROR -#define FLATCC_BUILDER_ASSERT_ON_ERROR 1 -#endif - -/* - * If set, checks user input agains state and returns error, - * otherwise errors are ignored (assuming they won't happen). - * Errors will be asserted if enabled and checks are not skipped. - */ -#ifndef FLATCC_BUILDER_SKIP_CHECKS -#define FLATCC_BUILDER_SKIP_CHECKS 0 -#endif - - -/* - * When adding the same field to a table twice this is either an error - * or the existing field is returned, potentially introducing garbage - * if the type is a vector, table, or string. When implementing parsers - * it may be convenient to not treat this as an error. - */ -#ifndef FLATCC_BUILDER_ALLOW_REPEAT_TABLE_ADD -#define FLATCC_BUILDER_ALLOW_REPEAT_TABLE_ADD 0 -#endif - -/** - * This type must have same size as `flatbuffers_uoffset_t` - * and must be a signed type. - */ -typedef flatbuffers_soffset_t flatcc_builder_ref_t; -typedef flatbuffers_utype_t flatcc_builder_utype_t; - -/** - * This type must be compatible with code generation that - * creates union specific ref types. - */ -typedef struct flatcc_builder_union_ref { - flatcc_builder_utype_t type; - flatcc_builder_ref_t value; -} flatcc_builder_union_ref_t; - -typedef struct flatcc_builder_union_vec_ref { - flatcc_builder_ref_t type; - flatcc_builder_ref_t value; -} flatcc_builder_union_vec_ref_t; - -/** - * Virtual tables are off by one to avoid being mistaken for error at - * position 0, and it makes them detectable as such because no other - * reference is uneven. Vtables are emitted at their actual location - * which is one less than the reference value. - */ -typedef flatbuffers_soffset_t flatcc_builder_vt_ref_t; - -typedef flatbuffers_uoffset_t flatcc_builder_identifier_t; - -/** - * Hints to custom allocators so they can provide initial alloc sizes - * etc. There will be at most one buffer for each allocation type per - * flatcc_builder instance. Buffers containing only structs may avoid - * allocation altogether using a `create` call. The vs stack must hold - * vtable entries for all open tables up to their requested max id, but - * unused max id overlap on the stack. The final vtables only store the - * largest id actually added. The fs stack must hold stack frames for - * the nesting levels expected in the buffer, each about 50-100 bytes. - * The ds stack holds open vectors, table data, and nested buffer state. - * `create` calls bypass the `ds` and `fs` stack and are thus faster. - * The vb buffer holds a copy of all vtables seen and emitted since last - * vtable flush. The patch log holds a uoffset for every table field - * added to currently open tables. The hash table holds a uoffset entry - * for each hash slot where the allocator decides how many to provide - * above a certain minimum. The vd buffer allocates vtable descriptors - * which is a reference to an emitted vtable, an offset to a cached - * vtable, and a link to next descriptor with same hash. Calling `reset` - * after build can either keep the allocation levels for the next - * buffer, or reduce the buffers already allocated by requesting 1 byte - * allocations (meaning provide a default). - * - * The user stack is not automatically allocated, but when entered - * explicitly, the boundary is rembered in the current live - * frame. - */ -enum flatcc_builder_alloc_type { - /* The stack where vtables are build. */ - flatcc_builder_alloc_vs, - /* The stack where data structures are build. */ - flatcc_builder_alloc_ds, - /* The virtual table buffer cache, holds a copy of each vt seen. */ - flatcc_builder_alloc_vb, - /* The patch log, remembers table fields with outstanding offset refs. */ - flatcc_builder_alloc_pl, - /* The stack of frames for nested types. */ - flatcc_builder_alloc_fs, - /* The hash table part of the virtual table cache. */ - flatcc_builder_alloc_ht, - /* The vtable descriptor buffer, i.e. list elements for emitted vtables. */ - flatcc_builder_alloc_vd, - /* User stack frame for custom data. */ - flatcc_builder_alloc_us, - - /* Number of allocation buffers. */ - flatcc_builder_alloc_buffer_count -}; - -/** Must reflect the `flatcc_builder_alloc_type` enum. */ -#define FLATCC_BUILDER_ALLOC_BUFFER_COUNT flatcc_builder_alloc_buffer_count - -#ifndef FLATCC_BUILDER_ALLOC -#define FLATCC_BUILDER_ALLOC(n) FLATCC_ALLOC(n) -#endif - -#ifndef FLATCC_BUILDER_FREE -#define FLATCC_BUILDER_FREE(p) FLATCC_FREE(p) -#endif - -#ifndef FLATCC_BUILDER_REALLOC -#define FLATCC_BUILDER_REALLOC(p, n) FLATCC_REALLOC(p, n) -#endif - -#ifndef FLATCC_BUILDER_ALIGNED_ALLOC -#define FLATCC_BUILDER_ALIGNED_ALLOC(a, n) FLATCC_ALIGNED_ALLOC(a, n) -#endif - -#ifndef FLATCC_BUILDER_ALIGNED_FREE -#define FLATCC_BUILDER_ALIGNED_FREE(p) FLATCC_ALIGNED_FREE(p) -#endif - -/** - * Emits data to a conceptual deque by appending to either front or - * back, starting from offset 0. - * - * Each emit call appends a strictly later or earlier sequence than the - * last emit with same offset sign. Thus a buffer is gradually grown at - * both ends. `len` is the combined length of all iov entries such that - * `offset + len` yields the former offset for negative offsets and - * `offset + len` yields the next offset for non-negative offsets. - * The bulk of the data will be in the negative range, possibly all of - * it. The first emitted emitted range will either start or end at - * offset 0. If offset 0 is emitted, it indicates the start of clustered - * vtables. The last positive (non-zero) offset may be zero padding to - * place the buffer in a full multiple of `block_align`, if set. - * - * No iov entry is empty, 0 < iov_count <= FLATCC_IOV_COUNT_MAX. - * - * The source data are in general ephemeral and should be consumed - * immediately, as opposed to caching iov. - * - * For high performance applications: - * - * The `create` calls may reference longer living data, but header - * fields etc. will still be short lived. If an emitter wants to - * reference data in another buffer rather than copying, it should - * inspect the memory range. The length of an iov entry may also be used - * since headers are never very long (anything starting at 16 bytes can - * safely be assumed to be user provided, or static zero padding). It is - * guaranteed that data pointers in `create` calls receive a unique slot - * separate from temporary headers, in the iov table which may be used - * for range checking or hashing (`create_table` is the only call that - * mutates the data buffer). It is also guaranteed (with the exception - * of `create_table` and `create_cached_vtable`) that data provided to - * create calls are not referenced at all by the builder, and these data - * may therefore de-facto be handles rather than direct pointers when - * the emitter and data provider can agree on such a protocol. This does - * NOT apply to any start/end/add/etc. calls which do copy to stack. - * `flatcc_builder_padding_base` may be used to test if an iov entry is - * zero padding which always begins at that address. - * - * Future: the emit interface could be extended with a type code - * and return an existing object insted of the emitted if, for - * example, they are identical. Outside this api level, generated - * code could provide a table comparison function to help such - * deduplication. It would be optional because two equal objects - * are not necessarily identical. The emitter already receives - * one object at time. - * - * Returns 0 on success and otherwise causes the flatcc_builder - * to fail. - */ -typedef int flatcc_builder_emit_fun(void *emit_context, - const flatcc_iovec_t *iov, int iov_count, flatbuffers_soffset_t offset, size_t len); - -/* - * Returns a pointer to static padding used in emitter calls. May - * sometimes also be used for empty defaults such as identifier. - */ -extern const uint8_t flatcc_builder_padding_base[]; - -/** - * `request` is a minimum size to be returned, but allocation is - * expected to grow exponentially or in reasonable chunks. Notably, - * `alloc_type = flatcc_builder_alloc_ht` will only use highest available - * power of 2. The allocator may shrink if `request` is well below - * current size but should avoid repeated resizing on small changes in - * request sizes. If `zero_fill` is non-zero, allocated data beyond - * the current size must be zeroed. The buffer `b` may be null with 0 - * length initially. `alloc_context` is completely implementation - * dependendent, and not needed when just relying on realloc. The - * resulting buffer may be the same or different with moved data, like - * realloc. Returns -1 with unmodified buffer on failure or 0 on - * success. The `alloc_type` identifies the buffer type. This may be - * used to cache buffers between instances of builders, or to decide a - * default allocation size larger than requested. If `need` is zero the - * buffer should be deallocate if non-zero, and return success (0) - * regardless. - */ -typedef int flatcc_builder_alloc_fun(void *alloc_context, - flatcc_iovec_t *b, size_t request, int zero_fill, int alloc_type); - -/* - * The number of hash slots there will be allocated space for. The - * allocator may provide more. The size returned should be - * `sizeof(flatbuffers_uoffset_t) * count`, where the size is a power of - * 2 (or the rest is wasted). The hash table can store many more entries - * than slots using linear search. The table does not resize. - */ -#ifndef FLATCC_BUILDER_MIN_HASH_COUNT -#define FLATCC_BUILDER_MIN_HASH_COUNT 64 -#endif - -typedef struct __flatcc_builder_buffer_frame __flatcc_builder_buffer_frame_t; -struct __flatcc_builder_buffer_frame { - flatcc_builder_identifier_t identifier; - flatcc_builder_ref_t mark; - flatbuffers_uoffset_t vs_end; - flatbuffers_uoffset_t nest_id; - uint16_t flags; - uint16_t block_align; -}; - -typedef struct __flatcc_builder_vector_frame __flatcc_builder_vector_frame_t; -struct __flatcc_builder_vector_frame { - flatbuffers_uoffset_t elem_size; - flatbuffers_uoffset_t count; - flatbuffers_uoffset_t max_count; -}; - -typedef struct __flatcc_builder_table_frame __flatcc_builder_table_frame_t; -struct __flatcc_builder_table_frame { - flatbuffers_uoffset_t vs_end; - flatbuffers_uoffset_t pl_end; - uint32_t vt_hash; - flatbuffers_voffset_t id_end; -}; - -/* - * Store state for nested structures such as buffers, tables and vectors. - * - * For less busy data and data where access to a previous state is - * irrelevant, the frame may store the current state directly. Otherwise - * the current state is maintained in the flatcc_builder_t structure in a - * possibly derived form (e.g. ds pointer instead of ds_end offset) and - * the frame is used to store the previous state when the frame is - * entered. - * - * Most operations have a start/update/end cycle the decides the - * liftetime of a frame, but these generally also have a direct form - * (create) that does not use a frame at all. These still do some - * state updates notably passing min_align to parent which may also be - * an operation without a frame following the child level operation - * (e.g. create struct, create buffer). Ending a frame results in the - * same kind of updates. - */ -typedef struct __flatcc_builder_frame __flatcc_builder_frame_t; -struct __flatcc_builder_frame { - flatbuffers_uoffset_t ds_first; - flatbuffers_uoffset_t type_limit; - flatbuffers_uoffset_t ds_offset; - uint16_t align; - uint16_t type; - union { - __flatcc_builder_table_frame_t table; - __flatcc_builder_vector_frame_t vector; - __flatcc_builder_buffer_frame_t buffer; - }; -}; - -/** - * The main flatcc_builder structure. Can be stack allocated and must - * be initialized with `flatcc_builder_init` and cleared with - * `flatcc_builder_clear` to reclaim memory. Between buffer builds, - * `flatcc_builder_reset` may be used. - */ -typedef struct flatcc_builder flatcc_builder_t; - -struct flatcc_builder { - /* Next entry on reserved stack in `alloc_pl` buffer. */ - flatbuffers_voffset_t *pl; - /* Next entry on reserved stack in `alloc_vs` buffer. */ - flatbuffers_voffset_t *vs; - /* One above the highest entry in vs, used to track vt_size. */ - flatbuffers_voffset_t id_end; - /* The evolving vtable hash updated with every new field. */ - uint32_t vt_hash; - - /* Pointer to ds_first. */ - uint8_t *ds; - /* Offset from `ds` on current frame. */ - flatbuffers_uoffset_t ds_offset; - /* ds buffer size relative to ds_first, clamped to max size of current type. */ - flatbuffers_uoffset_t ds_limit; - - /* ds_first, ds_first + ds_offset is current ds stack range. */ - flatbuffers_uoffset_t ds_first; - /* Points to currently open frame in `alloc_fs` buffer. */ - __flatcc_builder_frame_t *frame; - - /* Only significant to emitter function, if at all. */ - void *emit_context; - /* Only significant to allocator function, if at all. */ - void *alloc_context; - /* Customizable write function that both appends and prepends data. */ - flatcc_builder_emit_fun *emit; - /* Customizable allocator that also deallocates. */ - flatcc_builder_alloc_fun *alloc; - /* Buffers indexed by `alloc_type` */ - flatcc_iovec_t buffers[FLATCC_BUILDER_ALLOC_BUFFER_COUNT]; - /* Number of slots in ht given as 1 << ht_width. */ - size_t ht_width; - - /* The location in vb to add next cached vtable. */ - flatbuffers_uoffset_t vb_end; - /* Where to allocate next vtable descriptor for hash table. */ - flatbuffers_uoffset_t vd_end; - /* Ensure final buffer is aligned to at least this. Nested buffers get their own `min_align`. */ - uint16_t min_align; - /* The current active objects alignment isolated from nested activity. */ - uint16_t align; - /* The current buffers block alignment used when emitting buffer. */ - uint16_t block_align; - /* Signed virtual address range used for `flatcc_builder_ref_t` and emitter. */ - flatcc_builder_ref_t emit_start; - flatcc_builder_ref_t emit_end; - /* 0 for top level, and end of buffer ref for nested buffers (can also be 0). */ - flatcc_builder_ref_t buffer_mark; - /* Next nest_id. */ - flatbuffers_uoffset_t nest_count; - /* Unique id to prevent sharing of vtables across buffers. */ - flatbuffers_uoffset_t nest_id; - /* Current nesting level. Helpful to state-machines with explicit stack and to check `max_level`. */ - int level; - /* Aggregate check for allocated frame and max_level. */ - int limit_level; - /* Track size prefixed buffer. */ - uint16_t buffer_flags; - - /* Settings that may happen with no frame allocated. */ - - flatcc_builder_identifier_t identifier; - - /* Settings that survive reset (emitter, alloc, and contexts also survive): */ - - /* If non-zero, vtable cache gets flushed periodically. */ - size_t vb_flush_limit; - /* If non-zero, fails on deep nesting to help drivers with a stack, such as recursive parsers etc. */ - int max_level; - /* If non-zero, do not cluster vtables at end, only emit negative offsets (0 by default). */ - int disable_vt_clustering; - - /* Set if the default emitter is being used. */ - int is_default_emitter; - /* Only used with default emitter. */ - flatcc_emitter_t default_emit_context; - - /* Offset to the last entered user frame on the user frame stack, after frame header, or 0. */ - size_t user_frame_offset; - - /* The offset to the end of the most recent user frame. */ - size_t user_frame_end; - - /* The optional user supplied refmap for cloning DAG's - not shared with nested buffers. */ - flatcc_refmap_t *refmap; -}; - -/** - * Call this before any other API call. - * - * The emitter handles the completed chunks of the buffer that will no - * longer be required by the builder. It is largely a `write` function - * that can append to both positive and negative offsets. - * - * No memory is allocated during init. Buffers will be allocated as - * needed. The `emit_context` is only used by the emitter, if at all. - * - * `flatcc_builder_reset/clear` calls are automtically forwarded to the - * default emitter. - * - * Returns -1 on failure, 0 on success. - */ -int flatcc_builder_init(flatcc_builder_t *B); - -/** - * Use instead of `flatcc_builder_init` when providing a custom allocator - * or emitter. Leave emitter or allocator null to use default. - * Cleanup of emit and alloc context must be handled manually after - * the builder is cleared or reset, except if emitter is null the - * default will be automatically cleared and reset. - * - * Returns -1 on failure, 0 on success. - */ -int flatcc_builder_custom_init(flatcc_builder_t *B, - flatcc_builder_emit_fun *emit, void *emit_context, - flatcc_builder_alloc_fun *alloc, void *alloc_context); - -/* - * Returns (flatcc_emitter_t *) if the default context is used. - * Other emitter might have null contexts. - */ -void *flatcc_builder_get_emit_context(flatcc_builder_t *B); - -/** - * Prepares builder for a new build. The emitter is not told when a - * buffer is finished or when a new begins, and must be told so - * separately. Allocated buffers will be zeroed, but may optionally be - * reduced to their defaults (signalled by reallocating each non-empty - * buffer to a single byte). General settings are cleared optionally, - * such as cache flushing. Buffer specific settings such as buffer - * identifier are always cleared. - * - * Returns -1 if allocator complains during buffer reduction, 0 on - * success. - */ -int flatcc_builder_custom_reset(flatcc_builder_t *B, - int reduce_buffers, int set_defaults); - -/* - * Same as `flatcc_builder_custom_reset` with default arguments - * where buffers are not reduced and default settings are not reset. - */ -int flatcc_builder_reset(flatcc_builder_t *B); - -/** - * Deallocates all memory by calling allocate with a zero size request - * on each buffer, then zeroing the builder structure itself. - */ -void flatcc_builder_clear(flatcc_builder_t *B); - -/** - * Allocates to next higher power of 2 using system realloc and ignores - * `alloc_context`. Only reduces size if a small subsequent increase in - * size would not trigger a reallocation. `alloc_type` is used to - * set minimum sizes. Hash tables are allocated to the exact requested - * size. See also `alloc_fun`. - */ -int flatcc_builder_default_alloc(void *alloc_context, - flatcc_iovec_t *b, size_t request, int zero_fill, int alloc_type); - -/** - * If non-zero, the vtable cache will get flushed whenever it reaches - * the given limit at a point in time where more space is needed. The - * limit is not exact as it is only tested when reallocation is - * required. - */ -void flatcc_builder_set_vtable_cache_limit(flatcc_builder_t *B, size_t size); - -/** - * Manual flushing of vtable for long running tasks. Mostly used - * internally to deal with nested buffers. - */ -void flatcc_builder_flush_vtable_cache(flatcc_builder_t *B); - -/** - * Low-level support function to aid in constructing nested buffers without - * allocation. Not for regular use. - * - * Call where `start_buffer` would have been placed when using - * `create_buffer` in a nested context. Save the return value on a stack - * as argument to `pop_buffer_alignment`. - * - * The call resets the current derived buffer alignment so the nested - * buffer will not be aligned to more than required. - * - * Often it will not be necessary to be so careful with alignment since - * the alignment cannot be invalid by failing to use push and pop, but - * for code generation it will ensure the correct result every time. - */ -uint16_t flatcc_builder_push_buffer_alignment(flatcc_builder_t *B); - -/** - * Low-level call. - * - * Call with the return value from push_buffer_alignment after a nested - * `create_buffer_call`. The alignments merge back up in the buffer - * hierarchy so the top level buffer gets the largest of all aligments. - */ -void flatcc_builder_pop_buffer_alignment(flatcc_builder_t *B, uint16_t buffer_align); - -/** - * This value may be of interest when the buffer has been ended, for - * example when subsequently allocating memory for the buffer to ensure - * that memory is properly aligned. - */ -uint16_t flatcc_builder_get_buffer_alignment(flatcc_builder_t *B); - -/** - * Level 0 means no buffer is started, otherwise it increments with - * start calls and decrements with end calls (approximately for - * optimized operations such as table vectors). - * - * If `max_level` has been set, `get_level` always returns a value <= - * `max_level` provided no start call has failed. - * - * Level continues to increment inside nested buffers. - */ -int flatcc_builder_get_level(flatcc_builder_t *B); - -/** - * Setting the max level triggers a failure on start of new nestings - * when the level is reached. May be used to protect recursive descend - * parsers etc. or later buffer readers. - * - * The builder itself is not sensitive to depth, and the allocator is a - * better way to protect resource abuse. - * - * `max_level` is not reset inside nested buffers. - */ -void flatcc_builder_set_max_level(flatcc_builder_t *B, int level); - -/** - * By default ordinary data such as tables are placed in front of - * earlier produced content and vtables are placed at the very end thus - * clustering vtables together. This can be disabled so all content is - * placed in front. Nested buffers ignores this setting because they can - * only place content in front because they cannot blend with the - * containing buffers content. Clustering could be more cache friendly - * and also enables pre-shipping of the vtables during transmission. - */ -void flatcc_builder_set_vtable_clustering(flatcc_builder_t *B, int enable); - -/** - * Sets a new user supplied refmap which maps source pointers to - * references and returns the old refmap, or null. It is also - * possible to disable an existing refmap by setting a null - * refmap. - * - * A clone or pick operation may use this map when present, - * depending on the data type. If a hit is found, the stored - * reference will be used instead of performing a new clone or - * pick operation. It is also possible to manually populate the - * refmap. Note that the builder does not have a concept of - * clone or pick - these are higher level recursive operations - * to add data from one buffer to another - but such code may - * rely on the builder to provide the current refmap during - * recursive operations. For this reason, the builder makes no - * calls to the refmap interface on its own - it just stores the - * current refmap such that recursive operations can find it. - * - * Refmaps MUST be reset, replaced or disabled if a source - * pointer may be reused for different purposes - for example if - * repeatedly reading FlatBuffers into the same memory buffer - * and performing a clone into a buffer under construction. - * Refmaps may also be replaced if the same object is to be - * cloned several times keeping the internal DAG structure - * intact with every new clone being an independent object. - * - * Refmaps must also be replaced or disabled prior to starting a - * nested buffer and after stopping it, or when cloning a object - * as a nested root. THIS IS VERY EASY TO GET WRONG! The - * builder does a lot of bookkeeping for nested buffers but not - * in this case. Shared references may happen and they WILL fail - * verification and they WILL break when copying out a nested - * buffer to somewhere else. The user_frame stack may be used - * for pushing refmaps, but often user codes recursive stack - * will work just as well. - * - * It is entirely optional to use refmaps when cloning - they - * preserve DAG structure and may speed up operations or slow - * them down, depending on the source material. - * - * Refmaps may consume a lot of space when large offset vectors - * are cloned when these do not have significant shared - * references. They may also be very cheap to use without any - * dynamic allocation when objects are small and have at most a - * few references. - * - * Refmaps only support init, insert, find, reset, clear but not - * delete. There is a standard implementation in the runtime - * source tree but it can easily be replaced compile time and it - * may also be left out if unused. The builder wraps reset, insert, - * and find so the user does not have to check if a refmap is - * present but other operations must be done direcly on the - * refmap. - * - * The builder wrapped refmap operations are valid on a null - * refmap which will find nothing and insert nothing. - * - * The builder will reset the refmap during a builder reset and - * clear the refmap during a builder clear operation. If the - * refmap goes out of scope before that happens it is important - * to call set_refmap with null and manually clear the refmap. - */ -static inline flatcc_refmap_t *flatcc_builder_set_refmap(flatcc_builder_t *B, flatcc_refmap_t *refmap) -{ - flatcc_refmap_t *refmap_old; - - refmap_old = B->refmap; - B->refmap = refmap; - return refmap_old; -} - -/* Retrieves the current refmap, or null. */ -static inline flatcc_refmap_t *flatcc_builder_get_refmap(flatcc_builder_t *B) -{ - return B->refmap; -} - -/* Finds a reference, or a null reference if no refmap is active. * */ -static inline flatcc_builder_ref_t flatcc_builder_refmap_find(flatcc_builder_t *B, const void *src) -{ - return B->refmap ? flatcc_refmap_find(B->refmap, src) : flatcc_refmap_not_found; -} - -/* - * Inserts into the current refmap with the inseted ref upon - * upon success, or not_found on failure (default 0), or just - * returns ref if refmap is absent. - * - * Note that if an existing item exists, the ref is replaced - * and the new, not the old, ref is returned. - */ -static inline flatcc_builder_ref_t flatcc_builder_refmap_insert(flatcc_builder_t *B, const void *src, flatcc_builder_ref_t ref) -{ - return B->refmap ? flatcc_refmap_insert(B->refmap, src, ref) : ref; -} - -static inline void flatcc_builder_refmap_reset(flatcc_builder_t *B) -{ - if (B->refmap) flatcc_refmap_reset(B->refmap); -} - - -enum flatcc_builder_buffer_flags { - flatcc_builder_is_nested = 1, - flatcc_builder_with_size = 2, -}; - -/** - * An alternative to start buffer, start struct/table ... end buffer. - * - * This call is mostly of interest as a means to quicly create a zero - * allocation top-level buffer header following a call to create_struct, - * or to create_vtable/create_table. For that, it is quite simple to - * use. For general buffer construction without allocation, more care is - * needed, as discussed below. - * - * If the content is created with `start/end_table` calls, or similar, - * it is better to use `start/end_buffer` since stack allocation is used - * anyway. - * - * The buffer alignment must be provided manually as it is not derived - * from constructed content, unlike `start/end_buffer`. Typically - * `align` would be same argument as provided to `create_struct`. - * `get_buffer_alignment` may also used (note: `get_buffer_alignment` - * may return different after the call because it will be updated with - * the `block_align` argument to `create_buffer` but that is ok). - * - * The buffer may be constructed as a nested buffer with the `is_nested - * = 1` flag. As a nested buffer a ubyte vector header is placed before - * the aligned buffer header. A top-level buffer will normally have - * flags set to 0. - * - * A top-level buffer may also be constructed with the `with_size = 2` - * flag for top level buffers. It adds a size prefix similar to - * `is_nested` but the size is part of the aligned buffer. A size - * prefixed top level buffer must be accessed with a size prefix aware - * reader, or the buffer given to a standard reader must point to after - * the size field while keeping the buffer aligned to the size field - * (this will depend on the readers API which may be an arbitrary other - * language). - * - * If the `with_size` is used with the `is_nested` flag, the size is - * added as usual and all fields remain aligned as before, but padding - * is adjusted to ensure the buffer is aligned to the size field so - * that, for example, the nested buffer with size can safely be copied - * to a new memory buffer for consumption. - * - * Generally, references may only be used within the same buffer - * context. With `create_buffer` this becomes less precise. The rule - * here is that anything that would be valid with start/end_buffer - * nestings is also valid when removing the `start_buffer` call and - * replacing `end_buffer` with `create_buffer`. - * - * Note the additional burden of tracking buffer alignment manually - - * To help with this use `push_buffer_alignment` where `start_buffer` - * would have been placed, and `pop_buffer_alignment after the - * `create_buffer` call, and use `get_buffer_alignemnt` as described - * above. - * - * `create_buffer` is not suitable as a container for buffers created - * with `start/end_buffer` as these make assumptions about context that - * create buffer does not provide. Also, there is no point in doing so, - * since the idea of `create_buffer` is to avoid allocation in the first - * place. - */ -flatcc_builder_ref_t flatcc_builder_create_buffer(flatcc_builder_t *B, - const char identifier[FLATBUFFERS_IDENTIFIER_SIZE], - uint16_t block_align, - flatcc_builder_ref_t ref, uint16_t align, int flags); - -/** - * Creates a struct within the current buffer without using any - * allocation. - * - * The struct should be used as a root in the `end_buffer` call or as a - * union value as there are no other ways to use struct while conforming - * to the FlatBuffer format - noting that tables embed structs in their - * own data area except in union fields. - * - * The struct should be in little endian format and follow the usual - * FlatBuffers alignment rules, although this API won't care about what - * is being stored. - * - * May also be used to simply emit a struct through the emitter - * interface without being in a buffer and without being a valid - * FlatBuffer. - */ -flatcc_builder_ref_t flatcc_builder_create_struct(flatcc_builder_t *B, - const void *data, size_t size, uint16_t align); - -/** - * Starts a struct and returns a pointer that should be used immediately - * to fill in the struct in protocol endian format, and when done, - * `end_struct` should be called. The returned reference should be used - * as argument to `end_buffer` or as a union value. See also - * `create_struct`. - */ -void *flatcc_builder_start_struct(flatcc_builder_t *B, - size_t size, uint16_t align); - -/** - * Return a pointer also returned at start struct, e.g. for endian - * conversion. - */ -void *flatcc_builder_struct_edit(flatcc_builder_t *B); - -/** - * Emits the struct started by `start_struct` and returns a reference to - * be used as root in an enclosing `end_buffer` call or as a union - * value. As mentioned in `create_struct`, these can also be used more - * freely, but not while being conformant FlatBuffers. - */ -flatcc_builder_ref_t flatcc_builder_end_struct(flatcc_builder_t *B); - -/** - * The buffer always aligns to at least the offset size (typically 4) - * and the internal alignment requirements of the buffer content which - * is derived as content is added. - * - * In addition, block_align can be specified. This ensures the resulting - * buffer is at least aligned to the block size and that the total size - * is zero padded to fill a block multiple if necessary. Because the - * emitter operates on a virtual address range before the full buffer is - * aligned, it may have to make assumptions based on that: For example, - * it may be processing encryption blocks in the fly, and the resulting - * buffer should be aligned to the encryption block size, even if the - * content is just a byte aligned struct. Block align helps ensure this. - * If the block align as 1 there will be no attempt to zero pad at the - * end, but the content may still warrant padding after the header. End - * padding is only needed with clustered vtables (which is the default). - * - * `block_align` is allowed to be 0 meaning it will inherit from parent if - * present, and otherwise it defaults to 1. - * - * The identifier may be null, and it may optionally be set later with - * `set_identifier` before the `end_buffer` call. - * - * General note: - * - * Only references returned with this buffer as current (i.e. last - * unended buffer) can be stored in other objects (tables, offset - * vectors) also belonging to this buffer, or used as the root argument - * to `end_buffer`. A reference may be stored at most once, and unused - * references will result in buffer garbage. All calls must be balanced - * around the respective start / end operations, but may otherwise nest - * freely, including nested buffers. Nested buffers are supposed to be - * stored in a table offset field to comply with FlatBuffers, but the - * API does not place any restrictions on where references are stored, - * as long as they are indicated as offset fields. - * - * All alignment in all API calls must be between 1 and 256 and must be a - * power of 2. This is not checked. Only if explicitly documented can it - * also be 0 for a default value. - * - * `flags` can be `with_size` but `is_nested` is derived from context - * see also `create_buffer`. - */ -int flatcc_builder_start_buffer(flatcc_builder_t *B, - const char identifier[FLATBUFFERS_IDENTIFIER_SIZE], - uint16_t block_align, int flags); - -/** - * The root object should be a struct or a table to conform to the - * FlatBuffers format, but technically it can also be a vector or a - * string, or even a child buffer (which is also vector as seen by the - * buffer). The object must be created within the current buffer - * context, that is, while the current buffer is the deepest nested - * buffer on the stack. - */ -flatcc_builder_ref_t flatcc_builder_end_buffer(flatcc_builder_t *B, flatcc_builder_ref_t root); - -/** - * The embed buffer is mostly intended to add an existing buffer as a - * nested buffer. The buffer will be wrapped in a ubyte vector such that - * the buffer is aligned at vector start, after the size field. - * - * If `align` is 0 it will default to 8 so that all FlatBuffer numeric - * types will be readable. NOTE: generally do not count on align 0 being - * valid or even checked by the API, but in this case it may be - * difficult to know the internal buffer alignment, and 1 would be the wrong - * choice. - * - * If `block_align` is set (non-zero), the buffer is placed in an isolated - * block multiple. This may cost up to almost 2 block sizes in padding. - * If the `block_align` argument is 0, it inherits from the parent - * buffer block_size, or defaults to 1. - * - * The `align` argument must be set to respect the buffers internal - * alignment requirements, but if the buffer is smaller it will not be - * padded to isolate the buffer. For example a buffer of with - * `align = 64` and `size = 65` may share its last 64 byte block with - * other content, but not if `block_align = 64`. - * - * Because the ubyte size field is not, by default, part of the aligned - * buffer, significant space can be wasted if multiple blocks are added - * in sequence with a large block size. - * - * In most cases the distinction between the two alignments is not - * important, but it allows separate configuration of block internal - * alignment and block size, which can be important for auto-generated - * code that may know the alignment of the buffer, but not the users - * operational requirements. - * - * If the buffer is embedded without a parent buffer, it will simply - * emit the buffer through the emit interface, but may also add padding - * up to block alignment. At top-level there will be no size field - * header. - * - * If `with_size` flag is set, the buffer is aligned to size field and - * the above note about padding space no longer applies. The size field - * is added regardless. The `is_nested` flag has no effect since it is - * impplied. - */ -flatcc_builder_ref_t flatcc_builder_embed_buffer(flatcc_builder_t *B, - uint16_t block_align, - const void *data, size_t size, uint16_t align, int flags); - -/** - * Applies to the innermost open buffer. The identifier may be null or - * contain all zero. Overrides any identifier given to the start buffer - * call. - */ -void flatcc_builder_set_identifier(flatcc_builder_t *B, - const char identifier[FLATBUFFERS_IDENTIFIER_SIZE]); - -enum flatcc_builder_type { - flatcc_builder_empty = 0, - flatcc_builder_buffer, - flatcc_builder_struct, - flatcc_builder_table, - flatcc_builder_vector, - flatcc_builder_offset_vector, - flatcc_builder_string, - flatcc_builder_union_vector -}; - -/** - * Returns the object type currently on the stack, for example if - * needing to decide how to close a buffer. Because a table is - * automatically added when starting a table buffer, - * `flatcc_builder_table_buffer` should not normally be seen and the level - * should be 2 before when closing a top-level table buffer, and 0 - * after. A `flatcc_builder_struct_buffer` will be visible at level 1. - * - */ -enum flatcc_builder_type flatcc_builder_get_type(flatcc_builder_t *B); - -/** - * Similar to `get_type` but for a specific level. `get_type_at(B, 1)` - * will return `flatcc_builder_table_buffer` if this is the root buffer - * type. get_type_at(B, 0) is always `flatcc_builder_empty` and so are any - * level above `get_level`. - */ -enum flatcc_builder_type flatcc_builder_get_type_at(flatcc_builder_t *B, int level); - -/** - * The user stack is available for custom data. It may be used as - * a simple stack by extending or reducing the inner-most frame. - * - * A frame has a size and a location on the user stack. Entering - * a frame ensures the start is aligned to sizeof(size_t) and - * ensures the requested space is available without reallocation. - * When exiting a frame, the previous frame is restored. - * - * A user frame works completely independently of the builders - * frame stack for tracking tables vectors etc. and does not have - * to be completely at exit, but obviously it is not valid to - * exit more often the entered. - * - * The frame is zeroed when entered. - * - * Returns a non-zero handle to the user frame upon success or - * 0 on allocation failure. - */ -size_t flatcc_builder_enter_user_frame(flatcc_builder_t *B, size_t size); - -/** - * Makes the parent user frame current, if any. It is not valid to call - * if there isn't any current frame. Returns handle to parent frame if - * any, or 0. - */ -size_t flatcc_builder_exit_user_frame(flatcc_builder_t *B); - -/** - * Exits the frame represented by the given handle. All more - * recently entered frames will also be exited. Returns the parent - * frame handle if any, or 0. - */ -size_t flatcc_builder_exit_user_frame_at(flatcc_builder_t *B, size_t handle); - -/** - * Returns a non-zero handle to the current inner-most user frame if - * any, or 0. - */ -size_t flatcc_builder_get_current_user_frame(flatcc_builder_t *B); - -/* - * Returns a pointer to the user frame at the given handle. Any active - * frame can be accessed in this manner but the pointer is invalidated - * by user frame enter and exit operations. - */ -void *flatcc_builder_get_user_frame_ptr(flatcc_builder_t *B, size_t handle); - -/** - * Returns the size of the buffer and the logical start and end address - * of with respect to the emitters address range. `end` - `start` also - * yields the size. During construction `size` is the emitted number of - * bytes and after buffer close it is the actual buffer size - by then - * the start is also the return value of close buffer. End marks the end - * of the virtual table cluster block. - * - * NOTE: there is no guarantee that all vtables end up in the cluster - * block if there is placed a limit on the vtable size, or if nested - * buffers are being used. On the other hand, if these conditions are - * met, it is guaranteed that all vtables are present if the vtable - * block is available (this depends on external transmission - the - * vtables are always emitted before tables using them). In all cases - * the vtables will behave as valid vtables in a flatbuffer. - */ -size_t flatcc_builder_get_buffer_size(flatcc_builder_t *B); - -/** - * Returns the reference to the start of the emitter buffer so far, or - * in total after buffer end, in the virtual address range used - * by the emitter. Start is also returned by buffer end. - */ -flatcc_builder_ref_t flatcc_builder_get_buffer_start(flatcc_builder_t *B); - -/** - * Returns the reference to the end of buffer emitted so far. When - * clustering vtables, this is the end of tables, or after buffer end, - * also zero padding if block aligned. If clustering is disabled, this - * method will return 0 as the buffer only grows down then. - */ -flatcc_builder_ref_t flatcc_builder_get_buffer_mark(flatcc_builder_t *B); - -/** - * Creates the vtable in the current buffer context, somewhat similar to - * how create_vector operates. Each call results in a new table even if - * an identical has already been emitted. - * - * Also consider `create_cached_vtable` which will reuse existing - * vtables. - * - * This is low-low-level function intended to support - * `create_cached_vtable` or equivalent, and `create_table`, both of - * which are normally used indirectly via `start_table`, `table_add`, - * `table_add_offset`..., `table_end`. - * - * Creates a vtable as a verbatim copy. This means the vtable must - * include the header fields containing the vtable size and the table - * size in little endian voffset_t encoding followed by the vtable - * entries in same encoding. - * - * The function may be used to copy vtables from other other buffers - * since they are directly transferable. - * - * The returned reference is actually the emitted location + 1. This - * ensures the vtable is not mistaken for error because 0 is a valid - * vtable reference. `create_table` is aware of this and substracts one - * before computing the final offset relative to the table. This also - * means vtable references are uniquely identifiable by having the - * lowest bit set. - * - * vtable references may be reused within the same buffer, not any - * parent or other related buffer (technically this is possible though, - * as long as it is within same builder context, but it will not construct - * valid FlatBuffers because the buffer cannot be extracted in isolation). - */ -flatcc_builder_vt_ref_t flatcc_builder_create_vtable(flatcc_builder_t *B, - const flatbuffers_voffset_t *vt, - flatbuffers_voffset_t vt_size); - -/** - * Support function to `create_vtable`. See also the uncached version - * `create_vtable`. - * - * Looks up the constructed vtable on the vs stack too see if it matches - * a cached entry. If not, it emits a new vtable either at the end if - * top-level and clustering is enabled, or at the front (always for - * nested buffers). - * - * If the same vtable was already emitted in a different buffer, but not - * in the current buffer, the cache entry will be reused, but a new - * table will be emitted the first it happens in the same table. - * - * The returned reference is + 1 relative to the emitted address range - * to identify it as a vtable and to avoid mistaking the valid 0 - * reference for an error (clustered vtables tend to start at the end at - * the virtual address 0, and up). - * - * The hash function can be chosen arbitrarily but may result in - * duplicate emitted vtables if different hash functions are being used - * concurrently, such as mixing the default used by `start/end table` - * with a custom function (this is not incorrect, it only increases the - * buffer size and cache pressure). - * - * If a vtable has a unique ID by other means than hashing the content, - * such as an integer id, and offset into another buffer, or a pointer, - * a good hash may be multiplication by a 32-bit prime number. The hash - * table is not very sensitive to collissions as it uses externally - * chained hashing with move to front semantics. - */ -flatcc_builder_vt_ref_t flatcc_builder_create_cached_vtable(flatcc_builder_t *B, - const flatbuffers_voffset_t *vt, - flatbuffers_voffset_t vt_size, uint32_t vt_hash); - -/* - * Based on Knuth's prime multiplier. - * - * This is an incremental hash that is called with id and size of each - * non-empty field, and finally with the two vtable header fields - * when vtables are constructed via `table_add/table_add_offset`. - * - */ -#ifndef FLATCC_SLOW_MUL -#ifndef FLATCC_BUILDER_INIT_VT_HASH -#define FLATCC_BUILDER_INIT_VT_HASH(hash) { (hash) = (uint32_t)0x2f693b52UL; } -#endif -#ifndef FLATCC_BUILDER_UPDATE_VT_HASH -#define FLATCC_BUILDER_UPDATE_VT_HASH(hash, id, offset) \ - { (hash) = (((((uint32_t)id ^ (hash)) * (uint32_t)2654435761UL)\ - ^ (uint32_t)(offset)) * (uint32_t)2654435761UL); } -#endif -#ifndef FLATCC_BUILDER_BUCKET_VT_HASH -#define FLATCC_BUILDER_BUCKET_VT_HASH(hash, width) (((uint32_t)(hash)) >> (32 - (width))) -#endif -#endif - -/* - * By default we use Bernsteins hash as fallback if multiplication is slow. - * - * This just have to be simple, fast, and work on devices without fast - * multiplication. We are not too sensitive to collisions. Feel free to - * experiment and replace. - */ -#ifndef FLATCC_BUILDER_INIT_VT_HASH -#define FLATCC_BUILDER_INIT_VT_HASH(hash) { (hash) = 5381; } -#endif -#ifndef FLATCC_BUILDER_UPDATE_VT_HASH -#define FLATCC_BUILDER_UPDATE_VT_HASH(hash, id, offset) \ - { (hash) = ((((hash) << 5) ^ (id)) << 5) ^ (offset); } -#endif -#ifndef FLATCC_BUILDER_BUCKET_VT_HASH -#define FLATCC_BUILDER_BUCKET_VT_HASH(hash, width) (((1 << (width)) - 1) & (hash)) -#endif - - - -/** - * Normally use `start_table` instead of this call. - * - * This is a low-level call only intended for high-performance - * applications that repeatedly churn about similar tables of known - * layout, or as a support layer for other builders that maintain their - * own allocation rather than using the stack of this builder. - * - * Creates a table from an already emitted vtable, actual data that is - * properly aligned relative to data start and in little endian - * encoding. Unlike structs, tables can have offset fields. These must - * be stored as flatcc_builder_ref_t types (which have uoffset_t size) as - * returned by the api in native encoding. The `offsets` table contain - * voffsets relative to `data` start (this is different from how vtables - * store offsets because they are relative to a table header). The - * `offsets` table is only used temporarily to translate the stored - * references and is not part of final buffer content. `offsets` may be - * null if `offset_count` is 0. `align` should be the highest aligned - * field in the table, but `size` need not be a multiple of `align`. - * Aside from endian encoding, the vtable must record a table size equal - * to `size + sizeof(flatbuffers_uoffset_t)` because it includes the - * table header field size. The vtable is not accessed by this call (nor - * is it available). Unlike other references, the vtable reference may - * be shared between tables in the same buffer (not with any related - * buffer such as a parent buffer). - * - * The operation will not use any allocation, but will update the - * alignment of the containing buffer if any. - * - * Note: unlike other create calls, except `create_offset_vector`, - * the source data is modified in order to translate references intok - * offsets before emitting the table. - */ -flatcc_builder_ref_t flatcc_builder_create_table(flatcc_builder_t *B, - const void *data, size_t size, uint16_t align, - flatbuffers_voffset_t *offsets, int offset_count, - flatcc_builder_vt_ref_t vt_ref); - -/** - * Starts a table, typically following a start_buffer call as an - * alternative to starting a struct, or to create table fields to be - * stored in a parent table, or in an offset vector. - * A number of `table_add` and table_add_offset` call may be placed - * before the `end_table` call. Struct fields should NOT use `struct` - * related call (because table structs are in-place), rather they should - * use the `table_add` call with the appropriate size and alignment. - * - * A table, like other reference returning calls, may also be started - * outside a buffer if the buffer header and alignment is of no - * interest to the application, for example as part of an externally - * built buffer. - * - * `count` must be larger than the largest id used for this table - * instance. Normally it is set to the number of fields defined in the - * schema, but it may be less if memory is constrained and only few - * fields with low valued id's are in use. The count can extended later - * with `reserve_table` if necessary. `count` may be also be set to a - * large enough value such as FLATBUFFERS_ID_MAX + 1 if memory is not a - * concern (reserves about twice the maximum vtable size to track the - * current vtable and voffsets where references must be translated to - * offsets at table end). `count` may be zero if for example - * `reserve_table` is being used. - * - * Returns -1 on error, 0 on success. - */ -int flatcc_builder_start_table(flatcc_builder_t *B, int count); - -/** - * Call before adding a field with an id that is not below the count set - * at table start. Not needed in most cases. For performance reasons - * the builder does not check all bounds all the the time, but the user - * can do so if memory constraints prevent start_table from using a - * conservative value. See also `table_start`. - * - * Note: this call has absolutely no effect on the table layout, it just - * prevents internal buffer overruns. - * - * Returns -1 on error, 0 on success. - */ -int flatcc_builder_reserve_table(flatcc_builder_t *B, int count); - -/** - * Completes the table constructed on the internal stack including - * emitting a vtable, or finding a matching vtable that has already been - * emitted to the same buffer. (Vtables cannot be shared between - * buffers, but they can between tables of the same buffer). - * - * Note: there is a considerable, but necessary, amount of bookkeeping - * involved in constructing tables. The `create_table` call is much - * faster, but it also expects a lot of work to be done already. - * - * Tables can be created with no fields added. This will result in an - * empty vtable and a table with just a vtable reference. If a table is - * used as a sub-table, such a table might also not be stored at all, - * but we do not return a special reference for that, nor do we provide - * and option to not create the table in this case. This may be - * interpreted as the difference between a null table (not stored in - * parent), and an empty table with a unique offset (and thus identity) - * different from other empty tables. - */ -flatcc_builder_ref_t flatcc_builder_end_table(flatcc_builder_t *B); - -/** - * Optionally this method can be called just before `flatcc_builder_end_table` - * to verify that all required fields have been set. - * Each entry is a table field id. - * - * Union fields should use the type field when checking for presence and - * may also want to check the soundness of the union field overall using - * `check_union_field` with the id one higher than the type field id. - * - * This funcion is typically called by an assertion in generated builder - * interfaces while release builds may want to avoid this performance - * overhead. - * - * Returns 1 if all fields are matched, 0 otherwise. - */ -int flatcc_builder_check_required(flatcc_builder_t *B, const flatbuffers_voffset_t *required, int count); - -/** - * Same as `check_required` when called with a single element. - * - * Typically used when direct calls are more convenient than building an - * array first. Useful when dealing with untrusted intput such as parsed - * text from an external source. - */ -int flatcc_builder_check_required_field(flatcc_builder_t *B, flatbuffers_voffset_t id); - -/** - * Checks that a union field is valid. - * - * The criteria is: - * - * If the type field is not present (at id - 1), or it holds a zero value, - * then the table field (at id) must be present. - * - * Generated builder code may be able to enforce valid unions without - * this check by setting both type and table together, but e.g. parsers - * may receive the type and the table independently and then it makes - * sense to validate the union fields before table completion. - * - * Note that an absent union field is perfectly valid. If a union is - * required, the type field (id - 1), should be checked separately - * while the table field should only be checked here because it can - * (and must) be absent when the type is NONE (= 0). - */ -int flatcc_builder_check_union_field(flatcc_builder_t *B, flatbuffers_voffset_t id); - -/** - * A struct, enum or scalar added should be stored in little endian in - * the return pointer location. The pointer is short lived and will - * not necessarily survive other builder calls. - * - * A union type field can also be set using this call. In fact, this is - * the only way to deal with unions via this API. Consequently, it is - * the users repsonsibility to ensure the appropriate type is added - * at the next higher id. - * - * Null and default values: - * - * FlatBuffers does not officially provide an option for null values - * because it does not distinguish between default values and values - * that are not present. At this api level, we do not deal with defaults - * at all. Callee should test the stored value against the default value - * and only add the field if it does not match the default. This only - * applies to scalar and enum values. Structs cannot have defaults so - * their absence means null, and strings, vectors and subtables do have - * natural null values different from the empty object and empty objects - * with different identity is also possible. - * - * To handle Null for scalars, the following approach is recommended: - * - * Provide a schema-specific `add` operation that only calls this - * low-level add method if the default does not match, and also provide - * another `set` operation that always stores the value, regardless of - * default. For most readers this will be transparent, except for extra - * space used, but for Null aware readers, these can support operations - * to test for Null/default/other value while still supporting the - * normal read operation that returns default when a value is absent - * (i.e. Null). - * - * It is valid to call with a size of 0 - the effect being adding the - * vtable entry. The call may also be dropped in this case to reduce - * the vtable size - the difference will be in null detection. - */ -void *flatcc_builder_table_add(flatcc_builder_t *B, int id, size_t size, uint16_t align); - -/** - * Returns a pointer to the buffer holding the last field added. The - * size argument must match the field size added. May, for example, be - * used to perform endian conversion after initially updating field - * as a native struct. Must be called before the table is ended. - */ -void *flatcc_builder_table_edit(flatcc_builder_t *B, size_t size); - -/** - * Similar to `table_add` but copies source data into the buffer before - * it is returned. Useful when adding a larger struct already encoded in - * little endian. - */ -void *flatcc_builder_table_add_copy(flatcc_builder_t *B, int id, const void *data, size_t size, uint16_t align); - -/** - * Add a string, vector, or sub-table depending on the type if the - * field identifier. The offset ref obtained when the field object was - * closed should be stored as is in the given pointer. The pointer - * is only valid short term, so create the object before calling - * add to table, but the owner table can be started earlier. Never mix - * refs from nested buffers with parent buffers. - * - * Also uses this method to add nested buffers. A nested buffer is - * simple a buffer created while another buffer is open. The buffer - * close operation provides the necessary reference. - * - * When the table closes, all references get converted into offsets. - * Before that point, it is not required that the offset is written - * to. - */ -flatcc_builder_ref_t *flatcc_builder_table_add_offset(flatcc_builder_t *B, int id); - -/* - * Adds a union type and reference in a single operation and returns 0 - * on success. Stores the type field at `id - 1` and the value at - * `id`. The `value` is a reference to a table, to a string, or to a - * standalone `struct` outside the table. - * - * If the type is 0, the value field must also be 0. - * - * Unions can also be added as separate calls to the type and the offset - * separately which can lead to better packing when the type is placed - * together will other small fields. - */ -int flatcc_builder_table_add_union(flatcc_builder_t *B, int id, - flatcc_builder_union_ref_t uref); - -/* - * Adds a union type vector and value vector in a single operations - * and returns 0 on success. - * - * If both the type and value vector is null, nothing is added. - * Otherwise both must be present and have the same length. - * - * Any 0 entry in the type vector must also have a 0 entry in - * the value vector. - */ -int flatcc_builder_table_add_union_vector(flatcc_builder_t *B, int id, - flatcc_builder_union_vec_ref_t uvref); -/** - * Creates a vector in a single operation using an externally supplied - * buffer. This completely bypasses the stack, but the size must be - * known and the content must be little endian. Do not use for strings - * and offset vectors. Other flatbuffer vectors could be used as a - * source, but the length prefix is not required. - * - * Set `max_count` to `FLATBUFFERS_COUNT_MAX(elem_size)` before a call - * to any string or vector operation to the get maximum safe vector - * size, or use (size_t)-1 if overflow is not a concern. - * - * The max count property is a global property that remains until - * explicitly changed. - * - * `max_count` is to prevent malicous or accidental overflow which is - * difficult to detect by multiplication alone, depending on the type - * sizes being used and having `max_count` thus avoids a division for - * every vector created. `max_count` does not guarantee a vector will - * fit in an empty buffer, it just ensures the internal size checks do - * not overflow. A safe, sane limit woud be max_count / 4 because that - * is half the maximum buffer size that can realistically be - * constructed, corresponding to a vector size of `UOFFSET_MAX / 4` - * which can always hold the vector in 1GB excluding the size field when - * sizeof(uoffset_t) = 4. - */ -flatcc_builder_ref_t flatcc_builder_create_vector(flatcc_builder_t *B, - const void *data, size_t count, size_t elem_size, uint16_t align, size_t max_count); - -/** - * Starts a vector on the stack. - * - * Do not use these calls for string or offset vectors, but do store - * scalars, enums and structs, always in little endian encoding. - * - * Use `extend_vector` subsequently to add zero, one or more elements - * at time. - * - * See `create_vector` for `max_count` argument (strings and offset - * vectors have a fixed element size and does not need this argument). - * - * Returns 0 on success. - */ -int flatcc_builder_start_vector(flatcc_builder_t *B, size_t elem_size, - uint16_t align, size_t max_count); - -/** - * Emits the vector constructed on the stack by start_vector. - * - * The vector may be accessed in the emitted stream using the returned - * reference, even if the containing buffer is still under construction. - * This may be useful for sorting. This api does not support sorting - * because offset vectors cannot read their references after emission, - * and while plain vectors could be sorted, it has been chosen that this - * task is better left as a separate processing step. Generated code can - * provide sorting functions that work on final in-memory buffers. - */ -flatcc_builder_ref_t flatcc_builder_end_vector(flatcc_builder_t *B); - -/** Returns the number of elements currently on the stack. */ -size_t flatcc_builder_vector_count(flatcc_builder_t *B); - -/** - * Returns a pointer ot the first vector element on stack, - * accessible up to the number of elements currently on stack. - */ -void *flatcc_builder_vector_edit(flatcc_builder_t *B); - -/** - * Returns a zero initialized buffer to a new region of the vector which - * is extended at the end. The buffer must be consumed before other api - * calls that may affect the stack, including `extend_vector`. - * - * Do not use for strings, offset or union vectors. May be used for nested - * buffers, but these have dedicated calls to provide better alignment. - */ -void *flatcc_builder_extend_vector(flatcc_builder_t *B, size_t count); - -/** - * A specialized `vector_extend` that pushes a single element. - * - * Returns the buffer holding a modifiable copy of the added content, - * or null on error. Note: for structs, care must be taken to ensure - * the source has been zero padded. For this reason it may be better to - * use extend(B, 1) and assign specific fields instead. - */ -void *flatcc_builder_vector_push(flatcc_builder_t *B, const void *data); - -/** - * Pushes multiple elements at a time. - * - * Returns the buffer holding a modifiable copy of the added content, - * or null on error. - */ -void *flatcc_builder_append_vector(flatcc_builder_t *B, const void *data, size_t count); - -/** - * Removes elements already added to vector that has not been ended. - * For example, a vector of parsed list may remove the trailing comma, - * or the vector may simply overallocate to get some temporary working - * space. The total vector size must never become negative. - * - * Returns -1 if the count as larger than current count, or 0 on success. - */ -int flatcc_builder_truncate_vector(flatcc_builder_t *B, size_t count); - -/* - * Similar to `create_vector` but with references that get translated - * into offsets. The references must, as usual, belong to the current - * buffer. Strings, scalar and struct vectors can emit directly without - * stack allocation, but offset vectors must translate the offsets - * and therefore need the temporary space. Thus, this function is - * roughly equivalent to to start, append, end offset vector. - * - * See also `flatcc_builder_create_offset_vector_direct`. - */ -flatcc_builder_ref_t flatcc_builder_create_offset_vector(flatcc_builder_t *B, - const flatcc_builder_ref_t *data, size_t count); - -/* - * NOTE: this call takes non-const source array of references - * and destroys the content. - * - * This is a faster version of `create_offset_vector` where the - * source references are destroyed. In return the vector can be - * emitted directly without passing over the stack. - */ -flatcc_builder_ref_t flatcc_builder_create_offset_vector_direct(flatcc_builder_t *B, - flatcc_builder_ref_t *data, size_t count); - - -/** - * Starts a vector holding offsets to tables or strings. Before - * completion it will hold `flatcc_builder_ref_t` references because the - * offset is not known until the vector start location is known, which - * depends to the final size, which for parsers is generally unknown. - */ -int flatcc_builder_start_offset_vector(flatcc_builder_t *B); - -/** - * Similar to `end_vector` but updates all stored references so they - * become offsets to the vector start. - */ -flatcc_builder_ref_t flatcc_builder_end_offset_vector(flatcc_builder_t *B); - -/** - * Same as `flatcc_builder_end_offset_vector` except null references are - * permitted when the corresponding `type` entry is 0 (the 'NONE' type). - * This makes it possible to build union vectors with less overhead when - * the `type` vector is already known. Use standand offset vector calls - * prior to this call. - */ -flatcc_builder_ref_t flatcc_builder_end_offset_vector_for_unions(flatcc_builder_t *B, - const flatcc_builder_utype_t *type); - -/** Returns the number of elements currently on the stack. */ -size_t flatcc_builder_offset_vector_count(flatcc_builder_t *B); - -/** - * Returns a pointer ot the first vector element on stack, - * accessible up to the number of elements currently on stack. - */ -void *flatcc_builder_offset_vector_edit(flatcc_builder_t *B); - -/** - * Similar to `extend_vector` but returns a buffer indexable as - * `flatcc_builder_ref_t` array. All elements must be set to a valid - * unique non-null reference, but truncate and extend may be used to - * perform edits. Unused references will leave garbage in the buffer. - * References should not originate from any other buffer than the - * current, including parents and nested buffers. It is valid to reuse - * references in DAG form when contained in the sammer, excluding any - * nested, sibling or parent buffers. - */ -flatcc_builder_ref_t *flatcc_builder_extend_offset_vector(flatcc_builder_t *B, size_t count); - -/** Similar to truncate_vector. */ -int flatcc_builder_truncate_offset_vector(flatcc_builder_t *B, size_t count); - -/** - * A specialized extend that pushes a single element. - * - * Returns the buffer holding a modifiable copy of the added content, - * or null on error. - */ -flatcc_builder_ref_t *flatcc_builder_offset_vector_push(flatcc_builder_t *B, - flatcc_builder_ref_t ref); - -/** - * Takes an array of refs as argument to do a multi push operation. - * - * Returns the buffer holding a modifiable copy of the added content, - * or null on error. - */ -flatcc_builder_ref_t *flatcc_builder_append_offset_vector(flatcc_builder_t *B, - const flatcc_builder_ref_t *refs, size_t count); - -/** - * All union vector operations are like offset vector operations, - * except they take a struct with a type and a reference rather than - * just a reference. The finished union vector is returned as a struct - * of two references, one for the type vector and one for the table offset - * vector. Each reference goes to a separate table field where the type - * offset vector id must be one larger than the type vector. - */ - -/** - * Creates a union vector which is in reality two vectors, a type vector - * and an offset vector. Both vectors references are returned. - */ -flatcc_builder_union_vec_ref_t flatcc_builder_create_union_vector(flatcc_builder_t *B, - const flatcc_builder_union_ref_t *urefs, size_t count); - -/* - * NOTE: this call takes non-const source array of references - * and destroys the content. The type array remains intact. - * - * This is a faster version of `create_union_vector` where the source - * references are destroyed and where the types are given in a separate - * array. In return the vector can be emitted directly without passing - * over the stack. - * - * Unlike `create_offset_vector` we do allow null references but only if - * the union type is NONE (0). - */ -flatcc_builder_union_vec_ref_t flatcc_builder_create_union_vector_direct(flatcc_builder_t *B, - const flatcc_builder_utype_t *types, flatcc_builder_ref_t *data, size_t count); - -/* - * Creates just the type vector part of a union vector. This is - * similar to a normal `create_vector` call except that the size - * and alignment are given implicitly. Can be used during - * cloning or similar operations where the types are all given - * but the values must be handled one by one as prescribed by - * the type. The values can be added separately as an offset vector. - */ -flatcc_builder_ref_t flatcc_builder_create_type_vector(flatcc_builder_t *B, - const flatcc_builder_utype_t *types, size_t count); - -/** - * Starts a vector holding types and offsets to tables or strings. Before - * completion it will hold `flatcc_builder_union_ref_t` references because the - * offset is not known until the vector start location is known, which - * depends to the final size, which for parsers is generally unknown, - * and also because the union type must be separated out into a separate - * vector. It would not be practicaly to push on two different vectors - * during construction. - */ -int flatcc_builder_start_union_vector(flatcc_builder_t *B); - -/** - * Similar to `end_vector` but updates all stored references so they - * become offsets to the vector start and splits the union references - * into a type vector and an offset vector. - */ -flatcc_builder_union_vec_ref_t flatcc_builder_end_union_vector(flatcc_builder_t *B); - -/** Returns the number of elements currently on the stack. */ -size_t flatcc_builder_union_vector_count(flatcc_builder_t *B); - -/** - * Returns a pointer ot the first vector element on stack, - * accessible up to the number of elements currently on stack. - */ -void *flatcc_builder_union_vector_edit(flatcc_builder_t *B); - -/** - * Similar to `extend_offset_vector` but returns a buffer indexable as a - * `flatcc_builder_union_ref_t` array. All elements must be set to a valid - * unique non-null reference with a valid union type to match, or it - * must be null with a zero union type. - */ -flatcc_builder_union_ref_t *flatcc_builder_extend_union_vector(flatcc_builder_t *B, size_t count); - -/** Similar to truncate_vector. */ -int flatcc_builder_truncate_union_vector(flatcc_builder_t *B, size_t count); - -/** - * A specialized extend that pushes a single element. - * - * Returns the buffer holding a modifiable copy of the added content, - * or null on error. - */ -flatcc_builder_union_ref_t *flatcc_builder_union_vector_push(flatcc_builder_t *B, - flatcc_builder_union_ref_t uref); - -/** - * Takes an array of union_refs as argument to do a multi push operation. - * - * Returns the buffer holding a modifiable copy of the added content, - * or null on error. - */ -flatcc_builder_union_ref_t *flatcc_builder_append_union_vector(flatcc_builder_t *B, - const flatcc_builder_union_ref_t *urefs, size_t count); - -/** - * Faster string operation that avoids temporary stack storage. The - * string is not required to be zero-terminated, but is expected - * (unchecked) to be utf-8. Embedded zeroes would be allowed but - * ubyte vectors should be used for that. The resulting string will - * have a zero termination added, not included in length. - */ -flatcc_builder_ref_t flatcc_builder_create_string(flatcc_builder_t *B, - const char *s, size_t len); - -/** `create_string` up to zero termination of source. */ -flatcc_builder_ref_t flatcc_builder_create_string_str(flatcc_builder_t *B, - const char *s); - -/** - * `create_string` up to zero termination or at most max_len of source. - * - * Note that like `strncpy` it will include `max_len` characters if - * the source is longer than `max_len`, but unlike `strncpy` it will - * always add zero termination. - */ -flatcc_builder_ref_t flatcc_builder_create_string_strn(flatcc_builder_t *B, const char *s, size_t max_len); - -/** - * Starts an empty string that can be extended subsequently. - * - * While the string is being created, it is guaranteed that there is - * always a null character after the end of the current string length. - * This also holds after `extend` and `append` operations. It is not - * allowed to modify the null character. - * - * Returns 0 on success. - */ -int flatcc_builder_start_string(flatcc_builder_t *B); - -/** - * Similar to `extend_vector` except for the buffer return type and a - * slight speed advantage. Strings are expected to contain utf-8 content - * but this isn't verified, and null characters would be accepted. The - * length is given in bytes. - * - * Appending too much, then truncating can be used to trim string - * escapes during parsing, or convert between unicode formats etc. - */ -char *flatcc_builder_extend_string(flatcc_builder_t *B, size_t len); - -/** - * Concatenes a length of string. If the string contains zeroes (which - * it formally shouldn't), they will be copied in. - * - * Returns the buffer holding a modifiable copy of the added content, - * or null on error. - */ -char *flatcc_builder_append_string(flatcc_builder_t *B, const char *s, size_t len); - -/** `append_string` up to zero termination of source. */ -char *flatcc_builder_append_string_str(flatcc_builder_t *B, const char *s); - -/** `append_string` up zero termination or at most max_len of source. */ -char *flatcc_builder_append_string_strn(flatcc_builder_t *B, const char *s, size_t max_len); - -/** - * Similar to `truncate_vector` available for consistency and a slight - * speed advantage. Reduces string by `len` bytes - it does not set - * the length. The resulting length must not become negative. Zero - * termination is not counted. - * - * Returns -1 of the length becomes negative, 0 on success. - */ -int flatcc_builder_truncate_string(flatcc_builder_t *B, size_t len); - -/** - * Similar to `end_vector` but adds a trailing zero not included - * in the length. The trailing zero is added regardless of whatever - * zero content may exist in the provided string (although it - * formally should not contain any). - */ -flatcc_builder_ref_t flatcc_builder_end_string(flatcc_builder_t *B); - -/** Returns the length of string currently on the stack. */ -size_t flatcc_builder_string_len(flatcc_builder_t *B); - -/** - * Returns a ponter to the start of the string - * accessible up the length of string currently on the stack. - */ -char *flatcc_builder_string_edit(flatcc_builder_t *B); - - -/* - * Only for use with the default emitter. - * - * Fast acces to small buffers from default emitter. - * - * Only valid for default emitters before `flatcc_builder_clear`. The - * return buffer is not valid after a call to `flatcc_builder_reset` or - * `flatcc_builder_clear`. - * - * Returns null if the buffer size is too large to a have a linear - * memory representation or if the emitter is not the default. A valid - * size is between half and a full emitter page size depending on vtable - * content. - * - * Non-default emitters must be accessed by means specific to the - * particular emitter. - * - * If `size_out` is not null, it is set to the buffer size, or 0 if - * operation failed. - * - * The returned buffer should NOT be deallocated explicitly. - * - * The buffer size is the size reported by `flatcc_builder_get_buffer_size`. - */ -void *flatcc_builder_get_direct_buffer(flatcc_builder_t *B, size_t *size_out); - -/* - * Only for use with the default emitter. - * - * Default finalizer that allocates a buffer from the default emitter. - * - * Returns null if memory could not be allocated or if the emitter is - * not the default. This is just a convenience method - there are many - * other possible ways to extract the result of the emitter depending on - * use case. - * - * If `size_out` is not null, it is set to the buffer size, or 0 if - * operation failed. - * - * The allocated buffer is aligned according to malloc which may not be - * sufficient in advanced cases - for that purpose - * `flatcc_builder_finalize_aligned_buffer` may be used. - * - * It may be worth calling `flatcc_builder_get_direct_buffer` first to see - * if the buffer is small enough to avoid copying. - * - * The returned buffer must be deallocated using `free`. - */ -void *flatcc_builder_finalize_buffer(flatcc_builder_t *B, size_t *size_out); - -/* - * Only for use with the default emitter. - * - * Similar to `flatcc_builder_finalize_buffer` but ensures the returned - * memory is aligned to the overall alignment required for the buffer. - * Often it is not necessary unless special operations rely on larger - * alignments than the stored scalars. - * - * If `size_out` is not null, it is set to the buffer size, or 0 if - * operation failed. - * - * The returned buffer must be deallocated using `aligned_free` which is - * implemented via `flatcc_flatbuffers.h`. `free` will usually work but - * is not portable to platforms without posix_memalign or C11 - * aligned_alloc support. - * - * NOTE: if a library might be compiled with a version of aligned_free - * that differs from the application using it, use - * `flatcc_builder_aligned_free` to make sure the correct deallocation - * function is used. - */ -void *flatcc_builder_finalize_aligned_buffer(flatcc_builder_t *B, size_t *size_out); - -/* - * A stable implementation of `aligned_alloc` that is not sensitive - * to the applications compile time flags. - */ -void *flatcc_builder_aligned_alloc(size_t alignment, size_t size); - -/* - * A stable implementation of `aligned_free` that is not sensitive - * to the applications compile time flags. - */ -void flatcc_builder_aligned_free(void *p); - -/* - * Only for use with the default emitter. - * - * Convenience method to copy buffer from default emitter. Forwards - * call to default emitter and returns input pointer, or null if - * the emitter is not default or of the given size is smaller than - * the buffer size. - * - * Note: the `size` argument is the target buffers capacity, not the - * flatcc_builders buffer size. - * - * Other emitters have custom interfaces for reaching their content. - */ -void *flatcc_builder_copy_buffer(flatcc_builder_t *B, void *buffer, size_t size); - -#ifdef __cplusplus -} -#endif - -#endif /* FLATCC_BUILDER_H */ diff --git a/flatccrt/include/flatcc/flatcc_emitter.h b/flatccrt/include/flatcc/flatcc_emitter.h deleted file mode 100644 index 6216c51..0000000 --- a/flatccrt/include/flatcc/flatcc_emitter.h +++ /dev/null @@ -1,215 +0,0 @@ -#ifndef FLATCC_EMITTER_H -#define FLATCC_EMITTER_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Default implementation of a flatbuilder emitter. - * - * This may be used as a starting point for more advanced emitters, - * for example writing completed pages to disk or network and - * the recycling those pages. - */ - -#include -#include - -#include "flatcc/flatcc_types.h" -#include "flatcc/flatcc_iov.h" -#include "flatcc/flatcc_alloc.h" - -/* - * The buffer steadily grows during emission but the design allows for - * an extension where individual pages can recycled before the buffer - * is complete, for example because they have been transmitted. - * - * When done, the buffer can be cleared to free all memory, or reset to - * maintain an adaptive page pool for next buffer construction. - * - * Unlike an exponentially growing buffer, each buffer page remains - * stable in memory until reset, clear or recycle is called. - * - * Design notes for possible extensions: - * - * The buffer is a ring buffer marked by a front and a back page. The - * front and back may be the same page and may initially be absent. - * Anything outside these pages are unallocated pages for recycling. - * Any page between (but excluding) the front and back pages may be - * recycled by unlinking and relinking outside the front and back pages - * but then copy operations no longer makes sense. Each page stores the - * logical offset within the buffer but isn't otherwise used by the - * implemention - it might be used for network transmission. The buffer - * is not explicitly designed for multithreaded access but any page - * strictly between front and back is not touched unless recycled and in - * this case aligned allocation is useful to prevent cache line sharing. - */ - -/* - * Memory is allocated in fixed size page units - the first page is - * split between front and back so each get half the page size. If the - * size is a multiple of 128 then each page offset will be a multiple of - * 64, which may be useful for sequencing etc. - */ -#ifndef FLATCC_EMITTER_PAGE_SIZE -#define FLATCC_EMITTER_MAX_PAGE_SIZE 3000 -#define FLATCC_EMITTER_PAGE_MULTIPLE 64 -#define FLATCC_EMITTER_PAGE_SIZE ((FLATCC_EMITTER_MAX_PAGE_SIZE) &\ - ~(2 * (FLATCC_EMITTER_PAGE_MULTIPLE) - 1)) -#endif - -#ifndef FLATCC_EMITTER_ALLOC -#ifdef FLATCC_EMITTER_USE_ALIGNED_ALLOC -/* - * does not always provide aligned_alloc, so include whatever - * is required when enabling this feature. - */ -#define FLATCC_EMITTER_ALLOC(n) aligned_alloc(FLATCC_EMITTER_PAGE_MULTIPLE,\ - (((n) + FLATCC_EMITTER_PAGE_MULTIPLE - 1) & ~(FLATCC_EMITTER_PAGE_MULTIPLE - 1))) -#ifndef FLATCC_EMITTER_FREE -#define FLATCC_EMITTER_FREE(p) aligned_free(p) -#endif -#endif -#endif - -#ifndef FLATCC_EMITTER_ALLOC -#define FLATCC_EMITTER_ALLOC(n) FLATCC_ALLOC(n) -#endif -#ifndef FLATCC_EMITTER_FREE -#define FLATCC_EMITTER_FREE(p) FLATCC_FREE(p) -#endif - -typedef struct flatcc_emitter_page flatcc_emitter_page_t; -typedef struct flatcc_emitter flatcc_emitter_t; - -struct flatcc_emitter_page { - uint8_t page[FLATCC_EMITTER_PAGE_SIZE]; - flatcc_emitter_page_t *next; - flatcc_emitter_page_t *prev; - /* - * The offset is relative to page start, but not necessarily - * to any present content if part of front or back page, - * and undefined for unused pages. - */ - flatbuffers_soffset_t page_offset; -}; - -/* - * Must be allocated and zeroed externally, e.g. on the stack - * then provided as emit_context to the flatbuilder along - * with the `flatcc_emitter` function. - */ -struct flatcc_emitter { - flatcc_emitter_page_t *front, *back; - uint8_t *front_cursor; - size_t front_left; - uint8_t *back_cursor; - size_t back_left; - size_t used; - size_t capacity; - size_t used_average; -}; - -/* Optional helper to ensure emitter is zeroed initially. */ -static inline void flatcc_emitter_init(flatcc_emitter_t *E) -{ - memset(E, 0, sizeof(*E)); -} - -/* Deallocates all buffer memory making the emitter ready for next use. */ -void flatcc_emitter_clear(flatcc_emitter_t *E); - -/* - * Similar to `clear_flatcc_emitter` but heuristacally keeps some allocated - * memory between uses while gradually reducing peak allocations. - * For small buffers, a single page will remain available with no - * additional allocations or deallocations after first use. - */ -void flatcc_emitter_reset(flatcc_emitter_t *E); - -/* - * Helper function that allows a page between front and back to be - * recycled while the buffer is still being constructed - most likely as part - * of partial copy or transmission. Attempting to recycle front or back - * pages will result will result in an error. Recycling pages outside the - * front and back will be valid but pointless. After recycling and copy - * operations are no longer well-defined and should be replaced with - * whatever logic is recycling the pages. The reset operation - * automatically recycles all (remaining) pages when emission is - * complete. After recycling, the `flatcc_emitter_size` function will - * return as if recycle was not called, but will only represent the - * logical size, not the size of the active buffer. Because a recycled - * page is fully utilized, it is fairly easy to compensate for this if - * required. - * - * Returns 0 on success. - */ -int flatcc_emitter_recycle_page(flatcc_emitter_t *E, flatcc_emitter_page_t *p); - -/* - * The amount of data copied with `flatcc_emitter_copy_buffer` and related - * functions. Normally called at end of buffer construction but is - * always valid, as is the copy functions. The size is a direct - * function of the amount emitted data so the flatbuilder itself can - * also provide this information. - */ -static inline size_t flatcc_emitter_get_buffer_size(flatcc_emitter_t *E) -{ - return E->used; -} - -/* - * Returns buffer start iff the buffer fits on a single internal page. - * Only useful for fairly small buffers - about half the page size since - * one half of first page goes to vtables that likely use little space. - * Returns null if request could not be served. - * - * If `size_out` is not null, it is set to the buffer size, or 0 if - * operation failed. - */ -static inline void *flatcc_emitter_get_direct_buffer(flatcc_emitter_t *E, size_t *size_out) -{ - if (E->front == E->back) { - if (size_out) { - *size_out = E->used; - } - return E->front_cursor; - } - if (size_out) { - *size_out = 0; - } - return 0; -} - -/* - * Copies the internal flatcc_emitter representation to an externally - * provided linear buffer that must have size `flatcc_emitter_get_size`. - * - * If pages have been recycled, only the remaining pages will be copied - * and thus less data than what `flatcc_emitter_get_size` would suggest. It - * makes more sense to provide a customized copy operation when - * recycling pages. - * - * If the buffer is too small, nothing is copied, otherwise the - * full buffer is copied and the input buffer is returned. - */ -void *flatcc_emitter_copy_buffer(flatcc_emitter_t *E, void *buf, size_t size); - -/* - * The emitter interface function to the flatbuilder API. - * `emit_context` should be of type `flatcc_emitter_t` for this - * particular implementation. - * - * This function is compatible with the `flatbuilder_emit_fun` - * type defined in "flatbuilder.h". - */ -int flatcc_emitter(void *emit_context, - const flatcc_iovec_t *iov, int iov_count, - flatbuffers_soffset_t offset, size_t len); - -#ifdef __cplusplus -} -#endif - -#endif /* FLATCC_EMITTER_H */ diff --git a/flatccrt/include/flatcc/flatcc_endian.h b/flatccrt/include/flatcc/flatcc_endian.h deleted file mode 100644 index 0592f31..0000000 --- a/flatccrt/include/flatcc/flatcc_endian.h +++ /dev/null @@ -1,125 +0,0 @@ -#ifndef FLATCC_ENDIAN_H -#define FLATCC_ENDIAN_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * This file provides helper macros to define type-specific macros and - * inline functions that convert between stored data and native data - * indedpently of both native (host) endianness and protocol endianness - * (i.e. the serialized endian format). - * - * To detect endianness correctly ensure one of the following is defined. - * - * __LITTLE_ENDIAN__ - * __BIG_ENDIAN__ - * FLATBUFFERS_LITTLEENDIAN=1 - * FLATBUFFERS_LITTLEENDIAN=0 - * - * Note: the Clang compiler likely already does this, but other - * compilers may have their own way, if at all. - * - * It is also necessary to include or a compatible - * implementation in order to provide: - * - * le16toh, le32to, le64toh, be16toh, be32toh, be64toh, - * htole16, htole32, htole64, htobe16, htobe32, htobe64. - * - * A simple way to ensure all of the above for most platforms is - * to include the portable endian support file: - * - * #include "flatcc/portable/pendian.h" - * - * It is also necessary to include - * - * #include "flatcc/flatcc_types.h" - * - * or an equivalent file. This makes it possible to change the - * endianness of the serialized data and the sizes of flatbuffer - * specific types such as `uoffset_t`. - * - * Note: the mentioned include files are likely already included - * by the file including this file, at least for the default - * configuration. - */ - -#ifndef UINT8_t -#include -#endif - -/* These are needed to simplify accessor macros and are not found in . */ -#ifndef le8toh -#define le8toh(n) (n) -#endif - -#ifndef be8toh -#define be8toh(n) (n) -#endif - -#ifndef htole8 -#define htole8(n) (n) -#endif - -#ifndef htobe8 -#define htobe8(n) (n) -#endif - -#include "flatcc/flatcc_accessors.h" - -/* This is the binary encoding endianness, usually LE for flatbuffers. */ -#if FLATBUFFERS_PROTOCOL_IS_LE -#define flatbuffers_endian le -#elif FLATBUFFERS_PROTOCOL_IS_BE -#define flatbuffers_endian be -#else -#error "flatbuffers has no defined endiannesss" -#endif - - __flatcc_define_basic_scalar_accessors(flatbuffers_, flatbuffers_endian) - - __flatcc_define_integer_accessors(flatbuffers_bool, flatbuffers_bool_t, - FLATBUFFERS_BOOL_WIDTH, flatbuffers_endian) - __flatcc_define_integer_accessors(flatbuffers_union_type, flatbuffers_union_type_t, - FLATBUFFERS_UTYPE_WIDTH, flatbuffers_endian) - - __flatcc_define_integer_accessors(__flatbuffers_uoffset, flatbuffers_uoffset_t, - FLATBUFFERS_UOFFSET_WIDTH, flatbuffers_endian) - __flatcc_define_integer_accessors(__flatbuffers_soffset, flatbuffers_soffset_t, - FLATBUFFERS_SOFFSET_WIDTH, flatbuffers_endian) - __flatcc_define_integer_accessors(__flatbuffers_voffset, flatbuffers_voffset_t, - FLATBUFFERS_VOFFSET_WIDTH, flatbuffers_endian) - __flatcc_define_integer_accessors(__flatbuffers_utype, flatbuffers_utype_t, - FLATBUFFERS_UTYPE_WIDTH, flatbuffers_endian) - __flatcc_define_integer_accessors(__flatbuffers_thash, flatbuffers_thash_t, - FLATBUFFERS_THASH_WIDTH, flatbuffers_endian) - -/* flatcc/portable/pendian.h sets LITTLE/BIG flags if possible, and always defines le16toh. */ -#ifndef flatbuffers_is_native_pe -#if defined(__LITTLE_ENDIAN__) || FLATBUFFERS_LITTLEENDIAN -#undef FLATBUFFERS_LITTLEENDIAN -#define FLATBUFFERS_LITTLEENDIAN 1 -#define flatbuffers_is_native_pe() (FLATBUFFERS_PROTOCOL_IS_LE) -#elif defined(__BIG_ENDIAN__) || (defined(FLATBUFFERS_LITTLEENDIAN) && !FLATBUFFERS_LITTLEENDIAN) -#undef FLATBUFFERS_LITTLEENDIAN -#define FLATBUFFERS_LITTLEENDIAN 0 -#define flatbuffers_is_native_pe() (FLATBUFFERS_PROTOCOL_IS_BE) -#else -#define flatbuffers_is_native_pe() (__FLATBUFFERS_CONCAT(flatbuffers_endian, 16toh)(1) == 1) -#endif -#endif - -#ifndef flatbuffers_is_native_le -#define flatbuffers_is_native_le() flatbuffers_is_native_pe() -#endif - -#ifndef flatbuffers_is_native_be -#define flatbuffers_is_native_be() (!flatbuffers_is_native_pe()) -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* FLATCC_ENDIAN_H */ diff --git a/flatccrt/include/flatcc/flatcc_epilogue.h b/flatccrt/include/flatcc/flatcc_epilogue.h deleted file mode 100644 index 496857b..0000000 --- a/flatccrt/include/flatcc/flatcc_epilogue.h +++ /dev/null @@ -1,8 +0,0 @@ -/* Include guard intentionally left out. */ - -#ifdef __cplusplus -} -#endif - -#include "flatcc/portable/pdiagnostic_pop.h" - diff --git a/flatccrt/include/flatcc/flatcc_flatbuffers.h b/flatccrt/include/flatcc/flatcc_flatbuffers.h deleted file mode 100644 index d77d264..0000000 --- a/flatccrt/include/flatcc/flatcc_flatbuffers.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Even C11 compilers depend on clib support for `static_assert` which - * isn't always present, so we deal with this here for all compilers. - * - * Outside include guard to handle scope counter. - */ -#include "flatcc/portable/pstatic_assert.h" - -#ifndef FLATCC_FLATBUFFERS_H -#define FLATCC_FLATBUFFERS_H - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef flatcc_flatbuffers_defined -#define flatcc_flatbuffers_defined - -#ifdef FLATCC_PORTABLE -#include "flatcc/flatcc_portable.h" -#endif -#include "flatcc/portable/pwarnings.h" -/* Needed by C99 compilers without FLATCC_PORTABLE. */ -#include "flatcc/portable/pstdalign.h" - -#include "flatcc/flatcc_alloc.h" - -#define __FLATBUFFERS_PASTE2(a, b) a ## b -#define __FLATBUFFERS_PASTE3(a, b, c) a ## b ## c -#define __FLATBUFFERS_CONCAT(a, b) __FLATBUFFERS_PASTE2(a, b) - -/* - * "flatcc_endian.h" requires the preceeding include files, - * or compatible definitions. - */ -#include "flatcc/portable/pendian.h" -#include "flatcc/flatcc_types.h" -#include "flatcc/flatcc_endian.h" -#include "flatcc/flatcc_identifier.h" - -#ifndef FLATBUFFERS_WRAP_NAMESPACE -#define FLATBUFFERS_WRAP_NAMESPACE(ns, x) ns ## _ ## x -#endif - -#endif /* flatcc_flatbuffers_defined */ - -#ifdef __cplusplus -} -#endif - -#endif /* FLATCC_FLATBUFFERS_H */ diff --git a/flatccrt/include/flatcc/flatcc_identifier.h b/flatccrt/include/flatcc/flatcc_identifier.h deleted file mode 100644 index 2b7f8bf..0000000 --- a/flatccrt/include/flatcc/flatcc_identifier.h +++ /dev/null @@ -1,144 +0,0 @@ -#ifndef FLATCC_IDENTIFIER_H -#define FLATCC_IDENTIFIER_H - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef FLATCC_FLATBUFFERS_H -#error "include via flatcc/flatcc_flatbuffers.h" -#endif - -/* - * FlatBuffers identifiers are normally specified by "file_identifer" in - * the schema, but a standard hash of the fully qualified type name can - * also be used. This file implements such a mapping, but the generated - * headers also contain the necessary information for known types. - */ - - -/* - * Returns the type hash of a given name in native endian format. - * Generated code already provides these, but if a name was changed - * in the schema it may be relevant to recompute the hash manually. - * - * The wire-format of this value should always be little endian. - * - * Note: this must be the fully qualified name, e.g. in the namespace - * "MyGame.Example": - * - * flatbuffers_type_hash_from_name("MyGame.Example.Monster"); - * - * or, in the global namespace just: - * - * flatbuffers_type_hash_from_name("MyTable"); - * - * This assumes 32 bit hash type. For other sizes, other FNV-1a - * constants would be required. - * - * Note that we reserve hash value 0 for missing or ignored value. - */ -static inline flatbuffers_thash_t flatbuffers_type_hash_from_name(const char *name) -{ - uint32_t hash = 2166136261UL; - while (*name) { - hash ^= (uint32_t)*name; - hash = hash * 16777619UL; - ++name; - } - if (hash == 0) { - hash = 2166136261UL; - } - return hash; -} - -/* - * Type hash encoded as little endian file identifier string. - * Note: if type hash is 0, the identifier should be null which - * we cannot return in this interface. - */ -static inline void flatbuffers_identifier_from_type_hash(flatbuffers_thash_t type_hash, flatbuffers_fid_t out_identifier) -{ - out_identifier[0] = type_hash & 0xff; - type_hash >>= 8; - out_identifier[1] = type_hash & 0xff; - type_hash >>= 8; - out_identifier[2] = type_hash & 0xff; - type_hash >>= 8; - out_identifier[3] = type_hash & 0xff; -} - -/* Native integer encoding of file identifier. */ -static inline flatbuffers_thash_t flatbuffers_type_hash_from_identifier(const flatbuffers_fid_t identifier) -{ - uint8_t *p = (uint8_t *)identifier; - - return identifier ? - (uint32_t)p[0] + (((uint32_t)p[1]) << 8) + (((uint32_t)p[2]) << 16) + (((uint32_t)p[3]) << 24) : 0; -} - -/* - * Convert a null terminated string identifier like "MONS" or "X" into a - * native type hash identifier, usually for comparison. This will not - * work with type hash strings because they can contain null bytes. - */ -static inline flatbuffers_thash_t flatbuffers_type_hash_from_string(const char *identifier) -{ - flatbuffers_thash_t h = 0; - const uint8_t *p = (const uint8_t *)identifier; - - if (!p[0]) return h; - h += ((flatbuffers_thash_t)p[0]); - if (!p[1]) return h; - h += ((flatbuffers_thash_t)p[1]) << 8; - if (!p[2]) return h; - h += ((flatbuffers_thash_t)p[2]) << 16; - /* No need to test for termination here. */ - h += ((flatbuffers_thash_t)p[3]) << 24; - return h; -} - -/* - * Computes the little endian wire format of the type hash. It can be - * used as a file identifer argument to various flatcc buffer calls. - * - * `flatbuffers_fid_t` is just `char [4]` for the default flatbuffers - * type system defined in `flatcc/flatcc_types.h`. - */ -static inline void flatbuffers_identifier_from_name(const char *name, flatbuffers_fid_t out_identifier) -{ - flatbuffers_identifier_from_type_hash(flatbuffers_type_hash_from_name(name), out_identifier); -} - -/* - * This is a collision free hash (a permutation) of the type hash to - * provide better distribution for use in hash tables. It is likely not - * necessary in praxis, and for uniqueness of identifiers it provides no - * advantage over just using the FNV-1a type hash, except when truncating - * the identifier to less than 32-bits. - * - * Note: the output should not be used in transmission. It provides no - * additional information and just complicates matters. Furthermore, the - * unmodified type hash has the benefit that it can seed a child namespace. - */ -static inline uint32_t flatbuffers_disperse_type_hash(flatbuffers_thash_t type_hash) -{ - /* http://stackoverflow.com/a/12996028 */ - uint32_t x = type_hash; - - x = ((x >> 16) ^ x) * 0x45d9f3bUL; - x = ((x >> 16) ^ x) * 0x45d9f3bUL; - x = ((x >> 16) ^ x); - return x; -} - - -/* We have hardcoded assumptions about identifier size. */ -static_assert(sizeof(flatbuffers_fid_t) == 4, "unexpected file identifier size"); -static_assert(sizeof(flatbuffers_thash_t) == 4, "unexpected type hash size"); - -#ifdef __cplusplus -} -#endif - -#endif /* FLATCC_IDENTIFIER_H */ diff --git a/flatccrt/include/flatcc/flatcc_iov.h b/flatccrt/include/flatcc/flatcc_iov.h deleted file mode 100644 index a6d27f8..0000000 --- a/flatccrt/include/flatcc/flatcc_iov.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef FLATCC_IOV_H -#define FLATCC_IOV_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -/* - * The emitter receives one, or a few buffers at a time via - * this type. compatible iovec structure used for - * allocation and emitter interface. - */ -typedef struct flatcc_iovec flatcc_iovec_t; -struct flatcc_iovec { - void *iov_base; - size_t iov_len; -}; - -/* - * The largest iovec vector the builder will issue. It will - * always be a relatively small number. - */ -#define FLATCC_IOV_COUNT_MAX 8 - -#ifdef __cplusplus -} -#endif - -#endif /* FLATCC_IOV_H */ diff --git a/flatccrt/include/flatcc/flatcc_json_parser.h b/flatccrt/include/flatcc/flatcc_json_parser.h deleted file mode 100644 index 3d3e063..0000000 --- a/flatccrt/include/flatcc/flatcc_json_parser.h +++ /dev/null @@ -1,896 +0,0 @@ -#ifndef FLATCC_JSON_PARSE_H -#define FLATCC_JSON_PARSE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * JSON RFC: - * http://www.ietf.org/rfc/rfc4627.txt?number=4627 - * - * With several flatbuffers specific extensions. - */ - -#include -#include -#include - -#include "flatcc/flatcc_rtconfig.h" -#include "flatcc/flatcc_builder.h" -#include "flatcc/flatcc_unaligned.h" - -#define PDIAGNOSTIC_IGNORE_UNUSED -#include "flatcc/portable/pdiagnostic_push.h" - -enum flatcc_json_parser_flags { - flatcc_json_parser_f_skip_unknown = 1, - flatcc_json_parser_f_force_add = 2, - flatcc_json_parser_f_with_size = 4, - flatcc_json_parser_f_skip_array_overflow = 8, - flatcc_json_parser_f_reject_array_underflow = 16 -}; - -#define FLATCC_JSON_PARSE_ERROR_MAP(XX) \ - XX(ok, "ok") \ - XX(eof, "eof") \ - XX(deep_nesting, "deep nesting") \ - XX(trailing_comma, "trailing comma") \ - XX(expected_colon, "expected colon") \ - XX(unexpected_character, "unexpected character") \ - XX(invalid_numeric, "invalid numeric") \ - XX(overflow, "overflow") \ - XX(underflow, "underflow") \ - XX(unbalanced_array, "unbalanced array") \ - XX(unbalanced_object, "unbalanced object") \ - XX(precision_loss, "precision loss") \ - XX(float_unexpected, "float unexpected") \ - XX(unknown_symbol, "unknown symbol") \ - XX(unquoted_symbolic_list, "unquoted list of symbols") \ - XX(unknown_union, "unknown union type") \ - XX(expected_string, "expected string") \ - XX(invalid_character, "invalid character") \ - XX(invalid_escape, "invalid escape") \ - XX(invalid_type, "invalid type") \ - XX(unterminated_string, "unterminated string") \ - XX(expected_object, "expected object") \ - XX(expected_array, "expected array") \ - XX(expected_scalar, "expected literal or symbolic scalar") \ - XX(expected_union_type, "expected union type") \ - XX(union_none_present, "union present with type NONE") \ - XX(union_none_not_null, "union of type NONE is not null") \ - XX(union_incomplete, "table has incomplete union") \ - XX(duplicate, "table has duplicate field") \ - XX(required, "required field missing") \ - XX(union_vector_length, "union vector length mismatch") \ - XX(base64, "invalid base64 content") \ - XX(base64url, "invalid base64url content") \ - XX(array_underflow, "fixed size array underflow") \ - XX(array_overflow, "fixed size array overflow") \ - XX(runtime, "runtime error") \ - XX(not_supported, "not supported") - -enum flatcc_json_parser_error_no { -#define XX(no, str) flatcc_json_parser_error_##no, - FLATCC_JSON_PARSE_ERROR_MAP(XX) -#undef XX -}; - -const char *flatcc_json_parser_error_string(int err); - -#define flatcc_json_parser_ok flatcc_json_parser_error_ok -#define flatcc_json_parser_eof flatcc_json_parser_error_eof - -/* - * The struct may be zero initialized in which case the line count will - * start at line zero, or the line may be set to 1 initially. The ctx - * is only used for error reporting and tracking non-standard unquoted - * ctx. - * - * `ctx` may for example hold a flatcc_builder_t pointer. - */ -typedef struct flatcc_json_parser_ctx flatcc_json_parser_t; -struct flatcc_json_parser_ctx { - flatcc_builder_t *ctx; - const char *line_start; - int flags; -#if FLATCC_JSON_PARSE_ALLOW_UNQUOTED - int unquoted; -#endif - - int line, pos; - int error; - const char *start; - const char *end; - const char *error_loc; - /* Set at end of successful parse. */ - const char *end_loc; -}; - -static inline int flatcc_json_parser_get_error(flatcc_json_parser_t *ctx) -{ - return ctx->error; -} - -static inline void flatcc_json_parser_init(flatcc_json_parser_t *ctx, flatcc_builder_t *B, const char *buf, const char *end, int flags) -{ - memset(ctx, 0, sizeof(*ctx)); - ctx->ctx = B; - ctx->line_start = buf; - ctx->line = 1; - ctx->flags = flags; - /* These are not needed for parsing, but may be helpful in reporting etc. */ - ctx->start = buf; - ctx->end = end; - ctx->error_loc = buf; -} - -const char *flatcc_json_parser_set_error(flatcc_json_parser_t *ctx, const char *loc, const char *end, int reason); - -/* - * Wide space is not necessarily beneficial in the typical space, but it - * also isn't expensive so it may be added when there are applications - * that can benefit. - */ -const char *flatcc_json_parser_space_ext(flatcc_json_parser_t *ctx, const char *buf, const char *end); - -static inline const char *flatcc_json_parser_space(flatcc_json_parser_t *ctx, const char *buf, const char *end) -{ - if (end - buf > 1) { - if (buf[0] > 0x20) { - return buf; - } - if (buf[0] == 0x20 && buf[1] > 0x20) { - return buf + 1; - } - } - return flatcc_json_parser_space_ext(ctx, buf, end); -} - - -static inline const char *flatcc_json_parser_string_start(flatcc_json_parser_t *ctx, const char *buf, const char *end) -{ - if (buf == end || *buf != '\"') { - return flatcc_json_parser_set_error(ctx, buf, end, flatcc_json_parser_error_expected_string); - } - return ++buf; -} - -static inline const char *flatcc_json_parser_string_end(flatcc_json_parser_t *ctx, const char *buf, const char *end) -{ - if (buf == end || *buf != '\"') { - return flatcc_json_parser_set_error(ctx, buf, end, flatcc_json_parser_error_unterminated_string); - } - return ++buf; -} - -/* - * Parse a string as a fixed size char array as `s` with length `n`. - * and raise errors according to overflow/underflow runtime flags. Zero - * and truncate as needed. A trailing zero is not inserted if the input - * is at least the same length as the char array. - * - * Runtime flags: `skip_array_overflow`, `pad_array_underflow`. - */ -const char *flatcc_json_parser_char_array(flatcc_json_parser_t *ctx, - const char *buf, const char *end, char *s, size_t n); - -/* - * Creates a string. Returns *ref == 0 on unrecoverable error or - * sets *ref to a valid new string reference. - */ -const char *flatcc_json_parser_build_string(flatcc_json_parser_t *ctx, - const char *buf, const char *end, flatcc_builder_ref_t *ref); - -typedef char flatcc_json_parser_escape_buffer_t[5]; -/* - * If the buffer does not hold a valid escape sequence, an error is - * returned with code[0] = 0/ - * - * Otherwise code[0] the length (1-4) of the remaining - * characters in the code, transcoded from the escape sequence - * where a length of 4 only happens with escapaped surrogate pairs. - * - * The JSON extension `\xXX` is supported and may produced invalid UTF-8 - * characters such as 0xff. The standard JSON escape `\uXXXX` is not - * checked for invalid code points and may produce invalid UTF-8. - * - * Regular characters are expected to valid UTF-8 but they are not checked - * and may therefore produce invalid UTF-8. - * - * Control characters within a string are rejected except in the - * standard JSON escpaped form for `\n \r \t \b \f`. - * - * Additional escape codes as per standard JSON: `\\ \/ \"`. - */ -const char *flatcc_json_parser_string_escape(flatcc_json_parser_t *ctx, const char *buf, const char *end, flatcc_json_parser_escape_buffer_t code); - -/* - * Parses the longest unescaped run of string content followed by either - * an escape encoding, string termination, or error. - */ -const char *flatcc_json_parser_string_part(flatcc_json_parser_t *ctx, const char *buf, const char *end); - -static inline const char *flatcc_json_parser_symbol_start(flatcc_json_parser_t *ctx, const char *buf, const char *end) -{ - if (buf == end) { - return buf; - } - if (*buf == '\"') { - ++buf; -#if FLATCC_JSON_PARSE_ALLOW_UNQUOTED - ctx->unquoted = 0; -#endif - } else { -#if FLATCC_JSON_PARSE_ALLOW_UNQUOTED - if (*buf == '.') { - return flatcc_json_parser_set_error(ctx, buf, end, flatcc_json_parser_error_unexpected_character); - } - ctx->unquoted = 1; -#else - return flatcc_json_parser_set_error(ctx, buf, end, flatcc_json_parser_error_unexpected_character); -#endif - } - return buf; -} - -static inline uint64_t flatcc_json_parser_symbol_part_ext(const char *buf, const char *end) -{ - uint64_t w = 0; - size_t n = end - buf; - - if (n > 8) { - n = 8; - } - /* This can bloat inlining for a rarely executed case. */ -#if 1 - /* Fall through comments needed to silence gcc 7 warnings. */ - switch (n) { - case 8: w |= ((uint64_t)buf[7]) << (0 * 8); - /* Fall through */ - case 7: w |= ((uint64_t)buf[6]) << (1 * 8); - /* Fall through */ - case 6: w |= ((uint64_t)buf[5]) << (2 * 8); - /* Fall through */ - case 5: w |= ((uint64_t)buf[4]) << (3 * 8); - /* Fall through */ - case 4: w |= ((uint64_t)buf[3]) << (4 * 8); - /* Fall through */ - case 3: w |= ((uint64_t)buf[2]) << (5 * 8); - /* Fall through */ - case 2: w |= ((uint64_t)buf[1]) << (6 * 8); - /* Fall through */ - case 1: w |= ((uint64_t)buf[0]) << (7 * 8); - /* Fall through */ - case 0: - break; - } -#else - /* But this is hardly much of an improvement. */ - { - size_t i; - for (i = 0; i < n; ++i) { - w <<= 8; - if (i < n) { - w = buf[i]; - } - } - } -#endif - return w; -} - -/* - * Read out string as a big endian word. This allows for trie lookup, - * also when trailing characters are beyond keyword. This assumes the - * external words tested against are valid and therefore there need be - * no checks here. If a match is not made, the symbol_end function will - * consume and check any unmatched content - from _before_ this function - * was called - i.e. the returned buffer is tentative for use only if we - * accept the part returned here. - * - * Used for both symbols and symbolic constants. - */ -static inline uint64_t flatcc_json_parser_symbol_part(const char *buf, const char *end) -{ - size_t n = end - buf; - -#if FLATCC_ALLOW_UNALIGNED_ACCESS - if (n >= 8) { - return be64toh(*(uint64_t *)buf); - } -#endif - return flatcc_json_parser_symbol_part_ext(buf, end); -} - -/* Don't allow space in dot notation neither inside nor outside strings. */ -static inline const char *flatcc_json_parser_match_scope(flatcc_json_parser_t *ctx, const char *buf, const char *end, int pos) -{ - const char *mark = buf; - - (void)ctx; - - if (end - buf <= pos) { - return mark; - } - if (buf[pos] != '.') { - return mark; - } - return buf + pos + 1; -} - -const char *flatcc_json_parser_match_constant(flatcc_json_parser_t *ctx, const char *buf, const char *end, int pos, int *more); - -/* We allow '.' in unquoted symbols, but not at the start or end. */ -static inline const char *flatcc_json_parser_symbol_end(flatcc_json_parser_t *ctx, const char *buf, const char *end) -{ - char c, clast = 0; - - -#if FLATCC_JSON_PARSE_ALLOW_UNQUOTED - if (ctx->unquoted) { - while (buf != end && *buf > 0x20) { - clast = c = *buf; - if (c == '_' || c == '.' || (c & 0x80) || (c >= '0' && c <= '9')) { - ++buf; - continue; - } - /* Lower case. */ - c |= 0x20; - if (c >= 'a' && c <= 'z') { - ++buf; - continue; - } - break; - } - if (clast == '.') { - return flatcc_json_parser_set_error(ctx, buf, end, flatcc_json_parser_error_unexpected_character); - } - } else { -#else - { -#endif - while (buf != end && *buf != '\"') { - if (*buf == '\\') { - if (end - buf < 2) { - break; - } - ++buf; - } - ++buf; - } - if (buf == end || *buf != '\"') { - return flatcc_json_parser_set_error(ctx, buf, end, flatcc_json_parser_error_unterminated_string); - } - ++buf; - } - return buf; -} - -static inline const char *flatcc_json_parser_constant_start(flatcc_json_parser_t *ctx, const char *buf, const char *end) -{ - buf = flatcc_json_parser_symbol_start(ctx, buf, end); -#if FLATCC_JSON_PARSE_ALLOW_UNQUOTED - if (!ctx->unquoted) { -#else - { -#endif - buf = flatcc_json_parser_space(ctx, buf, end); - } - return buf; -} - -static inline const char *flatcc_json_parser_object_start(flatcc_json_parser_t *ctx, const char *buf, const char *end, int *more) -{ - if (buf == end || *buf != '{') { - *more = 0; - return flatcc_json_parser_set_error(ctx, buf, end, flatcc_json_parser_error_expected_object); - } - buf = flatcc_json_parser_space(ctx, buf + 1, end); - if (buf != end && *buf == '}') { - *more = 0; - return flatcc_json_parser_space(ctx, buf + 1, end); - } - *more = 1; - return buf; -} - -static inline const char *flatcc_json_parser_object_end(flatcc_json_parser_t *ctx, const char *buf, - const char *end, int *more) -{ - buf = flatcc_json_parser_space(ctx, buf, end); - if (buf == end) { - *more = 0; - return buf; - } - if (*buf != ',') { - *more = 0; - if (*buf != '}') { - return flatcc_json_parser_set_error(ctx, buf, end, flatcc_json_parser_error_unbalanced_object); - } else { - return flatcc_json_parser_space(ctx, buf + 1, end); - } - } - buf = flatcc_json_parser_space(ctx, buf + 1, end); - if (buf == end) { - *more = 0; - return flatcc_json_parser_set_error(ctx, buf, end, flatcc_json_parser_error_unbalanced_object); - } -#if FLATCC_JSON_PARSE_ALLOW_TRAILING_COMMA - if (*buf == '}') { - *more = 0; - return flatcc_json_parser_space(ctx, buf + 1, end); - } -#endif - *more = 1; - return buf; -} - -static inline const char *flatcc_json_parser_array_start(flatcc_json_parser_t *ctx, const char *buf, const char *end, int *more) -{ - if (buf == end || *buf != '[') { - *more = 0; - return flatcc_json_parser_set_error(ctx, buf, end, flatcc_json_parser_error_expected_array); - } - buf = flatcc_json_parser_space(ctx, buf + 1, end); - if (buf != end && *buf == ']') { - *more = 0; - return flatcc_json_parser_space(ctx, buf + 1, end); - } - *more = 1; - return buf; -} - -static inline const char *flatcc_json_parser_array_end(flatcc_json_parser_t *ctx, const char *buf, - const char *end, int *more) -{ - buf = flatcc_json_parser_space(ctx, buf, end); - if (buf == end) { - *more = 0; - return buf; - } - if (*buf != ',') { - *more = 0; - if (*buf != ']') { - return flatcc_json_parser_set_error(ctx, buf, end, flatcc_json_parser_error_unbalanced_array); - } else { - return flatcc_json_parser_space(ctx, buf + 1, end); - } - } - buf = flatcc_json_parser_space(ctx, buf + 1, end); - if (buf == end) { - *more = 0; - return flatcc_json_parser_set_error(ctx, buf, end, flatcc_json_parser_error_unbalanced_array); - } -#if FLATCC_JSON_PARSE_ALLOW_TRAILING_COMMA - if (*buf == ']') { - *more = 0; - return flatcc_json_parser_space(ctx, buf + 1, end); - } -#endif - *more = 1; - return buf; -} - -/* - * Detects if a symbol terminates at a given `pos` relative to the - * buffer pointer, or return fast. - * - * Failure to match is not an error but a recommendation to try - * alternative longer suffixes - only if such do not exist will - * there be an error. If a match was not eventually found, - * the `flatcc_json_parser_unmatched_symbol` should be called to consume - * the symbol and generate error messages. - * - * If a match was detected, ':' and surrounding space is consumed, - * or an error is generated. - */ -static inline const char *flatcc_json_parser_match_symbol(flatcc_json_parser_t *ctx, const char *buf, - const char *end, int pos) -{ - const char *mark = buf; - - if (end - buf <= pos) { - return mark; - } -#if FLATCC_JSON_PARSE_ALLOW_UNQUOTED - if (ctx->unquoted) { - if (buf[pos] > 0x20 && buf[pos] != ':') { - return mark; - } - buf += pos; - ctx->unquoted = 0; - } else { -#else - { -#endif - if (buf[pos] != '\"') { - return mark; - } - buf += pos + 1; - } - buf = flatcc_json_parser_space(ctx, buf, end); - if (buf != end && *buf == ':') { - ++buf; - return flatcc_json_parser_space(ctx, buf, end); - } - return flatcc_json_parser_set_error(ctx, buf, end, flatcc_json_parser_error_expected_colon); -} - -static inline const char *flatcc_json_parser_match_type_suffix(flatcc_json_parser_t *ctx, const char *buf, const char *end, int pos) -{ - if (end - buf <= pos + 5) { - return buf; - } - if (memcmp(buf + pos, "_type", 5)) { - return buf; - } - return flatcc_json_parser_match_symbol(ctx, buf, end, pos + 5); -} - -const char *flatcc_json_parser_unmatched_symbol(flatcc_json_parser_t *ctx, const char *buf, const char *end); - -static inline const char *flatcc_json_parser_coerce_uint64( - flatcc_json_parser_t *ctx, const char *buf, - const char *end, int value_sign, uint64_t value, uint64_t *v) -{ - if (value_sign) { - return flatcc_json_parser_set_error(ctx, buf, end, flatcc_json_parser_error_underflow); - } - *v = value; - return buf; -} - -static inline const char *flatcc_json_parser_coerce_bool(flatcc_json_parser_t *ctx, const char *buf, - const char *end, int value_sign, uint64_t value, uint8_t *v) -{ - if (value_sign) { - return flatcc_json_parser_set_error(ctx, buf, end, flatcc_json_parser_error_underflow); - } - *v = (uint8_t)!!value; - return buf; -} - -#define __flatcc_json_parser_define_coerce_unsigned(type, basetype, uctype) \ -static inline const char *flatcc_json_parser_coerce_ ## type( \ - flatcc_json_parser_t *ctx, const char *buf, \ - const char *end, int value_sign, uint64_t value, basetype *v) \ -{ \ - if (value_sign) { \ - return flatcc_json_parser_set_error(ctx, buf, end, \ - flatcc_json_parser_error_underflow); \ - } \ - if (value > uctype ## _MAX) { \ - return flatcc_json_parser_set_error(ctx, buf, end, \ - flatcc_json_parser_error_overflow); \ - } \ - *v = (basetype)value; \ - return buf; \ -} - -__flatcc_json_parser_define_coerce_unsigned(uint32, uint32_t, UINT32) -__flatcc_json_parser_define_coerce_unsigned(uint16, uint16_t, UINT16) -__flatcc_json_parser_define_coerce_unsigned(uint8, uint8_t, UINT8) - -#define __flatcc_json_parser_define_coerce_signed(type, basetype, uctype) \ -static inline const char *flatcc_json_parser_coerce_ ## type( \ - flatcc_json_parser_t *ctx, const char *buf, \ - const char *end, int value_sign, uint64_t value, basetype *v) \ -{ \ - if (value_sign) { \ - if (value > (uint64_t)(uctype ## _MAX) + 1) { \ - return flatcc_json_parser_set_error(ctx, buf, end, \ - flatcc_json_parser_error_underflow); \ - } \ - *v = (basetype)-(int64_t)value; \ - } else { \ - if (value > uctype ## _MAX) { \ - return flatcc_json_parser_set_error(ctx, buf, end, \ - flatcc_json_parser_error_overflow); \ - } \ - *v = (basetype)value; \ - } \ - return buf; \ -} - -__flatcc_json_parser_define_coerce_signed(int64, int64_t, INT64) -__flatcc_json_parser_define_coerce_signed(int32, int32_t, INT32) -__flatcc_json_parser_define_coerce_signed(int16, int16_t, INT16) -__flatcc_json_parser_define_coerce_signed(int8, int8_t, INT8) - -static inline const char *flatcc_json_parser_coerce_float( - flatcc_json_parser_t *ctx, const char *buf, - const char *end, int value_sign, uint64_t value, float *v) -{ - (void)ctx; - (void)end; - - *v = value_sign ? -(float)value : (float)value; - return buf; -} - -static inline const char *flatcc_json_parser_coerce_double( - flatcc_json_parser_t *ctx, const char *buf, - const char *end, int value_sign, uint64_t value, double *v) -{ - (void)ctx; - (void)end; - - *v = value_sign ? -(double)value : (double)value; - return buf; -} - -const char *flatcc_json_parser_double(flatcc_json_parser_t *ctx, const char *buf, const char *end, double *v); - -const char *flatcc_json_parser_float(flatcc_json_parser_t *ctx, const char *buf, const char *end, float *v); - -/* - * If the buffer does not contain a valid start character for a numeric - * value, the function will return the the input buffer without failure. - * This makes is possible to try a symbolic parse. - */ -const char *flatcc_json_parser_integer(flatcc_json_parser_t *ctx, const char *buf, const char *end, - int *value_sign, uint64_t *value); - -/* Returns unchanged buffer without error if `null` is not matched. */ -static inline const char *flatcc_json_parser_null(const char *buf, const char *end) -{ - if (end - buf >= 4 && memcmp(buf, "null", 4) == 0) { - return buf + 4; - } - return buf; -} - -static inline const char *flatcc_json_parser_none(flatcc_json_parser_t *ctx, - const char *buf, const char *end) -{ - if (end - buf >= 4 && memcmp(buf, "null", 4) == 0) { - return buf + 4; - } - return flatcc_json_parser_set_error(ctx, buf, end, - flatcc_json_parser_error_union_none_not_null); -} - -/* - * `parsers` is a null terminated array of parsers with at least one - * valid parser. A numeric literal parser may also be included. - */ -#define __flatcc_json_parser_define_integral_parser(type, basetype) \ -static inline const char *flatcc_json_parser_ ## type( \ - flatcc_json_parser_t *ctx, \ - const char *buf, const char *end, basetype *v) \ -{ \ - uint64_t value = 0; \ - int value_sign = 0; \ - const char *mark = buf; \ - \ - *v = 0; \ - if (buf == end) { \ - return buf; \ - } \ - buf = flatcc_json_parser_integer(ctx, buf, end, &value_sign, &value); \ - if (buf != mark) { \ - return flatcc_json_parser_coerce_ ## type(ctx, \ - buf, end, value_sign, value, v); \ - } \ - return buf; \ -} - -__flatcc_json_parser_define_integral_parser(uint64, uint64_t) -__flatcc_json_parser_define_integral_parser(uint32, uint32_t) -__flatcc_json_parser_define_integral_parser(uint16, uint16_t) -__flatcc_json_parser_define_integral_parser(uint8, uint8_t) -__flatcc_json_parser_define_integral_parser(int64, int64_t) -__flatcc_json_parser_define_integral_parser(int32, int32_t) -__flatcc_json_parser_define_integral_parser(int16, int16_t) -__flatcc_json_parser_define_integral_parser(int8, int8_t) - -static inline const char *flatcc_json_parser_bool(flatcc_json_parser_t *ctx, const char *buf, const char *end, uint8_t *v) -{ - const char *k; - uint8_t tmp; - - k = buf; - if (end - buf >= 4 && memcmp(buf, "true", 4) == 0) { - *v = 1; - return k + 4; - } else if (end - buf >= 5 && memcmp(buf, "false", 5) == 0) { - *v = 0; - return k + 5; - } - buf = flatcc_json_parser_uint8(ctx, buf, end, &tmp); - *v = !!tmp; - return buf; -} - -/* - * The `parsers` argument is a zero terminated array of parser - * functions with increasingly general scopes. - * - * Symbols can be be or'ed together by listing multiple space separated - * flags in source being parsed, like `{ x : "Red Blue" }`. - * Intended for flags, but generally available. - * - * `aggregate` means there are more symbols to follow. - * - * This function does not return input `buf` value if match was - * unsuccessful. It will either match or error. - */ -typedef const char *flatcc_json_parser_integral_symbol_f(flatcc_json_parser_t *ctx, - const char *buf, const char *end, int *value_sign, uint64_t *value, int *aggregate); - -/* - * Raise an error if a syntax like `color: Red Green` is seen unless - * explicitly permitted. `color: "Red Green"` or `"color": "Red Green" - * or `color: Red` is permitted if unquoted is permitted but not - * unquoted list. Googles flatc JSON parser does not allow multiple - * symbolic values unless quoted, so this is the default. - */ -#if !FLATCC_JSON_PARSE_ALLOW_UNQUOTED || FLATCC_JSON_PARSE_ALLOW_UNQUOTED_LIST -#define __flatcc_json_parser_init_check_unquoted_list() -#define __flatcc_json_parser_check_unquoted_list() -#else -#define __flatcc_json_parser_init_check_unquoted_list() int list_count = 0; -#define __flatcc_json_parser_check_unquoted_list() \ - if (list_count++ && ctx->unquoted) { \ - return flatcc_json_parser_set_error(ctx, buf, end, \ - flatcc_json_parser_error_unquoted_symbolic_list); \ - } -#endif - -#define __flatcc_json_parser_define_symbolic_integral_parser(type, basetype)\ -static const char *flatcc_json_parser_symbolic_ ## type( \ - flatcc_json_parser_t *ctx, \ - const char *buf, const char *end, \ - flatcc_json_parser_integral_symbol_f *parsers[], \ - basetype *v) \ -{ \ - flatcc_json_parser_integral_symbol_f **p; \ - const char *mark; \ - basetype tmp = 0; \ - uint64_t value; \ - int value_sign, aggregate; \ - __flatcc_json_parser_init_check_unquoted_list() \ - \ - *v = 0; \ - buf = flatcc_json_parser_constant_start(ctx, buf, end); \ - if (buf == end) { \ - return buf; \ - } \ - do { \ - p = parsers; \ - do { \ - /* call parser function */ \ - buf = (*p)(ctx, (mark = buf), end, \ - &value_sign, &value, &aggregate); \ - if (buf == end) { \ - return buf; \ - } \ - } while (buf == mark && *++p); \ - if (mark == buf) { \ - return flatcc_json_parser_set_error(ctx, buf, end, \ - flatcc_json_parser_error_expected_scalar); \ - } \ - __flatcc_json_parser_check_unquoted_list() \ - if (end == flatcc_json_parser_coerce_ ## type(ctx, \ - buf, end, value_sign, value, &tmp)) { \ - return end; \ - } \ - /* \ - * `+=`, not `|=` because we also coerce to float and double, \ - * and because we need to handle signed values. This may give \ - * unexpected results with duplicate flags. \ - */ \ - *v += tmp; \ - } while (aggregate); \ - return buf; \ -} - -__flatcc_json_parser_define_symbolic_integral_parser(uint64, uint64_t) -__flatcc_json_parser_define_symbolic_integral_parser(uint32, uint32_t) -__flatcc_json_parser_define_symbolic_integral_parser(uint16, uint16_t) -__flatcc_json_parser_define_symbolic_integral_parser(uint8, uint8_t) -__flatcc_json_parser_define_symbolic_integral_parser(int64, int64_t) -__flatcc_json_parser_define_symbolic_integral_parser(int32, int32_t) -__flatcc_json_parser_define_symbolic_integral_parser(int16, int16_t) -__flatcc_json_parser_define_symbolic_integral_parser(int8, int8_t) - -__flatcc_json_parser_define_symbolic_integral_parser(bool, uint8_t) - -/* We still parse integral values, but coerce to float or double. */ -__flatcc_json_parser_define_symbolic_integral_parser(float, float) -__flatcc_json_parser_define_symbolic_integral_parser(double, double) - -/* Parse vector as a base64 or base64url encoded string with no spaces permitted. */ -const char *flatcc_json_parser_build_uint8_vector_base64(flatcc_json_parser_t *ctx, - const char *buf, const char *end, flatcc_builder_ref_t *ref, int urlsafe); - -/* - * This doesn't do anything other than validate and advance past - * a JSON value which may use unquoted symbols. - * - * Upon call it is assumed that leading space has been stripped and that - * a JSON value is expected (i.e. root, or just after ':' in a - * container object, or less likely as an array member). Any trailing - * comma is assumed to belong to the parent context. Returns a parse - * location stripped from space so container should post call expect - * ',', '}', or ']', or EOF if the JSON is valid. - */ -const char *flatcc_json_parser_generic_json(flatcc_json_parser_t *ctx, const char *buf, const char *end); - -/* Parse a JSON table. */ -typedef const char *flatcc_json_parser_table_f(flatcc_json_parser_t *ctx, - const char *buf, const char *end, flatcc_builder_ref_t *pref); - -/* Parses a JSON struct. */ -typedef const char *flatcc_json_parser_struct_f(flatcc_json_parser_t *ctx, - const char *buf, const char *end, flatcc_builder_ref_t *pref); - -/* Constructs a table, struct, or string object unless the type is 0 or unknown. */ -typedef const char *flatcc_json_parser_union_f(flatcc_json_parser_t *ctx, - const char *buf, const char *end, uint8_t type, flatcc_builder_ref_t *pref); - -typedef int flatcc_json_parser_is_known_type_f(uint8_t type); - -/* Called at start by table parsers with at least 1 union. */ -const char *flatcc_json_parser_prepare_unions(flatcc_json_parser_t *ctx, - const char *buf, const char *end, size_t union_total, size_t *handle); - -const char *flatcc_json_parser_finalize_unions(flatcc_json_parser_t *ctx, - const char *buf, const char *end, size_t handle); - -const char *flatcc_json_parser_union(flatcc_json_parser_t *ctx, - const char *buf, const char *end, size_t union_index, - flatbuffers_voffset_t id, size_t handle, - flatcc_json_parser_union_f *union_parser); - -const char *flatcc_json_parser_union_type(flatcc_json_parser_t *ctx, - const char *buf, const char *end, size_t union_index, - flatbuffers_voffset_t id, size_t handle, - flatcc_json_parser_integral_symbol_f *type_parsers[], - flatcc_json_parser_union_f *union_parser); - -const char *flatcc_json_parser_union_vector(flatcc_json_parser_t *ctx, - const char *buf, const char *end, size_t union_index, - flatbuffers_voffset_t id, size_t handle, - flatcc_json_parser_union_f *union_parser); - -const char *flatcc_json_parser_union_type_vector(flatcc_json_parser_t *ctx, - const char *buf, const char *end, size_t union_index, - flatbuffers_voffset_t id, size_t handle, - flatcc_json_parser_integral_symbol_f *type_parsers[], - flatcc_json_parser_union_f *union_parser, - flatcc_json_parser_is_known_type_f accept_type); - -/* - * Parses a table as root. - * - * Use the flag `flatcc_json_parser_f_with_size` to create a buffer with - * size prefix. - * - * `ctx` may be null or an uninitialized json parser to receive parse results. - * `builder` must a newly initialized or reset builder object. - * `buf`, `bufsiz` may be larger than the parsed json if trailing - * space or zeroes are expected, but they must represent a valid memory buffer. - * `fid` must be null, or a valid file identifier. - * `flags` default to 0. See also `flatcc_json_parser_flags`. - */ -int flatcc_json_parser_table_as_root(flatcc_builder_t *B, flatcc_json_parser_t *ctx, - const char *buf, size_t bufsiz, int flags, const char *fid, - flatcc_json_parser_table_f *parser); - -/* - * Similar to `flatcc_json_parser_table_as_root` but parses a struct as - * root. - */ -int flatcc_json_parser_struct_as_root(flatcc_builder_t *B, flatcc_json_parser_t *ctx, - const char *buf, size_t bufsiz, int flags, const char *fid, - flatcc_json_parser_struct_f *parser); - -#include "flatcc/portable/pdiagnostic_pop.h" - -#ifdef __cplusplus -} -#endif - -#endif /* FLATCC_JSON_PARSE_H */ diff --git a/flatccrt/include/flatcc/flatcc_json_printer.h b/flatccrt/include/flatcc/flatcc_json_printer.h deleted file mode 100644 index 31e79fb..0000000 --- a/flatccrt/include/flatcc/flatcc_json_printer.h +++ /dev/null @@ -1,754 +0,0 @@ -#ifndef FLATCC_JSON_PRINTER_H -#define FLATCC_JSON_PRINTER_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Definitions for default implementation, do not assume these are - * always valid. - */ -#define FLATCC_JSON_PRINT_FLUSH_SIZE (1024 * 16) -#define FLATCC_JSON_PRINT_RESERVE 64 -#define FLATCC_JSON_PRINT_BUFFER_SIZE (FLATCC_JSON_PRINT_FLUSH_SIZE + FLATCC_JSON_PRINT_RESERVE) - -#ifndef FLATCC_JSON_PRINTER_ALLOC -#define FLATCC_JSON_PRINTER_ALLOC(n) FLATCC_ALLOC(n) -#endif - -#ifndef FLATCC_JSON_PRINTER_FREE -#define FLATCC_JSON_PRINTER_FREE(p) FLATCC_FREE(p) -#endif - -#ifndef FLATCC_JSON_PRINTER_REALLOC -#define FLATCC_JSON_PRINTER_REALLOC(p, n) FLATCC_REALLOC(p, n) -#endif - -/* Initial size that grows exponentially. */ -#define FLATCC_JSON_PRINT_DYN_BUFFER_SIZE 4096 - - -#include -#include - -#include "flatcc/flatcc_rtconfig.h" -#include "flatcc/flatcc_flatbuffers.h" - -/* -DFLATCC_PORTABLE may help if inttypes.h is missing. */ -#ifndef PRId64 -#include -#endif - -#define FLATCC_JSON_PRINT_ERROR_MAP(XX) \ - XX(ok, "ok") \ - /* \ - * When the flatbuffer is null, has too small a header, or has \ - * mismatching identifier when a match was requested. \ - */ \ - XX(bad_input, "bad input") \ - XX(deep_recursion, "deep recursion") \ - /* \ - * When the output was larger than the available fixed size buffer, \ - * or dynamic allocation could not grow the buffer sufficiently. \ - */ \ - XX(overflow, "overflow") - -enum flatcc_json_printer_error_no { -#define XX(no, str) flatcc_json_printer_error_##no, - FLATCC_JSON_PRINT_ERROR_MAP(XX) -#undef XX -}; - -#define flatcc_json_printer_ok flatcc_json_printer_error_ok - -typedef struct flatcc_json_printer_ctx flatcc_json_printer_t; - -typedef void flatcc_json_printer_flush_f(flatcc_json_printer_t *ctx, int all); - -struct flatcc_json_printer_ctx { - char *buf; - size_t size; - size_t flush_size; - size_t total; - const char *pflush; - char *p; - uint8_t own_buffer; - uint8_t indent; - uint8_t unquote; - uint8_t noenum; - uint8_t skip_default; - uint8_t force_default; - int level; - int error; - - void *fp; - flatcc_json_printer_flush_f *flush; -}; - -static inline void flatcc_json_printer_set_error(flatcc_json_printer_t *ctx, int err) -{ - if (!ctx->error) { - ctx->error = err; - } -} - -const char *flatcc_json_printer_error_string(int err); - -static inline int flatcc_json_printer_get_error(flatcc_json_printer_t *ctx) -{ - return ctx->error; -} - -/* - * Call to reuse context between parses without without - * returning buffer. If a file pointer is being used, - * it will remain open. - * - * Reset does not affect the formatting settings indentation, and - * operational flags, but does zero the indentation level. - */ -static inline void flatcc_json_printer_reset(flatcc_json_printer_t *ctx) -{ - ctx->p = ctx->buf; - ctx->level = 0; - ctx->total = 0; - ctx->error = 0; -} - -/* - * A custom init function can be implemented with a custom flush - * function can be custom implemented. A few have been provided: - * init with external fixed size buffer, and init with dynamically - * growing buffer. - * - * Because there are a lot of small print functions, it is essentially - * always faster to print to local buffer than moving to io directly - * such as using fprintf or fwrite. The flush callback is used to - * move data when enough has been collected. - * - * `fp` should be of type `FILE *` but we do not enforce it here - * because it allows the header to be independent of - * when not required. If `fp` is null, it defaults to stdout. - * - * Returns -1 on alloc error (no cleanup needed), or 0 on success. - * Eventually the clear method must be called to return memory. - * - * The file pointer may be stdout or a custom file. The file pointer - * is not affected by reset or clear and should be closed manually. - * - * `set_flags` and related may be called subsequently to modify - * behavior. - */ -int flatcc_json_printer_init(flatcc_json_printer_t *ctx, void *fp); - -/* - * Prints to external buffer and sets overflow error if buffer is too - * small. Earlier content is then overwritten. A custom version of this - * function could flush the content to elsewhere before allowing the - * buffer content to be overwritten. The `buffers_size` must be large - * enough to hold `FLATCC_JSON_PRINT_RESERVED_SIZE` which is small but - * large enough value to hold entire numbers and the like. - * - * It is not strictly necessary to call clear because the buffer is - * external, but still good form and case the context type is changed - * later. - * - * Returns -1 on buffer size error (no cleanup needed), or 0 on success. - * - * `set_flags` and related may be called subsequently to modify - * behavior. - */ -int flatcc_json_printer_init_buffer(flatcc_json_printer_t *ctx, char *buffer, size_t buffer_size); - -/* - * Returns the current buffer pointer and also the content size in - * `buffer_size` if it is null. The operation is not very useful for - * file oriented printers (created with `init`) and will then only - * return the unflushed buffer content. For fixed size buffers - * (`init_buffer`), only the last content is available if the buffer - * overflowed. Works well with (`init_buffer`) when the dynamic buffer - * is be reused, otherwise `finalize_dynamic_buffer` could be more - * appropriate. - * - * The returned buffer is zero terminated. - * - * The returned pointer is only valid until next operation and should - * not deallocated manually. - */ -void *flatcc_json_printer_get_buffer(flatcc_json_printer_t *ctx, size_t *buffer_size); - -/* - * Set to non-zero if names and enum symbols can be unquoted thus - * diverging from standard JSON while remaining compatible with `flatc` - * JSON flavor. - */ -static inline void flatcc_json_printer_set_unquoted(flatcc_json_printer_t *ctx, int x) -{ - ctx->unquote = !!x; -} - -/* - * Set to non-zero if enums should always be printed as numbers. - * Otherwise enums are printed as a symbol for member values, and as - * numbers for other values. - * - * NOTE: this setting will not affect code generated with enum mapping - * disabled - statically disabling enum mapping is signficantly faster - * for enums, less so for for union types. - */ -static inline void flatcc_json_printer_set_noenum(flatcc_json_printer_t *ctx, int x) -{ - ctx->noenum = !!x; -} - -/* - * Override priting an existing scalar field if it equals the default value. - * Note that this setting is not mutually exclusive to `set_force_default`. - */ -static inline void flatcc_json_printer_set_skip_default(flatcc_json_printer_t *ctx, int x) -{ - ctx->skip_default = !!x; -} - -/* - * Override skipping absent scalar fields and print the default value. - * Note that this setting is not mutually exclusive to `set_skip_default`. - */ -static inline void flatcc_json_printer_set_force_default(flatcc_json_printer_t *ctx, int x) -{ - ctx->force_default = !!x; -} - - -/* - * Set pretty-print indentation in number of spaces. 0 (default) is - * compact with no spaces or linebreaks (default), anything above - * triggers pretty print. - */ -static inline void flatcc_json_printer_set_indent(flatcc_json_printer_t *ctx, uint8_t x) -{ - ctx->indent = x; -} - -/* - * Override the default compact valid JSON format with a - * pretty printed non-strict version. Enums are translated - * to names, which is also the default. - */ -static inline void flatcc_json_printer_set_nonstrict(flatcc_json_printer_t *ctx) -{ - flatcc_json_printer_set_indent(ctx, 2); - flatcc_json_printer_set_unquoted(ctx, 1); - flatcc_json_printer_set_noenum(ctx, 0); -} - -enum flatcc_json_printer_flags { - flatcc_json_printer_f_unquote = 1, - flatcc_json_printer_f_noenum = 2, - flatcc_json_printer_f_skip_default = 4, - flatcc_json_printer_f_force_default = 8, - flatcc_json_printer_f_pretty = 16, - flatcc_json_printer_f_nonstrict = 32, -}; - -/* - * May be called instead of setting operational modes individually. - * Formatting is strict quoted json witout pretty printing by default. - * - * flags are: - * - * `unquote`, - * `noenum`, - * `skip_default`, - * `force_default`, - * `pretty`, - * `nonstrict` - * - * `pretty` flag sets indentation to 2. - * `nonstrict` implies: `noenum`, `unquote`, `pretty`. - */ -static inline void flatcc_json_printer_set_flags(flatcc_json_printer_t *ctx, int flags) -{ - ctx->unquote = !!(flags & flatcc_json_printer_f_unquote); - ctx->noenum = !!(flags & flatcc_json_printer_f_noenum); - ctx->skip_default = !!(flags & flatcc_json_printer_f_skip_default); - ctx->force_default = !!(flags & flatcc_json_printer_f_force_default); - if (flags & flatcc_json_printer_f_pretty) { - flatcc_json_printer_set_indent(ctx, 2); - } - if (flags & flatcc_json_printer_f_nonstrict) { - flatcc_json_printer_set_nonstrict(ctx); - } -} - - -/* - * Detects if the conctext type uses dynamically allocated memory - * using malloc and realloc and frees any such memory. - * - * Not all context types needs to be cleared. - */ -void flatcc_json_printer_clear(flatcc_json_printer_t *ctx); - -/* - * Ensures that there ia always buffer capacity for priting the next - * primitive with delimiters. - * - * Only flushes complete flush units and is inexpensive to call. - * The content buffer has an extra reserve which ensures basic - * data types and delimiters can always be printed after a partial - * flush. At the end, a `flush` is required to flush the - * remaining incomplete buffer data. - * - * Numbers do not call partial flush but will always fit into the reserve - * capacity after a partial flush, also surrounded by delimiters. - * - * Variable length operations generally submit a partial flush so it is - * safe to print a number after a name without flushing, but vectors of - * numbers must (and do) issue a partial flush between elements. This is - * handled automatically but must be considered if using the primitives - * for special purposes. Because repeated partial flushes are very cheap - * this is only a concern for high performance applications. - * - * When identiation is enabled, partial flush is also automatically - * issued . - */ -static inline void flatcc_json_printer_flush_partial(flatcc_json_printer_t *ctx) -{ - if (ctx->p >= ctx->pflush) { - ctx->flush(ctx, 0); - } -} - -/* Returns the total printed size but flushed and in buffer. */ -static inline size_t flatcc_json_printer_total(flatcc_json_printer_t *ctx) -{ - return (size_t)(ctx->total + (ctx->p - ctx->buf)); -} - -/* - * Flush the remaining data not flushed by partial flush. It is valid to - * call at any point if it is acceptable to have unaligned flush units, - * but this is not desireable if, for example, compression or encryption - * is added to the flush pipeline. - * - * Not called automatically at the end of printing a flatbuffer object - * in case more data needs to be appended without submitting incomplete - * flush units prematurely - for example adding a newline at the end. - * - * The flush behavior depeends on the underlying `ctx` object, for - * example dynamic buffers have no distinction between partial and full - * flushes - here it is merely ensured that the buffer always has a - * reserve capacity left. - * - * Returns the total printed size. - */ -static inline size_t flatcc_json_printer_flush(flatcc_json_printer_t *ctx) -{ - ctx->flush(ctx, 1); - return flatcc_json_printer_total(ctx); -} - -/* - * Helper functions to print anything into the json buffer. - * Strings are escaped. - * - * When pretty printing (indent > 0), level 0 has special significance - - * so if wrapping printed json in a manually printed container json - * object, these functions can help manage this. - */ - -/* Escaped and quoted string. */ -void flatcc_json_printer_string(flatcc_json_printer_t *ctx, const char *s, int n); -/* Unescaped and unquoted string. */ -void flatcc_json_printer_write(flatcc_json_printer_t *ctx, const char *s, int n); -/* Print a newline and issues a partial flush. */ -void flatcc_json_printer_nl(flatcc_json_printer_t *ctx); -/* Like numbers, a partial flush is not issued. */ -void flatcc_json_printer_char(flatcc_json_printer_t *ctx, char c); -/* Indents and issues a partial flush. */ -void flatcc_json_printer_indent(flatcc_json_printer_t *ctx); -/* Adjust identation level, usually +/-1. */ -void flatcc_json_printer_add_level(flatcc_json_printer_t *ctx, int n); -/* Returns current identation level (0 is top level). */ -int flatcc_json_printer_get_level(flatcc_json_printer_t *ctx); - -/* - * If called explicitly be aware that repeated calls to numeric - * printers may cause buffer overflow without flush in-between. - */ -void flatcc_json_printer_uint8(flatcc_json_printer_t *ctx, uint8_t v); -void flatcc_json_printer_uint16(flatcc_json_printer_t *ctx, uint16_t v); -void flatcc_json_printer_uint32(flatcc_json_printer_t *ctx, uint32_t v); -void flatcc_json_printer_uint64(flatcc_json_printer_t *ctx, uint64_t v); -void flatcc_json_printer_int8(flatcc_json_printer_t *ctx, int8_t v); -void flatcc_json_printer_int16(flatcc_json_printer_t *ctx, int16_t v); -void flatcc_json_printer_int32(flatcc_json_printer_t *ctx, int32_t v); -void flatcc_json_printer_int64(flatcc_json_printer_t *ctx, int64_t v); -void flatcc_json_printer_bool(flatcc_json_printer_t *ctx, int v); -void flatcc_json_printer_float(flatcc_json_printer_t *ctx, float v); -void flatcc_json_printer_double(flatcc_json_printer_t *ctx, double v); - -void flatcc_json_printer_enum(flatcc_json_printer_t *ctx, - const char *symbol, int len); - -/* - * Convenience function to add a trailing newline, flush the buffer, - * test for error and reset the context for reuse. - * - * Returns total size printed or < 0 on error. - * - * This function makes most sense for file oriented output. - * See also `finalize_dynamic_buffer`. - */ -static inline int flatcc_json_printer_finalize(flatcc_json_printer_t *ctx) -{ - int ret; - flatcc_json_printer_nl(ctx); - ret = (int)flatcc_json_printer_flush(ctx); - if (ctx->error) { - ret = -1; - } - flatcc_json_printer_reset(ctx); - return ret; -} - -/* - * Allocates a small buffer and grows it dynamically. - * Buffer survives past reset. To reduce size between uses, call clear - * followed by init call. To reuse buffer just call reset between uses. - * If `buffer_size` is 0 a sensible default is being used. The size is - * automatically rounded up to reserved size if too small. - * - * Returns -1 on alloc error (no cleanup needed), or 0 on success. - * Eventually the clear method must be called to return memory. - * - * `set_flags` and related may be called subsequently to modify - * behavior. - */ -int flatcc_json_printer_init_dynamic_buffer(flatcc_json_printer_t *ctx, size_t buffer_size); - -/* - * Similar to calling `finalize` but returns the buffer and does NOT - * reset, but rather clears printer object and the returned buffer must - * be deallocated with `free`. - * - * The returned buffer is zero terminated. - * - * NOTE: it is entirely optional to use this method. For repeated used - * of dynamic buffers, `newline` (or not) followed by `get_buffer` - * and `reset` will be an alternative. - * - * Stores the printed buffer size in `buffer_size` if it is not null. - * - * See also `get_dynamic_buffer`. - */ -void *flatcc_json_printer_finalize_dynamic_buffer(flatcc_json_printer_t *ctx, size_t *buffer_size); - - -/************************************************************* - * The following is normally only used by generated code. - *************************************************************/ - -typedef struct flatcc_json_printer_table_descriptor flatcc_json_printer_table_descriptor_t; - -struct flatcc_json_printer_table_descriptor { - const void *table; - const void *vtable; - int vsize; - int ttl; - int count; -}; - -typedef struct flatcc_json_printer_union_descriptor flatcc_json_printer_union_descriptor_t; - -struct flatcc_json_printer_union_descriptor { - const void *member; - int ttl; - uint8_t type; -}; - -typedef void flatcc_json_printer_table_f(flatcc_json_printer_t *ctx, - flatcc_json_printer_table_descriptor_t *td); - -typedef void flatcc_json_printer_struct_f(flatcc_json_printer_t *ctx, - const void *p); - -typedef void flatcc_json_printer_union_f(flatcc_json_printer_t *ctx, - flatcc_json_printer_union_descriptor_t *ud); - -/* Generated value to name map callbacks. */ -typedef void flatcc_json_printer_union_type_f(flatcc_json_printer_t *ctx, flatbuffers_utype_t type); -typedef void flatcc_json_printer_uint8_enum_f(flatcc_json_printer_t *ctx, uint8_t v); -typedef void flatcc_json_printer_uint16_enum_f(flatcc_json_printer_t *ctx, uint16_t v); -typedef void flatcc_json_printer_uint32_enum_f(flatcc_json_printer_t *ctx, uint32_t v); -typedef void flatcc_json_printer_uint64_enum_f(flatcc_json_printer_t *ctx, uint64_t v); -typedef void flatcc_json_printer_int8_enum_f(flatcc_json_printer_t *ctx, int8_t v); -typedef void flatcc_json_printer_int16_enum_f(flatcc_json_printer_t *ctx, int16_t v); -typedef void flatcc_json_printer_int32_enum_f(flatcc_json_printer_t *ctx, int32_t v); -typedef void flatcc_json_printer_int64_enum_f(flatcc_json_printer_t *ctx, int64_t v); -typedef void flatcc_json_printer_bool_enum_f(flatcc_json_printer_t *ctx, flatbuffers_bool_t v); - -#define __define_print_scalar_field_proto(TN, T) \ -void flatcc_json_printer_ ## TN ## _field(flatcc_json_printer_t *ctx, \ - flatcc_json_printer_table_descriptor_t *td, \ - int id, const char *name, int len, T v); - -#define __define_print_scalar_struct_field_proto(TN, T) \ -void flatcc_json_printer_ ## TN ## _struct_field(flatcc_json_printer_t *ctx,\ - int index, const void *p, size_t offset, \ - const char *name, int len); - -#define __define_print_scalar_array_struct_field_proto(TN, T) \ -void flatcc_json_printer_ ## TN ## _array_struct_field( \ - flatcc_json_printer_t *ctx, \ - int index, const void *p, size_t offset, \ - const char *name, int len, size_t count); - -#define __define_print_enum_array_struct_field_proto(TN, T) \ -void flatcc_json_printer_ ## TN ## _enum_array_struct_field( \ - flatcc_json_printer_t *ctx, \ - int index, const void *p, size_t offset, \ - const char *name, int len, size_t count, \ - flatcc_json_printer_ ## TN ##_enum_f *pf); - -#define __define_print_enum_struct_field_proto(TN, T) \ -void flatcc_json_printer_ ## TN ## _enum_struct_field( \ - flatcc_json_printer_t *ctx, \ - int index, const void *p, size_t offset, \ - const char *name, int len, \ - flatcc_json_printer_ ## TN ##_enum_f *pf); - -#define __define_print_enum_field_proto(TN, T) \ -void flatcc_json_printer_ ## TN ## _enum_field(flatcc_json_printer_t *ctx, \ - flatcc_json_printer_table_descriptor_t *td, \ - int id, const char *name, int len, T v, \ - flatcc_json_printer_ ## TN ##_enum_f *pf); - -#define __define_print_scalar_vector_field_proto(TN, T) \ -void flatcc_json_printer_ ## TN ## _vector_field(flatcc_json_printer_t *ctx,\ - flatcc_json_printer_table_descriptor_t *td, \ - int id, const char *name, int len); - -#define __define_print_enum_vector_field_proto(TN, T) \ -void flatcc_json_printer_ ## TN ## _enum_vector_field( \ - flatcc_json_printer_t *ctx, \ - flatcc_json_printer_table_descriptor_t *td, \ - int id, const char *name, int len, \ - flatcc_json_printer_ ## TN ##_enum_f *pf); - -__define_print_scalar_field_proto(uint8, uint8_t) -__define_print_scalar_field_proto(uint16, uint16_t) -__define_print_scalar_field_proto(uint32, uint32_t) -__define_print_scalar_field_proto(uint64, uint64_t) -__define_print_scalar_field_proto(int8, int8_t) -__define_print_scalar_field_proto(int16, int16_t) -__define_print_scalar_field_proto(int32, int32_t) -__define_print_scalar_field_proto(int64, int64_t) -__define_print_scalar_field_proto(bool, flatbuffers_bool_t) -__define_print_scalar_field_proto(float, float) -__define_print_scalar_field_proto(double, double) - -__define_print_enum_field_proto(uint8, uint8_t) -__define_print_enum_field_proto(uint16, uint16_t) -__define_print_enum_field_proto(uint32, uint32_t) -__define_print_enum_field_proto(uint64, uint64_t) -__define_print_enum_field_proto(int8, int8_t) -__define_print_enum_field_proto(int16, int16_t) -__define_print_enum_field_proto(int32, int32_t) -__define_print_enum_field_proto(int64, int64_t) -__define_print_enum_field_proto(bool, flatbuffers_bool_t) - -__define_print_scalar_struct_field_proto(uint8, uint8_t) -__define_print_scalar_struct_field_proto(uint16, uint16_t) -__define_print_scalar_struct_field_proto(uint32, uint32_t) -__define_print_scalar_struct_field_proto(uint64, uint64_t) -__define_print_scalar_struct_field_proto(int8, int8_t) -__define_print_scalar_struct_field_proto(int16, int16_t) -__define_print_scalar_struct_field_proto(int32, int32_t) -__define_print_scalar_struct_field_proto(int64, int64_t) -__define_print_scalar_struct_field_proto(bool, flatbuffers_bool_t) -__define_print_scalar_struct_field_proto(float, float) -__define_print_scalar_struct_field_proto(double, double) - -/* - * char arrays are special as there are no char fields - * without arrays and because they are printed as strings. - */ -__define_print_scalar_array_struct_field_proto(char, char) - -__define_print_scalar_array_struct_field_proto(uint8, uint8_t) -__define_print_scalar_array_struct_field_proto(uint16, uint16_t) -__define_print_scalar_array_struct_field_proto(uint32, uint32_t) -__define_print_scalar_array_struct_field_proto(uint64, uint64_t) -__define_print_scalar_array_struct_field_proto(int8, int8_t) -__define_print_scalar_array_struct_field_proto(int16, int16_t) -__define_print_scalar_array_struct_field_proto(int32, int32_t) -__define_print_scalar_array_struct_field_proto(int64, int64_t) -__define_print_scalar_array_struct_field_proto(bool, flatbuffers_bool_t) -__define_print_scalar_array_struct_field_proto(float, float) -__define_print_scalar_array_struct_field_proto(double, double) - -__define_print_enum_array_struct_field_proto(uint8, uint8_t) -__define_print_enum_array_struct_field_proto(uint16, uint16_t) -__define_print_enum_array_struct_field_proto(uint32, uint32_t) -__define_print_enum_array_struct_field_proto(uint64, uint64_t) -__define_print_enum_array_struct_field_proto(int8, int8_t) -__define_print_enum_array_struct_field_proto(int16, int16_t) -__define_print_enum_array_struct_field_proto(int32, int32_t) -__define_print_enum_array_struct_field_proto(int64, int64_t) -__define_print_enum_array_struct_field_proto(bool, flatbuffers_bool_t) - -__define_print_enum_struct_field_proto(uint8, uint8_t) -__define_print_enum_struct_field_proto(uint16, uint16_t) -__define_print_enum_struct_field_proto(uint32, uint32_t) -__define_print_enum_struct_field_proto(uint64, uint64_t) -__define_print_enum_struct_field_proto(int8, int8_t) -__define_print_enum_struct_field_proto(int16, int16_t) -__define_print_enum_struct_field_proto(int32, int32_t) -__define_print_enum_struct_field_proto(int64, int64_t) -__define_print_enum_struct_field_proto(bool, flatbuffers_bool_t) - -__define_print_scalar_vector_field_proto(uint8, uint8_t) -__define_print_scalar_vector_field_proto(uint16, uint16_t) -__define_print_scalar_vector_field_proto(uint32, uint32_t) -__define_print_scalar_vector_field_proto(uint64, uint64_t) -__define_print_scalar_vector_field_proto(int8, int8_t) -__define_print_scalar_vector_field_proto(int16, int16_t) -__define_print_scalar_vector_field_proto(int32, int32_t) -__define_print_scalar_vector_field_proto(int64, int64_t) -__define_print_scalar_vector_field_proto(bool, flatbuffers_bool_t) -__define_print_scalar_vector_field_proto(float, float) -__define_print_scalar_vector_field_proto(double, double) - -__define_print_enum_vector_field_proto(uint8, uint8_t) -__define_print_enum_vector_field_proto(uint16, uint16_t) -__define_print_enum_vector_field_proto(uint32, uint32_t) -__define_print_enum_vector_field_proto(uint64, uint64_t) -__define_print_enum_vector_field_proto(int8, int8_t) -__define_print_enum_vector_field_proto(int16, int16_t) -__define_print_enum_vector_field_proto(int32, int32_t) -__define_print_enum_vector_field_proto(int64, int64_t) -__define_print_enum_vector_field_proto(bool, flatbuffers_bool_t) - -void flatcc_json_printer_uint8_vector_base64_field(flatcc_json_printer_t *ctx, - flatcc_json_printer_table_descriptor_t *td, - int id, const char *name, int len, int urlsafe); - -/* - * If `fid` is null, the identifier is not checked and is allowed to be - * entirely absent. - * - * The buffer must at least be aligned to uoffset_t on systems that - * require aligned memory addresses (as always for flatbuffers). - */ -int flatcc_json_printer_table_as_root(flatcc_json_printer_t *ctx, - const void *buf, size_t bufsiz, const char *fid, - flatcc_json_printer_table_f *pf); - -int flatcc_json_printer_struct_as_root(flatcc_json_printer_t *ctx, - const void *buf, size_t bufsiz, const char *fid, - flatcc_json_printer_struct_f *pf); - -/* - * Call before and after enum flags to ensure proper quotation. Enum - * quotes may be configured runtime, but regardless of this, multiple - * flags may be forced to be quoted depending on compile time flag since - * not all parsers may be able to handle unquoted space separated values - * even if they handle non-strict unquoted json otherwise. - * - * Flags should only be called when not empty (0) and when there are no - * unknown flags in the value. Otherwise print the numeric value. The - * auto generated code deals with this. - * - * This bit twiddling hack may be useful: - * - * `multiple = 0 != (v & (v - 1);` - */ -void flatcc_json_printer_delimit_enum_flags(flatcc_json_printer_t *ctx, int multiple); - -/* The index increments from 0 to handle space. It is not the flag bit position. */ -void flatcc_json_printer_enum_flag(flatcc_json_printer_t *ctx, int index, const char *symbol, int len); - -/* A struct inside another struct, as opposed to inside a table or a root. */ -void flatcc_json_printer_embedded_struct_field(flatcc_json_printer_t *ctx, - int index, const void *p, size_t offset, - const char *name, int len, - flatcc_json_printer_struct_f pf); - -void flatcc_json_printer_embedded_struct_array_field(flatcc_json_printer_t *ctx, - int index, const void *p, size_t offset, - const char *name, int len, - size_t size, size_t count, - flatcc_json_printer_struct_f pf); - -void flatcc_json_printer_struct_field(flatcc_json_printer_t *ctx, - flatcc_json_printer_table_descriptor_t *td, - int id, const char *name, int len, - flatcc_json_printer_struct_f *pf); - -void flatcc_json_printer_string_field(flatcc_json_printer_t *ctx, - flatcc_json_printer_table_descriptor_t *td, - int id, const char *name, int len); - -void flatcc_json_printer_string_vector_field(flatcc_json_printer_t *ctx, - flatcc_json_printer_table_descriptor_t *td, - int id, const char *name, int len); - -void flatcc_json_printer_table_field(flatcc_json_printer_t *ctx, - flatcc_json_printer_table_descriptor_t *td, - int id, const char *name, int len, - flatcc_json_printer_table_f pf); - -void flatcc_json_printer_struct_vector_field(flatcc_json_printer_t *ctx, - flatcc_json_printer_table_descriptor_t *td, - int id, const char *name, int len, - size_t size, - flatcc_json_printer_struct_f pf); - -void flatcc_json_printer_table_vector_field(flatcc_json_printer_t *ctx, - flatcc_json_printer_table_descriptor_t *td, - int id, const char *name, int len, - flatcc_json_printer_table_f pf); - -void flatcc_json_printer_union_vector_field(flatcc_json_printer_t *ctx, - flatcc_json_printer_table_descriptor_t *td, - int id, const char *name, int len, - flatcc_json_printer_union_type_f ptf, - flatcc_json_printer_union_f pf); - -void flatcc_json_printer_struct_as_nested_root(flatcc_json_printer_t *ctx, - flatcc_json_printer_table_descriptor_t *td, - int id, const char *name, int len, - const char *fid, - flatcc_json_printer_struct_f *pf); - -void flatcc_json_printer_table_as_nested_root(flatcc_json_printer_t *ctx, - flatcc_json_printer_table_descriptor_t *td, - int id, const char *name, int len, - const char *fid, - flatcc_json_printer_table_f pf); - -void flatcc_json_printer_union_field(flatcc_json_printer_t *ctx, - flatcc_json_printer_table_descriptor_t *td, - int id, const char *name, int len, - flatcc_json_printer_union_type_f ptf, - flatcc_json_printer_union_f pf); - -void flatcc_json_printer_union_table(flatcc_json_printer_t *ctx, - flatcc_json_printer_union_descriptor_t *ud, - flatcc_json_printer_table_f pf); - -void flatcc_json_printer_union_struct(flatcc_json_printer_t *ctx, - flatcc_json_printer_union_descriptor_t *ud, - flatcc_json_printer_struct_f pf); - -void flatcc_json_printer_union_string(flatcc_json_printer_t *ctx, - flatcc_json_printer_union_descriptor_t *ud); - -#ifdef __cplusplus -} -#endif - -#endif /* FLATCC_JSON_PRINTER_H */ diff --git a/flatccrt/include/flatcc/flatcc_portable.h b/flatccrt/include/flatcc/flatcc_portable.h deleted file mode 100644 index 9b0eb0c..0000000 --- a/flatccrt/include/flatcc/flatcc_portable.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef FLATCC_PORTABLE_H -#define FLATCC_PORTABLE_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include "flatcc/portable/portable_basic.h" - -#ifdef __cplusplus -} -#endif - -#endif /* FLATCC_PORTABLE_H */ diff --git a/flatccrt/include/flatcc/flatcc_prologue.h b/flatccrt/include/flatcc/flatcc_prologue.h deleted file mode 100644 index 3a74ed6..0000000 --- a/flatccrt/include/flatcc/flatcc_prologue.h +++ /dev/null @@ -1,8 +0,0 @@ -/* Include guard intentionally left out. */ - -#define PDIAGNOSTIC_IGNORE_UNUSED -#include "flatcc/portable/pdiagnostic_push.h" - -#ifdef __cplusplus -extern "C" { -#endif diff --git a/flatccrt/include/flatcc/flatcc_refmap.h b/flatccrt/include/flatcc/flatcc_refmap.h deleted file mode 100644 index 062d94f..0000000 --- a/flatccrt/include/flatcc/flatcc_refmap.h +++ /dev/null @@ -1,144 +0,0 @@ -/* - * The flatcc builder supports storing a pointer to a refmap - * and wraps some operations to make them work as a dummy - * even if no refmap has been set. This enables optional - * DAG preservation possible during clone operations. - * - * A refmap maps a source address to a builder reference. - * - * This is just a map, but the semantics are important: - * - * The map thus preserves identity of the source. It is not a - * cache because cache eviction would fail to properly track - * identity. - * - * The map is used for memoization during object cloning are and - * may also be used by user logic doing similar operations. - * This ensures that identity is preserved so a source object is - * not duplicated which could lead to either loss of semantic - * information, or an explosion in size, or both. In some, or - * even most, cases this concern may not be important, but when - * it is important, it is important. - * - * The source address must not be reused for different content - * for the lifetime of the map, although the content doest not - * have to be valid or event exist at that location since source - * address is just used as a key. - * - * The lifetime may be a single clone operation which then - * tracks child object references as well, or it may be the - * lifetime of the buffer builder. - * - * The map may be flushed explicitly when the source addresses - * are no longer unique, such as when reusing a memory buffer, - * and when identity preservation is no longer important. - * Flushing a map is esentially the same as ending a lifetime. - * - * Multiple maps may exist concurrently for example if cloning - * an object twice into two new objects that should have - * separate identities. This is especially true and necessary - * when creating a new nested buffer because the nested buffer - * cannot share references with the parent. Cloning and object - * that contains a nested buffer does not require multiple maps - * because the nested buffer is then opaque. - */ - -#ifndef FLATCC_REFMAP_H -#define FLATCC_REFMAP_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include "flatcc/flatcc_types.h" - -#ifndef FLATCC_REFMAP_MIN_BUCKETS -/* 8 buckets gives us 5 useful initial entries with a load factor of 0.7 */ -#define FLATCC_REFMAP_MIN_BUCKETS 8 -#endif - -#define FLATCC_REFMAP_LOAD_FACTOR 0.7f - -typedef struct flatcc_refmap flatcc_refmap_t; -typedef flatbuffers_soffset_t flatcc_refmap_ref_t; - -static const flatcc_refmap_ref_t flatcc_refmap_not_found = 0; - -struct flatcc_refmap_item { - const void *src; - flatcc_refmap_ref_t ref; -}; - -struct flatcc_refmap { - size_t count; - size_t buckets; - struct flatcc_refmap_item *table; - /* Use stack allocation for small maps. */ - struct flatcc_refmap_item min_table[FLATCC_REFMAP_MIN_BUCKETS]; -}; - -/* - * Fast zero initialization - does not allocate any memory. - * May be replaced by memset 0, but `init` avoids clearing the - * stack allocated initial hash table until it is needed. - */ -static inline int flatcc_refmap_init(flatcc_refmap_t *refmap) -{ - refmap->count = 0; - refmap->buckets = 0; - refmap->table = 0; - return 0; -} - -/* - * Removes all items and deallocates memory. - * Not required unless `insert` or `resize` took place. The map can be - * reused subsequently without calling `init`. - */ -void flatcc_refmap_clear(flatcc_refmap_t *refmap); - -/* - * Keeps allocated memory as is, but removes all items. The map - * must intialized first. - */ -void flatcc_refmap_reset(flatcc_refmap_t *refmap); - -/* - * Returns the inserted reference if the `src` pointer was found, - * without inspecting the content of the `src` pointer. - * - * Returns flatcc_refmap_not_found (default 0) if the `src` pointer was - * not found. - */ -flatcc_refmap_ref_t flatcc_refmap_find(flatcc_refmap_t *refmap, const void *src); - -/* - * Inserts a `src` source pointer and its associated `ref` reference - * into the refmap without inspecting the `src` pointer content. The - * `ref` value will be replaced if the the `src` pointer already exists. - * - * Inserting null will just return the ref without updating the map. - * - * There is no delete operation which simplifies an open - * addressing hash table, and it isn't needed for this use case. - * - * Returns the input ref or not_found on allocation error. - */ -flatcc_refmap_ref_t flatcc_refmap_insert(flatcc_refmap_t *refmap, const void *src, flatcc_refmap_ref_t ref); - -/* - * Set the hash table to accommodate at least `count` items while staying - * within the predefined load factor. - * - * Resize is primarily an internal operation, but the user may resize - * ahead of a large anticipated load, or after a large load to shrink - * the table using 0 as the `count` argument. The table never shrinks - * on its own account. - */ -int flatcc_refmap_resize(flatcc_refmap_t *refmap, size_t count); - -#ifdef __cplusplus -} -#endif - -#endif /* FLATCC_REFMAP_H */ diff --git a/flatccrt/include/flatcc/flatcc_rtconfig.h b/flatccrt/include/flatcc/flatcc_rtconfig.h deleted file mode 100644 index 59727b6..0000000 --- a/flatccrt/include/flatcc/flatcc_rtconfig.h +++ /dev/null @@ -1,162 +0,0 @@ -#ifndef FLATCC_RTCONFIG_H -#define FLATCC_RTCONFIG_H - -#ifdef __cplusplus -extern "C" { -#endif - - -/* Include portability layer here since all other files depend on it. */ -#ifdef FLATCC_PORTABLE -#include "flatcc/portable/portable.h" -#endif - -/* - * Fast printing and parsing of double. - * - * This requires the grisu3/grisu3_* files to be in the include path, - * otherwise strod and sprintf will be used (these needed anyway - * as fallback for cases not supported by grisu3). - */ -#ifndef FLATCC_USE_GRISU3 -#define FLATCC_USE_GRISU3 1 -#endif - -/* - * This requires compiler that has enabled marc=native or similar so - * __SSE4_2__ flag is defined. Otherwise it will have no effect. - * - * While SSE may be used for different purposes, it has (as of this - * writing) only be used to test the effect on JSON whitespace handling - * which improved, but not by a lot, assuming 64-bit unligned access is - * otherwise available: - * - * With 8 space indentation, the JSON benchmark handles 308K parse ops/sec - * while SSE ups that to 333 parse ops/sec or 336 if \r\n is also - * consumed by SSE. Disabling indentation leaves SSE spacing handling - * ineffective, and performance reaches 450K parse ops/sec and can - * improve further to 500+K parse ops/sec if inexact GRISU3 numbers are - * allowed (they are pretty accurate anyway, just not exact). This - * feature requires hacking a flag direct in the grisu3 double parsing - * lib directly and only mentioned for comparison. - * - * In conclusion SSE doesn't add a lot to JSON space handling at least. - * - * Disabled by default, but can be overriden by build system. - */ -#ifndef FLATCC_USE_SSE4_2 -#define FLATCC_USE_SSE4_2 0 -#endif - -/* - * The verifier only reports yes and no. The following setting - * enables assertions in debug builds. It must be compiled into - * the runtime library and is not normally the desired behavior. - * - * NOTE: enabling this can break test cases so use with build, not test. - */ -#if !defined(FLATCC_DEBUG_VERIFY) && !defined(NDEBUG) -#define FLATCC_DEBUG_VERIFY 0 -#endif - -#if !defined(FLATCC_TRACE_VERIFY) -#define FLATCC_TRACE_VERIFY 0 -#endif - - -/* - * Limit recursion level for tables. Actual level may be deeper - * when structs are deeply nested - but these are limited by the - * schema compiler. - */ -#ifndef FLATCC_JSON_PRINT_MAX_LEVELS -#define FLATCC_JSON_PRINT_MAX_LEVELS 100 -#endif - -/* Maximum length of names printed exluding _type suffix. */ -#ifndef FLATCC_JSON_PRINT_NAME_LEN_MAX -#define FLATCC_JSON_PRINT_NAME_LEN_MAX 100 -#endif - -/* - * Print float and double values with C99 hexadecimal floating point - * notation. This option is not valid JSON but it avoids precision - * loss, correctly handles NaN, +/-Infinity and is significantly faster - * to parse and print. Some JSON parsers rely on strtod which does - * support hexadecimal floating points when C99 compliant. - */ -#ifndef FLATCC_JSON_PRINT_HEX_FLOAT -#define FLATCC_JSON_PRINT_HEX_FLOAT 0 -#endif - -/* - * Always print multipe enum flags like `color: "Red Green"` - * even when unquote is selected as an option for single - * value like `color: Green`. Otherwise multiple values - * are printed as `color: Red Green`, but this could break - * some flatbuffer json parser. - */ -#ifndef FLATCC_JSON_PRINT_ALWAYS_QUOTE_MULTIPLE_FLAGS -#define FLATCC_JSON_PRINT_ALWAYS_QUOTE_MULTIPLE_FLAGS 1 -#endif - -/* - * The general nesting limit may be lower, but for skipping - * JSON we do not need to - we can set this high as it only - * costs a single char per level in a stack array. - */ -#ifndef FLATCC_JSON_PARSE_GENERIC_MAX_NEST -#define FLATCC_JSON_PARSE_GENERIC_MAX_NEST 512 -#endif - -/* Store value even if it is default. */ -#ifndef FLATCC_JSON_PARSE_FORCE_DEFAULTS -#define FLATCC_JSON_PARSE_FORCE_DEFAULTS 0 -#endif - -#ifndef FLATCC_JSON_PARSE_ALLOW_UNQUOTED -#define FLATCC_JSON_PARSE_ALLOW_UNQUOTED 1 -#endif - -/* - * Multiple enum values are by default not permitted unless - * quoted like `color: "Red Green" as per Googles flatc JSON - * parser while a single value like `color: Red` can be - * unquoted. Enabling this setting will allow `color: Red - * Green`, but only if FLATCC_JSON_PARSE_ALLOW_UNQUOTED is - * also enabled. - */ -#ifndef FLATCC_JSON_PARSE_ALLOW_UNQUOTED_LIST -#define FLATCC_JSON_PARSE_ALLOW_UNQUOTED_LIST 0 -#endif - -#ifndef FLATCC_JSON_PARSE_ALLOW_UNKNOWN_FIELD -#define FLATCC_JSON_PARSE_ALLOW_UNKNOWN_FIELD 1 -#endif - -#ifndef FLATCC_JSON_PARSE_ALLOW_TRAILING_COMMA -#define FLATCC_JSON_PARSE_ALLOW_TRAILING_COMMA 1 -#endif - -/* - * Just parse to the closing bracket '}' if set. - * Otherwise parse to end by consuming space and - * fail if anything but space follows. - */ -#ifndef FLATCC_PARSE_IGNORE_TRAILING_DATA -#define FLATCC_PARSE_IGNORE_TRAILING_DATA 0 -#endif - -/* - * Optimize to parse a lot of white space, but - * in most cases it probably slows parsing down. - */ -#ifndef FLATCC_JSON_PARSE_WIDE_SPACE -#define FLATCC_JSON_PARSE_WIDE_SPACE 0 -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* FLATCC_RTCONFIG_H */ diff --git a/flatccrt/include/flatcc/flatcc_types.h b/flatccrt/include/flatcc/flatcc_types.h deleted file mode 100644 index 69605d2..0000000 --- a/flatccrt/include/flatcc/flatcc_types.h +++ /dev/null @@ -1,97 +0,0 @@ -#ifndef FLATCC_TYPES_H -#define FLATCC_TYPES_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -#ifndef UINT8_MAX -#include -#endif - -/* - * This should match generated type declaratios in - * `flatbuffers_common_reader.h` (might have different name prefix). - * Read only generated code does not depend on library code, - * hence the duplication. - */ -#ifndef flatbuffers_types_defined -#define flatbuffers_types_defined - -/* - * uoffset_t and soffset_t must be same integer type, except for sign. - * They can be (u)int16_t, (u)int32_t, or (u)int64_t. - * The default is (u)int32_t. - * - * voffset_t is expected to be uint16_t, but can experimentally be - * compiled from uint8_t up to uint32_t. - * - * ID_MAX is the largest value that can index a vtable. The table size - * is given as voffset value. Each id represents a voffset value index - * from 0 to max inclusive. Space is required for two header voffset - * fields and the unaddressible highest index (due to the table size - * representation). For 16-bit voffsets this yields a max of 2^15 - 4, - * or (2^16 - 1) / 2 - 3. - */ - -#define flatbuffers_uoffset_t_defined -#define flatbuffers_soffset_t_defined -#define flatbuffers_voffset_t_defined -#define flatbuffers_utype_t_defined -#define flatbuffers_bool_t_defined -#define flatbuffers_thash_t_defined -#define flatbuffers_fid_t_defined - -/* uoffset_t is also used for vector and string headers. */ -#define FLATBUFFERS_UOFFSET_MAX UINT32_MAX -#define FLATBUFFERS_SOFFSET_MAX INT32_MAX -#define FLATBUFFERS_SOFFSET_MIN INT32_MIN -#define FLATBUFFERS_VOFFSET_MAX UINT16_MAX -#define FLATBUFFERS_UTYPE_MAX UINT8_MAX -/* Well - the max of the underlying type. */ -#define FLATBUFFERS_BOOL_MAX UINT8_MAX -#define FLATBUFFERS_THASH_MAX UINT32_MAX - -#define FLATBUFFERS_ID_MAX (FLATBUFFERS_VOFFSET_MAX / sizeof(flatbuffers_voffset_t) - 3) -/* Vectors of empty structs can yield div by zero, so we must guard against this. */ -#define FLATBUFFERS_COUNT_MAX(elem_size) (FLATBUFFERS_UOFFSET_MAX/((elem_size) == 0 ? 1 : (elem_size))) - -#define FLATBUFFERS_UOFFSET_WIDTH 32 -#define FLATBUFFERS_COUNT_WIDTH 32 -#define FLATBUFFERS_SOFFSET_WIDTH 32 -#define FLATBUFFERS_VOFFSET_WIDTH 16 -#define FLATBUFFERS_UTYPE_WIDTH 8 -#define FLATBUFFERS_BOOL_WIDTH 8 -#define FLATBUFFERS_THASH_WIDTH 32 - -#define FLATBUFFERS_TRUE 1 -#define FLATBUFFERS_FALSE 0 - -#define FLATBUFFERS_PROTOCOL_IS_LE 1 -#define FLATBUFFERS_PROTOCOL_IS_BE 0 - -typedef uint32_t flatbuffers_uoffset_t; -typedef int32_t flatbuffers_soffset_t; -typedef uint16_t flatbuffers_voffset_t; -typedef uint8_t flatbuffers_utype_t; -typedef uint8_t flatbuffers_bool_t; -typedef uint32_t flatbuffers_thash_t; -/* Public facing type operations. */ -typedef flatbuffers_utype_t flatbuffers_union_type_t; - -static const flatbuffers_bool_t flatbuffers_true = FLATBUFFERS_TRUE; -static const flatbuffers_bool_t flatbuffers_false = FLATBUFFERS_FALSE; - -#define FLATBUFFERS_IDENTIFIER_SIZE (FLATBUFFERS_THASH_WIDTH / 8) - -typedef char flatbuffers_fid_t[FLATBUFFERS_IDENTIFIER_SIZE]; - -#endif /* flatbuffers_types_defined */ - -#ifdef __cplusplus -} -#endif - -#endif /* FLATCC_TYPES_H */ diff --git a/flatccrt/include/flatcc/flatcc_unaligned.h b/flatccrt/include/flatcc/flatcc_unaligned.h deleted file mode 100644 index a7dc546..0000000 --- a/flatccrt/include/flatcc/flatcc_unaligned.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef FLATCC_UNLIGNED_H -#define FLATCC_UNLIGNED_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include "flatcc/portable/punaligned.h" - -#define FLATCC_ALLOW_UNALIGNED_ACCESS PORTABLE_UNALIGNED_ACCESS - -#ifdef __cplusplus -} -#endif - -#endif /* FLATCC_UNLIGNED_H */ diff --git a/flatccrt/include/flatcc/flatcc_verifier.h b/flatccrt/include/flatcc/flatcc_verifier.h deleted file mode 100644 index 7e0d296..0000000 --- a/flatccrt/include/flatcc/flatcc_verifier.h +++ /dev/null @@ -1,239 +0,0 @@ -#ifndef FLATCC_VERIFIER_H -#define FLATCC_VERIFIER_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Runtime support for verifying flatbuffers. - * - * Link with the verifier implementation file. - * - * Note: - * - * 1) nested buffers will NOT have their identifier verified. - * The user may do so subsequently. The reason is in part because - * the information is not readily avaible without generated reader code, - * in part because the buffer might use a different, but valid, - * identifier and the user has no chance of specifiying this in the - * verifier code. The root verifier also doesn't assume a specific id - * but accepts a user supplied input which may be null. - * - * 2) All offsets in a buffer are verified for alignment relative to the - * buffer start, but the buffer itself is only assumed to aligned to - * uoffset_t. A reader should therefore ensure buffer alignment separately - * before reading the buffer. Nested buffers are in fact checked for - * alignment, but still only relative to the root buffer. - * - * 3) The max nesting level includes nested buffer nestings, so the - * verifier might fail even if the individual buffers are otherwise ok. - * This is to prevent abuse with lots of nested buffers. - * - * - * IMPORTANT: - * - * Even if verifier passes, the buffer may be invalid to access due to - * lack of alignemnt in memory, but the verifier is safe to call. - * - * NOTE: The buffer is not safe to modify after verification because an - * attacker may craft overlapping data structures such that modification - * of one field updates another in a way that violates the buffer - * constraints. This may also be caused by a clever compression scheme. - * - * It is likely faster to rewrite the table although this is also - * dangerous because an attacker (or even normal user) can draft a DAG - * that explodes when expanded carelesslessly. A safer approach is to - * hash all object references written and reuse those that match. This - * will expand references into other objects while bounding expansion - * and it will be safe to update assuming shared objects are ok to - * update. - * - */ - -#include "flatcc/flatcc_types.h" - -#define FLATCC_VERIFY_ERROR_MAP(XX)\ - XX(ok, "ok")\ - XX(buffer_header_too_small, "buffer header too small")\ - XX(identifier_mismatch, "identifier mismatch")\ - XX(max_nesting_level_reached, "max nesting level reached")\ - XX(required_field_missing, "required field missing")\ - XX(runtime_buffer_header_not_aligned, "runtime: buffer header not aligned")\ - XX(runtime_buffer_size_too_large, "runtime: buffer size too large")\ - XX(string_not_zero_terminated, "string not zero terminated")\ - XX(string_out_of_range, "string out of range")\ - XX(struct_out_of_range, "struct out of range")\ - XX(struct_size_overflow, "struct size overflow")\ - XX(struct_unaligned, "struct unaligned")\ - XX(table_field_not_aligned, "table field not aligned")\ - XX(table_field_out_of_range, "table field out of range")\ - XX(table_field_size_overflow, "table field size overflow")\ - XX(table_header_out_of_range_or_unaligned, "table header out of range or unaligned")\ - XX(vector_header_out_of_range_or_unaligned, "vector header out of range or unaligned")\ - XX(string_header_out_of_range_or_unaligned, "string header out of range or unaligned")\ - XX(offset_out_of_range, "offset out of range")\ - XX(table_offset_out_of_range_or_unaligned, "table offset out of range or unaligned")\ - XX(table_size_out_of_range, "table size out of range")\ - XX(type_field_absent_from_required_union_field, "type field absent from required union field")\ - XX(type_field_absent_from_required_union_vector_field, "type field absent from required union vector field")\ - XX(union_cannot_have_a_table_without_a_type, "union cannot have a table without a type")\ - XX(union_type_NONE_cannot_have_a_value, "union value field present with type NONE")\ - XX(vector_count_exceeds_representable_vector_size, "vector count exceeds representable vector size")\ - XX(vector_out_of_range, "vector out of range")\ - XX(vtable_header_out_of_range, "vtable header out of range")\ - XX(vtable_header_too_small, "vtable header too small")\ - XX(vtable_offset_out_of_range_or_unaligned, "vtable offset out of range or unaligned")\ - XX(vtable_size_out_of_range_or_unaligned, "vtable size out of range or unaligned")\ - XX(vtable_size_overflow, "vtable size overflow")\ - XX(union_element_absent_without_type_NONE, "union element absent without type NONE")\ - XX(union_element_present_with_type_NONE, "union element present with type NONE")\ - XX(union_vector_length_mismatch, "union type and table vectors have different lengths")\ - XX(union_vector_verification_not_supported, "union vector verification not supported")\ - XX(not_supported, "not supported") - - -enum flatcc_verify_error_no { -#define XX(no, str) flatcc_verify_error_##no, - FLATCC_VERIFY_ERROR_MAP(XX) -#undef XX -}; - -#define flatcc_verify_ok flatcc_verify_error_ok - -const char *flatcc_verify_error_string(int err); - -/* - * Type specific table verifier function that checks each known field - * for existence in the vtable and then calls the appropriate verifier - * function in this library. - * - * The table descriptor values have been verified for bounds, overflow, - * and alignment, but vtable entries after header must be verified - * for all fields the table verifier function understands. - * - * Calls other typespecific verifier functions recursively whenever a - * table field, union or table vector is encountered. - */ -typedef struct flatcc_table_verifier_descriptor flatcc_table_verifier_descriptor_t; -struct flatcc_table_verifier_descriptor { - /* Pointer to buffer. Not assumed to be aligned beyond uoffset_t. */ - const void *buf; - /* Buffer size. */ - flatbuffers_uoffset_t end; - /* Time to live: number nesting levels left before failure. */ - int ttl; - /* Vtable of current table. */ - const void *vtable; - /* Table offset relative to buffer start */ - flatbuffers_uoffset_t table; - /* Table end relative to buffer start as per vtable[1] field. */ - flatbuffers_voffset_t tsize; - /* Size of vtable in bytes. */ - flatbuffers_voffset_t vsize; -}; - -typedef int flatcc_table_verifier_f(flatcc_table_verifier_descriptor_t *td); - -typedef struct flatcc_union_verifier_descriptor flatcc_union_verifier_descriptor_t; - -struct flatcc_union_verifier_descriptor { - /* Pointer to buffer. Not assumed to be aligned beyond uoffset_t. */ - const void *buf; - /* Buffer size. */ - flatbuffers_uoffset_t end; - /* Time to live: number nesting levels left before failure. */ - int ttl; - /* Type of union value to be verified */ - flatbuffers_utype_t type; - /* Offset relative to buffer start to where union value offset is stored. */ - flatbuffers_uoffset_t base; - /* Offset of union value relative to base. */ - flatbuffers_uoffset_t offset; -}; - -typedef int flatcc_union_verifier_f(flatcc_union_verifier_descriptor_t *ud); - -/* - * The `as_root` functions are normally the only functions called - * explicitly in this interface. - * - * If `fid` is null, the identifier is not checked and is allowed to be entirely absent. - * - * The buffer must at least be aligned to uoffset_t on systems that - * require aligned memory addresses. The buffer pointers alignment is - * not significant to internal verification of the buffer. - */ -int flatcc_verify_struct_as_root(const void *buf, size_t bufsiz, const char *fid, - size_t size, uint16_t align); - -int flatcc_verify_struct_as_typed_root(const void *buf, size_t bufsiz, flatbuffers_thash_t thash, - size_t size, uint16_t align); - -int flatcc_verify_table_as_root(const void *buf, size_t bufsiz, const char *fid, - flatcc_table_verifier_f *root_tvf); - -int flatcc_verify_table_as_typed_root(const void *buf, size_t bufsiz, flatbuffers_thash_t thash, - flatcc_table_verifier_f *root_tvf); -/* - * The buffer header is verified by any of the `_as_root` verifiers, but - * this function may be used as a quick sanity check. - */ -int flatcc_verify_buffer_header(const void *buf, size_t bufsiz, const char *fid); - -int flatcc_verify_typed_buffer_header(const void *buf, size_t bufsiz, flatbuffers_thash_t type_hash); - -/* - * The following functions are typically called by a generated table - * verifier function. - */ - -/* Scalar, enum or struct field. */ -int flatcc_verify_field(flatcc_table_verifier_descriptor_t *td, - flatbuffers_voffset_t id, size_t size, uint16_t align); -/* Vector of scalars, enums or structs. */ -int flatcc_verify_vector_field(flatcc_table_verifier_descriptor_t *td, - flatbuffers_voffset_t id, int required, size_t elem_size, uint16_t align, size_t max_count); -int flatcc_verify_string_field(flatcc_table_verifier_descriptor_t *td, - flatbuffers_voffset_t id, int required); -int flatcc_verify_string_vector_field(flatcc_table_verifier_descriptor_t *td, - flatbuffers_voffset_t id, int required); -int flatcc_verify_table_field(flatcc_table_verifier_descriptor_t *td, - flatbuffers_voffset_t id, int required, flatcc_table_verifier_f tvf); -int flatcc_verify_table_vector_field(flatcc_table_verifier_descriptor_t *td, - flatbuffers_voffset_t id, int required, flatcc_table_verifier_f tvf); -/* Table verifiers pass 0 as fid. */ -int flatcc_verify_struct_as_nested_root(flatcc_table_verifier_descriptor_t *td, - flatbuffers_voffset_t id, int required, const char *fid, - size_t size, uint16_t align); -int flatcc_verify_table_as_nested_root(flatcc_table_verifier_descriptor_t *td, - flatbuffers_voffset_t id, int required, const char *fid, - uint16_t align, flatcc_table_verifier_f tvf); - -/* - * A NONE type will not accept a table being present, and a required - * union will not accept a type field being absent, and an absent type - * field will not accept a table field being present. - * - * If the above checks out and the type is not NONE, the uvf callback - * is executed. It must test each known table type and silently accept - * any unknown table type for forward compatibility. A union table - * value is verified without the required flag because an absent table - * encodes a typed NULL value while an absent type field encodes a - * missing union which fails if required. - */ -int flatcc_verify_union_field(flatcc_table_verifier_descriptor_t *td, - flatbuffers_voffset_t id, int required, flatcc_union_verifier_f uvf); - -int flatcc_verify_union_vector_field(flatcc_table_verifier_descriptor_t *td, - flatbuffers_voffset_t id, int required, flatcc_union_verifier_f uvf); - -int flatcc_verify_union_table(flatcc_union_verifier_descriptor_t *ud, flatcc_table_verifier_f *tvf); -int flatcc_verify_union_struct(flatcc_union_verifier_descriptor_t *ud, size_t size, uint16_t align); -int flatcc_verify_union_string(flatcc_union_verifier_descriptor_t *ud); - -#ifdef __cplusplus -} -#endif - -#endif /* FLATCC_VERIFIER_H */ diff --git a/flatccrt/include/flatcc/flatcc_version.h b/flatccrt/include/flatcc/flatcc_version.h deleted file mode 100644 index 79ab1b5..0000000 --- a/flatccrt/include/flatcc/flatcc_version.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifdef __cplusplus -extern "C" { -#endif - -#define FLATCC_VERSION_TEXT "0.6.0" -#define FLATCC_VERSION_MAJOR 0 -#define FLATCC_VERSION_MINOR 6 -#define FLATCC_VERSION_PATCH 0 -/* 1 or 0 */ -#define FLATCC_VERSION_RELEASED 1 - -#ifdef __cplusplus -} -#endif diff --git a/flatccrt/include/flatcc/portable/LICENSE b/flatccrt/include/flatcc/portable/LICENSE deleted file mode 100644 index bb7ca57..0000000 --- a/flatccrt/include/flatcc/portable/LICENSE +++ /dev/null @@ -1,14 +0,0 @@ -Copyright (c) 2016 Mikkel F. Jørgensen, dvide.com -Some files also Copyright author of MathGeoLib (https://github.com/juj) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. http://www.apache.org/licenses/LICENSE-2.0 diff --git a/flatccrt/include/flatcc/portable/README.md b/flatccrt/include/flatcc/portable/README.md deleted file mode 100644 index 512b1a8..0000000 --- a/flatccrt/include/flatcc/portable/README.md +++ /dev/null @@ -1,57 +0,0 @@ -A small library for adding C11 compatibility to older C compilers, but -only a small highly useful subset such as static assertions, inline -functions and alignment. - -C++ is not a primary target, but the library has been updated to be more -C++ friendly based on user feedback. - -Many compilers already have the required functionality but with slightly -different names and arguments. - -In addition, compatibility with the Linux `` system file is -provided, and "punaligned.h" is provided for unaligned memory reads -which in part depends on endian support. - -The library also provides fast integer printing and floating point -printing and parsing optionally using the grisu3 algorithm, but can fall -back to strtod and related. The `pgrisu3` folder is header only and -excludes test cases found in the main grisu3 project the files were -extracted from. Base64 conversion is also provided. - -Integer conversion is not just an optimization. It is more difficult -than it would appear to portably parse an integer of known size such as -`uint64_t` up to at most n bytes which is needed for safe parsing. At -the same time, the sometimes significant performance gains warrants -custom implementations that might as well be done once and for all. - -Files can be included individually, or portable.h may be included to get -all functionality. If the compiler is C11 compliant, portable.h will not -include anything, except: it will provide a patch for static assertions -which clang does not fully support in all versions even with C11 flagged. - -The grisu3 header files are the runtime files for the Grisu3 floating -point conversion to/from text C port. Test coverage is provided separately. -This library can be used indirectly via pparsefp.h and pprintfp.h. - -The `pstatic_assert.h` file is often needed on C11 systems because the -compiler and standard library may support `_Static_assert` without -`static_assert`. For compilers without `_Static_assert`, a unique -identifier is needed for each assertion. This is done non-standard with -the `__COUNTER__` macro, but has a fallback to `pstatic_assert_scope.h` -for systems witout the `__COUNTER__` macro. Because of this fallback, -`pstatic_assert.h` needs to be included in every file using -`static_assert` in order to increment a scope counter, otherwise there -is a risk of assert identifier conflicts when `static_assert` happen on -the same line in different files. - -The `paligned_alloc.h` file implements the non-standard `aligned_free` -to match the C11 standard `aligned_alloc` call. `aligned_free` is -normally equivalent to `free`, but not on systems where `aligned_free` -cannot be implemented using a system provived `free` call. Use of -`aligned_free` is thus optional on some systems, but using it increases -general portablity at the cost of pure C11 compatibility. - -IMPORTANT NOTE: this library has been used on various platforms and -updated with user feedback but it is impossibly to systematically test -all platforms so please test for specific uses cases and report -any issues upstream. diff --git a/flatccrt/include/flatcc/portable/grisu3_math.h b/flatccrt/include/flatcc/portable/grisu3_math.h deleted file mode 100644 index 7e354bd..0000000 --- a/flatccrt/include/flatcc/portable/grisu3_math.h +++ /dev/null @@ -1,320 +0,0 @@ -/* - * Copyright (c) 2016 Mikkel F. Jørgensen, dvide.com - * Copyright author of MathGeoLib (https://github.com/juj) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. http://www.apache.org/licenses/LICENSE-2.0 - */ - -/* 2016-02-02: Updated by mikkelfj - * - * Extracted from MatGeoLib grisu3.c, Apache 2.0 license, and extended. - * - * This file is usually include via grisu3_print.h or grisu3_parse.h. - * - * The original MatGeoLib dtoa_grisu3 implementation is largely - * unchanged except for the uint64 to double cast. The remaining changes - * are file structure, name changes, and new additions for parsing: - * - * - Split into header files only: - * grisu3_math.h, grisu3_print.h, (added grisu3_parse.h) - * - * - names prefixed with grisu3_, grisu3_diy_fp_, GRISU3_. - * - added static to all functions. - * - disabled clang unused function warnings. - * - guarded to allow for alternative impl. - * - added extra numeric constants needed for parsing. - * - added dec_pow, cast_double_from_diy_fp. - * - changed some function names for consistency. - * - moved printing specific grisu3 functions to grisu3_print.h. - * - changed double to uint64 cast to avoid aliasing. - * - added new grisu3_parse.h for parsing doubles. - * - grisu3_print_double (dtoa_grisu3) format .1 as 0.1 needed for valid JSON output - * and grisu3_parse_double wouldn't consume it. - * - grsu3_print_double changed formatting to prefer 0.012 over 1.2e-2. - * - * These changes make it possible to include the files as headers only - * in other software libraries without risking name conflicts, and to - * extend the implementation with a port of Googles Double Conversion - * strtod functionality for parsing doubles. - * - * Extracted from: rev. 915501a / Dec 22, 2015 - * - * MathGeoLib License: http://www.apache.org/licenses/LICENSE-2.0.html - */ - -#ifndef GRISU3_MATH_H -#define GRISU3_MATH_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Guarded to allow inclusion of pstdint.h first, if stdint.h is not supported. */ -#ifndef UINT8_MAX -#include /* uint64_t etc. */ -#endif -#include /* assert */ - -#ifdef _MSC_VER -#pragma warning(disable : 4204) /* nonstandard extension used : non-constant aggregate initializer */ -#endif - -#define GRISU3_D64_SIGN 0x8000000000000000ULL -#define GRISU3_D64_EXP_MASK 0x7FF0000000000000ULL -#define GRISU3_D64_FRACT_MASK 0x000FFFFFFFFFFFFFULL -#define GRISU3_D64_IMPLICIT_ONE 0x0010000000000000ULL -#define GRISU3_D64_EXP_POS 52 -#define GRISU3_D64_EXP_BIAS 1075 -#define GRISU3_D64_DENORM_EXP (-GRISU3_D64_EXP_BIAS + 1) -#define GRISU3_DIY_FP_FRACT_SIZE 64 -#define GRISU3_D_1_LOG2_10 0.30102999566398114 /* 1 / lg(10) */ -#define GRISU3_MIN_TARGET_EXP -60 -#define GRISU3_MASK32 0xFFFFFFFFULL -#define GRISU3_MIN_CACHED_EXP -348 -#define GRISU3_MAX_CACHED_EXP 340 -#define GRISU3_CACHED_EXP_STEP 8 -#define GRISU3_D64_MAX_DEC_EXP 309 -#define GRISU3_D64_MIN_DEC_EXP -324 -#define GRISU3_D64_INF GRISU3_D64_EXP_MASK - -#define GRISU3_MIN(x,y) ((x) <= (y) ? (x) : (y)) -#define GRISU3_MAX(x,y) ((x) >= (y) ? (x) : (y)) - - -typedef struct grisu3_diy_fp -{ - uint64_t f; - int e; -} grisu3_diy_fp_t; - -typedef struct grisu3_diy_fp_power -{ - uint64_t fract; - int16_t b_exp, d_exp; -} grisu3_diy_fp_power_t; - -typedef union { - uint64_t u64; - double d64; -} grisu3_cast_double_t; - -static uint64_t grisu3_cast_uint64_from_double(double d) -{ - grisu3_cast_double_t cd; - cd.d64 = d; - return cd.u64; -} - -static double grisu3_cast_double_from_uint64(uint64_t u) -{ - grisu3_cast_double_t cd; - cd.u64 = u; - return cd.d64; -} - -#define grisu3_double_infinity grisu3_cast_double_from_uint64(GRISU3_D64_INF) -#define grisu3_double_nan grisu3_cast_double_from_uint64(GRISU3_D64_INF + 1) - -static const grisu3_diy_fp_power_t grisu3_diy_fp_pow_cache[] = -{ - { 0xfa8fd5a0081c0288ULL, -1220, -348 }, - { 0xbaaee17fa23ebf76ULL, -1193, -340 }, - { 0x8b16fb203055ac76ULL, -1166, -332 }, - { 0xcf42894a5dce35eaULL, -1140, -324 }, - { 0x9a6bb0aa55653b2dULL, -1113, -316 }, - { 0xe61acf033d1a45dfULL, -1087, -308 }, - { 0xab70fe17c79ac6caULL, -1060, -300 }, - { 0xff77b1fcbebcdc4fULL, -1034, -292 }, - { 0xbe5691ef416bd60cULL, -1007, -284 }, - { 0x8dd01fad907ffc3cULL, -980, -276 }, - { 0xd3515c2831559a83ULL, -954, -268 }, - { 0x9d71ac8fada6c9b5ULL, -927, -260 }, - { 0xea9c227723ee8bcbULL, -901, -252 }, - { 0xaecc49914078536dULL, -874, -244 }, - { 0x823c12795db6ce57ULL, -847, -236 }, - { 0xc21094364dfb5637ULL, -821, -228 }, - { 0x9096ea6f3848984fULL, -794, -220 }, - { 0xd77485cb25823ac7ULL, -768, -212 }, - { 0xa086cfcd97bf97f4ULL, -741, -204 }, - { 0xef340a98172aace5ULL, -715, -196 }, - { 0xb23867fb2a35b28eULL, -688, -188 }, - { 0x84c8d4dfd2c63f3bULL, -661, -180 }, - { 0xc5dd44271ad3cdbaULL, -635, -172 }, - { 0x936b9fcebb25c996ULL, -608, -164 }, - { 0xdbac6c247d62a584ULL, -582, -156 }, - { 0xa3ab66580d5fdaf6ULL, -555, -148 }, - { 0xf3e2f893dec3f126ULL, -529, -140 }, - { 0xb5b5ada8aaff80b8ULL, -502, -132 }, - { 0x87625f056c7c4a8bULL, -475, -124 }, - { 0xc9bcff6034c13053ULL, -449, -116 }, - { 0x964e858c91ba2655ULL, -422, -108 }, - { 0xdff9772470297ebdULL, -396, -100 }, - { 0xa6dfbd9fb8e5b88fULL, -369, -92 }, - { 0xf8a95fcf88747d94ULL, -343, -84 }, - { 0xb94470938fa89bcfULL, -316, -76 }, - { 0x8a08f0f8bf0f156bULL, -289, -68 }, - { 0xcdb02555653131b6ULL, -263, -60 }, - { 0x993fe2c6d07b7facULL, -236, -52 }, - { 0xe45c10c42a2b3b06ULL, -210, -44 }, - { 0xaa242499697392d3ULL, -183, -36 }, - { 0xfd87b5f28300ca0eULL, -157, -28 }, - { 0xbce5086492111aebULL, -130, -20 }, - { 0x8cbccc096f5088ccULL, -103, -12 }, - { 0xd1b71758e219652cULL, -77, -4 }, - { 0x9c40000000000000ULL, -50, 4 }, - { 0xe8d4a51000000000ULL, -24, 12 }, - { 0xad78ebc5ac620000ULL, 3, 20 }, - { 0x813f3978f8940984ULL, 30, 28 }, - { 0xc097ce7bc90715b3ULL, 56, 36 }, - { 0x8f7e32ce7bea5c70ULL, 83, 44 }, - { 0xd5d238a4abe98068ULL, 109, 52 }, - { 0x9f4f2726179a2245ULL, 136, 60 }, - { 0xed63a231d4c4fb27ULL, 162, 68 }, - { 0xb0de65388cc8ada8ULL, 189, 76 }, - { 0x83c7088e1aab65dbULL, 216, 84 }, - { 0xc45d1df942711d9aULL, 242, 92 }, - { 0x924d692ca61be758ULL, 269, 100 }, - { 0xda01ee641a708deaULL, 295, 108 }, - { 0xa26da3999aef774aULL, 322, 116 }, - { 0xf209787bb47d6b85ULL, 348, 124 }, - { 0xb454e4a179dd1877ULL, 375, 132 }, - { 0x865b86925b9bc5c2ULL, 402, 140 }, - { 0xc83553c5c8965d3dULL, 428, 148 }, - { 0x952ab45cfa97a0b3ULL, 455, 156 }, - { 0xde469fbd99a05fe3ULL, 481, 164 }, - { 0xa59bc234db398c25ULL, 508, 172 }, - { 0xf6c69a72a3989f5cULL, 534, 180 }, - { 0xb7dcbf5354e9beceULL, 561, 188 }, - { 0x88fcf317f22241e2ULL, 588, 196 }, - { 0xcc20ce9bd35c78a5ULL, 614, 204 }, - { 0x98165af37b2153dfULL, 641, 212 }, - { 0xe2a0b5dc971f303aULL, 667, 220 }, - { 0xa8d9d1535ce3b396ULL, 694, 228 }, - { 0xfb9b7cd9a4a7443cULL, 720, 236 }, - { 0xbb764c4ca7a44410ULL, 747, 244 }, - { 0x8bab8eefb6409c1aULL, 774, 252 }, - { 0xd01fef10a657842cULL, 800, 260 }, - { 0x9b10a4e5e9913129ULL, 827, 268 }, - { 0xe7109bfba19c0c9dULL, 853, 276 }, - { 0xac2820d9623bf429ULL, 880, 284 }, - { 0x80444b5e7aa7cf85ULL, 907, 292 }, - { 0xbf21e44003acdd2dULL, 933, 300 }, - { 0x8e679c2f5e44ff8fULL, 960, 308 }, - { 0xd433179d9c8cb841ULL, 986, 316 }, - { 0x9e19db92b4e31ba9ULL, 1013, 324 }, - { 0xeb96bf6ebadf77d9ULL, 1039, 332 }, - { 0xaf87023b9bf0ee6bULL, 1066, 340 } -}; - -/* Avoid dependence on lib math to get (int)ceil(v) */ -static int grisu3_iceil(double v) -{ - int k = (int)v; - if (v < 0) return k; - return v - k == 0 ? k : k + 1; -} - -static int grisu3_diy_fp_cached_pow(int exp, grisu3_diy_fp_t *p) -{ - int k = grisu3_iceil((exp+GRISU3_DIY_FP_FRACT_SIZE-1) * GRISU3_D_1_LOG2_10); - int i = (k-GRISU3_MIN_CACHED_EXP-1) / GRISU3_CACHED_EXP_STEP + 1; - p->f = grisu3_diy_fp_pow_cache[i].fract; - p->e = grisu3_diy_fp_pow_cache[i].b_exp; - return grisu3_diy_fp_pow_cache[i].d_exp; -} - -static grisu3_diy_fp_t grisu3_diy_fp_minus(grisu3_diy_fp_t x, grisu3_diy_fp_t y) -{ - grisu3_diy_fp_t d; d.f = x.f - y.f; d.e = x.e; - assert(x.e == y.e && x.f >= y.f); - return d; -} - -static grisu3_diy_fp_t grisu3_diy_fp_multiply(grisu3_diy_fp_t x, grisu3_diy_fp_t y) -{ - uint64_t a, b, c, d, ac, bc, ad, bd, tmp; - grisu3_diy_fp_t r; - a = x.f >> 32; b = x.f & GRISU3_MASK32; - c = y.f >> 32; d = y.f & GRISU3_MASK32; - ac = a*c; bc = b*c; - ad = a*d; bd = b*d; - tmp = (bd >> 32) + (ad & GRISU3_MASK32) + (bc & GRISU3_MASK32); - tmp += 1U << 31; /* round */ - r.f = ac + (ad >> 32) + (bc >> 32) + (tmp >> 32); - r.e = x.e + y.e + 64; - return r; -} - -static grisu3_diy_fp_t grisu3_diy_fp_normalize(grisu3_diy_fp_t n) -{ - assert(n.f != 0); - while(!(n.f & 0xFFC0000000000000ULL)) { n.f <<= 10; n.e -= 10; } - while(!(n.f & GRISU3_D64_SIGN)) { n.f <<= 1; --n.e; } - return n; -} - -static grisu3_diy_fp_t grisu3_cast_diy_fp_from_double(double d) -{ - grisu3_diy_fp_t fp; - uint64_t u64 = grisu3_cast_uint64_from_double(d); - if (!(u64 & GRISU3_D64_EXP_MASK)) { fp.f = u64 & GRISU3_D64_FRACT_MASK; fp.e = 1 - GRISU3_D64_EXP_BIAS; } - else { fp.f = (u64 & GRISU3_D64_FRACT_MASK) + GRISU3_D64_IMPLICIT_ONE; fp.e = (int)((u64 & GRISU3_D64_EXP_MASK) >> GRISU3_D64_EXP_POS) - GRISU3_D64_EXP_BIAS; } - return fp; -} - -static double grisu3_cast_double_from_diy_fp(grisu3_diy_fp_t n) -{ - const uint64_t hidden_bit = GRISU3_D64_IMPLICIT_ONE; - const uint64_t frac_mask = GRISU3_D64_FRACT_MASK; - const int denorm_exp = GRISU3_D64_DENORM_EXP; - const int exp_bias = GRISU3_D64_EXP_BIAS; - const int exp_pos = GRISU3_D64_EXP_POS; - - grisu3_diy_fp_t v = n; - uint64_t e_biased; - - while (v.f > hidden_bit + frac_mask) { - v.f >>= 1; - ++v.e; - } - if (v.e < denorm_exp) { - return 0.0; - } - while (v.e > denorm_exp && (v.f & hidden_bit) == 0) { - v.f <<= 1; - --v.e; - } - if (v.e == denorm_exp && (v.f & hidden_bit) == 0) { - e_biased = 0; - } else { - e_biased = (uint64_t)(v.e + exp_bias); - } - return grisu3_cast_double_from_uint64((v.f & frac_mask) | (e_biased << exp_pos)); -} - -/* pow10_cache[i] = 10^(i-1) */ -static const unsigned int grisu3_pow10_cache[] = { 0, 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 }; - -static int grisu3_largest_pow10(uint32_t n, int n_bits, uint32_t *power) -{ - int guess = ((n_bits + 1) * 1233 >> 12) + 1/*skip first entry*/; - if (n < grisu3_pow10_cache[guess]) --guess; /* We don't have any guarantees that 2^n_bits <= n. */ - *power = grisu3_pow10_cache[guess]; - return guess; -} - -#ifdef __cplusplus -} -#endif - -#endif /* GRISU3_MATH_H */ diff --git a/flatccrt/include/flatcc/portable/grisu3_parse.h b/flatccrt/include/flatcc/portable/grisu3_parse.h deleted file mode 100644 index fec5047..0000000 --- a/flatccrt/include/flatcc/portable/grisu3_parse.h +++ /dev/null @@ -1,583 +0,0 @@ -/* - * Copyright (c) 2016 Mikkel F. Jørgensen, dvide.com - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. http://www.apache.org/licenses/LICENSE-2.0 - */ - -/* - * Port of parts of Google Double Conversion strtod functionality - * but with fallback to strtod instead of a bignum implementation. - * - * Based on grisu3 math from MathGeoLib. - * - * See also grisu3_math.h comments. - */ - -#ifndef GRISU3_PARSE_H -#define GRISU3_PARSE_H - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef UINT8_MAX -#include -#endif - -#include -#include -#include - -#include "grisu3_math.h" - - -/* - * The maximum number characters a valid number may contain. The parse - * fails if the input length is longer but the character after max len - * was part of the number. - * - * The length should not be set too high because it protects against - * overflow in the exponent part derived from the input length. - */ -#define GRISU3_NUM_MAX_LEN 1000 - -/* - * The lightweight "portable" C library recognizes grisu3 support if - * included first. - */ -#define grisu3_parse_double_is_defined 1 - -/* - * Disable to compare performance and to test diy_fp algorithm in - * broader range. - */ -#define GRISU3_PARSE_FAST_CASE - -/* May result in a one off error, otherwise when uncertain, fall back to strtod. */ -//#define GRISU3_PARSE_ALLOW_ERROR - - -/* - * The dec output exponent jumps in 8, so the result is offset at most - * by 7 when the input is within range. - */ -static int grisu3_diy_fp_cached_dec_pow(int d_exp, grisu3_diy_fp_t *p) -{ - const int cached_offset = -GRISU3_MIN_CACHED_EXP; - const int d_exp_dist = GRISU3_CACHED_EXP_STEP; - int i, a_exp; - - assert(GRISU3_MIN_CACHED_EXP <= d_exp); - assert(d_exp < GRISU3_MAX_CACHED_EXP + d_exp_dist); - - i = (d_exp + cached_offset) / d_exp_dist; - a_exp = grisu3_diy_fp_pow_cache[i].d_exp; - p->f = grisu3_diy_fp_pow_cache[i].fract; - p->e = grisu3_diy_fp_pow_cache[i].b_exp; - - assert(a_exp <= d_exp); - assert(d_exp < a_exp + d_exp_dist); - - return a_exp; -} - -/* - * Ported from google double conversion strtod using - * MathGeoLibs diy_fp functions for grisu3 in C. - * - * ulp_half_error is set if needed to trunacted non-zero trialing - * characters. - * - * The actual value we need to encode is: - * - * (sign ? -1 : 1) * fraction * 2 ^ (exponent - fraction_exp) - * where exponent is the base 10 exponent assuming the decimal point is - * after the first digit. fraction_exp is the base 10 magnitude of the - * fraction or number of significant digits - 1. - * - * If the exponent is between 0 and 22 and the fraction is encoded in - * the lower 53 bits (the largest bit is implicit in a double, but not - * in this fraction), then the value can be trivially converted to - * double without loss of precision. If the fraction was in fact - * multiplied by trailing zeroes that we didn't convert to exponent, - * we there are larger values the 53 bits that can also be encoded - * trivially - but then it is better to handle this during parsing - * if it is worthwhile. We do not optimize for this here, because it - * can be done in a simple check before calling, and because it might - * not be worthwile to do at all since it cery likely will fail for - * numbers printed to be convertible back to double without loss. - * - * Returns 0 if conversion was not exact. In that case the vale is - * either one smaller than the correct one, or the correct one. - * - * Exponents must be range protected before calling otherwise cached - * powers will blow up. - * - * Google Double Conversion seems to prefer the following notion: - * - * x >= 10^309 => +Inf - * x <= 10^-324 => 0, - * - * max double: HUGE_VAL = 1.7976931348623157 * 10^308 - * min double: 4.9406564584124654 * 10^-324 - * - * Values just below or above min/max representable number - * may round towards large/small non-Inf/non-neg values. - * - * but `strtod` seems to return +/-HUGE_VAL on overflow? - */ -static int grisu3_diy_fp_encode_double(uint64_t fraction, int exponent, int fraction_exp, int ulp_half_error, double *result) -{ - /* - * Error is measures in fractions of integers, so we scale up to get - * some resolution to represent error expressions. - */ - const int log2_error_one = 3; - const int error_one = 1 << log2_error_one; - const int denorm_exp = GRISU3_D64_DENORM_EXP; - const uint64_t hidden_bit = GRISU3_D64_IMPLICIT_ONE; - const int diy_size = GRISU3_DIY_FP_FRACT_SIZE; - const int max_digits = 19; - - int error = ulp_half_error ? error_one / 2 : 0; - int d_exp = (exponent - fraction_exp); - int a_exp; - int o_exp; - grisu3_diy_fp_t v = { fraction, 0 }; - grisu3_diy_fp_t cp; - grisu3_diy_fp_t rounded; - int mag; - int prec; - int prec_bits; - int half_way; - - /* When fractions in a double aren't stored with implicit msb fraction bit. */ - - /* Shift fraction to msb. */ - v = grisu3_diy_fp_normalize(v); - /* The half point error moves up while the exponent moves down. */ - error <<= -v.e; - - a_exp = grisu3_diy_fp_cached_dec_pow(d_exp, &cp); - - /* Interpolate between cached powers at distance 8. */ - if (a_exp != d_exp) { - int adj_exp = d_exp - a_exp - 1; - static grisu3_diy_fp_t cp_10_lut[] = { - { 0xa000000000000000ULL, -60 }, - { 0xc800000000000000ULL, -57 }, - { 0xfa00000000000000ULL, -54 }, - { 0x9c40000000000000ULL, -50 }, - { 0xc350000000000000ULL, -47 }, - { 0xf424000000000000ULL, -44 }, - { 0x9896800000000000ULL, -40 }, - }; - assert(adj_exp >= 0 && adj_exp < 7); - v = grisu3_diy_fp_multiply(v, cp_10_lut[adj_exp]); - - /* 20 decimal digits won't always fit in 64 bit. - * (`fraction_exp` is one less than significant decimal - * digits in fraction, e.g. 1 * 10e0). - * If we cannot fit, introduce 1/2 ulp error - * (says double conversion reference impl.) */ - if (1 + fraction_exp + adj_exp > max_digits) { - error += error_one / 2; - } - } - - v = grisu3_diy_fp_multiply(v, cp); - /* - * Google double conversion claims that: - * - * The error introduced by a multiplication of a*b equals - * error_a + error_b + error_a*error_b/2^64 + 0.5 - * Substituting a with 'input' and b with 'cached_power' we have - * error_b = 0.5 (all cached powers have an error of less than 0.5 ulp), - * error_ab = 0 or 1 / error_oner > error_a*error_b/ 2^64 - * - * which in our encoding becomes: - * error_a = error_one/2 - * error_ab = 1 / error_one (rounds up to 1 if error != 0, or 0 * otherwise) - * fixed_error = error_one/2 - * - * error += error_a + fixed_error + (error ? 1 : 0) - * - * (this isn't entirely clear, but that is as close as we get). - */ - error += error_one + (error ? 1 : 0); - - o_exp = v.e; - v = grisu3_diy_fp_normalize(v); - /* Again, if we shift the significant bits, the error moves along. */ - error <<= o_exp - v.e; - - /* - * The value `v` is bounded by 2^mag which is 64 + v.e. because we - * just normalized it by shifting towards msb. - */ - mag = diy_size + v.e; - - /* The effective magnitude of the IEEE double representation. */ - mag = mag >= diy_size + denorm_exp ? diy_size : mag <= denorm_exp ? 0 : mag - denorm_exp; - prec = diy_size - mag; - if (prec + log2_error_one >= diy_size) { - int e_scale = prec + log2_error_one - diy_size - 1; - v.f >>= e_scale; - v.e += e_scale; - error = (error >> e_scale) + 1 + error_one; - prec -= e_scale; - } - rounded.f = v.f >> prec; - rounded.e = v.e + prec; - prec_bits = (v.f & ((uint64_t)1 << (prec - 1))) * error_one; - half_way = ((uint64_t)1 << (prec - 1)) * error_one; - if (prec >= half_way + error) { - rounded.f++; - /* Prevent overflow. */ - if (rounded.f & (hidden_bit << 1)) { - rounded.f >>= 1; - rounded.e += 1; - } - } - *result = grisu3_cast_double_from_diy_fp(rounded); - return half_way - error >= prec_bits || prec_bits >= half_way + error; -} - -/* - * `end` is unchanged if number is handled natively, or it is the result - * of strtod parsing in case of fallback. - */ -static const char *grisu3_encode_double(const char *buf, const char *end, int sign, uint64_t fraction, int exponent, int fraction_exp, int ulp_half_error, double *result) -{ - const int max_d_exp = GRISU3_D64_MAX_DEC_EXP; - const int min_d_exp = GRISU3_D64_MIN_DEC_EXP; - - char *v_end; - - /* Both for user experience, and to protect internal power table lookups. */ - if (fraction == 0 || exponent < min_d_exp) { - *result = 0.0; - goto done; - } - if (exponent - 1 > max_d_exp) { - *result = grisu3_double_infinity; - goto done; - } - - /* - * `exponent` is the normalized value, fraction_exp is the size of - * the representation in the `fraction value`, or one less than - * number of significant digits. - * - * If the final value can be kept in 53 bits and we can avoid - * division, then we can convert to double quite fast. - * - * ulf_half_error only happens when fraction is maxed out, so - * fraction_exp > 22 by definition. - * - * fraction_exp >= 0 always. - * - * http://www.exploringbinary.com/fast-path-decimal-to-floating-point-conversion/ - */ - - -#ifdef GRISU3_PARSE_FAST_CASE - if (fraction < (1ULL << 53) && exponent >= 0 && exponent <= 22) { - double v = (double)fraction; - /* Multiplying by 1e-k instead of dividing by 1ek results in rounding error. */ - switch (exponent - fraction_exp) { - case -22: v /= 1e22; break; - case -21: v /= 1e21; break; - case -20: v /= 1e20; break; - case -19: v /= 1e19; break; - case -18: v /= 1e18; break; - case -17: v /= 1e17; break; - case -16: v /= 1e16; break; - case -15: v /= 1e15; break; - case -14: v /= 1e14; break; - case -13: v /= 1e13; break; - case -12: v /= 1e12; break; - case -11: v /= 1e11; break; - case -10: v /= 1e10; break; - case -9: v /= 1e9; break; - case -8: v /= 1e8; break; - case -7: v /= 1e7; break; - case -6: v /= 1e6; break; - case -5: v /= 1e5; break; - case -4: v /= 1e4; break; - case -3: v /= 1e3; break; - case -2: v /= 1e2; break; - case -1: v /= 1e1; break; - case 0: break; - case 1: v *= 1e1; break; - case 2: v *= 1e2; break; - case 3: v *= 1e3; break; - case 4: v *= 1e4; break; - case 5: v *= 1e5; break; - case 6: v *= 1e6; break; - case 7: v *= 1e7; break; - case 8: v *= 1e8; break; - case 9: v *= 1e9; break; - case 10: v *= 1e10; break; - case 11: v *= 1e11; break; - case 12: v *= 1e12; break; - case 13: v *= 1e13; break; - case 14: v *= 1e14; break; - case 15: v *= 1e15; break; - case 16: v *= 1e16; break; - case 17: v *= 1e17; break; - case 18: v *= 1e18; break; - case 19: v *= 1e19; break; - case 20: v *= 1e20; break; - case 21: v *= 1e21; break; - case 22: v *= 1e22; break; - } - *result = v; - goto done; - } -#endif - - if (grisu3_diy_fp_encode_double(fraction, exponent, fraction_exp, ulp_half_error, result)) { - goto done; - } -#ifdef GRISU3_PARSE_ALLOW_ERROR - goto done; -#endif - *result = strtod(buf, &v_end); - if (v_end < end) { - return v_end; - } - return end; -done: - if (sign) { - *result = -*result; - } - return end; -} - -/* - * Returns buf if number wasn't matched, or null if number starts ok - * but contains invalid content. - */ -static const char *grisu3_parse_hex_fp(const char *buf, const char *end, int sign, double *result) -{ - (void)buf; - (void)end; - (void)sign; - *result = 0.0; - /* Not currently supported. */ - return buf; -} - -/* - * Returns end pointer on success, or null, or buf if start is not a number. - * Sets result to 0.0 on error. - * Reads up to len + 1 bytes from buffer where len + 1 must not be a - * valid part of a number, but all of buf, buf + len need not be a - * number. Leading whitespace is NOT valid. - * Very small numbers are truncated to +/-0.0 and numerically very large - * numbers are returns as +/-infinity. - * - * A value must not end or begin with '.' (like JSON), but can have - * leading zeroes (unlike JSON). A single leading zero followed by - * an encoding symbol may or may not be interpreted as a non-decimal - * encoding prefix, e.g. 0x, but a leading zero followed by a digit is - * NOT interpreted as octal. - * A single leading negative sign may appear before digits, but positive - * sign is not allowed and space after the sign is not allowed. - * At most the first 1000 characters of the input is considered. - */ -static const char *grisu3_parse_double(const char *buf, int len, double *result) -{ - const char *mark, *k, *end; - int sign = 0, esign = 0; - uint64_t fraction = 0; - int exponent = 0; - int ee = 0; - int fraction_exp = 0; - int ulp_half_error = 0; - - *result = 0.0; - - end = buf + len + 1; - - /* Failsafe for exponent overflow. */ - if (len > GRISU3_NUM_MAX_LEN) { - end = buf + GRISU3_NUM_MAX_LEN + 1; - } - - if (buf == end) { - return buf; - } - mark = buf; - if (*buf == '-') { - ++buf; - sign = 1; - if (buf == end) { - return 0; - } - } - if (*buf == '0') { - ++buf; - /* | 0x20 is lower case ASCII. */ - if (buf != end && (*buf | 0x20) == 'x') { - k = grisu3_parse_hex_fp(buf, end, sign, result); - if (k == buf) { - return mark; - } - return k; - } - /* Not worthwhile, except for getting the scale of integer part. */ - while (buf != end && *buf == '0') { - ++buf; - } - } else { - if (*buf < '1' || *buf > '9') { - /* - * If we didn't see a sign, just don't recognize it as - * number, otherwise make it an error. - */ - return sign ? 0 : mark; - } - fraction = *buf++ - '0'; - } - k = buf; - /* - * We do not catch trailing zeroes when there is no decimal point. - * This misses an opportunity for moving the exponent down into the - * fast case. But it is unlikely to be worthwhile as it complicates - * parsing. - */ - while (buf != end && *buf >= '0' && *buf <= '9') { - if (fraction >= UINT64_MAX / 10) { - fraction += *buf >= '5'; - ulp_half_error = 1; - break; - } - fraction = fraction * 10 + *buf++ - '0'; - } - fraction_exp = (int)(buf - k); - /* Skip surplus digits. Trailing zero does not introduce error. */ - while (buf != end && *buf == '0') { - ++exponent; - ++buf; - } - if (buf != end && *buf >= '1' && *buf <= '9') { - ulp_half_error = 1; - ++exponent; - ++buf; - while (buf != end && *buf >= '0' && *buf <= '9') { - ++exponent; - ++buf; - } - } - if (buf != end && *buf == '.') { - ++buf; - k = buf; - if (*buf < '0' || *buf > '9') { - /* We don't accept numbers without leading or trailing digit. */ - return 0; - } - while (buf != end && *buf >= '0' && *buf <= '9') { - if (fraction >= UINT64_MAX / 10) { - if (!ulp_half_error) { - fraction += *buf >= '5'; - ulp_half_error = 1; - } - break; - } - fraction = fraction * 10 + *buf++ - '0'; - --exponent; - } - fraction_exp += (int)(buf - k); - while (buf != end && *buf == '0') { - ++exponent; - ++buf; - } - if (buf != end && *buf >= '1' && *buf <= '9') { - ulp_half_error = 1; - ++buf; - while (buf != end && *buf >= '0' && *buf <= '9') { - ++buf; - } - } - } - /* - * Normalized exponent e.g: 1.23434e3 with fraction = 123434, - * fraction_exp = 5, exponent = 3. - * So value = fraction * 10^(exponent - fraction_exp) - */ - exponent += fraction_exp; - if (buf != end && (*buf | 0x20) == 'e') { - if (end - buf < 2) { - return 0; - } - ++buf; - if (*buf == '+') { - ++buf; - if (buf == end) { - return 0; - } - } else if (*buf == '-') { - esign = 1; - ++buf; - if (buf == end) { - return 0; - } - } - if (*buf < '0' || *buf > '9') { - return 0; - } - ee = *buf++ - '0'; - while (buf != end && *buf >= '0' && *buf <= '9') { - /* - * This test impacts performance and we do not need an - * exact value just one large enough to dominate the fraction_exp. - * Subsequent handling maps large absolute ee to 0 or infinity. - */ - if (ee <= 0x7fff) { - ee = ee * 10 + *buf - '0'; - } - ++buf; - } - } - exponent = exponent + (esign ? -ee : ee); - - /* - * Exponent is now a base 10 normalized exponent so the absolute value - * is less the 10^(exponent + 1) for positive exponents. For - * denormalized doubles (using 11 bit exponent 0 with a fraction - * shiftet down, extra small numbers can be achieved. - * - * https://en.wikipedia.org/wiki/Double-precision_floating-point_format - * - * 10^-324 holds the smallest normalized exponent (but not value) and - * 10^308 holds the largest exponent. Internally our lookup table is - * only safe to use within a range slightly larger than this. - * Externally, a slightly larger/smaller value represents NaNs which - * are technically also possible to store as a number. - * - */ - - /* This also protects strod fallback parsing. */ - if (buf == end) { - return 0; - } - return grisu3_encode_double(mark, buf, sign, fraction, exponent, fraction_exp, ulp_half_error, result); -} - -#ifdef __cplusplus -} -#endif - -#endif /* GRISU3_PARSE_H */ diff --git a/flatccrt/include/flatcc/portable/grisu3_print.h b/flatccrt/include/flatcc/portable/grisu3_print.h deleted file mode 100644 index 7fe17fd..0000000 --- a/flatccrt/include/flatcc/portable/grisu3_print.h +++ /dev/null @@ -1,265 +0,0 @@ -/* - * Copyright (c) 2016 Mikkel F. Jørgensen, dvide.com - * Copyright author of MathGeoLib (https://github.com/juj) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. http://www.apache.org/licenses/LICENSE-2.0 - */ - -/* - * Extracted from MathGeoLib. - * - * mikkelfj: - * - Fixed final output when printing single digit negative exponent to - * have leading zero (important for JSON). - * - Changed formatting to prefer 0.012 over 1.2-e-2. - * - * Large portions of the original grisu3.c file has been moved to - * grisu3_math.h, the rest is placed here. - * - * See also comments in grisu3_math.h. - * - * MatGeoLib grisu3.c comment: - * - * This file is part of an implementation of the "grisu3" double to string - * conversion algorithm described in the research paper - * - * "Printing Floating-Point Numbers Quickly And Accurately with Integers" - * by Florian Loitsch, available at - * http://www.cs.tufts.edu/~nr/cs257/archive/florian-loitsch/printf.pdf - */ - -#ifndef GRISU3_PRINT_H -#define GRISU3_PRINT_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include /* sprintf, only needed for fallback printing */ -#include /* assert */ - -#include "grisu3_math.h" - -/* - * The lightweight "portable" C library recognizes grisu3 support if - * included first. - */ -#define grisu3_print_double_is_defined 1 - -/* - * Not sure we have an exact definition, but we get up to 23 - * emperically. There is some math ensuring it does not go awol though, - * like 18 digits + exponent or so. - * This max should be safe size buffer for printing, including zero term. - */ -#define GRISU3_PRINT_MAX 30 - -static int grisu3_round_weed(char *buffer, int len, uint64_t wp_W, uint64_t delta, uint64_t rest, uint64_t ten_kappa, uint64_t ulp) -{ - uint64_t wp_Wup = wp_W - ulp; - uint64_t wp_Wdown = wp_W + ulp; - while(rest < wp_Wup && delta - rest >= ten_kappa - && (rest + ten_kappa < wp_Wup || wp_Wup - rest >= rest + ten_kappa - wp_Wup)) - { - --buffer[len-1]; - rest += ten_kappa; - } - if (rest < wp_Wdown && delta - rest >= ten_kappa - && (rest + ten_kappa < wp_Wdown || wp_Wdown - rest > rest + ten_kappa - wp_Wdown)) - return 0; - - return 2*ulp <= rest && rest <= delta - 4*ulp; -} - -static int grisu3_digit_gen(grisu3_diy_fp_t low, grisu3_diy_fp_t w, grisu3_diy_fp_t high, char *buffer, int *length, int *kappa) -{ - uint64_t unit = 1; - grisu3_diy_fp_t too_low = { low.f - unit, low.e }; - grisu3_diy_fp_t too_high = { high.f + unit, high.e }; - grisu3_diy_fp_t unsafe_interval = grisu3_diy_fp_minus(too_high, too_low); - grisu3_diy_fp_t one = { 1ULL << -w.e, w.e }; - uint32_t p1 = (uint32_t)(too_high.f >> -one.e); - uint64_t p2 = too_high.f & (one.f - 1); - uint32_t div; - *kappa = grisu3_largest_pow10(p1, GRISU3_DIY_FP_FRACT_SIZE + one.e, &div); - *length = 0; - - while(*kappa > 0) - { - uint64_t rest; - int digit = p1 / div; - buffer[*length] = (char)('0' + digit); - ++*length; - p1 %= div; - --*kappa; - rest = ((uint64_t)p1 << -one.e) + p2; - if (rest < unsafe_interval.f) return grisu3_round_weed(buffer, *length, grisu3_diy_fp_minus(too_high, w).f, unsafe_interval.f, rest, (uint64_t)div << -one.e, unit); - div /= 10; - } - - for(;;) - { - int digit; - p2 *= 10; - unit *= 10; - unsafe_interval.f *= 10; - /* Integer division by one. */ - digit = (int)(p2 >> -one.e); - buffer[*length] = (char)('0' + digit); - ++*length; - p2 &= one.f - 1; /* Modulo by one. */ - --*kappa; - if (p2 < unsafe_interval.f) return grisu3_round_weed(buffer, *length, grisu3_diy_fp_minus(too_high, w).f * unit, unsafe_interval.f, p2, one.f, unit); - } -} - -static int grisu3(double v, char *buffer, int *length, int *d_exp) -{ - int mk, kappa, success; - grisu3_diy_fp_t dfp = grisu3_cast_diy_fp_from_double(v); - grisu3_diy_fp_t w = grisu3_diy_fp_normalize(dfp); - - /* normalize boundaries */ - grisu3_diy_fp_t t = { (dfp.f << 1) + 1, dfp.e - 1 }; - grisu3_diy_fp_t b_plus = grisu3_diy_fp_normalize(t); - grisu3_diy_fp_t b_minus; - grisu3_diy_fp_t c_mk; /* Cached power of ten: 10^-k */ - uint64_t u64 = grisu3_cast_uint64_from_double(v); - assert(v > 0 && v <= 1.7976931348623157e308); /* Grisu only handles strictly positive finite numbers. */ - if (!(u64 & GRISU3_D64_FRACT_MASK) && (u64 & GRISU3_D64_EXP_MASK) != 0) { b_minus.f = (dfp.f << 2) - 1; b_minus.e = dfp.e - 2;} /* lower boundary is closer? */ - else { b_minus.f = (dfp.f << 1) - 1; b_minus.e = dfp.e - 1; } - b_minus.f = b_minus.f << (b_minus.e - b_plus.e); - b_minus.e = b_plus.e; - - mk = grisu3_diy_fp_cached_pow(GRISU3_MIN_TARGET_EXP - GRISU3_DIY_FP_FRACT_SIZE - w.e, &c_mk); - - w = grisu3_diy_fp_multiply(w, c_mk); - b_minus = grisu3_diy_fp_multiply(b_minus, c_mk); - b_plus = grisu3_diy_fp_multiply(b_plus, c_mk); - - success = grisu3_digit_gen(b_minus, w, b_plus, buffer, length, &kappa); - *d_exp = kappa - mk; - return success; -} - -static int grisu3_i_to_str(int val, char *str) -{ - int len, i; - char *s; - char *begin = str; - if (val < 0) { *str++ = '-'; val = -val; } - s = str; - - for(;;) - { - int ni = val / 10; - int digit = val - ni*10; - *s++ = (char)('0' + digit); - if (ni == 0) - break; - val = ni; - } - *s = '\0'; - len = (int)(s - str); - for(i = 0; i < len/2; ++i) - { - char ch = str[i]; - str[i] = str[len-1-i]; - str[len-1-i] = ch; - } - - return (int)(s - begin); -} - -static int grisu3_print_nan(uint64_t v, char *dst) -{ - static char hexdigits[16] = "0123456789ABCDEF"; - int i = 0; - - dst[0] = 'N'; - dst[1] = 'a'; - dst[2] = 'N'; - dst[3] = '('; - dst[20] = ')'; - dst[21] = '\0'; - dst += 4; - for (i = 15; i >= 0; --i) { - dst[i] = hexdigits[v & 0x0F]; - v >>= 4; - } - return 21; -} - -static int grisu3_print_double(double v, char *dst) -{ - int d_exp, len, success, decimals, i; - uint64_t u64 = grisu3_cast_uint64_from_double(v); - char *s2 = dst; - assert(dst); - - /* Prehandle NaNs */ - if ((u64 << 1) > 0xFFE0000000000000ULL) return grisu3_print_nan(u64, dst); - /* Prehandle negative values. */ - if ((u64 & GRISU3_D64_SIGN) != 0) { *s2++ = '-'; v = -v; u64 ^= GRISU3_D64_SIGN; } - /* Prehandle zero. */ - if (!u64) { *s2++ = '0'; *s2 = '\0'; return (int)(s2 - dst); } - /* Prehandle infinity. */ - if (u64 == GRISU3_D64_EXP_MASK) { *s2++ = 'i'; *s2++ = 'n'; *s2++ = 'f'; *s2 = '\0'; return (int)(s2 - dst); } - - success = grisu3(v, s2, &len, &d_exp); - /* If grisu3 was not able to convert the number to a string, then use old sprintf (suboptimal). */ - if (!success) return sprintf(s2, "%.17g", v) + (int)(s2 - dst); - - /* We now have an integer string of form "151324135" and a base-10 exponent for that number. */ - /* Next, decide the best presentation for that string by whether to use a decimal point, or the scientific exponent notation 'e'. */ - /* We don't pick the absolute shortest representation, but pick a balance between readability and shortness, e.g. */ - /* 1.545056189557677e-308 could be represented in a shorter form */ - /* 1545056189557677e-323 but that would be somewhat unreadable. */ - decimals = GRISU3_MIN(-d_exp, GRISU3_MAX(1, len-1)); - - /* mikkelfj: - * fix zero prefix .1 => 0.1, important for JSON export. - * prefer unscientific notation at same length: - * -1.2345e-4 over -1.00012345, - * -1.0012345 over -1.2345e-3 - */ - if (d_exp < 0 && (len + d_exp) > -3 && len <= -d_exp) - { - /* mikkelfj: fix zero prefix .1 => 0.1, and short exponents 1.3e-2 => 0.013. */ - memmove(s2 + 2 - d_exp - len, s2, len); - s2[0] = '0'; - s2[1] = '.'; - for (i = 2; i < 2-d_exp-len; ++i) s2[i] = '0'; - len += i; - } - else if (d_exp < 0 && len > 1) /* Add decimal point? */ - { - for(i = 0; i < decimals; ++i) s2[len-i] = s2[len-i-1]; - s2[len++ - decimals] = '.'; - d_exp += decimals; - /* Need scientific notation as well? */ - if (d_exp != 0) { s2[len++] = 'e'; len += grisu3_i_to_str(d_exp, s2+len); } - } - /* Add scientific notation? */ - else if (d_exp < 0 || d_exp > 2) { s2[len++] = 'e'; len += grisu3_i_to_str(d_exp, s2+len); } - /* Add zeroes instead of scientific notation? */ - else if (d_exp > 0) { while(d_exp-- > 0) s2[len++] = '0'; } - s2[len] = '\0'; /* grisu3 doesn't null terminate, so ensure termination. */ - return (int)(s2+len-dst); -} - -#ifdef __cplusplus -} -#endif - -#endif /* GRISU3_PRINT_H */ diff --git a/flatccrt/include/flatcc/portable/include/README b/flatccrt/include/flatcc/portable/include/README deleted file mode 100644 index 9f991fc..0000000 --- a/flatccrt/include/flatcc/portable/include/README +++ /dev/null @@ -1,4 +0,0 @@ -This directory holds subdirectories it can be added to the include path -such that standard and OS specific header includes like , - and can succeed without explicitly including -special headers explicitly. diff --git a/flatccrt/include/flatcc/portable/include/linux/endian.h b/flatccrt/include/flatcc/portable/include/linux/endian.h deleted file mode 100644 index 38fd1fb..0000000 --- a/flatccrt/include/flatcc/portable/include/linux/endian.h +++ /dev/null @@ -1 +0,0 @@ -#include "portable/pendian.h" diff --git a/flatccrt/include/flatcc/portable/include/std/inttypes.h b/flatccrt/include/flatcc/portable/include/std/inttypes.h deleted file mode 100644 index 99b699d..0000000 --- a/flatccrt/include/flatcc/portable/include/std/inttypes.h +++ /dev/null @@ -1 +0,0 @@ -#include "portable/inttypes.h" diff --git a/flatccrt/include/flatcc/portable/include/std/stdalign.h b/flatccrt/include/flatcc/portable/include/std/stdalign.h deleted file mode 100644 index 6d51281..0000000 --- a/flatccrt/include/flatcc/portable/include/std/stdalign.h +++ /dev/null @@ -1 +0,0 @@ -#include "portable/pstdalign.h" diff --git a/flatccrt/include/flatcc/portable/include/std/stdbool.h b/flatccrt/include/flatcc/portable/include/std/stdbool.h deleted file mode 100644 index 12eb4c7..0000000 --- a/flatccrt/include/flatcc/portable/include/std/stdbool.h +++ /dev/null @@ -1 +0,0 @@ -#include "portable/pstdbool.h" diff --git a/flatccrt/include/flatcc/portable/include/std/stdint.h b/flatccrt/include/flatcc/portable/include/std/stdint.h deleted file mode 100644 index 0364471..0000000 --- a/flatccrt/include/flatcc/portable/include/std/stdint.h +++ /dev/null @@ -1 +0,0 @@ -#include "portable/pstdint.h" diff --git a/flatccrt/include/flatcc/portable/paligned_alloc.h b/flatccrt/include/flatcc/portable/paligned_alloc.h deleted file mode 100644 index a975ee5..0000000 --- a/flatccrt/include/flatcc/portable/paligned_alloc.h +++ /dev/null @@ -1,177 +0,0 @@ -#ifndef PALIGNED_ALLOC_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * NOTE: MSVC in general has no aligned alloc function that is - * compatible with free and it is not trivial to implement a version - * which is. Therefore, to remain portable, end user code needs to - * use `aligned_free` which is not part of C11 but defined in this header. - * - * The same issue is present on some Unix systems not providing - * posix_memalign. - * - * Note that clang and gcc with -std=c11 or -std=c99 will not define - * _POSIX_C_SOURCE and thus posix_memalign cannot be detected but - * aligned_alloc is not necessarily available either. We assume - * that clang always has posix_memalign although it is not strictly - * correct. For gcc, use -std=gnu99 or -std=gnu11 or don't use -std in - * order to enable posix_memalign, or live with the fallback until using - * a system where glibc has a version that supports aligned_alloc. - * - * For C11 compliant compilers and compilers with posix_memalign, - * it is valid to use free instead of aligned_free with the above - * caveats. - */ - -#include - -/* - * Define this to see which version is used so the fallback is not - * enganged unnecessarily: - * - * #define PORTABLE_DEBUG_ALIGNED_ALLOC - */ - -#if 0 -#define PORTABLE_DEBUG_ALIGNED_ALLOC -#endif - -#if !defined(PORTABLE_C11_ALIGNED_ALLOC) - -#if defined (_ISOC11_SOURCE) -/* glibc aligned_alloc detection. */ -#define PORTABLE_C11_ALIGNED_ALLOC 1 -#elif defined (__GLIBC__) -/* aligned_alloc is not available in glibc just because __STDC_VERSION__ >= 201112L. */ -#define PORTABLE_C11_ALIGNED_ALLOC 0 -#elif defined (__clang__) -#define PORTABLE_C11_ALIGNED_ALLOC 0 -#elif defined(__IBMC__) -#define PORTABLE_C11_ALIGNED_ALLOC 0 -#elif (defined(__STDC__) && __STDC__ && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) -#define PORTABLE_C11_ALIGNED_ALLOC 1 -#else -#define PORTABLE_C11_ALIGNED_ALLOC 0 -#endif - -#endif /* PORTABLE_C11_ALIGNED_ALLOC */ - -/* https://linux.die.net/man/3/posix_memalign */ -#if !defined(PORTABLE_POSIX_MEMALIGN) - -/* https://forum.kde.org/viewtopic.php?p=66274 */ -#if (defined _GNU_SOURCE) || ((_XOPEN_SOURCE + 0) >= 600) || (_POSIX_C_SOURCE + 0) >= 200112L -#define PORTABLE_POSIX_MEMALIGN 1 -#elif defined (__clang__) -#define PORTABLE_POSIX_MEMALIGN 1 -#else -#define PORTABLE_POSIX_MEMALIGN 0 -#endif -#endif /* PORTABLE_POSIX_MEMALIGN */ - -/* https://forum.kde.org/viewtopic.php?p=66274 */ -#if (defined(__STDC__) && __STDC__ && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) -/* C11 or newer */ -#include -#endif - -/* C11 or newer */ -#if !defined(aligned_alloc) && !defined(__aligned_alloc_is_defined) - -#if PORTABLE_C11_ALIGNED_ALLOC -#ifdef PORTABLE_DEBUG_ALIGNED_ALLOC -#error "DEBUG: C11_ALIGNED_ALLOC configured" -#endif -#elif defined(_MSC_VER) - -/* Aligned _aligned_malloc is not compatible with free. */ -#define aligned_alloc(alignment, size) _aligned_malloc(size, alignment) -#define aligned_free(p) _aligned_free(p) -#define __aligned_alloc_is_defined 1 -#define __aligned_free_is_defined 1 - -#elif PORTABLE_POSIX_MEMALIGN - -#if defined(__GNUC__) && __GNUCC__ < 5 -extern int posix_memalign (void **, size_t, size_t); -#endif - -static inline void *__portable_aligned_alloc(size_t alignment, size_t size) -{ - int err; - void *p = 0; - - if (alignment < sizeof(void *)) { - alignment = sizeof(void *); - } - err = posix_memalign(&p, alignment, size); - if (err && p) { - free(p); - p = 0; - } - return p; -} - -#ifdef PORTABLE_DEBUG_ALIGNED_ALLOC -#error "DEBUG: POSIX_MEMALIGN configured" -#endif - -#define aligned_alloc(alignment, size) __portable_aligned_alloc(alignment, size) -#define aligned_free(p) free(p) -#define __aligned_alloc_is_defined 1 -#define __aligned_free_is_defined 1 - -#else - -static inline void *__portable_aligned_alloc(size_t alignment, size_t size) -{ - char *raw; - void *buf; - size_t total_size = (size + alignment - 1 + sizeof(void *)); - - if (alignment < sizeof(void *)) { - alignment = sizeof(void *); - } - raw = (char *)(size_t)malloc(total_size); - buf = raw + alignment - 1 + sizeof(void *); - buf = (void *)(((size_t)buf) & ~(alignment - 1)); - ((void **)buf)[-1] = raw; - return buf; -} - -static inline void __portable_aligned_free(void *p) -{ - char *raw; - - if (p) { - raw = (char*)((void **)p)[-1]; - free(raw); - } -} - -#define aligned_alloc(alignment, size) __portable_aligned_alloc(alignment, size) -#define aligned_free(p) __portable_aligned_free(p) -#define __aligned_alloc_is_defined 1 -#define __aligned_free_is_defined 1 - -#ifdef PORTABLE_DEBUG_ALIGNED_ALLOC -#error "DEBUG: aligned_alloc malloc fallback configured" -#endif - -#endif - -#endif /* aligned_alloc */ - -#if !defined(aligned_free) && !defined(__aligned_free_is_defined) -#define aligned_free(p) free(p) -#define __aligned_free_is_defined 1 -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* PALIGNED_ALLOC_H */ diff --git a/flatccrt/include/flatcc/portable/pbase64.h b/flatccrt/include/flatcc/portable/pbase64.h deleted file mode 100644 index f630e59..0000000 --- a/flatccrt/include/flatcc/portable/pbase64.h +++ /dev/null @@ -1,448 +0,0 @@ -#ifndef PBASE64_H -#define PBASE64_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -/* Guarded to allow inclusion of pstdint.h first, if stdint.h is not supported. */ -#ifndef UINT8_MAX -#include -#endif - -#define BASE64_EOK 0 -/* 0 or mure full blocks decoded, remaining content may be parsed with fresh buffer. */ -#define BASE64_EMORE 1 -/* The `src_len` argument is required when encoding. */ -#define BASE64_EARGS 2 -/* Unsupported mode, or modifier not supported by mode when encoding. */ -#define BASE64_EMODE 3 -/* Decoding ends at invalid tail length - either by source length or by non-alphabet symbol. */ -#define BASE64_ETAIL 4 -/* Decoding ends at valid tail length but last byte has non-zero bits where it shouldn't have. */ -#define BASE64_EDIRTY 5 - -static const char *base64_strerror(int err); - -/* All codecs are URL safe. Only Crockford allow for non-canocical decoding. */ -enum { - /* Most common base64 codec, but not url friendly. */ - base64_mode_rfc4648 = 0, - - /* URL safe version, '+' -> '-', '/' -> '_'. */ - base64_mode_url = 1, - - /* - * Skip ' ', '\r', and '\n' - we do not allow tab because common - * uses of base64 such as PEM do not allow tab. - */ - base64_dec_modifier_skipspace = 32, - - /* Padding is excluded by default. Not allowed for zbase64. */ - base64_enc_modifier_padding = 128, - - /* For internal use or to decide codec of mode. */ - base64_modifier_mask = 32 + 64 + 128, -}; - -/* Encoded size with or without padding. */ -static size_t base64_encoded_size(size_t len, int mode); - -/* - * Decoded size assuming no padding. - * If `len` does include padding, the actual size may be less - * when decoding, but never more. - */ -static size_t base64_decoded_size(size_t len); - -/* - * `dst` must hold ceil(len * 4 / 3) bytes. - * `src_len` points to length of source and is updated with length of - * parse on both success and failure. If `dst_len` is not null - * it is used to store resulting output lengt withh length of decoded - * output on both success and failure. - * If `hyphen` is non-zero a hyphen is encoded every `hyphen` output bytes. - * `mode` selects encoding alphabet defaulting to Crockfords base64. - * Returns 0 on success. - * - * A terminal space can be added with `dst[dst_len++] = ' '` after the - * encode call. All non-alphabet can be used as terminators except the - * padding character '='. The following characters will work as - * terminator for all modes: { '\0', '\n', ' ', '\t' }. A terminator is - * optional when the source length is given to the decoder. Note that - * crockford also reserves a few extra characters for checksum but the - * checksum must be separate from the main buffer and is not supported - * by this library. - */ -static int base64_encode(uint8_t *dst, const uint8_t *src, size_t *dst_len, size_t *src_len, int mode); - -/* - * Decodes according to mode while ignoring encoding modifiers. - * `src_len` and `dst_len` are optional pointers. If `src_len` is set it - * must contain the length of the input, otherwise the input must be - * terminated with a non-alphabet character or valid padding (a single - * padding character is accepted) - if the src_len output is needed but - * not the input due to guaranteed termination, then set it to - * (size_t)-1. `dst_len` must contain length of output buffer if present - * and parse will fail with BASE64_EMORE after decoding a block multiple - * if dst_len is exhausted - the parse can thus be resumed after - * draining destination. `src_len` and `dst_len` are updated with parsed - * and decoded length, when present, on both success and failure. - * Returns 0 on success. Invalid characters are not considered errors - - * they simply terminate the parse, however, if the termination is not - * at a block multiple or a valid partial block length then BASE64_ETAIL - * without output holding the last full block, if any. BASE64_ETAIL is also - * returned if the a valid length holds non-zero unused tail bits. - */ -static int base64_decode(uint8_t *dst, const uint8_t *src, size_t *dst_len, size_t *src_len, int mode); - -static const char *base64_strerror(int err) -{ - switch (err) { - case BASE64_EOK: return "ok"; - case BASE64_EARGS: return "invalid argument"; - case BASE64_EMODE: return "invalid mode"; - case BASE64_EMORE: return "destination full"; - case BASE64_ETAIL: return "invalid tail length"; - case BASE64_EDIRTY: return "invalid tail content"; - default: return "unknown error"; - } -} - -static size_t base64_encoded_size(size_t len, int mode) -{ - size_t k = len % 3; - size_t n = (len * 4 / 3 + 3) & ~(size_t)3; - int pad = mode & base64_enc_modifier_padding; - - if (!pad) { - switch (k) { - case 2: - n -= 1; - break; - case 1: - n -= 2; - break; - default: - break; - } - } - return n; -} - -static size_t base64_decoded_size(size_t len) -{ - size_t k = len % 4; - size_t n = len / 4 * 3; - - switch (k) { - case 3: - return n + 2; - case 2: - return n + 1; - case 1: /* Not valid without padding. */ - case 0: - default: - return n; - } -} - -static int base64_encode(uint8_t *dst, const uint8_t *src, size_t *dst_len, size_t *src_len, int mode) -{ - const uint8_t *rfc4648_alphabet = (const uint8_t *) - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - const uint8_t *url_alphabet = (const uint8_t *) - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"; - - const uint8_t *T; - uint8_t *dst_base = dst; - int pad = mode & base64_enc_modifier_padding; - size_t len = 0; - int ret = BASE64_EMODE; - - if (!src_len) { - ret = BASE64_EARGS; - goto done; - } - len = *src_len; - mode = mode & ~base64_modifier_mask; - switch (mode) { - case base64_mode_rfc4648: - T = rfc4648_alphabet; - break; - case base64_mode_url: - T = url_alphabet; - break; - default: - /* Invalid mode. */ - goto done; - } - - ret = BASE64_EOK; - - /* Encodes 4 destination bytes from 3 source bytes. */ - while (len >= 3) { - dst[0] = T[((src[0] >> 2))]; - dst[1] = T[((src[0] << 4) & 0x30) | (src[1] >> 4)]; - dst[2] = T[((src[1] << 2) & 0x3c) | (src[2] >> 6)]; - dst[3] = T[((src[2] & 0x3f))]; - len -= 3; - dst += 4; - src += 3; - } - /* Encodes 8 destination bytes from 1 to 4 source bytes, if any. */ - switch(len) { - case 2: - dst[0] = T[((src[0] >> 2))]; - dst[1] = T[((src[0] << 4) & 0x30) | (src[1] >> 4)]; - dst[2] = T[((src[1] << 2) & 0x3c)]; - dst += 3; - if (pad) { - *dst++ = '='; - } - break; - case 1: - dst[0] = T[((src[0] >> 2))]; - dst[1] = T[((src[0] << 4) & 0x30)]; - dst += 2; - if (pad) { - *dst++ = '='; - *dst++ = '='; - } - break; - default: - pad = 0; - break; - } - len = 0; -done: - if (dst_len) { - *dst_len = dst - dst_base; - } - if (src_len) { - *src_len -= len; - } - return ret; -} - -static int base64_decode(uint8_t *dst, const uint8_t *src, size_t *dst_len, size_t *src_len, int mode) -{ - static const uint8_t cinvalid = 64; - static const uint8_t cignore = 65; - static const uint8_t cpadding = 66; - - /* - * 0..63: 6-bit encoded value. - * 64: flags non-alphabet symbols. - * 65: codes for ignored symbols. - * 66: codes for pad symbol '='. - * All codecs consider padding an optional terminator and if present - * consumes as many pad bytes as possible up to block termination, - * but does not fail if a block is not full. - * - * We do not currently have any ignored characters but we might - * add spaces as per MIME spec, but assuming spaces only happen - * at block boundaries this is probalby better handled by repeated - * parsing. - */ - static const uint8_t base64rfc4648_decode[256] = { - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64, 64, 64, 63, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 66, 64, 64, - 64, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 64, - 64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64 - }; - - static const uint8_t base64url_decode[256] = { - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64, 64, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 66, 64, 64, - 64, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 63, - 64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64 - }; - - static const uint8_t base64rfc4648_decode_skipspace[256] = { - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 65, 64, 64, 65, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 65, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64, 64, 64, 63, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 66, 64, 64, - 64, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 64, - 64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64 - }; - - static const uint8_t base64url_decode_skipspace[256] = { - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 65, 64, 64, 65, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 65, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64, 64, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 66, 64, 64, - 64, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 63, - 64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64 - }; - - int ret = BASE64_EOK; - size_t i, k; - uint8_t hold[4]; - uint8_t *dst_base = dst; - size_t limit = (size_t)-1; - size_t len = (size_t)-1, mark; - const uint8_t *T = base64rfc4648_decode; - int skipspace = mode & base64_dec_modifier_skipspace; - - if (src_len) { - len = *src_len; - } - mark = len; - mode = mode & ~base64_modifier_mask; - switch (mode) { - case base64_mode_rfc4648: - T = skipspace ? base64rfc4648_decode_skipspace : base64rfc4648_decode; - break; - case base64_mode_url: - T = skipspace ? base64url_decode_skipspace : base64url_decode; - break; - default: - ret = BASE64_EMODE; - goto done; - } - - if (dst_len && *dst_len > 0) { - limit = *dst_len; - } - while(limit > 0) { - for (i = 0; i < 4; ++i) { - if (len == i) { - k = i; - len -= i; - goto tail; - } - if ((hold[i] = T[src[i]]) >= cinvalid) { - if (hold[i] == cignore) { - ++src; - --len; - --i; - continue; - } - k = i; - /* Strip padding and ignore hyphen in padding, if present. */ - if (hold[i] == cpadding) { - ++i; - while (i < len && i < 8) { - if (T[src[i]] != cpadding && T[src[i]] != cignore) { - break; - } - ++i; - } - } - len -= i; - goto tail; - } - } - if (limit < 3) { - goto more; - } - dst[0] = (hold[0] << 2) | (hold[1] >> 4); - dst[1] = (hold[1] << 4) | (hold[2] >> 2); - dst[2] = (hold[2] << 6) | (hold[3]); - dst += 3; - src += 4; - limit -= 3; - len -= 4; - mark = len; - } -done: - if (dst_len) { - *dst_len = dst - dst_base; - } - if (src_len) { - *src_len -= mark; - } - return ret; - -tail: - switch (k) { - case 0: - break; - case 2: - if ((hold[1] << 4) & 0xff) { - goto dirty; - } - if (limit < 1) { - goto more; - } - dst[0] = (hold[0] << 2) | (hold[1] >> 4); - dst += 1; - break; - case 3: - if ((hold[2] << 6) & 0xff) { - goto dirty; - } - if (limit < 2) { - goto more; - } - dst[0] = (hold[0] << 2) | (hold[1] >> 4); - dst[1] = (hold[1] << 4) | (hold[2] >> 2); - dst += 2; - break; - default: - ret = BASE64_ETAIL; - goto done; - } - mark = len; - goto done; -dirty: - ret = BASE64_EDIRTY; - goto done; -more: - ret = BASE64_EMORE; - goto done; -} - -#ifdef __cplusplus -} -#endif - -#endif /* PBASE64_H */ diff --git a/flatccrt/include/flatcc/portable/pdiagnostic.h b/flatccrt/include/flatcc/portable/pdiagnostic.h deleted file mode 100644 index fb290f5..0000000 --- a/flatccrt/include/flatcc/portable/pdiagnostic.h +++ /dev/null @@ -1,72 +0,0 @@ - /* There is intentionally no include guard in this file. */ - - -/* - * Usage: optionally disable any of these before including. - * - * #define PDIAGNOSTIC_IGNORE_UNUSED_FUNCTION - * #define PDIAGNOSTIC_IGNORE_UNUSED_VARIABLE - * #define PDIAGNOSTIC_IGNORE_UNUSED_PARAMETER - * #define PDIAGNOSTIC_IGNORE_UNUSED // all of the above - * - * #include "pdiagnostic.h" - * - * Alternatively use #include "pdiagnostic_push/pop.h" - */ - -#ifdef _MSC_VER -#pragma warning(disable: 4668) /* preprocessor name not defined */ -#endif - -#if defined(_MSC_VER) && !defined(PDIAGNOSTIC_AWARE_MSVC) -#define PDIAGNOSTIC_AWARE_MSVC 1 -#elif defined(__clang__) && !defined(PDIAGNOSTIC_AWARE_CLANG) -#define PDIAGNOSTIC_AWARE_CLANG 1 -/* Can disable some warnings even if push is not available (gcc-4.2 vs gcc-4.7) */ -#elif ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2)) && \ - !defined(PDIAGNOSTIC_AWARE_GCC) -#define PDIAGNOSTIC_AWARE_GCC 1 -#endif - -#if defined(PDIAGNOSTIC_IGNORE_UNUSED_FUNCTION) || defined(PDIAGNOSTIC_IGNORE_UNUSED) -#if PDIAGNOSTIC_AWARE_CLANG -#pragma clang diagnostic ignored "-Wunused-function" -#elif PDIAGNOSTIC_AWARE_GCC -#pragma GCC diagnostic ignored "-Wunused-function" -#endif -#endif -#undef PDIAGNOSTIC_IGNORE_UNUSED_FUNCTION - -#if defined(PDIAGNOSTIC_IGNORE_UNUSED_VARIABLE) || defined(PDIAGNOSTIC_IGNORE_UNUSED) -#if PDIAGNOSTIC_AWARE_MSVC -#pragma warning(disable: 4101) /* unused local variable */ -#elif PDIAGNOSTIC_AWARE_CLANG -#pragma clang diagnostic ignored "-Wunused-variable" -#elif PDIAGNOSTIC_AWARE_GCC -#pragma GCC diagnostic ignored "-Wunused-variable" -#endif -#endif -#undef PDIAGNOSTIC_IGNORE_UNUSED_VARIABLE - -#if defined(PDIAGNOSTIC_IGNORE_UNUSED_PARAMETER) || defined(PDIAGNOSTIC_IGNORE_UNUSED) -#if PDIAGNOSTIC_AWARE_CLANG -#pragma clang diagnostic ignored "-Wunused-parameter" -#elif PDIAGNOSTIC_AWARE_GCC -#pragma GCC diagnostic ignored "-Wunused-parameter" -#endif -#endif -#undef PDIAGNOSTIC_IGNORE_UNUSED_PARAMETER - -#undef PDIAGNOSTIC_IGNORE_UNUSED - -#if defined (__cplusplus) && __cplusplus < 201103L -#if PDIAGNOSTIC_AWARE_CLANG -/* Needed for < C++11 clang C++ static_assert */ -#pragma clang diagnostic ignored "-Wc11-extensions" -/* Needed for empty macro arguments. */ -#pragma clang diagnostic ignored "-Wc99-extensions" -/* Needed for trailing commas. */ -#pragma clang diagnostic ignored "-Wc++11-extensions" -#endif -#endif - diff --git a/flatccrt/include/flatcc/portable/pdiagnostic_pop.h b/flatccrt/include/flatcc/portable/pdiagnostic_pop.h deleted file mode 100644 index b83ec4b..0000000 --- a/flatccrt/include/flatcc/portable/pdiagnostic_pop.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef PDIAGNOSTIC_POP_H -#define PDIAGNOSTIC_POP_H - -#if PDIAGNOSTIC_PUSHED_MSVC -#pragma warning( pop ) -#undef PDIAGNOSTIC_PUSHED_MSVC -#elif PDIAGNOSTIC_PUSHED_CLANG -#pragma clang diagnostic pop -#undef PDIAGNOSTIC_PUSHED_CLANG -#elif PDIAGNOSTIC_PUSHED_GCC -#pragma GCC diagnostic pop -#undef PDIAGNOSTIC_PUSHED_GCC -#endif - -#endif /* PDIAGNOSTIC_POP_H */ diff --git a/flatccrt/include/flatcc/portable/pdiagnostic_push.h b/flatccrt/include/flatcc/portable/pdiagnostic_push.h deleted file mode 100644 index 2adc231..0000000 --- a/flatccrt/include/flatcc/portable/pdiagnostic_push.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef PDIAGNOSTIC_PUSH_H -#define PDIAGNOSTIC_PUSH_H - -/* - * See also comment in "pdiagnostic.h" - * - * e.g. - * #define PDIAGNOSTIC_IGNORE_USED_FUNCTION - * #define PDIAGNOSTIC_IGNORE_USED_VARIABLE - * #include "pdiagnostic_push" - * ... - * #include "pdiagnostic_pop.h" - * - * - * or if push pop isn't desired: - * #define PDIAGNOSTIC_IGNORE_USED_FUNCTION - * #define PDIAGNOSTIC_IGNORE_USED_VARIABLE - * #include "pdiagnostic.h" - * ... - * - * - * - * Some if these warnings cannot be ignored - * at the #pragma level, but might in the future. - * Use compiler switches like -Wno-unused-function - * to work around this. - */ - -#if defined(_MSC_VER) -#pragma warning( push ) -#define PDIAGNOSTIC_PUSHED_MSVC 1 -#elif defined(__clang__) -#pragma clang diagnostic push -#define PDIAGNOSTIC_PUSHED_CLANG 1 -#elif ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) -#pragma GCC diagnostic push -#define PDIAGNOSTIC_PUSHED_GCC 1 -#endif - -#endif /* PDIAGNOSTIC_PUSH_H */ - -/* - * We cannot handle nested push, but we can add to the parent context - * so keep this outside the header include guard. - */ -#include "pdiagnostic.h" diff --git a/flatccrt/include/flatcc/portable/pendian.h b/flatccrt/include/flatcc/portable/pendian.h deleted file mode 100644 index 96eab0c..0000000 --- a/flatccrt/include/flatcc/portable/pendian.h +++ /dev/null @@ -1,185 +0,0 @@ -#ifndef PENDIAN_H -#define PENDIAN_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Defines platform optimized (as per linux - * - * le16toh, le32to, le64toh, be16toh, be32toh, be64toh - * htole16, htole32, htole64, htobe16, htobe32, htobe64 - * - * Falls back to auto-detect endian conversion which is also fast - * if fast byteswap operation was detected. - * - * Also defines platform optimized: - * - * bswap16, bswap32, bswap64, - * - * with fall-back to shift-or implementation. - * - * For convenience also defines: - * - * le8to, be8toh, htole8, htobe8 - * bswap8 - * - * The convience functions makes is simpler to define conversion macros - * based on type size. - * - * NOTE: this implementation expects arguments with no side-effects and - * with appropriately sized unsigned arguments. These are expected to be - * used with typesafe wrappers. - */ - -#ifndef UINT8_MAX -#include "pstdint.h" -#endif - -#include "pendian_detect.h" - -#if defined(_MSC_VER) -#if _MSC_VER >= 1300 -#include -#define bswap16 _byteswap_ushort -#define bswap32 _byteswap_ulong -#define bswap64 _byteswap_uint64 -#endif -#elif defined(__clang__) -#if __has_builtin(__builtin_bswap16) -#define bswap16 __builtin_bswap16 -#endif -#if __has_builtin(__builtin_bswap32) -#define bswap32 __builtin_bswap32 -#endif -#if __has_builtin(__builtin_bswap64) -#define bswap64 __builtin_bswap64 -#endif -#elif defined(__OpenBSD__) -#include -#define bswap16 swap16 -#define bswap32 swap32 -#define bswap64 swap64 -#elif defined(__GNUC__) /* Supported since at least GCC 4.4 */ -#define bswap32 __builtin_bswap32 -#define bswap64 __builtin_bswap64 -#endif - -#ifndef bswap16 -#define bswap16(v) \ - (((uint16_t)(v) << 8) | ((uint16_t)(v) >> 8)) -#endif - -#ifndef bswap32 -#define bswap32(v) \ - ((((uint32_t)(v) << 24)) \ - | (((uint32_t)(v) << 8) & UINT32_C(0x00FF0000)) \ - | (((uint32_t)(v) >> 8) & UINT32_C(0x0000FF00)) \ - | (((uint32_t)(v) >> 24))) -#endif - -#ifndef bswap64 -#define bswap64(v) \ - ((((uint64_t)(v) << 56)) \ - | (((uint64_t)(v) << 40) & UINT64_C(0x00FF000000000000)) \ - | (((uint64_t)(v) << 24) & UINT64_C(0x0000FF0000000000)) \ - | (((uint64_t)(v) << 8) & UINT64_C(0x000000FF00000000)) \ - | (((uint64_t)(v) >> 8) & UINT64_C(0x00000000FF000000)) \ - | (((uint64_t)(v) >> 24) & UINT64_C(0x0000000000FF0000)) \ - | (((uint64_t)(v) >> 40) & UINT64_C(0x000000000000FF00)) \ - | (((uint64_t)(v) >> 56))) -#endif - -#ifndef bswap8 -#define bswap8(v) ((uint8_t)(v)) -#endif - -#if !defined(le16toh) && defined(letoh16) -#define le16toh letoh16 -#define le32toh letoh32 -#define le64toh letoh64 -#endif - -#if !defined(be16toh) && defined(betoh16) -#define be16toh betoh16 -#define be32toh betoh32 -#define be64toh betoh64 -#endif - -/* Assume it goes for all. */ -#if !defined(le16toh) - -#if defined(__LITTLE_ENDIAN__) - -#define le16toh(v) (v) -#define le32toh(v) (v) -#define le64toh(v) (v) - -#define htole16(v) (v) -#define htole32(v) (v) -#define htole64(v) (v) - -#define be16toh(v) bswap16(v) -#define be32toh(v) bswap32(v) -#define be64toh(v) bswap64(v) - -#define htobe16(v) bswap16(v) -#define htobe32(v) bswap32(v) -#define htobe64(v) bswap64(v) - -#elif defined(__BIG_ENDIAN__) - -#define le16toh(v) bswap16(v) -#define le32toh(v) bswap32(v) -#define le64toh(v) bswap64(v) - -#define htole16(v) bswap16(v) -#define htole32(v) bswap32(v) -#define htole64(v) bswap64(v) - -#define be16toh(v) (v) -#define be32toh(v) (v) -#define be64toh(v) (v) - -#define htobe16(v) (v) -#define htobe32(v) (v) -#define htobe64(v) (v) - -#else - -static const int __pendian_test = 1; - -#define le16toh(v) (*(char *)&__pendian_test ? (v) : bswap16(v)) -#define le32toh(v) (*(char *)&__pendian_test ? (v) : bswap32(v)) -#define le64toh(v) (*(char *)&__pendian_test ? (v) : bswap64(v)) - -#define htole16(v) (*(char *)&__pendian_test ? (v) : bswap16(v)) -#define htole32(v) (*(char *)&__pendian_test ? (v) : bswap32(v)) -#define htole64(v) (*(char *)&__pendian_test ? (v) : bswap64(v)) - -#define be16toh(v) (*(char *)&__pendian_test ? bswap16(v) : (v)) -#define be32toh(v) (*(char *)&__pendian_test ? bswap32(v) : (v)) -#define be64toh(v) (*(char *)&__pendian_test ? bswap64(v) : (v)) - -#define htobe16(v) (*(char *)&__pendian_test ? bswap16(v) : (v)) -#define htobe32(v) (*(char *)&__pendian_test ? bswap32(v) : (v)) -#define htobe64(v) (*(char *)&__pendian_test ? bswap64(v) : (v)) - -#endif - -#endif /* le16toh */ - -/* Helpers not part of Linux */ -#if !defined(le8toh) -#define le8toh(n) (n) -#define htole8(n) (n) -#define be8toh(n) (n) -#define htobe8(n) (n) -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* PENDIAN_H */ diff --git a/flatccrt/include/flatcc/portable/pendian_detect.h b/flatccrt/include/flatcc/portable/pendian_detect.h deleted file mode 100644 index 1dd62c0..0000000 --- a/flatccrt/include/flatcc/portable/pendian_detect.h +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Uses various known flags to decide endianness and defines: - * - * __LITTLE_ENDIAN__ or __BIG_ENDIAN__ if not already defined - * - * and also defines - * - * __BYTE_ORDER__ to either __ORDER_LITTLE_ENDIAN__ or - * __ORDER_BIG_ENDIAN__ if not already defined - * - * If none of these could be set, __UNKNOWN_ENDIAN__ is defined, - * which is not a known flag. If __BYTE_ORDER__ is defined but - * not big or little endian, __UNKNOWN_ENDIAN__ is also defined. - * - * Note: Some systems define __BYTE_ORDER without __ at the end - * - this will be mapped to to __BYTE_ORDER__. - */ - -#ifndef PENDIAN_DETECT -#define PENDIAN_DETECT - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef __ORDER_LITTLE_ENDIAN__ -#define __ORDER_LITTLE_ENDIAN__ 1234 -#endif - -#ifndef __ORDER_BIG_ENDIAN__ -#define __ORDER_BIG_ENDIAN__ 4321 -#endif - -#ifdef __BYTE_ORDER__ - -#if defined(__LITTLE_ENDIAN__) && __BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__ -#error __LITTLE_ENDIAN__ inconsistent with __BYTE_ORDER__ -#endif - -#if defined(__BIG_ENDIAN__) && __BYTE_ORDER__ != __ORDER_BIG_ENDIAN__ -#error __BIG_ENDIAN__ inconsistent with __BYTE_ORDER__ -#endif - -#else /* __BYTE_ORDER__ */ - - -#if \ - defined(__LITTLE_ENDIAN__) || \ - (defined(__BYTE_ORDER) && __BYTE_ORDER == __ORDER_LITTLE_ENDIAN) || \ - defined(__ARMEL__) || defined(__THUMBEL__) || \ - defined(__AARCH64EL__) || \ - (defined(_MSC_VER) && defined(_M_ARM)) || \ - defined(_MIPSEL) || defined(__MIPSEL) || defined(__MIPSEL__) || \ - defined(_M_X64) || defined(_M_IX86) || defined(_M_I86) || \ - defined(__i386__) || defined(__alpha__) || \ - defined(__ia64) || defined(__ia64__) || \ - defined(_M_IA64) || defined(_M_ALPHA) || \ - defined(__amd64) || defined(__amd64__) || defined(_M_AMD64) || \ - defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || \ - defined(__bfin__) - -#define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__ - -#endif - -#if \ - defined (__BIG_ENDIAN__) || \ - (defined(__BYTE_ORDER) && __BYTE_ORDER == __ORDER_BIG_ENDIAN) || \ - defined(__ARMEB__) || defined(THUMBEB__) || defined (__AARCH64EB__) || \ - defined(_MIPSEB) || defined(__MIPSEB) || defined(__MIPSEB__) || \ - defined(__sparc) || defined(__sparc__) || \ - defined(_POWER) || defined(__powerpc__) || defined(__ppc__) || \ - defined(__hpux) || defined(__hppa) || defined(__s390__) - -#define __BYTE_ORDER__ __ORDER_BIG_ENDIAN__ - -#endif - -#endif /* __BYTE_ORDER__ */ - -#ifdef __BYTE_ORDER__ - -#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ - -#ifndef __LITTLE_ENDIAN__ -#define __LITTLE_ENDIAN__ 1 -#endif - -#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ - -#ifndef __BIG_ENDIAN__ -#define __BIG_ENDIAN__ 1 -#endif - -#else - -/* - * Custom extension - we only define __BYTE_ORDER__ if known big or little. - * User code that understands __BYTE_ORDER__ may also assume unkown if - * it is not defined by now - this will allow other endian formats than - * big or little when supported by compiler. - */ -#ifndef __UNKNOWN_ENDIAN__ -#define __UNKNOWN_ENDIAN__ 1 -#endif - -#endif -#endif /* __BYTE_ORDER__ */ - -#if defined(__LITTLE_ENDIAN__) && defined(__BIG_ENDIAN__) -#error conflicting definitions of __LITTLE_ENDIAN__ and __BIG_ENDIAN__ -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* PENDIAN_DETECT */ diff --git a/flatccrt/include/flatcc/portable/pinline.h b/flatccrt/include/flatcc/portable/pinline.h deleted file mode 100644 index f4f8f27..0000000 --- a/flatccrt/include/flatcc/portable/pinline.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef PINLINE_H -#define PINLINE_H - -#ifndef __cplusplus - -#if (defined(__STDC__) && __STDC__ && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) -/* C99 or newer */ -#elif _MSC_VER >= 1500 /* MSVC 9 or newer */ -#undef inline -#define inline __inline -#elif __GNUC__ >= 3 /* GCC 3 or newer */ -#define inline __inline -#else /* Unknown or ancient */ -#define inline -#endif - -#endif /* __cplusplus */ - -#endif /* PINLINE_H */ diff --git a/flatccrt/include/flatcc/portable/pinttypes.h b/flatccrt/include/flatcc/portable/pinttypes.h deleted file mode 100644 index a1be9df..0000000 --- a/flatccrt/include/flatcc/portable/pinttypes.h +++ /dev/null @@ -1,52 +0,0 @@ -#ifndef PINTTYPES_H -#define PINTTYPES_H - -#ifndef PRId16 - -#if (defined(__STDC__) && __STDC__ && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) -/* C99 or newer */ -#include -#else - -/* - * This is not a complete implementation of , just the most - * useful printf modifiers. - */ - -#include "pstdint.h" - -#ifndef PRINTF_INT64_MODIFIER -#error "please define PRINTF_INT64_MODIFIER" -#endif - -#ifndef PRId64 -#define PRId64 PRINTF_INT64_MODIFIER "d" -#define PRIu64 PRINTF_INT64_MODIFIER "u" -#define PRIx64 PRINTF_INT64_MODIFIER "x" -#endif - -#ifndef PRINTF_INT32_MODIFIER -#define PRINTF_INT32_MODIFIER "l" -#endif - -#ifndef PRId32 -#define PRId32 PRINTF_INT32_MODIFIER "d" -#define PRIu32 PRINTF_INT32_MODIFIER "u" -#define PRIx32 PRINTF_INT32_MODIFIER "x" -#endif - -#ifndef PRINTF_INT16_MODIFIER -#define PRINTF_INT16_MODIFIER "h" -#endif - -#ifndef PRId16 -#define PRId16 PRINTF_INT16_MODIFIER "d" -#define PRIu16 PRINTF_INT16_MODIFIER "u" -#define PRIx16 PRINTF_INT16_MODIFIER "x" -#endif - -# endif /* __STDC__ */ - -#endif /* PRId16 */ - -#endif /* PINTTYPES */ diff --git a/flatccrt/include/flatcc/portable/portable.h b/flatccrt/include/flatcc/portable/portable.h deleted file mode 100644 index 7a6a484..0000000 --- a/flatccrt/include/flatcc/portable/portable.h +++ /dev/null @@ -1,2 +0,0 @@ -/* portable.h is widely used, so we redirect to a less conflicting name. */ -#include "portable_basic.h" diff --git a/flatccrt/include/flatcc/portable/portable_basic.h b/flatccrt/include/flatcc/portable/portable_basic.h deleted file mode 100644 index 0396f3d..0000000 --- a/flatccrt/include/flatcc/portable/portable_basic.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef PORTABLE_BASIC_H -#define PORTABLE_BASIC_H - -/* - * Basic features need to make compilers support the most common moden C - * features, and endian / unligned read support as well. - * - * It is not assumed that this file is always included. - * Other include files are independent or include what they need. - */ - -#include "pversion.h" -#include "pwarnings.h" - -/* Featutures that ought to be supported by C11, but some aren't. */ -#include "pinttypes.h" -#include "pstdalign.h" -#include "pinline.h" -#include "pstatic_assert.h" - -/* These are not supported by C11 and are general platform abstractions. */ -#include "pendian.h" -#include "punaligned.h" - -#endif /* PORTABLE_BASIC_H */ diff --git a/flatccrt/include/flatcc/portable/pparsefp.h b/flatccrt/include/flatcc/portable/pparsefp.h deleted file mode 100644 index 14eac1d..0000000 --- a/flatccrt/include/flatcc/portable/pparsefp.h +++ /dev/null @@ -1,128 +0,0 @@ -#ifndef PPARSEFP_H -#define PPARSEFP_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Parses a float or double number and returns the length parsed if - * successful. The length argument is of limited value due to dependency - * on `strtod` - buf[len] must be accessible and must not be part of - * a valid number, including hex float numbers.. - * - * Unlike strtod, whitespace is not parsed. - * - * May return: - * - null on error, - * - buffer start if first character does not start a number, - * - or end of parse on success. - * - */ - -#define PDIAGNOSTIC_IGNORE_UNUSED_FUNCTION -#include "pdiagnostic_push.h" - -/* - * isinf is needed in order to stay compatible with strtod's - * over/underflow handling but isinf has some portability issues. - * - * Use the parse_double/float_is_range_error instead of isinf directly. - * This ensures optimizations can be added when not using strtod. - * - * On gcc, clang and msvc we can use isinf or equivalent directly. - * Other compilers such as xlc may require linking with -lm which may not - * be convienent so a default isinf is provided. If isinf is available - * and there is a noticable performance issue, define - * `PORTABLE_USE_ISINF`. - */ -#if defined(__GNUC__) || defined(__clang__) || defined(_MSC_VER) || defined(PORTABLE_USE_ISINF) -#include -#if defined(_MSC_VER) && !defined(isinf) -#include -#define isnan _isnan -#define isinf(x) (!_finite(x)) -#endif -#define parse_double_isinf isinf -#define parse_float_isinf isinf -#else - -#ifndef UINT8_MAX -#include -#endif - -/* Avoid linking with libmath but depends on float/double being IEEE754 */ -static inline int parse_double_isinf(double x) -{ - union { uint64_t u64; double f64; } v; - v.f64 = x; - return (v.u64 & 0x7fffffff00000000ULL) == 0x7ff0000000000000ULL; -} - -static inline int parse_float_isinf(float x) -{ - union { uint32_t u32; float f32; } v; - v.f32 = x; - return (v.u32 & 0x7fffffff) == 0x7f800000; -} -#endif - -/* Returns 0 when in range, 1 on overflow, and -1 on underflow. */ -static inline int parse_double_is_range_error(double x) -{ - return parse_double_isinf(x) ? (x < 0.0 ? -1 : 1) : 0; -} - -static inline int parse_float_is_range_error(float x) -{ - return parse_float_isinf(x) ? (x < 0.0f ? -1 : 1) : 0; -} - -#ifndef PORTABLE_USE_GRISU3 -#define PORTABLE_USE_GRISU3 1 -#endif - -#if PORTABLE_USE_GRISU3 -#include "grisu3_parse.h" -#endif - -#ifdef grisu3_parse_double_is_defined -static inline const char *parse_double(const char *buf, int len, double *result) -{ - return grisu3_parse_double(buf, len, result); -} -#else -#include -static inline const char *parse_double(const char *buf, int len, double *result) -{ - char *end; - - (void)len; - *result = strtod(buf, &end); - return end; -} -#endif - -static inline const char *parse_float(const char *buf, int len, float *result) -{ - const char *end; - double v; - union { uint32_t u32; float f32; } inf; - inf.u32 = 0x7f800000; - - end = parse_double(buf, len, &v); - *result = (float)v; - if (parse_float_isinf(*result)) { - *result = v < 0 ? -inf.f32 : inf.f32; - return buf; - } - return end; -} - -#include "pdiagnostic_pop.h" - -#ifdef __cplusplus -} -#endif - -#endif /* PPARSEFP_H */ diff --git a/flatccrt/include/flatcc/portable/pparseint.h b/flatccrt/include/flatcc/portable/pparseint.h deleted file mode 100644 index dde2d4d..0000000 --- a/flatccrt/include/flatcc/portable/pparseint.h +++ /dev/null @@ -1,374 +0,0 @@ -#ifndef PPARSEINT_H -#define PPARSEINT_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Type specific integer parsers: - * - * const char * - * parse_(const char *buf, int len, *value, int *status); - * - * parse_uint64, parse_int64 - * parse_uint32, parse_int32 - * parse_uint16, parse_int16 - * parse_uint8, parse_int8 - * parse_ushort, parse_short - * parse_uint, parse_int - * parse_ulong, parse_long - * - * Leading space must be stripped in advance. Status argument can be - * null. - * - * Returns pointer to end of match and a non-negative status code - * on succcess (0 for unsigned, 1 for signed): - * - * PARSE_INTEGER_UNSIGNED - * PARSE_INTEGER_SIGNED - * - * Returns null with a negative status code and unmodified value on - * invalid integer formats: - * - * PARSE_INTEGER_OVERFLOW - * PARSE_INTEGER_UNDERFLOW - * PARSE_INTEGER_INVALID - * - * Returns input buffer with negative status code and unmodified value - * if first character does not start an integer (not a sign or a digit). - * - * PARSE_INTEGER_UNMATCHED - * PARSE_INTEGER_END - * - * The signed parsers only works with two's complement architectures. - * - * Note: the corresponding parse_float and parse_double parsers do not - * have a status argument because +/-Inf and NaN are conventionally used - * for this. - */ - -#include "limits.h" -#ifndef UINT8_MAX -#include -#endif - -#define PARSE_INTEGER_UNSIGNED 0 -#define PARSE_INTEGER_SIGNED 1 -#define PARSE_INTEGER_OVERFLOW -1 -#define PARSE_INTEGER_UNDERFLOW -2 -#define PARSE_INTEGER_INVALID -3 -#define PARSE_INTEGER_UNMATCHED -4 -#define PARSE_INTEGER_END -5 - -/* - * Generic integer parser that holds 64-bit unsigned values and stores - * sign separately. Leading space is not valid. - * - * Note: this function differs from the type specific parsers like - * parse_int64 by not negating the value when there is a sign. It - * differs from parse_uint64 by being able to return a negative - * UINT64_MAX successfully. - * - * This parser is used by all type specific integer parsers. - * - * Status argument can be null. - */ -static const char *parse_integer(const char *buf, int len, uint64_t *value, int *status) -{ - uint64_t x0, x = 0; - const char *k, *end = buf + len; - int sign, status_; - - if (!status) { - status = &status_; - } - if (buf == end) { - *status = PARSE_INTEGER_END; - return buf; - } - k = buf; - sign = *buf == '-'; - buf += sign; - while (buf != end && *buf >= '0' && *buf <= '9') { - x0 = x; - x = x * 10 + *buf - '0'; - if (x0 > x) { - *status = sign ? PARSE_INTEGER_UNDERFLOW : PARSE_INTEGER_OVERFLOW; - return 0; - } - ++buf; - } - if (buf == k) { - /* No number was matched, but it isn't an invalid number either. */ - *status = PARSE_INTEGER_UNMATCHED; - return buf; - } - if (buf == k + sign) { - *status = PARSE_INTEGER_INVALID; - return 0; - } - if (buf != end) - switch (*buf) { - case 'e': case 'E': case '.': case 'p': case 'P': - *status = PARSE_INTEGER_INVALID; - return 0; - } - *value = x; - *status = sign; - return buf; -} - -/* - * Parse hex values like 0xff, -0xff, 0XdeAdBeaf42, cannot be trailed by '.', 'p', or 'P'. - * Overflows if string is more than 16 valid hex digits. Otherwise similar to parse_integer. - */ -static const char *parse_hex_integer(const char *buf, int len, uint64_t *value, int *status) -{ - uint64_t x = 0; - const char *k, *k2, *end = buf + len; - int sign, status_; - unsigned char c; - - if (!status) { - status = &status_; - } - if (buf == end) { - *status = PARSE_INTEGER_END; - return buf; - } - sign = *buf == '-'; - buf += sign; - if (end - buf < 2 || buf[0] != '0' || (buf[1] | 0x20) != 'x') { - *status = PARSE_INTEGER_UNMATCHED; - return buf - sign; - } - buf += 2; - k = buf; - k2 = end; - if (end - buf > 16) { - k2 = buf + 16; - } - while (buf != k2) { - c = *buf; - if (c >= '0' && c <= '9') { - x = x * 16 + c - '0'; - } else { - /* Lower case. */ - c |= 0x20; - if (c >= 'a' && c <= 'f') { - x = x * 16 + c - 'a' + 10; - } else { - break; - } - } - ++buf; - } - if (buf == k) { - if (sign) { - *status = PARSE_INTEGER_INVALID; - return 0; - } else { - /* No number was matched, but it isn't an invalid number either. */ - *status = PARSE_INTEGER_UNMATCHED; - return buf; - } - } - if (buf == end) { - goto done; - } - c = *buf; - if (buf == k2) { - if (c >= '0' && c <= '9') { - *status = sign ? PARSE_INTEGER_UNDERFLOW : PARSE_INTEGER_OVERFLOW; - return 0; - } - c |= 0x20; - if (c >= 'a' && c <= 'f') { - *status = sign ? PARSE_INTEGER_UNDERFLOW : PARSE_INTEGER_OVERFLOW; - return 0; - } - } - switch (c) { - case '.': case 'p': case 'P': - *status = PARSE_INTEGER_INVALID; - return 0; - } -done: - *value = x; - *status = sign; - return buf; -} - - -#define __portable_define_parse_unsigned(NAME, TYPE, LIMIT) \ -static inline const char *parse_ ## NAME \ - (const char *buf, int len, TYPE *value, int *status) \ -{ \ - int status_ = 0; \ - uint64_t x; \ - \ - if (!status) { \ - status = &status_; \ - } \ - buf = parse_integer(buf, len, &x, status); \ - switch (*status) { \ - case PARSE_INTEGER_UNSIGNED: \ - if (x <= LIMIT) { \ - *value = (TYPE)x; \ - return buf; \ - } \ - *status = PARSE_INTEGER_OVERFLOW; \ - return 0; \ - case PARSE_INTEGER_SIGNED: \ - *status = PARSE_INTEGER_UNDERFLOW; \ - return 0; \ - default: \ - return buf; \ - } \ -} - -#define __portable_define_parse_hex_unsigned(NAME, TYPE, LIMIT) \ -static inline const char *parse_hex_ ## NAME \ - (const char *buf, int len, TYPE *value, int *status) \ -{ \ - int status_ = 0; \ - uint64_t x; \ - \ - if (!status) { \ - status = &status_; \ - } \ - buf = parse_hex_integer(buf, len, &x, status); \ - switch (*status) { \ - case PARSE_INTEGER_UNSIGNED: \ - if (x <= LIMIT) { \ - *value = (TYPE)x; \ - return buf; \ - } \ - *status = PARSE_INTEGER_OVERFLOW; \ - return 0; \ - case PARSE_INTEGER_SIGNED: \ - *status = PARSE_INTEGER_UNDERFLOW; \ - return 0; \ - default: \ - return buf; \ - } \ -} - -/* This assumes two's complement. */ -#define __portable_define_parse_signed(NAME, TYPE, LIMIT) \ -static inline const char *parse_ ## NAME \ - (const char *buf, int len, TYPE *value, int *status) \ -{ \ - int status_ = 0; \ - uint64_t x; \ - \ - if (!status) { \ - status = &status_; \ - } \ - buf = parse_integer(buf, len, &x, status); \ - switch (*status) { \ - case PARSE_INTEGER_UNSIGNED: \ - if (x <= LIMIT) { \ - *value = (TYPE)x; \ - return buf; \ - } \ - *status = PARSE_INTEGER_OVERFLOW; \ - return 0; \ - case PARSE_INTEGER_SIGNED: \ - if (x <= (uint64_t)(LIMIT) + 1) { \ - *value = (TYPE)-(int64_t)x; \ - return buf; \ - } \ - *status = PARSE_INTEGER_UNDERFLOW; \ - return 0; \ - default: \ - return buf; \ - } \ -} - -/* This assumes two's complement. */ -#define __portable_define_parse_hex_signed(NAME, TYPE, LIMIT) \ -static inline const char *parse_hex_ ## NAME \ - (const char *buf, int len, TYPE *value, int *status) \ -{ \ - int status_ = 0; \ - uint64_t x; \ - \ - if (!status) { \ - status = &status_; \ - } \ - buf = parse_hex_integer(buf, len, &x, status); \ - switch (*status) { \ - case PARSE_INTEGER_UNSIGNED: \ - if (x <= LIMIT) { \ - *value = (TYPE)x; \ - return buf; \ - } \ - *status = PARSE_INTEGER_OVERFLOW; \ - return 0; \ - case PARSE_INTEGER_SIGNED: \ - if (x <= (uint64_t)(LIMIT) + 1) { \ - *value = (TYPE)-(int64_t)x; \ - return buf; \ - } \ - *status = PARSE_INTEGER_UNDERFLOW; \ - return 0; \ - default: \ - return buf; \ - } \ -} - -static inline const char *parse_uint64(const char *buf, int len, uint64_t *value, int *status) -{ - buf = parse_integer(buf, len, value, status); - if (*status == PARSE_INTEGER_SIGNED) { - *status = PARSE_INTEGER_UNDERFLOW; - return 0; - } - return buf; -} - -static inline const char *parse_hex_uint64(const char *buf, int len, uint64_t *value, int *status) -{ - buf = parse_hex_integer(buf, len, value, status); - if (*status == PARSE_INTEGER_SIGNED) { - *status = PARSE_INTEGER_UNDERFLOW; - return 0; - } - return buf; -} - -__portable_define_parse_signed(int64, int64_t, INT64_MAX) -__portable_define_parse_signed(int32, int32_t, INT32_MAX) -__portable_define_parse_unsigned(uint16, uint16_t, UINT16_MAX) -__portable_define_parse_signed(int16, int16_t, INT16_MAX) -__portable_define_parse_unsigned(uint8, uint8_t, UINT8_MAX) -__portable_define_parse_signed(int8, int8_t, INT8_MAX) - -__portable_define_parse_hex_signed(int64, int64_t, INT64_MAX) -__portable_define_parse_hex_signed(int32, int32_t, INT32_MAX) -__portable_define_parse_hex_unsigned(uint16, uint16_t, UINT16_MAX) -__portable_define_parse_hex_signed(int16, int16_t, INT16_MAX) -__portable_define_parse_hex_unsigned(uint8, uint8_t, UINT8_MAX) -__portable_define_parse_hex_signed(int8, int8_t, INT8_MAX) - -__portable_define_parse_unsigned(ushort, unsigned short, USHRT_MAX) -__portable_define_parse_signed(short, short, SHRT_MAX) -__portable_define_parse_unsigned(uint, unsigned int, UINT_MAX) -__portable_define_parse_signed(int, int, INT_MAX) -__portable_define_parse_unsigned(ulong, unsigned long, ULONG_MAX) -__portable_define_parse_signed(long, unsigned long, LONG_MAX) - -__portable_define_parse_hex_unsigned(ushort, unsigned short, USHRT_MAX) -__portable_define_parse_hex_signed(short, short, SHRT_MAX) -__portable_define_parse_hex_unsigned(uint, unsigned int, UINT_MAX) -__portable_define_parse_hex_signed(int, int, INT_MAX) -__portable_define_parse_hex_unsigned(ulong, unsigned long, ULONG_MAX) -__portable_define_parse_hex_signed(long, unsigned long, LONG_MAX) - -#ifdef __cplusplus -} -#endif - -#endif /* PPARSEINT_H */ diff --git a/flatccrt/include/flatcc/portable/pprintfp.h b/flatccrt/include/flatcc/portable/pprintfp.h deleted file mode 100644 index c2e5c07..0000000 --- a/flatccrt/include/flatcc/portable/pprintfp.h +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef PPRINTFP_H -#define PPRINTFP_H - -#ifdef __cplusplus -extern "C" { -#endif - -#define PDIAGNOSTIC_IGNORE_UNUSED_FUNCTION -#include "pdiagnostic_push.h" - -#ifndef PORTABLE_USE_GRISU3 -#define PORTABLE_USE_GRISU3 1 -#endif - - -#if PORTABLE_USE_GRISU3 -#include "grisu3_print.h" -#endif - -#ifdef grisu3_print_double_is_defined -/* Currently there is not special support for floats. */ -#define print_float(n, p) grisu3_print_double((float)(n), (p)) -#define print_double(n, p) grisu3_print_double((double)(n), (p)) -#else -#include -#define print_float(n, p) sprintf(p, "%.9g", (float)(n)) -#define print_double(n, p) sprintf(p, "%.17g", (double)(n)) -#endif - -#define print_hex_float(n, p) sprintf(p, "%a", (float)(n)) -#define print_hex_double(n, p) sprintf(p, "%a", (double)(n)) - -#include "pdiagnostic_pop.h" - -#ifdef __cplusplus -} -#endif - -#endif /* PPRINTFP_H */ diff --git a/flatccrt/include/flatcc/portable/pprintint.h b/flatccrt/include/flatcc/portable/pprintint.h deleted file mode 100644 index b4975f4..0000000 --- a/flatccrt/include/flatcc/portable/pprintint.h +++ /dev/null @@ -1,633 +0,0 @@ -/* - * The MIT License (MIT) - * - * Copyright (c) 2016 Mikkel F. Jørgensen, dvide.com - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - * - * Fast printing of (u)int8/16/32/64_t, (u)int, (u)long. - * - * Functions take for the - * - * int print_(type value, char *buf); - * - * and returns number of characters printed, excluding trailing '\0' - * which is also printed. Prints at most 21 characters including zero- - * termination. - * - * The function `print_bool` is a bit different - it simply prints "true\0" for - * non-zero integers, and "false\0" otherwise. - * - * The general algorithm is in-place formatting using binary search log10 - * followed by duff device loop unrolling div / 100 stages. - * - * The simpler post copy algorithm also provided for fmt_(u)int uses a - * temp buffer and loops over div/100 and post copy to target buffer. - * - * - * Benchmarks on core-i7, 2.2GHz, 64-bit clang/OS-X -O2: - * - * print_int64: avg 15ns for values between INT64_MIN + (10^7/2 .. 10^7/2) - * print_int64: avg 11ns for values between 10^9 + (0..10,000,000). - * print_int32: avg 7ns for values cast from INT64_MIN + (10^7/2 .. 10^7/2) - * print_int32: avg 7ns for values between 10^9 + (0..10,000,000). - * print_int64: avg 13ns for values between 10^16 + (0..10,000,000). - * print_int64: avg 5ns for values between 0 and 10,000,000. - * print_int32: avg 5ns for values between 0 and 10,000,000. - * print_int16: avg 10ns for values cast from 0 and 10,000,000. - * print_int8: avg 4ns for values cast from 0 and 10,000,000. - * - * Post copy algorithm: - * print_int: avg 12ns for values between INT64_MIN + (10^7/2 .. 10^7/2) - * print_int: avg 14ns for values between 10^9 + (0..10,000,000). - * print_long: avg 29ns for values between INT64_MIN + (10^7/2 .. 10^7/2) - * - * The post copy algorithm is nearly half as fast as the in-place - * algorithm, but can also be faster occasionally - possibly because the - * optimizer being able to skip the copy step. - */ - -#ifndef PPRINTINT_H -#define PPRINTINT_H - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef UINT8_MAX -#include -#endif - -#define PDIAGNOSTIC_IGNORE_UNUSED_FUNCTION -#include "pdiagnostic_push.h" - -static int print_bool(int n, char *p); - -static int print_uint8(uint8_t n, char *p); -static int print_uint16(uint16_t n, char *p); -static int print_uint32(uint32_t n, char *p); -static int print_uint64(uint64_t n, char *p); -static int print_int8(int8_t n, char *p); -static int print_int16(int16_t n, char *p); -static int print_int32(int32_t n, char *p); -static int print_int64(int64_t n, char *p); - -/* - * Uses slightly slower, but more compact alogrithm - * that is not hardcoded to implementation size. - * Other types may be defined using macros below. - */ -static int print_ulong(unsigned long n, char *p); -static int print_uint(unsigned int n, char *p); -static int print_int(int n, char *p); -static int print_long(long n, char *p); - - -#if defined(__i386__) || defined(__x86_64__) || defined(_M_IX86) || defined(_M_X64) -#define __print_unaligned_copy_16(p, q) (*(uint16_t*)(p) = *(uint16_t*)(q)) -#else -#define __print_unaligned_copy_16(p, q) \ - ((((uint8_t*)(p))[0] = ((uint8_t*)(q))[0]), \ - (((uint8_t*)(p))[1] = ((uint8_t*)(q))[1])) -#endif - -static const char __print_digit_pairs[] = - "0001020304050607080910111213141516171819" - "2021222324252627282930313233343536373839" - "4041424344454647484950515253545556575859" - "6061626364656667686970717273747576777879" - "8081828384858687888990919293949596979899"; - -#define __print_stage() \ - p -= 2; \ - dp = __print_digit_pairs + (n % 100) * 2; \ - n /= 100; \ - __print_unaligned_copy_16(p, dp); - -#define __print_long_stage() \ - __print_stage() \ - __print_stage() - -#define __print_short_stage() \ - *--p = (n % 10) + '0'; \ - n /= 10; - -static int print_bool(int n, char *buf) -{ - if (n) { - memcpy(buf, "true\0", 5); - return 4; - } else { - memcpy(buf, "false\0", 6); - return 5; - } -} - -static int print_uint8(uint8_t n, char *p) -{ - const char *dp; - - if (n >= 100) { - p += 3; - *p = '\0'; - __print_stage(); - p[-1] = n + '0'; - return 3; - } - if (n >= 10) { - p += 2; - *p = '\0'; - __print_stage(); - return 2; - } - p[1] = '\0'; - p[0] = n + '0'; - return 1; -} - -static int print_uint16(uint16_t n, char *p) -{ - int k = 0; - const char *dp; - - if (n >= 1000) { - if(n >= 10000) { - k = 5; - } else { - k = 4; - } - } else { - if(n >= 100) { - k = 3; - } else if(n >= 10) { - k = 2; - } else { - k = 1; - } - } - p += k; - *p = '\0'; - if (k & 1) { - /* Fall through comments needed to silence gcc 7 warnings. */ - switch (k) { - case 5: - __print_stage(); - /* Fall through */ - case 3: - __print_stage(); - /* Fall through */ - case 1: - p[-1] = n + '0'; - } - } else { - /* Fall through comments needed to silence gcc 7 warnings. */ - switch (k) { - case 4: - __print_stage(); - /* Fall through */ - case 2: - __print_stage(); - } - } - return k; -} - -static int print_uint32(uint32_t n, char *p) -{ - int k = 0; - const char *dp; - - if(n >= 10000UL) { - if(n >= 10000000UL) { - if(n >= 1000000000UL) { - k = 10; - } else if(n >= 100000000UL) { - k = 9; - } else { - k = 8; - } - } else { - if(n >= 1000000UL) { - k = 7; - } else if(n >= 100000UL) { - k = 6; - } else { - k = 5; - } - } - } else { - if(n >= 100UL) { - if(n >= 1000UL) { - k = 4; - } else { - k = 3; - } - } else { - if(n >= 10UL) { - k = 2; - } else { - k = 1UL; - } - } - } - p += k; - *p = '\0'; - if (k & 1) { - /* Fall through comments needed to silence gcc 7 warnings. */ - switch (k) { - case 9: - __print_stage(); - /* Fall through */ - case 7: - __print_stage(); - /* Fall through */ - case 5: - __print_stage(); - /* Fall through */ - case 3: - __print_stage(); - /* Fall through */ - case 1: - p[-1] = n + '0'; - } - } else { - /* Fall through comments needed to silence gcc 7 warnings. */ - switch (k) { - case 10: - __print_stage(); - /* Fall through */ - case 8: - __print_stage(); - /* Fall through */ - case 6: - __print_stage(); - /* Fall through */ - case 4: - __print_stage(); - /* Fall through */ - case 2: - __print_stage(); - /* Fall through */ - } - } - return k; -} - -static int print_uint64(uint64_t n, char *p) -{ - int k = 0; - const char *dp; - const uint64_t x = 1000000000ULL; - - if (n < x) { - return print_uint32((uint32_t)n, p); - } - if(n >= 10000ULL * x) { - if(n >= 10000000ULL * x) { - if(n >= 1000000000ULL * x) { - if (n >= 10000000000ULL * x) { - k = 11 + 9; - } else { - k = 10 + 9; - } - } else if(n >= 100000000ULL * x) { - k = 9 + 9; - } else { - k = 8 + 9; - } - } else { - if(n >= 1000000ULL * x) { - k = 7 + 9; - } else if(n >= 100000ULL * x) { - k = 6 + 9; - } else { - k = 5 + 9; - } - } - } else { - if(n >= 100ULL * x) { - if(n >= 1000ULL * x) { - k = 4 + 9; - } else { - k = 3 + 9; - } - } else { - if(n >= 10ULL * x) { - k = 2 + 9; - } else { - k = 1 + 9; - } - } - } - p += k; - *p = '\0'; - if (k & 1) { - /* Fall through comments needed to silence gcc 7 warnings. */ - switch (k) { - case 19: - __print_stage(); - /* Fall through */ - case 17: - __print_stage(); - /* Fall through */ - case 15: - __print_stage(); - /* Fall through */ - case 13: - __print_stage(); - /* Fall through */ - case 11: - __print_stage() - __print_short_stage(); - } - } else { - /* Fall through comments needed to silence gcc 7 warnings. */ - switch (k) { - case 20: - __print_stage(); - /* Fall through */ - case 18: - __print_stage(); - /* Fall through */ - case 16: - __print_stage(); - /* Fall through */ - case 14: - __print_stage(); - /* Fall through */ - case 12: - __print_stage(); - /* Fall through */ - case 10: - __print_stage(); - } - } - __print_long_stage() - __print_long_stage() - return k; -} - -static int print_int8(int8_t n, char *p) -{ - int sign; - - if ((sign = n < 0)) { - *p++ = '-'; - n = -n; - } - return print_uint8(n, p) + sign; -} - -static int print_int16(int16_t n, char *p) -{ - int sign; - - if ((sign = n < 0)) { - *p++ = '-'; - n = -n; - } - return print_uint16(n, p) + sign; -} - -static int print_int32(int32_t n, char *p) -{ - int sign; - - if ((sign = n < 0)) { - *p++ = '-'; - n = -n; - } - return print_uint32(n, p) + sign; -} - -static int print_int64(int64_t n, char *p) -{ - int sign; - - if ((sign = n < 0)) { - *p++ = '-'; - n = -n; - } - return print_uint64(n, p) + sign; -} - -#define __define_print_int_simple(NAME, UNAME, T, UT) \ -static int UNAME(UT n, char *buf) \ -{ \ - char tmp[20]; \ - char* p = tmp + 20; \ - char* q = p; \ - unsigned int k, m; \ - \ - while (n >= 100) { \ - p -= 2; \ - m = (unsigned int)(n % 100) * 2; \ - n /= 100; \ - __print_unaligned_copy_16(p, __print_digit_pairs + m); \ - } \ - p -= 2; \ - m = (unsigned int)n * 2; \ - __print_unaligned_copy_16(p, __print_digit_pairs + m); \ - if (n < 10) { \ - ++p; \ - } \ - k = (unsigned int)(q - p); \ - while (p != q) { \ - *buf++ = *p++; \ - } \ - *buf = '\0'; \ - return k; \ -} \ - \ -static int NAME(T n, char *buf) \ -{ \ - int sign = n < 0; \ - \ - if (sign) { \ - *buf++ = '-'; \ - n = -n; \ - } \ - return UNAME((UT)n, buf) + sign; \ -} - -__define_print_int_simple(print_int, print_uint, int, unsigned int) -__define_print_int_simple(print_long, print_ulong, long, unsigned long) - -#ifdef PPRINTINT_BENCH -int main() { - int64_t count = 10000000; /* 10^7 */ -#if 0 - int64_t base = 0; - int64_t base = 10000000000000000; /* 10^16 */ - int64_t base = 1000000000; /* 10^9 */ -#endif - int64_t base = INT64_MIN - count/2; - char buf[100]; - int i, k = 0, n = 0; - for (i = 0; i < count; i++) { - k = print_int64(i + base, buf); - n += buf[0] + buf[k - 1]; - } - return n; -} -/* Call with time on executable, multiply time in seconds by 100 to get time unit in ns/number. */ -#endif /* PPRINTINT_BENCH */ - -#ifdef PPRINTINT_TEST - -#include -#include - -int main() -{ - char buf[21]; - int failed = 0; - int k; - - k = print_uint64(UINT64_MAX, buf); - if (strlen(buf) != k) printf("length error\n"); - if (strcmp("18446744073709551615", buf)) { - printf("UINT64_MAX didn't print correctly, got:\n'%s'\n", buf); - ++failed; - } - k = print_int64(INT64_MAX, buf); - if (strlen(buf) != k) printf("length error\n"); - if (strcmp("9223372036854775807", buf)) { - printf("INT64_MAX didn't print correctly, got:\n'%s'\n", buf); - ++failed; - } - k = print_int64(INT64_MIN, buf); - if (strlen(buf) != k) printf("length error\n"); - if (strcmp("-9223372036854775808", buf)) { - printf("INT64_MIN didn't print correctly, got:\n'%s'\n", buf); - ++failed; - } - k = print_uint32(UINT32_MAX, buf); - if (strlen(buf) != k) printf("length error\n"); - if (strcmp("4294967295", buf)) { - printf("UINT32_MAX didn't print correctly, got:\n'%s'\n", buf); - ++failed; - } - k = print_int32(INT32_MAX, buf); - if (strlen(buf) != k) printf("length error\n"); - if (strcmp("2147483647", buf)) { - printf("INT32_MAX didn't print correctly, got:\n'%s'\n", buf); - ++failed; - } - k = print_int32(INT32_MIN, buf); - if (strlen(buf) != k) printf("length error\n"); - if (strcmp("-2147483648", buf)) { - printf("INT32_MIN didn't print correctly, got:\n'%s'\n", buf); - ++failed; - } - k = print_uint16(UINT16_MAX, buf); - if (strlen(buf) != k) printf("length error\n"); - if (strcmp("65535", buf)) { - printf("UINT16_MAX didn't print correctly, got:\n'%s'\n", buf); - ++failed; - } - k = print_int16(INT16_MAX, buf); - if (strlen(buf) != k) printf("length error\n"); - if (strcmp("32767", buf)) { - printf("INT16_MAX didn't print correctly, got:\n'%s'\n", buf); - ++failed; - } - k = print_int16(INT16_MIN, buf); - if (strlen(buf) != k) printf("length error\n"); - if (strcmp("-32768", buf)) { - printf("INT16_MIN didn't print correctly, got:\n'%s'\n", buf); - ++failed; - } - k = print_uint8(UINT8_MAX, buf); - if (strlen(buf) != k) printf("length error\n"); - if (strcmp("255", buf)) { - printf("INT8_MAX didn't print correctly, got:\n'%s'\n", buf); - ++failed; - } - k = print_int8(INT8_MAX, buf); - if (strlen(buf) != k) printf("length error\n"); - if (strcmp("127", buf)) { - printf("INT8_MAX didn't print correctly, got:\n'%s'\n", buf); - ++failed; - } - k = print_int8(INT8_MIN, buf); - if (strlen(buf) != k) printf("length error\n"); - if (strcmp("-128", buf)) { - printf("INT8_MIN didn't print correctly, got:\n'%s'\n", buf); - ++failed; - } - k = print_int(INT32_MAX, buf); - if (strlen(buf) != k) printf("length error\n"); - if (strcmp("2147483647", buf)) { - printf("INT32_MAX didn't print correctly with k = print_int, got:\n'%s'\n", buf); - ++failed; - } - k = print_int(INT32_MIN, buf); - if (strlen(buf) != k) printf("length error\n"); - if (strcmp("-2147483648", buf)) { - printf("INT32_MIN didn't print correctly k = print_int, got:\n'%s'\n", buf); - ++failed; - } - k = print_long(INT32_MAX, buf); - if (strlen(buf) != k) printf("length error\n"); - if (strcmp("2147483647", buf)) { - printf("INT32_MAX didn't print correctly with fmt_long, got:\n'%s'\n", buf); - ++failed; - } - k = print_long(INT32_MIN, buf); - if (strlen(buf) != k) printf("length error\n"); - if (strcmp("-2147483648", buf)) { - printf("INT32_MIN didn't print correctly fmt_long, got:\n'%s'\n", buf); - ++failed; - } - k = print_bool(1, buf); - if (strlen(buf) != k) printf("length error\n"); - if (strcmp("true", buf) { - printf("1 didn't print 'true' as expected, got:\n'%s'\n", buf); - ++failed; - } - k = print_bool(-1, buf); - if (strlen(buf) != k) printf("length error\n"); - if (strcmp("true", buf) { - printf("-1 didn't print 'true' as expected, got:\n'%s'\n", buf); - ++failed; - } - k = print_bool(, buf); - if (strlen(buf) != k) printf("length error\n"); - if (strcmp("false", buf) { - printf("0 didn't print 'false' as expected, got:\n'%s'\n", buf); - ++failed; - } - if (failed) { - printf("FAILED\n"); - return -1; - } - printf("SUCCESS\n"); - return 0; -} -#endif /* PPRINTINT_TEST */ - -#include "pdiagnostic_pop.h" - -#ifdef __cplusplus -} -#endif - -#endif /* PPRINTINT_H */ diff --git a/flatccrt/include/flatcc/portable/pstatic_assert.h b/flatccrt/include/flatcc/portable/pstatic_assert.h deleted file mode 100644 index 24d5634..0000000 --- a/flatccrt/include/flatcc/portable/pstatic_assert.h +++ /dev/null @@ -1,67 +0,0 @@ -#ifndef PSTATIC_ASSERT_H -#define PSTATIC_ASSERT_H - -#include - -/* Handle clang */ -#ifndef __has_feature - #define __has_feature(x) 0 -#endif - -#if defined(static_assert) -#ifndef __static_assert_is_defined -#define __static_assert_is_defined 1 -#endif -#endif - -/* Handle static_assert as a keyword in C++ and compiler specifics. */ -#if !defined(__static_assert_is_defined) - -#if defined(__cplusplus) - -#if __cplusplus >= 201103L -#define __static_assert_is_defined 1 -#elif __has_feature(cxx_static_assert) -#define __static_assert_is_defined 1 -#elif defined(_MSC_VER) && (_MSC_VER >= 1600) -#define __static_assert_is_defined 1 -#endif - -#else - -#if defined(_MSC_VER) && (_MSC_VER >= 1600) -#define __static_assert_is_defined 1 -#elif __has_feature(c_static_assert) -#define static_assert(pred, msg) _Static_assert(pred, msg) -#define __static_assert_is_defined 1 -#elif defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) -/* In case the clib headers are not compliant. */ -#define static_assert(pred, msg) _Static_assert(pred, msg) -#define __static_assert_is_defined 1 -#endif - -#endif /* __cplusplus */ -#endif /* __static_assert_is_defined */ - - -#if !defined(__static_assert_is_defined) - -#define __PSTATIC_ASSERT_CONCAT_(a, b) static_assert_scope_##a##_line_##b -#define __PSTATIC_ASSERT_CONCAT(a, b) __PSTATIC_ASSERT_CONCAT_(a, b) -#ifdef __COUNTER__ -#define static_assert(e, msg) enum { __PSTATIC_ASSERT_CONCAT(__COUNTER__, __LINE__) = 1/(!!(e)) } -#else -#include "pstatic_assert_scope.h" -#define static_assert(e, msg) enum { __PSTATIC_ASSERT_CONCAT(__PSTATIC_ASSERT_COUNTER, __LINE__) = 1/(int)(!!(e)) } -#endif - -#define __static_assert_is_defined 1 - -#endif /* __static_assert_is_defined */ - -#endif /* PSTATIC_ASSERT_H */ - -/* Update scope counter outside of include guard. */ -#ifdef __PSTATIC_ASSERT_COUNTER -#include "pstatic_assert_scope.h" -#endif diff --git a/flatccrt/include/flatcc/portable/pstatic_assert_scope.h b/flatccrt/include/flatcc/portable/pstatic_assert_scope.h deleted file mode 100644 index 71a0c29..0000000 --- a/flatccrt/include/flatcc/portable/pstatic_assert_scope.h +++ /dev/null @@ -1,280 +0,0 @@ -/* - * january, 2017, ported to portable library by mikkelfj. - * Based on dbgtools static assert counter, but with renamed macros. - */ - -/* - dbgtools - platform independent wrapping of "nice to have" debug functions. - - version 0.1, october, 2013 - - https://github.com/wc-duck/dbgtools - - Copyright (C) 2013- Fredrik Kihlander - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - Fredrik Kihlander -*/ - -/** - * Auto-generated header implementing a counter that increases by each include of the file. - * - * This header will define the macro __PSTATIC_ASSERT_COUNTER to be increased for each inclusion of the file. - * - * It has been generated with 3 amount of digits resulting in the counter wrapping around after - * 10000 inclusions. - * - * Usage: - * - * #include "this_header.h" - * int a = __PSTATIC_ASSERT_COUNTER; // 0 - * #include "this_header.h" - * int b = __PSTATIC_ASSERT_COUNTER; // 1 - * #include "this_header.h" - * int c = __PSTATIC_ASSERT_COUNTER; // 2 - * #include "this_header.h" - * int d = __PSTATIC_ASSERT_COUNTER; // 3 - */ - -#ifndef __PSTATIC_ASSERT_COUNTER -# define __PSTATIC_ASSERT_COUNTER_0 0 -# define __PSTATIC_ASSERT_COUNTER_1 -# define __PSTATIC_ASSERT_COUNTER_2 -# define __PSTATIC_ASSERT_COUNTER_3 -# define __PSTATIC_ASSERT_COUNTER_D1_0 -# define __PSTATIC_ASSERT_COUNTER_D2_0 -# define __PSTATIC_ASSERT_COUNTER_D3_0 -#endif /* __PSTATIC_ASSERT_COUNTER */ - -#if !defined( __PSTATIC_ASSERT_COUNTER_D0_0 ) -# define __PSTATIC_ASSERT_COUNTER_D0_0 -# undef __PSTATIC_ASSERT_COUNTER_0 -# define __PSTATIC_ASSERT_COUNTER_0 0 -#elif !defined( __PSTATIC_ASSERT_COUNTER_D0_1 ) -# define __PSTATIC_ASSERT_COUNTER_D0_1 -# undef __PSTATIC_ASSERT_COUNTER_0 -# define __PSTATIC_ASSERT_COUNTER_0 1 -#elif !defined( __PSTATIC_ASSERT_COUNTER_D0_2 ) -# define __PSTATIC_ASSERT_COUNTER_D0_2 -# undef __PSTATIC_ASSERT_COUNTER_0 -# define __PSTATIC_ASSERT_COUNTER_0 2 -#elif !defined( __PSTATIC_ASSERT_COUNTER_D0_3 ) -# define __PSTATIC_ASSERT_COUNTER_D0_3 -# undef __PSTATIC_ASSERT_COUNTER_0 -# define __PSTATIC_ASSERT_COUNTER_0 3 -#elif !defined( __PSTATIC_ASSERT_COUNTER_D0_4 ) -# define __PSTATIC_ASSERT_COUNTER_D0_4 -# undef __PSTATIC_ASSERT_COUNTER_0 -# define __PSTATIC_ASSERT_COUNTER_0 4 -#elif !defined( __PSTATIC_ASSERT_COUNTER_D0_5 ) -# define __PSTATIC_ASSERT_COUNTER_D0_5 -# undef __PSTATIC_ASSERT_COUNTER_0 -# define __PSTATIC_ASSERT_COUNTER_0 5 -#elif !defined( __PSTATIC_ASSERT_COUNTER_D0_6 ) -# define __PSTATIC_ASSERT_COUNTER_D0_6 -# undef __PSTATIC_ASSERT_COUNTER_0 -# define __PSTATIC_ASSERT_COUNTER_0 6 -#elif !defined( __PSTATIC_ASSERT_COUNTER_D0_7 ) -# define __PSTATIC_ASSERT_COUNTER_D0_7 -# undef __PSTATIC_ASSERT_COUNTER_0 -# define __PSTATIC_ASSERT_COUNTER_0 7 -#elif !defined( __PSTATIC_ASSERT_COUNTER_D0_8 ) -# define __PSTATIC_ASSERT_COUNTER_D0_8 -# undef __PSTATIC_ASSERT_COUNTER_0 -# define __PSTATIC_ASSERT_COUNTER_0 8 -#elif !defined( __PSTATIC_ASSERT_COUNTER_D0_9 ) -# define __PSTATIC_ASSERT_COUNTER_D0_9 -# undef __PSTATIC_ASSERT_COUNTER_0 -# define __PSTATIC_ASSERT_COUNTER_0 9 -#else -# undef __PSTATIC_ASSERT_COUNTER_D0_1 -# undef __PSTATIC_ASSERT_COUNTER_D0_2 -# undef __PSTATIC_ASSERT_COUNTER_D0_3 -# undef __PSTATIC_ASSERT_COUNTER_D0_4 -# undef __PSTATIC_ASSERT_COUNTER_D0_5 -# undef __PSTATIC_ASSERT_COUNTER_D0_6 -# undef __PSTATIC_ASSERT_COUNTER_D0_7 -# undef __PSTATIC_ASSERT_COUNTER_D0_8 -# undef __PSTATIC_ASSERT_COUNTER_D0_9 -# undef __PSTATIC_ASSERT_COUNTER_0 -# define __PSTATIC_ASSERT_COUNTER_0 0 -# if !defined( __PSTATIC_ASSERT_COUNTER_D1_0 ) -# define __PSTATIC_ASSERT_COUNTER_D1_0 -# undef __PSTATIC_ASSERT_COUNTER_1 -# define __PSTATIC_ASSERT_COUNTER_1 0 -# elif !defined( __PSTATIC_ASSERT_COUNTER_D1_1 ) -# define __PSTATIC_ASSERT_COUNTER_D1_1 -# undef __PSTATIC_ASSERT_COUNTER_1 -# define __PSTATIC_ASSERT_COUNTER_1 1 -# elif !defined( __PSTATIC_ASSERT_COUNTER_D1_2 ) -# define __PSTATIC_ASSERT_COUNTER_D1_2 -# undef __PSTATIC_ASSERT_COUNTER_1 -# define __PSTATIC_ASSERT_COUNTER_1 2 -# elif !defined( __PSTATIC_ASSERT_COUNTER_D1_3 ) -# define __PSTATIC_ASSERT_COUNTER_D1_3 -# undef __PSTATIC_ASSERT_COUNTER_1 -# define __PSTATIC_ASSERT_COUNTER_1 3 -# elif !defined( __PSTATIC_ASSERT_COUNTER_D1_4 ) -# define __PSTATIC_ASSERT_COUNTER_D1_4 -# undef __PSTATIC_ASSERT_COUNTER_1 -# define __PSTATIC_ASSERT_COUNTER_1 4 -# elif !defined( __PSTATIC_ASSERT_COUNTER_D1_5 ) -# define __PSTATIC_ASSERT_COUNTER_D1_5 -# undef __PSTATIC_ASSERT_COUNTER_1 -# define __PSTATIC_ASSERT_COUNTER_1 5 -# elif !defined( __PSTATIC_ASSERT_COUNTER_D1_6 ) -# define __PSTATIC_ASSERT_COUNTER_D1_6 -# undef __PSTATIC_ASSERT_COUNTER_1 -# define __PSTATIC_ASSERT_COUNTER_1 6 -# elif !defined( __PSTATIC_ASSERT_COUNTER_D1_7 ) -# define __PSTATIC_ASSERT_COUNTER_D1_7 -# undef __PSTATIC_ASSERT_COUNTER_1 -# define __PSTATIC_ASSERT_COUNTER_1 7 -# elif !defined( __PSTATIC_ASSERT_COUNTER_D1_8 ) -# define __PSTATIC_ASSERT_COUNTER_D1_8 -# undef __PSTATIC_ASSERT_COUNTER_1 -# define __PSTATIC_ASSERT_COUNTER_1 8 -# elif !defined( __PSTATIC_ASSERT_COUNTER_D1_9 ) -# define __PSTATIC_ASSERT_COUNTER_D1_9 -# undef __PSTATIC_ASSERT_COUNTER_1 -# define __PSTATIC_ASSERT_COUNTER_1 9 -# else -# undef __PSTATIC_ASSERT_COUNTER_D1_1 -# undef __PSTATIC_ASSERT_COUNTER_D1_2 -# undef __PSTATIC_ASSERT_COUNTER_D1_3 -# undef __PSTATIC_ASSERT_COUNTER_D1_4 -# undef __PSTATIC_ASSERT_COUNTER_D1_5 -# undef __PSTATIC_ASSERT_COUNTER_D1_6 -# undef __PSTATIC_ASSERT_COUNTER_D1_7 -# undef __PSTATIC_ASSERT_COUNTER_D1_8 -# undef __PSTATIC_ASSERT_COUNTER_D1_9 -# undef __PSTATIC_ASSERT_COUNTER_1 -# define __PSTATIC_ASSERT_COUNTER_1 0 -# if !defined( __PSTATIC_ASSERT_COUNTER_D2_0 ) -# define __PSTATIC_ASSERT_COUNTER_D2_0 -# undef __PSTATIC_ASSERT_COUNTER_2 -# define __PSTATIC_ASSERT_COUNTER_2 0 -# elif !defined( __PSTATIC_ASSERT_COUNTER_D2_1 ) -# define __PSTATIC_ASSERT_COUNTER_D2_1 -# undef __PSTATIC_ASSERT_COUNTER_2 -# define __PSTATIC_ASSERT_COUNTER_2 1 -# elif !defined( __PSTATIC_ASSERT_COUNTER_D2_2 ) -# define __PSTATIC_ASSERT_COUNTER_D2_2 -# undef __PSTATIC_ASSERT_COUNTER_2 -# define __PSTATIC_ASSERT_COUNTER_2 2 -# elif !defined( __PSTATIC_ASSERT_COUNTER_D2_3 ) -# define __PSTATIC_ASSERT_COUNTER_D2_3 -# undef __PSTATIC_ASSERT_COUNTER_2 -# define __PSTATIC_ASSERT_COUNTER_2 3 -# elif !defined( __PSTATIC_ASSERT_COUNTER_D2_4 ) -# define __PSTATIC_ASSERT_COUNTER_D2_4 -# undef __PSTATIC_ASSERT_COUNTER_2 -# define __PSTATIC_ASSERT_COUNTER_2 4 -# elif !defined( __PSTATIC_ASSERT_COUNTER_D2_5 ) -# define __PSTATIC_ASSERT_COUNTER_D2_5 -# undef __PSTATIC_ASSERT_COUNTER_2 -# define __PSTATIC_ASSERT_COUNTER_2 5 -# elif !defined( __PSTATIC_ASSERT_COUNTER_D2_6 ) -# define __PSTATIC_ASSERT_COUNTER_D2_6 -# undef __PSTATIC_ASSERT_COUNTER_2 -# define __PSTATIC_ASSERT_COUNTER_2 6 -# elif !defined( __PSTATIC_ASSERT_COUNTER_D2_7 ) -# define __PSTATIC_ASSERT_COUNTER_D2_7 -# undef __PSTATIC_ASSERT_COUNTER_2 -# define __PSTATIC_ASSERT_COUNTER_2 7 -# elif !defined( __PSTATIC_ASSERT_COUNTER_D2_8 ) -# define __PSTATIC_ASSERT_COUNTER_D2_8 -# undef __PSTATIC_ASSERT_COUNTER_2 -# define __PSTATIC_ASSERT_COUNTER_2 8 -# elif !defined( __PSTATIC_ASSERT_COUNTER_D2_9 ) -# define __PSTATIC_ASSERT_COUNTER_D2_9 -# undef __PSTATIC_ASSERT_COUNTER_2 -# define __PSTATIC_ASSERT_COUNTER_2 9 -# else -# undef __PSTATIC_ASSERT_COUNTER_D2_1 -# undef __PSTATIC_ASSERT_COUNTER_D2_2 -# undef __PSTATIC_ASSERT_COUNTER_D2_3 -# undef __PSTATIC_ASSERT_COUNTER_D2_4 -# undef __PSTATIC_ASSERT_COUNTER_D2_5 -# undef __PSTATIC_ASSERT_COUNTER_D2_6 -# undef __PSTATIC_ASSERT_COUNTER_D2_7 -# undef __PSTATIC_ASSERT_COUNTER_D2_8 -# undef __PSTATIC_ASSERT_COUNTER_D2_9 -# undef __PSTATIC_ASSERT_COUNTER_2 -# define __PSTATIC_ASSERT_COUNTER_2 0 -# if !defined( __PSTATIC_ASSERT_COUNTER_D3_0 ) -# define __PSTATIC_ASSERT_COUNTER_D3_0 -# undef __PSTATIC_ASSERT_COUNTER_3 -# define __PSTATIC_ASSERT_COUNTER_3 0 -# elif !defined( __PSTATIC_ASSERT_COUNTER_D3_1 ) -# define __PSTATIC_ASSERT_COUNTER_D3_1 -# undef __PSTATIC_ASSERT_COUNTER_3 -# define __PSTATIC_ASSERT_COUNTER_3 1 -# elif !defined( __PSTATIC_ASSERT_COUNTER_D3_2 ) -# define __PSTATIC_ASSERT_COUNTER_D3_2 -# undef __PSTATIC_ASSERT_COUNTER_3 -# define __PSTATIC_ASSERT_COUNTER_3 2 -# elif !defined( __PSTATIC_ASSERT_COUNTER_D3_3 ) -# define __PSTATIC_ASSERT_COUNTER_D3_3 -# undef __PSTATIC_ASSERT_COUNTER_3 -# define __PSTATIC_ASSERT_COUNTER_3 3 -# elif !defined( __PSTATIC_ASSERT_COUNTER_D3_4 ) -# define __PSTATIC_ASSERT_COUNTER_D3_4 -# undef __PSTATIC_ASSERT_COUNTER_3 -# define __PSTATIC_ASSERT_COUNTER_3 4 -# elif !defined( __PSTATIC_ASSERT_COUNTER_D3_5 ) -# define __PSTATIC_ASSERT_COUNTER_D3_5 -# undef __PSTATIC_ASSERT_COUNTER_3 -# define __PSTATIC_ASSERT_COUNTER_3 5 -# elif !defined( __PSTATIC_ASSERT_COUNTER_D3_6 ) -# define __PSTATIC_ASSERT_COUNTER_D3_6 -# undef __PSTATIC_ASSERT_COUNTER_3 -# define __PSTATIC_ASSERT_COUNTER_3 6 -# elif !defined( __PSTATIC_ASSERT_COUNTER_D3_7 ) -# define __PSTATIC_ASSERT_COUNTER_D3_7 -# undef __PSTATIC_ASSERT_COUNTER_3 -# define __PSTATIC_ASSERT_COUNTER_3 7 -# elif !defined( __PSTATIC_ASSERT_COUNTER_D3_8 ) -# define __PSTATIC_ASSERT_COUNTER_D3_8 -# undef __PSTATIC_ASSERT_COUNTER_3 -# define __PSTATIC_ASSERT_COUNTER_3 8 -# elif !defined( __PSTATIC_ASSERT_COUNTER_D3_9 ) -# define __PSTATIC_ASSERT_COUNTER_D3_9 -# undef __PSTATIC_ASSERT_COUNTER_3 -# define __PSTATIC_ASSERT_COUNTER_3 9 -# else -# undef __PSTATIC_ASSERT_COUNTER_D3_1 -# undef __PSTATIC_ASSERT_COUNTER_D3_2 -# undef __PSTATIC_ASSERT_COUNTER_D3_3 -# undef __PSTATIC_ASSERT_COUNTER_D3_4 -# undef __PSTATIC_ASSERT_COUNTER_D3_5 -# undef __PSTATIC_ASSERT_COUNTER_D3_6 -# undef __PSTATIC_ASSERT_COUNTER_D3_7 -# undef __PSTATIC_ASSERT_COUNTER_D3_8 -# undef __PSTATIC_ASSERT_COUNTER_D3_9 -# undef __PSTATIC_ASSERT_COUNTER_3 -# define __PSTATIC_ASSERT_COUNTER_3 0 -# endif -# endif -# endif -#endif - -#define __PSTATIC_ASSERT_COUNTER_JOIN_DIGITS_MACRO_(digit0,digit1,digit2,digit3) digit0##digit1##digit2##digit3 -#define __PSTATIC_ASSERT_COUNTER_JOIN_DIGITS_MACRO(digit0,digit1,digit2,digit3) __PSTATIC_ASSERT_COUNTER_JOIN_DIGITS_MACRO_(digit0,digit1,digit2,digit3) -#undef __PSTATIC_ASSERT_COUNTER -#define __PSTATIC_ASSERT_COUNTER __PSTATIC_ASSERT_COUNTER_JOIN_DIGITS_MACRO(__PSTATIC_ASSERT_COUNTER_3,__PSTATIC_ASSERT_COUNTER_2,__PSTATIC_ASSERT_COUNTER_1,__PSTATIC_ASSERT_COUNTER_0) diff --git a/flatccrt/include/flatcc/portable/pstdalign.h b/flatccrt/include/flatcc/portable/pstdalign.h deleted file mode 100644 index 8d1e436..0000000 --- a/flatccrt/include/flatcc/portable/pstdalign.h +++ /dev/null @@ -1,139 +0,0 @@ -#ifndef PSTDALIGN_H -#define PSTDALIGN_H - -/* - * NOTE: aligned_alloc is defined via paligned_alloc.h - * and requires aligned_free to be fully portable although - * free also works on C11 and platforms with posix_memalign. - * - * NOTE: C++11 defines alignas as a keyword but then also defines - * __alignas_is_defined. - * - * C++14 does not define __alignas_is_defined, at least sometimes. - * - * Clang C++ without std=c++11 or std=c++14 does define alignas - * but does so incorrectly wrt. C11 and C++11 semantics because - * `alignas(4) float x;` is not recognized. - * To fix such issues, either move to a std version, or - * include a working stdalign.h for the given compiler before - * this file. - * - * newlib defines _Alignas and _Alignof in sys/cdefs but rely on - * gcc version for which can lead to conflicts if - * stdalign is not included. - * - * newlibs need for conflicts with broken C++ stdalign - * but this can be fixed be using std=C++11 or newer. - * - * MSVC does not support at least up to MSVC 2015, - * but does appear to support alignas and alignof keywords in - * recent standard C++. - * - * If stdalign.h is supported but heuristics in this file are - * insufficient to detect this, try including manually - * or define HAVE_STDALIGN_H. - */ - -/* Allow for alternative solution to be included first. */ -#ifndef __alignas_is_defined - -#ifdef __cplusplus -#if defined(PORTABLE_PATCH_CPLUSPLUS_STDALIGN) -#include -#undef alignas -#define alignas(t) __attribute__((__aligned__(t))) -#endif -#endif - -#if !defined PORTABLE_HAS_INCLUDE_STDALIGN -#if defined(__has_include) -#if __has_include() -#define PORTABLE_HAS_INCLUDE_STDALIGN 1 -#else -#define PORTABLE_HAS_INCLUDE_STDALIGN 0 -#endif -#endif -#endif - - /* https://lists.gnu.org/archive/html/bug-gnulib/2015-08/msg00003.html */ -#if defined(__cplusplus) -#if !defined(_MSC_VER) -#include -#endif -#if __cplusplus > 201103 -#define __alignas_is_defined 1 -#define __alignof_is_defined 1 -#endif -#elif PORTABLE_HAS_INCLUDE_STDALIGN -#include -#elif !defined(__clang__) && ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)) -#include -#elif defined(HAVE_STDALIGN_H) -#include -#endif - -#endif /* __alignas_is_defined */ - -#ifndef __alignas_is_defined - -#ifdef __cplusplus -extern "C" { -#endif - -#if (!defined(__clang__) && defined(__GNUC__) && \ - ((__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 7))) -#undef PORTABLE_C11_STDALIGN_MISSING -#define PORTABLE_C11_STDALIGN_MISSING -#endif - -#if defined(__IBMC__) -#undef PORTABLE_C11_STDALIGN_MISSING -#define PORTABLE_C11_STDALIGN_MISSING -#endif - -#if ((defined(__STDC__) && __STDC__ && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) && \ - !defined(PORTABLE_C11_STDALIGN_MISSING)) -/* C11 or newer */ -#include -#else -#if defined(__GNUC__) || defined(__IBM_ALIGNOF__) || defined(__clang__) - -#ifndef _Alignas -#define _Alignas(t) __attribute__((__aligned__(t))) -#endif - -#ifndef _Alignof -#define _Alignof(t) __alignof__(t) -#endif - -#elif defined(_MSC_VER) - -#define _Alignas(t) __declspec (align(t)) -#define _Alignof(t) __alignof(t) - -#else -#error please update pstdalign.h with support for current compiler and library -#endif - -#endif /* __STDC__ */ - -#ifndef alignas -#define alignas _Alignas -#endif - -#ifndef alignof -#define alignof _Alignof -#endif - -#define __alignas_is_defined 1 -#define __alignof_is_defined 1 - -#ifdef __cplusplus -} -#endif - -#endif /* __alignas__is_defined */ - -#include "paligned_alloc.h" - -#endif /* PSTDALIGN_H */ diff --git a/flatccrt/include/flatcc/portable/pstdbool.h b/flatccrt/include/flatcc/portable/pstdbool.h deleted file mode 100644 index 28fc89c..0000000 --- a/flatccrt/include/flatcc/portable/pstdbool.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef PSTDBOOL_H -#define PSTDBOOL_H - -#if !defined(__cplusplus) && !__bool_true_false_are_defined && !defined(bool) && !defined(__STDBOOL_H) - -#ifdef HAVE_STDBOOL_H - -#include - -#elif (defined(__STDC__) && __STDC__ && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) -/* C99 or newer */ - -#define bool _Bool -#define true 1 -#define false 0 -#define __bool_true_false_are_defined 1 - -#elif defined(__GNUC__) && !defined(__STRICT_ANSI__) - -#define bool bool -#define true true -#define false false -#define __bool_true_false_are_defined 1 - -#else - -typedef unsigned char _Portable_bool; -#define bool _Portable_bool -#define true 1 -#define false 0 -#define __bool_true_false_are_defined 1 - -#endif - -#endif - -#endif /* PSTDBOOL_H */ diff --git a/flatccrt/include/flatcc/portable/pstdint.h b/flatccrt/include/flatcc/portable/pstdint.h deleted file mode 100644 index d522fed..0000000 --- a/flatccrt/include/flatcc/portable/pstdint.h +++ /dev/null @@ -1,898 +0,0 @@ -/* A portable stdint.h - **************************************************************************** - * BSD License: - **************************************************************************** - * - * Copyright (c) 2005-2016 Paul Hsieh - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - **************************************************************************** - * - * Version 0.1.15.2 - * - * The ANSI C standard committee, for the C99 standard, specified the - * inclusion of a new standard include file called stdint.h. This is - * a very useful and long desired include file which contains several - * very precise definitions for integer scalar types that is - * critically important for making portable several classes of - * applications including cryptography, hashing, variable length - * integer libraries and so on. But for most developers its likely - * useful just for programming sanity. - * - * The problem is that some compiler vendors chose to ignore the C99 - * standard and some older compilers have no opportunity to be updated. - * Because of this situation, simply including stdint.h in your code - * makes it unportable. - * - * So that's what this file is all about. Its an attempt to build a - * single universal include file that works on as many platforms as - * possible to deliver what stdint.h is supposed to. Even compilers - * that already come with stdint.h can use this file instead without - * any loss of functionality. A few things that should be noted about - * this file: - * - * 1) It is not guaranteed to be portable and/or present an identical - * interface on all platforms. The extreme variability of the - * ANSI C standard makes this an impossibility right from the - * very get go. Its really only meant to be useful for the vast - * majority of platforms that possess the capability of - * implementing usefully and precisely defined, standard sized - * integer scalars. Systems which are not intrinsically 2s - * complement may produce invalid constants. - * - * 2) There is an unavoidable use of non-reserved symbols. - * - * 3) Other standard include files are invoked. - * - * 4) This file may come in conflict with future platforms that do - * include stdint.h. The hope is that one or the other can be - * used with no real difference. - * - * 5) In the current verison, if your platform can't represent - * int32_t, int16_t and int8_t, it just dumps out with a compiler - * error. - * - * 6) 64 bit integers may or may not be defined. Test for their - * presence with the test: #ifdef INT64_MAX or #ifdef UINT64_MAX. - * Note that this is different from the C99 specification which - * requires the existence of 64 bit support in the compiler. If - * this is not defined for your platform, yet it is capable of - * dealing with 64 bits then it is because this file has not yet - * been extended to cover all of your system's capabilities. - * - * 7) (u)intptr_t may or may not be defined. Test for its presence - * with the test: #ifdef PTRDIFF_MAX. If this is not defined - * for your platform, then it is because this file has not yet - * been extended to cover all of your system's capabilities, not - * because its optional. - * - * 8) The following might not been defined even if your platform is - * capable of defining it: - * - * WCHAR_MIN - * WCHAR_MAX - * (u)int64_t - * PTRDIFF_MIN - * PTRDIFF_MAX - * (u)intptr_t - * - * 9) The following have not been defined: - * - * WINT_MIN - * WINT_MAX - * - * 10) The criteria for defining (u)int_least(*)_t isn't clear, - * except for systems which don't have a type that precisely - * defined 8, 16, or 32 bit types (which this include file does - * not support anyways). Default definitions have been given. - * - * 11) The criteria for defining (u)int_fast(*)_t isn't something I - * would trust to any particular compiler vendor or the ANSI C - * committee. It is well known that "compatible systems" are - * commonly created that have very different performance - * characteristics from the systems they are compatible with, - * especially those whose vendors make both the compiler and the - * system. Default definitions have been given, but its strongly - * recommended that users never use these definitions for any - * reason (they do *NOT* deliver any serious guarantee of - * improved performance -- not in this file, nor any vendor's - * stdint.h). - * - * 12) The following macros: - * - * PRINTF_INTMAX_MODIFIER - * PRINTF_INT64_MODIFIER - * PRINTF_INT32_MODIFIER - * PRINTF_INT16_MODIFIER - * PRINTF_LEAST64_MODIFIER - * PRINTF_LEAST32_MODIFIER - * PRINTF_LEAST16_MODIFIER - * PRINTF_INTPTR_MODIFIER - * - * are strings which have been defined as the modifiers required - * for the "d", "u" and "x" printf formats to correctly output - * (u)intmax_t, (u)int64_t, (u)int32_t, (u)int16_t, (u)least64_t, - * (u)least32_t, (u)least16_t and (u)intptr_t types respectively. - * PRINTF_INTPTR_MODIFIER is not defined for some systems which - * provide their own stdint.h. PRINTF_INT64_MODIFIER is not - * defined if INT64_MAX is not defined. These are an extension - * beyond what C99 specifies must be in stdint.h. - * - * In addition, the following macros are defined: - * - * PRINTF_INTMAX_HEX_WIDTH - * PRINTF_INT64_HEX_WIDTH - * PRINTF_INT32_HEX_WIDTH - * PRINTF_INT16_HEX_WIDTH - * PRINTF_INT8_HEX_WIDTH - * PRINTF_INTMAX_DEC_WIDTH - * PRINTF_INT64_DEC_WIDTH - * PRINTF_INT32_DEC_WIDTH - * PRINTF_INT16_DEC_WIDTH - * PRINTF_UINT8_DEC_WIDTH - * PRINTF_UINTMAX_DEC_WIDTH - * PRINTF_UINT64_DEC_WIDTH - * PRINTF_UINT32_DEC_WIDTH - * PRINTF_UINT16_DEC_WIDTH - * PRINTF_UINT8_DEC_WIDTH - * - * Which specifies the maximum number of characters required to - * print the number of that type in either hexadecimal or decimal. - * These are an extension beyond what C99 specifies must be in - * stdint.h. - * - * Compilers tested (all with 0 warnings at their highest respective - * settings): Borland Turbo C 2.0, WATCOM C/C++ 11.0 (16 bits and 32 - * bits), Microsoft Visual C++ 6.0 (32 bit), Microsoft Visual Studio - * .net (VC7), Intel C++ 4.0, GNU gcc v3.3.3 - * - * This file should be considered a work in progress. Suggestions for - * improvements, especially those which increase coverage are strongly - * encouraged. - * - * Acknowledgements - * - * The following people have made significant contributions to the - * development and testing of this file: - * - * Chris Howie - * John Steele Scott - * Dave Thorup - * John Dill - * Florian Wobbe - * Christopher Sean Morrison - * Mikkel Fahnoe Jorgensen - * - */ - -#include -#include -#include - -/* - * For gcc with _STDINT_H, fill in the PRINTF_INT*_MODIFIER macros, and - * do nothing else. On the Mac OS X version of gcc this is _STDINT_H_. - */ - -#if ((defined(_MSC_VER) && _MSC_VER >= 1600) || (defined(__STDC__) && __STDC__ && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || (defined (__WATCOMC__) && (defined (_STDINT_H_INCLUDED) || __WATCOMC__ >= 1250)) || (defined(__GNUC__) && (__GNUC__ > 3 || defined(_STDINT_H) || defined(_STDINT_H_) || defined (__UINT_FAST64_TYPE__)) )) && !defined (_PSTDINT_H_INCLUDED) -#include -#define _PSTDINT_H_INCLUDED -# if defined(__GNUC__) && (defined(__x86_64__) || defined(__ppc64__)) && !(defined(__APPLE__) && defined(__MACH__)) -# ifndef PRINTF_INT64_MODIFIER -# define PRINTF_INT64_MODIFIER "l" -# endif -# ifndef PRINTF_INT32_MODIFIER -# define PRINTF_INT32_MODIFIER "" -# endif -# else -# ifndef PRINTF_INT64_MODIFIER -# define PRINTF_INT64_MODIFIER "ll" -# endif -# ifndef PRINTF_INT32_MODIFIER -# if (UINT_MAX == UINT32_MAX) -# define PRINTF_INT32_MODIFIER "" -# else -# define PRINTF_INT32_MODIFIER "l" -# endif -# endif -# endif -# ifndef PRINTF_INT16_MODIFIER -# define PRINTF_INT16_MODIFIER "h" -# endif -# ifndef PRINTF_INTMAX_MODIFIER -# define PRINTF_INTMAX_MODIFIER PRINTF_INT64_MODIFIER -# endif -# ifndef PRINTF_INT64_HEX_WIDTH -# define PRINTF_INT64_HEX_WIDTH "16" -# endif -# ifndef PRINTF_UINT64_HEX_WIDTH -# define PRINTF_UINT64_HEX_WIDTH "16" -# endif -# ifndef PRINTF_INT32_HEX_WIDTH -# define PRINTF_INT32_HEX_WIDTH "8" -# endif -# ifndef PRINTF_UINT32_HEX_WIDTH -# define PRINTF_UINT32_HEX_WIDTH "8" -# endif -# ifndef PRINTF_INT16_HEX_WIDTH -# define PRINTF_INT16_HEX_WIDTH "4" -# endif -# ifndef PRINTF_UINT16_HEX_WIDTH -# define PRINTF_UINT16_HEX_WIDTH "4" -# endif -# ifndef PRINTF_INT8_HEX_WIDTH -# define PRINTF_INT8_HEX_WIDTH "2" -# endif -# ifndef PRINTF_UINT8_HEX_WIDTH -# define PRINTF_UINT8_HEX_WIDTH "2" -# endif -# ifndef PRINTF_INT64_DEC_WIDTH -# define PRINTF_INT64_DEC_WIDTH "19" -# endif -# ifndef PRINTF_UINT64_DEC_WIDTH -# define PRINTF_UINT64_DEC_WIDTH "20" -# endif -# ifndef PRINTF_INT32_DEC_WIDTH -# define PRINTF_INT32_DEC_WIDTH "10" -# endif -# ifndef PRINTF_UINT32_DEC_WIDTH -# define PRINTF_UINT32_DEC_WIDTH "10" -# endif -# ifndef PRINTF_INT16_DEC_WIDTH -# define PRINTF_INT16_DEC_WIDTH "5" -# endif -# ifndef PRINTF_UINT16_DEC_WIDTH -# define PRINTF_UINT16_DEC_WIDTH "5" -# endif -# ifndef PRINTF_INT8_DEC_WIDTH -# define PRINTF_INT8_DEC_WIDTH "3" -# endif -# ifndef PRINTF_UINT8_DEC_WIDTH -# define PRINTF_UINT8_DEC_WIDTH "3" -# endif -# ifndef PRINTF_INTMAX_HEX_WIDTH -# define PRINTF_INTMAX_HEX_WIDTH PRINTF_UINT64_HEX_WIDTH -# endif -# ifndef PRINTF_UINTMAX_HEX_WIDTH -# define PRINTF_UINTMAX_HEX_WIDTH PRINTF_UINT64_HEX_WIDTH -# endif -# ifndef PRINTF_INTMAX_DEC_WIDTH -# define PRINTF_INTMAX_DEC_WIDTH PRINTF_UINT64_DEC_WIDTH -# endif -# ifndef PRINTF_UINTMAX_DEC_WIDTH -# define PRINTF_UINTMAX_DEC_WIDTH PRINTF_UINT64_DEC_WIDTH -# endif - -/* - * Something really weird is going on with Open Watcom. Just pull some of - * these duplicated definitions from Open Watcom's stdint.h file for now. - */ - -# if defined (__WATCOMC__) && __WATCOMC__ >= 1250 -# if !defined (INT64_C) -# define INT64_C(x) (x + (INT64_MAX - INT64_MAX)) -# endif -# if !defined (UINT64_C) -# define UINT64_C(x) (x + (UINT64_MAX - UINT64_MAX)) -# endif -# if !defined (INT32_C) -# define INT32_C(x) (x + (INT32_MAX - INT32_MAX)) -# endif -# if !defined (UINT32_C) -# define UINT32_C(x) (x + (UINT32_MAX - UINT32_MAX)) -# endif -# if !defined (INT16_C) -# define INT16_C(x) (x) -# endif -# if !defined (UINT16_C) -# define UINT16_C(x) (x) -# endif -# if !defined (INT8_C) -# define INT8_C(x) (x) -# endif -# if !defined (UINT8_C) -# define UINT8_C(x) (x) -# endif -# if !defined (UINT64_MAX) -# define UINT64_MAX 18446744073709551615ULL -# endif -# if !defined (INT64_MAX) -# define INT64_MAX 9223372036854775807LL -# endif -# if !defined (UINT32_MAX) -# define UINT32_MAX 4294967295UL -# endif -# if !defined (INT32_MAX) -# define INT32_MAX 2147483647L -# endif -# if !defined (INTMAX_MAX) -# define INTMAX_MAX INT64_MAX -# endif -# if !defined (INTMAX_MIN) -# define INTMAX_MIN INT64_MIN -# endif -# endif -#endif - -#ifndef _PSTDINT_H_INCLUDED -#define _PSTDINT_H_INCLUDED - -#ifndef SIZE_MAX -# define SIZE_MAX (~(size_t)0) -#endif - -/* - * Deduce the type assignments from limits.h under the assumption that - * integer sizes in bits are powers of 2, and follow the ANSI - * definitions. - */ - -#ifndef UINT8_MAX -# define UINT8_MAX 0xff -#endif -#if !defined(uint8_t) && !defined(_UINT8_T) -# if (UCHAR_MAX == UINT8_MAX) || defined (S_SPLINT_S) - typedef unsigned char uint8_t; -# define UINT8_C(v) ((uint8_t) v) -# else -# error "Platform not supported" -# endif -#endif - -#ifndef INT8_MAX -# define INT8_MAX 0x7f -#endif -#ifndef INT8_MIN -# define INT8_MIN INT8_C(0x80) -#endif -#if !defined(int8_t) && !defined(_INT8_T) -# if (SCHAR_MAX == INT8_MAX) || defined (S_SPLINT_S) - typedef signed char int8_t; -# define INT8_C(v) ((int8_t) v) -# else -# error "Platform not supported" -# endif -#endif - -#ifndef UINT16_MAX -# define UINT16_MAX 0xffff -#endif -#if !defined(uint16_t) && !defined(_UINT16_T) -#if (UINT_MAX == UINT16_MAX) || defined (S_SPLINT_S) - typedef unsigned int uint16_t; -# ifndef PRINTF_INT16_MODIFIER -# define PRINTF_INT16_MODIFIER "" -# endif -# define UINT16_C(v) ((uint16_t) (v)) -#elif (USHRT_MAX == UINT16_MAX) - typedef unsigned short uint16_t; -# define UINT16_C(v) ((uint16_t) (v)) -# ifndef PRINTF_INT16_MODIFIER -# define PRINTF_INT16_MODIFIER "h" -# endif -#else -#error "Platform not supported" -#endif -#endif - -#ifndef INT16_MAX -# define INT16_MAX 0x7fff -#endif -#ifndef INT16_MIN -# define INT16_MIN INT16_C(0x8000) -#endif -#if !defined(int16_t) && !defined(_INT16_T) -#if (INT_MAX == INT16_MAX) || defined (S_SPLINT_S) - typedef signed int int16_t; -# define INT16_C(v) ((int16_t) (v)) -# ifndef PRINTF_INT16_MODIFIER -# define PRINTF_INT16_MODIFIER "" -# endif -#elif (SHRT_MAX == INT16_MAX) - typedef signed short int16_t; -# define INT16_C(v) ((int16_t) (v)) -# ifndef PRINTF_INT16_MODIFIER -# define PRINTF_INT16_MODIFIER "h" -# endif -#else -#error "Platform not supported" -#endif -#endif - -#ifndef UINT32_MAX -# define UINT32_MAX (0xffffffffUL) -#endif -#if !defined(uint32_t) && !defined(_UINT32_T) -#if (ULONG_MAX == UINT32_MAX) || defined (S_SPLINT_S) - typedef unsigned long uint32_t; -# define UINT32_C(v) v ## UL -# ifndef PRINTF_INT32_MODIFIER -# define PRINTF_INT32_MODIFIER "l" -# endif -#elif (UINT_MAX == UINT32_MAX) - typedef unsigned int uint32_t; -# ifndef PRINTF_INT32_MODIFIER -# define PRINTF_INT32_MODIFIER "" -# endif -# define UINT32_C(v) v ## U -#elif (USHRT_MAX == UINT32_MAX) - typedef unsigned short uint32_t; -# define UINT32_C(v) ((unsigned short) (v)) -# ifndef PRINTF_INT32_MODIFIER -# define PRINTF_INT32_MODIFIER "" -# endif -#else -#error "Platform not supported" -#endif -#endif - -#ifndef INT32_MAX -# define INT32_MAX (0x7fffffffL) -#endif -#ifndef INT32_MIN -# define INT32_MIN INT32_C(0x80000000) -#endif -#if !defined(int32_t) && !defined(_INT32_T) -#if (LONG_MAX == INT32_MAX) || defined (S_SPLINT_S) - typedef signed long int32_t; -# define INT32_C(v) v ## L -# ifndef PRINTF_INT32_MODIFIER -# define PRINTF_INT32_MODIFIER "l" -# endif -#elif (INT_MAX == INT32_MAX) - typedef signed int int32_t; -# define INT32_C(v) v -# ifndef PRINTF_INT32_MODIFIER -# define PRINTF_INT32_MODIFIER "" -# endif -#elif (SHRT_MAX == INT32_MAX) - typedef signed short int32_t; -# define INT32_C(v) ((short) (v)) -# ifndef PRINTF_INT32_MODIFIER -# define PRINTF_INT32_MODIFIER "" -# endif -#else -#error "Platform not supported" -#endif -#endif - -/* - * The macro stdint_int64_defined is temporarily used to record - * whether or not 64 integer support is available. It must be - * defined for any 64 integer extensions for new platforms that are - * added. - */ - -#undef stdint_int64_defined -#if (defined(__STDC__) && defined(__STDC_VERSION__)) || defined (S_SPLINT_S) -# if (__STDC__ && __STDC_VERSION__ >= 199901L) || defined (S_SPLINT_S) -# define stdint_int64_defined - typedef long long int64_t; - typedef unsigned long long uint64_t; -# define UINT64_C(v) v ## ULL -# define INT64_C(v) v ## LL -# ifndef PRINTF_INT64_MODIFIER -# define PRINTF_INT64_MODIFIER "ll" -# endif -# endif -#endif - -#if !defined (stdint_int64_defined) -# if defined(__GNUC__) -# define stdint_int64_defined - __extension__ typedef long long int64_t; - __extension__ typedef unsigned long long uint64_t; -# define UINT64_C(v) v ## ULL -# define INT64_C(v) v ## LL -# ifndef PRINTF_INT64_MODIFIER -# define PRINTF_INT64_MODIFIER "ll" -# endif -# elif defined(__MWERKS__) || defined (__SUNPRO_C) || defined (__SUNPRO_CC) || defined (__APPLE_CC__) || defined (_LONG_LONG) || defined (_CRAYC) || defined (S_SPLINT_S) -# define stdint_int64_defined - typedef long long int64_t; - typedef unsigned long long uint64_t; -# define UINT64_C(v) v ## ULL -# define INT64_C(v) v ## LL -# ifndef PRINTF_INT64_MODIFIER -# define PRINTF_INT64_MODIFIER "ll" -# endif -# elif (defined(__WATCOMC__) && defined(__WATCOM_INT64__)) || (defined(_MSC_VER) && _INTEGRAL_MAX_BITS >= 64) || (defined (__BORLANDC__) && __BORLANDC__ > 0x460) || defined (__alpha) || defined (__DECC) -# define stdint_int64_defined - typedef __int64 int64_t; - typedef unsigned __int64 uint64_t; -# define UINT64_C(v) v ## UI64 -# define INT64_C(v) v ## I64 -# ifndef PRINTF_INT64_MODIFIER -# define PRINTF_INT64_MODIFIER "I64" -# endif -# endif -#endif - -#if !defined (LONG_LONG_MAX) && defined (INT64_C) -# define LONG_LONG_MAX INT64_C (9223372036854775807) -#endif -#ifndef ULONG_LONG_MAX -# define ULONG_LONG_MAX UINT64_C (18446744073709551615) -#endif - -#if !defined (INT64_MAX) && defined (INT64_C) -# define INT64_MAX INT64_C (9223372036854775807) -#endif -#if !defined (INT64_MIN) && defined (INT64_C) -# define INT64_MIN INT64_C (-9223372036854775808) -#endif -#if !defined (UINT64_MAX) && defined (INT64_C) -# define UINT64_MAX UINT64_C (18446744073709551615) -#endif - -/* - * Width of hexadecimal for number field. - */ - -#ifndef PRINTF_INT64_HEX_WIDTH -# define PRINTF_INT64_HEX_WIDTH "16" -#endif -#ifndef PRINTF_INT32_HEX_WIDTH -# define PRINTF_INT32_HEX_WIDTH "8" -#endif -#ifndef PRINTF_INT16_HEX_WIDTH -# define PRINTF_INT16_HEX_WIDTH "4" -#endif -#ifndef PRINTF_INT8_HEX_WIDTH -# define PRINTF_INT8_HEX_WIDTH "2" -#endif -#ifndef PRINTF_INT64_DEC_WIDTH -# define PRINTF_INT64_DEC_WIDTH "19" -#endif -#ifndef PRINTF_INT32_DEC_WIDTH -# define PRINTF_INT32_DEC_WIDTH "10" -#endif -#ifndef PRINTF_INT16_DEC_WIDTH -# define PRINTF_INT16_DEC_WIDTH "5" -#endif -#ifndef PRINTF_INT8_DEC_WIDTH -# define PRINTF_INT8_DEC_WIDTH "3" -#endif -#ifndef PRINTF_UINT64_DEC_WIDTH -# define PRINTF_UINT64_DEC_WIDTH "20" -#endif -#ifndef PRINTF_UINT32_DEC_WIDTH -# define PRINTF_UINT32_DEC_WIDTH "10" -#endif -#ifndef PRINTF_UINT16_DEC_WIDTH -# define PRINTF_UINT16_DEC_WIDTH "5" -#endif -#ifndef PRINTF_UINT8_DEC_WIDTH -# define PRINTF_UINT8_DEC_WIDTH "3" -#endif - -/* - * Ok, lets not worry about 128 bit integers for now. Moore's law says - * we don't need to worry about that until about 2040 at which point - * we'll have bigger things to worry about. - */ - -#ifdef stdint_int64_defined - typedef int64_t intmax_t; - typedef uint64_t uintmax_t; -# define INTMAX_MAX INT64_MAX -# define INTMAX_MIN INT64_MIN -# define UINTMAX_MAX UINT64_MAX -# define UINTMAX_C(v) UINT64_C(v) -# define INTMAX_C(v) INT64_C(v) -# ifndef PRINTF_INTMAX_MODIFIER -# define PRINTF_INTMAX_MODIFIER PRINTF_INT64_MODIFIER -# endif -# ifndef PRINTF_INTMAX_HEX_WIDTH -# define PRINTF_INTMAX_HEX_WIDTH PRINTF_INT64_HEX_WIDTH -# endif -# ifndef PRINTF_INTMAX_DEC_WIDTH -# define PRINTF_INTMAX_DEC_WIDTH PRINTF_INT64_DEC_WIDTH -# endif -#else - typedef int32_t intmax_t; - typedef uint32_t uintmax_t; -# define INTMAX_MAX INT32_MAX -# define UINTMAX_MAX UINT32_MAX -# define UINTMAX_C(v) UINT32_C(v) -# define INTMAX_C(v) INT32_C(v) -# ifndef PRINTF_INTMAX_MODIFIER -# define PRINTF_INTMAX_MODIFIER PRINTF_INT32_MODIFIER -# endif -# ifndef PRINTF_INTMAX_HEX_WIDTH -# define PRINTF_INTMAX_HEX_WIDTH PRINTF_INT32_HEX_WIDTH -# endif -# ifndef PRINTF_INTMAX_DEC_WIDTH -# define PRINTF_INTMAX_DEC_WIDTH PRINTF_INT32_DEC_WIDTH -# endif -#endif - -/* - * Because this file currently only supports platforms which have - * precise powers of 2 as bit sizes for the default integers, the - * least definitions are all trivial. Its possible that a future - * version of this file could have different definitions. - */ - -#ifndef stdint_least_defined - typedef int8_t int_least8_t; - typedef uint8_t uint_least8_t; - typedef int16_t int_least16_t; - typedef uint16_t uint_least16_t; - typedef int32_t int_least32_t; - typedef uint32_t uint_least32_t; -# define PRINTF_LEAST32_MODIFIER PRINTF_INT32_MODIFIER -# define PRINTF_LEAST16_MODIFIER PRINTF_INT16_MODIFIER -# define UINT_LEAST8_MAX UINT8_MAX -# define INT_LEAST8_MAX INT8_MAX -# define UINT_LEAST16_MAX UINT16_MAX -# define INT_LEAST16_MAX INT16_MAX -# define UINT_LEAST32_MAX UINT32_MAX -# define INT_LEAST32_MAX INT32_MAX -# define INT_LEAST8_MIN INT8_MIN -# define INT_LEAST16_MIN INT16_MIN -# define INT_LEAST32_MIN INT32_MIN -# ifdef stdint_int64_defined - typedef int64_t int_least64_t; - typedef uint64_t uint_least64_t; -# define PRINTF_LEAST64_MODIFIER PRINTF_INT64_MODIFIER -# define UINT_LEAST64_MAX UINT64_MAX -# define INT_LEAST64_MAX INT64_MAX -# define INT_LEAST64_MIN INT64_MIN -# endif -#endif -#undef stdint_least_defined - -/* - * The ANSI C committee pretending to know or specify anything about - * performance is the epitome of misguided arrogance. The mandate of - * this file is to *ONLY* ever support that absolute minimum - * definition of the fast integer types, for compatibility purposes. - * No extensions, and no attempt to suggest what may or may not be a - * faster integer type will ever be made in this file. Developers are - * warned to stay away from these types when using this or any other - * stdint.h. - */ - -typedef int_least8_t int_fast8_t; -typedef uint_least8_t uint_fast8_t; -typedef int_least16_t int_fast16_t; -typedef uint_least16_t uint_fast16_t; -typedef int_least32_t int_fast32_t; -typedef uint_least32_t uint_fast32_t; -#define UINT_FAST8_MAX UINT_LEAST8_MAX -#define INT_FAST8_MAX INT_LEAST8_MAX -#define UINT_FAST16_MAX UINT_LEAST16_MAX -#define INT_FAST16_MAX INT_LEAST16_MAX -#define UINT_FAST32_MAX UINT_LEAST32_MAX -#define INT_FAST32_MAX INT_LEAST32_MAX -#define INT_FAST8_MIN INT_LEAST8_MIN -#define INT_FAST16_MIN INT_LEAST16_MIN -#define INT_FAST32_MIN INT_LEAST32_MIN -#ifdef stdint_int64_defined - typedef int_least64_t int_fast64_t; - typedef uint_least64_t uint_fast64_t; -# define UINT_FAST64_MAX UINT_LEAST64_MAX -# define INT_FAST64_MAX INT_LEAST64_MAX -# define INT_FAST64_MIN INT_LEAST64_MIN -#endif - -#undef stdint_int64_defined - -/* - * Whatever piecemeal, per compiler thing we can do about the wchar_t - * type limits. - */ - -#if defined(__WATCOMC__) || defined(_MSC_VER) || defined (__GNUC__) -# include -# ifndef WCHAR_MIN -# define WCHAR_MIN 0 -# endif -# ifndef WCHAR_MAX -# define WCHAR_MAX ((wchar_t)-1) -# endif -#endif - -/* - * Whatever piecemeal, per compiler/platform thing we can do about the - * (u)intptr_t types and limits. - */ - -#if (defined (_MSC_VER) && defined (_UINTPTR_T_DEFINED)) || defined (_UINTPTR_T) -# define STDINT_H_UINTPTR_T_DEFINED -#endif - -#ifndef STDINT_H_UINTPTR_T_DEFINED -# if defined (__alpha__) || defined (__ia64__) || defined (__x86_64__) || defined (_WIN64) || defined (__ppc64__) -# define stdint_intptr_bits 64 -# elif defined (__WATCOMC__) || defined (__TURBOC__) -# if defined(__TINY__) || defined(__SMALL__) || defined(__MEDIUM__) -# define stdint_intptr_bits 16 -# else -# define stdint_intptr_bits 32 -# endif -# elif defined (__i386__) || defined (_WIN32) || defined (WIN32) || defined (__ppc64__) -# define stdint_intptr_bits 32 -# elif defined (__INTEL_COMPILER) -/* TODO -- what did Intel do about x86-64? */ -# else -/* #error "This platform might not be supported yet" */ -# endif - -# ifdef stdint_intptr_bits -# define stdint_intptr_glue3_i(a,b,c) a##b##c -# define stdint_intptr_glue3(a,b,c) stdint_intptr_glue3_i(a,b,c) -# ifndef PRINTF_INTPTR_MODIFIER -# define PRINTF_INTPTR_MODIFIER stdint_intptr_glue3(PRINTF_INT,stdint_intptr_bits,_MODIFIER) -# endif -# ifndef PTRDIFF_MAX -# define PTRDIFF_MAX stdint_intptr_glue3(INT,stdint_intptr_bits,_MAX) -# endif -# ifndef PTRDIFF_MIN -# define PTRDIFF_MIN stdint_intptr_glue3(INT,stdint_intptr_bits,_MIN) -# endif -# ifndef UINTPTR_MAX -# define UINTPTR_MAX stdint_intptr_glue3(UINT,stdint_intptr_bits,_MAX) -# endif -# ifndef INTPTR_MAX -# define INTPTR_MAX stdint_intptr_glue3(INT,stdint_intptr_bits,_MAX) -# endif -# ifndef INTPTR_MIN -# define INTPTR_MIN stdint_intptr_glue3(INT,stdint_intptr_bits,_MIN) -# endif -# ifndef INTPTR_C -# define INTPTR_C(x) stdint_intptr_glue3(INT,stdint_intptr_bits,_C)(x) -# endif -# ifndef UINTPTR_C -# define UINTPTR_C(x) stdint_intptr_glue3(UINT,stdint_intptr_bits,_C)(x) -# endif - typedef stdint_intptr_glue3(uint,stdint_intptr_bits,_t) uintptr_t; - typedef stdint_intptr_glue3( int,stdint_intptr_bits,_t) intptr_t; -# else -/* TODO -- This following is likely wrong for some platforms, and does - nothing for the definition of uintptr_t. */ - typedef ptrdiff_t intptr_t; -# endif -# define STDINT_H_UINTPTR_T_DEFINED -#endif - -/* - * Assumes sig_atomic_t is signed and we have a 2s complement machine. - */ - -#ifndef SIG_ATOMIC_MAX -# define SIG_ATOMIC_MAX ((((sig_atomic_t) 1) << (sizeof (sig_atomic_t)*CHAR_BIT-1)) - 1) -#endif - -#endif - -#if defined (__TEST_PSTDINT_FOR_CORRECTNESS) - -/* - * Please compile with the maximum warning settings to make sure macros are - * not defined more than once. - */ - -#include -#include -#include - -#define glue3_aux(x,y,z) x ## y ## z -#define glue3(x,y,z) glue3_aux(x,y,z) - -#define DECLU(bits) glue3(uint,bits,_t) glue3(u,bits,) = glue3(UINT,bits,_C) (0); -#define DECLI(bits) glue3(int,bits,_t) glue3(i,bits,) = glue3(INT,bits,_C) (0); - -#define DECL(us,bits) glue3(DECL,us,) (bits) - -#define TESTUMAX(bits) glue3(u,bits,) = ~glue3(u,bits,); if (glue3(UINT,bits,_MAX) != glue3(u,bits,)) printf ("Something wrong with UINT%d_MAX\n", bits) - -#define REPORTERROR(msg) { err_n++; if (err_first <= 0) err_first = __LINE__; printf msg; } - -int main () { - int err_n = 0; - int err_first = 0; - DECL(I,8) - DECL(U,8) - DECL(I,16) - DECL(U,16) - DECL(I,32) - DECL(U,32) -#ifdef INT64_MAX - DECL(I,64) - DECL(U,64) -#endif - intmax_t imax = INTMAX_C(0); - uintmax_t umax = UINTMAX_C(0); - char str0[256], str1[256]; - - sprintf (str0, "%" PRINTF_INT32_MODIFIER "d", INT32_C(2147483647)); - if (0 != strcmp (str0, "2147483647")) REPORTERROR (("Something wrong with PRINTF_INT32_MODIFIER : %s\n", str0)); - if (atoi(PRINTF_INT32_DEC_WIDTH) != (int) strlen(str0)) REPORTERROR (("Something wrong with PRINTF_INT32_DEC_WIDTH : %s\n", PRINTF_INT32_DEC_WIDTH)); - sprintf (str0, "%" PRINTF_INT32_MODIFIER "u", UINT32_C(4294967295)); - if (0 != strcmp (str0, "4294967295")) REPORTERROR (("Something wrong with PRINTF_INT32_MODIFIER : %s\n", str0)); - if (atoi(PRINTF_UINT32_DEC_WIDTH) != (int) strlen(str0)) REPORTERROR (("Something wrong with PRINTF_UINT32_DEC_WIDTH : %s\n", PRINTF_UINT32_DEC_WIDTH)); -#ifdef INT64_MAX - sprintf (str1, "%" PRINTF_INT64_MODIFIER "d", INT64_C(9223372036854775807)); - if (0 != strcmp (str1, "9223372036854775807")) REPORTERROR (("Something wrong with PRINTF_INT32_MODIFIER : %s\n", str1)); - if (atoi(PRINTF_INT64_DEC_WIDTH) != (int) strlen(str1)) REPORTERROR (("Something wrong with PRINTF_INT64_DEC_WIDTH : %s, %d\n", PRINTF_INT64_DEC_WIDTH, (int) strlen(str1))); - sprintf (str1, "%" PRINTF_INT64_MODIFIER "u", UINT64_C(18446744073709550591)); - if (0 != strcmp (str1, "18446744073709550591")) REPORTERROR (("Something wrong with PRINTF_INT32_MODIFIER : %s\n", str1)); - if (atoi(PRINTF_UINT64_DEC_WIDTH) != (int) strlen(str1)) REPORTERROR (("Something wrong with PRINTF_UINT64_DEC_WIDTH : %s, %d\n", PRINTF_UINT64_DEC_WIDTH, (int) strlen(str1))); -#endif - - sprintf (str0, "%d %x\n", 0, ~0); - - sprintf (str1, "%d %x\n", i8, ~0); - if (0 != strcmp (str0, str1)) REPORTERROR (("Something wrong with i8 : %s\n", str1)); - sprintf (str1, "%u %x\n", u8, ~0); - if (0 != strcmp (str0, str1)) REPORTERROR (("Something wrong with u8 : %s\n", str1)); - sprintf (str1, "%d %x\n", i16, ~0); - if (0 != strcmp (str0, str1)) REPORTERROR (("Something wrong with i16 : %s\n", str1)); - sprintf (str1, "%u %x\n", u16, ~0); - if (0 != strcmp (str0, str1)) REPORTERROR (("Something wrong with u16 : %s\n", str1)); - sprintf (str1, "%" PRINTF_INT32_MODIFIER "d %x\n", i32, ~0); - if (0 != strcmp (str0, str1)) REPORTERROR (("Something wrong with i32 : %s\n", str1)); - sprintf (str1, "%" PRINTF_INT32_MODIFIER "u %x\n", u32, ~0); - if (0 != strcmp (str0, str1)) REPORTERROR (("Something wrong with u32 : %s\n", str1)); -#ifdef INT64_MAX - sprintf (str1, "%" PRINTF_INT64_MODIFIER "d %x\n", i64, ~0); - if (0 != strcmp (str0, str1)) REPORTERROR (("Something wrong with i64 : %s\n", str1)); -#endif - sprintf (str1, "%" PRINTF_INTMAX_MODIFIER "d %x\n", imax, ~0); - if (0 != strcmp (str0, str1)) REPORTERROR (("Something wrong with imax : %s\n", str1)); - sprintf (str1, "%" PRINTF_INTMAX_MODIFIER "u %x\n", umax, ~0); - if (0 != strcmp (str0, str1)) REPORTERROR (("Something wrong with umax : %s\n", str1)); - - TESTUMAX(8); - TESTUMAX(16); - TESTUMAX(32); -#ifdef INT64_MAX - TESTUMAX(64); -#endif - -#define STR(v) #v -#define Q(v) printf ("sizeof " STR(v) " = %u\n", (unsigned) sizeof (v)); - if (err_n) { - printf ("pstdint.h is not correct. Please use sizes below to correct it:\n"); - } - - Q(int) - Q(unsigned) - Q(long int) - Q(short int) - Q(int8_t) - Q(int16_t) - Q(int32_t) -#ifdef INT64_MAX - Q(int64_t) -#endif - - return EXIT_SUCCESS; -} - -#endif diff --git a/flatccrt/include/flatcc/portable/punaligned.h b/flatccrt/include/flatcc/portable/punaligned.h deleted file mode 100644 index a380edd..0000000 --- a/flatccrt/include/flatcc/portable/punaligned.h +++ /dev/null @@ -1,190 +0,0 @@ -/* - * Copyright (c) 2016 Mikkel Fahnøe Jørgensen, dvide.com - * - * (MIT License) - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - The Software is provided "as is", without warranty of any kind, express or - * implied, including but not limited to the warranties of merchantability, - * fitness for a particular purpose and noninfringement. In no event shall the - * authors or copyright holders be liable for any claim, damages or other - * liability, whether in an action of contract, tort or otherwise, arising from, - * out of or in connection with the Software or the use or other dealings in the - * Software. - */ - -#ifndef PUNLIGNED_H -#define PUNLIGNED_H - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef PORTABLE_UNALIGNED_ACCESS - -#if defined(__i386__) || defined(__x86_64__) || defined(_M_IX86) || defined(_M_X64) -#define PORTABLE_UNALIGNED_ACCESS 1 -#else -#define PORTABLE_UNALIGNED_ACCESS 0 -#endif - -#endif - -/* `unaligned_read_16` might not be defined if endianness was not determined. */ -#if !defined(unaligned_read_le16toh) - -#include "pendian.h" - -#ifndef UINT8_MAX -#include -#endif - -#if PORTABLE_UNALIGNED_ACCESS - -#define unaligned_read_16(p) (*(uint16_t*)(p)) -#define unaligned_read_32(p) (*(uint32_t*)(p)) -#define unaligned_read_64(p) (*(uint64_t*)(p)) - -#define unaligned_read_le16toh(p) le16toh(*(uint16_t*)(p)) -#define unaligned_read_le32toh(p) le32toh(*(uint32_t*)(p)) -#define unaligned_read_le64toh(p) le64toh(*(uint64_t*)(p)) - -#define unaligned_read_be16toh(p) be16toh(*(uint16_t*)(p)) -#define unaligned_read_be32toh(p) be32toh(*(uint32_t*)(p)) -#define unaligned_read_be64toh(p) be64toh(*(uint64_t*)(p)) - -#define unaligned_write_16(p, v) (*(uint16_t*)(p) = (uint16_t)(v)) -#define unaligned_write_32(p, v) (*(uint32_t*)(p) = (uint32_t)(v)) -#define unaligned_write_64(p, v) (*(uint64_t*)(p) = (uint64_t)(v)) - -#define unaligned_write_htole16(p, v) (*(uint16_t*)(p) = htole16(v)) -#define unaligned_write_htole32(p, v) (*(uint32_t*)(p) = htole32(v)) -#define unaligned_write_htole64(p, v) (*(uint64_t*)(p) = htole64(v)) - -#define unaligned_write_htobe16(p, v) (*(uint16_t*)(p) = htobe16(v)) -#define unaligned_write_htobe32(p, v) (*(uint32_t*)(p) = htobe32(v)) -#define unaligned_write_htobe64(p, v) (*(uint64_t*)(p) = htobe64(v)) - -#else - -#define unaligned_read_le16toh(p) ( \ - (((uint16_t)(((uint8_t *)(p))[0])) << 0) | \ - (((uint16_t)(((uint8_t *)(p))[1])) << 8)) - -#define unaligned_read_le32toh(p) ( \ - (((uint32_t)(((uint8_t *)(p))[0])) << 0) | \ - (((uint32_t)(((uint8_t *)(p))[1])) << 8) | \ - (((uint32_t)(((uint8_t *)(p))[2])) << 16) | \ - (((uint32_t)(((uint8_t *)(p))[3])) << 24)) - -#define unaligned_read_le64toh(p) ( \ - (((uint64_t)(((uint8_t *)(p))[0])) << 0) | \ - (((uint64_t)(((uint8_t *)(p))[1])) << 8) | \ - (((uint64_t)(((uint8_t *)(p))[2])) << 16) | \ - (((uint64_t)(((uint8_t *)(p))[3])) << 24) | \ - (((uint64_t)(((uint8_t *)(p))[4])) << 32) | \ - (((uint64_t)(((uint8_t *)(p))[5])) << 40) | \ - (((uint64_t)(((uint8_t *)(p))[6])) << 48) | \ - (((uint64_t)(((uint8_t *)(p))[7])) << 56)) - -#define unaligned_read_be16toh(p) ( \ - (((uint16_t)(((uint8_t *)(p))[0])) << 8) | \ - (((uint16_t)(((uint8_t *)(p))[1])) << 0)) - -#define unaligned_read_be32toh(p) ( \ - (((uint32_t)(((uint8_t *)(p))[0])) << 24) | \ - (((uint32_t)(((uint8_t *)(p))[1])) << 16) | \ - (((uint32_t)(((uint8_t *)(p))[2])) << 8) | \ - (((uint32_t)(((uint8_t *)(p))[3])) << 0)) - -#define unaligned_read_be64toh(p) ( \ - (((uint64_t)(((uint8_t *)(p))[0])) << 56) | \ - (((uint64_t)(((uint8_t *)(p))[1])) << 48) | \ - (((uint64_t)(((uint8_t *)(p))[2])) << 40) | \ - (((uint64_t)(((uint8_t *)(p))[3])) << 32) | \ - (((uint64_t)(((uint8_t *)(p))[4])) << 24) | \ - (((uint64_t)(((uint8_t *)(p))[5])) << 16) | \ - (((uint64_t)(((uint8_t *)(p))[6])) << 8) | \ - (((uint64_t)(((uint8_t *)(p))[7])) << 0)) - -#define unaligned_write_htole16(p, v) do { \ - ((uint8_t *)(p))[0] = (uint8_t)(((uint16_t)(v)) >> 0); \ - ((uint8_t *)(p))[1] = (uint8_t)(((uint16_t)(v)) >> 8); \ - } while (0) - -#define unaligned_write_htole32(p, v) do { \ - ((uint8_t *)(p))[0] = (uint8_t)(((uint32_t)(v)) >> 0); \ - ((uint8_t *)(p))[1] = (uint8_t)(((uint32_t)(v)) >> 8); \ - ((uint8_t *)(p))[2] = (uint8_t)(((uint32_t)(v)) >> 16); \ - ((uint8_t *)(p))[3] = (uint8_t)(((uint32_t)(v)) >> 24); \ - } while (0) - -#define unaligned_write_htole64(p) do { \ - ((uint8_t *)(p))[0] = (uint8_t)(((uint64_t)(v)) >> 0); \ - ((uint8_t *)(p))[1] = (uint8_t)(((uint64_t)(v)) >> 8); \ - ((uint8_t *)(p))[2] = (uint8_t)(((uint64_t)(v)) >> 16); \ - ((uint8_t *)(p))[3] = (uint8_t)(((uint64_t)(v)) >> 24); \ - ((uint8_t *)(p))[4] = (uint8_t)(((uint64_t)(v)) >> 32); \ - ((uint8_t *)(p))[5] = (uint8_t)(((uint64_t)(v)) >> 40); \ - ((uint8_t *)(p))[6] = (uint8_t)(((uint64_t)(v)) >> 48); \ - ((uint8_t *)(p))[7] = (uint8_t)(((uint64_t)(v)) >> 56); \ - } while (0) - -#define unaligned_write_htobe16(p, v) do { \ - ((uint8_t *)(p))[0] = (uint8_t)(((uint16_t)(v)) >> 8); \ - ((uint8_t *)(p))[1] = (uint8_t)(((uint16_t)(v)) >> 0); \ - } while (0) - -#define unaligned_write_htobe32(p, v) do { \ - ((uint8_t *)(p))[0] = (uint8_t)(((uint32_t)(v)) >> 24); \ - ((uint8_t *)(p))[1] = (uint8_t)(((uint32_t)(v)) >> 16); \ - ((uint8_t *)(p))[2] = (uint8_t)(((uint32_t)(v)) >> 8); \ - ((uint8_t *)(p))[3] = (uint8_t)(((uint32_t)(v)) >> 0); \ - } while (0) - -#define unaligned_write_htobe64(p) do { \ - ((uint8_t *)(p))[0] = (uint8_t)(((uint64_t)(v)) >> 56); \ - ((uint8_t *)(p))[1] = (uint8_t)(((uint64_t)(v)) >> 48); \ - ((uint8_t *)(p))[2] = (uint8_t)(((uint64_t)(v)) >> 40); \ - ((uint8_t *)(p))[3] = (uint8_t)(((uint64_t)(v)) >> 32); \ - ((uint8_t *)(p))[4] = (uint8_t)(((uint64_t)(v)) >> 24); \ - ((uint8_t *)(p))[5] = (uint8_t)(((uint64_t)(v)) >> 16); \ - ((uint8_t *)(p))[6] = (uint8_t)(((uint64_t)(v)) >> 8); \ - ((uint8_t *)(p))[7] = (uint8_t)(((uint64_t)(v)) >> 0); \ - } while (0) - -#if __LITTLE_ENDIAN__ -#define unaligned_read_16(p) unaligned_read_le16toh(p) -#define unaligned_read_32(p) unaligned_read_le32toh(p) -#define unaligned_read_64(p) unaligned_read_le64toh(p) - -#define unaligned_write_16(p) unaligned_write_htole16(p) -#define unaligned_write_32(p) unaligned_write_htole32(p) -#define unaligned_write_64(p) unaligned_write_htole64(p) -#endif - -#if __BIG_ENDIAN__ -#define unaligned_read_16(p) unaligned_read_be16toh(p) -#define unaligned_read_32(p) unaligned_read_be32toh(p) -#define unaligned_read_64(p) unaligned_read_be64toh(p) - -#define unaligned_write_16(p) unaligned_write_htobe16(p) -#define unaligned_write_32(p) unaligned_write_htobe32(p) -#define unaligned_write_64(p) unaligned_write_htobe64(p) -#endif - -#endif - -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* PUNALIGNED_H */ diff --git a/flatccrt/include/flatcc/portable/pversion.h b/flatccrt/include/flatcc/portable/pversion.h deleted file mode 100644 index d434104..0000000 --- a/flatccrt/include/flatcc/portable/pversion.h +++ /dev/null @@ -1,6 +0,0 @@ -#define PORTABLE_VERSION_TEXT "0.2.6-pre" -#define PORTABLE_VERSION_MAJOR 0 -#define PORTABLE_VERSION_MINOR 2 -#define PORTABLE_VERSION_PATCH 6 -/* 1 or 0 */ -#define PORTABLE_VERSION_RELEASED 0 diff --git a/flatccrt/include/flatcc/portable/pwarnings.h b/flatccrt/include/flatcc/portable/pwarnings.h deleted file mode 100644 index f420861..0000000 --- a/flatccrt/include/flatcc/portable/pwarnings.h +++ /dev/null @@ -1,52 +0,0 @@ -#ifndef PWARNINGS_H -#define PWARNINGS_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * See also pdiagnostics.h headers for per file control of common - * warnings. - * - * This file is intended for global disabling of warnings that shouldn't - * be present in C11 or perhaps C99, or a generally just noise where - * recent clang / gcc compile cleanly with high warning levels. - */ - -#if defined(_MSC_VER) -/* Needed when flagging code in or out and more. */ -#pragma warning(disable: 4127) /* conditional expression is constant */ -/* happens also in MS's own headers. */ -#pragma warning(disable: 4668) /* preprocessor name not defined */ -/* MSVC does not respect double parenthesis for intent */ -#pragma warning(disable: 4706) /* assignment within conditional expression */ -/* `inline` only advisory anyway. */ -#pragma warning(disable: 4710) /* function not inlined */ -/* Well, we don't intend to add the padding manually. */ -#pragma warning(disable: 4820) /* x bytes padding added in struct */ - -/* - * Don't warn that fopen etc. are unsafe - * - * Define a compiler flag like `-D_CRT_SECURE_NO_WARNINGS` in the build. - * For some reason it doesn't work when defined here. - * - * #define _CRT_SECURE_NO_WARNINGS - */ - -/* - * Anonymous union in struct is valid in C11 and has been supported in - * GCC and Clang for a while, but it is not C99. MSVC also handles it, - * but warns. Truly portable code should perhaps not use this feature, - * but this is not the place to complain about it. - */ -#pragma warning(disable: 4201) /* nonstandard extension used: nameless struct/union */ - -#endif /* _MSV_VER */ - -#ifdef __cplusplus -} -#endif - -#endif /* PWARNINGS_H */ diff --git a/flatccrt/include/flatcc/reflection/README b/flatccrt/include/flatcc/reflection/README deleted file mode 100644 index 3c7207a..0000000 --- a/flatccrt/include/flatcc/reflection/README +++ /dev/null @@ -1,19 +0,0 @@ -Generated by flatcc - -Keep checked in - needed by flatcc to generate binary schema. - -NOTE TO CONTRIBUTORS: DO NOT EDIT THESE FILES BY HAND - -If you need to change anything here, it is done in the code generator, -possibly followed by running `reflection/generate_code.sh` from the -project root. But please only do this for testing do not include the -generated files in a pull request unless agreed otherwise, and if so, -do it in a separate commit. - -Normally new reflection code is generated during a release which also -updates the version number in comments and there is no reason to update -reflection on every commit unless it breaks something fundamentally. - -There is a build option `FLATCC_REFLECTION` to disable reflection which -is helpful while making changes that affect the content of these files -in a way that would prevent the flatcc compiler from building. diff --git a/flatccrt/include/flatcc/reflection/flatbuffers_common_builder.h b/flatccrt/include/flatcc/reflection/flatbuffers_common_builder.h deleted file mode 100644 index ea728ac..0000000 --- a/flatccrt/include/flatcc/reflection/flatbuffers_common_builder.h +++ /dev/null @@ -1,672 +0,0 @@ -#ifndef FLATBUFFERS_COMMON_BUILDER_H -#define FLATBUFFERS_COMMON_BUILDER_H - -/* Generated by flatcc 0.6.0 FlatBuffers schema compiler for C by dvide.com */ - -/* Common FlatBuffers build functionality for C. */ - -#include "flatcc/flatcc_prologue.h" -#ifndef FLATBUILDER_H -#include "flatcc/flatcc_builder.h" -#endif -typedef flatcc_builder_t flatbuffers_builder_t; -typedef flatcc_builder_ref_t flatbuffers_ref_t; -typedef flatcc_builder_ref_t flatbuffers_vec_ref_t; -typedef flatcc_builder_union_ref_t flatbuffers_union_ref_t; -typedef flatcc_builder_union_vec_ref_t flatbuffers_union_vec_ref_t; -/* integer return code (ref and ptr always fail on 0) */ -#define flatbuffers_failed(x) ((x) < 0) -typedef flatbuffers_ref_t flatbuffers_root_t; -#define flatbuffers_root(ref) ((flatbuffers_root_t)(ref)) - -#define __flatbuffers_memoize_begin(B, src)\ -do { flatcc_builder_ref_t _ref; if ((_ref = flatcc_builder_refmap_find((B), (src)))) return _ref; } while (0) -#define __flatbuffers_memoize_end(B, src, op) do { return flatcc_builder_refmap_insert((B), (src), (op)); } while (0) -#define __flatbuffers_memoize(B, src, op) do { __flatbuffers_memoize_begin(B, src); __flatbuffers_memoize_end(B, src, op); } while (0) - -#define __flatbuffers_build_buffer(NS)\ -typedef NS ## ref_t NS ## buffer_ref_t;\ -static inline int NS ## buffer_start(NS ## builder_t *B, const NS ##fid_t fid)\ -{ return flatcc_builder_start_buffer(B, fid, 0, 0); }\ -static inline int NS ## buffer_start_with_size(NS ## builder_t *B, const NS ##fid_t fid)\ -{ return flatcc_builder_start_buffer(B, fid, 0, flatcc_builder_with_size); }\ -static inline int NS ## buffer_start_aligned(NS ## builder_t *B, NS ##fid_t fid, uint16_t block_align)\ -{ return flatcc_builder_start_buffer(B, fid, block_align, 0); }\ -static inline int NS ## buffer_start_aligned_with_size(NS ## builder_t *B, NS ##fid_t fid, uint16_t block_align)\ -{ return flatcc_builder_start_buffer(B, fid, block_align, flatcc_builder_with_size); }\ -static inline NS ## buffer_ref_t NS ## buffer_end(NS ## builder_t *B, NS ## ref_t root)\ -{ return flatcc_builder_end_buffer(B, root); } - -#define __flatbuffers_build_table_root(NS, N, FID, TFID)\ -static inline int N ## _start_as_root(NS ## builder_t *B)\ -{ return NS ## buffer_start(B, FID) ? -1 : N ## _start(B); }\ -static inline int N ## _start_as_root_with_size(NS ## builder_t *B)\ -{ return NS ## buffer_start_with_size(B, FID) ? -1 : N ## _start(B); }\ -static inline int N ## _start_as_typed_root(NS ## builder_t *B)\ -{ return NS ## buffer_start(B, TFID) ? -1 : N ## _start(B); }\ -static inline int N ## _start_as_typed_root_with_size(NS ## builder_t *B)\ -{ return NS ## buffer_start_with_size(B, TFID) ? -1 : N ## _start(B); }\ -static inline NS ## buffer_ref_t N ## _end_as_root(NS ## builder_t *B)\ -{ return NS ## buffer_end(B, N ## _end(B)); }\ -static inline NS ## buffer_ref_t N ## _end_as_typed_root(NS ## builder_t *B)\ -{ return NS ## buffer_end(B, N ## _end(B)); }\ -static inline NS ## buffer_ref_t N ## _create_as_root(NS ## builder_t *B __ ## N ## _formal_args)\ -{ if (NS ## buffer_start(B, FID)) return 0; return NS ## buffer_end(B, N ## _create(B __ ## N ## _call_args)); }\ -static inline NS ## buffer_ref_t N ## _create_as_root_with_size(NS ## builder_t *B __ ## N ## _formal_args)\ -{ if (NS ## buffer_start_with_size(B, FID)) return 0; return NS ## buffer_end(B, N ## _create(B __ ## N ## _call_args)); }\ -static inline NS ## buffer_ref_t N ## _create_as_typed_root(NS ## builder_t *B __ ## N ## _formal_args)\ -{ if (NS ## buffer_start(B, TFID)) return 0; return NS ## buffer_end(B, N ## _create(B __ ## N ## _call_args)); }\ -static inline NS ## buffer_ref_t N ## _create_as_typed_root_with_size(NS ## builder_t *B __ ## N ## _formal_args)\ -{ if (NS ## buffer_start_with_size(B, TFID)) return 0; return NS ## buffer_end(B, N ## _create(B __ ## N ## _call_args)); }\ -static inline NS ## buffer_ref_t N ## _clone_as_root(NS ## builder_t *B, N ## _table_t t)\ -{ if (NS ## buffer_start(B, FID)) return 0; return NS ## buffer_end(B, N ## _clone(B, t)); }\ -static inline NS ## buffer_ref_t N ## _clone_as_root_with_size(NS ## builder_t *B, N ## _table_t t)\ -{ if (NS ## buffer_start_with_size(B, FID)) return 0; return NS ## buffer_end(B, N ## _clone(B, t)); }\ -static inline NS ## buffer_ref_t N ## _clone_as_typed_root(NS ## builder_t *B, N ## _table_t t)\ -{ if (NS ## buffer_start(B, TFID)) return 0;return NS ## buffer_end(B, N ## _clone(B, t)); }\ -static inline NS ## buffer_ref_t N ## _clone_as_typed_root_with_size(NS ## builder_t *B, N ## _table_t t)\ -{ if (NS ## buffer_start_with_size(B, TFID)) return 0; return NS ## buffer_end(B, N ## _clone(B, t)); } - -#define __flatbuffers_build_table_prolog(NS, N, FID, TFID)\ -__flatbuffers_build_table_vector_ops(NS, N ## _vec, N)\ -__flatbuffers_build_table_root(NS, N, FID, TFID) - -#define __flatbuffers_build_struct_root(NS, N, A, FID, TFID)\ -static inline N ## _t *N ## _start_as_root(NS ## builder_t *B)\ -{ return NS ## buffer_start(B, FID) ? 0 : N ## _start(B); }\ -static inline N ## _t *N ## _start_as_root_with_size(NS ## builder_t *B)\ -{ return NS ## buffer_start_with_size(B, FID) ? 0 : N ## _start(B); }\ -static inline N ## _t *N ## _start_as_typed_root(NS ## builder_t *B)\ -{ return NS ## buffer_start(B, TFID) ? 0 : N ## _start(B); }\ -static inline N ## _t *N ## _start_as_typed_root_with_size(NS ## builder_t *B)\ -{ return NS ## buffer_start_with_size(B, TFID) ? 0 : N ## _start(B); }\ -static inline NS ## buffer_ref_t N ## _end_as_root(NS ## builder_t *B)\ -{ return NS ## buffer_end(B, N ## _end(B)); }\ -static inline NS ## buffer_ref_t N ## _end_as_typed_root(NS ## builder_t *B)\ -{ return NS ## buffer_end(B, N ## _end(B)); }\ -static inline NS ## buffer_ref_t N ## _end_pe_as_root(NS ## builder_t *B)\ -{ return NS ## buffer_end(B, N ## _end_pe(B)); }\ -static inline NS ## buffer_ref_t N ## _end_pe_as_typed_root(NS ## builder_t *B)\ -{ return NS ## buffer_end(B, N ## _end_pe(B)); }\ -static inline NS ## buffer_ref_t N ## _create_as_root(NS ## builder_t *B __ ## N ## _formal_args)\ -{ return flatcc_builder_create_buffer(B, FID, 0,\ - N ## _create(B __ ## N ## _call_args), A, 0); }\ -static inline NS ## buffer_ref_t N ## _create_as_root_with_size(NS ## builder_t *B __ ## N ## _formal_args)\ -{ return flatcc_builder_create_buffer(B, FID, 0,\ - N ## _create(B __ ## N ## _call_args), A, flatcc_builder_with_size); }\ -static inline NS ## buffer_ref_t N ## _create_as_typed_root(NS ## builder_t *B __ ## N ## _formal_args)\ -{ return flatcc_builder_create_buffer(B, TFID, 0,\ - N ## _create(B __ ## N ## _call_args), A, 0); }\ -static inline NS ## buffer_ref_t N ## _create_as_typed_root_with_size(NS ## builder_t *B __ ## N ## _formal_args)\ -{ return flatcc_builder_create_buffer(B, TFID, 0,\ - N ## _create(B __ ## N ## _call_args), A, flatcc_builder_with_size); }\ -static inline NS ## buffer_ref_t N ## _clone_as_root(NS ## builder_t *B, N ## _struct_t p)\ -{ return flatcc_builder_create_buffer(B, FID, 0, N ## _clone(B, p), A, 0); }\ -static inline NS ## buffer_ref_t N ## _clone_as_root_with_size(NS ## builder_t *B, N ## _struct_t p)\ -{ return flatcc_builder_create_buffer(B, FID, 0, N ## _clone(B, p), A, flatcc_builder_with_size); }\ -static inline NS ## buffer_ref_t N ## _clone_as_typed_root(NS ## builder_t *B, N ## _struct_t p)\ -{ return flatcc_builder_create_buffer(B, TFID, 0, N ## _clone(B, p), A, 0); }\ -static inline NS ## buffer_ref_t N ## _clone_as_typed_root_with_size(NS ## builder_t *B, N ## _struct_t p)\ -{ return flatcc_builder_create_buffer(B, TFID, 0, N ## _clone(B, p), A, flatcc_builder_with_size); } - -#define __flatbuffers_build_nested_table_root(NS, N, TN, FID, TFID)\ -static inline int N ## _start_as_root(NS ## builder_t *B)\ -{ return NS ## buffer_start(B, FID) ? -1 : TN ## _start(B); }\ -static inline int N ## _start_as_typed_root(NS ## builder_t *B)\ -{ return NS ## buffer_start(B, TFID) ? -1 : TN ## _start(B); }\ -static inline int N ## _end_as_root(NS ## builder_t *B)\ -{ return N ## _add(B, NS ## buffer_end(B, TN ## _end(B))); }\ -static inline int N ## _end_as_typed_root(NS ## builder_t *B)\ -{ return N ## _add(B, NS ## buffer_end(B, TN ## _end(B))); }\ -static inline int N ## _nest(NS ## builder_t *B, void *data, size_t size, uint16_t align)\ -{ return N ## _add(B, flatcc_builder_create_vector(B, data, size, 1,\ - align ? align : 8, FLATBUFFERS_COUNT_MAX(1))); }\ -static inline int N ## _typed_nest(NS ## builder_t *B, void *data, size_t size, uint16_t align)\ -{ return N ## _add(B, flatcc_builder_create_vector(B, data, size, 1,\ - align ? align : 8, FLATBUFFERS_COUNT_MAX(1))); }\ -static inline int N ## _clone_as_root(NS ## builder_t *B, TN ## _table_t t)\ -{ return N ## _add(B, TN ## _clone_as_root(B, t)); }\ -static inline int N ## _clone_as_typed_root(NS ## builder_t *B, TN ## _table_t t)\ -{ return N ## _add(B, TN ## _clone_as_typed_root(B, t)); } - -#define __flatbuffers_build_nested_struct_root(NS, N, TN, A, FID, TFID)\ -static inline TN ## _t *N ## _start_as_root(NS ## builder_t *B)\ -{ return NS ## buffer_start(B, FID) ? 0 : TN ## _start(B); }\ -static inline TN ## _t *N ## _start_as_typed_root(NS ## builder_t *B)\ -{ return NS ## buffer_start(B, FID) ? 0 : TN ## _start(B); }\ -static inline int N ## _end_as_root(NS ## builder_t *B)\ -{ return N ## _add(B, NS ## buffer_end(B, TN ## _end(B))); }\ -static inline int N ## _end_as_typed_root(NS ## builder_t *B)\ -{ return N ## _add(B, NS ## buffer_end(B, TN ## _end(B))); }\ -static inline int N ## _end_pe_as_root(NS ## builder_t *B)\ -{ return N ## _add(B, NS ## buffer_end(B, TN ## _end_pe(B))); }\ -static inline int N ## _create_as_root(NS ## builder_t *B __ ## TN ## _formal_args)\ -{ return N ## _add(B, flatcc_builder_create_buffer(B, FID, 0,\ - TN ## _create(B __ ## TN ## _call_args), A, flatcc_builder_is_nested)); }\ -static inline int N ## _create_as_typed_root(NS ## builder_t *B __ ## TN ## _formal_args)\ -{ return N ## _add(B, flatcc_builder_create_buffer(B, TFID, 0,\ - TN ## _create(B __ ## TN ## _call_args), A, flatcc_builder_is_nested)); }\ -static inline int N ## _nest(NS ## builder_t *B, void *data, size_t size, uint16_t align)\ -{ return N ## _add(B, flatcc_builder_create_vector(B, data, size, 1,\ - align < A ? A : align, FLATBUFFERS_COUNT_MAX(1))); }\ -static inline int N ## _typed_nest(NS ## builder_t *B, void *data, size_t size, uint16_t align)\ -{ return N ## _add(B, flatcc_builder_create_vector(B, data, size, 1,\ - align < A ? A : align, FLATBUFFERS_COUNT_MAX(1))); }\ -static inline int N ## _clone_as_root(NS ## builder_t *B, TN ## _struct_t p)\ -{ return N ## _add(B, TN ## _clone_as_root(B, p)); }\ -static inline int N ## _clone_as_typed_root(NS ## builder_t *B, TN ## _struct_t p)\ -{ return N ## _add(B, TN ## _clone_as_typed_root(B, p)); } - -#define __flatbuffers_build_vector_ops(NS, V, N, TN, T)\ -static inline T *V ## _extend(NS ## builder_t *B, size_t len)\ -{ return (T *)flatcc_builder_extend_vector(B, len); }\ -static inline T *V ## _append(NS ## builder_t *B, const T *data, size_t len)\ -{ return (T *)flatcc_builder_append_vector(B, data, len); }\ -static inline int V ## _truncate(NS ## builder_t *B, size_t len)\ -{ return flatcc_builder_truncate_vector(B, len); }\ -static inline T *V ## _edit(NS ## builder_t *B)\ -{ return (T *)flatcc_builder_vector_edit(B); }\ -static inline size_t V ## _reserved_len(NS ## builder_t *B)\ -{ return flatcc_builder_vector_count(B); }\ -static inline T *V ## _push(NS ## builder_t *B, const T *p)\ -{ T *_p; return (_p = (T *)flatcc_builder_extend_vector(B, 1)) ? (memcpy(_p, p, TN ## __size()), _p) : 0; }\ -static inline T *V ## _push_copy(NS ## builder_t *B, const T *p)\ -{ T *_p; return (_p = (T *)flatcc_builder_extend_vector(B, 1)) ? TN ## _copy(_p, p) : 0; }\ -static inline T *V ## _push_clone(NS ## builder_t *B, const T *p)\ -{ T *_p; return (_p = (T *)flatcc_builder_extend_vector(B, 1)) ? TN ## _copy(_p, p) : 0; }\ -static inline T *V ## _push_create(NS ## builder_t *B __ ## TN ## _formal_args)\ -{ T *_p; return (_p = (T *)flatcc_builder_extend_vector(B, 1)) ? TN ## _assign(_p __ ## TN ## _call_args) : 0; } - -#define __flatbuffers_build_vector(NS, N, T, S, A)\ -typedef NS ## ref_t N ## _vec_ref_t;\ -static inline int N ## _vec_start(NS ## builder_t *B)\ -{ return flatcc_builder_start_vector(B, S, A, FLATBUFFERS_COUNT_MAX(S)); }\ -static inline N ## _vec_ref_t N ## _vec_end_pe(NS ## builder_t *B)\ -{ return flatcc_builder_end_vector(B); }\ -static inline N ## _vec_ref_t N ## _vec_end(NS ## builder_t *B)\ -{ if (!NS ## is_native_pe()) { size_t i, n; T *p = (T *)flatcc_builder_vector_edit(B);\ - for (i = 0, n = flatcc_builder_vector_count(B); i < n; ++i)\ - { N ## _to_pe(N ## __ptr_add(p, i)); }} return flatcc_builder_end_vector(B); }\ -static inline N ## _vec_ref_t N ## _vec_create_pe(NS ## builder_t *B, const T *data, size_t len)\ -{ return flatcc_builder_create_vector(B, data, len, S, A, FLATBUFFERS_COUNT_MAX(S)); }\ -static inline N ## _vec_ref_t N ## _vec_create(NS ## builder_t *B, const T *data, size_t len)\ -{ if (!NS ## is_native_pe()) { size_t i; T *p; int ret = flatcc_builder_start_vector(B, S, A, FLATBUFFERS_COUNT_MAX(S)); if (ret) { return ret; }\ - p = (T *)flatcc_builder_extend_vector(B, len); if (!p) return 0;\ - for (i = 0; i < len; ++i) { N ## _copy_to_pe(N ## __ptr_add(p, i), N ## __const_ptr_add(data, i)); }\ - return flatcc_builder_end_vector(B); } else return flatcc_builder_create_vector(B, data, len, S, A, FLATBUFFERS_COUNT_MAX(S)); }\ -static inline N ## _vec_ref_t N ## _vec_clone(NS ## builder_t *B, N ##_vec_t vec)\ -{ __flatbuffers_memoize(B, vec, flatcc_builder_create_vector(B, vec, N ## _vec_len(vec), S, A, FLATBUFFERS_COUNT_MAX(S))); }\ -static inline N ## _vec_ref_t N ## _vec_slice(NS ## builder_t *B, N ##_vec_t vec, size_t index, size_t len)\ -{ size_t n = N ## _vec_len(vec); if (index >= n) index = n; n -= index; if (len > n) len = n;\ - return flatcc_builder_create_vector(B, N ## __const_ptr_add(vec, index), len, S, A, FLATBUFFERS_COUNT_MAX(S)); }\ -__flatbuffers_build_vector_ops(NS, N ## _vec, N, N, T) - -#define __flatbuffers_build_union_vector_ops(NS, V, N, TN)\ -static inline TN ## _union_ref_t *V ## _extend(NS ## builder_t *B, size_t len)\ -{ return flatcc_builder_extend_union_vector(B, len); }\ -static inline TN ## _union_ref_t *V ## _append(NS ## builder_t *B, const TN ## _union_ref_t *data, size_t len)\ -{ return flatcc_builder_append_union_vector(B, data, len); }\ -static inline int V ## _truncate(NS ## builder_t *B, size_t len)\ -{ return flatcc_builder_truncate_union_vector(B, len); }\ -static inline TN ## _union_ref_t *V ## _edit(NS ## builder_t *B)\ -{ return (TN ## _union_ref_t *) flatcc_builder_union_vector_edit(B); }\ -static inline size_t V ## _reserved_len(NS ## builder_t *B)\ -{ return flatcc_builder_union_vector_count(B); }\ -static inline TN ## _union_ref_t *V ## _push(NS ## builder_t *B, const TN ## _union_ref_t ref)\ -{ return flatcc_builder_union_vector_push(B, ref); }\ -static inline TN ## _union_ref_t *V ## _push_clone(NS ## builder_t *B, TN ## _union_t u)\ -{ return TN ## _vec_push(B, TN ## _clone(B, u)); } - -#define __flatbuffers_build_union_vector(NS, N)\ -static inline int N ## _vec_start(NS ## builder_t *B)\ -{ return flatcc_builder_start_union_vector(B); }\ -static inline N ## _union_vec_ref_t N ## _vec_end(NS ## builder_t *B)\ -{ return flatcc_builder_end_union_vector(B); }\ -static inline N ## _union_vec_ref_t N ## _vec_create(NS ## builder_t *B, const N ## _union_ref_t *data, size_t len)\ -{ return flatcc_builder_create_union_vector(B, data, len); }\ -__flatbuffers_build_union_vector_ops(NS, N ## _vec, N, N)\ -/* Preserves DAG structure separately for type and value vector, so a type vector could be shared for many value vectors. */\ -static inline N ## _union_vec_ref_t N ## _vec_clone(NS ## builder_t *B, N ##_union_vec_t vec)\ -{ N ## _union_vec_ref_t _uvref, _ret = { 0, 0 }; NS ## union_ref_t _uref; size_t _i, _len;\ - if (vec.type == 0) return _ret;\ - _uvref.type = flatcc_builder_refmap_find(B, vec.type); _uvref.value = flatcc_builder_refmap_find(B, vec.value);\ - _len = N ## _union_vec_len(vec); if (_uvref.type == 0) {\ - _uvref.type = flatcc_builder_refmap_insert(B, vec.type, (flatcc_builder_create_type_vector(B, vec.type, _len))); }\ - if (_uvref.type == 0) return _ret; if (_uvref.value == 0) {\ - if (flatcc_builder_start_offset_vector(B)) return _ret;\ - for (_i = 0; _i < _len; ++_i) { _uref = N ## _clone(B, N ## _union_vec_at(vec, _i));\ - if (!_uref.value || !(flatcc_builder_offset_vector_push(B, _uref.value))) return _ret; }\ - _uvref.value = flatcc_builder_refmap_insert(B, vec.value, flatcc_builder_end_offset_vector(B));\ - if (_uvref.value == 0) return _ret; } return _uvref; } - -#define __flatbuffers_build_string_vector_ops(NS, N)\ -static inline int N ## _push_start(NS ## builder_t *B)\ -{ return NS ## string_start(B); }\ -static inline NS ## string_ref_t *N ## _push_end(NS ## builder_t *B)\ -{ return NS ## string_vec_push(B, NS ## string_end(B)); }\ -static inline NS ## string_ref_t *N ## _push_create(NS ## builder_t *B, const char *s, size_t len)\ -{ return NS ## string_vec_push(B, NS ## string_create(B, s, len)); }\ -static inline NS ## string_ref_t *N ## _push_create_str(NS ## builder_t *B, const char *s)\ -{ return NS ## string_vec_push(B, NS ## string_create_str(B, s)); }\ -static inline NS ## string_ref_t *N ## _push_create_strn(NS ## builder_t *B, const char *s, size_t max_len)\ -{ return NS ## string_vec_push(B, NS ## string_create_strn(B, s, max_len)); }\ -static inline NS ## string_ref_t *N ## _push_clone(NS ## builder_t *B, NS ## string_t string)\ -{ return NS ## string_vec_push(B, NS ## string_clone(B, string)); }\ -static inline NS ## string_ref_t *N ## _push_slice(NS ## builder_t *B, NS ## string_t string, size_t index, size_t len)\ -{ return NS ## string_vec_push(B, NS ## string_slice(B, string, index, len)); } - -#define __flatbuffers_build_table_vector_ops(NS, N, TN)\ -static inline int N ## _push_start(NS ## builder_t *B)\ -{ return TN ## _start(B); }\ -static inline TN ## _ref_t *N ## _push_end(NS ## builder_t *B)\ -{ return N ## _push(B, TN ## _end(B)); }\ -static inline TN ## _ref_t *N ## _push_create(NS ## builder_t *B __ ## TN ##_formal_args)\ -{ return N ## _push(B, TN ## _create(B __ ## TN ## _call_args)); } - -#define __flatbuffers_build_offset_vector_ops(NS, V, N, TN)\ -static inline TN ## _ref_t *V ## _extend(NS ## builder_t *B, size_t len)\ -{ return flatcc_builder_extend_offset_vector(B, len); }\ -static inline TN ## _ref_t *V ## _append(NS ## builder_t *B, const TN ## _ref_t *data, size_t len)\ -{ return flatcc_builder_append_offset_vector(B, data, len); }\ -static inline int V ## _truncate(NS ## builder_t *B, size_t len)\ -{ return flatcc_builder_truncate_offset_vector(B, len); }\ -static inline TN ## _ref_t *V ## _edit(NS ## builder_t *B)\ -{ return (TN ## _ref_t *)flatcc_builder_offset_vector_edit(B); }\ -static inline size_t V ## _reserved_len(NS ## builder_t *B)\ -{ return flatcc_builder_offset_vector_count(B); }\ -static inline TN ## _ref_t *V ## _push(NS ## builder_t *B, const TN ## _ref_t ref)\ -{ return ref ? flatcc_builder_offset_vector_push(B, ref) : 0; } - -#define __flatbuffers_build_offset_vector(NS, N)\ -typedef NS ## ref_t N ## _vec_ref_t;\ -static inline int N ## _vec_start(NS ## builder_t *B)\ -{ return flatcc_builder_start_offset_vector(B); }\ -static inline N ## _vec_ref_t N ## _vec_end(NS ## builder_t *B)\ -{ return flatcc_builder_end_offset_vector(B); }\ -static inline N ## _vec_ref_t N ## _vec_create(NS ## builder_t *B, const N ## _ref_t *data, size_t len)\ -{ return flatcc_builder_create_offset_vector(B, data, len); }\ -__flatbuffers_build_offset_vector_ops(NS, N ## _vec, N, N)\ -static inline N ## _vec_ref_t N ## _vec_clone(NS ## builder_t *B, N ##_vec_t vec)\ -{ int _ret; N ## _ref_t _e; size_t _i, _len; __flatbuffers_memoize_begin(B, vec);\ - _len = N ## _vec_len(vec); if (flatcc_builder_start_offset_vector(B)) return 0;\ - for (_i = 0; _i < _len; ++_i) { if (!(_e = N ## _clone(B, N ## _vec_at(vec, _i)))) return 0;\ - if (!flatcc_builder_offset_vector_push(B, _e)) return 0; }\ - __flatbuffers_memoize_end(B, vec, flatcc_builder_end_offset_vector(B)); }\ - -#define __flatbuffers_build_string_ops(NS, N)\ -static inline char *N ## _append(NS ## builder_t *B, const char *s, size_t len)\ -{ return flatcc_builder_append_string(B, s, len); }\ -static inline char *N ## _append_str(NS ## builder_t *B, const char *s)\ -{ return flatcc_builder_append_string_str(B, s); }\ -static inline char *N ## _append_strn(NS ## builder_t *B, const char *s, size_t len)\ -{ return flatcc_builder_append_string_strn(B, s, len); }\ -static inline size_t N ## _reserved_len(NS ## builder_t *B)\ -{ return flatcc_builder_string_len(B); }\ -static inline char *N ## _extend(NS ## builder_t *B, size_t len)\ -{ return flatcc_builder_extend_string(B, len); }\ -static inline char *N ## _edit(NS ## builder_t *B)\ -{ return flatcc_builder_string_edit(B); }\ -static inline int N ## _truncate(NS ## builder_t *B, size_t len)\ -{ return flatcc_builder_truncate_string(B, len); } - -#define __flatbuffers_build_string(NS)\ -typedef NS ## ref_t NS ## string_ref_t;\ -static inline int NS ## string_start(NS ## builder_t *B)\ -{ return flatcc_builder_start_string(B); }\ -static inline NS ## string_ref_t NS ## string_end(NS ## builder_t *B)\ -{ return flatcc_builder_end_string(B); }\ -static inline NS ## ref_t NS ## string_create(NS ## builder_t *B, const char *s, size_t len)\ -{ return flatcc_builder_create_string(B, s, len); }\ -static inline NS ## ref_t NS ## string_create_str(NS ## builder_t *B, const char *s)\ -{ return flatcc_builder_create_string_str(B, s); }\ -static inline NS ## ref_t NS ## string_create_strn(NS ## builder_t *B, const char *s, size_t len)\ -{ return flatcc_builder_create_string_strn(B, s, len); }\ -static inline NS ## string_ref_t NS ## string_clone(NS ## builder_t *B, NS ## string_t string)\ -{ __flatbuffers_memoize(B, string, flatcc_builder_create_string(B, string, NS ## string_len(string))); }\ -static inline NS ## string_ref_t NS ## string_slice(NS ## builder_t *B, NS ## string_t string, size_t index, size_t len)\ -{ size_t n = NS ## string_len(string); if (index >= n) index = n; n -= index; if (len > n) len = n;\ - return flatcc_builder_create_string(B, string + index, len); }\ -__flatbuffers_build_string_ops(NS, NS ## string)\ -__flatbuffers_build_offset_vector(NS, NS ## string) - -#define __flatbuffers_copy_from_pe(P, P2, N) (*(P) = N ## _cast_from_pe(*P2), (P)) -#define __flatbuffers_from_pe(P, N) (*(P) = N ## _cast_from_pe(*P), (P)) -#define __flatbuffers_copy_to_pe(P, P2, N) (*(P) = N ## _cast_to_pe(*P2), (P)) -#define __flatbuffers_to_pe(P, N) (*(P) = N ## _cast_to_pe(*P), (P)) -#define __flatbuffers_define_fixed_array_primitives(NS, N, T)\ -static inline T *N ## _array_copy(T *p, const T *p2, size_t n)\ -{ memcpy(p, p2, n * sizeof(T)); return p; }\ -static inline T *N ## _array_copy_from_pe(T *p, const T *p2, size_t n)\ -{ size_t i; if (NS ## is_native_pe()) memcpy(p, p2, n * sizeof(T)); else\ - for (i = 0; i < n; ++i) N ## _copy_from_pe(&p[i], &p2[i]); return p; }\ -static inline T *N ## _array_copy_to_pe(T *p, const T *p2, size_t n)\ -{ size_t i; if (NS ## is_native_pe()) memcpy(p, p2, n * sizeof(T)); else\ - for (i = 0; i < n; ++i) N ## _copy_to_pe(&p[i], &p2[i]); return p; } -#define __flatbuffers_define_scalar_primitives(NS, N, T)\ -static inline T *N ## _from_pe(T *p) { return __ ## NS ## from_pe(p, N); }\ -static inline T *N ## _to_pe(T *p) { return __ ## NS ## to_pe(p, N); }\ -static inline T *N ## _copy(T *p, const T *p2) { *p = *p2; return p; }\ -static inline T *N ## _copy_from_pe(T *p, const T *p2)\ -{ return __ ## NS ## copy_from_pe(p, p2, N); }\ -static inline T *N ## _copy_to_pe(T *p, const T *p2) \ -{ return __ ## NS ## copy_to_pe(p, p2, N); }\ -static inline T *N ## _assign(T *p, const T v0) { *p = v0; return p; }\ -static inline T *N ## _assign_from_pe(T *p, T v0)\ -{ *p = N ## _cast_from_pe(v0); return p; }\ -static inline T *N ## _assign_to_pe(T *p, T v0)\ -{ *p = N ## _cast_to_pe(v0); return p; } -#define __flatbuffers_build_scalar(NS, N, T)\ -__ ## NS ## define_scalar_primitives(NS, N, T)\ -__ ## NS ## define_fixed_array_primitives(NS, N, T)\ -__ ## NS ## build_vector(NS, N, T, sizeof(T), sizeof(T)) -/* Depends on generated copy_to/from_pe functions, and the type. */ -#define __flatbuffers_define_struct_primitives(NS, N)\ -static inline N ## _t *N ##_to_pe(N ## _t *p)\ -{ if (!NS ## is_native_pe()) { N ## _copy_to_pe(p, p); }; return p; }\ -static inline N ## _t *N ##_from_pe(N ## _t *p)\ -{ if (!NS ## is_native_pe()) { N ## _copy_from_pe(p, p); }; return p; }\ -static inline N ## _t *N ## _clear(N ## _t *p) { return (N ## _t *)memset(p, 0, N ## __size()); } - -/* Depends on generated copy/assign_to/from_pe functions, and the type. */ -#define __flatbuffers_build_struct(NS, N, S, A, FID, TFID)\ -__ ## NS ## define_struct_primitives(NS, N)\ -typedef NS ## ref_t N ## _ref_t;\ -static inline N ## _t *N ## _start(NS ## builder_t *B)\ -{ return (N ## _t *)flatcc_builder_start_struct(B, S, A); }\ -static inline N ## _ref_t N ## _end(NS ## builder_t *B)\ -{ if (!NS ## is_native_pe()) { N ## _to_pe((N ## _t *)flatcc_builder_struct_edit(B)); }\ - return flatcc_builder_end_struct(B); }\ -static inline N ## _ref_t N ## _end_pe(NS ## builder_t *B)\ -{ return flatcc_builder_end_struct(B); }\ -static inline N ## _ref_t N ## _create(NS ## builder_t *B __ ## N ## _formal_args)\ -{ N ## _t *_p = N ## _start(B); if (!_p) return 0; N ##_assign_to_pe(_p __ ## N ## _call_args);\ - return N ## _end_pe(B); }\ -static inline N ## _ref_t N ## _clone(NS ## builder_t *B, N ## _struct_t p)\ -{ N ## _t *_p; __flatbuffers_memoize_begin(B, p); _p = N ## _start(B); if (!_p) return 0;\ - N ## _copy(_p, p); __flatbuffers_memoize_end(B, p, N ##_end_pe(B)); }\ -__flatbuffers_build_vector(NS, N, N ## _t, S, A)\ -__flatbuffers_build_struct_root(NS, N, A, FID, TFID)\ - -#define __flatbuffers_struct_clear_field(p) memset((p), 0, sizeof(*(p))) -#define __flatbuffers_build_table(NS, N, K)\ -static inline int N ## _start(NS ## builder_t *B)\ -{ return flatcc_builder_start_table(B, K); }\ -static inline N ## _ref_t N ## _end(NS ## builder_t *B)\ -{ assert(flatcc_builder_check_required(B, __ ## N ## _required,\ - sizeof(__ ## N ## _required) / sizeof(__ ## N ## _required[0]) - 1));\ - return flatcc_builder_end_table(B); }\ -__flatbuffers_build_offset_vector(NS, N) - -#define __flatbuffers_build_table_field(ID, NS, N, TN, TT)\ -static inline int N ## _add(NS ## builder_t *B, TN ## _ref_t ref)\ -{ TN ## _ref_t *_p; return (ref && (_p = flatcc_builder_table_add_offset(B, ID))) ?\ - ((*_p = ref), 0) : -1; }\ -static inline int N ## _start(NS ## builder_t *B)\ -{ return TN ## _start(B); }\ -static inline int N ## _end(NS ## builder_t *B)\ -{ return N ## _add(B, TN ## _end(B)); }\ -static inline TN ## _ref_t N ## _create(NS ## builder_t *B __ ## TN ##_formal_args)\ -{ return N ## _add(B, TN ## _create(B __ ## TN ## _call_args)); }\ -static inline int N ## _clone(NS ## builder_t *B, TN ## _table_t p)\ -{ return N ## _add(B, TN ## _clone(B, p)); }\ -static inline int N ## _pick(NS ## builder_t *B, TT ## _table_t t)\ -{ TN ## _table_t _p = N ## _get(t); return _p ? N ## _clone(B, _p) : 0; } - -#define __flatbuffers_build_union_field(ID, NS, N, TN, TT)\ -static inline int N ## _add(NS ## builder_t *B, TN ## _union_ref_t uref)\ -{ NS ## ref_t *_p; TN ## _union_type_t *_pt; if (uref.type == TN ## _NONE) return 0; if (uref.value == 0) return -1;\ - if (!(_pt = (TN ## _union_type_t *)flatcc_builder_table_add(B, ID - 1, sizeof(*_pt), sizeof(*_pt))) ||\ - !(_p = flatcc_builder_table_add_offset(B, ID))) return -1; *_pt = uref.type; *_p = uref.value; return 0; }\ -static inline int N ## _add_type(NS ## builder_t *B, TN ## _union_type_t type)\ -{ TN ## _union_type_t *_pt; if (type == TN ## _NONE) return 0; return (_pt = (TN ## _union_type_t *)flatcc_builder_table_add(B, ID - 1,\ - sizeof(*_pt), sizeof(*_pt))) ? ((*_pt = type), 0) : -1; }\ -static inline int N ## _add_value(NS ## builder_t *B, TN ## _union_ref_t uref)\ -{ NS ## ref_t *p; if (uref.type == TN ## _NONE) return 0; return (p = flatcc_builder_table_add_offset(B, ID)) ?\ - ((*p = uref.value), 0) : -1; }\ -static inline int N ## _clone(NS ## builder_t *B, TN ## _union_t p)\ -{ return N ## _add(B, TN ## _clone(B, p)); }\ -static inline int N ## _pick(NS ## builder_t *B, TT ## _table_t t)\ -{ TN ## _union_t _p = N ## _union(t); return _p.type ? N ## _clone(B, _p) : 0; } - -/* M is the union value name and T is its type, i.e. the qualified name. */ -#define __flatbuffers_build_union_table_value_field(NS, N, NU, M, T)\ -static inline int N ## _ ## M ## _add(NS ## builder_t *B, T ## _ref_t ref)\ -{ return N ## _add(B, NU ## _as_ ## M (ref)); }\ -static inline int N ## _ ## M ## _start(NS ## builder_t *B)\ -{ return T ## _start(B); }\ -static inline int N ## _ ## M ## _end(NS ## builder_t *B)\ -{ T ## _ref_t ref = T ## _end(B);\ - return ref ? N ## _ ## M ## _add(B, ref) : -1; }\ -static inline int N ## _ ## M ## _create(NS ## builder_t *B __ ## T ##_formal_args)\ -{ T ## _ref_t ref = T ## _create(B __ ## T ## _call_args);\ - return ref ? N ## _add(B, NU ## _as_ ## M(ref)) : -1; }\ -static inline int N ## _ ## M ## _clone(NS ## builder_t *B, T ## _table_t t)\ -{ T ## _ref_t ref = T ## _clone(B, t);\ - return ref ? N ## _add(B, NU ## _as_ ## M(ref)) : -1; } - -/* M is the union value name and T is its type, i.e. the qualified name. */ -#define __flatbuffers_build_union_struct_value_field(NS, N, NU, M, T)\ -static inline int N ## _ ## M ## _add(NS ## builder_t *B, T ## _ref_t ref)\ -{ return N ## _add(B, NU ## _as_ ## M (ref)); }\ -static inline T ## _t *N ## _ ## M ## _start(NS ## builder_t *B)\ -{ return T ## _start(B); }\ -static inline int N ## _ ## M ## _end(NS ## builder_t *B)\ -{ T ## _ref_t ref = T ## _end(B);\ - return ref ? N ## _ ## M ## _add(B, ref) : -1; }\ -static inline int N ## _ ## M ## _create(NS ## builder_t *B __ ## T ##_formal_args)\ -{ T ## _ref_t ref = T ## _create(B __ ## T ## _call_args);\ - return ref ? N ## _add(B, NU ## _as_ ## M(ref)) : -1; }\ -static inline int N ## _ ## M ## _end_pe(NS ## builder_t *B)\ -{ T ## _ref_t ref = T ## _end_pe(B);\ - return ref ? N ## _add(B, NU ## _as_ ## M(ref)) : -1; }\ -static inline int N ## _ ## M ## _clone(NS ## builder_t *B, T ## _struct_t p)\ -{ T ## _ref_t ref = T ## _clone(B, p);\ - return ref ? N ## _add(B, NU ## _as_ ## M(ref)) : -1; } -#define __flatbuffers_build_union_string_value_field(NS, N, NU, M)\ -static inline int N ## _ ## M ## _add(NS ## builder_t *B, NS ## string_ref_t ref)\ -{ return N ## _add(B, NU ## _as_ ## M (ref)); }\ -__flatbuffers_build_string_field_ops(NS, N ## _ ## M) - -/* NS: common namespace, ID: table field id (not offset), TN: name of type T, TT: name of table type - * S: sizeof of scalar type, A: alignment of type T, default value V of type T. */ -#define __flatbuffers_build_scalar_field(ID, NS, N, TN, T, S, A, V, TT)\ -static inline int N ## _add(NS ## builder_t *B, const T v)\ -{ T *_p; if (v == V) return 0; if (!(_p = (T *)flatcc_builder_table_add(B, ID, S, A))) return -1;\ - TN ## _assign_to_pe(_p, v); return 0; }\ -static inline int N ## _force_add(NS ## builder_t *B, const T v)\ -{ T *_p; if (!(_p = (T *)flatcc_builder_table_add(B, ID, S, A))) return -1;\ - TN ## _assign_to_pe(_p, v); return 0; }\ -/* Clone does not skip default values and expects pe endian content. */\ -static inline int N ## _clone(NS ## builder_t *B, const T *p)\ -{ return 0 == flatcc_builder_table_add_copy(B, ID, p, S, A) ? -1 : 0; }\ -/* Transferring a missing field is a nop success with 0 as result. */\ -static inline int N ## _pick(NS ## builder_t *B, TT ## _table_t t)\ -{ const T *_p = N ## _get_ptr(t); return _p ? N ## _clone(B, _p) : 0; } - -#define __flatbuffers_build_struct_field(ID, NS, N, TN, S, A, TT)\ -static inline TN ## _t *N ## _start(NS ## builder_t *B)\ -{ return (TN ## _t *)flatcc_builder_table_add(B, ID, S, A); }\ -static inline int N ## _end(NS ## builder_t *B)\ -{ if (!NS ## is_native_pe()) { TN ## _to_pe((TN ## _t *)flatcc_builder_table_edit(B, S)); } return 0; }\ -static inline int N ## _end_pe(NS ## builder_t *B) { return 0; }\ -static inline int N ## _create(NS ## builder_t *B __ ## TN ## _formal_args)\ -{ TN ## _t *_p = N ## _start(B); if (!_p) return -1; TN ##_assign_to_pe(_p __ ## TN ## _call_args);\ - return 0; }\ -static inline int N ## _add(NS ## builder_t *B, const TN ## _t *p)\ -{ TN ## _t *_p = N ## _start(B); if (!_p) return -1; TN ##_copy_to_pe(_p, p); return 0; }\ -static inline int N ## _clone(NS ## builder_t *B, TN ## _struct_t p)\ -{ return 0 == flatcc_builder_table_add_copy(B, ID, p, S, A) ? -1 : 0; }\ -static inline int N ## _pick(NS ## builder_t *B, TT ## _table_t t)\ -{ TN ## _struct_t _p = N ## _get(t); return _p ? N ## _clone(B, _p) : 0; } - -#define __flatbuffers_build_vector_field(ID, NS, N, TN, T, TT)\ -static inline int N ## _add(NS ## builder_t *B, TN ## _vec_ref_t ref)\ -{ TN ## _vec_ref_t *_p; return (ref && (_p = flatcc_builder_table_add_offset(B, ID))) ? ((*_p = ref), 0) : -1; }\ -static inline int N ## _start(NS ## builder_t *B)\ -{ return TN ## _vec_start(B); }\ -static inline int N ## _end_pe(NS ## builder_t *B)\ -{ return N ## _add(B, TN ## _vec_end_pe(B)); }\ -static inline int N ## _end(NS ## builder_t *B)\ -{ return N ## _add(B, TN ## _vec_end(B)); }\ -static inline int N ## _create_pe(NS ## builder_t *B, T *data, size_t len)\ -{ return N ## _add(B, TN ## _vec_create_pe(B, data, len)); }\ -static inline int N ## _create(NS ## builder_t *B, T *data, size_t len)\ -{ return N ## _add(B, TN ## _vec_create(B, data, len)); }\ -static inline int N ## _slice(NS ## builder_t *B, TN ## _vec_t vec, size_t index, size_t len)\ -{ return N ## _add(B, TN ## _vec_slice(B, vec, index, len)); }\ -static inline int N ## _clone(NS ## builder_t *B, TN ## _vec_t vec)\ -{ return N ## _add(B, TN ## _vec_clone(B, vec)); }\ -static inline int N ## _pick(NS ## builder_t *B, TT ## _table_t t)\ -{ TN ## _vec_t _p = N ## _get(t); return _p ? N ## _clone(B, _p) : 0; }\ -__flatbuffers_build_vector_ops(NS, N, N, TN, T)\ - -#define __flatbuffers_build_offset_vector_field(ID, NS, N, TN, TT)\ -static inline int N ## _add(NS ## builder_t *B, TN ## _vec_ref_t ref)\ -{ TN ## _vec_ref_t *_p; return (ref && (_p = flatcc_builder_table_add_offset(B, ID))) ? ((*_p = ref), 0) : -1; }\ -static inline int N ## _start(NS ## builder_t *B)\ -{ return flatcc_builder_start_offset_vector(B); }\ -static inline int N ## _end(NS ## builder_t *B)\ -{ return N ## _add(B, flatcc_builder_end_offset_vector(B)); }\ -static inline int N ## _create(NS ## builder_t *B, const TN ## _ref_t *data, size_t len)\ -{ return N ## _add(B, flatcc_builder_create_offset_vector(B, data, len)); }\ -__flatbuffers_build_offset_vector_ops(NS, N, N, TN)\ -static inline int N ## _clone(NS ## builder_t *B, TN ## _vec_t vec)\ -{ return N ## _add(B, TN ## _vec_clone(B, vec)); }\ -static inline int N ## _pick(NS ## builder_t *B, TT ## _table_t t)\ -{ TN ## _vec_t _p = N ## _get(t); return _p ? N ## _clone(B, _p) : 0; } - -/* depends on N ## _add which differs for union member fields and ordinary fields */\ -#define __flatbuffers_build_string_field_ops(NS, N)\ -static inline int N ## _start(NS ## builder_t *B)\ -{ return flatcc_builder_start_string(B); }\ -static inline int N ## _end(NS ## builder_t *B)\ -{ return N ## _add(B, flatcc_builder_end_string(B)); }\ -static inline int N ## _create(NS ## builder_t *B, const char *s, size_t len)\ -{ return N ## _add(B, flatcc_builder_create_string(B, s, len)); }\ -static inline int N ## _create_str(NS ## builder_t *B, const char *s)\ -{ return N ## _add(B, flatcc_builder_create_string_str(B, s)); }\ -static inline int N ## _create_strn(NS ## builder_t *B, const char *s, size_t max_len)\ -{ return N ## _add(B, flatcc_builder_create_string_strn(B, s, max_len)); }\ -static inline int N ## _clone(NS ## builder_t *B, NS ## string_t string)\ -{ return N ## _add(B, NS ## string_clone(B, string)); }\ -static inline int N ## _slice(NS ## builder_t *B, NS ## string_t string, size_t index, size_t len)\ -{ return N ## _add(B, NS ## string_slice(B, string, index, len)); }\ -__flatbuffers_build_string_ops(NS, N) - -#define __flatbuffers_build_string_field(ID, NS, N, TT)\ -static inline int N ## _add(NS ## builder_t *B, NS ## string_ref_t ref)\ -{ NS ## string_ref_t *_p; return (ref && (_p = flatcc_builder_table_add_offset(B, ID))) ? ((*_p = ref), 0) : -1; }\ -__flatbuffers_build_string_field_ops(NS, N)\ -static inline int N ## _pick(NS ## builder_t *B, TT ## _table_t t)\ -{ NS ## string_t _p = N ## _get(t); return _p ? N ## _clone(B, _p) : 0; } - -#define __flatbuffers_build_table_vector_field(ID, NS, N, TN, TT)\ -__flatbuffers_build_offset_vector_field(ID, NS, N, TN, TT)\ -__flatbuffers_build_table_vector_ops(NS, N, TN) - -#define __flatbuffers_build_union_vector_field(ID, NS, N, TN, TT)\ -static inline int N ## _add(NS ## builder_t *B, TN ## _union_vec_ref_t uvref)\ -{ NS ## vec_ref_t *_p; if (!uvref.type || !uvref.value) return uvref.type == uvref.value ? 0 : -1;\ - if (!(_p = flatcc_builder_table_add_offset(B, ID - 1))) return -1; *_p = uvref.type;\ - if (!(_p = flatcc_builder_table_add_offset(B, ID))) return -1; *_p = uvref.value; return 0; }\ -static inline int N ## _start(NS ## builder_t *B)\ -{ return flatcc_builder_start_union_vector(B); }\ -static inline int N ## _end(NS ## builder_t *B)\ -{ return N ## _add(B, flatcc_builder_end_union_vector(B)); }\ -static inline int N ## _create(NS ## builder_t *B, const TN ## _union_ref_t *data, size_t len)\ -{ return N ## _add(B, flatcc_builder_create_union_vector(B, data, len)); }\ -__flatbuffers_build_union_vector_ops(NS, N, N, TN)\ -static inline int N ## _clone(NS ## builder_t *B, TN ## _union_vec_t vec)\ -{ return N ## _add(B, TN ## _vec_clone(B, vec)); }\ -static inline int N ## _pick(NS ## builder_t *B, TT ## _table_t t)\ -{ TN ## _union_vec_t _p = N ## _union(t); return _p.type ? N ## _clone(B, _p) : 0; } - -#define __flatbuffers_build_union_table_vector_value_field(NS, N, NU, M, T)\ -static inline int N ## _ ## M ## _push_start(NS ## builder_t *B)\ -{ return T ## _start(B); }\ -static inline NU ## _union_ref_t *N ## _ ## M ## _push_end(NS ## builder_t *B)\ -{ return NU ## _vec_push(B, NU ## _as_ ## M (T ## _end(B))); }\ -static inline NU ## _union_ref_t *N ## _ ## M ## _push(NS ## builder_t *B, T ## _ref_t ref)\ -{ return NU ## _vec_push(B, NU ## _as_ ## M (ref)); }\ -static inline NU ## _union_ref_t *N ## _ ## M ## _push_create(NS ## builder_t *B __ ## T ##_formal_args)\ -{ return NU ## _vec_push(B, NU ## _as_ ## M(T ## _create(B __ ## T ## _call_args))); }\ -static inline NU ## _union_ref_t *N ## _ ## M ## _push_clone(NS ## builder_t *B, T ## _table_t t)\ -{ return NU ## _vec_push(B, NU ## _as_ ## M(T ## _clone(B, t))); } - -#define __flatbuffers_build_union_struct_vector_value_field(NS, N, NU, M, T)\ -static inline T ## _t *N ## _ ## M ## _push_start(NS ## builder_t *B)\ -{ return T ## _start(B); }\ -static inline NU ## _union_ref_t *N ## _ ## M ## _push_end(NS ## builder_t *B)\ -{ return NU ## _vec_push(B, NU ## _as_ ## M (T ## _end(B))); }\ -static inline NU ## _union_ref_t *N ## _ ## M ## _push(NS ## builder_t *B, T ## _ref_t ref)\ -{ return NU ## _vec_push(B, NU ## _as_ ## M (ref)); }\ -static inline NU ## _union_ref_t *N ## _ ## M ## _push_create(NS ## builder_t *B __ ## T ##_formal_args)\ -{ return NU ## _vec_push(B, NU ## _as_ ## M(T ## _create(B __ ## T ## _call_args))); }\ -static inline NU ## _union_ref_t *N ## _ ## M ## _push_clone(NS ## builder_t *B, T ## _struct_t p)\ -{ return NU ## _vec_push(B, NU ## _as_ ## M(T ## _clone(B, p))); } - -#define __flatbuffers_build_union_string_vector_value_field(NS, N, NU, M)\ -static inline NU ## _union_ref_t *N ## _ ## M ## _push(NS ## builder_t *B, NS ## string_ref_t ref)\ -{ return NU ## _vec_push(B, NU ## _as_ ## M (ref)); }\ -static inline int N ## _ ## M ## _push_start(NS ## builder_t *B)\ -{ return NS ## string_start(B); }\ -static inline NU ## _union_ref_t *N ## _ ## M ## _push_end(NS ## builder_t *B)\ -{ return NU ## _vec_push(B, NU ## _as_ ## M(NS ## string_end(B))); }\ -static inline NU ## _union_ref_t *N ## _ ## M ## _push_create(NS ## builder_t *B, const char *s, size_t len)\ -{ return NU ## _vec_push(B, NU ## _as_ ## M(NS ## string_create(B, s, len))); }\ -static inline NU ## _union_ref_t *N ## _ ## M ## _push_create_str(NS ## builder_t *B, const char *s)\ -{ return NU ## _vec_push(B, NU ## _as_ ## M(NS ## string_create_str(B, s))); }\ -static inline NU ## _union_ref_t *N ## _ ## M ## _push_create_strn(NS ## builder_t *B, const char *s, size_t max_len)\ -{ return NU ## _vec_push(B, NU ## _as_ ## M(NS ## string_create_strn(B, s, max_len))); }\ -static inline NU ## _union_ref_t *N ## _ ## M ## _push_clone(NS ## builder_t *B, NS ## string_t string)\ -{ return NU ## _vec_push(B, NU ## _as_ ## M(NS ## string_clone(B, string))); }\ -static inline NU ## _union_ref_t *N ## _ ## M ## _push_slice(NS ## builder_t *B, NS ## string_t string, size_t index, size_t len)\ -{ return NU ## _vec_push(B, NU ## _as_ ## M(NS ## string_slice(B, string, index, len))); } - -#define __flatbuffers_build_string_vector_field(ID, NS, N, TT)\ -__flatbuffers_build_offset_vector_field(ID, NS, N, NS ## string, TT)\ -__flatbuffers_build_string_vector_ops(NS, N) - -#define __flatbuffers_char_formal_args , char v0 -#define __flatbuffers_char_call_args , v0 -#define __flatbuffers_uint8_formal_args , uint8_t v0 -#define __flatbuffers_uint8_call_args , v0 -#define __flatbuffers_int8_formal_args , int8_t v0 -#define __flatbuffers_int8_call_args , v0 -#define __flatbuffers_bool_formal_args , flatbuffers_bool_t v0 -#define __flatbuffers_bool_call_args , v0 -#define __flatbuffers_uint16_formal_args , uint16_t v0 -#define __flatbuffers_uint16_call_args , v0 -#define __flatbuffers_uint32_formal_args , uint32_t v0 -#define __flatbuffers_uint32_call_args , v0 -#define __flatbuffers_uint64_formal_args , uint64_t v0 -#define __flatbuffers_uint64_call_args , v0 -#define __flatbuffers_int16_formal_args , int16_t v0 -#define __flatbuffers_int16_call_args , v0 -#define __flatbuffers_int32_formal_args , int32_t v0 -#define __flatbuffers_int32_call_args , v0 -#define __flatbuffers_int64_formal_args , int64_t v0 -#define __flatbuffers_int64_call_args , v0 -#define __flatbuffers_float_formal_args , float v0 -#define __flatbuffers_float_call_args , v0 -#define __flatbuffers_double_formal_args , double v0 -#define __flatbuffers_double_call_args , v0 - -__flatbuffers_build_scalar(flatbuffers_, flatbuffers_char, char) -__flatbuffers_build_scalar(flatbuffers_, flatbuffers_uint8, uint8_t) -__flatbuffers_build_scalar(flatbuffers_, flatbuffers_int8, int8_t) -__flatbuffers_build_scalar(flatbuffers_, flatbuffers_bool, flatbuffers_bool_t) -__flatbuffers_build_scalar(flatbuffers_, flatbuffers_uint16, uint16_t) -__flatbuffers_build_scalar(flatbuffers_, flatbuffers_uint32, uint32_t) -__flatbuffers_build_scalar(flatbuffers_, flatbuffers_uint64, uint64_t) -__flatbuffers_build_scalar(flatbuffers_, flatbuffers_int16, int16_t) -__flatbuffers_build_scalar(flatbuffers_, flatbuffers_int32, int32_t) -__flatbuffers_build_scalar(flatbuffers_, flatbuffers_int64, int64_t) -__flatbuffers_build_scalar(flatbuffers_, flatbuffers_float, float) -__flatbuffers_build_scalar(flatbuffers_, flatbuffers_double, double) - -__flatbuffers_build_string(flatbuffers_) - -__flatbuffers_build_buffer(flatbuffers_) -#include "flatcc/flatcc_epilogue.h" -#endif /* FLATBUFFERS_COMMON_BUILDER_H */ diff --git a/flatccrt/include/flatcc/reflection/flatbuffers_common_reader.h b/flatccrt/include/flatcc/reflection/flatbuffers_common_reader.h deleted file mode 100644 index 3dc3089..0000000 --- a/flatccrt/include/flatcc/reflection/flatbuffers_common_reader.h +++ /dev/null @@ -1,571 +0,0 @@ -#ifndef FLATBUFFERS_COMMON_READER_H -#define FLATBUFFERS_COMMON_READER_H - -/* Generated by flatcc 0.6.0 FlatBuffers schema compiler for C by dvide.com */ - -/* Common FlatBuffers read functionality for C. */ - -#include "flatcc/flatcc_prologue.h" -#include "flatcc/flatcc_flatbuffers.h" - - -#define __flatbuffers_read_scalar_at_byteoffset(N, p, o) N ## _read_from_pe((uint8_t *)(p) + (o)) -#define __flatbuffers_read_scalar(N, p) N ## _read_from_pe(p) -#define __flatbuffers_read_vt(ID, offset, t)\ -flatbuffers_voffset_t offset = 0;\ -{ flatbuffers_voffset_t id__tmp, *vt__tmp;\ - assert(t != 0 && "null pointer table access");\ - id__tmp = ID;\ - vt__tmp = (flatbuffers_voffset_t *)((uint8_t *)(t) -\ - __flatbuffers_soffset_read_from_pe(t));\ - if (__flatbuffers_voffset_read_from_pe(vt__tmp) >= sizeof(vt__tmp[0]) * (id__tmp + 3)) {\ - offset = __flatbuffers_voffset_read_from_pe(vt__tmp + id__tmp + 2);\ - }\ -} -#define __flatbuffers_field_present(ID, t) { __flatbuffers_read_vt(ID, offset__tmp, t) return offset__tmp != 0; } -#define __flatbuffers_scalar_field(T, ID, t)\ -{\ - __flatbuffers_read_vt(ID, offset__tmp, t)\ - if (offset__tmp) {\ - return (const T *)((uint8_t *)(t) + offset__tmp);\ - }\ - return 0;\ -} -#define __flatbuffers_define_scalar_field(ID, N, NK, TK, T, V)\ -static inline T N ## _ ## NK ## _get(N ## _table_t t__tmp)\ -{ __flatbuffers_read_vt(ID, offset__tmp, t__tmp)\ - return offset__tmp ? __flatbuffers_read_scalar_at_byteoffset(TK, t__tmp, offset__tmp) : V;\ -}\ -static inline T N ## _ ## NK(N ## _table_t t__tmp)\ -{ __flatbuffers_read_vt(ID, offset__tmp, t__tmp)\ - return offset__tmp ? __flatbuffers_read_scalar_at_byteoffset(TK, t__tmp, offset__tmp) : V;\ -}\ -static inline const T *N ## _ ## NK ## _get_ptr(N ## _table_t t__tmp)\ -__flatbuffers_scalar_field(T, ID, t__tmp)\ -static inline int N ## _ ## NK ## _is_present(N ## _table_t t__tmp)\ -__flatbuffers_field_present(ID, t__tmp)\ -__flatbuffers_define_scan_by_scalar_field(N, NK, T) -#define __flatbuffers_struct_field(T, ID, t, r)\ -{\ - __flatbuffers_read_vt(ID, offset__tmp, t)\ - if (offset__tmp) {\ - return (T)((uint8_t *)(t) + offset__tmp);\ - }\ - assert(!(r) && "required field missing");\ - return 0;\ -} -#define __flatbuffers_offset_field(T, ID, t, r, adjust)\ -{\ - flatbuffers_uoffset_t *elem__tmp;\ - __flatbuffers_read_vt(ID, offset__tmp, t)\ - if (offset__tmp) {\ - elem__tmp = (flatbuffers_uoffset_t *)((uint8_t *)(t) + offset__tmp);\ - /* Add sizeof so C api can have raw access past header field. */\ - return (T)((uint8_t *)(elem__tmp) + adjust +\ - __flatbuffers_uoffset_read_from_pe(elem__tmp));\ - }\ - assert(!(r) && "required field missing");\ - return 0;\ -} -#define __flatbuffers_vector_field(T, ID, t, r) __flatbuffers_offset_field(T, ID, t, r, sizeof(flatbuffers_uoffset_t)) -#define __flatbuffers_table_field(T, ID, t, r) __flatbuffers_offset_field(T, ID, t, r, 0) -#define __flatbuffers_define_struct_field(ID, N, NK, T, r)\ -static inline T N ## _ ## NK ## _get(N ## _table_t t__tmp)\ -__flatbuffers_struct_field(T, ID, t__tmp, r)\ -static inline T N ## _ ## NK(N ## _table_t t__tmp)\ -__flatbuffers_struct_field(T, ID, t__tmp, r)\ -static inline int N ## _ ## NK ## _is_present(N ## _table_t t__tmp)\ -__flatbuffers_field_present(ID, t__tmp) -#define __flatbuffers_define_vector_field(ID, N, NK, T, r)\ -static inline T N ## _ ## NK ## _get(N ## _table_t t__tmp)\ -__flatbuffers_vector_field(T, ID, t__tmp, r)\ -static inline T N ## _ ## NK(N ## _table_t t__tmp)\ -__flatbuffers_vector_field(T, ID, t__tmp, r)\ -static inline int N ## _ ## NK ## _is_present(N ## _table_t t__tmp)\ -__flatbuffers_field_present(ID, t__tmp) -#define __flatbuffers_define_table_field(ID, N, NK, T, r)\ -static inline T N ## _ ## NK ## _get(N ## _table_t t__tmp)\ -__flatbuffers_table_field(T, ID, t__tmp, r)\ -static inline T N ## _ ## NK(N ## _table_t t__tmp)\ -__flatbuffers_table_field(T, ID, t__tmp, r)\ -static inline int N ## _ ## NK ## _is_present(N ## _table_t t__tmp)\ -__flatbuffers_field_present(ID, t__tmp) -#define __flatbuffers_define_string_field(ID, N, NK, r)\ -static inline flatbuffers_string_t N ## _ ## NK ## _get(N ## _table_t t__tmp)\ -__flatbuffers_vector_field(flatbuffers_string_t, ID, t__tmp, r)\ -static inline flatbuffers_string_t N ## _ ## NK(N ## _table_t t__tmp)\ -__flatbuffers_vector_field(flatbuffers_string_t, ID, t__tmp, r)\ -static inline int N ## _ ## NK ## _is_present(N ## _table_t t__tmp)\ -__flatbuffers_field_present(ID, t__tmp)\ -__flatbuffers_define_scan_by_string_field(N, NK) -#define __flatbuffers_vec_len(vec)\ -{ return (vec) ? (size_t)__flatbuffers_uoffset_read_from_pe((flatbuffers_uoffset_t *)vec - 1) : 0; } -#define __flatbuffers_string_len(s) __flatbuffers_vec_len(s) -static inline size_t flatbuffers_vec_len(const void *vec) -__flatbuffers_vec_len(vec) -#define __flatbuffers_scalar_vec_at(N, vec, i)\ -{ assert(flatbuffers_vec_len(vec) > (i) && "index out of range");\ - return __flatbuffers_read_scalar(N, &(vec)[i]); } -#define __flatbuffers_struct_vec_at(vec, i)\ -{ assert(flatbuffers_vec_len(vec) > (i) && "index out of range"); return (vec) + (i); } -/* `adjust` skips past the header for string vectors. */ -#define __flatbuffers_offset_vec_at(T, vec, i, adjust)\ -{ const flatbuffers_uoffset_t *elem__tmp = (vec) + (i);\ - assert(flatbuffers_vec_len(vec) > (i) && "index out of range");\ - return (T)((uint8_t *)(elem__tmp) + (size_t)__flatbuffers_uoffset_read_from_pe(elem__tmp) + (adjust)); } -#define __flatbuffers_define_scalar_vec_len(N)\ -static inline size_t N ## _vec_len(N ##_vec_t vec__tmp)\ -{ return flatbuffers_vec_len(vec__tmp); } -#define __flatbuffers_define_scalar_vec_at(N, T) \ -static inline T N ## _vec_at(N ## _vec_t vec__tmp, size_t i__tmp)\ -__flatbuffers_scalar_vec_at(N, vec__tmp, i__tmp) -typedef const char *flatbuffers_string_t; -static inline size_t flatbuffers_string_len(flatbuffers_string_t s) -__flatbuffers_string_len(s) -typedef const flatbuffers_uoffset_t *flatbuffers_string_vec_t; -typedef flatbuffers_uoffset_t *flatbuffers_string_mutable_vec_t; -static inline size_t flatbuffers_string_vec_len(flatbuffers_string_vec_t vec) -__flatbuffers_vec_len(vec) -static inline flatbuffers_string_t flatbuffers_string_vec_at(flatbuffers_string_vec_t vec, size_t i) -__flatbuffers_offset_vec_at(flatbuffers_string_t, vec, i, sizeof(vec[0])) -typedef const void *flatbuffers_generic_t; -typedef void *flatbuffers_mutable_generic_t; -static inline flatbuffers_string_t flatbuffers_string_cast_from_generic(const flatbuffers_generic_t p) -{ return p ? ((const char *)p) + __flatbuffers_uoffset__size() : 0; } -typedef const flatbuffers_uoffset_t *flatbuffers_generic_vec_t; -typedef flatbuffers_uoffset_t *flatbuffers_generic_table_mutable_vec_t; -static inline size_t flatbuffers_generic_vec_len(flatbuffers_generic_vec_t vec) -__flatbuffers_vec_len(vec) -static inline flatbuffers_generic_t flatbuffers_generic_vec_at(flatbuffers_generic_vec_t vec, size_t i) -__flatbuffers_offset_vec_at(flatbuffers_generic_t, vec, i, 0) -static inline flatbuffers_generic_t flatbuffers_generic_vec_at_as_string(flatbuffers_generic_vec_t vec, size_t i) -__flatbuffers_offset_vec_at(flatbuffers_generic_t, vec, i, sizeof(vec[0])) -typedef struct flatbuffers_union { - flatbuffers_union_type_t type; - flatbuffers_generic_t value; -} flatbuffers_union_t; -typedef struct flatbuffers_union_vec { - const flatbuffers_union_type_t *type; - const flatbuffers_uoffset_t *value; -} flatbuffers_union_vec_t; -typedef struct flatbuffers_mutable_union { - flatbuffers_union_type_t type; - flatbuffers_mutable_generic_t value; -} flatbuffers_mutable_union_t; -typedef struct flatbuffers_mutable_union_vec { - flatbuffers_union_type_t *type; - flatbuffers_uoffset_t *value; -} flatbuffers_mutable_union_vec_t; -static inline flatbuffers_mutable_union_t flatbuffers_mutable_union_cast(flatbuffers_union_t u__tmp)\ -{ flatbuffers_mutable_union_t mu = { u__tmp.type, (flatbuffers_mutable_generic_t)u__tmp.value };\ - return mu; } -static inline flatbuffers_mutable_union_vec_t flatbuffers_mutable_union_vec_cast(flatbuffers_union_vec_t uv__tmp)\ -{ flatbuffers_mutable_union_vec_t muv =\ - { (flatbuffers_union_type_t *)uv__tmp.type, (flatbuffers_uoffset_t *)uv__tmp.value }; return muv; } -#define __flatbuffers_union_type_field(ID, t)\ -{\ - __flatbuffers_read_vt(ID, offset__tmp, t)\ - return offset__tmp ? __flatbuffers_read_scalar_at_byteoffset(__flatbuffers_utype, t, offset__tmp) : 0;\ -} -static inline flatbuffers_string_t flatbuffers_string_cast_from_union(const flatbuffers_union_t u__tmp)\ -{ return flatbuffers_string_cast_from_generic(u__tmp.value); } -#define __flatbuffers_define_union_field(NS, ID, N, NK, T, r)\ -static inline T ## _union_type_t N ## _ ## NK ## _type_get(N ## _table_t t__tmp)\ -__## NS ## union_type_field(((ID) - 1), t__tmp)\ -static inline NS ## generic_t N ## _ ## NK ## _get(N ## _table_t t__tmp)\ -__## NS ## table_field(NS ## generic_t, ID, t__tmp, r)\ -static inline T ## _union_type_t N ## _ ## NK ## _type(N ## _table_t t__tmp)\ -__## NS ## union_type_field(((ID) - 1), t__tmp)\ -static inline NS ## generic_t N ## _ ## NK(N ## _table_t t__tmp)\ -__## NS ## table_field(NS ## generic_t, ID, t__tmp, r)\ -static inline int N ## _ ## NK ## _is_present(N ## _table_t t__tmp)\ -__## NS ## field_present(ID, t__tmp)\ -static inline T ## _union_t N ## _ ## NK ## _union(N ## _table_t t__tmp)\ -{ T ## _union_t u__tmp = { 0, 0 }; u__tmp.type = N ## _ ## NK ## _type_get(t__tmp);\ - if (u__tmp.type == 0) return u__tmp; u__tmp.value = N ## _ ## NK ## _get(t__tmp); return u__tmp; }\ -static inline NS ## string_t N ## _ ## NK ## _as_string(N ## _table_t t__tmp)\ -{ return NS ## string_cast_from_generic(N ## _ ## NK ## _get(t__tmp)); }\ - -#define __flatbuffers_define_union_vector_ops(NS, T)\ -static inline size_t T ## _union_vec_len(T ## _union_vec_t uv__tmp)\ -{ return NS ## vec_len(uv__tmp.type); }\ -static inline T ## _union_t T ## _union_vec_at(T ## _union_vec_t uv__tmp, size_t i__tmp)\ -{ T ## _union_t u__tmp = { 0, 0 }; size_t n__tmp = NS ## vec_len(uv__tmp.type);\ - assert(n__tmp > (i__tmp) && "index out of range"); u__tmp.type = uv__tmp.type[i__tmp];\ - /* Unknown type is treated as NONE for schema evolution. */\ - if (u__tmp.type == 0) return u__tmp;\ - u__tmp.value = NS ## generic_vec_at(uv__tmp.value, i__tmp); return u__tmp; }\ -static inline NS ## string_t T ## _union_vec_at_as_string(T ## _union_vec_t uv__tmp, size_t i__tmp)\ -{ return (NS ## string_t) NS ## generic_vec_at_as_string(uv__tmp.value, i__tmp); }\ - -#define __flatbuffers_define_union_vector(NS, T)\ -typedef NS ## union_vec_t T ## _union_vec_t;\ -typedef NS ## mutable_union_vec_t T ## _mutable_union_vec_t;\ -static inline T ## _mutable_union_vec_t T ## _mutable_union_vec_cast(T ## _union_vec_t u__tmp)\ -{ return NS ## mutable_union_vec_cast(u__tmp); }\ -__## NS ## define_union_vector_ops(NS, T) -#define __flatbuffers_define_union(NS, T)\ -typedef NS ## union_t T ## _union_t;\ -typedef NS ## mutable_union_t T ## _mutable_union_t;\ -static inline T ## _mutable_union_t T ## _mutable_union_cast(T ## _union_t u__tmp)\ -{ return NS ## mutable_union_cast(u__tmp); }\ -__## NS ## define_union_vector(NS, T) -#define __flatbuffers_define_union_vector_field(NS, ID, N, NK, T, r)\ -__## NS ## define_vector_field(ID - 1, N, NK ## _type, T ## _vec_t, r)\ -__## NS ## define_vector_field(ID, N, NK, flatbuffers_generic_vec_t, r)\ -static inline T ## _union_vec_t N ## _ ## NK ## _union(N ## _table_t t__tmp)\ -{ T ## _union_vec_t uv__tmp; uv__tmp.type = N ## _ ## NK ## _type_get(t__tmp);\ - uv__tmp.value = N ## _ ## NK(t__tmp);\ - assert(NS ## vec_len(uv__tmp.type) == NS ## vec_len(uv__tmp.value)\ - && "union vector type length mismatch"); return uv__tmp; } -#include -static const size_t flatbuffers_not_found = (size_t)-1; -static const size_t flatbuffers_end = (size_t)-1; -#define __flatbuffers_identity(n) (n) -#define __flatbuffers_min(a, b) ((a) < (b) ? (a) : (b)) -/* Subtraction doesn't work for unsigned types. */ -#define __flatbuffers_scalar_cmp(x, y, n) ((x) < (y) ? -1 : (x) > (y)) -static inline int __flatbuffers_string_n_cmp(flatbuffers_string_t v, const char *s, size_t n) -{ size_t nv = flatbuffers_string_len(v); int x = strncmp(v, s, nv < n ? nv : n); - return x != 0 ? x : nv < n ? -1 : nv > n; } -/* `n` arg unused, but needed by string find macro expansion. */ -static inline int __flatbuffers_string_cmp(flatbuffers_string_t v, const char *s, size_t n) { (void)n; return strcmp(v, s); } -/* A = identity if searching scalar vectors rather than key fields. */ -/* Returns lowest matching index or not_found. */ -#define __flatbuffers_find_by_field(A, V, E, L, K, Kn, T, D)\ -{ T v__tmp; size_t a__tmp = 0, b__tmp, m__tmp; if (!(b__tmp = L(V))) { return flatbuffers_not_found; }\ - --b__tmp;\ - while (a__tmp < b__tmp) {\ - m__tmp = a__tmp + ((b__tmp - a__tmp) >> 1);\ - v__tmp = A(E(V, m__tmp));\ - if ((D(v__tmp, (K), (Kn))) < 0) {\ - a__tmp = m__tmp + 1;\ - } else {\ - b__tmp = m__tmp;\ - }\ - }\ - if (a__tmp == b__tmp) {\ - v__tmp = A(E(V, a__tmp));\ - if (D(v__tmp, (K), (Kn)) == 0) {\ - return a__tmp;\ - }\ - }\ - return flatbuffers_not_found;\ -} -#define __flatbuffers_find_by_scalar_field(A, V, E, L, K, T)\ -__flatbuffers_find_by_field(A, V, E, L, K, 0, T, __flatbuffers_scalar_cmp) -#define __flatbuffers_find_by_string_field(A, V, E, L, K)\ -__flatbuffers_find_by_field(A, V, E, L, K, 0, flatbuffers_string_t, __flatbuffers_string_cmp) -#define __flatbuffers_find_by_string_n_field(A, V, E, L, K, Kn)\ -__flatbuffers_find_by_field(A, V, E, L, K, Kn, flatbuffers_string_t, __flatbuffers_string_n_cmp) -#define __flatbuffers_define_find_by_scalar_field(N, NK, TK)\ -static inline size_t N ## _vec_find_by_ ## NK(N ## _vec_t vec__tmp, TK key__tmp)\ -__flatbuffers_find_by_scalar_field(N ## _ ## NK, vec__tmp, N ## _vec_at, N ## _vec_len, key__tmp, TK) -#define __flatbuffers_define_scalar_find(N, T)\ -static inline size_t N ## _vec_find(N ## _vec_t vec__tmp, T key__tmp)\ -__flatbuffers_find_by_scalar_field(__flatbuffers_identity, vec__tmp, N ## _vec_at, N ## _vec_len, key__tmp, T) -#define __flatbuffers_define_find_by_string_field(N, NK) \ -/* Note: find only works on vectors sorted by this field. */\ -static inline size_t N ## _vec_find_by_ ## NK(N ## _vec_t vec__tmp, const char *s__tmp)\ -__flatbuffers_find_by_string_field(N ## _ ## NK, vec__tmp, N ## _vec_at, N ## _vec_len, s__tmp)\ -static inline size_t N ## _vec_find_n_by_ ## NK(N ## _vec_t vec__tmp, const char *s__tmp, int n__tmp)\ -__flatbuffers_find_by_string_n_field(N ## _ ## NK, vec__tmp, N ## _vec_at, N ## _vec_len, s__tmp, n__tmp) -#define __flatbuffers_define_default_find_by_scalar_field(N, NK, TK)\ -static inline size_t N ## _vec_find(N ## _vec_t vec__tmp, TK key__tmp)\ -{ return N ## _vec_find_by_ ## NK(vec__tmp, key__tmp); } -#define __flatbuffers_define_default_find_by_string_field(N, NK) \ -static inline size_t N ## _vec_find(N ## _vec_t vec__tmp, const char *s__tmp)\ -{ return N ## _vec_find_by_ ## NK(vec__tmp, s__tmp); }\ -static inline size_t N ## _vec_find_n(N ## _vec_t vec__tmp, const char *s__tmp, int n__tmp)\ -{ return N ## _vec_find_n_by_ ## NK(vec__tmp, s__tmp, n__tmp); } -/* A = identity if searching scalar vectors rather than key fields. */ -/* Returns lowest matching index or not_found. */ -#define __flatbuffers_scan_by_field(b, e, A, V, E, L, K, Kn, T, D)\ -{ T v__tmp; size_t i__tmp;\ - for (i__tmp = b; i__tmp < e; ++i__tmp) {\ - v__tmp = A(E(V, i__tmp));\ - if (D(v__tmp, (K), (Kn)) == 0) {\ - return i__tmp;\ - }\ - }\ - return flatbuffers_not_found;\ -} -#define __flatbuffers_rscan_by_field(b, e, A, V, E, L, K, Kn, T, D)\ -{ T v__tmp; size_t i__tmp = e;\ - while (i__tmp-- > b) {\ - v__tmp = A(E(V, i__tmp));\ - if (D(v__tmp, (K), (Kn)) == 0) {\ - return i__tmp;\ - }\ - }\ - return flatbuffers_not_found;\ -} -#define __flatbuffers_scan_by_scalar_field(b, e, A, V, E, L, K, T)\ -__flatbuffers_scan_by_field(b, e, A, V, E, L, K, 0, T, __flatbuffers_scalar_cmp) -#define __flatbuffers_scan_by_string_field(b, e, A, V, E, L, K)\ -__flatbuffers_scan_by_field(b, e, A, V, E, L, K, 0, flatbuffers_string_t, __flatbuffers_string_cmp) -#define __flatbuffers_scan_by_string_n_field(b, e, A, V, E, L, K, Kn)\ -__flatbuffers_scan_by_field(b, e, A, V, E, L, K, Kn, flatbuffers_string_t, __flatbuffers_string_n_cmp) -#define __flatbuffers_rscan_by_scalar_field(b, e, A, V, E, L, K, T)\ -__flatbuffers_rscan_by_field(b, e, A, V, E, L, K, 0, T, __flatbuffers_scalar_cmp) -#define __flatbuffers_rscan_by_string_field(b, e, A, V, E, L, K)\ -__flatbuffers_rscan_by_field(b, e, A, V, E, L, K, 0, flatbuffers_string_t, __flatbuffers_string_cmp) -#define __flatbuffers_rscan_by_string_n_field(b, e, A, V, E, L, K, Kn)\ -__flatbuffers_rscan_by_field(b, e, A, V, E, L, K, Kn, flatbuffers_string_t, __flatbuffers_string_n_cmp) -#define __flatbuffers_define_scan_by_scalar_field(N, NK, T)\ -static inline size_t N ## _vec_scan_by_ ## NK(N ## _vec_t vec__tmp, T key__tmp)\ -__flatbuffers_scan_by_scalar_field(0, N ## _vec_len(vec__tmp), N ## _ ## NK ## _get, vec__tmp, N ## _vec_at, N ## _vec_len, key__tmp, T)\ -static inline size_t N ## _vec_scan_ex_by_ ## NK(N ## _vec_t vec__tmp, size_t begin__tmp, size_t end__tmp, T key__tmp)\ -__flatbuffers_scan_by_scalar_field(begin__tmp, __flatbuffers_min(end__tmp, N ## _vec_len(vec__tmp)), N ## _ ## NK ## _get, vec__tmp, N ## _vec_at, N ## _vec_len, key__tmp, T)\ -static inline size_t N ## _vec_rscan_by_ ## NK(N ## _vec_t vec__tmp, T key__tmp)\ -__flatbuffers_rscan_by_scalar_field(0, N ## _vec_len(vec__tmp), N ## _ ## NK ## _get, vec__tmp, N ## _vec_at, N ## _vec_len, key__tmp, T)\ -static inline size_t N ## _vec_rscan_ex_by_ ## NK(N ## _vec_t vec__tmp, size_t begin__tmp, size_t end__tmp, T key__tmp)\ -__flatbuffers_rscan_by_scalar_field(begin__tmp, __flatbuffers_min(end__tmp, N ## _vec_len(vec__tmp)), N ## _ ## NK ## _get, vec__tmp, N ## _vec_at, N ## _vec_len, key__tmp, T) -#define __flatbuffers_define_scalar_scan(N, T)\ -static inline size_t N ## _vec_scan(N ## _vec_t vec__tmp, T key__tmp)\ -__flatbuffers_scan_by_scalar_field(0, N ## _vec_len(vec__tmp), __flatbuffers_identity, vec__tmp, N ## _vec_at, N ## _vec_len, key__tmp, T)\ -static inline size_t N ## _vec_scan_ex(N ## _vec_t vec__tmp, size_t begin__tmp, size_t end__tmp, T key__tmp)\ -__flatbuffers_scan_by_scalar_field(begin__tmp, __flatbuffers_min(end__tmp, N ## _vec_len(vec__tmp)), __flatbuffers_identity, vec__tmp, N ## _vec_at, N ## _vec_len, key__tmp, T)\ -static inline size_t N ## _vec_rscan(N ## _vec_t vec__tmp, T key__tmp)\ -__flatbuffers_rscan_by_scalar_field(0, N ## _vec_len(vec__tmp), __flatbuffers_identity, vec__tmp, N ## _vec_at, N ## _vec_len, key__tmp, T)\ -static inline size_t N ## _vec_rscan_ex(N ## _vec_t vec__tmp, size_t begin__tmp, size_t end__tmp, T key__tmp)\ -__flatbuffers_rscan_by_scalar_field(begin__tmp, __flatbuffers_min(end__tmp, N ## _vec_len(vec__tmp)), __flatbuffers_identity, vec__tmp, N ## _vec_at, N ## _vec_len, key__tmp, T) -#define __flatbuffers_define_scan_by_string_field(N, NK) \ -static inline size_t N ## _vec_scan_by_ ## NK(N ## _vec_t vec__tmp, const char *s__tmp)\ -__flatbuffers_scan_by_string_field(0, N ## _vec_len(vec__tmp), N ## _ ## NK ## _get, vec__tmp, N ## _vec_at, N ## _vec_len, s__tmp)\ -static inline size_t N ## _vec_scan_n_by_ ## NK(N ## _vec_t vec__tmp, const char *s__tmp, int n__tmp)\ -__flatbuffers_scan_by_string_n_field(0, N ## _vec_len(vec__tmp), N ## _ ## NK ## _get, vec__tmp, N ## _vec_at, N ## _vec_len, s__tmp, n__tmp)\ -static inline size_t N ## _vec_scan_ex_by_ ## NK(N ## _vec_t vec__tmp, size_t begin__tmp, size_t end__tmp, const char *s__tmp)\ -__flatbuffers_scan_by_string_field(begin__tmp, __flatbuffers_min(end__tmp, N ## _vec_len(vec__tmp)), N ## _ ## NK ## _get, vec__tmp, N ## _vec_at, N ## _vec_len, s__tmp)\ -static inline size_t N ## _vec_scan_ex_n_by_ ## NK(N ## _vec_t vec__tmp, size_t begin__tmp, size_t end__tmp, const char *s__tmp, int n__tmp)\ -__flatbuffers_scan_by_string_n_field(begin__tmp, __flatbuffers_min( end__tmp, N ## _vec_len(vec__tmp)), N ## _ ## NK ## _get, vec__tmp, N ## _vec_at, N ## _vec_len, s__tmp, n__tmp)\ -static inline size_t N ## _vec_rscan_by_ ## NK(N ## _vec_t vec__tmp, const char *s__tmp)\ -__flatbuffers_rscan_by_string_field(0, N ## _vec_len(vec__tmp), N ## _ ## NK ## _get, vec__tmp, N ## _vec_at, N ## _vec_len, s__tmp)\ -static inline size_t N ## _vec_rscan_n_by_ ## NK(N ## _vec_t vec__tmp, const char *s__tmp, int n__tmp)\ -__flatbuffers_rscan_by_string_n_field(0, N ## _vec_len(vec__tmp), N ## _ ## NK ## _get, vec__tmp, N ## _vec_at, N ## _vec_len, s__tmp, n__tmp)\ -static inline size_t N ## _vec_rscan_ex_by_ ## NK(N ## _vec_t vec__tmp, size_t begin__tmp, size_t end__tmp, const char *s__tmp)\ -__flatbuffers_rscan_by_string_field(begin__tmp, __flatbuffers_min(end__tmp, N ## _vec_len(vec__tmp)), N ## _ ## NK ## _get, vec__tmp, N ## _vec_at, N ## _vec_len, s__tmp)\ -static inline size_t N ## _vec_rscan_ex_n_by_ ## NK(N ## _vec_t vec__tmp, size_t begin__tmp, size_t end__tmp, const char *s__tmp, int n__tmp)\ -__flatbuffers_rscan_by_string_n_field(begin__tmp, __flatbuffers_min( end__tmp, N ## _vec_len(vec__tmp)), N ## _ ## NK ## _get, vec__tmp, N ## _vec_at, N ## _vec_len, s__tmp, n__tmp) -#define __flatbuffers_define_default_scan_by_scalar_field(N, NK, TK)\ -static inline size_t N ## _vec_scan(N ## _vec_t vec__tmp, TK key__tmp)\ -{ return N ## _vec_scan_by_ ## NK(vec__tmp, key__tmp); }\ -static inline size_t N ## _vec_scan_ex(N ## _vec_t vec__tmp, size_t begin__tmp, size_t end__tmp, TK key__tmp)\ -{ return N ## _vec_scan_ex_by_ ## NK(vec__tmp, begin__tmp, end__tmp, key__tmp); }\ -static inline size_t N ## _vec_rscan(N ## _vec_t vec__tmp, TK key__tmp)\ -{ return N ## _vec_rscan_by_ ## NK(vec__tmp, key__tmp); }\ -static inline size_t N ## _vec_rscan_ex(N ## _vec_t vec__tmp, size_t begin__tmp, size_t end__tmp, TK key__tmp)\ -{ return N ## _vec_rscan_ex_by_ ## NK(vec__tmp, begin__tmp, end__tmp, key__tmp); } -#define __flatbuffers_define_default_scan_by_string_field(N, NK) \ -static inline size_t N ## _vec_scan(N ## _vec_t vec__tmp, const char *s__tmp)\ -{ return N ## _vec_scan_by_ ## NK(vec__tmp, s__tmp); }\ -static inline size_t N ## _vec_scan_n(N ## _vec_t vec__tmp, const char *s__tmp, int n__tmp)\ -{ return N ## _vec_scan_n_by_ ## NK(vec__tmp, s__tmp, n__tmp); }\ -static inline size_t N ## _vec_scan_ex(N ## _vec_t vec__tmp, size_t begin__tmp, size_t end__tmp, const char *s__tmp)\ -{ return N ## _vec_scan_ex_by_ ## NK(vec__tmp, begin__tmp, end__tmp, s__tmp); }\ -static inline size_t N ## _vec_scan_ex_n(N ## _vec_t vec__tmp, size_t begin__tmp, size_t end__tmp, const char *s__tmp, int n__tmp)\ -{ return N ## _vec_scan_ex_n_by_ ## NK(vec__tmp, begin__tmp, end__tmp, s__tmp, n__tmp); }\ -static inline size_t N ## _vec_rscan(N ## _vec_t vec__tmp, const char *s__tmp)\ -{ return N ## _vec_rscan_by_ ## NK(vec__tmp, s__tmp); }\ -static inline size_t N ## _vec_rscan_n(N ## _vec_t vec__tmp, const char *s__tmp, int n__tmp)\ -{ return N ## _vec_rscan_n_by_ ## NK(vec__tmp, s__tmp, n__tmp); }\ -static inline size_t N ## _vec_rscan_ex(N ## _vec_t vec__tmp, size_t begin__tmp, size_t end__tmp, const char *s__tmp)\ -{ return N ## _vec_rscan_ex_by_ ## NK(vec__tmp, begin__tmp, end__tmp, s__tmp); }\ -static inline size_t N ## _vec_rscan_ex_n(N ## _vec_t vec__tmp, size_t begin__tmp, size_t end__tmp, const char *s__tmp, int n__tmp)\ -{ return N ## _vec_rscan_ex_n_by_ ## NK(vec__tmp, begin__tmp, end__tmp, s__tmp, n__tmp); } -#define __flatbuffers_heap_sort(N, X, A, E, L, TK, TE, D, S)\ -static inline void __ ## N ## X ## __heap_sift_down(\ - N ## _mutable_vec_t vec__tmp, size_t start__tmp, size_t end__tmp)\ -{ size_t child__tmp, root__tmp; TK v1__tmp, v2__tmp, vroot__tmp;\ - root__tmp = start__tmp;\ - while ((root__tmp << 1) <= end__tmp) {\ - child__tmp = root__tmp << 1;\ - if (child__tmp < end__tmp) {\ - v1__tmp = A(E(vec__tmp, child__tmp));\ - v2__tmp = A(E(vec__tmp, child__tmp + 1));\ - if (D(v1__tmp, v2__tmp) < 0) {\ - child__tmp++;\ - }\ - }\ - vroot__tmp = A(E(vec__tmp, root__tmp));\ - v1__tmp = A(E(vec__tmp, child__tmp));\ - if (D(vroot__tmp, v1__tmp) < 0) {\ - S(vec__tmp, root__tmp, child__tmp, TE);\ - root__tmp = child__tmp;\ - } else {\ - return;\ - }\ - }\ -}\ -static inline void __ ## N ## X ## __heap_sort(N ## _mutable_vec_t vec__tmp)\ -{ size_t start__tmp, end__tmp, size__tmp;\ - size__tmp = L(vec__tmp); if (size__tmp == 0) return; end__tmp = size__tmp - 1; start__tmp = size__tmp >> 1;\ - do { __ ## N ## X ## __heap_sift_down(vec__tmp, start__tmp, end__tmp); } while (start__tmp--);\ - while (end__tmp > 0) { \ - S(vec__tmp, 0, end__tmp, TE);\ - __ ## N ## X ## __heap_sift_down(vec__tmp, 0, --end__tmp); } } -#define __flatbuffers_define_sort_by_field(N, NK, TK, TE, D, S)\ - __flatbuffers_heap_sort(N, _sort_by_ ## NK, N ## _ ## NK ## _get, N ## _vec_at, N ## _vec_len, TK, TE, D, S)\ -static inline void N ## _vec_sort_by_ ## NK(N ## _mutable_vec_t vec__tmp)\ -{ __ ## N ## _sort_by_ ## NK ## __heap_sort(vec__tmp); } -#define __flatbuffers_define_sort(N, TK, TE, D, S)\ -__flatbuffers_heap_sort(N, , __flatbuffers_identity, N ## _vec_at, N ## _vec_len, TK, TE, D, S)\ -static inline void N ## _vec_sort(N ## _mutable_vec_t vec__tmp) { __ ## N ## __heap_sort(vec__tmp); } -#define __flatbuffers_scalar_diff(x, y) ((x) < (y) ? -1 : (x) > (y)) -#define __flatbuffers_string_diff(x, y) __flatbuffers_string_n_cmp((x), (const char *)(y), flatbuffers_string_len(y)) -#define __flatbuffers_value_swap(vec, a, b, TE) { TE x__tmp = vec[b]; vec[b] = vec[a]; vec[a] = x__tmp; } -#define __flatbuffers_uoffset_swap(vec, a, b, TE)\ -{ TE ta__tmp, tb__tmp, d__tmp;\ - d__tmp = (TE)((a - b) * sizeof(vec[0]));\ - ta__tmp = __flatbuffers_uoffset_read_from_pe(vec + b) - d__tmp;\ - tb__tmp = __flatbuffers_uoffset_read_from_pe(vec + a) + d__tmp;\ - __flatbuffers_uoffset_write_to_pe(vec + a, ta__tmp);\ - __flatbuffers_uoffset_write_to_pe(vec + b, tb__tmp); } -#define __flatbuffers_scalar_swap(vec, a, b, TE) __flatbuffers_value_swap(vec, a, b, TE) -#define __flatbuffers_string_swap(vec, a, b, TE) __flatbuffers_uoffset_swap(vec, a, b, TE) -#define __flatbuffers_struct_swap(vec, a, b, TE) __flatbuffers_value_swap(vec, a, b, TE) -#define __flatbuffers_table_swap(vec, a, b, TE) __flatbuffers_uoffset_swap(vec, a, b, TE) -#define __flatbuffers_define_struct_sort_by_scalar_field(N, NK, TK, TE)\ - __flatbuffers_define_sort_by_field(N, NK, TK, TE, __flatbuffers_scalar_diff, __flatbuffers_struct_swap) -#define __flatbuffers_define_table_sort_by_scalar_field(N, NK, TK)\ - __flatbuffers_define_sort_by_field(N, NK, TK, flatbuffers_uoffset_t, __flatbuffers_scalar_diff, __flatbuffers_table_swap) -#define __flatbuffers_define_table_sort_by_string_field(N, NK)\ - __flatbuffers_define_sort_by_field(N, NK, flatbuffers_string_t, flatbuffers_uoffset_t, __flatbuffers_string_diff, __flatbuffers_table_swap) -#define __flatbuffers_define_scalar_sort(N, T) __flatbuffers_define_sort(N, T, T, __flatbuffers_scalar_diff, __flatbuffers_scalar_swap) -#define __flatbuffers_define_string_sort() __flatbuffers_define_sort(flatbuffers_string, flatbuffers_string_t, flatbuffers_uoffset_t, __flatbuffers_string_diff, __flatbuffers_string_swap) -#define __flatbuffers_sort_vector_field(N, NK, T, t)\ -{ T ## _mutable_vec_t v__tmp = (T ## _mutable_vec_t) N ## _ ## NK ## _get(t);\ - if (v__tmp) T ## _vec_sort(v__tmp); } -#define __flatbuffers_sort_table_field(N, NK, T, t)\ -{ T ## _sort((T ## _mutable_table_t)N ## _ ## NK ## _get(t)); } -#define __flatbuffers_sort_union_field(N, NK, T, t)\ -{ T ## _sort(T ## _mutable_union_cast(N ## _ ## NK ## _union(t))); } -#define __flatbuffers_sort_table_vector_field_elements(N, NK, T, t)\ -{ T ## _vec_t v__tmp = N ## _ ## NK ## _get(t); size_t i__tmp, n__tmp;\ - n__tmp = T ## _vec_len(v__tmp); for (i__tmp = 0; i__tmp < n__tmp; ++i__tmp) {\ - T ## _sort((T ## _mutable_table_t)T ## _vec_at(v__tmp, i__tmp)); }} -#define __flatbuffers_sort_union_vector_field_elements(N, NK, T, t)\ -{ T ## _union_vec_t v__tmp = N ## _ ## NK ## _union(t); size_t i__tmp, n__tmp;\ - n__tmp = T ## _union_vec_len(v__tmp); for (i__tmp = 0; i__tmp < n__tmp; ++i__tmp) {\ - T ## _sort(T ## _mutable_union_cast(T ## _union_vec_at(v__tmp, i__tmp))); }} -#define __flatbuffers_define_scalar_vector(N, T)\ -typedef const T *N ## _vec_t;\ -typedef T *N ## _mutable_vec_t;\ -__flatbuffers_define_scalar_vec_len(N)\ -__flatbuffers_define_scalar_vec_at(N, T)\ -__flatbuffers_define_scalar_find(N, T)\ -__flatbuffers_define_scalar_scan(N, T)\ -__flatbuffers_define_scalar_sort(N, T) - -#define __flatbuffers_define_integer_type(N, T, W)\ -__flatcc_define_integer_accessors(N, T, W, flatbuffers_endian)\ -__flatbuffers_define_scalar_vector(N, T) -__flatbuffers_define_scalar_vector(flatbuffers_bool, flatbuffers_bool_t) -__flatbuffers_define_scalar_vector(flatbuffers_char, char) -__flatbuffers_define_scalar_vector(flatbuffers_uint8, uint8_t) -__flatbuffers_define_scalar_vector(flatbuffers_int8, int8_t) -__flatbuffers_define_scalar_vector(flatbuffers_uint16, uint16_t) -__flatbuffers_define_scalar_vector(flatbuffers_int16, int16_t) -__flatbuffers_define_scalar_vector(flatbuffers_uint32, uint32_t) -__flatbuffers_define_scalar_vector(flatbuffers_int32, int32_t) -__flatbuffers_define_scalar_vector(flatbuffers_uint64, uint64_t) -__flatbuffers_define_scalar_vector(flatbuffers_int64, int64_t) -__flatbuffers_define_scalar_vector(flatbuffers_float, float) -__flatbuffers_define_scalar_vector(flatbuffers_double, double) -__flatbuffers_define_scalar_vector(flatbuffers_union_type, flatbuffers_union_type_t) -static inline size_t flatbuffers_string_vec_find(flatbuffers_string_vec_t vec, const char *s) -__flatbuffers_find_by_string_field(__flatbuffers_identity, vec, flatbuffers_string_vec_at, flatbuffers_string_vec_len, s) -static inline size_t flatbuffers_string_vec_find_n(flatbuffers_string_vec_t vec, const char *s, size_t n) -__flatbuffers_find_by_string_n_field(__flatbuffers_identity, vec, flatbuffers_string_vec_at, flatbuffers_string_vec_len, s, n) -static inline size_t flatbuffers_string_vec_scan(flatbuffers_string_vec_t vec, const char *s) -__flatbuffers_scan_by_string_field(0, flatbuffers_string_vec_len(vec), __flatbuffers_identity, vec, flatbuffers_string_vec_at, flatbuffers_string_vec_len, s) -static inline size_t flatbuffers_string_vec_scan_n(flatbuffers_string_vec_t vec, const char *s, size_t n) -__flatbuffers_scan_by_string_n_field(0, flatbuffers_string_vec_len(vec), __flatbuffers_identity, vec, flatbuffers_string_vec_at, flatbuffers_string_vec_len, s, n) -static inline size_t flatbuffers_string_vec_scan_ex(flatbuffers_string_vec_t vec, size_t begin, size_t end, const char *s) -__flatbuffers_scan_by_string_field(begin, __flatbuffers_min(end, flatbuffers_string_vec_len(vec)), __flatbuffers_identity, vec, flatbuffers_string_vec_at, flatbuffers_string_vec_len, s) -static inline size_t flatbuffers_string_vec_scan_ex_n(flatbuffers_string_vec_t vec, size_t begin, size_t end, const char *s, size_t n) -__flatbuffers_scan_by_string_n_field(begin, __flatbuffers_min(end, flatbuffers_string_vec_len(vec)), __flatbuffers_identity, vec, flatbuffers_string_vec_at, flatbuffers_string_vec_len, s, n) -static inline size_t flatbuffers_string_vec_rscan(flatbuffers_string_vec_t vec, const char *s) -__flatbuffers_rscan_by_string_field(0, flatbuffers_string_vec_len(vec), __flatbuffers_identity, vec, flatbuffers_string_vec_at, flatbuffers_string_vec_len, s) -static inline size_t flatbuffers_string_vec_rscan_n(flatbuffers_string_vec_t vec, const char *s, size_t n) -__flatbuffers_rscan_by_string_n_field(0, flatbuffers_string_vec_len(vec), __flatbuffers_identity, vec, flatbuffers_string_vec_at, flatbuffers_string_vec_len, s, n) -static inline size_t flatbuffers_string_vec_rscan_ex(flatbuffers_string_vec_t vec, size_t begin, size_t end, const char *s) -__flatbuffers_rscan_by_string_field(begin, __flatbuffers_min(end, flatbuffers_string_vec_len(vec)), __flatbuffers_identity, vec, flatbuffers_string_vec_at, flatbuffers_string_vec_len, s) -static inline size_t flatbuffers_string_vec_rscan_ex_n(flatbuffers_string_vec_t vec, size_t begin, size_t end, const char *s, size_t n) -__flatbuffers_rscan_by_string_n_field(begin, __flatbuffers_min(end, flatbuffers_string_vec_len(vec)), __flatbuffers_identity, vec, flatbuffers_string_vec_at, flatbuffers_string_vec_len, s, n) -__flatbuffers_define_string_sort() -#define __flatbuffers_define_struct_scalar_fixed_array_field(N, NK, TK, T, L)\ -static inline T N ## _ ## NK ## _get(N ## _struct_t t__tmp, size_t i__tmp)\ -{ if (!t__tmp || i__tmp >= L) return 0;\ - return __flatbuffers_read_scalar(TK, &(t__tmp->NK[i__tmp])); }\ -static inline const T *N ## _ ## NK ## _get_ptr(N ## _struct_t t__tmp)\ -{ return t__tmp ? t__tmp->NK : 0; }\ -static inline size_t N ## _ ## NK ## _get_len(void) { return L; }\ -static inline T N ## _ ## NK (N ## _struct_t t__tmp, size_t i__tmp)\ -{ return N ## _ ## NK ## _get(t__tmp, i__tmp); } -#define __flatbuffers_define_struct_struct_fixed_array_field(N, NK, T, L)\ -static inline T N ## _ ## NK ## _get(N ## _struct_t t__tmp, size_t i__tmp)\ -{ if (!t__tmp || i__tmp >= L) return 0; return t__tmp->NK + i__tmp; }static inline T N ## _ ## NK ## _get_ptr(N ## _struct_t t__tmp)\ -{ return t__tmp ? t__tmp->NK : 0; }\ -static inline size_t N ## _ ## NK ## _get_len(void) { return L; }\ -static inline T N ## _ ## NK(N ## _struct_t t__tmp, size_t i__tmp)\ -{ if (!t__tmp || i__tmp >= L) return 0; return t__tmp->NK + i__tmp; } -#define __flatbuffers_define_struct_scalar_field(N, NK, TK, T)\ -static inline T N ## _ ## NK ## _get(N ## _struct_t t__tmp)\ -{ return t__tmp ? __flatbuffers_read_scalar(TK, &(t__tmp->NK)) : 0; }\ -static inline const T *N ## _ ## NK ## _get_ptr(N ## _struct_t t__tmp)\ -{ return t__tmp ? &(t__tmp->NK) : 0; }\ -static inline T N ## _ ## NK (N ## _struct_t t__tmp)\ -{ return t__tmp ? __flatbuffers_read_scalar(TK, &(t__tmp->NK)) : 0; }\ -__flatbuffers_define_scan_by_scalar_field(N, NK, T) -#define __flatbuffers_define_struct_struct_field(N, NK, T)\ -static inline T N ## _ ## NK ## _get(N ## _struct_t t__tmp) { return t__tmp ? &(t__tmp->NK) : 0; }\ -static inline T N ## _ ## NK (N ## _struct_t t__tmp) { return t__tmp ? &(t__tmp->NK) : 0; } -/* If fid is null, the function returns true without testing as buffer is not expected to have any id. */ -static inline int flatbuffers_has_identifier(const void *buffer, const char *fid) -{ flatbuffers_thash_t id, id2 = 0; if (fid == 0) { return 1; }; - id2 = flatbuffers_type_hash_from_string(fid); - id = __flatbuffers_thash_read_from_pe(((flatbuffers_uoffset_t *)buffer) + 1); - return id2 == 0 || id == id2; } -static inline int flatbuffers_has_type_hash(const void *buffer, flatbuffers_thash_t thash) -{ return thash == 0 || (__flatbuffers_thash_read_from_pe((flatbuffers_uoffset_t *)buffer + 1) == thash); } - -static inline flatbuffers_thash_t flatbuffers_get_type_hash(const void *buffer) -{ return __flatbuffers_thash_read_from_pe((flatbuffers_uoffset_t *)buffer + 1); } - -#define flatbuffers_verify_endian() flatbuffers_has_identifier("\x00\x00\x00\x00" "1234", "1234") -static inline void *flatbuffers_read_size_prefix(void *b, size_t *size_out) -{ if (size_out) { *size_out = (size_t)__flatbuffers_uoffset_read_from_pe(b); } - return (uint8_t *)b + sizeof(flatbuffers_uoffset_t); } -/* Null file identifier accepts anything, otherwise fid should be 4 characters. */ -#define __flatbuffers_read_root(T, K, buffer, fid)\ - ((!buffer || !flatbuffers_has_identifier(buffer, fid)) ? 0 :\ - ((T ## _ ## K ## t)(((uint8_t *)buffer) +\ - __flatbuffers_uoffset_read_from_pe(buffer)))) -#define __flatbuffers_read_typed_root(T, K, buffer, thash)\ - ((!buffer || !flatbuffers_has_type_hash(buffer, thash)) ? 0 :\ - ((T ## _ ## K ## t)(((uint8_t *)buffer) +\ - __flatbuffers_uoffset_read_from_pe(buffer)))) -#define __flatbuffers_nested_buffer_as_root(C, N, T, K)\ -static inline T ## _ ## K ## t C ## _ ## N ## _as_root_with_identifier(C ## _ ## table_t t__tmp, const char *fid__tmp)\ -{ const uint8_t *buffer__tmp = C ## _ ## N(t__tmp); return __flatbuffers_read_root(T, K, buffer__tmp, fid__tmp); }\ -static inline T ## _ ## K ## t C ## _ ## N ## _as_typed_root(C ## _ ## table_t t__tmp)\ -{ const uint8_t *buffer__tmp = C ## _ ## N(t__tmp); return __flatbuffers_read_root(T, K, buffer__tmp, C ## _ ## type_identifier); }\ -static inline T ## _ ## K ## t C ## _ ## N ## _as_root(C ## _ ## table_t t__tmp)\ -{ const char *fid__tmp = T ## _identifier;\ - const uint8_t *buffer__tmp = C ## _ ## N(t__tmp); return __flatbuffers_read_root(T, K, buffer__tmp, fid__tmp); } -#define __flatbuffers_buffer_as_root(N, K)\ -static inline N ## _ ## K ## t N ## _as_root_with_identifier(const void *buffer__tmp, const char *fid__tmp)\ -{ return __flatbuffers_read_root(N, K, buffer__tmp, fid__tmp); }\ -static inline N ## _ ## K ## t N ## _as_root_with_type_hash(const void *buffer__tmp, flatbuffers_thash_t thash__tmp)\ -{ return __flatbuffers_read_typed_root(N, K, buffer__tmp, thash__tmp); }\ -static inline N ## _ ## K ## t N ## _as_root(const void *buffer__tmp)\ -{ const char *fid__tmp = N ## _identifier;\ - return __flatbuffers_read_root(N, K, buffer__tmp, fid__tmp); }\ -static inline N ## _ ## K ## t N ## _as_typed_root(const void *buffer__tmp)\ -{ return __flatbuffers_read_typed_root(N, K, buffer__tmp, N ## _type_hash); } -#define __flatbuffers_struct_as_root(N) __flatbuffers_buffer_as_root(N, struct_) -#define __flatbuffers_table_as_root(N) __flatbuffers_buffer_as_root(N, table_) - -#include "flatcc/flatcc_epilogue.h" -#endif /* FLATBUFFERS_COMMON_H */ diff --git a/flatccrt/include/flatcc/reflection/reflection_builder.h b/flatccrt/include/flatcc/reflection/reflection_builder.h deleted file mode 100644 index 9b8248d..0000000 --- a/flatccrt/include/flatcc/reflection/reflection_builder.h +++ /dev/null @@ -1,344 +0,0 @@ -#ifndef REFLECTION_BUILDER_H -#define REFLECTION_BUILDER_H - -/* Generated by flatcc 0.6.0 FlatBuffers schema compiler for C by dvide.com */ - -#ifndef REFLECTION_READER_H -#include "reflection_reader.h" -#endif -#ifndef FLATBUFFERS_COMMON_BUILDER_H -#include "flatbuffers_common_builder.h" -#endif -#include "flatcc/flatcc_prologue.h" -#undef flatbuffers_identifier -#define flatbuffers_identifier "BFBS" -#undef flatbuffers_extension -#define flatbuffers_extension ".bfbs" - -#define __reflection_BaseType_formal_args , reflection_BaseType_enum_t v0 -#define __reflection_BaseType_call_args , v0 -__flatbuffers_build_scalar(flatbuffers_, reflection_BaseType, reflection_BaseType_enum_t) - -static const flatbuffers_voffset_t __reflection_Type_required[] = { 0 }; -typedef flatbuffers_ref_t reflection_Type_ref_t; -static reflection_Type_ref_t reflection_Type_clone(flatbuffers_builder_t *B, reflection_Type_table_t t); -__flatbuffers_build_table(flatbuffers_, reflection_Type, 4) - -static const flatbuffers_voffset_t __reflection_KeyValue_required[] = { 0, 0 }; -typedef flatbuffers_ref_t reflection_KeyValue_ref_t; -static reflection_KeyValue_ref_t reflection_KeyValue_clone(flatbuffers_builder_t *B, reflection_KeyValue_table_t t); -__flatbuffers_build_table(flatbuffers_, reflection_KeyValue, 2) - -static const flatbuffers_voffset_t __reflection_EnumVal_required[] = { 0, 0 }; -typedef flatbuffers_ref_t reflection_EnumVal_ref_t; -static reflection_EnumVal_ref_t reflection_EnumVal_clone(flatbuffers_builder_t *B, reflection_EnumVal_table_t t); -__flatbuffers_build_table(flatbuffers_, reflection_EnumVal, 4) - -static const flatbuffers_voffset_t __reflection_Enum_required[] = { 0, 1, 3, 0 }; -typedef flatbuffers_ref_t reflection_Enum_ref_t; -static reflection_Enum_ref_t reflection_Enum_clone(flatbuffers_builder_t *B, reflection_Enum_table_t t); -__flatbuffers_build_table(flatbuffers_, reflection_Enum, 5) - -static const flatbuffers_voffset_t __reflection_Field_required[] = { 0, 1, 0 }; -typedef flatbuffers_ref_t reflection_Field_ref_t; -static reflection_Field_ref_t reflection_Field_clone(flatbuffers_builder_t *B, reflection_Field_table_t t); -__flatbuffers_build_table(flatbuffers_, reflection_Field, 10) - -static const flatbuffers_voffset_t __reflection_Object_required[] = { 0, 1, 0 }; -typedef flatbuffers_ref_t reflection_Object_ref_t; -static reflection_Object_ref_t reflection_Object_clone(flatbuffers_builder_t *B, reflection_Object_table_t t); -__flatbuffers_build_table(flatbuffers_, reflection_Object, 6) - -static const flatbuffers_voffset_t __reflection_Schema_required[] = { 0, 1, 0 }; -typedef flatbuffers_ref_t reflection_Schema_ref_t; -static reflection_Schema_ref_t reflection_Schema_clone(flatbuffers_builder_t *B, reflection_Schema_table_t t); -__flatbuffers_build_table(flatbuffers_, reflection_Schema, 5) - -#define __reflection_Type_formal_args , reflection_BaseType_enum_t v0, reflection_BaseType_enum_t v1, int32_t v2, uint16_t v3 -#define __reflection_Type_call_args , v0, v1, v2, v3 -static inline reflection_Type_ref_t reflection_Type_create(flatbuffers_builder_t *B __reflection_Type_formal_args); -__flatbuffers_build_table_prolog(flatbuffers_, reflection_Type, reflection_Type_identifier, reflection_Type_type_identifier) - -#define __reflection_KeyValue_formal_args , flatbuffers_string_ref_t v0, flatbuffers_string_ref_t v1 -#define __reflection_KeyValue_call_args , v0, v1 -static inline reflection_KeyValue_ref_t reflection_KeyValue_create(flatbuffers_builder_t *B __reflection_KeyValue_formal_args); -__flatbuffers_build_table_prolog(flatbuffers_, reflection_KeyValue, reflection_KeyValue_identifier, reflection_KeyValue_type_identifier) - -#define __reflection_EnumVal_formal_args , flatbuffers_string_ref_t v0, int64_t v1, reflection_Object_ref_t v2, reflection_Type_ref_t v3 -#define __reflection_EnumVal_call_args , v0, v1, v2, v3 -static inline reflection_EnumVal_ref_t reflection_EnumVal_create(flatbuffers_builder_t *B __reflection_EnumVal_formal_args); -__flatbuffers_build_table_prolog(flatbuffers_, reflection_EnumVal, reflection_EnumVal_identifier, reflection_EnumVal_type_identifier) - -#define __reflection_Enum_formal_args ,\ - flatbuffers_string_ref_t v0, reflection_EnumVal_vec_ref_t v1, flatbuffers_bool_t v2, reflection_Type_ref_t v3, reflection_KeyValue_vec_ref_t v4 -#define __reflection_Enum_call_args ,\ - v0, v1, v2, v3, v4 -static inline reflection_Enum_ref_t reflection_Enum_create(flatbuffers_builder_t *B __reflection_Enum_formal_args); -__flatbuffers_build_table_prolog(flatbuffers_, reflection_Enum, reflection_Enum_identifier, reflection_Enum_type_identifier) - -#define __reflection_Field_formal_args ,\ - flatbuffers_string_ref_t v0, reflection_Type_ref_t v1, uint16_t v2, uint16_t v3,\ - int64_t v4, double v5, flatbuffers_bool_t v6, flatbuffers_bool_t v7, flatbuffers_bool_t v8, reflection_KeyValue_vec_ref_t v9 -#define __reflection_Field_call_args ,\ - v0, v1, v2, v3,\ - v4, v5, v6, v7, v8, v9 -static inline reflection_Field_ref_t reflection_Field_create(flatbuffers_builder_t *B __reflection_Field_formal_args); -__flatbuffers_build_table_prolog(flatbuffers_, reflection_Field, reflection_Field_identifier, reflection_Field_type_identifier) - -#define __reflection_Object_formal_args ,\ - flatbuffers_string_ref_t v0, reflection_Field_vec_ref_t v1, flatbuffers_bool_t v2, int32_t v3, int32_t v4, reflection_KeyValue_vec_ref_t v5 -#define __reflection_Object_call_args ,\ - v0, v1, v2, v3, v4, v5 -static inline reflection_Object_ref_t reflection_Object_create(flatbuffers_builder_t *B __reflection_Object_formal_args); -__flatbuffers_build_table_prolog(flatbuffers_, reflection_Object, reflection_Object_identifier, reflection_Object_type_identifier) - -#define __reflection_Schema_formal_args ,\ - reflection_Object_vec_ref_t v0, reflection_Enum_vec_ref_t v1, flatbuffers_string_ref_t v2, flatbuffers_string_ref_t v3, reflection_Object_ref_t v4 -#define __reflection_Schema_call_args ,\ - v0, v1, v2, v3, v4 -static inline reflection_Schema_ref_t reflection_Schema_create(flatbuffers_builder_t *B __reflection_Schema_formal_args); -__flatbuffers_build_table_prolog(flatbuffers_, reflection_Schema, reflection_Schema_identifier, reflection_Schema_type_identifier) - -__flatbuffers_build_scalar_field(0, flatbuffers_, reflection_Type_base_type, reflection_BaseType, reflection_BaseType_enum_t, 1, 1, INT8_C(0), reflection_Type) -__flatbuffers_build_scalar_field(1, flatbuffers_, reflection_Type_element, reflection_BaseType, reflection_BaseType_enum_t, 1, 1, INT8_C(0), reflection_Type) -__flatbuffers_build_scalar_field(2, flatbuffers_, reflection_Type_index, flatbuffers_int32, int32_t, 4, 4, INT32_C(-1), reflection_Type) -__flatbuffers_build_scalar_field(3, flatbuffers_, reflection_Type_fixed_length, flatbuffers_uint16, uint16_t, 2, 2, UINT16_C(0), reflection_Type) - -static inline reflection_Type_ref_t reflection_Type_create(flatbuffers_builder_t *B __reflection_Type_formal_args) -{ - if (reflection_Type_start(B) - || reflection_Type_index_add(B, v2) - || reflection_Type_fixed_length_add(B, v3) - || reflection_Type_base_type_add(B, v0) - || reflection_Type_element_add(B, v1)) { - return 0; - } - return reflection_Type_end(B); -} - -static reflection_Type_ref_t reflection_Type_clone(flatbuffers_builder_t *B, reflection_Type_table_t t) -{ - __flatbuffers_memoize_begin(B, t); - if (reflection_Type_start(B) - || reflection_Type_index_pick(B, t) - || reflection_Type_fixed_length_pick(B, t) - || reflection_Type_base_type_pick(B, t) - || reflection_Type_element_pick(B, t)) { - return 0; - } - __flatbuffers_memoize_end(B, t, reflection_Type_end(B)); -} - -__flatbuffers_build_string_field(0, flatbuffers_, reflection_KeyValue_key, reflection_KeyValue) -__flatbuffers_build_string_field(1, flatbuffers_, reflection_KeyValue_value, reflection_KeyValue) - -static inline reflection_KeyValue_ref_t reflection_KeyValue_create(flatbuffers_builder_t *B __reflection_KeyValue_formal_args) -{ - if (reflection_KeyValue_start(B) - || reflection_KeyValue_key_add(B, v0) - || reflection_KeyValue_value_add(B, v1)) { - return 0; - } - return reflection_KeyValue_end(B); -} - -static reflection_KeyValue_ref_t reflection_KeyValue_clone(flatbuffers_builder_t *B, reflection_KeyValue_table_t t) -{ - __flatbuffers_memoize_begin(B, t); - if (reflection_KeyValue_start(B) - || reflection_KeyValue_key_pick(B, t) - || reflection_KeyValue_value_pick(B, t)) { - return 0; - } - __flatbuffers_memoize_end(B, t, reflection_KeyValue_end(B)); -} - -__flatbuffers_build_string_field(0, flatbuffers_, reflection_EnumVal_name, reflection_EnumVal) -__flatbuffers_build_scalar_field(1, flatbuffers_, reflection_EnumVal_value, flatbuffers_int64, int64_t, 8, 8, INT64_C(0), reflection_EnumVal) -__flatbuffers_build_table_field(2, flatbuffers_, reflection_EnumVal_object, reflection_Object, reflection_EnumVal) -__flatbuffers_build_table_field(3, flatbuffers_, reflection_EnumVal_union_type, reflection_Type, reflection_EnumVal) - -static inline reflection_EnumVal_ref_t reflection_EnumVal_create(flatbuffers_builder_t *B __reflection_EnumVal_formal_args) -{ - if (reflection_EnumVal_start(B) - || reflection_EnumVal_value_add(B, v1) - || reflection_EnumVal_name_add(B, v0) - || reflection_EnumVal_object_add(B, v2) - || reflection_EnumVal_union_type_add(B, v3)) { - return 0; - } - return reflection_EnumVal_end(B); -} - -static reflection_EnumVal_ref_t reflection_EnumVal_clone(flatbuffers_builder_t *B, reflection_EnumVal_table_t t) -{ - __flatbuffers_memoize_begin(B, t); - if (reflection_EnumVal_start(B) - || reflection_EnumVal_value_pick(B, t) - || reflection_EnumVal_name_pick(B, t) - || reflection_EnumVal_object_pick(B, t) - || reflection_EnumVal_union_type_pick(B, t)) { - return 0; - } - __flatbuffers_memoize_end(B, t, reflection_EnumVal_end(B)); -} - -__flatbuffers_build_string_field(0, flatbuffers_, reflection_Enum_name, reflection_Enum) -/* vector has keyed elements */ -__flatbuffers_build_table_vector_field(1, flatbuffers_, reflection_Enum_values, reflection_EnumVal, reflection_Enum) -__flatbuffers_build_scalar_field(2, flatbuffers_, reflection_Enum_is_union, flatbuffers_bool, flatbuffers_bool_t, 1, 1, UINT8_C(0), reflection_Enum) -__flatbuffers_build_table_field(3, flatbuffers_, reflection_Enum_underlying_type, reflection_Type, reflection_Enum) -/* vector has keyed elements */ -__flatbuffers_build_table_vector_field(4, flatbuffers_, reflection_Enum_attributes, reflection_KeyValue, reflection_Enum) - -static inline reflection_Enum_ref_t reflection_Enum_create(flatbuffers_builder_t *B __reflection_Enum_formal_args) -{ - if (reflection_Enum_start(B) - || reflection_Enum_name_add(B, v0) - || reflection_Enum_values_add(B, v1) - || reflection_Enum_underlying_type_add(B, v3) - || reflection_Enum_attributes_add(B, v4) - || reflection_Enum_is_union_add(B, v2)) { - return 0; - } - return reflection_Enum_end(B); -} - -static reflection_Enum_ref_t reflection_Enum_clone(flatbuffers_builder_t *B, reflection_Enum_table_t t) -{ - __flatbuffers_memoize_begin(B, t); - if (reflection_Enum_start(B) - || reflection_Enum_name_pick(B, t) - || reflection_Enum_values_pick(B, t) - || reflection_Enum_underlying_type_pick(B, t) - || reflection_Enum_attributes_pick(B, t) - || reflection_Enum_is_union_pick(B, t)) { - return 0; - } - __flatbuffers_memoize_end(B, t, reflection_Enum_end(B)); -} - -__flatbuffers_build_string_field(0, flatbuffers_, reflection_Field_name, reflection_Field) -__flatbuffers_build_table_field(1, flatbuffers_, reflection_Field_type, reflection_Type, reflection_Field) -__flatbuffers_build_scalar_field(2, flatbuffers_, reflection_Field_id, flatbuffers_uint16, uint16_t, 2, 2, UINT16_C(0), reflection_Field) -__flatbuffers_build_scalar_field(3, flatbuffers_, reflection_Field_offset, flatbuffers_uint16, uint16_t, 2, 2, UINT16_C(0), reflection_Field) -__flatbuffers_build_scalar_field(4, flatbuffers_, reflection_Field_default_integer, flatbuffers_int64, int64_t, 8, 8, INT64_C(0), reflection_Field) -__flatbuffers_build_scalar_field(5, flatbuffers_, reflection_Field_default_real, flatbuffers_double, double, 8, 8, 0.000000, reflection_Field) -__flatbuffers_build_scalar_field(6, flatbuffers_, reflection_Field_deprecated, flatbuffers_bool, flatbuffers_bool_t, 1, 1, UINT8_C(0), reflection_Field) -__flatbuffers_build_scalar_field(7, flatbuffers_, reflection_Field_required, flatbuffers_bool, flatbuffers_bool_t, 1, 1, UINT8_C(0), reflection_Field) -__flatbuffers_build_scalar_field(8, flatbuffers_, reflection_Field_key, flatbuffers_bool, flatbuffers_bool_t, 1, 1, UINT8_C(0), reflection_Field) -/* vector has keyed elements */ -__flatbuffers_build_table_vector_field(9, flatbuffers_, reflection_Field_attributes, reflection_KeyValue, reflection_Field) - -static inline reflection_Field_ref_t reflection_Field_create(flatbuffers_builder_t *B __reflection_Field_formal_args) -{ - if (reflection_Field_start(B) - || reflection_Field_default_integer_add(B, v4) - || reflection_Field_default_real_add(B, v5) - || reflection_Field_name_add(B, v0) - || reflection_Field_type_add(B, v1) - || reflection_Field_attributes_add(B, v9) - || reflection_Field_id_add(B, v2) - || reflection_Field_offset_add(B, v3) - || reflection_Field_deprecated_add(B, v6) - || reflection_Field_required_add(B, v7) - || reflection_Field_key_add(B, v8)) { - return 0; - } - return reflection_Field_end(B); -} - -static reflection_Field_ref_t reflection_Field_clone(flatbuffers_builder_t *B, reflection_Field_table_t t) -{ - __flatbuffers_memoize_begin(B, t); - if (reflection_Field_start(B) - || reflection_Field_default_integer_pick(B, t) - || reflection_Field_default_real_pick(B, t) - || reflection_Field_name_pick(B, t) - || reflection_Field_type_pick(B, t) - || reflection_Field_attributes_pick(B, t) - || reflection_Field_id_pick(B, t) - || reflection_Field_offset_pick(B, t) - || reflection_Field_deprecated_pick(B, t) - || reflection_Field_required_pick(B, t) - || reflection_Field_key_pick(B, t)) { - return 0; - } - __flatbuffers_memoize_end(B, t, reflection_Field_end(B)); -} - -__flatbuffers_build_string_field(0, flatbuffers_, reflection_Object_name, reflection_Object) -/* vector has keyed elements */ -__flatbuffers_build_table_vector_field(1, flatbuffers_, reflection_Object_fields, reflection_Field, reflection_Object) -__flatbuffers_build_scalar_field(2, flatbuffers_, reflection_Object_is_struct, flatbuffers_bool, flatbuffers_bool_t, 1, 1, UINT8_C(0), reflection_Object) -__flatbuffers_build_scalar_field(3, flatbuffers_, reflection_Object_minalign, flatbuffers_int32, int32_t, 4, 4, INT32_C(0), reflection_Object) -__flatbuffers_build_scalar_field(4, flatbuffers_, reflection_Object_bytesize, flatbuffers_int32, int32_t, 4, 4, INT32_C(0), reflection_Object) -/* vector has keyed elements */ -__flatbuffers_build_table_vector_field(5, flatbuffers_, reflection_Object_attributes, reflection_KeyValue, reflection_Object) - -static inline reflection_Object_ref_t reflection_Object_create(flatbuffers_builder_t *B __reflection_Object_formal_args) -{ - if (reflection_Object_start(B) - || reflection_Object_name_add(B, v0) - || reflection_Object_fields_add(B, v1) - || reflection_Object_minalign_add(B, v3) - || reflection_Object_bytesize_add(B, v4) - || reflection_Object_attributes_add(B, v5) - || reflection_Object_is_struct_add(B, v2)) { - return 0; - } - return reflection_Object_end(B); -} - -static reflection_Object_ref_t reflection_Object_clone(flatbuffers_builder_t *B, reflection_Object_table_t t) -{ - __flatbuffers_memoize_begin(B, t); - if (reflection_Object_start(B) - || reflection_Object_name_pick(B, t) - || reflection_Object_fields_pick(B, t) - || reflection_Object_minalign_pick(B, t) - || reflection_Object_bytesize_pick(B, t) - || reflection_Object_attributes_pick(B, t) - || reflection_Object_is_struct_pick(B, t)) { - return 0; - } - __flatbuffers_memoize_end(B, t, reflection_Object_end(B)); -} - -/* vector has keyed elements */ -__flatbuffers_build_table_vector_field(0, flatbuffers_, reflection_Schema_objects, reflection_Object, reflection_Schema) -/* vector has keyed elements */ -__flatbuffers_build_table_vector_field(1, flatbuffers_, reflection_Schema_enums, reflection_Enum, reflection_Schema) -__flatbuffers_build_string_field(2, flatbuffers_, reflection_Schema_file_ident, reflection_Schema) -__flatbuffers_build_string_field(3, flatbuffers_, reflection_Schema_file_ext, reflection_Schema) -__flatbuffers_build_table_field(4, flatbuffers_, reflection_Schema_root_table, reflection_Object, reflection_Schema) - -static inline reflection_Schema_ref_t reflection_Schema_create(flatbuffers_builder_t *B __reflection_Schema_formal_args) -{ - if (reflection_Schema_start(B) - || reflection_Schema_objects_add(B, v0) - || reflection_Schema_enums_add(B, v1) - || reflection_Schema_file_ident_add(B, v2) - || reflection_Schema_file_ext_add(B, v3) - || reflection_Schema_root_table_add(B, v4)) { - return 0; - } - return reflection_Schema_end(B); -} - -static reflection_Schema_ref_t reflection_Schema_clone(flatbuffers_builder_t *B, reflection_Schema_table_t t) -{ - __flatbuffers_memoize_begin(B, t); - if (reflection_Schema_start(B) - || reflection_Schema_objects_pick(B, t) - || reflection_Schema_enums_pick(B, t) - || reflection_Schema_file_ident_pick(B, t) - || reflection_Schema_file_ext_pick(B, t) - || reflection_Schema_root_table_pick(B, t)) { - return 0; - } - __flatbuffers_memoize_end(B, t, reflection_Schema_end(B)); -} - -#include "flatcc/flatcc_epilogue.h" -#endif /* REFLECTION_BUILDER_H */ diff --git a/flatccrt/include/flatcc/reflection/reflection_reader.h b/flatccrt/include/flatcc/reflection/reflection_reader.h deleted file mode 100644 index ef40337..0000000 --- a/flatccrt/include/flatcc/reflection/reflection_reader.h +++ /dev/null @@ -1,284 +0,0 @@ -#ifndef REFLECTION_READER_H -#define REFLECTION_READER_H - -/* Generated by flatcc 0.6.0 FlatBuffers schema compiler for C by dvide.com */ - -#ifndef FLATBUFFERS_COMMON_READER_H -#include "flatbuffers_common_reader.h" -#endif -#include "flatcc/flatcc_flatbuffers.h" -#ifndef __alignas_is_defined -#include -#endif -#include "flatcc/flatcc_prologue.h" -#undef flatbuffers_identifier -#define flatbuffers_identifier "BFBS" -#undef flatbuffers_extension -#define flatbuffers_extension ".bfbs" - - -typedef const struct reflection_Type_table *reflection_Type_table_t; -typedef struct reflection_Type_table *reflection_Type_mutable_table_t; -typedef const flatbuffers_uoffset_t *reflection_Type_vec_t; -typedef flatbuffers_uoffset_t *reflection_Type_mutable_vec_t; -typedef const struct reflection_KeyValue_table *reflection_KeyValue_table_t; -typedef struct reflection_KeyValue_table *reflection_KeyValue_mutable_table_t; -typedef const flatbuffers_uoffset_t *reflection_KeyValue_vec_t; -typedef flatbuffers_uoffset_t *reflection_KeyValue_mutable_vec_t; -typedef const struct reflection_EnumVal_table *reflection_EnumVal_table_t; -typedef struct reflection_EnumVal_table *reflection_EnumVal_mutable_table_t; -typedef const flatbuffers_uoffset_t *reflection_EnumVal_vec_t; -typedef flatbuffers_uoffset_t *reflection_EnumVal_mutable_vec_t; -typedef const struct reflection_Enum_table *reflection_Enum_table_t; -typedef struct reflection_Enum_table *reflection_Enum_mutable_table_t; -typedef const flatbuffers_uoffset_t *reflection_Enum_vec_t; -typedef flatbuffers_uoffset_t *reflection_Enum_mutable_vec_t; -typedef const struct reflection_Field_table *reflection_Field_table_t; -typedef struct reflection_Field_table *reflection_Field_mutable_table_t; -typedef const flatbuffers_uoffset_t *reflection_Field_vec_t; -typedef flatbuffers_uoffset_t *reflection_Field_mutable_vec_t; -typedef const struct reflection_Object_table *reflection_Object_table_t; -typedef struct reflection_Object_table *reflection_Object_mutable_table_t; -typedef const flatbuffers_uoffset_t *reflection_Object_vec_t; -typedef flatbuffers_uoffset_t *reflection_Object_mutable_vec_t; -typedef const struct reflection_Schema_table *reflection_Schema_table_t; -typedef struct reflection_Schema_table *reflection_Schema_mutable_table_t; -typedef const flatbuffers_uoffset_t *reflection_Schema_vec_t; -typedef flatbuffers_uoffset_t *reflection_Schema_mutable_vec_t; -#ifndef reflection_Type_identifier -#define reflection_Type_identifier flatbuffers_identifier -#endif -#define reflection_Type_type_hash ((flatbuffers_thash_t)0x44c8fe5e) -#define reflection_Type_type_identifier "\x5e\xfe\xc8\x44" -#ifndef reflection_KeyValue_identifier -#define reflection_KeyValue_identifier flatbuffers_identifier -#endif -#define reflection_KeyValue_type_hash ((flatbuffers_thash_t)0x8c761eaa) -#define reflection_KeyValue_type_identifier "\xaa\x1e\x76\x8c" -#ifndef reflection_EnumVal_identifier -#define reflection_EnumVal_identifier flatbuffers_identifier -#endif -#define reflection_EnumVal_type_hash ((flatbuffers_thash_t)0x9531c946) -#define reflection_EnumVal_type_identifier "\x46\xc9\x31\x95" -#ifndef reflection_Enum_identifier -#define reflection_Enum_identifier flatbuffers_identifier -#endif -#define reflection_Enum_type_hash ((flatbuffers_thash_t)0xacffa90f) -#define reflection_Enum_type_identifier "\x0f\xa9\xff\xac" -#ifndef reflection_Field_identifier -#define reflection_Field_identifier flatbuffers_identifier -#endif -#define reflection_Field_type_hash ((flatbuffers_thash_t)0x9f7e408a) -#define reflection_Field_type_identifier "\x8a\x40\x7e\x9f" -#ifndef reflection_Object_identifier -#define reflection_Object_identifier flatbuffers_identifier -#endif -#define reflection_Object_type_hash ((flatbuffers_thash_t)0xb09729bd) -#define reflection_Object_type_identifier "\xbd\x29\x97\xb0" -#ifndef reflection_Schema_identifier -#define reflection_Schema_identifier flatbuffers_identifier -#endif -#define reflection_Schema_type_hash ((flatbuffers_thash_t)0xfaf93779) -#define reflection_Schema_type_identifier "\x79\x37\xf9\xfa" - -typedef int8_t reflection_BaseType_enum_t; -__flatbuffers_define_integer_type(reflection_BaseType, reflection_BaseType_enum_t, 8) -#define reflection_BaseType_None ((reflection_BaseType_enum_t)INT8_C(0)) -#define reflection_BaseType_UType ((reflection_BaseType_enum_t)INT8_C(1)) -#define reflection_BaseType_Bool ((reflection_BaseType_enum_t)INT8_C(2)) -#define reflection_BaseType_Byte ((reflection_BaseType_enum_t)INT8_C(3)) -#define reflection_BaseType_UByte ((reflection_BaseType_enum_t)INT8_C(4)) -#define reflection_BaseType_Short ((reflection_BaseType_enum_t)INT8_C(5)) -#define reflection_BaseType_UShort ((reflection_BaseType_enum_t)INT8_C(6)) -#define reflection_BaseType_Int ((reflection_BaseType_enum_t)INT8_C(7)) -#define reflection_BaseType_UInt ((reflection_BaseType_enum_t)INT8_C(8)) -#define reflection_BaseType_Long ((reflection_BaseType_enum_t)INT8_C(9)) -#define reflection_BaseType_ULong ((reflection_BaseType_enum_t)INT8_C(10)) -#define reflection_BaseType_Float ((reflection_BaseType_enum_t)INT8_C(11)) -#define reflection_BaseType_Double ((reflection_BaseType_enum_t)INT8_C(12)) -#define reflection_BaseType_String ((reflection_BaseType_enum_t)INT8_C(13)) -#define reflection_BaseType_Vector ((reflection_BaseType_enum_t)INT8_C(14)) -#define reflection_BaseType_Obj ((reflection_BaseType_enum_t)INT8_C(15)) -#define reflection_BaseType_Union ((reflection_BaseType_enum_t)INT8_C(16)) -#define reflection_BaseType_Array ((reflection_BaseType_enum_t)INT8_C(17)) - -static inline const char *reflection_BaseType_name(reflection_BaseType_enum_t value) -{ - switch (value) { - case reflection_BaseType_None: return "None"; - case reflection_BaseType_UType: return "UType"; - case reflection_BaseType_Bool: return "Bool"; - case reflection_BaseType_Byte: return "Byte"; - case reflection_BaseType_UByte: return "UByte"; - case reflection_BaseType_Short: return "Short"; - case reflection_BaseType_UShort: return "UShort"; - case reflection_BaseType_Int: return "Int"; - case reflection_BaseType_UInt: return "UInt"; - case reflection_BaseType_Long: return "Long"; - case reflection_BaseType_ULong: return "ULong"; - case reflection_BaseType_Float: return "Float"; - case reflection_BaseType_Double: return "Double"; - case reflection_BaseType_String: return "String"; - case reflection_BaseType_Vector: return "Vector"; - case reflection_BaseType_Obj: return "Obj"; - case reflection_BaseType_Union: return "Union"; - case reflection_BaseType_Array: return "Array"; - default: return ""; - } -} - -static inline int reflection_BaseType_is_known_value(reflection_BaseType_enum_t value) -{ - switch (value) { - case reflection_BaseType_None: return 1; - case reflection_BaseType_UType: return 1; - case reflection_BaseType_Bool: return 1; - case reflection_BaseType_Byte: return 1; - case reflection_BaseType_UByte: return 1; - case reflection_BaseType_Short: return 1; - case reflection_BaseType_UShort: return 1; - case reflection_BaseType_Int: return 1; - case reflection_BaseType_UInt: return 1; - case reflection_BaseType_Long: return 1; - case reflection_BaseType_ULong: return 1; - case reflection_BaseType_Float: return 1; - case reflection_BaseType_Double: return 1; - case reflection_BaseType_String: return 1; - case reflection_BaseType_Vector: return 1; - case reflection_BaseType_Obj: return 1; - case reflection_BaseType_Union: return 1; - case reflection_BaseType_Array: return 1; - default: return 0; - } -} - - - -struct reflection_Type_table { uint8_t unused__; }; - -static inline size_t reflection_Type_vec_len(reflection_Type_vec_t vec) -__flatbuffers_vec_len(vec) -static inline reflection_Type_table_t reflection_Type_vec_at(reflection_Type_vec_t vec, size_t i) -__flatbuffers_offset_vec_at(reflection_Type_table_t, vec, i, 0) -__flatbuffers_table_as_root(reflection_Type) - -__flatbuffers_define_scalar_field(0, reflection_Type, base_type, reflection_BaseType, reflection_BaseType_enum_t, INT8_C(0)) -__flatbuffers_define_scalar_field(1, reflection_Type, element, reflection_BaseType, reflection_BaseType_enum_t, INT8_C(0)) -__flatbuffers_define_scalar_field(2, reflection_Type, index, flatbuffers_int32, int32_t, INT32_C(-1)) -__flatbuffers_define_scalar_field(3, reflection_Type, fixed_length, flatbuffers_uint16, uint16_t, UINT16_C(0)) - -struct reflection_KeyValue_table { uint8_t unused__; }; - -static inline size_t reflection_KeyValue_vec_len(reflection_KeyValue_vec_t vec) -__flatbuffers_vec_len(vec) -static inline reflection_KeyValue_table_t reflection_KeyValue_vec_at(reflection_KeyValue_vec_t vec, size_t i) -__flatbuffers_offset_vec_at(reflection_KeyValue_table_t, vec, i, 0) -__flatbuffers_table_as_root(reflection_KeyValue) - -__flatbuffers_define_string_field(0, reflection_KeyValue, key, 1) -__flatbuffers_define_find_by_string_field(reflection_KeyValue, key) -__flatbuffers_define_table_sort_by_string_field(reflection_KeyValue, key) -__flatbuffers_define_default_find_by_string_field(reflection_KeyValue, key) -__flatbuffers_define_default_scan_by_string_field(reflection_KeyValue, key) -#define reflection_KeyValue_vec_sort reflection_KeyValue_vec_sort_by_key -__flatbuffers_define_string_field(1, reflection_KeyValue, value, 0) - -struct reflection_EnumVal_table { uint8_t unused__; }; - -static inline size_t reflection_EnumVal_vec_len(reflection_EnumVal_vec_t vec) -__flatbuffers_vec_len(vec) -static inline reflection_EnumVal_table_t reflection_EnumVal_vec_at(reflection_EnumVal_vec_t vec, size_t i) -__flatbuffers_offset_vec_at(reflection_EnumVal_table_t, vec, i, 0) -__flatbuffers_table_as_root(reflection_EnumVal) - -__flatbuffers_define_string_field(0, reflection_EnumVal, name, 1) -__flatbuffers_define_scalar_field(1, reflection_EnumVal, value, flatbuffers_int64, int64_t, INT64_C(0)) -/* Note: find only works on vectors sorted by this field. */ -__flatbuffers_define_find_by_scalar_field(reflection_EnumVal, value, int64_t) -__flatbuffers_define_table_sort_by_scalar_field(reflection_EnumVal, value, int64_t) -__flatbuffers_define_default_find_by_scalar_field(reflection_EnumVal, value, int64_t) -__flatbuffers_define_default_scan_by_scalar_field(reflection_EnumVal, value, int64_t) -#define reflection_EnumVal_vec_sort reflection_EnumVal_vec_sort_by_value -__flatbuffers_define_table_field(2, reflection_EnumVal, object, reflection_Object_table_t, 0) -__flatbuffers_define_table_field(3, reflection_EnumVal, union_type, reflection_Type_table_t, 0) - -struct reflection_Enum_table { uint8_t unused__; }; - -static inline size_t reflection_Enum_vec_len(reflection_Enum_vec_t vec) -__flatbuffers_vec_len(vec) -static inline reflection_Enum_table_t reflection_Enum_vec_at(reflection_Enum_vec_t vec, size_t i) -__flatbuffers_offset_vec_at(reflection_Enum_table_t, vec, i, 0) -__flatbuffers_table_as_root(reflection_Enum) - -__flatbuffers_define_string_field(0, reflection_Enum, name, 1) -__flatbuffers_define_find_by_string_field(reflection_Enum, name) -__flatbuffers_define_table_sort_by_string_field(reflection_Enum, name) -__flatbuffers_define_default_find_by_string_field(reflection_Enum, name) -__flatbuffers_define_default_scan_by_string_field(reflection_Enum, name) -#define reflection_Enum_vec_sort reflection_Enum_vec_sort_by_name -__flatbuffers_define_vector_field(1, reflection_Enum, values, reflection_EnumVal_vec_t, 1) -__flatbuffers_define_scalar_field(2, reflection_Enum, is_union, flatbuffers_bool, flatbuffers_bool_t, UINT8_C(0)) -__flatbuffers_define_table_field(3, reflection_Enum, underlying_type, reflection_Type_table_t, 1) -__flatbuffers_define_vector_field(4, reflection_Enum, attributes, reflection_KeyValue_vec_t, 0) - -struct reflection_Field_table { uint8_t unused__; }; - -static inline size_t reflection_Field_vec_len(reflection_Field_vec_t vec) -__flatbuffers_vec_len(vec) -static inline reflection_Field_table_t reflection_Field_vec_at(reflection_Field_vec_t vec, size_t i) -__flatbuffers_offset_vec_at(reflection_Field_table_t, vec, i, 0) -__flatbuffers_table_as_root(reflection_Field) - -__flatbuffers_define_string_field(0, reflection_Field, name, 1) -__flatbuffers_define_find_by_string_field(reflection_Field, name) -__flatbuffers_define_table_sort_by_string_field(reflection_Field, name) -__flatbuffers_define_default_find_by_string_field(reflection_Field, name) -__flatbuffers_define_default_scan_by_string_field(reflection_Field, name) -#define reflection_Field_vec_sort reflection_Field_vec_sort_by_name -__flatbuffers_define_table_field(1, reflection_Field, type, reflection_Type_table_t, 1) -__flatbuffers_define_scalar_field(2, reflection_Field, id, flatbuffers_uint16, uint16_t, UINT16_C(0)) -__flatbuffers_define_scalar_field(3, reflection_Field, offset, flatbuffers_uint16, uint16_t, UINT16_C(0)) -__flatbuffers_define_scalar_field(4, reflection_Field, default_integer, flatbuffers_int64, int64_t, INT64_C(0)) -__flatbuffers_define_scalar_field(5, reflection_Field, default_real, flatbuffers_double, double, 0.000000) -__flatbuffers_define_scalar_field(6, reflection_Field, deprecated, flatbuffers_bool, flatbuffers_bool_t, UINT8_C(0)) -__flatbuffers_define_scalar_field(7, reflection_Field, required, flatbuffers_bool, flatbuffers_bool_t, UINT8_C(0)) -__flatbuffers_define_scalar_field(8, reflection_Field, key, flatbuffers_bool, flatbuffers_bool_t, UINT8_C(0)) -__flatbuffers_define_vector_field(9, reflection_Field, attributes, reflection_KeyValue_vec_t, 0) - -struct reflection_Object_table { uint8_t unused__; }; - -static inline size_t reflection_Object_vec_len(reflection_Object_vec_t vec) -__flatbuffers_vec_len(vec) -static inline reflection_Object_table_t reflection_Object_vec_at(reflection_Object_vec_t vec, size_t i) -__flatbuffers_offset_vec_at(reflection_Object_table_t, vec, i, 0) -__flatbuffers_table_as_root(reflection_Object) - -__flatbuffers_define_string_field(0, reflection_Object, name, 1) -__flatbuffers_define_find_by_string_field(reflection_Object, name) -__flatbuffers_define_table_sort_by_string_field(reflection_Object, name) -__flatbuffers_define_default_find_by_string_field(reflection_Object, name) -__flatbuffers_define_default_scan_by_string_field(reflection_Object, name) -#define reflection_Object_vec_sort reflection_Object_vec_sort_by_name -__flatbuffers_define_vector_field(1, reflection_Object, fields, reflection_Field_vec_t, 1) -__flatbuffers_define_scalar_field(2, reflection_Object, is_struct, flatbuffers_bool, flatbuffers_bool_t, UINT8_C(0)) -__flatbuffers_define_scalar_field(3, reflection_Object, minalign, flatbuffers_int32, int32_t, INT32_C(0)) -__flatbuffers_define_scalar_field(4, reflection_Object, bytesize, flatbuffers_int32, int32_t, INT32_C(0)) -__flatbuffers_define_vector_field(5, reflection_Object, attributes, reflection_KeyValue_vec_t, 0) - -struct reflection_Schema_table { uint8_t unused__; }; - -static inline size_t reflection_Schema_vec_len(reflection_Schema_vec_t vec) -__flatbuffers_vec_len(vec) -static inline reflection_Schema_table_t reflection_Schema_vec_at(reflection_Schema_vec_t vec, size_t i) -__flatbuffers_offset_vec_at(reflection_Schema_table_t, vec, i, 0) -__flatbuffers_table_as_root(reflection_Schema) - -__flatbuffers_define_vector_field(0, reflection_Schema, objects, reflection_Object_vec_t, 1) -__flatbuffers_define_vector_field(1, reflection_Schema, enums, reflection_Enum_vec_t, 1) -__flatbuffers_define_string_field(2, reflection_Schema, file_ident, 0) -__flatbuffers_define_string_field(3, reflection_Schema, file_ext, 0) -__flatbuffers_define_table_field(4, reflection_Schema, root_table, reflection_Object_table_t, 0) - - -#include "flatcc/flatcc_epilogue.h" -#endif /* REFLECTION_READER_H */ diff --git a/flatccrt/include/flatcc/reflection/reflection_verifier.h b/flatccrt/include/flatcc/reflection/reflection_verifier.h deleted file mode 100644 index 473daaf..0000000 --- a/flatccrt/include/flatcc/reflection/reflection_verifier.h +++ /dev/null @@ -1,239 +0,0 @@ -#ifndef REFLECTION_VERIFIER_H -#define REFLECTION_VERIFIER_H - -/* Generated by flatcc 0.6.0 FlatBuffers schema compiler for C by dvide.com */ - -#ifndef REFLECTION_READER_H -#include "reflection_reader.h" -#endif -#include "flatcc/flatcc_verifier.h" -#include "flatcc/flatcc_prologue.h" - -static int reflection_Type_verify_table(flatcc_table_verifier_descriptor_t *td); -static int reflection_KeyValue_verify_table(flatcc_table_verifier_descriptor_t *td); -static int reflection_EnumVal_verify_table(flatcc_table_verifier_descriptor_t *td); -static int reflection_Enum_verify_table(flatcc_table_verifier_descriptor_t *td); -static int reflection_Field_verify_table(flatcc_table_verifier_descriptor_t *td); -static int reflection_Object_verify_table(flatcc_table_verifier_descriptor_t *td); -static int reflection_Schema_verify_table(flatcc_table_verifier_descriptor_t *td); - -static int reflection_Type_verify_table(flatcc_table_verifier_descriptor_t *td) -{ - int ret; - if ((ret = flatcc_verify_field(td, 0, 1, 1) /* base_type */)) return ret; - if ((ret = flatcc_verify_field(td, 1, 1, 1) /* element */)) return ret; - if ((ret = flatcc_verify_field(td, 2, 4, 4) /* index */)) return ret; - if ((ret = flatcc_verify_field(td, 3, 2, 2) /* fixed_length */)) return ret; - return flatcc_verify_ok; -} - -static inline int reflection_Type_verify_as_root(const void *buf, size_t bufsiz) -{ - return flatcc_verify_table_as_root(buf, bufsiz, reflection_Type_identifier, &reflection_Type_verify_table); -} - -static inline int reflection_Type_verify_as_typed_root(const void *buf, size_t bufsiz) -{ - return flatcc_verify_table_as_root(buf, bufsiz, reflection_Type_type_identifier, &reflection_Type_verify_table); -} - -static inline int reflection_Type_verify_as_root_with_identifier(const void *buf, size_t bufsiz, const char *fid) -{ - return flatcc_verify_table_as_root(buf, bufsiz, fid, &reflection_Type_verify_table); -} - -static inline int reflection_Type_verify_as_root_with_type_hash(const void *buf, size_t bufsiz, flatbuffers_thash_t thash) -{ - return flatcc_verify_table_as_typed_root(buf, bufsiz, thash, &reflection_Type_verify_table); -} - -static int reflection_KeyValue_verify_table(flatcc_table_verifier_descriptor_t *td) -{ - int ret; - if ((ret = flatcc_verify_string_field(td, 0, 1) /* key */)) return ret; - if ((ret = flatcc_verify_string_field(td, 1, 0) /* value */)) return ret; - return flatcc_verify_ok; -} - -static inline int reflection_KeyValue_verify_as_root(const void *buf, size_t bufsiz) -{ - return flatcc_verify_table_as_root(buf, bufsiz, reflection_KeyValue_identifier, &reflection_KeyValue_verify_table); -} - -static inline int reflection_KeyValue_verify_as_typed_root(const void *buf, size_t bufsiz) -{ - return flatcc_verify_table_as_root(buf, bufsiz, reflection_KeyValue_type_identifier, &reflection_KeyValue_verify_table); -} - -static inline int reflection_KeyValue_verify_as_root_with_identifier(const void *buf, size_t bufsiz, const char *fid) -{ - return flatcc_verify_table_as_root(buf, bufsiz, fid, &reflection_KeyValue_verify_table); -} - -static inline int reflection_KeyValue_verify_as_root_with_type_hash(const void *buf, size_t bufsiz, flatbuffers_thash_t thash) -{ - return flatcc_verify_table_as_typed_root(buf, bufsiz, thash, &reflection_KeyValue_verify_table); -} - -static int reflection_EnumVal_verify_table(flatcc_table_verifier_descriptor_t *td) -{ - int ret; - if ((ret = flatcc_verify_string_field(td, 0, 1) /* name */)) return ret; - if ((ret = flatcc_verify_field(td, 1, 8, 8) /* value */)) return ret; - if ((ret = flatcc_verify_table_field(td, 2, 0, &reflection_Object_verify_table) /* object */)) return ret; - if ((ret = flatcc_verify_table_field(td, 3, 0, &reflection_Type_verify_table) /* union_type */)) return ret; - return flatcc_verify_ok; -} - -static inline int reflection_EnumVal_verify_as_root(const void *buf, size_t bufsiz) -{ - return flatcc_verify_table_as_root(buf, bufsiz, reflection_EnumVal_identifier, &reflection_EnumVal_verify_table); -} - -static inline int reflection_EnumVal_verify_as_typed_root(const void *buf, size_t bufsiz) -{ - return flatcc_verify_table_as_root(buf, bufsiz, reflection_EnumVal_type_identifier, &reflection_EnumVal_verify_table); -} - -static inline int reflection_EnumVal_verify_as_root_with_identifier(const void *buf, size_t bufsiz, const char *fid) -{ - return flatcc_verify_table_as_root(buf, bufsiz, fid, &reflection_EnumVal_verify_table); -} - -static inline int reflection_EnumVal_verify_as_root_with_type_hash(const void *buf, size_t bufsiz, flatbuffers_thash_t thash) -{ - return flatcc_verify_table_as_typed_root(buf, bufsiz, thash, &reflection_EnumVal_verify_table); -} - -static int reflection_Enum_verify_table(flatcc_table_verifier_descriptor_t *td) -{ - int ret; - if ((ret = flatcc_verify_string_field(td, 0, 1) /* name */)) return ret; - if ((ret = flatcc_verify_table_vector_field(td, 1, 1, &reflection_EnumVal_verify_table) /* values */)) return ret; - if ((ret = flatcc_verify_field(td, 2, 1, 1) /* is_union */)) return ret; - if ((ret = flatcc_verify_table_field(td, 3, 1, &reflection_Type_verify_table) /* underlying_type */)) return ret; - if ((ret = flatcc_verify_table_vector_field(td, 4, 0, &reflection_KeyValue_verify_table) /* attributes */)) return ret; - return flatcc_verify_ok; -} - -static inline int reflection_Enum_verify_as_root(const void *buf, size_t bufsiz) -{ - return flatcc_verify_table_as_root(buf, bufsiz, reflection_Enum_identifier, &reflection_Enum_verify_table); -} - -static inline int reflection_Enum_verify_as_typed_root(const void *buf, size_t bufsiz) -{ - return flatcc_verify_table_as_root(buf, bufsiz, reflection_Enum_type_identifier, &reflection_Enum_verify_table); -} - -static inline int reflection_Enum_verify_as_root_with_identifier(const void *buf, size_t bufsiz, const char *fid) -{ - return flatcc_verify_table_as_root(buf, bufsiz, fid, &reflection_Enum_verify_table); -} - -static inline int reflection_Enum_verify_as_root_with_type_hash(const void *buf, size_t bufsiz, flatbuffers_thash_t thash) -{ - return flatcc_verify_table_as_typed_root(buf, bufsiz, thash, &reflection_Enum_verify_table); -} - -static int reflection_Field_verify_table(flatcc_table_verifier_descriptor_t *td) -{ - int ret; - if ((ret = flatcc_verify_string_field(td, 0, 1) /* name */)) return ret; - if ((ret = flatcc_verify_table_field(td, 1, 1, &reflection_Type_verify_table) /* type */)) return ret; - if ((ret = flatcc_verify_field(td, 2, 2, 2) /* id */)) return ret; - if ((ret = flatcc_verify_field(td, 3, 2, 2) /* offset */)) return ret; - if ((ret = flatcc_verify_field(td, 4, 8, 8) /* default_integer */)) return ret; - if ((ret = flatcc_verify_field(td, 5, 8, 8) /* default_real */)) return ret; - if ((ret = flatcc_verify_field(td, 6, 1, 1) /* deprecated */)) return ret; - if ((ret = flatcc_verify_field(td, 7, 1, 1) /* required */)) return ret; - if ((ret = flatcc_verify_field(td, 8, 1, 1) /* key */)) return ret; - if ((ret = flatcc_verify_table_vector_field(td, 9, 0, &reflection_KeyValue_verify_table) /* attributes */)) return ret; - return flatcc_verify_ok; -} - -static inline int reflection_Field_verify_as_root(const void *buf, size_t bufsiz) -{ - return flatcc_verify_table_as_root(buf, bufsiz, reflection_Field_identifier, &reflection_Field_verify_table); -} - -static inline int reflection_Field_verify_as_typed_root(const void *buf, size_t bufsiz) -{ - return flatcc_verify_table_as_root(buf, bufsiz, reflection_Field_type_identifier, &reflection_Field_verify_table); -} - -static inline int reflection_Field_verify_as_root_with_identifier(const void *buf, size_t bufsiz, const char *fid) -{ - return flatcc_verify_table_as_root(buf, bufsiz, fid, &reflection_Field_verify_table); -} - -static inline int reflection_Field_verify_as_root_with_type_hash(const void *buf, size_t bufsiz, flatbuffers_thash_t thash) -{ - return flatcc_verify_table_as_typed_root(buf, bufsiz, thash, &reflection_Field_verify_table); -} - -static int reflection_Object_verify_table(flatcc_table_verifier_descriptor_t *td) -{ - int ret; - if ((ret = flatcc_verify_string_field(td, 0, 1) /* name */)) return ret; - if ((ret = flatcc_verify_table_vector_field(td, 1, 1, &reflection_Field_verify_table) /* fields */)) return ret; - if ((ret = flatcc_verify_field(td, 2, 1, 1) /* is_struct */)) return ret; - if ((ret = flatcc_verify_field(td, 3, 4, 4) /* minalign */)) return ret; - if ((ret = flatcc_verify_field(td, 4, 4, 4) /* bytesize */)) return ret; - if ((ret = flatcc_verify_table_vector_field(td, 5, 0, &reflection_KeyValue_verify_table) /* attributes */)) return ret; - return flatcc_verify_ok; -} - -static inline int reflection_Object_verify_as_root(const void *buf, size_t bufsiz) -{ - return flatcc_verify_table_as_root(buf, bufsiz, reflection_Object_identifier, &reflection_Object_verify_table); -} - -static inline int reflection_Object_verify_as_typed_root(const void *buf, size_t bufsiz) -{ - return flatcc_verify_table_as_root(buf, bufsiz, reflection_Object_type_identifier, &reflection_Object_verify_table); -} - -static inline int reflection_Object_verify_as_root_with_identifier(const void *buf, size_t bufsiz, const char *fid) -{ - return flatcc_verify_table_as_root(buf, bufsiz, fid, &reflection_Object_verify_table); -} - -static inline int reflection_Object_verify_as_root_with_type_hash(const void *buf, size_t bufsiz, flatbuffers_thash_t thash) -{ - return flatcc_verify_table_as_typed_root(buf, bufsiz, thash, &reflection_Object_verify_table); -} - -static int reflection_Schema_verify_table(flatcc_table_verifier_descriptor_t *td) -{ - int ret; - if ((ret = flatcc_verify_table_vector_field(td, 0, 1, &reflection_Object_verify_table) /* objects */)) return ret; - if ((ret = flatcc_verify_table_vector_field(td, 1, 1, &reflection_Enum_verify_table) /* enums */)) return ret; - if ((ret = flatcc_verify_string_field(td, 2, 0) /* file_ident */)) return ret; - if ((ret = flatcc_verify_string_field(td, 3, 0) /* file_ext */)) return ret; - if ((ret = flatcc_verify_table_field(td, 4, 0, &reflection_Object_verify_table) /* root_table */)) return ret; - return flatcc_verify_ok; -} - -static inline int reflection_Schema_verify_as_root(const void *buf, size_t bufsiz) -{ - return flatcc_verify_table_as_root(buf, bufsiz, reflection_Schema_identifier, &reflection_Schema_verify_table); -} - -static inline int reflection_Schema_verify_as_typed_root(const void *buf, size_t bufsiz) -{ - return flatcc_verify_table_as_root(buf, bufsiz, reflection_Schema_type_identifier, &reflection_Schema_verify_table); -} - -static inline int reflection_Schema_verify_as_root_with_identifier(const void *buf, size_t bufsiz, const char *fid) -{ - return flatcc_verify_table_as_root(buf, bufsiz, fid, &reflection_Schema_verify_table); -} - -static inline int reflection_Schema_verify_as_root_with_type_hash(const void *buf, size_t bufsiz, flatbuffers_thash_t thash) -{ - return flatcc_verify_table_as_typed_root(buf, bufsiz, thash, &reflection_Schema_verify_table); -} - -#include "flatcc/flatcc_epilogue.h" -#endif /* REFLECTION_VERIFIER_H */ diff --git a/flatccrt/include/flatcc/support/README b/flatccrt/include/flatcc/support/README deleted file mode 100644 index d9f6ec0..0000000 --- a/flatccrt/include/flatcc/support/README +++ /dev/null @@ -1 +0,0 @@ -support files mainly used for testing diff --git a/flatccrt/include/flatcc/support/cdump.h b/flatccrt/include/flatcc/support/cdump.h deleted file mode 100644 index 0050189..0000000 --- a/flatccrt/include/flatcc/support/cdump.h +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef CDUMP_H -#define CDUMP_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -/* Generates a constant a C byte array. */ -static void cdump(const char *name, void *addr, size_t len, FILE *fp) { - unsigned int i; - unsigned char buff[17]; - unsigned char *pc = (unsigned char*)addr; - - // Output description if given. - name = name ? name : "dump"; - fprintf(fp, "const unsigned char %s[] = {", name); - - // Process every byte in the data. - for (i = 0; i < (unsigned int)len; i++) { - // Multiple of 16 means new line (with line offset). - - if ((i % 16) == 0) { - fprintf(fp, "\n "); - } else if ((i % 8) == 0) { - fprintf(fp, " "); - } - - fprintf(fp, " 0x%02x,", pc[i]); - } - fprintf(fp, "\n};\n"); -} - -#ifdef __cplusplus -} -#endif - -#endif /* CDUMP_H */ diff --git a/flatccrt/include/flatcc/support/elapsed.h b/flatccrt/include/flatcc/support/elapsed.h deleted file mode 100644 index 8a46a95..0000000 --- a/flatccrt/include/flatcc/support/elapsed.h +++ /dev/null @@ -1,73 +0,0 @@ -#ifndef ELAPSED_H -#define ELAPSED_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -/* Based on http://stackoverflow.com/a/8583395 */ -#if !defined(_WIN32) -#include -static double elapsed_realtime(void) { // returns 0 seconds first time called - static struct timeval t0; - struct timeval tv; - gettimeofday(&tv, 0); - if (!t0.tv_sec) - t0 = tv; - return tv.tv_sec - t0.tv_sec + (tv.tv_usec - t0.tv_usec) / 1000000.; -} -#else -#include -#ifndef FatalError -#define FatalError(s) do { perror(s); exit(-1); } while(0) -#endif -static double elapsed_realtime(void) { // granularity about 50 microsecs on my machine - static LARGE_INTEGER freq, start; - LARGE_INTEGER count; - if (!QueryPerformanceCounter(&count)) - FatalError("QueryPerformanceCounter"); - if (!freq.QuadPart) { // one time initialization - if (!QueryPerformanceFrequency(&freq)) - FatalError("QueryPerformanceFrequency"); - start = count; - } - return (double)(count.QuadPart - start.QuadPart) / freq.QuadPart; -} -#endif - -/* end Based on stackoverflow */ - -static int show_benchmark(const char *descr, double t1, double t2, size_t size, int rep, const char *reptext) -{ - double tdiff = t2 - t1; - double nstime; - - printf("operation: %s\n", descr); - printf("elapsed time: %.3f (s)\n", tdiff); - printf("iterations: %d\n", rep); - printf("size: %lu (bytes)\n", (unsigned long)size); - printf("bandwidth: %.3f (MB/s)\n", (double)rep * size / 1e6 / tdiff); - printf("throughput in ops per sec: %.3f\n", rep / tdiff); - if (reptext && rep != 1) { - printf("throughput in %s ops per sec: %.3f\n", reptext, 1 / tdiff); - } - nstime = tdiff * 1e9 / rep; - if (nstime < 1000) { - printf("time per op: %.3f (ns)\n", nstime); - } else if (nstime < 1e6) { - printf("time per op: %.3f (us)\n", nstime / 1000); - } else if (nstime < 1e9) { - printf("time per op: %.3f (ms)\n", nstime / 1e6); - } else { - printf("time per op: %.3f (s)\n", nstime / 1e9); - } - return 0; -} - -#ifdef __cplusplus -} -#endif - -#endif /* ELAPSED_H */ diff --git a/flatccrt/include/flatcc/support/hexdump.h b/flatccrt/include/flatcc/support/hexdump.h deleted file mode 100644 index 85ad0c4..0000000 --- a/flatccrt/include/flatcc/support/hexdump.h +++ /dev/null @@ -1,47 +0,0 @@ -#ifndef HEXDUMP_H -#define HEXDUMP_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -/* Based on: http://stackoverflow.com/a/7776146 */ -static void hexdump(char *desc, void *addr, size_t len, FILE *fp) { - unsigned int i; - unsigned char buf[17]; - unsigned char *pc = (unsigned char*)addr; - - /* Output description if given. */ - if (desc != NULL) fprintf(fp, "%s:\n", desc); - - for (i = 0; i < (unsigned int)len; i++) { - - if ((i % 16) == 0) { - if (i != 0) fprintf(fp, " |%s|\n", buf); - fprintf(fp, "%08x ", i); - } else if ((i % 8) == 0) { - fprintf(fp, " "); - } - fprintf(fp, " %02x", pc[i]); - if ((pc[i] < 0x20) || (pc[i] > 0x7e)) { - buf[i % 16] = '.'; - } else { - buf[i % 16] = pc[i]; - } - buf[(i % 16) + 1] = '\0'; - } - if (i % 16 <= 8 && i % 16 != 0) fprintf(fp, " "); - while ((i % 16) != 0) { - fprintf(fp, " "); - i++; - } - fprintf(fp, " |%s|\n", buf); -} - -#ifdef __cplusplus -} -#endif - -#endif /* HEXDUMP_H */ diff --git a/flatccrt/include/flatcc/support/readfile.h b/flatccrt/include/flatcc/support/readfile.h deleted file mode 100644 index dad7ff3..0000000 --- a/flatccrt/include/flatcc/support/readfile.h +++ /dev/null @@ -1,63 +0,0 @@ -#ifndef READFILE_H -#define READFILE_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include - -static char *readfile(const char *filename, size_t max_size, size_t *size_out) -{ - FILE *fp; - size_t size, pos, n, _out; - char *buf; - - size_out = size_out ? size_out : &_out; - - fp = fopen(filename, "rb"); - size = 0; - buf = 0; - - if (!fp) { - goto fail; - } - fseek(fp, 0L, SEEK_END); - size = ftell(fp); - *size_out = size; - if (max_size > 0 && size > max_size) { - goto fail; - } - rewind(fp); - buf = (char *)malloc(size ? size : 1); - if (!buf) { - goto fail; - } - pos = 0; - while ((n = fread(buf + pos, 1, size - pos, fp))) { - pos += n; - } - if (pos != size) { - goto fail; - } - fclose(fp); - *size_out = size; - return buf; - -fail: - if (fp) { - fclose(fp); - } - if (buf) { - free(buf); - } - *size_out = size; - return 0; -} - -#ifdef __cplusplus -} -#endif - -#endif /* READFILE_H */ diff --git a/flatccrt/lib/libflatccrt.a b/flatccrt/lib/libflatccrt.a deleted file mode 100644 index 9c104bd11f2cd507daf60eb61a087705a4b3f4e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 736632 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 z zH#e}B{tgn&YB)VZOJ7ZEj$jftqVm0!zo7^pm+yZb#H*9v8yTlcH;IE@V|Kbd>$cr|Csz*|2^m4v%L^CGqyaCzUl zA5$se@?X#0eL0(j;SG0xw~ShVOYgmVl88dtqj&!WKEkDgcmFn9rBL=O>prxAOD>?2 zOUJnvxtihqzZ$IP&c{1$mB3DF1J!{zse(BRYy50pT|$EHS<)#tFO-8a7_sLl6h9;mtIem ztBX~}=C*5ENa;0crRS;mYm3!FuTo!jIj&-AUYfI(nbFHLBPPaTJ&PW%h^lAC{Qi5h z)wPUXzP>(p+clw*s-60wwfaLpe~pTM<-E{f0+rD>uZm4e3>W>{<2kzW13!Pw3fx}( z>yPJ>vg#*)p75_Bg!;1>;)a*!R$SGQ>wanPf^}rHZXS0$D)iz7$k?Wvit9^5Kt)@Y z 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 t}oV3#YcVU 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%0AA0iAA4;>d732=Rguq)vs9nR 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 z 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 VN1yHHJM1|jXK1|-#v^;*{{hz_E-U~5 diff --git a/libyuv/.gitignore b/libyuv/.gitignore deleted file mode 100644 index 25f8f10..0000000 --- a/libyuv/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -lib/ -bin/ diff --git a/libyuv/CMakeLists.txt b/libyuv/CMakeLists.txt index 2422998..75a6b68 100644 --- a/libyuv/CMakeLists.txt +++ b/libyuv/CMakeLists.txt @@ -10,15 +10,18 @@ ExternalProject_Add( -DCMAKE_CXX_FLAGS=${COMMON_FLAGS} -DBUILD_SHARED_LIBS=OFF -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} - -DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_SOURCE_DIR} + -DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR} -DCMAKE_POSITION_INDEPENDENT_CODE=ON + BUILD_BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/lib/libyuv.a ) add_library(yuv STATIC IMPORTED GLOBAL) +set(LIBYUV_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR}/include) +file(MAKE_DIRECTORY ${LIBYUV_INCLUDE_DIRS}) set_target_properties(yuv PROPERTIES - INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR}/include - IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/lib/libyuv.a + INTERFACE_INCLUDE_DIRECTORIES ${LIBYUV_INCLUDE_DIRS} + IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/lib/libyuv.a ) add_dependencies(yuv libyuv) diff --git a/libyuv/include/.gitignore b/libyuv/include/.gitignore deleted file mode 100644 index d6b7ef3..0000000 --- a/libyuv/include/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!.gitignore From bff1b66e5af162b6b1debf408197c07c08567aa7 Mon Sep 17 00:00:00 2001 From: Stephan Sundermann Date: Wed, 14 Aug 2024 16:17:04 +0200 Subject: [PATCH 2/8] Update and regenerate from definitions --- fbs/hyperion_request.fbs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/fbs/hyperion_request.fbs b/fbs/hyperion_request.fbs index 1c6e3d4..06bd54a 100644 --- a/fbs/hyperion_request.fbs +++ b/fbs/hyperion_request.fbs @@ -12,7 +12,16 @@ table RawImage { height:int = -1; } -union ImageType {RawImage} +table NV12Image { + data_y:[ubyte]; + data_uv:[ubyte]; + width:int; + height:int; + stride_y:int = 0; + stride_uv:int = 0; +} + +union ImageType {RawImage, NV12Image} table Image { data:ImageType (required); From 3dc170ce5856faa5bdad9e2992fe809c0c72f8da Mon Sep 17 00:00:00 2001 From: Stephan Sundermann Date: Wed, 14 Aug 2024 16:17:18 +0200 Subject: [PATCH 3/8] Remove unused variables --- src/hyperion_client.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hyperion_client.c b/src/hyperion_client.c index 6f9f53e..d06339e 100644 --- a/src/hyperion_client.c +++ b/src/hyperion_client.c @@ -75,7 +75,7 @@ int hyperion_set_image(const unsigned char* image, int width, int height) flatbuffers_uint8_vec_ref_t imgData = flatcc_builder_create_type_vector(&B, image, width * height * 3); hyperionnet_RawImage_ref_t rawImg = hyperionnet_RawImage_create(&B, imgData, width, height); hyperionnet_Image_ref_t imageReq = hyperionnet_Image_create(&B, hyperionnet_ImageType_as_RawImage(rawImg), -1); - hyperionnet_Request_ref_t req = hyperionnet_Request_create_as_root(&B, hyperionnet_Command_as_Image(imageReq)); + hyperionnet_Request_create_as_root(&B, hyperionnet_Command_as_Image(imageReq)); size_t size; void* buf = flatcc_builder_finalize_buffer(&B, &size); int ret = _send_message(buf, size); @@ -91,7 +91,7 @@ int hyperion_set_register(const char* origin, int priority) flatbuffers_builder_t B; flatcc_builder_init(&B); hyperionnet_Register_ref_t registerReq = hyperionnet_Register_create(&B, flatcc_builder_create_string_str(&B, origin), priority); - hyperionnet_Request_ref_t req = hyperionnet_Request_create_as_root(&B, hyperionnet_Command_as_Register(registerReq)); + hyperionnet_Request_create_as_root(&B, hyperionnet_Command_as_Register(registerReq)); size_t size; void* buf = flatcc_builder_finalize_buffer(&B, &size); From 1198ba9ca5332fe787486a9b105fcfbde22b6794 Mon Sep 17 00:00:00 2001 From: Stephan Sundermann Date: Mon, 21 Oct 2024 17:25:43 +0200 Subject: [PATCH 4/8] Fix type casting --- src/backends/libhalgal.c | 2 +- src/backends/libvtcapture.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/backends/libhalgal.c b/src/backends/libhalgal.c index 117b687..678d597 100644 --- a/src/backends/libhalgal.c +++ b/src/backends/libhalgal.c @@ -131,7 +131,7 @@ int capture_acquire_frame(void* state, frame_info_t* frame) frame->pixel_format = PIXFMT_ARGB; frame->width = this->width; frame->height = this->height; - frame->planes[0].buffer = this->mem_addr; + frame->planes[0].buffer = (uint8_t*)this->mem_addr; frame->planes[0].stride = this->surface_info.pitch; return 0; diff --git a/src/backends/libvtcapture.cpp b/src/backends/libvtcapture.cpp index fa9137d..69ed7d7 100644 --- a/src/backends/libvtcapture.cpp +++ b/src/backends/libvtcapture.cpp @@ -215,9 +215,9 @@ int capture_acquire_frame(void* state, frame_info_t* frame) frame->pixel_format = PIXFMT_YUV420_SEMI_PLANAR; // ToDo: I guess?! frame->width = self->width; frame->height = self->height; - frame->planes[0].buffer = buff.start_addr0; + frame->planes[0].buffer = reinterpret_cast(buff.start_addr0); frame->planes[0].stride = self->stride; - frame->planes[1].buffer = buff.start_addr1; + frame->planes[1].buffer = reinterpret_cast(buff.start_addr1); frame->planes[1].stride = self->stride; self->curr_buff = self->buff.start_addr0; From 38d9c998fbc7683be0968fbba9ef876016241028 Mon Sep 17 00:00:00 2001 From: Stephan Sundermann Date: Mon, 21 Oct 2024 20:12:10 +0200 Subject: [PATCH 5/8] Add NV12 support --- src/converter.c | 66 +++++++++++++++++++- src/converter.h | 5 ++ src/hyperion_client.c | 17 +++++ src/hyperion_client.h | 2 + src/main.c | 7 ++- src/service.c | 12 ++++ src/settings.c | 4 ++ src/settings.h | 1 + src/unicapture.c | 142 +++++++++++++++++++++++------------------- src/unicapture.h | 8 ++- 10 files changed, 195 insertions(+), 69 deletions(-) diff --git a/src/converter.c b/src/converter.c index 559c79b..72fa7b9 100644 --- a/src/converter.c +++ b/src/converter.c @@ -1,16 +1,17 @@ #include "converter.h" #include +#include void converter_init(converter_t* this) { - for (int i = 0; i < 4; i++) { + for (int i = 0; i < MAX_PLANES; i++) { this->buffers[i] = NULL; } } int converter_release(converter_t* converter) { - for (int i = 0; i < 4; i++) { + for (int i = 0; i < MAX_PLANES; i++) { if (converter->buffers[i] != NULL) { free(converter->buffers[i]); } @@ -26,6 +27,28 @@ int converter_release(converter_t* converter) */ int converter_run(converter_t* this, frame_info_t* input, frame_info_t* output, pixel_format_t target_format) { + if (input->pixel_format == target_format) { + output->width = input->width; + output->height = input->height; + output->pixel_format = input->pixel_format; + for (int i = 0; i < MAX_PLANES; i++) { + int size = input->height * input->planes[i].stride; + if (i == 1 && input->pixel_format == PIXFMT_YUV420_SEMI_PLANAR) { + // technically a stride of width is correct but the assumption of the amount + // of bytes as stride * height is wrong. + size /= 2; + } + + output->planes[i].stride = input->planes[i].stride; + if (input->planes[i].buffer) { + this->buffers[i] = realloc(this->buffers[i], size); + memcpy(this->buffers[i], input->planes[i].buffer, size); + output->planes[i].buffer = this->buffers[i]; + } + } + return 0; + } + if (target_format == PIXFMT_ARGB) { output->width = input->width; output->height = input->height; @@ -93,6 +116,45 @@ int converter_run(converter_t* this, frame_info_t* input, frame_info_t* output, output->pixel_format = PIXFMT_ARGB; return 0; + } + if (target_format == PIXFMT_YUV420_SEMI_PLANAR && input->pixel_format == PIXFMT_ARGB) { + this->buffers[0] = realloc(this->buffers[0], input->width * input->height); + this->buffers[1] = realloc(this->buffers[1], input->width * input->height / 2); + + output->width = input->width; + output->height = input->height; + output->planes[0].buffer = this->buffers[0]; + output->planes[0].stride = output->width; + output->planes[1].buffer = this->buffers[1]; + output->planes[1].stride = output->width; + output->pixel_format = PIXFMT_YUV420_SEMI_PLANAR; + + ARGBToNV12(input->planes[0].buffer, + input->planes[0].stride, + output->planes[0].buffer, + output->planes[0].stride, + output->planes[1].buffer, + output->planes[1].stride, + output->width, + output->height); + return 0; + } + if (target_format == PIXFMT_RGB && input->pixel_format == PIXFMT_ARGB) { + this->buffers[0] = realloc(this->buffers[0], input->width * input->height * 3); + + output->width = input->width; + output->height = input->height; + output->pixel_format = PIXFMT_RGB; + output->planes[0].buffer = this->buffers[0]; + output->planes[0].stride = output->width * 3; + + ARGBToRAW(input->planes[0].buffer, + input->planes[0].stride, + output->planes[0].buffer, + output->planes[0].stride, + output->width, + output->height); + return 0; } else { // Only support ARGB for now... return -1; diff --git a/src/converter.h b/src/converter.h index e6ea4eb..d56d933 100644 --- a/src/converter.h +++ b/src/converter.h @@ -12,3 +12,8 @@ typedef struct _converter { void converter_init(converter_t* converter); int converter_release(converter_t* converter); int converter_run(converter_t* this, frame_info_t* input, frame_info_t* output, pixel_format_t target_format); + +static inline uint8_t blend(const uint8_t foreground, const uint8_t background, const uint8_t alpha) +{ + return (255 - alpha) * background / 255 + foreground * alpha / 255; +} diff --git a/src/hyperion_client.c b/src/hyperion_client.c index d06339e..f732a0b 100644 --- a/src/hyperion_client.c +++ b/src/hyperion_client.c @@ -84,6 +84,23 @@ int hyperion_set_image(const unsigned char* image, int width, int height) return ret; } +int hyperion_set_nv12_image(const uint8_t* y, const uint8_t* uv, int width, int height, int stride_y, int stride_uv) +{ + flatbuffers_builder_t B; + flatcc_builder_init(&B); + flatbuffers_uint8_vec_ref_t yData = flatcc_builder_create_type_vector(&B, y, width * height); + flatbuffers_uint8_vec_ref_t uvData = flatcc_builder_create_type_vector(&B, uv, width * height / 2); + hyperionnet_RawImage_ref_t nv12Img = hyperionnet_NV12Image_create(&B, yData, uvData, width, height, stride_y, stride_uv); + hyperionnet_Image_ref_t imageReq = hyperionnet_Image_create(&B, hyperionnet_ImageType_as_NV12Image(nv12Img), -1); + hyperionnet_Request_create_as_root(&B, hyperionnet_Command_as_Image(imageReq)); + size_t size; + void* buf = flatcc_builder_finalize_buffer(&B, &size); + int ret = _send_message(buf, size); + free(buf); + flatcc_builder_clear(&B); + return ret; +} + int hyperion_set_register(const char* origin, int priority) { if (!sockfd) diff --git a/src/hyperion_client.h b/src/hyperion_client.h index 315dd40..f14ecf3 100644 --- a/src/hyperion_client.h +++ b/src/hyperion_client.h @@ -1,8 +1,10 @@ #pragma once #include +#include int hyperion_client(const char* origin, const char* hostname, int port, bool unix_socket, int priority); int hyperion_read(); int hyperion_destroy(); int hyperion_set_image(const unsigned char* image, int width, int height); +int hyperion_set_nv12_image(const uint8_t* y, const uint8_t* uv, int width, int height, int stride_y, int stride_uv); int hyperion_set_register(const char* origin, int priority); \ No newline at end of file diff --git a/src/main.c b/src/main.c index 8038dd7..3001d3d 100644 --- a/src/main.c +++ b/src/main.c @@ -39,6 +39,7 @@ static struct option long_options[] = { { "version", no_argument, &print_version, 1 }, { "config", required_argument, 0, 'c' }, { "dump-frames", no_argument, 0, 'd' }, + { "nv12", no_argument, 0, 't' }, { 0, 0, 0, 0 }, }; @@ -65,6 +66,7 @@ static void print_usage() printf(" -q, --quirks=QUIRKS Enable certain handling for per-device quirks\n"); printf(" -c, --config=PATH Absolute path for configfile to load settings. Giving additional runtime arguments will overwrite loaded ones.\n"); printf(" -d, --dump-frames Dump raw video frames to /tmp/.\n"); + printf(" -t, --nv12 Send NV12 frames\n"); printf("\n"); printf(" -v, --verbose Enable verbose logging.\n"); printf(" -h, --help Print this list of arguments.\n"); @@ -76,7 +78,7 @@ static int parse_options(int argc, char* argv[]) int opt, longindex; int ret; - while ((opt = getopt_long(argc, argv, "x:y:a:p:f:b:u:q:c:lvnhdVGrs", long_options, &longindex)) != -1) { + while ((opt = getopt_long(argc, argv, "x:y:a:p:f:b:u:q:c:lvnhdVGrst", long_options, &longindex)) != -1) { switch (opt) { case 'x': settings.width = atoi(optarg); @@ -115,6 +117,9 @@ static int parse_options(int argc, char* argv[]) case 'd': settings.dump_frames = true; break; + case 't': + settings.send_nv12 = true; + break; case 'v': log_set_level(Debug); break; diff --git a/src/service.c b/src/service.c index eb0d68d..558c866 100644 --- a/src/service.c +++ b/src/service.c @@ -67,6 +67,16 @@ int service_feed_frame(void* data __attribute__((unused)), int width, int height return 0; } +int service_feed_nv12_frame(void* data __attribute__((unused)), int width, int height, uint8_t* y, uint8_t* uv, int stride_y, int stride_uv) +{ + int ret; + if ((ret = hyperion_set_nv12_image(y, uv, width, height, stride_y, stride_uv)) != 0) { + WARN("Frame sending failed: %d", ret); + } + + return 0; +} + int service_init(service_t* service, settings_t* settings) { service->settings = settings; @@ -74,7 +84,9 @@ int service_init(service_t* service, settings_t* settings) unicapture_init(&service->unicapture); service->unicapture.vsync = settings->vsync; service->unicapture.fps = settings->fps; + service->unicapture.target_format = settings->send_nv12 ? PIXFMT_YUV420_SEMI_PLANAR : PIXFMT_RGB; service->unicapture.callback = &service_feed_frame; + service->unicapture.callback_nv12 = &service_feed_nv12_frame; service->unicapture.callback_data = (void*)service; service->unicapture.dump_frames = settings->dump_frames; diff --git a/src/settings.c b/src/settings.c index 1a14904..5c35ec6 100644 --- a/src/settings.c +++ b/src/settings.c @@ -16,6 +16,7 @@ void settings_init(settings_t* settings) settings->height = 180; settings->quirks = 0; + settings->send_nv12 = false; settings->no_video = false; settings->no_gui = false; settings->autostart = false; @@ -64,6 +65,8 @@ int settings_load_json(settings_t* settings, jvalue_ref source) jnumber_get_i32(value, &settings->width); if ((value = jobject_get(source, j_cstr_to_buffer("height"))) && jis_number(value)) jnumber_get_i32(value, &settings->height); + if ((value = jobject_get(source, j_cstr_to_buffer("nv12"))) && jis_boolean(value)) + jboolean_get(value, &settings->send_nv12); if ((value = jobject_get(source, j_cstr_to_buffer("quirks"))) && jis_number(value)) jnumber_get_i32(value, &settings->quirks); @@ -97,6 +100,7 @@ int settings_save_json(settings_t* settings, jvalue_ref target) jobject_set(target, j_cstr_to_buffer("fps"), jnumber_create_i32(settings->fps)); jobject_set(target, j_cstr_to_buffer("width"), jnumber_create_i32(settings->width)); jobject_set(target, j_cstr_to_buffer("height"), jnumber_create_i32(settings->height)); + jobject_set(target, j_cstr_to_buffer("nv12"), jboolean_create(settings->send_nv12)); jobject_set(target, j_cstr_to_buffer("quirks"), jnumber_create_i32(settings->quirks)); jobject_set(target, j_cstr_to_buffer("vsync"), jboolean_create(settings->vsync)); diff --git a/src/settings.h b/src/settings.h index 44918ee..50baae7 100644 --- a/src/settings.h +++ b/src/settings.h @@ -17,6 +17,7 @@ typedef struct _settings_t { bool unix_socket; int fps; + bool send_nv12; int width; int height; bool vsync; diff --git a/src/unicapture.c b/src/unicapture.c index 093efc4..e71ba79 100644 --- a/src/unicapture.c +++ b/src/unicapture.c @@ -118,15 +118,17 @@ void* unicapture_run(void* data) converter_t ui_converter; converter_t video_converter; + converter_t final_converter; converter_init(&ui_converter); converter_init(&video_converter); + converter_init(&final_converter); pthread_mutex_init(&this->vsync_lock, NULL); pthread_cond_init(&this->vsync_cond, NULL); - uint8_t* blended_frame = NULL; - uint8_t* final_frame = NULL; + frame_info_t blended_frame = { PIXFMT_INVALID }; + frame_info_t final_frame = { PIXFMT_INVALID }; this->vsync_thread_running = true; pthread_create(&this->vsync_thread, NULL, unicapture_vsync_handler, this); @@ -180,73 +182,77 @@ void* unicapture_run(void* data) } uint64_t frame_acquired = getticks_us(); - // TODO fastpaths handling? + pixel_format_t target_format = this->target_format; // Convert frame to suitable video formats if (ui_frame.pixel_format != PIXFMT_INVALID) { - converter_run(&ui_converter, &ui_frame, &ui_frame_converted, PIXFMT_ARGB); + converter_run(&ui_converter, &ui_frame, &ui_frame_converted, + target_format == PIXFMT_RGB ? PIXFMT_ARGB : PIXFMT_YUV420_SEMI_PLANAR); } if (video_frame.pixel_format != PIXFMT_INVALID) { - converter_run(&video_converter, &video_frame, &video_frame_converted, PIXFMT_ARGB); + converter_run(&video_converter, &video_frame, &video_frame_converted, + target_format == PIXFMT_RGB ? PIXFMT_ARGB : PIXFMT_YUV420_SEMI_PLANAR); } uint64_t frame_converted = getticks_us(); bool got_frame = true; - int width = 0; - int height = 0; // Blend frames and prepare for sending if (video_frame_converted.pixel_format != PIXFMT_INVALID && ui_frame_converted.pixel_format != PIXFMT_INVALID) { - width = video_frame_converted.width; - height = video_frame_converted.height; - - blended_frame = realloc(blended_frame, width * height * 4); - final_frame = realloc(final_frame, width * height * 3); - - ARGBBlend( - ui_frame_converted.planes[0].buffer, - ui_frame_converted.planes[0].stride, - video_frame_converted.planes[0].buffer, - video_frame_converted.planes[0].stride, - blended_frame, - 4 * width, - width, - height); - ARGBToRAW( - blended_frame, - 4 * width, - final_frame, - 3 * width, - width, - height); + const int width = video_frame_converted.width; + const int height = video_frame_converted.height; + + if (target_format == PIXFMT_RGB) { + blended_frame.planes[0].buffer = realloc(blended_frame.planes[0].buffer, width * height * 4); + blended_frame.planes[0].stride = width * 4; + blended_frame.pixel_format = PIXFMT_ARGB; + blended_frame.width = width; + blended_frame.height = height; + + ARGBBlend(ui_frame_converted.planes[0].buffer, + ui_frame_converted.planes[0].stride, + video_frame_converted.planes[0].buffer, + video_frame_converted.planes[0].stride, + blended_frame.planes[0].buffer, + 4 * width, + width, + height); + } + + if (target_format == PIXFMT_YUV420_SEMI_PLANAR) { + blended_frame.planes[0].buffer = realloc(blended_frame.planes[0].buffer, width * height); + blended_frame.planes[0].stride = width; + blended_frame.planes[1].buffer = realloc(blended_frame.planes[1].buffer, width * height / 2); + blended_frame.planes[1].stride = width; + blended_frame.height = height; + blended_frame.width = width; + blended_frame.pixel_format = PIXFMT_YUV420_SEMI_PLANAR; + + for (int i = 0; i < width * height; i++) { + blended_frame.planes[0].buffer[i] = blend(ui_frame_converted.planes[0].buffer[i], + video_frame_converted.planes[0].buffer[i], ui_frame.planes[0].buffer[i * 4 + 3]); + } + + int alpha_idx = 0; + for (int i = 0; i < height / 2; i++) { + for (int j = 0; j < width; j += 2) { + int idx = i * width + j; + blended_frame.planes[1].buffer[idx] = blend(ui_frame_converted.planes[1].buffer[idx], + video_frame_converted.planes[1].buffer[idx], ui_frame.planes[0].buffer[alpha_idx + 3]); + blended_frame.planes[1].buffer[idx + 1] = blend(ui_frame_converted.planes[1].buffer[idx + 1], + video_frame_converted.planes[1].buffer[idx + 1], ui_frame.planes[0].buffer[alpha_idx + 3]); + alpha_idx += 8; + } + alpha_idx += ui_frame.planes[0].stride; + } + } + converter_run(&final_converter, &blended_frame, &final_frame, target_format); } else if (ui_frame_converted.pixel_format != PIXFMT_INVALID) { - width = ui_frame_converted.width; - height = ui_frame_converted.height; - - final_frame = realloc(final_frame, width * height * 3); - - ARGBToRAW( - ui_frame_converted.planes[0].buffer, - ui_frame_converted.planes[0].stride, - final_frame, - 3 * width, - width, - height); + converter_run(&final_converter, &ui_frame_converted, &final_frame, target_format); } else if (video_frame_converted.pixel_format != PIXFMT_INVALID) { - width = video_frame_converted.width; - height = video_frame_converted.height; - - final_frame = realloc(final_frame, width * height * 3); - - ARGBToRAW( - video_frame_converted.planes[0].buffer, - video_frame_converted.planes[0].stride, - final_frame, - 3 * width, - width, - height); + converter_run(&final_converter, &video_frame_converted, &final_frame, target_format); } else { got_frame = false; WARN("No valid frame to send..."); @@ -258,13 +264,23 @@ void* unicapture_run(void* data) char filename[256]; snprintf(filename, sizeof(filename), "/tmp/hyperion-webos-dump.%03d.data", (int)(framecounter / 30) % 10); FILE* fd = fopen(filename, "wb"); - fwrite(final_frame, 3 * width * height, 1, fd); + if (target_format == PIXFMT_RGB) + fwrite(final_frame.planes[0].buffer, 3 * final_frame.width * final_frame.height, 1, fd); + if (target_format == PIXFMT_YUV420_SEMI_PLANAR) { + fwrite(final_frame.planes[0].buffer, final_frame.width * final_frame.height, 1, fd); + fwrite(final_frame.planes[1].buffer, final_frame.width * final_frame.height / 2, 1, fd); + } fclose(fd); INFO("Buffer dumped to: %s", filename); } - if (this->callback != NULL) { - this->callback(this->callback_data, width, height, final_frame); + if (this->callback != NULL && target_format == PIXFMT_RGB) { + this->callback(this->callback_data, final_frame.width, final_frame.height, final_frame.planes[0].buffer); + } + + if (this->callback_nv12 != NULL && target_format == PIXFMT_YUV420_SEMI_PLANAR) { + this->callback_nv12(this->callback_data, final_frame.width, final_frame.height, final_frame.planes[0].buffer, + final_frame.planes[1].buffer, final_frame.width, final_frame.width); } uint64_t frame_sent = getticks_us(); @@ -318,18 +334,16 @@ void* unicapture_run(void* data) this->video_capture_running = false; } - if (final_frame != NULL) { - free(final_frame); - final_frame = NULL; - } - - if (blended_frame != NULL) { - free(blended_frame); - blended_frame = NULL; + for (int i = 0; i < MAX_PLANES; i++) { + if (blended_frame.planes[i].buffer != NULL) { + free(blended_frame.planes[i].buffer); + blended_frame.planes[i].buffer = NULL; + } } converter_release(&ui_converter); converter_release(&video_converter); + converter_release(&final_converter); DBG("Done!"); return NULL; diff --git a/src/unicapture.h b/src/unicapture.h index 3dbe60c..19281fa 100644 --- a/src/unicapture.h +++ b/src/unicapture.h @@ -19,15 +19,16 @@ typedef enum _pixel_format { PIXFMT_ARGB = 12, } pixel_format_t; +#define MAX_PLANES 4 typedef struct _frame_info { pixel_format_t pixel_format; int width; int height; struct { - void* buffer; + uint8_t* buffer; int stride; - } planes[4]; + } planes[MAX_PLANES]; int internal_id; } frame_info_t; @@ -75,6 +76,7 @@ typedef struct _capture_backend { * To be called from capture backend implementation */ typedef int (*unicapture_imagedata_callback_t)(void* data, int width, int height, uint8_t* rgb_data); +typedef int (*unicapture_imagedata_nv12_callback_t)(void* data, int width, int height, uint8_t* y, uint8_t* uv, int stride_y, int stride_uv); typedef struct _unicapture_state { capture_backend_t* ui_capture; @@ -82,6 +84,7 @@ typedef struct _unicapture_state { bool vsync; uint32_t fps; + pixel_format_t target_format; bool running; pthread_t main_thread; @@ -95,6 +98,7 @@ typedef struct _unicapture_state { pthread_cond_t vsync_cond; unicapture_imagedata_callback_t callback; + unicapture_imagedata_nv12_callback_t callback_nv12; void* callback_data; bool dump_frames; From d0e37287107d4414685451197f25a00fe1b55f31 Mon Sep 17 00:00:00 2001 From: Stephan Sundermann Date: Mon, 21 Oct 2024 21:54:25 +0200 Subject: [PATCH 6/8] Update upload artifact version (cherry picked from commit 21b365ef84e2b069e29108d2f92a270eed309011) --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index daf2dc4..a8420f2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -50,7 +50,7 @@ jobs: run: find . - name: Upload artifact - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: hyperion_webos_${{ matrix.build-type }} path: | From 6cd53265f5d57d6ab1570d16a7511bbd4aefd2ee Mon Sep 17 00:00:00 2001 From: Stephan Sundermann Date: Tue, 22 Oct 2024 23:54:53 +0200 Subject: [PATCH 7/8] Add automatic LUT switching --- src/json_rpc_client.c | 45 ++++++++++++++++++++++++++++++++----------- src/json_rpc_client.h | 9 ++++++++- src/service.c | 26 ++++++------------------- 3 files changed, 48 insertions(+), 32 deletions(-) diff --git a/src/json_rpc_client.c b/src/json_rpc_client.c index 039dd6d..294c4a8 100644 --- a/src/json_rpc_client.c +++ b/src/json_rpc_client.c @@ -1,6 +1,9 @@ #include "json_rpc_client.h" #define MAX_RESPONSE_BUF_SZ (1024 * 8) +#define LUT_FILENAME_SDR "lut_lin_tables.3d" +#define LUT_FILENAME_HDR "lut_lin_tables_hdr.3d" +#define LUT_FILENAME_DOLBYVISION "lut_lin_tables_dv.3d" AmbientLightingDaemon daemon_flavor = DAEMON_NOT_SET; @@ -20,6 +23,20 @@ const char* daemon_to_string(AmbientLightingDaemon flavor) } } +DynamicRange get_dynamic_range(const char* range) +{ + if (strcmp(range, "DolbyVision") == 0 || strcmp(range, "dolbyHdr") == 0) { + return DOLBYVISION; + } else if (strcmp(range, "HDR") == 0 || strcmp(range, "HDR10") == 0 || strcmp(range, "hdr10") == 0 || strcmp(range, "hdr") == 0) { + return HDR10; + } else if (strcmp(range, "sdr") == 0 || strcmp(range, "none") == 0) { + return SDR; + } else { + WARN("get_dynamic_range: Unknown dynamic range: %s", range); + return SDR; + } +} + int do_http_post(char* url, const char* post_body, char** response_body, int out_buf_sz) { int ret = 0; @@ -159,7 +176,7 @@ int get_daemon_flavor(char* host, ushort rpc_port, AmbientLightingDaemon* flavor return ret; } -int set_hdr_state(char* host, ushort rpc_port, bool hdr_active) +int set_hdr_state(char* host, ushort rpc_port, DynamicRange range) { int ret = 0; @@ -180,16 +197,23 @@ int set_hdr_state(char* host, ushort rpc_port, bool hdr_active) jvalue_ref response_body_jval; jvalue_ref post_body = jobject_create(); - jvalue_ref component_state_jobj = jobject_create(); - - // Assemble nested object first - // See: https://docs.hyperion-project.org/en/json/Control.html#control-components - jobject_set(component_state_jobj, j_cstr_to_buffer("component"), jstring_create("HDR")); - jobject_set(component_state_jobj, j_cstr_to_buffer("state"), jboolean_create(hdr_active)); - // Assemble top-level json - jobject_set(post_body, j_cstr_to_buffer("command"), jstring_create("componentstate")); - jobject_set(post_body, j_cstr_to_buffer("componentstate"), component_state_jobj); + jobject_set(post_body, j_cstr_to_buffer("command"), jstring_create("videomodehdr")); + jobject_set(post_body, j_cstr_to_buffer("HDR"), jnumber_create_i32(range == SDR ? 0 : 1)); + + const char* lut_filename = ""; + switch (range) { + case SDR: + lut_filename = LUT_FILENAME_SDR; + break; + case HDR10: + lut_filename = LUT_FILENAME_HDR; + break; + case DOLBYVISION: + lut_filename = LUT_FILENAME_DOLBYVISION; + break; + } + jobject_set(post_body, j_cstr_to_buffer("flatbuffers_user_lut_filename"), jstring_create(lut_filename)); if ((ret = send_rpc_message(host, rpc_port, post_body, &response_body_jval)) != 0) { WARN("set_hdr_state: Failed to send RPC message, code: %d", ret); @@ -197,6 +221,5 @@ int set_hdr_state(char* host, ushort rpc_port, bool hdr_active) } j_release(&post_body); - j_release(&component_state_jobj); return ret; } \ No newline at end of file diff --git a/src/json_rpc_client.h b/src/json_rpc_client.h index 8fbfe6d..9dc1d8f 100644 --- a/src/json_rpc_client.h +++ b/src/json_rpc_client.h @@ -12,8 +12,15 @@ typedef enum _AmbientLightingDaemon { DAEMON_HYPERHDR } AmbientLightingDaemon; +typedef enum _DynamicRange { + SDR, + HDR10, + DOLBYVISION, +} DynamicRange; + const char* daemon_to_string(AmbientLightingDaemon flavor); int do_http_post(char* url, const char* post_body, char** response_body, int out_buf_sz); int send_rpc_message(char* host, ushort rpc_port, jvalue_ref post_body_jval, jvalue_ref* response_body_jval); int get_daemon_flavor(char* host, ushort rpc_port, AmbientLightingDaemon* flavor); -int set_hdr_state(char* host, ushort rpc_port, bool hdr_active); \ No newline at end of file +DynamicRange get_dynamic_range(const char* dynamic_range); +int set_hdr_state(char* host, ushort rpc_port, DynamicRange range); \ No newline at end of file diff --git a/src/service.c b/src/service.c index 558c866..2b8e04e 100644 --- a/src/service.c +++ b/src/service.c @@ -451,19 +451,12 @@ static bool videooutput_callback(LSHandle* sh __attribute__((unused)), LSMessage return false; } - bool hdr_enabled; raw_buffer hdr_type_buf = jstring_get(hdr_type_ref); const char* hdr_type_str = hdr_type_buf.m_str; + INFO("videooutput_callback: hdrType: %s", hdr_type_str); - if (strcmp(hdr_type_str, "none") == 0) { - INFO("videooutput_callback: hdrType: %s --> SDR mode", hdr_type_str); - hdr_enabled = false; - } else { - INFO("videooutput_callback: hdrType: %s --> HDR mode", hdr_type_str); - hdr_enabled = true; - } - - int ret = set_hdr_state(service->settings->unix_socket ? "127.0.0.1" : service->settings->address, RPC_PORT, hdr_enabled); + DynamicRange range = get_dynamic_range(hdr_type_str); + int ret = set_hdr_state(service->settings->unix_socket ? "127.0.0.1" : service->settings->address, RPC_PORT, range); if (ret != 0) { ERR("videooutput_callback: set_hdr_state failed, ret: %d", ret); } @@ -507,19 +500,12 @@ static bool picture_callback(LSHandle* sh __attribute__((unused)), LSMessage* ms return false; } - bool hdr_enabled; raw_buffer dynamic_range_buf = jstring_get(dynamic_range_ref); const char* dynamic_range_str = dynamic_range_buf.m_str; + INFO("picture_callback: dynamicRange: %s", dynamic_range_str); - if (strcmp(dynamic_range_str, "sdr") == 0) { - INFO("picture_callback: dynamicRange: %s --> SDR mode", dynamic_range_str); - hdr_enabled = false; - } else { - INFO("picture_callback: dynamicRange: %s --> HDR mode", dynamic_range_str); - hdr_enabled = true; - } - - int ret = set_hdr_state(service->settings->unix_socket ? "127.0.0.1" : service->settings->address, RPC_PORT, hdr_enabled); + DynamicRange range = get_dynamic_range(dynamic_range_str); + int ret = set_hdr_state(service->settings->unix_socket ? "127.0.0.1" : service->settings->address, RPC_PORT, range); if (ret != 0) { ERR("videooutput_callback: set_hdr_state failed, ret: %d", ret); } From b031a7a984a28bf0b415ebf101cf87269a9fec41 Mon Sep 17 00:00:00 2001 From: Stephan Sundermann Date: Thu, 24 Oct 2024 21:03:33 +0200 Subject: [PATCH 8/8] vtcapture: Relax sleeping Reduces CPU consumption with vsync enabled. On my TV this reduced CPU usage by half by giving up a bit of precision. Also throttle when currentCaptureBuffInfo fails (usually when there is no video) --- src/backends/libvtcapture.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backends/libvtcapture.cpp b/src/backends/libvtcapture.cpp index 69ed7d7..7cce4e8 100644 --- a/src/backends/libvtcapture.cpp +++ b/src/backends/libvtcapture.cpp @@ -266,7 +266,7 @@ int capture_wait(void* state) DBG("Returning with video capture stop (-99), to get restarted in next routine."); return -99; // Restart video capture } else if (ret != 0) { - + usleep(100000); ERR("vtCapture_currentCaptureBuffInfo() failed: %d", ret); return -1; } @@ -280,7 +280,7 @@ int capture_wait(void* state) WARN("captureCurrentBuffInfo() never returned a new plane!"); return -99; // Restart video capture } - usleep(100); + usleep(1000); } self->curr_buff = self->buff.start_addr0;