script_core 0.2.5 → 0.2.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (224) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +7 -1
  3. data/ext/enterprise_script_service/libseccomp/.travis.yml +3 -5
  4. data/ext/enterprise_script_service/libseccomp/CHANGELOG +10 -0
  5. data/ext/enterprise_script_service/libseccomp/CREDITS +3 -0
  6. data/ext/enterprise_script_service/libseccomp/README.md +18 -0
  7. data/ext/enterprise_script_service/libseccomp/configure.ac +1 -1
  8. data/ext/enterprise_script_service/libseccomp/include/seccomp-syscalls.h +7 -0
  9. data/ext/enterprise_script_service/libseccomp/src/arch-s390-syscalls.c +16 -0
  10. data/ext/enterprise_script_service/libseccomp/src/arch-s390x-syscalls.c +16 -0
  11. data/ext/enterprise_script_service/libseccomp/tests/.gitignore +1 -0
  12. data/ext/enterprise_script_service/libseccomp/tests/15-basic-resolver.c +3 -3
  13. data/ext/enterprise_script_service/libseccomp/tests/52-basic-load.c +48 -0
  14. data/ext/enterprise_script_service/libseccomp/tests/52-basic-load.py +38 -0
  15. data/ext/enterprise_script_service/libseccomp/tests/52-basic-load.tests +11 -0
  16. data/ext/enterprise_script_service/libseccomp/tests/Makefile.am +6 -3
  17. data/ext/enterprise_script_service/libseccomp/tests/regression +4 -0
  18. data/ext/enterprise_script_service/libseccomp/tools/Makefile.am +0 -3
  19. data/ext/enterprise_script_service/libseccomp/tools/scmp_bpf_sim.c +2 -0
  20. data/ext/enterprise_script_service/mruby/.github/workflows/build.yml +106 -0
  21. data/ext/enterprise_script_service/mruby/.github/workflows/main.yml +24 -0
  22. data/ext/enterprise_script_service/mruby/.gitignore +3 -0
  23. data/ext/enterprise_script_service/mruby/.travis.yml +6 -9
  24. data/ext/enterprise_script_service/mruby/AUTHORS +1 -0
  25. data/ext/enterprise_script_service/mruby/Doxyfile +1 -1
  26. data/ext/enterprise_script_service/mruby/LICENSE +1 -1
  27. data/ext/enterprise_script_service/mruby/README.md +6 -2
  28. data/ext/enterprise_script_service/mruby/appveyor.yml +9 -12
  29. data/ext/enterprise_script_service/mruby/appveyor_config.rb +9 -0
  30. data/ext/enterprise_script_service/mruby/build_config.rb +6 -6
  31. data/ext/enterprise_script_service/mruby/doc/guides/compile.md +6 -2
  32. data/ext/enterprise_script_service/mruby/doc/guides/debugger.md +1 -1
  33. data/ext/enterprise_script_service/mruby/doc/guides/mrbconf.md +4 -8
  34. data/ext/enterprise_script_service/mruby/doc/limitations.md +10 -10
  35. data/ext/enterprise_script_service/mruby/doc/opcode.md +108 -95
  36. data/ext/enterprise_script_service/mruby/examples/targets/build_config_ArduinoDue.rb +2 -2
  37. data/ext/enterprise_script_service/mruby/examples/targets/build_config_IntelEdison.rb +2 -2
  38. data/ext/enterprise_script_service/mruby/examples/targets/build_config_IntelGalileo.rb +2 -2
  39. data/ext/enterprise_script_service/mruby/examples/targets/build_config_RX630.rb +2 -2
  40. data/ext/enterprise_script_service/mruby/examples/targets/build_config_chipKITMax32.rb +2 -2
  41. data/ext/enterprise_script_service/mruby/examples/targets/build_config_dreamcast_shelf.rb +108 -0
  42. data/ext/enterprise_script_service/mruby/include/mrbconf.h +10 -7
  43. data/ext/enterprise_script_service/mruby/include/mruby.h +11 -9
  44. data/ext/enterprise_script_service/mruby/include/mruby/array.h +4 -0
  45. data/ext/enterprise_script_service/mruby/include/mruby/boxing_nan.h +11 -2
  46. data/ext/enterprise_script_service/mruby/include/mruby/boxing_word.h +0 -9
  47. data/ext/enterprise_script_service/mruby/include/mruby/common.h +10 -0
  48. data/ext/enterprise_script_service/mruby/include/mruby/compile.h +11 -3
  49. data/ext/enterprise_script_service/mruby/include/mruby/dump.h +1 -17
  50. data/ext/enterprise_script_service/mruby/include/mruby/irep.h +10 -0
  51. data/ext/enterprise_script_service/mruby/include/mruby/istruct.h +4 -1
  52. data/ext/enterprise_script_service/mruby/include/mruby/khash.h +23 -5
  53. data/ext/enterprise_script_service/mruby/include/mruby/numeric.h +1 -0
  54. data/ext/enterprise_script_service/mruby/include/mruby/ops.h +3 -2
  55. data/ext/enterprise_script_service/mruby/include/mruby/string.h +2 -1
  56. data/ext/enterprise_script_service/mruby/include/mruby/value.h +7 -12
  57. data/ext/enterprise_script_service/mruby/include/mruby/version.h +4 -4
  58. data/ext/enterprise_script_service/mruby/lib/mruby/build.rb +2 -30
  59. data/ext/enterprise_script_service/mruby/lib/mruby/build/command.rb +21 -46
  60. data/ext/enterprise_script_service/mruby/lib/mruby/gem.rb +9 -0
  61. data/ext/enterprise_script_service/mruby/lib/mruby/source.rb +3 -1
  62. data/ext/enterprise_script_service/mruby/mrbgems/default.gembox +7 -0
  63. data/ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/mrblib/array.rb +0 -31
  64. data/ext/enterprise_script_service/mruby/mrbgems/mruby-array-ext/test/array.rb +0 -13
  65. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-config/mrbgem.rake +5 -2
  66. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c +0 -1
  67. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdbconf.h +5 -1
  68. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +5 -1
  69. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c +7 -11
  70. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mruby/mrbgem.rake +0 -1
  71. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +6 -2
  72. data/ext/enterprise_script_service/mruby/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c +6 -2
  73. data/ext/enterprise_script_service/mruby/mrbgems/mruby-class-ext/src/class.c +6 -1
  74. data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/codegen.c +76 -48
  75. data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/parse.y +107 -32
  76. data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/core/y.tab.c +13153 -0
  77. data/ext/enterprise_script_service/mruby/mrbgems/mruby-compiler/mrbgem.rake +13 -15
  78. data/ext/enterprise_script_service/mruby/mrbgems/mruby-error/src/exception.c +3 -3
  79. data/ext/enterprise_script_service/mruby/mrbgems/mruby-eval/src/eval.c +2 -213
  80. data/ext/enterprise_script_service/mruby/mrbgems/mruby-eval/test/eval.rb +21 -0
  81. data/ext/enterprise_script_service/mruby/mrbgems/mruby-hash-ext/src/hash-ext.c +1 -3
  82. data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/include/mruby/ext/io.h +39 -7
  83. data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/mrbgem.rake +2 -8
  84. data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/mrblib/file_constants.rb +0 -16
  85. data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/mrblib/io.rb +7 -12
  86. data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/src/file.c +76 -30
  87. data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/src/file_test.c +9 -10
  88. data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/src/io.c +323 -120
  89. data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/test/file.rb +18 -12
  90. data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/test/io.rb +32 -0
  91. data/ext/enterprise_script_service/mruby/mrbgems/mruby-io/test/mruby_io_test.c +57 -49
  92. data/ext/enterprise_script_service/mruby/mrbgems/mruby-metaprog/src/metaprog.c +15 -17
  93. data/ext/enterprise_script_service/mruby/mrbgems/mruby-metaprog/test/metaprog.rb +9 -0
  94. data/ext/enterprise_script_service/mruby/mrbgems/mruby-method/src/method.c +1 -1
  95. data/ext/enterprise_script_service/mruby/mrbgems/mruby-object-ext/src/object.c +3 -12
  96. data/ext/enterprise_script_service/mruby/mrbgems/mruby-pack/src/pack.c +113 -10
  97. data/ext/enterprise_script_service/mruby/mrbgems/mruby-print/src/print.c +5 -1
  98. data/ext/enterprise_script_service/mruby/mrbgems/mruby-proc-ext/src/proc.c +2 -2
  99. data/ext/enterprise_script_service/mruby/mrbgems/mruby-rational/src/rational.c +9 -9
  100. data/ext/enterprise_script_service/mruby/mrbgems/mruby-sleep/src/mrb_sleep.c +1 -1
  101. data/ext/enterprise_script_service/mruby/mrbgems/mruby-socket/mrbgem.rake +1 -1
  102. data/ext/enterprise_script_service/mruby/mrbgems/mruby-socket/test/sockettest.c +3 -2
  103. data/ext/enterprise_script_service/mruby/mrbgems/mruby-sprintf/src/sprintf.c +61 -24
  104. data/ext/enterprise_script_service/mruby/mrbgems/mruby-sprintf/test/sprintf.rb +5 -23
  105. data/ext/enterprise_script_service/mruby/mrbgems/mruby-string-ext/src/string.c +3 -3
  106. data/ext/enterprise_script_service/mruby/mrbgems/mruby-symbol-ext/src/symbol.c +1 -1
  107. data/ext/enterprise_script_service/mruby/mrbgems/mruby-test/mrbgem.rake +1 -0
  108. data/ext/enterprise_script_service/mruby/mrbgems/mruby-time/src/time.c +6 -5
  109. data/ext/enterprise_script_service/mruby/mrblib/hash.rb +3 -3
  110. data/ext/enterprise_script_service/mruby/src/array.c +11 -0
  111. data/ext/enterprise_script_service/mruby/src/backtrace.c +2 -2
  112. data/ext/enterprise_script_service/mruby/src/class.c +26 -11
  113. data/ext/enterprise_script_service/mruby/src/codedump.c +4 -0
  114. data/ext/enterprise_script_service/mruby/src/debug.c +8 -5
  115. data/ext/enterprise_script_service/mruby/src/dump.c +3 -65
  116. data/ext/enterprise_script_service/mruby/src/error.c +57 -5
  117. data/ext/enterprise_script_service/mruby/src/etc.c +13 -4
  118. data/ext/enterprise_script_service/mruby/src/fmt_fp.c +98 -21
  119. data/ext/enterprise_script_service/mruby/src/gc.c +10 -275
  120. data/ext/enterprise_script_service/mruby/src/hash.c +5 -6
  121. data/ext/enterprise_script_service/mruby/src/kernel.c +2 -2
  122. data/ext/enterprise_script_service/mruby/src/load.c +56 -30
  123. data/ext/enterprise_script_service/mruby/src/numeric.c +22 -10
  124. data/ext/enterprise_script_service/mruby/src/object.c +12 -4
  125. data/ext/enterprise_script_service/mruby/src/print.c +27 -3
  126. data/ext/enterprise_script_service/mruby/src/proc.c +21 -1
  127. data/ext/enterprise_script_service/mruby/src/state.c +34 -11
  128. data/ext/enterprise_script_service/mruby/src/string.c +69 -35
  129. data/ext/enterprise_script_service/mruby/src/symbol.c +12 -10
  130. data/ext/enterprise_script_service/mruby/src/vm.c +21 -30
  131. data/ext/enterprise_script_service/mruby/tasks/gitlab.rake +19 -22
  132. data/ext/enterprise_script_service/mruby/tasks/mrbgems.rake +1 -1
  133. data/ext/enterprise_script_service/mruby/tasks/toolchains/android.rake +46 -1
  134. data/ext/enterprise_script_service/mruby/tasks/toolchains/gcc.rake +3 -3
  135. data/ext/enterprise_script_service/mruby/tasks/toolchains/openwrt.rake +6 -6
  136. data/ext/enterprise_script_service/mruby/tasks/toolchains/visualcpp.rake +8 -8
  137. data/ext/enterprise_script_service/mruby/test/assert.rb +5 -4
  138. data/ext/enterprise_script_service/mruby/test/t/ensure.rb +8 -26
  139. data/ext/enterprise_script_service/mruby/test/t/exception.rb +2 -2
  140. data/ext/enterprise_script_service/mruby/test/t/kernel.rb +8 -24
  141. data/ext/enterprise_script_service/mruby/travis_config.rb +0 -14
  142. data/ext/enterprise_script_service/msgpack/.github/depends/boost.sh +56 -0
  143. data/ext/enterprise_script_service/msgpack/.github/workflows/coverage.yml +62 -0
  144. data/ext/enterprise_script_service/msgpack/.github/workflows/gha.yml +304 -0
  145. data/ext/enterprise_script_service/msgpack/CHANGELOG.md +11 -0
  146. data/ext/enterprise_script_service/msgpack/CMakeLists.txt +82 -39
  147. data/ext/enterprise_script_service/msgpack/Files.cmake +22 -12
  148. data/ext/enterprise_script_service/msgpack/QUICKSTART-C.md +26 -29
  149. data/ext/enterprise_script_service/msgpack/README.md +3 -2
  150. data/ext/enterprise_script_service/msgpack/appveyor.yml +6 -2
  151. data/ext/enterprise_script_service/msgpack/ci/build_cmake.sh +3 -1
  152. data/ext/enterprise_script_service/msgpack/cmake/CodeCoverage.cmake +55 -0
  153. data/ext/enterprise_script_service/msgpack/codecov.yml +36 -0
  154. data/ext/enterprise_script_service/msgpack/example/CMakeLists.txt +9 -5
  155. data/ext/enterprise_script_service/msgpack/example/boost/CMakeLists.txt +1 -1
  156. data/ext/enterprise_script_service/msgpack/example/c/CMakeLists.txt +17 -6
  157. data/ext/enterprise_script_service/msgpack/example/c/boundary.c +296 -0
  158. data/ext/enterprise_script_service/msgpack/example/c/jsonconv.c +419 -0
  159. data/ext/enterprise_script_service/msgpack/example/c/simple_c.c +1 -1
  160. data/ext/enterprise_script_service/msgpack/example/cpp03/CMakeLists.txt +3 -3
  161. data/ext/enterprise_script_service/msgpack/example/cpp11/CMakeLists.txt +2 -2
  162. data/ext/enterprise_script_service/msgpack/example/x3/CMakeLists.txt +2 -2
  163. data/ext/enterprise_script_service/msgpack/include/msgpack/pack.h +24 -1
  164. data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/array_ref.hpp +5 -4
  165. data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/boost/optional.hpp +4 -4
  166. data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/cpp17/vector_byte.hpp +8 -8
  167. data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/map.hpp +4 -4
  168. data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/vector.hpp +4 -4
  169. data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/vector_char.hpp +8 -8
  170. data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/vector_unsigned_char.hpp +8 -8
  171. data/ext/enterprise_script_service/msgpack/include/msgpack/v1/adaptor/wstring.hpp +4 -4
  172. data/ext/enterprise_script_service/msgpack/include/msgpack/v3/unpack.hpp +6 -6
  173. data/ext/enterprise_script_service/msgpack/include/msgpack/version_master.h +2 -2
  174. data/ext/enterprise_script_service/msgpack/include/msgpack/zbuffer.h +4 -4
  175. data/ext/enterprise_script_service/msgpack/make_file_list.sh +38 -11
  176. data/ext/enterprise_script_service/msgpack/src/vrefbuffer.c +6 -0
  177. data/ext/enterprise_script_service/msgpack/test/CMakeLists.txt +86 -64
  178. data/ext/enterprise_script_service/msgpack/test/array_ref.cpp +4 -0
  179. data/ext/enterprise_script_service/msgpack/test/boost_fusion.cpp +4 -0
  180. data/ext/enterprise_script_service/msgpack/test/boost_optional.cpp +4 -0
  181. data/ext/enterprise_script_service/msgpack/test/boost_string_ref.cpp +4 -1
  182. data/ext/enterprise_script_service/msgpack/test/boost_string_view.cpp +4 -0
  183. data/ext/enterprise_script_service/msgpack/test/boost_variant.cpp +4 -0
  184. data/ext/enterprise_script_service/msgpack/test/buffer.cpp +4 -47
  185. data/ext/enterprise_script_service/msgpack/test/buffer_c.cpp +148 -0
  186. data/ext/enterprise_script_service/msgpack/test/carray.cpp +4 -0
  187. data/ext/enterprise_script_service/msgpack/test/cases.cpp +8 -4
  188. data/ext/enterprise_script_service/msgpack/test/convert.cpp +8 -4
  189. data/ext/enterprise_script_service/msgpack/test/fixint.cpp +4 -0
  190. data/ext/enterprise_script_service/msgpack/test/fixint_c.cpp +4 -0
  191. data/ext/enterprise_script_service/msgpack/test/fuzz_unpack_pack_fuzzer_cpp11.cpp +4 -0
  192. data/ext/enterprise_script_service/msgpack/test/iterator_cpp11.cpp +4 -0
  193. data/ext/enterprise_script_service/msgpack/test/json.cpp +4 -0
  194. data/ext/enterprise_script_service/msgpack/test/limit.cpp +8 -4
  195. data/ext/enterprise_script_service/msgpack/test/msgpack_basic.cpp +4 -0
  196. data/ext/enterprise_script_service/msgpack/test/msgpack_c.cpp +159 -0
  197. data/ext/enterprise_script_service/msgpack/test/msgpack_container.cpp +4 -0
  198. data/ext/enterprise_script_service/msgpack/test/msgpack_cpp11.cpp +32 -27
  199. data/ext/enterprise_script_service/msgpack/test/msgpack_cpp17.cpp +4 -0
  200. data/ext/enterprise_script_service/msgpack/test/msgpack_stream.cpp +4 -0
  201. data/ext/enterprise_script_service/msgpack/test/msgpack_tuple.cpp +4 -1
  202. data/ext/enterprise_script_service/msgpack/test/msgpack_vref.cpp +4 -0
  203. data/ext/enterprise_script_service/msgpack/test/msgpack_x3_parse.cpp +4 -0
  204. data/ext/enterprise_script_service/msgpack/test/object.cpp +4 -1
  205. data/ext/enterprise_script_service/msgpack/test/object_with_zone.cpp +12 -8
  206. data/ext/enterprise_script_service/msgpack/test/pack_unpack.cpp +30 -26
  207. data/ext/enterprise_script_service/msgpack/test/pack_unpack_c.cpp +4 -0
  208. data/ext/enterprise_script_service/msgpack/test/raw.cpp +4 -0
  209. data/ext/enterprise_script_service/msgpack/test/reference.cpp +4 -0
  210. data/ext/enterprise_script_service/msgpack/test/reference_cpp11.cpp +4 -0
  211. data/ext/enterprise_script_service/msgpack/test/reference_wrapper_cpp11.cpp +4 -0
  212. data/ext/enterprise_script_service/msgpack/test/shared_ptr_cpp11.cpp +4 -0
  213. data/ext/enterprise_script_service/msgpack/test/size_equal_only.cpp +4 -0
  214. data/ext/enterprise_script_service/msgpack/test/streaming.cpp +8 -4
  215. data/ext/enterprise_script_service/msgpack/test/streaming_c.cpp +4 -0
  216. data/ext/enterprise_script_service/msgpack/test/unique_ptr_cpp11.cpp +4 -0
  217. data/ext/enterprise_script_service/msgpack/test/user_class.cpp +16 -12
  218. data/ext/enterprise_script_service/msgpack/test/version.cpp +4 -0
  219. data/ext/enterprise_script_service/msgpack/test/visitor.cpp +4 -0
  220. data/ext/enterprise_script_service/msgpack/test/zone.cpp +4 -0
  221. data/lib/script_core/version.rb +1 -1
  222. data/script_core.gemspec +1 -1
  223. metadata +23 -9
  224. data/ext/enterprise_script_service/msgpack/.travis.yml +0 -258
@@ -1,5 +1,9 @@
1
- ADD_SUBDIRECTORY (c)
2
- ADD_SUBDIRECTORY (cpp03)
3
- ADD_SUBDIRECTORY (cpp11)
4
- ADD_SUBDIRECTORY (boost)
5
- ADD_SUBDIRECTORY (x3)
1
+ IF (NOT MSGPACK_CXX_ONLY)
2
+ ADD_SUBDIRECTORY (c)
3
+ ENDIF ()
4
+ IF (MSGPACK_ENABLE_CXX)
5
+ ADD_SUBDIRECTORY (cpp03)
6
+ ADD_SUBDIRECTORY (cpp11)
7
+ ADD_SUBDIRECTORY (boost)
8
+ ADD_SUBDIRECTORY (x3)
9
+ ENDIF ()
@@ -27,7 +27,7 @@ FOREACH (source_file ${exec_PROGRAMS})
27
27
  )
28
28
  TARGET_INCLUDE_DIRECTORIES (${source_file_we}
29
29
  PRIVATE
30
- $<TARGET_PROPERTY:msgpackc,INTERFACE_INCLUDE_DIRECTORIES>
30
+ $<TARGET_PROPERTY:msgpackc-cxx,INTERFACE_INCLUDE_DIRECTORIES>
31
31
  )
32
32
  TARGET_LINK_LIBRARIES (${source_file_we}
33
33
  ${Boost_SYSTEM_LIBRARY}
@@ -1,10 +1,16 @@
1
+ FIND_PACKAGE (cJSON)
2
+
1
3
  LIST (APPEND exec_PROGRAMS
4
+ boundary.c
2
5
  lib_buffer_unpack.c
3
6
  simple_c.c
4
7
  speed_test_uint32_array.c
5
8
  speed_test_uint64_array.c
6
9
  user_buffer_unpack.c
7
10
  )
11
+ IF (cJSON_FOUND)
12
+ LIST (APPEND exec_PROGRAMS jsonconv.c)
13
+ ENDIF ()
8
14
 
9
15
  FOREACH (source_file ${exec_PROGRAMS})
10
16
  GET_FILENAME_COMPONENT (source_file_we ${source_file} NAME_WE)
@@ -15,19 +21,24 @@ FOREACH (source_file ${exec_PROGRAMS})
15
21
  TARGET_LINK_LIBRARIES (${source_file_we}
16
22
  msgpackc
17
23
  )
18
- IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
24
+ IF ("${CMAKE_C_COMPILER_ID}" STREQUAL "Clang" OR "${CMAKE_C_COMPILER_ID}" STREQUAL "GNU")
19
25
  SET_PROPERTY (TARGET ${source_file_we} APPEND_STRING PROPERTY COMPILE_FLAGS " -Wall -Wextra")
20
26
  ENDIF ()
21
27
 
22
- IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
28
+ IF ("${CMAKE_C_COMPILER_ID}" STREQUAL "Clang")
23
29
  SET_PROPERTY (TARGET ${source_file_we} APPEND_STRING PROPERTY COMPILE_FLAGS " -Wno-mismatched-tags")
24
30
  ENDIF ()
25
31
 
26
- IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
27
- IF (CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
28
- STRING(REGEX REPLACE "/W[0-4]" "/W3 /WX" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
32
+ IF ("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC")
33
+ IF (CMAKE_C_FLAGS MATCHES "/W[0-4]")
34
+ STRING(REGEX REPLACE "/W[0-4]" "/W3 /WX" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
29
35
  ELSE ()
30
- SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3 /WX")
36
+ SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3 /WX")
31
37
  ENDIF ()
32
38
  ENDIF ()
33
39
  ENDFOREACH ()
40
+
41
+ IF (cJSON_FOUND)
42
+ TARGET_LINK_LIBRARIES (jsonconv ${CJSON_LIBRARIES})
43
+ TARGET_INCLUDE_DIRECTORIES(jsonconv PRIVATE ${CJSON_INCLUDE_DIRS})
44
+ ENDIF ()
@@ -0,0 +1,296 @@
1
+ /* gcc boundary.c -o boundary -Wconversion -Wpointer-sign */
2
+ #include <msgpack.h>
3
+ #include <stdio.h>
4
+ #include <assert.h>
5
+
6
+ static inline unsigned char atohex(char a)
7
+ {
8
+ int x;
9
+ if (a >= 'a') {
10
+ x = a - 'a' + 10;
11
+ } else if (a >= 'A') {
12
+ x = a - 'A' + 10;
13
+ } else {
14
+ x = a - '0';
15
+ }
16
+ assert(x >= 0 && x < 16);
17
+ return (unsigned char)x;
18
+ }
19
+
20
+ // Return 0 if equal
21
+ static inline int bytesncmp(char *data, const char *bytes, size_t len)
22
+ {
23
+ size_t n = len >> 1;
24
+ size_t i = 0;
25
+ int diff;
26
+ for (; i < n; i++) {
27
+ diff = (unsigned char)data[i] - (atohex(bytes[2 * i]) << 4) - atohex(bytes[2 * i + 1]);
28
+ if (diff != 0) {
29
+ return diff;
30
+ }
31
+ }
32
+ return 0;
33
+ }
34
+
35
+ int main()
36
+ {
37
+ msgpack_sbuffer sbuf;
38
+ msgpack_packer *x;
39
+ size_t offset = 0;
40
+ char data[65536];
41
+ msgpack_timestamp ts[] = {
42
+ { 0xFFFFFFFF, 0 },
43
+ { 0x100000000, 0 },
44
+ { 0x3FFFFFFFF, 0 },
45
+ { 0x400000000, 0 },
46
+ { INT64_MAX, UINT32_MAX }
47
+ };
48
+
49
+ #define check_sbuffer(b) \
50
+ do { \
51
+ size_t len = strlen(#b); \
52
+ assert((sbuf.size - offset) * 2 == len); \
53
+ assert(bytesncmp(sbuf.data + offset, #b, len) == 0); \
54
+ offset = sbuf.size; \
55
+ } while (0)
56
+
57
+ msgpack_sbuffer_init(&sbuf);
58
+ x = msgpack_packer_new(&sbuf, msgpack_sbuffer_write);
59
+
60
+ msgpack_pack_fix_uint8(x, 0); check_sbuffer(cc00); /* cc 00 */
61
+ msgpack_pack_fix_uint8(x, 0xFF); check_sbuffer(ccff); /* cc ff */
62
+ msgpack_pack_fix_uint16(x, 0); check_sbuffer(cd0000); /* cd 00 00 */
63
+ msgpack_pack_fix_uint16(x, 0xFFFF); check_sbuffer(cdffff); /* cd ff ff */
64
+ msgpack_pack_fix_uint32(x, 0); check_sbuffer(ce00000000); /* ce 00 00 00 00 */
65
+ msgpack_pack_fix_uint32(x, 0xFFFFFFFF); check_sbuffer(ceffffffff); /* ce ff ff ff ff */
66
+ msgpack_pack_fix_uint64(x, 0); check_sbuffer(cf0000000000000000); /* cf 00 00 00 00 00 00 00 00 */
67
+ msgpack_pack_fix_uint64(x, 0xFFFFFFFFFFFFFFFF); check_sbuffer(cfffffffffffffffff); /* cf ff ff ff ff ff ff ff ff */
68
+
69
+ msgpack_pack_uint8(x, 0); check_sbuffer(00); /* 00 */
70
+ msgpack_pack_uint8(x, 0x7F); check_sbuffer(7f); /* 7f */
71
+ msgpack_pack_uint8(x, 0x80); check_sbuffer(cc80); /* cc 80 */
72
+ msgpack_pack_uint8(x, 0xFF); check_sbuffer(ccff); /* cc ff */
73
+
74
+ msgpack_pack_uint16(x, 0); check_sbuffer(00); /* 00 */
75
+ msgpack_pack_uint16(x, 0x7F); check_sbuffer(7f); /* 7f */
76
+ msgpack_pack_uint16(x, 0x80); check_sbuffer(cc80); /* cc 80 */
77
+ msgpack_pack_uint16(x, 0xFF); check_sbuffer(ccff); /* cc ff */
78
+ msgpack_pack_uint16(x, 0x100); check_sbuffer(cd0100); /* cd 01 00 */
79
+ msgpack_pack_uint16(x, 0xFFFF); check_sbuffer(cdffff); /* cd ff ff */
80
+
81
+ msgpack_pack_uint32(x, 0); check_sbuffer(00); /* 00 */
82
+ msgpack_pack_uint32(x, 0x7F); check_sbuffer(7f); /* 7f */
83
+ msgpack_pack_uint32(x, 0x80); check_sbuffer(cc80); /* cc 80 */
84
+ msgpack_pack_uint32(x, 0xFF); check_sbuffer(ccff); /* cc ff */
85
+ msgpack_pack_uint32(x, 0x100); check_sbuffer(cd0100); /* cd 01 00 */
86
+ msgpack_pack_uint32(x, 0xFFFF); check_sbuffer(cdffff); /* cd ff ff */
87
+ msgpack_pack_uint32(x, 0x10000); check_sbuffer(ce00010000); /* ce 00 01 00 00 */
88
+ msgpack_pack_uint32(x, 0xFFFFFFFF); check_sbuffer(ceffffffff); /* ce ff ff ff ff */
89
+
90
+ msgpack_pack_uint64(x, 0); check_sbuffer(00); /* 00 */
91
+ msgpack_pack_uint64(x, 0x7F); check_sbuffer(7f); /* 7f */
92
+ msgpack_pack_uint64(x, 0x80); check_sbuffer(cc80); /* cc 80 */
93
+ msgpack_pack_uint64(x, 0xFF); check_sbuffer(ccff); /* cc ff */
94
+ msgpack_pack_uint64(x, 0x100); check_sbuffer(cd0100); /* cd 01 00 */
95
+ msgpack_pack_uint64(x, 0xFFFF); check_sbuffer(cdffff); /* cd ff ff */
96
+ msgpack_pack_uint64(x, 0x10000); check_sbuffer(ce00010000); /* ce 00 01 00 00 */
97
+ msgpack_pack_uint64(x, 0xFFFFFFFF); check_sbuffer(ceffffffff); /* ce ff ff ff ff */
98
+ msgpack_pack_uint64(x, 0x100000000); check_sbuffer(cf0000000100000000); /* cf 00 00 00 01 00 00 00 00 */
99
+ msgpack_pack_uint64(x, 0xFFFFFFFFFFFFFFFF); check_sbuffer(cfffffffffffffffff); /* cf ff ff ff ff ff ff ff ff */
100
+
101
+ msgpack_pack_fix_int8(x, 0x7F); check_sbuffer(d07f); /* d0 7f */
102
+ msgpack_pack_fix_int8(x, -0x7F-1); check_sbuffer(d080); /* d0 80 */
103
+ msgpack_pack_fix_int16(x, 0x7FFF); check_sbuffer(d17fff); /* d1 7f ff */
104
+ msgpack_pack_fix_int16(x, -0x7FFF-1); check_sbuffer(d18000); /* d1 80 00 */
105
+ msgpack_pack_fix_int32(x, 0x7FFFFFFF); check_sbuffer(d27fffffff); /* d2 7f ff ff ff */
106
+ msgpack_pack_fix_int32(x, -0x7FFFFFFF-1); check_sbuffer(d280000000); /* d2 80 00 00 00 */
107
+ msgpack_pack_fix_int64(x, 0x7FFFFFFFFFFFFFFF); check_sbuffer(d37fffffffffffffff); /* d3 7f ff ff ff ff ff ff ff */
108
+ msgpack_pack_fix_int64(x, -0x7FFFFFFFFFFFFFFF-1); check_sbuffer(d38000000000000000); /* d3 80 00 00 00 00 00 00 00 */
109
+
110
+ msgpack_pack_int8(x, -0x7F-1); check_sbuffer(d080); /* d0 80 */
111
+ msgpack_pack_int8(x, -0x21); check_sbuffer(d0df); /* d0 df */
112
+ msgpack_pack_int8(x, -0x20); check_sbuffer(e0); /* e0 */
113
+ msgpack_pack_int8(x, -1); check_sbuffer(ff); /* ff */
114
+ msgpack_pack_int8(x, 0); check_sbuffer(00); /* 00 */
115
+ msgpack_pack_int8(x, 0x7F); check_sbuffer(7f); /* 7f */
116
+
117
+ msgpack_pack_int16(x, -0x7FFF-1); check_sbuffer(d18000); /* d1 80 00 */
118
+ msgpack_pack_int16(x, -0x81); check_sbuffer(d1ff7f); /* d1 ff 7f */
119
+ msgpack_pack_int16(x, -0x80); check_sbuffer(d080); /* d0 80 */
120
+ msgpack_pack_int16(x, -0x21); check_sbuffer(d0df); /* d0 df */
121
+ msgpack_pack_int16(x, -0x20); check_sbuffer(e0); /* e0 */
122
+ msgpack_pack_int16(x, -0x1); check_sbuffer(ff); /* ff */
123
+ msgpack_pack_int16(x, 0); check_sbuffer(00); /* 00 */
124
+ msgpack_pack_int16(x, 0x7F); check_sbuffer(7f); /* 7f */
125
+ msgpack_pack_int16(x, 0x80); check_sbuffer(cc80); /* cc 80 */
126
+ msgpack_pack_int16(x, 0xFF); check_sbuffer(ccff); /* cc ff */
127
+ msgpack_pack_int16(x, 0x100); check_sbuffer(cd0100); /* cd 01 00 */
128
+ msgpack_pack_int16(x, 0x7FFF); check_sbuffer(cd7fff); /* cd 7f ff */
129
+
130
+ msgpack_pack_int32(x, -0x7FFFFFFF-1); check_sbuffer(d280000000); /* d2 80 00 00 00 */
131
+ msgpack_pack_int32(x, -0x8001); check_sbuffer(d2ffff7fff); /* d2 ff ff 7f ff */
132
+ msgpack_pack_int32(x, -0x8000); check_sbuffer(d18000); /* d1 80 00 */
133
+ msgpack_pack_int32(x, -0x81); check_sbuffer(d1ff7f); /* d1 ff 7f */
134
+ msgpack_pack_int32(x, -0x80); check_sbuffer(d080); /* d0 80 */
135
+ msgpack_pack_int32(x, -0x21); check_sbuffer(d0df); /* d0 df */
136
+ msgpack_pack_int32(x, -0x20); check_sbuffer(e0); /* e0 */
137
+ msgpack_pack_int32(x, -0x1); check_sbuffer(ff); /* ff */
138
+ msgpack_pack_int32(x, 0); check_sbuffer(00); /* 00 */
139
+ msgpack_pack_int32(x, 0x7F); check_sbuffer(7f); /* 7f */
140
+ msgpack_pack_int32(x, 0x80); check_sbuffer(cc80); /* cc 80 */
141
+ msgpack_pack_int32(x, 0xFF); check_sbuffer(ccff); /* cc ff */
142
+ msgpack_pack_int32(x, 0x100); check_sbuffer(cd0100); /* cd 01 00 */
143
+ msgpack_pack_int32(x, 0xFFFF); check_sbuffer(cdffff); /* cd ff ff */
144
+ msgpack_pack_int32(x, 0x10000); check_sbuffer(ce00010000); /* ce 00 01 00 00 */
145
+ msgpack_pack_int32(x, 0x7FFFFFFF); check_sbuffer(ce7fffffff); /* ce 7f ff ff ff */
146
+
147
+ msgpack_pack_int64(x, -0x7FFFFFFFFFFFFFFF-1); check_sbuffer(d38000000000000000); /* d3 80 00 00 00 00 00 00 00 */
148
+ msgpack_pack_int64(x, -((1LL<<31)+1)); check_sbuffer(d3ffffffff7fffffff); /* d3 ff ff ff ff 7f ff ff ff */
149
+ msgpack_pack_int64(x, -(1LL<<31)); check_sbuffer(d280000000); /* d2 80 00 00 00 */
150
+ msgpack_pack_int64(x, -0x8001); check_sbuffer(d2ffff7fff); /* d2 ff ff 7f ff */
151
+ msgpack_pack_int64(x, -0x8000); check_sbuffer(d18000); /* d1 80 00 */
152
+ msgpack_pack_int64(x, -0x81); check_sbuffer(d1ff7f); /* d1 ff 7f */
153
+ msgpack_pack_int64(x, -0x80); check_sbuffer(d080); /* d0 80 */
154
+ msgpack_pack_int64(x, -0x21); check_sbuffer(d0df); /* d0 df */
155
+ msgpack_pack_int64(x, -0x20); check_sbuffer(e0); /* e0 */
156
+ msgpack_pack_int64(x, -0x1); check_sbuffer(ff); /* ff */
157
+ msgpack_pack_int64(x, 0); check_sbuffer(00); /* 00 */
158
+ msgpack_pack_int64(x, 0x7F); check_sbuffer(7f); /* 7f */
159
+ msgpack_pack_int64(x, 0x80); check_sbuffer(cc80); /* cc 80 */
160
+ msgpack_pack_int64(x, 0xFF); check_sbuffer(ccff); /* cc ff */
161
+ msgpack_pack_int64(x, 0x100); check_sbuffer(cd0100); /* cd 01 00 */
162
+ msgpack_pack_int64(x, 0xFFFF); check_sbuffer(cdffff); /* cd ff ff */
163
+ msgpack_pack_int64(x, 0x10000); check_sbuffer(ce00010000); /* ce 00 01 00 00 */
164
+ msgpack_pack_int64(x, 0xFFFFFFFF); check_sbuffer(ceffffffff); /* ce ff ff ff ff */
165
+ msgpack_pack_int64(x, 0x100000000); check_sbuffer(cf0000000100000000); /* cf 00 00 00 01 00 00 00 00 */
166
+ msgpack_pack_int64(x, 0x7FFFFFFFFFFFFFFF); check_sbuffer(cf7fffffffffffffff); /* cf 7f ff ff ff ff ff ff ff */
167
+
168
+ msgpack_pack_nil(x); check_sbuffer(c0); /* c0 */
169
+ msgpack_pack_false(x); check_sbuffer(c2); /* c2 */
170
+ msgpack_pack_true(x); check_sbuffer(c3); /* c3 */
171
+
172
+ msgpack_pack_float(x, 1.0); check_sbuffer(ca3f800000); /* ca 3f 80 00 00 */
173
+ msgpack_pack_double(x, 1.0); check_sbuffer(cb3ff0000000000000); /* cb 3f f0 00 00 00 00 00 00 */
174
+
175
+ msgpack_pack_unsigned_char(x, UINT8_MAX); /* same as msgpack_pack_uint8() */
176
+ msgpack_pack_unsigned_short(x, (unsigned short)UINT64_MAX);
177
+ msgpack_pack_unsigned_int(x, (unsigned int)UINT64_MAX);
178
+ msgpack_pack_unsigned_long(x, (unsigned long)UINT64_MAX);
179
+ msgpack_pack_unsigned_long_long(x, (unsigned long long)UINT64_MAX);
180
+
181
+ msgpack_pack_signed_char(x, INT8_MAX); /* same as msgpack_pack_int8() */
182
+
183
+ #define check_sbuffer_n(b) \
184
+ do { \
185
+ size_t len = strlen(#b); \
186
+ assert(bytesncmp(sbuf.data + offset, #b, len) == 0); \
187
+ offset = sbuf.size; \
188
+ } while (0)
189
+
190
+ #define fill_str(n) msgpack_pack_str_body(x, data, n)
191
+
192
+ offset = sbuf.size;
193
+ msgpack_pack_str(x, 0); /* "" */ check_sbuffer(a0); /* a0 */
194
+ msgpack_pack_str(x, 31);
195
+ fill_str(31); check_sbuffer_n(bf); /* bf ... */
196
+ msgpack_pack_str(x, 32);
197
+ fill_str(32); check_sbuffer_n(d920); /* d9 20 ... */
198
+ msgpack_pack_str(x, 255);
199
+ fill_str(255); check_sbuffer_n(d9ff); /* d9 ff ... */
200
+ msgpack_pack_str(x, 256);
201
+ fill_str(256); check_sbuffer_n(da0100); /* da 01 00 ... */
202
+ msgpack_pack_str(x, 65535);
203
+ fill_str(65535); check_sbuffer_n(daffff); /* da ff ff ... */
204
+ msgpack_pack_str(x, 65536);
205
+ fill_str(65536); check_sbuffer_n(db00010000); /* db 00 01 00 00 ... */
206
+
207
+ #define fill_map(n) \
208
+ do { \
209
+ size_t i = 0; \
210
+ for (; i < n * 2; i++) { msgpack_pack_int8(x, 0x1); } \
211
+ } while (0);
212
+
213
+ msgpack_pack_map(x, 0); /* {} */ check_sbuffer(80); /* 80 */
214
+ msgpack_pack_map(x, 1);
215
+ fill_map(1); check_sbuffer_n(81); /* 81 ... */
216
+ msgpack_pack_map(x, 15);
217
+ fill_map(15); check_sbuffer_n(8f); /* 8f ... */
218
+ msgpack_pack_map(x, 16);
219
+ fill_map(16); check_sbuffer_n(de0010); /* de 00 10 ... */
220
+ msgpack_pack_map(x, 65535);
221
+ fill_map(65535); check_sbuffer_n(deffff); /* de ff ff ... */
222
+ msgpack_pack_map(x, 65536);
223
+ fill_map(65536); check_sbuffer_n(df00010000); /* df 00 01 00 00 ... */
224
+
225
+ #define fill_array(n) \
226
+ do { \
227
+ size_t i = 0; \
228
+ for (; i < n; i++) { msgpack_pack_int8(x, 0x1); } \
229
+ } while (0);
230
+
231
+ msgpack_pack_array(x, 0); /* [] */ check_sbuffer(90); /* 90 */
232
+ msgpack_pack_array(x, 1);
233
+ fill_array(1); check_sbuffer_n(91); /* 91 ... */
234
+ msgpack_pack_array(x, 15);
235
+ fill_array(15); check_sbuffer_n(9f); /* 9f ... */
236
+ msgpack_pack_array(x, 16);
237
+ fill_array(16); check_sbuffer_n(dc0010); /* dc 00 10 ... */
238
+ msgpack_pack_array(x, 65535);
239
+ fill_array(65535); check_sbuffer_n(dcffff); /* dc ff ff ... */
240
+ msgpack_pack_array(x, 65536);
241
+ fill_array(65536); check_sbuffer_n(dd00010000); /* dd 00 01 00 00 ... */
242
+
243
+ #define fill_bin(n) msgpack_pack_bin_body(x, data, n)
244
+
245
+ msgpack_pack_bin(x, 0); check_sbuffer(c400); /* c4 00 */
246
+ msgpack_pack_bin(x, 1);
247
+ fill_bin(1); check_sbuffer_n(c401); /* c4 01 ... */
248
+ msgpack_pack_bin(x, 255);
249
+ fill_bin(255); check_sbuffer_n(c4ff); /* c4 ff ... */
250
+ msgpack_pack_bin(x, 256);
251
+ fill_bin(256); check_sbuffer_n(c50100); /* c5 01 00 ... */
252
+ msgpack_pack_bin(x, 65535);
253
+ fill_bin(65535); check_sbuffer_n(c5ffff); /* c5 ff ff ... */
254
+ msgpack_pack_bin(x, 65536);
255
+ fill_bin(65536); check_sbuffer_n(c600010000); /* c6 00 01 00 00 ... */
256
+
257
+ #define fill_ext(n) msgpack_pack_ext_body(x, data, n)
258
+
259
+ msgpack_pack_ext(x, 1, 0x7F);
260
+ fill_ext(1); check_sbuffer_n(d47f); /* d4 7f ... */
261
+ msgpack_pack_ext(x, 2, 0x7F);
262
+ fill_ext(2); check_sbuffer_n(d57f); /* d5 7f ... */
263
+ msgpack_pack_ext(x, 4, 0x7F);
264
+ fill_ext(4); check_sbuffer_n(d67f); /* d6 7f ... */
265
+ msgpack_pack_ext(x, 8, 0x7F);
266
+ fill_ext(8); check_sbuffer_n(d77f); /* d7 7f ... */
267
+ msgpack_pack_ext(x, 16, 0x7F);
268
+ fill_ext(16); check_sbuffer_n(d87f); /* d8 7f ... */
269
+
270
+ msgpack_pack_ext(x, 0, 0x7F); check_sbuffer(c7007f); /* c7 00 7f */
271
+ msgpack_pack_ext(x, 3, 0x7F);
272
+ fill_ext(3); check_sbuffer_n(c7037f); /* c7 03 7f */
273
+ msgpack_pack_ext(x, 5, 0x7F);
274
+ fill_ext(5); check_sbuffer_n(c7057f); /* c7 05 7f */
275
+ msgpack_pack_ext(x, 17, 0x7F);
276
+ fill_ext(17); check_sbuffer_n(c7117f); /* c7 11 7f */
277
+ msgpack_pack_ext(x, 255, 0x7F);
278
+ fill_ext(255); check_sbuffer_n(c7ff7f); /* c7 ff 7f ... */
279
+ msgpack_pack_ext(x, 256, 0x7F);
280
+ fill_ext(256); check_sbuffer_n(c801007f); /* c8 01 00 7f ... */
281
+ msgpack_pack_ext(x, 65535, 0x7F);
282
+ fill_ext(65535); check_sbuffer_n(c8ffff7f); /* c8 ff ff 7f ... */
283
+ msgpack_pack_ext(x, 65536, 0x7F);
284
+ fill_ext(65536); check_sbuffer_n(c9000100007f); /* c9 00 01 00 00 7f ... */
285
+
286
+ msgpack_pack_timestamp(x, ts); check_sbuffer(d6ffffffffff); /* d6 ff ff ff ff ff */
287
+ msgpack_pack_timestamp(x, ts + 1); check_sbuffer(d7ff0000000100000000); /* d7 ff 00 00 00 01 00 00 00 00 */
288
+ msgpack_pack_timestamp(x, ts + 2); check_sbuffer(d7ff00000003ffffffff); /* d7 ff 00 00 00 03 ff ff ff ff */
289
+ msgpack_pack_timestamp(x, ts + 3); check_sbuffer(c70cff000000000000000400000000); /* c7 0c ff 00 00 00 00 00 00 00 04 00 00 00 00 */
290
+ msgpack_pack_timestamp(x, ts + 4); check_sbuffer(c70cffffffffff7fffffffffffffff); /* c7 0c ff ff ff ff ff 7f ff ff ff ff ff ff ff */
291
+
292
+ msgpack_sbuffer_destroy(&sbuf);
293
+ msgpack_packer_free(x);
294
+
295
+ return 0;
296
+ }
@@ -0,0 +1,419 @@
1
+ #include <stdio.h>
2
+ #include <stdlib.h>
3
+ #include <string.h>
4
+ #include <math.h>
5
+ #include <msgpack.h>
6
+ #include <cjson/cJSON.h>
7
+
8
+ #if defined(_MSC_VER)
9
+ #if _MSC_VER >= 1800
10
+ #include <inttypes.h>
11
+ #else
12
+ #define PRIu64 "I64u"
13
+ #define PRIi64 "I64i"
14
+ #define PRIi8 "i"
15
+ #endif
16
+ #else
17
+ #include <inttypes.h>
18
+ #endif
19
+
20
+ #if defined(_KERNEL_MODE)
21
+ # undef snprintf
22
+ # define snprintf _snprintf
23
+ #endif
24
+
25
+ #define DEBUG(...) printf(__VA_ARGS__)
26
+
27
+ static char *format_string(const char *input)
28
+ {
29
+ const char *inptr;
30
+ char *output;
31
+ char *outptr;
32
+ size_t output_length = 0;
33
+ /* numbers of additional characters*/
34
+ size_t escape_characters = 0;
35
+
36
+ if (input == NULL) {
37
+ return NULL;
38
+ }
39
+
40
+ for (inptr = input; *inptr; inptr++) {
41
+ switch (*inptr) {
42
+ case '\"':
43
+ case '\\':
44
+ case '\b':
45
+ case '\f':
46
+ case '\n':
47
+ case '\r':
48
+ case '\t':
49
+ /* one character escape sequence */
50
+ escape_characters++;
51
+ break;
52
+ default:
53
+ break;
54
+ }
55
+ }
56
+ output_length = (size_t)(inptr - input) + escape_characters;
57
+
58
+ output = (char *)malloc(output_length + 1);
59
+ if (output == NULL) {
60
+ return NULL;
61
+ }
62
+
63
+ /* no add characters*/
64
+ if (escape_characters == 0) {
65
+ memcpy(output, input, output_length);
66
+ output[output_length] = '\0';
67
+ return output;
68
+ }
69
+
70
+ outptr = output;
71
+ /* copy string */
72
+ for (inptr = input; *inptr != '\0'; (void)inptr++, outptr++) {
73
+ if ((*inptr > 31) && (*inptr != '\"') && (*inptr != '\\')) {
74
+ /* normal character, copy */
75
+ *outptr = *inptr;
76
+ } else {
77
+ /* character needs to be escaped */
78
+ *outptr++ = '\\';
79
+ switch (*inptr)
80
+ {
81
+ case '\\':
82
+ *outptr = '\\';
83
+ break;
84
+ case '\"':
85
+ *outptr = '\"';
86
+ break;
87
+ case '\b':
88
+ *outptr = 'b';
89
+ break;
90
+ case '\f':
91
+ *outptr = 'f';
92
+ break;
93
+ case '\n':
94
+ *outptr = 'n';
95
+ break;
96
+ case '\r':
97
+ *outptr = 'r';
98
+ break;
99
+ case '\t':
100
+ *outptr = 't';
101
+ break;
102
+ default:
103
+ break;
104
+ }
105
+ }
106
+ }
107
+
108
+ output[output_length] = '\0';
109
+ return output;
110
+ }
111
+
112
+ /*
113
+ * Pack cJSON object.
114
+ * return 0 success, others failed
115
+ */
116
+ static int parse_cjson_object(msgpack_packer *pk, cJSON *node)
117
+ {
118
+ int ret, sz, i;
119
+ cJSON *child;
120
+ char *strvalue;
121
+
122
+ if (node == NULL) {
123
+ return -1;
124
+ }
125
+
126
+ switch (node->type & 0xFF) {
127
+ case cJSON_Invalid:
128
+ return -1;
129
+
130
+ case cJSON_False:
131
+ return msgpack_pack_false(pk);
132
+
133
+ case cJSON_True:
134
+ return msgpack_pack_true(pk);
135
+
136
+ case cJSON_NULL:
137
+ return msgpack_pack_nil(pk);
138
+
139
+ case cJSON_String:
140
+ strvalue = format_string(node->valuestring);
141
+ if (strvalue != NULL) {
142
+ ret = msgpack_pack_str_with_body(pk, strvalue, strlen(strvalue));
143
+ free(strvalue);
144
+ return ret;
145
+ } else {
146
+ return -1;
147
+ }
148
+
149
+ case cJSON_Number:
150
+ if (isnan(node->valuedouble) || isinf(node->valuedouble)) {
151
+ ret = msgpack_pack_nil(pk);
152
+ } else if (node->valuedouble == node->valueint) {
153
+ ret = msgpack_pack_int(pk, node->valueint);
154
+ } else {
155
+ ret = msgpack_pack_double(pk, node->valuedouble);
156
+ }
157
+ return ret;
158
+
159
+ case cJSON_Array:
160
+ sz = cJSON_GetArraySize(node);
161
+ if (msgpack_pack_array(pk, sz) != 0) {
162
+ return -1;
163
+ }
164
+ for (i = 0; i < sz; i++) {
165
+ if (parse_cjson_object(pk, cJSON_GetArrayItem(node, i)) != 0) {
166
+ return -1;
167
+ }
168
+ }
169
+ return 0;
170
+
171
+ case cJSON_Object:
172
+ sz = cJSON_GetArraySize(node);
173
+ if (msgpack_pack_map(pk, sz) != 0) {
174
+ return -1;
175
+ }
176
+ for (i = 0; i < sz; i++) {
177
+ child = cJSON_GetArrayItem(node, i);
178
+ strvalue = format_string(child->string);
179
+ if (strvalue == NULL) {
180
+ return -1;
181
+ }
182
+
183
+ if (msgpack_pack_str_with_body(pk, strvalue, strlen(strvalue)) != 0) {
184
+ free(strvalue);
185
+ return -1;
186
+ }
187
+ free(strvalue);
188
+ if (parse_cjson_object(pk, child) != 0) {
189
+ return -1;
190
+ }
191
+ }
192
+ return 0;
193
+
194
+ default:
195
+ DEBUG("unknown type.\n");
196
+ return -1;
197
+ }
198
+ return 0;
199
+ }
200
+
201
+ /*
202
+ * Pack json string to msgpack format data.
203
+ * return 0 success, -1 failed
204
+ */
205
+ int msgpack_pack_jsonstr(msgpack_packer *pk, const char *jsonstr)
206
+ {
207
+ int status;
208
+ cJSON *node;
209
+ const char *end = NULL;
210
+
211
+ if (pk == NULL || jsonstr == NULL) {
212
+ return -1;
213
+ }
214
+
215
+ node = cJSON_ParseWithOpts(jsonstr, &end, 1);
216
+ if (node == NULL) {
217
+ DEBUG("parse error: unexpected string `%s`\n", end);
218
+ return -1;
219
+ }
220
+ status = parse_cjson_object(pk, node);
221
+ cJSON_Delete(node);
222
+
223
+ return status;
224
+ }
225
+
226
+ static int bytes_contain_zero(const msgpack_object_bin *bin)
227
+ {
228
+ size_t i;
229
+ for (i = 0; i < bin->size; i++) {
230
+ if (bin->ptr[i] == 0) {
231
+ return 1;
232
+ }
233
+ }
234
+ return 0;
235
+ }
236
+
237
+ #define PRINT_JSONSTR_CALL(ret, func, aux_buffer, aux_buffer_size, ...) \
238
+ ret = func(aux_buffer, aux_buffer_size, __VA_ARGS__); \
239
+ if (ret <= 0) \
240
+ return ret; \
241
+ if (ret > aux_buffer_size) \
242
+ return 0; \
243
+ aux_buffer = aux_buffer + ret; \
244
+ aux_buffer_size = aux_buffer_size - ret
245
+
246
+ /*
247
+ * Convert msgpack format data to json string.
248
+ * return >0: success, 0: length of buffer not enough, -1: failed
249
+ */
250
+ size_t msgpack_object_print_jsonstr(char *buffer, size_t length, const msgpack_object o)
251
+ {
252
+ char *aux_buffer = buffer;
253
+ size_t aux_buffer_size = length;
254
+ size_t ret;
255
+
256
+ switch (o.type) {
257
+ case MSGPACK_OBJECT_NIL:
258
+ PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, "null");
259
+ break;
260
+
261
+ case MSGPACK_OBJECT_BOOLEAN:
262
+ PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, (o.via.boolean ? "true" : "false"));
263
+ break;
264
+
265
+ case MSGPACK_OBJECT_POSITIVE_INTEGER:
266
+ #if defined(PRIu64)
267
+ PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, "%" PRIu64, o.via.u64);
268
+ #else
269
+ if (o.via.u64 > ULONG_MAX) {
270
+ PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, "%lu", ULONG_MAX);
271
+ } else {
272
+ PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, "%lu", (unsigned long)o.via.u64);
273
+ }
274
+ #endif
275
+ break;
276
+
277
+ case MSGPACK_OBJECT_NEGATIVE_INTEGER:
278
+ #if defined(PRIi64)
279
+ PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, "%" PRIi64, o.via.i64);
280
+ #else
281
+ if (o.via.i64 > LONG_MAX) {
282
+ PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, "%ld", LONG_MAX);
283
+ } else if (o.via.i64 < LONG_MIN) {
284
+ PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, "%ld", LONG_MIN);
285
+ } else {
286
+ PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, "%ld", (signed long)o.via.i64);
287
+ }
288
+ #endif
289
+ break;
290
+
291
+ case MSGPACK_OBJECT_FLOAT32:
292
+ case MSGPACK_OBJECT_FLOAT64:
293
+ PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, "%f", o.via.f64);
294
+ break;
295
+
296
+ case MSGPACK_OBJECT_STR:
297
+ PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, "\"%.*s\"", (int)o.via.str.size, o.via.str.ptr);
298
+ break;
299
+
300
+ case MSGPACK_OBJECT_BIN:
301
+ if (bytes_contain_zero(&o.via.bin)) {
302
+ DEBUG("the value contains zero\n");
303
+ return -1;
304
+ }
305
+ PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, "\"%.*s\"", (int)o.via.bin.size, o.via.bin.ptr);
306
+ break;
307
+
308
+ case MSGPACK_OBJECT_EXT:
309
+ DEBUG("not support type: MSGPACK_OBJECT_EXT.\n");
310
+ return -1;
311
+
312
+ case MSGPACK_OBJECT_ARRAY:
313
+ PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, "[");
314
+ if (o.via.array.size != 0) {
315
+ msgpack_object *p = o.via.array.ptr;
316
+ msgpack_object *const pend = o.via.array.ptr + o.via.array.size;
317
+ PRINT_JSONSTR_CALL(ret, msgpack_object_print_jsonstr, aux_buffer, aux_buffer_size, *p);
318
+ ++p;
319
+ for (; p < pend; ++p) {
320
+ PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, ",");
321
+ PRINT_JSONSTR_CALL(ret, msgpack_object_print_jsonstr, aux_buffer, aux_buffer_size, *p);
322
+ }
323
+ }
324
+ PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, "]");
325
+ break;
326
+
327
+ case MSGPACK_OBJECT_MAP:
328
+ PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, "{");
329
+ if (o.via.map.size != 0) {
330
+ msgpack_object_kv *p = o.via.map.ptr;
331
+ msgpack_object_kv *const pend = o.via.map.ptr + o.via.map.size;
332
+
333
+ for (; p < pend; ++p) {
334
+ if (p->key.type != MSGPACK_OBJECT_STR) {
335
+ DEBUG("the key of in a map must be string.\n");
336
+ return -1;
337
+ }
338
+ if (p != o.via.map.ptr) {
339
+ PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, ",");
340
+ }
341
+ PRINT_JSONSTR_CALL(ret, msgpack_object_print_jsonstr, aux_buffer, aux_buffer_size, p->key);
342
+ PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, ":");
343
+ PRINT_JSONSTR_CALL(ret, msgpack_object_print_jsonstr, aux_buffer, aux_buffer_size, p->val);
344
+ }
345
+ }
346
+ PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, "}");
347
+ break;
348
+
349
+ default:
350
+ DEBUG("unknown type.\n");
351
+ return -1;
352
+ }
353
+
354
+ return length - aux_buffer_size;
355
+ }
356
+ #undef PRINT_JSONSTR_CALL
357
+
358
+ static void test(const char *name, const char *input, const char *expect)
359
+ {
360
+ msgpack_sbuffer sbuf;
361
+ {
362
+ // pack
363
+ msgpack_packer pk;
364
+ msgpack_sbuffer_init(&sbuf);
365
+ msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
366
+ if (msgpack_pack_jsonstr(&pk, input) < 0) {
367
+ msgpack_sbuffer_destroy(&sbuf);
368
+ printf("%s: invalid json string.\n", name);
369
+ return;
370
+ }
371
+ }
372
+
373
+ {
374
+ // unpack
375
+ #define MAX_JSONLEN 1024
376
+ msgpack_zone z;
377
+ msgpack_object obj;
378
+ size_t jsonstrlen = MAX_JSONLEN - 1;
379
+ char jsonparsed[MAX_JSONLEN];
380
+
381
+ msgpack_zone_init(&z, jsonstrlen);
382
+ msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
383
+ jsonstrlen = msgpack_object_print_jsonstr(jsonparsed, jsonstrlen, obj);
384
+ jsonparsed[jsonstrlen] = '\0';
385
+
386
+ //compare input and output
387
+ if (expect == NULL) {
388
+ expect = input;
389
+ }
390
+ if (strcmp(expect, jsonparsed) == 0) {
391
+ printf("%s: ok\n", name);
392
+ } else {
393
+ printf("%s: failed\n", name);
394
+ }
395
+ msgpack_zone_destroy(&z);
396
+ }
397
+ msgpack_sbuffer_destroy(&sbuf);
398
+ }
399
+
400
+ int main()
401
+ {
402
+ test("null", "null", NULL);
403
+ test("boolean", "false", NULL);
404
+ test("single string", "\"frsyuki\"", NULL);
405
+ test("single number", "\"100\"", NULL);
406
+ test("space", "[{\"valuespace\":\"\",\"\":\"keyspace\"},\"\",[\"\"]]", NULL);
407
+ test("quote", "\"My name is Tom (\\\"Bee\\\") Kobe\"", NULL);
408
+ test("escape", "\"\\\\b\\f\\n\\r\\t\"", NULL);
409
+ test("escape2", "\"\b\f\n\r\t\"", "\"\\b\\f\\n\\r\\t\"");
410
+ test("map", "{\"name\":\"Tom (\\\"Bee\\\") Kobe\",\"type\":\"image\",\"data\":{\"width\":360,\"height\":460,\"title\":\"View me\",\"ips\":[116,943,256,711]}}", NULL);
411
+ test("array", "[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"]", NULL);
412
+ test("number array", "[[101,121,-33],[119,911,171],[0,2,-3]]", NULL);
413
+ test("mix array", "[{\"name\":\"Tom\",\"city\":\"London\",\"country\":\"UK\",\"longitude\":23},{\"name\":\"Jack\",\"city\":\"Birmingham\",\"country\":\"UK\",\"longitude\":-22}]", NULL);
414
+ test("unicode", "\"\\u5C71\\u5DDD\\u7570\\u57DF\\u98A8\\u6708\\u540C\\u5929\"", "\"山川異域風月同天\"");
415
+ test("utf8", "\"山川異域風月同天\"", NULL);
416
+ test("double", "12.34", "12.340000");
417
+
418
+ return 0;
419
+ }