@point3/node-rdkafka 3.6.0-1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (707) hide show
  1. package/LICENSE.txt +20 -0
  2. package/README.md +636 -0
  3. package/binding.gyp +154 -0
  4. package/deps/librdkafka/.clang-format +136 -0
  5. package/deps/librdkafka/.clang-format-cpp +103 -0
  6. package/deps/librdkafka/.dir-locals.el +10 -0
  7. package/deps/librdkafka/.formatignore +33 -0
  8. package/deps/librdkafka/.gdbmacros +19 -0
  9. package/deps/librdkafka/.github/CODEOWNERS +1 -0
  10. package/deps/librdkafka/.github/ISSUE_TEMPLATE +34 -0
  11. package/deps/librdkafka/.semaphore/run-all-tests.yml +77 -0
  12. package/deps/librdkafka/.semaphore/semaphore-integration.yml +250 -0
  13. package/deps/librdkafka/.semaphore/semaphore.yml +378 -0
  14. package/deps/librdkafka/.semaphore/verify-linux-packages.yml +41 -0
  15. package/deps/librdkafka/CHANGELOG.md +2208 -0
  16. package/deps/librdkafka/CMakeLists.txt +291 -0
  17. package/deps/librdkafka/CODE_OF_CONDUCT.md +46 -0
  18. package/deps/librdkafka/CONFIGURATION.md +209 -0
  19. package/deps/librdkafka/CONTRIBUTING.md +431 -0
  20. package/deps/librdkafka/Doxyfile +2375 -0
  21. package/deps/librdkafka/INTRODUCTION.md +2481 -0
  22. package/deps/librdkafka/LICENSE +26 -0
  23. package/deps/librdkafka/LICENSE.cjson +22 -0
  24. package/deps/librdkafka/LICENSE.crc32c +28 -0
  25. package/deps/librdkafka/LICENSE.fnv1a +18 -0
  26. package/deps/librdkafka/LICENSE.hdrhistogram +27 -0
  27. package/deps/librdkafka/LICENSE.lz4 +26 -0
  28. package/deps/librdkafka/LICENSE.murmur2 +25 -0
  29. package/deps/librdkafka/LICENSE.nanopb +22 -0
  30. package/deps/librdkafka/LICENSE.opentelemetry +203 -0
  31. package/deps/librdkafka/LICENSE.pycrc +23 -0
  32. package/deps/librdkafka/LICENSE.queue +31 -0
  33. package/deps/librdkafka/LICENSE.regexp +5 -0
  34. package/deps/librdkafka/LICENSE.snappy +36 -0
  35. package/deps/librdkafka/LICENSE.tinycthread +26 -0
  36. package/deps/librdkafka/LICENSE.wingetopt +49 -0
  37. package/deps/librdkafka/LICENSES.txt +625 -0
  38. package/deps/librdkafka/Makefile +125 -0
  39. package/deps/librdkafka/README.md +199 -0
  40. package/deps/librdkafka/README.win32 +26 -0
  41. package/deps/librdkafka/STATISTICS.md +624 -0
  42. package/deps/librdkafka/configure +214 -0
  43. package/deps/librdkafka/configure.self +331 -0
  44. package/deps/librdkafka/debian/changelog +111 -0
  45. package/deps/librdkafka/debian/compat +1 -0
  46. package/deps/librdkafka/debian/control +71 -0
  47. package/deps/librdkafka/debian/copyright +99 -0
  48. package/deps/librdkafka/debian/gbp.conf +9 -0
  49. package/deps/librdkafka/debian/librdkafka++1.install +1 -0
  50. package/deps/librdkafka/debian/librdkafka-dev.examples +2 -0
  51. package/deps/librdkafka/debian/librdkafka-dev.install +9 -0
  52. package/deps/librdkafka/debian/librdkafka1.docs +5 -0
  53. package/deps/librdkafka/debian/librdkafka1.install +1 -0
  54. package/deps/librdkafka/debian/librdkafka1.symbols +135 -0
  55. package/deps/librdkafka/debian/rules +19 -0
  56. package/deps/librdkafka/debian/source/format +1 -0
  57. package/deps/librdkafka/debian/watch +2 -0
  58. package/deps/librdkafka/dev-conf.sh +123 -0
  59. package/deps/librdkafka/examples/CMakeLists.txt +79 -0
  60. package/deps/librdkafka/examples/Makefile +167 -0
  61. package/deps/librdkafka/examples/README.md +42 -0
  62. package/deps/librdkafka/examples/alter_consumer_group_offsets.c +338 -0
  63. package/deps/librdkafka/examples/consumer.c +271 -0
  64. package/deps/librdkafka/examples/delete_records.c +233 -0
  65. package/deps/librdkafka/examples/describe_cluster.c +322 -0
  66. package/deps/librdkafka/examples/describe_consumer_groups.c +455 -0
  67. package/deps/librdkafka/examples/describe_topics.c +427 -0
  68. package/deps/librdkafka/examples/elect_leaders.c +317 -0
  69. package/deps/librdkafka/examples/globals.json +11 -0
  70. package/deps/librdkafka/examples/idempotent_producer.c +344 -0
  71. package/deps/librdkafka/examples/incremental_alter_configs.c +347 -0
  72. package/deps/librdkafka/examples/kafkatest_verifiable_client.cpp +945 -0
  73. package/deps/librdkafka/examples/list_consumer_group_offsets.c +359 -0
  74. package/deps/librdkafka/examples/list_consumer_groups.c +365 -0
  75. package/deps/librdkafka/examples/list_offsets.c +327 -0
  76. package/deps/librdkafka/examples/misc.c +287 -0
  77. package/deps/librdkafka/examples/openssl_engine_example.cpp +248 -0
  78. package/deps/librdkafka/examples/producer.c +251 -0
  79. package/deps/librdkafka/examples/producer.cpp +228 -0
  80. package/deps/librdkafka/examples/rdkafka_complex_consumer_example.c +617 -0
  81. package/deps/librdkafka/examples/rdkafka_complex_consumer_example.cpp +467 -0
  82. package/deps/librdkafka/examples/rdkafka_consume_batch.cpp +264 -0
  83. package/deps/librdkafka/examples/rdkafka_example.c +853 -0
  84. package/deps/librdkafka/examples/rdkafka_example.cpp +679 -0
  85. package/deps/librdkafka/examples/rdkafka_performance.c +1781 -0
  86. package/deps/librdkafka/examples/transactions-older-broker.c +668 -0
  87. package/deps/librdkafka/examples/transactions.c +665 -0
  88. package/deps/librdkafka/examples/user_scram.c +491 -0
  89. package/deps/librdkafka/examples/win_ssl_cert_store.cpp +396 -0
  90. package/deps/librdkafka/lds-gen.py +73 -0
  91. package/deps/librdkafka/mainpage.doxy +40 -0
  92. package/deps/librdkafka/mklove/Makefile.base +329 -0
  93. package/deps/librdkafka/mklove/modules/configure.atomics +144 -0
  94. package/deps/librdkafka/mklove/modules/configure.base +2484 -0
  95. package/deps/librdkafka/mklove/modules/configure.builtin +70 -0
  96. package/deps/librdkafka/mklove/modules/configure.cc +186 -0
  97. package/deps/librdkafka/mklove/modules/configure.cxx +8 -0
  98. package/deps/librdkafka/mklove/modules/configure.fileversion +65 -0
  99. package/deps/librdkafka/mklove/modules/configure.gitversion +29 -0
  100. package/deps/librdkafka/mklove/modules/configure.good_cflags +18 -0
  101. package/deps/librdkafka/mklove/modules/configure.host +132 -0
  102. package/deps/librdkafka/mklove/modules/configure.lib +49 -0
  103. package/deps/librdkafka/mklove/modules/configure.libcurl +99 -0
  104. package/deps/librdkafka/mklove/modules/configure.libsasl2 +36 -0
  105. package/deps/librdkafka/mklove/modules/configure.libssl +147 -0
  106. package/deps/librdkafka/mklove/modules/configure.libzstd +58 -0
  107. package/deps/librdkafka/mklove/modules/configure.parseversion +95 -0
  108. package/deps/librdkafka/mklove/modules/configure.pic +16 -0
  109. package/deps/librdkafka/mklove/modules/configure.socket +20 -0
  110. package/deps/librdkafka/mklove/modules/configure.zlib +61 -0
  111. package/deps/librdkafka/mklove/modules/patches/README.md +8 -0
  112. package/deps/librdkafka/mklove/modules/patches/libcurl.0000-no-runtime-linking-check.patch +11 -0
  113. package/deps/librdkafka/mklove/modules/patches/libssl.0000-osx-rand-include-fix-OpenSSL-PR16409.patch +56 -0
  114. package/deps/librdkafka/packaging/RELEASE.md +319 -0
  115. package/deps/librdkafka/packaging/alpine/build-alpine.sh +38 -0
  116. package/deps/librdkafka/packaging/archlinux/PKGBUILD +30 -0
  117. package/deps/librdkafka/packaging/cmake/Config.cmake.in +37 -0
  118. package/deps/librdkafka/packaging/cmake/Modules/FindLZ4.cmake +38 -0
  119. package/deps/librdkafka/packaging/cmake/Modules/FindZSTD.cmake +27 -0
  120. package/deps/librdkafka/packaging/cmake/Modules/LICENSE.FindZstd +178 -0
  121. package/deps/librdkafka/packaging/cmake/README.md +38 -0
  122. package/deps/librdkafka/packaging/cmake/config.h.in +52 -0
  123. package/deps/librdkafka/packaging/cmake/parseversion.cmake +60 -0
  124. package/deps/librdkafka/packaging/cmake/rdkafka.pc.in +12 -0
  125. package/deps/librdkafka/packaging/cmake/try_compile/atomic_32_test.c +8 -0
  126. package/deps/librdkafka/packaging/cmake/try_compile/atomic_64_test.c +8 -0
  127. package/deps/librdkafka/packaging/cmake/try_compile/c11threads_test.c +14 -0
  128. package/deps/librdkafka/packaging/cmake/try_compile/crc32c_hw_test.c +27 -0
  129. package/deps/librdkafka/packaging/cmake/try_compile/dlopen_test.c +11 -0
  130. package/deps/librdkafka/packaging/cmake/try_compile/libsasl2_test.c +7 -0
  131. package/deps/librdkafka/packaging/cmake/try_compile/pthread_setname_darwin_test.c +6 -0
  132. package/deps/librdkafka/packaging/cmake/try_compile/pthread_setname_freebsd_test.c +7 -0
  133. package/deps/librdkafka/packaging/cmake/try_compile/pthread_setname_gnu_test.c +5 -0
  134. package/deps/librdkafka/packaging/cmake/try_compile/rand_r_test.c +7 -0
  135. package/deps/librdkafka/packaging/cmake/try_compile/rdkafka_setup.cmake +122 -0
  136. package/deps/librdkafka/packaging/cmake/try_compile/regex_test.c +10 -0
  137. package/deps/librdkafka/packaging/cmake/try_compile/strndup_test.c +5 -0
  138. package/deps/librdkafka/packaging/cmake/try_compile/sync_32_test.c +8 -0
  139. package/deps/librdkafka/packaging/cmake/try_compile/sync_64_test.c +8 -0
  140. package/deps/librdkafka/packaging/cp/README.md +16 -0
  141. package/deps/librdkafka/packaging/cp/check_features.c +72 -0
  142. package/deps/librdkafka/packaging/cp/verify-deb.sh +33 -0
  143. package/deps/librdkafka/packaging/cp/verify-packages.sh +69 -0
  144. package/deps/librdkafka/packaging/cp/verify-rpm.sh +32 -0
  145. package/deps/librdkafka/packaging/debian/changelog +66 -0
  146. package/deps/librdkafka/packaging/debian/compat +1 -0
  147. package/deps/librdkafka/packaging/debian/control +49 -0
  148. package/deps/librdkafka/packaging/debian/copyright +84 -0
  149. package/deps/librdkafka/packaging/debian/docs +5 -0
  150. package/deps/librdkafka/packaging/debian/gbp.conf +9 -0
  151. package/deps/librdkafka/packaging/debian/librdkafka-dev.dirs +2 -0
  152. package/deps/librdkafka/packaging/debian/librdkafka-dev.examples +2 -0
  153. package/deps/librdkafka/packaging/debian/librdkafka-dev.install +6 -0
  154. package/deps/librdkafka/packaging/debian/librdkafka-dev.substvars +1 -0
  155. package/deps/librdkafka/packaging/debian/librdkafka.dsc +16 -0
  156. package/deps/librdkafka/packaging/debian/librdkafka1-dbg.substvars +1 -0
  157. package/deps/librdkafka/packaging/debian/librdkafka1.dirs +1 -0
  158. package/deps/librdkafka/packaging/debian/librdkafka1.install +2 -0
  159. package/deps/librdkafka/packaging/debian/librdkafka1.postinst.debhelper +5 -0
  160. package/deps/librdkafka/packaging/debian/librdkafka1.postrm.debhelper +5 -0
  161. package/deps/librdkafka/packaging/debian/librdkafka1.symbols +64 -0
  162. package/deps/librdkafka/packaging/debian/rules +19 -0
  163. package/deps/librdkafka/packaging/debian/source/format +1 -0
  164. package/deps/librdkafka/packaging/debian/watch +2 -0
  165. package/deps/librdkafka/packaging/get_version.py +21 -0
  166. package/deps/librdkafka/packaging/homebrew/README.md +15 -0
  167. package/deps/librdkafka/packaging/homebrew/brew-update-pr.sh +31 -0
  168. package/deps/librdkafka/packaging/mingw-w64/configure-build-msys2-mingw-static.sh +52 -0
  169. package/deps/librdkafka/packaging/mingw-w64/configure-build-msys2-mingw.sh +21 -0
  170. package/deps/librdkafka/packaging/mingw-w64/export-variables.sh +13 -0
  171. package/deps/librdkafka/packaging/mingw-w64/run-tests.sh +6 -0
  172. package/deps/librdkafka/packaging/mingw-w64/semaphoreci-build.sh +38 -0
  173. package/deps/librdkafka/packaging/nuget/README.md +84 -0
  174. package/deps/librdkafka/packaging/nuget/artifact.py +177 -0
  175. package/deps/librdkafka/packaging/nuget/cleanup-s3.py +143 -0
  176. package/deps/librdkafka/packaging/nuget/common/p-common__plat-windows__arch-win32__bldtype-Release/msvcr120.zip +0 -0
  177. package/deps/librdkafka/packaging/nuget/common/p-common__plat-windows__arch-win32__bldtype-Release/msvcr140.zip +0 -0
  178. package/deps/librdkafka/packaging/nuget/common/p-common__plat-windows__arch-x64__bldtype-Release/msvcr120.zip +0 -0
  179. package/deps/librdkafka/packaging/nuget/common/p-common__plat-windows__arch-x64__bldtype-Release/msvcr140.zip +0 -0
  180. package/deps/librdkafka/packaging/nuget/nuget.sh +21 -0
  181. package/deps/librdkafka/packaging/nuget/nugetpackage.py +278 -0
  182. package/deps/librdkafka/packaging/nuget/packaging.py +448 -0
  183. package/deps/librdkafka/packaging/nuget/push-to-nuget.sh +21 -0
  184. package/deps/librdkafka/packaging/nuget/release.py +167 -0
  185. package/deps/librdkafka/packaging/nuget/requirements.txt +3 -0
  186. package/deps/librdkafka/packaging/nuget/staticpackage.py +178 -0
  187. package/deps/librdkafka/packaging/nuget/templates/librdkafka.redist.nuspec +21 -0
  188. package/deps/librdkafka/packaging/nuget/templates/librdkafka.redist.props +18 -0
  189. package/deps/librdkafka/packaging/nuget/templates/librdkafka.redist.targets +19 -0
  190. package/deps/librdkafka/packaging/nuget/zfile/__init__.py +0 -0
  191. package/deps/librdkafka/packaging/nuget/zfile/zfile.py +98 -0
  192. package/deps/librdkafka/packaging/rpm/Makefile +92 -0
  193. package/deps/librdkafka/packaging/rpm/README.md +23 -0
  194. package/deps/librdkafka/packaging/rpm/el7-x86_64.cfg +40 -0
  195. package/deps/librdkafka/packaging/rpm/librdkafka.spec +118 -0
  196. package/deps/librdkafka/packaging/rpm/mock-on-docker.sh +96 -0
  197. package/deps/librdkafka/packaging/rpm/tests/Makefile +25 -0
  198. package/deps/librdkafka/packaging/rpm/tests/README.md +8 -0
  199. package/deps/librdkafka/packaging/rpm/tests/run-test.sh +42 -0
  200. package/deps/librdkafka/packaging/rpm/tests/test-on-docker.sh +56 -0
  201. package/deps/librdkafka/packaging/rpm/tests/test.c +77 -0
  202. package/deps/librdkafka/packaging/rpm/tests/test.cpp +34 -0
  203. package/deps/librdkafka/packaging/tools/Dockerfile +31 -0
  204. package/deps/librdkafka/packaging/tools/build-configurations-checks.sh +12 -0
  205. package/deps/librdkafka/packaging/tools/build-deb-package.sh +64 -0
  206. package/deps/librdkafka/packaging/tools/build-debian.sh +65 -0
  207. package/deps/librdkafka/packaging/tools/build-manylinux.sh +68 -0
  208. package/deps/librdkafka/packaging/tools/build-release-artifacts.sh +139 -0
  209. package/deps/librdkafka/packaging/tools/distro-build.sh +38 -0
  210. package/deps/librdkafka/packaging/tools/gh-release-checksums.py +39 -0
  211. package/deps/librdkafka/packaging/tools/rdutcoverage.sh +25 -0
  212. package/deps/librdkafka/packaging/tools/requirements.txt +2 -0
  213. package/deps/librdkafka/packaging/tools/run-in-docker.sh +28 -0
  214. package/deps/librdkafka/packaging/tools/run-integration-tests.sh +31 -0
  215. package/deps/librdkafka/packaging/tools/run-style-check.sh +4 -0
  216. package/deps/librdkafka/packaging/tools/style-format.sh +149 -0
  217. package/deps/librdkafka/packaging/tools/update_rpcs_max_versions.py +100 -0
  218. package/deps/librdkafka/service.yml +172 -0
  219. package/deps/librdkafka/src/CMakeLists.txt +374 -0
  220. package/deps/librdkafka/src/Makefile +103 -0
  221. package/deps/librdkafka/src/README.lz4.md +30 -0
  222. package/deps/librdkafka/src/cJSON.c +2834 -0
  223. package/deps/librdkafka/src/cJSON.h +398 -0
  224. package/deps/librdkafka/src/crc32c.c +430 -0
  225. package/deps/librdkafka/src/crc32c.h +38 -0
  226. package/deps/librdkafka/src/generate_proto.sh +66 -0
  227. package/deps/librdkafka/src/librdkafka_cgrp_synch.png +0 -0
  228. package/deps/librdkafka/src/lz4.c +2727 -0
  229. package/deps/librdkafka/src/lz4.h +842 -0
  230. package/deps/librdkafka/src/lz4frame.c +2078 -0
  231. package/deps/librdkafka/src/lz4frame.h +692 -0
  232. package/deps/librdkafka/src/lz4frame_static.h +47 -0
  233. package/deps/librdkafka/src/lz4hc.c +1631 -0
  234. package/deps/librdkafka/src/lz4hc.h +413 -0
  235. package/deps/librdkafka/src/nanopb/pb.h +917 -0
  236. package/deps/librdkafka/src/nanopb/pb_common.c +388 -0
  237. package/deps/librdkafka/src/nanopb/pb_common.h +49 -0
  238. package/deps/librdkafka/src/nanopb/pb_decode.c +1727 -0
  239. package/deps/librdkafka/src/nanopb/pb_decode.h +193 -0
  240. package/deps/librdkafka/src/nanopb/pb_encode.c +1000 -0
  241. package/deps/librdkafka/src/nanopb/pb_encode.h +185 -0
  242. package/deps/librdkafka/src/opentelemetry/common.pb.c +32 -0
  243. package/deps/librdkafka/src/opentelemetry/common.pb.h +170 -0
  244. package/deps/librdkafka/src/opentelemetry/metrics.options +2 -0
  245. package/deps/librdkafka/src/opentelemetry/metrics.pb.c +67 -0
  246. package/deps/librdkafka/src/opentelemetry/metrics.pb.h +966 -0
  247. package/deps/librdkafka/src/opentelemetry/resource.pb.c +12 -0
  248. package/deps/librdkafka/src/opentelemetry/resource.pb.h +58 -0
  249. package/deps/librdkafka/src/queue.h +850 -0
  250. package/deps/librdkafka/src/rd.h +584 -0
  251. package/deps/librdkafka/src/rdaddr.c +255 -0
  252. package/deps/librdkafka/src/rdaddr.h +202 -0
  253. package/deps/librdkafka/src/rdatomic.h +230 -0
  254. package/deps/librdkafka/src/rdavg.h +260 -0
  255. package/deps/librdkafka/src/rdavl.c +210 -0
  256. package/deps/librdkafka/src/rdavl.h +250 -0
  257. package/deps/librdkafka/src/rdbase64.c +200 -0
  258. package/deps/librdkafka/src/rdbase64.h +43 -0
  259. package/deps/librdkafka/src/rdbuf.c +1884 -0
  260. package/deps/librdkafka/src/rdbuf.h +375 -0
  261. package/deps/librdkafka/src/rdcrc32.c +114 -0
  262. package/deps/librdkafka/src/rdcrc32.h +170 -0
  263. package/deps/librdkafka/src/rddl.c +179 -0
  264. package/deps/librdkafka/src/rddl.h +43 -0
  265. package/deps/librdkafka/src/rdendian.h +175 -0
  266. package/deps/librdkafka/src/rdfloat.h +67 -0
  267. package/deps/librdkafka/src/rdfnv1a.c +113 -0
  268. package/deps/librdkafka/src/rdfnv1a.h +35 -0
  269. package/deps/librdkafka/src/rdgz.c +120 -0
  270. package/deps/librdkafka/src/rdgz.h +46 -0
  271. package/deps/librdkafka/src/rdhdrhistogram.c +721 -0
  272. package/deps/librdkafka/src/rdhdrhistogram.h +87 -0
  273. package/deps/librdkafka/src/rdhttp.c +830 -0
  274. package/deps/librdkafka/src/rdhttp.h +101 -0
  275. package/deps/librdkafka/src/rdinterval.h +177 -0
  276. package/deps/librdkafka/src/rdkafka.c +5505 -0
  277. package/deps/librdkafka/src/rdkafka.h +10686 -0
  278. package/deps/librdkafka/src/rdkafka_admin.c +9794 -0
  279. package/deps/librdkafka/src/rdkafka_admin.h +661 -0
  280. package/deps/librdkafka/src/rdkafka_assignment.c +1010 -0
  281. package/deps/librdkafka/src/rdkafka_assignment.h +73 -0
  282. package/deps/librdkafka/src/rdkafka_assignor.c +1786 -0
  283. package/deps/librdkafka/src/rdkafka_assignor.h +402 -0
  284. package/deps/librdkafka/src/rdkafka_aux.c +409 -0
  285. package/deps/librdkafka/src/rdkafka_aux.h +174 -0
  286. package/deps/librdkafka/src/rdkafka_background.c +221 -0
  287. package/deps/librdkafka/src/rdkafka_broker.c +6337 -0
  288. package/deps/librdkafka/src/rdkafka_broker.h +744 -0
  289. package/deps/librdkafka/src/rdkafka_buf.c +543 -0
  290. package/deps/librdkafka/src/rdkafka_buf.h +1525 -0
  291. package/deps/librdkafka/src/rdkafka_cert.c +576 -0
  292. package/deps/librdkafka/src/rdkafka_cert.h +62 -0
  293. package/deps/librdkafka/src/rdkafka_cgrp.c +7587 -0
  294. package/deps/librdkafka/src/rdkafka_cgrp.h +477 -0
  295. package/deps/librdkafka/src/rdkafka_conf.c +4880 -0
  296. package/deps/librdkafka/src/rdkafka_conf.h +732 -0
  297. package/deps/librdkafka/src/rdkafka_confval.h +97 -0
  298. package/deps/librdkafka/src/rdkafka_coord.c +623 -0
  299. package/deps/librdkafka/src/rdkafka_coord.h +132 -0
  300. package/deps/librdkafka/src/rdkafka_error.c +228 -0
  301. package/deps/librdkafka/src/rdkafka_error.h +80 -0
  302. package/deps/librdkafka/src/rdkafka_event.c +502 -0
  303. package/deps/librdkafka/src/rdkafka_event.h +126 -0
  304. package/deps/librdkafka/src/rdkafka_feature.c +898 -0
  305. package/deps/librdkafka/src/rdkafka_feature.h +104 -0
  306. package/deps/librdkafka/src/rdkafka_fetcher.c +1422 -0
  307. package/deps/librdkafka/src/rdkafka_fetcher.h +44 -0
  308. package/deps/librdkafka/src/rdkafka_header.c +220 -0
  309. package/deps/librdkafka/src/rdkafka_header.h +76 -0
  310. package/deps/librdkafka/src/rdkafka_idempotence.c +807 -0
  311. package/deps/librdkafka/src/rdkafka_idempotence.h +144 -0
  312. package/deps/librdkafka/src/rdkafka_int.h +1260 -0
  313. package/deps/librdkafka/src/rdkafka_interceptor.c +819 -0
  314. package/deps/librdkafka/src/rdkafka_interceptor.h +104 -0
  315. package/deps/librdkafka/src/rdkafka_lz4.c +450 -0
  316. package/deps/librdkafka/src/rdkafka_lz4.h +49 -0
  317. package/deps/librdkafka/src/rdkafka_metadata.c +2209 -0
  318. package/deps/librdkafka/src/rdkafka_metadata.h +345 -0
  319. package/deps/librdkafka/src/rdkafka_metadata_cache.c +1183 -0
  320. package/deps/librdkafka/src/rdkafka_mock.c +3661 -0
  321. package/deps/librdkafka/src/rdkafka_mock.h +610 -0
  322. package/deps/librdkafka/src/rdkafka_mock_cgrp.c +1876 -0
  323. package/deps/librdkafka/src/rdkafka_mock_handlers.c +3113 -0
  324. package/deps/librdkafka/src/rdkafka_mock_int.h +710 -0
  325. package/deps/librdkafka/src/rdkafka_msg.c +2589 -0
  326. package/deps/librdkafka/src/rdkafka_msg.h +614 -0
  327. package/deps/librdkafka/src/rdkafka_msgbatch.h +62 -0
  328. package/deps/librdkafka/src/rdkafka_msgset.h +98 -0
  329. package/deps/librdkafka/src/rdkafka_msgset_reader.c +1806 -0
  330. package/deps/librdkafka/src/rdkafka_msgset_writer.c +1474 -0
  331. package/deps/librdkafka/src/rdkafka_offset.c +1565 -0
  332. package/deps/librdkafka/src/rdkafka_offset.h +150 -0
  333. package/deps/librdkafka/src/rdkafka_op.c +997 -0
  334. package/deps/librdkafka/src/rdkafka_op.h +858 -0
  335. package/deps/librdkafka/src/rdkafka_partition.c +4896 -0
  336. package/deps/librdkafka/src/rdkafka_partition.h +1182 -0
  337. package/deps/librdkafka/src/rdkafka_pattern.c +228 -0
  338. package/deps/librdkafka/src/rdkafka_pattern.h +70 -0
  339. package/deps/librdkafka/src/rdkafka_plugin.c +213 -0
  340. package/deps/librdkafka/src/rdkafka_plugin.h +41 -0
  341. package/deps/librdkafka/src/rdkafka_proto.h +736 -0
  342. package/deps/librdkafka/src/rdkafka_protocol.h +128 -0
  343. package/deps/librdkafka/src/rdkafka_queue.c +1230 -0
  344. package/deps/librdkafka/src/rdkafka_queue.h +1220 -0
  345. package/deps/librdkafka/src/rdkafka_range_assignor.c +1748 -0
  346. package/deps/librdkafka/src/rdkafka_request.c +7089 -0
  347. package/deps/librdkafka/src/rdkafka_request.h +732 -0
  348. package/deps/librdkafka/src/rdkafka_roundrobin_assignor.c +123 -0
  349. package/deps/librdkafka/src/rdkafka_sasl.c +530 -0
  350. package/deps/librdkafka/src/rdkafka_sasl.h +63 -0
  351. package/deps/librdkafka/src/rdkafka_sasl_cyrus.c +722 -0
  352. package/deps/librdkafka/src/rdkafka_sasl_int.h +89 -0
  353. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer.c +1833 -0
  354. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer.h +52 -0
  355. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.c +1666 -0
  356. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.h +47 -0
  357. package/deps/librdkafka/src/rdkafka_sasl_plain.c +142 -0
  358. package/deps/librdkafka/src/rdkafka_sasl_scram.c +858 -0
  359. package/deps/librdkafka/src/rdkafka_sasl_win32.c +550 -0
  360. package/deps/librdkafka/src/rdkafka_ssl.c +2129 -0
  361. package/deps/librdkafka/src/rdkafka_ssl.h +86 -0
  362. package/deps/librdkafka/src/rdkafka_sticky_assignor.c +4785 -0
  363. package/deps/librdkafka/src/rdkafka_subscription.c +278 -0
  364. package/deps/librdkafka/src/rdkafka_telemetry.c +760 -0
  365. package/deps/librdkafka/src/rdkafka_telemetry.h +52 -0
  366. package/deps/librdkafka/src/rdkafka_telemetry_decode.c +1053 -0
  367. package/deps/librdkafka/src/rdkafka_telemetry_decode.h +59 -0
  368. package/deps/librdkafka/src/rdkafka_telemetry_encode.c +997 -0
  369. package/deps/librdkafka/src/rdkafka_telemetry_encode.h +301 -0
  370. package/deps/librdkafka/src/rdkafka_timer.c +402 -0
  371. package/deps/librdkafka/src/rdkafka_timer.h +117 -0
  372. package/deps/librdkafka/src/rdkafka_topic.c +2161 -0
  373. package/deps/librdkafka/src/rdkafka_topic.h +334 -0
  374. package/deps/librdkafka/src/rdkafka_transport.c +1309 -0
  375. package/deps/librdkafka/src/rdkafka_transport.h +99 -0
  376. package/deps/librdkafka/src/rdkafka_transport_int.h +100 -0
  377. package/deps/librdkafka/src/rdkafka_txnmgr.c +3256 -0
  378. package/deps/librdkafka/src/rdkafka_txnmgr.h +171 -0
  379. package/deps/librdkafka/src/rdkafka_zstd.c +226 -0
  380. package/deps/librdkafka/src/rdkafka_zstd.h +57 -0
  381. package/deps/librdkafka/src/rdlist.c +576 -0
  382. package/deps/librdkafka/src/rdlist.h +434 -0
  383. package/deps/librdkafka/src/rdlog.c +89 -0
  384. package/deps/librdkafka/src/rdlog.h +41 -0
  385. package/deps/librdkafka/src/rdmap.c +508 -0
  386. package/deps/librdkafka/src/rdmap.h +492 -0
  387. package/deps/librdkafka/src/rdmurmur2.c +167 -0
  388. package/deps/librdkafka/src/rdmurmur2.h +35 -0
  389. package/deps/librdkafka/src/rdports.c +61 -0
  390. package/deps/librdkafka/src/rdports.h +38 -0
  391. package/deps/librdkafka/src/rdposix.h +250 -0
  392. package/deps/librdkafka/src/rdrand.c +80 -0
  393. package/deps/librdkafka/src/rdrand.h +43 -0
  394. package/deps/librdkafka/src/rdregex.c +156 -0
  395. package/deps/librdkafka/src/rdregex.h +43 -0
  396. package/deps/librdkafka/src/rdsignal.h +57 -0
  397. package/deps/librdkafka/src/rdstring.c +645 -0
  398. package/deps/librdkafka/src/rdstring.h +98 -0
  399. package/deps/librdkafka/src/rdsysqueue.h +404 -0
  400. package/deps/librdkafka/src/rdtime.h +356 -0
  401. package/deps/librdkafka/src/rdtypes.h +86 -0
  402. package/deps/librdkafka/src/rdunittest.c +549 -0
  403. package/deps/librdkafka/src/rdunittest.h +232 -0
  404. package/deps/librdkafka/src/rdvarint.c +134 -0
  405. package/deps/librdkafka/src/rdvarint.h +165 -0
  406. package/deps/librdkafka/src/rdwin32.h +382 -0
  407. package/deps/librdkafka/src/rdxxhash.c +1030 -0
  408. package/deps/librdkafka/src/rdxxhash.h +328 -0
  409. package/deps/librdkafka/src/regexp.c +1352 -0
  410. package/deps/librdkafka/src/regexp.h +41 -0
  411. package/deps/librdkafka/src/snappy.c +1866 -0
  412. package/deps/librdkafka/src/snappy.h +62 -0
  413. package/deps/librdkafka/src/snappy_compat.h +138 -0
  414. package/deps/librdkafka/src/statistics_schema.json +444 -0
  415. package/deps/librdkafka/src/tinycthread.c +932 -0
  416. package/deps/librdkafka/src/tinycthread.h +503 -0
  417. package/deps/librdkafka/src/tinycthread_extra.c +199 -0
  418. package/deps/librdkafka/src/tinycthread_extra.h +212 -0
  419. package/deps/librdkafka/src/win32_config.h +58 -0
  420. package/deps/librdkafka/src-cpp/CMakeLists.txt +90 -0
  421. package/deps/librdkafka/src-cpp/ConfImpl.cpp +84 -0
  422. package/deps/librdkafka/src-cpp/ConsumerImpl.cpp +244 -0
  423. package/deps/librdkafka/src-cpp/HandleImpl.cpp +436 -0
  424. package/deps/librdkafka/src-cpp/HeadersImpl.cpp +48 -0
  425. package/deps/librdkafka/src-cpp/KafkaConsumerImpl.cpp +296 -0
  426. package/deps/librdkafka/src-cpp/Makefile +55 -0
  427. package/deps/librdkafka/src-cpp/MessageImpl.cpp +38 -0
  428. package/deps/librdkafka/src-cpp/MetadataImpl.cpp +170 -0
  429. package/deps/librdkafka/src-cpp/ProducerImpl.cpp +197 -0
  430. package/deps/librdkafka/src-cpp/QueueImpl.cpp +70 -0
  431. package/deps/librdkafka/src-cpp/README.md +16 -0
  432. package/deps/librdkafka/src-cpp/RdKafka.cpp +59 -0
  433. package/deps/librdkafka/src-cpp/TopicImpl.cpp +124 -0
  434. package/deps/librdkafka/src-cpp/TopicPartitionImpl.cpp +57 -0
  435. package/deps/librdkafka/src-cpp/rdkafkacpp.h +3797 -0
  436. package/deps/librdkafka/src-cpp/rdkafkacpp_int.h +1641 -0
  437. package/deps/librdkafka/tests/0000-unittests.c +72 -0
  438. package/deps/librdkafka/tests/0001-multiobj.c +102 -0
  439. package/deps/librdkafka/tests/0002-unkpart.c +244 -0
  440. package/deps/librdkafka/tests/0003-msgmaxsize.c +173 -0
  441. package/deps/librdkafka/tests/0004-conf.c +934 -0
  442. package/deps/librdkafka/tests/0005-order.c +133 -0
  443. package/deps/librdkafka/tests/0006-symbols.c +163 -0
  444. package/deps/librdkafka/tests/0007-autotopic.c +136 -0
  445. package/deps/librdkafka/tests/0008-reqacks.c +179 -0
  446. package/deps/librdkafka/tests/0009-mock_cluster.c +97 -0
  447. package/deps/librdkafka/tests/0011-produce_batch.c +753 -0
  448. package/deps/librdkafka/tests/0012-produce_consume.c +537 -0
  449. package/deps/librdkafka/tests/0013-null-msgs.c +473 -0
  450. package/deps/librdkafka/tests/0014-reconsume-191.c +512 -0
  451. package/deps/librdkafka/tests/0015-offset_seeks.c +172 -0
  452. package/deps/librdkafka/tests/0016-client_swname.c +181 -0
  453. package/deps/librdkafka/tests/0017-compression.c +140 -0
  454. package/deps/librdkafka/tests/0018-cgrp_term.c +338 -0
  455. package/deps/librdkafka/tests/0019-list_groups.c +289 -0
  456. package/deps/librdkafka/tests/0020-destroy_hang.c +162 -0
  457. package/deps/librdkafka/tests/0021-rkt_destroy.c +72 -0
  458. package/deps/librdkafka/tests/0022-consume_batch.c +279 -0
  459. package/deps/librdkafka/tests/0025-timers.c +147 -0
  460. package/deps/librdkafka/tests/0026-consume_pause.c +547 -0
  461. package/deps/librdkafka/tests/0028-long_topicnames.c +79 -0
  462. package/deps/librdkafka/tests/0029-assign_offset.c +202 -0
  463. package/deps/librdkafka/tests/0030-offset_commit.c +589 -0
  464. package/deps/librdkafka/tests/0031-get_offsets.c +235 -0
  465. package/deps/librdkafka/tests/0033-regex_subscribe.c +536 -0
  466. package/deps/librdkafka/tests/0034-offset_reset.c +398 -0
  467. package/deps/librdkafka/tests/0035-api_version.c +73 -0
  468. package/deps/librdkafka/tests/0036-partial_fetch.c +87 -0
  469. package/deps/librdkafka/tests/0037-destroy_hang_local.c +85 -0
  470. package/deps/librdkafka/tests/0038-performance.c +121 -0
  471. package/deps/librdkafka/tests/0039-event.c +284 -0
  472. package/deps/librdkafka/tests/0040-io_event.c +257 -0
  473. package/deps/librdkafka/tests/0041-fetch_max_bytes.c +97 -0
  474. package/deps/librdkafka/tests/0042-many_topics.c +252 -0
  475. package/deps/librdkafka/tests/0043-no_connection.c +77 -0
  476. package/deps/librdkafka/tests/0044-partition_cnt.c +94 -0
  477. package/deps/librdkafka/tests/0045-subscribe_update.c +1010 -0
  478. package/deps/librdkafka/tests/0046-rkt_cache.c +65 -0
  479. package/deps/librdkafka/tests/0047-partial_buf_tmout.c +98 -0
  480. package/deps/librdkafka/tests/0048-partitioner.c +283 -0
  481. package/deps/librdkafka/tests/0049-consume_conn_close.c +162 -0
  482. package/deps/librdkafka/tests/0050-subscribe_adds.c +145 -0
  483. package/deps/librdkafka/tests/0051-assign_adds.c +126 -0
  484. package/deps/librdkafka/tests/0052-msg_timestamps.c +238 -0
  485. package/deps/librdkafka/tests/0053-stats_cb.cpp +527 -0
  486. package/deps/librdkafka/tests/0054-offset_time.cpp +236 -0
  487. package/deps/librdkafka/tests/0055-producer_latency.c +539 -0
  488. package/deps/librdkafka/tests/0056-balanced_group_mt.c +315 -0
  489. package/deps/librdkafka/tests/0057-invalid_topic.cpp +112 -0
  490. package/deps/librdkafka/tests/0058-log.cpp +123 -0
  491. package/deps/librdkafka/tests/0059-bsearch.cpp +241 -0
  492. package/deps/librdkafka/tests/0060-op_prio.cpp +163 -0
  493. package/deps/librdkafka/tests/0061-consumer_lag.cpp +295 -0
  494. package/deps/librdkafka/tests/0062-stats_event.c +126 -0
  495. package/deps/librdkafka/tests/0063-clusterid.cpp +180 -0
  496. package/deps/librdkafka/tests/0064-interceptors.c +481 -0
  497. package/deps/librdkafka/tests/0065-yield.cpp +140 -0
  498. package/deps/librdkafka/tests/0066-plugins.cpp +129 -0
  499. package/deps/librdkafka/tests/0067-empty_topic.cpp +151 -0
  500. package/deps/librdkafka/tests/0068-produce_timeout.c +136 -0
  501. package/deps/librdkafka/tests/0069-consumer_add_parts.c +119 -0
  502. package/deps/librdkafka/tests/0070-null_empty.cpp +197 -0
  503. package/deps/librdkafka/tests/0072-headers_ut.c +448 -0
  504. package/deps/librdkafka/tests/0073-headers.c +381 -0
  505. package/deps/librdkafka/tests/0074-producev.c +87 -0
  506. package/deps/librdkafka/tests/0075-retry.c +290 -0
  507. package/deps/librdkafka/tests/0076-produce_retry.c +452 -0
  508. package/deps/librdkafka/tests/0077-compaction.c +363 -0
  509. package/deps/librdkafka/tests/0078-c_from_cpp.cpp +96 -0
  510. package/deps/librdkafka/tests/0079-fork.c +93 -0
  511. package/deps/librdkafka/tests/0080-admin_ut.c +3095 -0
  512. package/deps/librdkafka/tests/0081-admin.c +5633 -0
  513. package/deps/librdkafka/tests/0082-fetch_max_bytes.cpp +137 -0
  514. package/deps/librdkafka/tests/0083-cb_event.c +233 -0
  515. package/deps/librdkafka/tests/0084-destroy_flags.c +208 -0
  516. package/deps/librdkafka/tests/0085-headers.cpp +392 -0
  517. package/deps/librdkafka/tests/0086-purge.c +368 -0
  518. package/deps/librdkafka/tests/0088-produce_metadata_timeout.c +162 -0
  519. package/deps/librdkafka/tests/0089-max_poll_interval.c +511 -0
  520. package/deps/librdkafka/tests/0090-idempotence.c +171 -0
  521. package/deps/librdkafka/tests/0091-max_poll_interval_timeout.c +295 -0
  522. package/deps/librdkafka/tests/0092-mixed_msgver.c +103 -0
  523. package/deps/librdkafka/tests/0093-holb.c +200 -0
  524. package/deps/librdkafka/tests/0094-idempotence_msg_timeout.c +231 -0
  525. package/deps/librdkafka/tests/0095-all_brokers_down.cpp +122 -0
  526. package/deps/librdkafka/tests/0097-ssl_verify.cpp +658 -0
  527. package/deps/librdkafka/tests/0098-consumer-txn.cpp +1218 -0
  528. package/deps/librdkafka/tests/0099-commit_metadata.c +194 -0
  529. package/deps/librdkafka/tests/0100-thread_interceptors.cpp +195 -0
  530. package/deps/librdkafka/tests/0101-fetch-from-follower.cpp +446 -0
  531. package/deps/librdkafka/tests/0102-static_group_rebalance.c +836 -0
  532. package/deps/librdkafka/tests/0103-transactions.c +1383 -0
  533. package/deps/librdkafka/tests/0104-fetch_from_follower_mock.c +625 -0
  534. package/deps/librdkafka/tests/0105-transactions_mock.c +3930 -0
  535. package/deps/librdkafka/tests/0106-cgrp_sess_timeout.c +318 -0
  536. package/deps/librdkafka/tests/0107-topic_recreate.c +259 -0
  537. package/deps/librdkafka/tests/0109-auto_create_topics.cpp +278 -0
  538. package/deps/librdkafka/tests/0110-batch_size.cpp +182 -0
  539. package/deps/librdkafka/tests/0111-delay_create_topics.cpp +127 -0
  540. package/deps/librdkafka/tests/0112-assign_unknown_part.c +87 -0
  541. package/deps/librdkafka/tests/0113-cooperative_rebalance.cpp +3473 -0
  542. package/deps/librdkafka/tests/0114-sticky_partitioning.cpp +176 -0
  543. package/deps/librdkafka/tests/0115-producer_auth.cpp +182 -0
  544. package/deps/librdkafka/tests/0116-kafkaconsumer_close.cpp +216 -0
  545. package/deps/librdkafka/tests/0117-mock_errors.c +331 -0
  546. package/deps/librdkafka/tests/0118-commit_rebalance.c +154 -0
  547. package/deps/librdkafka/tests/0119-consumer_auth.cpp +167 -0
  548. package/deps/librdkafka/tests/0120-asymmetric_subscription.c +185 -0
  549. package/deps/librdkafka/tests/0121-clusterid.c +115 -0
  550. package/deps/librdkafka/tests/0122-buffer_cleaning_after_rebalance.c +227 -0
  551. package/deps/librdkafka/tests/0123-connections_max_idle.c +98 -0
  552. package/deps/librdkafka/tests/0124-openssl_invalid_engine.c +69 -0
  553. package/deps/librdkafka/tests/0125-immediate_flush.c +144 -0
  554. package/deps/librdkafka/tests/0126-oauthbearer_oidc.c +528 -0
  555. package/deps/librdkafka/tests/0127-fetch_queue_backoff.cpp +165 -0
  556. package/deps/librdkafka/tests/0128-sasl_callback_queue.cpp +125 -0
  557. package/deps/librdkafka/tests/0129-fetch_aborted_msgs.c +79 -0
  558. package/deps/librdkafka/tests/0130-store_offsets.c +178 -0
  559. package/deps/librdkafka/tests/0131-connect_timeout.c +81 -0
  560. package/deps/librdkafka/tests/0132-strategy_ordering.c +179 -0
  561. package/deps/librdkafka/tests/0133-ssl_keys.c +150 -0
  562. package/deps/librdkafka/tests/0134-ssl_provider.c +92 -0
  563. package/deps/librdkafka/tests/0135-sasl_credentials.cpp +143 -0
  564. package/deps/librdkafka/tests/0136-resolve_cb.c +181 -0
  565. package/deps/librdkafka/tests/0137-barrier_batch_consume.c +619 -0
  566. package/deps/librdkafka/tests/0138-admin_mock.c +281 -0
  567. package/deps/librdkafka/tests/0139-offset_validation_mock.c +950 -0
  568. package/deps/librdkafka/tests/0140-commit_metadata.cpp +108 -0
  569. package/deps/librdkafka/tests/0142-reauthentication.c +515 -0
  570. package/deps/librdkafka/tests/0143-exponential_backoff_mock.c +552 -0
  571. package/deps/librdkafka/tests/0144-idempotence_mock.c +373 -0
  572. package/deps/librdkafka/tests/0145-pause_resume_mock.c +119 -0
  573. package/deps/librdkafka/tests/0146-metadata_mock.c +505 -0
  574. package/deps/librdkafka/tests/0147-consumer_group_consumer_mock.c +952 -0
  575. package/deps/librdkafka/tests/0148-offset_fetch_commit_error_mock.c +563 -0
  576. package/deps/librdkafka/tests/0149-broker-same-host-port.c +140 -0
  577. package/deps/librdkafka/tests/0150-telemetry_mock.c +651 -0
  578. package/deps/librdkafka/tests/0151-purge-brokers.c +566 -0
  579. package/deps/librdkafka/tests/0152-rebootstrap.c +59 -0
  580. package/deps/librdkafka/tests/0153-memberid.c +128 -0
  581. package/deps/librdkafka/tests/1000-unktopic.c +164 -0
  582. package/deps/librdkafka/tests/8000-idle.cpp +60 -0
  583. package/deps/librdkafka/tests/8001-fetch_from_follower_mock_manual.c +113 -0
  584. package/deps/librdkafka/tests/CMakeLists.txt +170 -0
  585. package/deps/librdkafka/tests/LibrdkafkaTestApp.py +291 -0
  586. package/deps/librdkafka/tests/Makefile +182 -0
  587. package/deps/librdkafka/tests/README.md +509 -0
  588. package/deps/librdkafka/tests/autotest.sh +33 -0
  589. package/deps/librdkafka/tests/backtrace.gdb +30 -0
  590. package/deps/librdkafka/tests/broker_version_tests.py +315 -0
  591. package/deps/librdkafka/tests/buildbox.sh +17 -0
  592. package/deps/librdkafka/tests/cleanup-checker-tests.sh +20 -0
  593. package/deps/librdkafka/tests/cluster_testing.py +191 -0
  594. package/deps/librdkafka/tests/delete-test-topics.sh +56 -0
  595. package/deps/librdkafka/tests/fixtures/oauthbearer/jwt_assertion_template.json +10 -0
  596. package/deps/librdkafka/tests/fixtures/ssl/Makefile +8 -0
  597. package/deps/librdkafka/tests/fixtures/ssl/README.md +13 -0
  598. package/deps/librdkafka/tests/fixtures/ssl/client.keystore.intermediate.p12 +0 -0
  599. package/deps/librdkafka/tests/fixtures/ssl/client.keystore.p12 +0 -0
  600. package/deps/librdkafka/tests/fixtures/ssl/client2.certificate.intermediate.pem +72 -0
  601. package/deps/librdkafka/tests/fixtures/ssl/client2.certificate.pem +50 -0
  602. package/deps/librdkafka/tests/fixtures/ssl/client2.intermediate.key +46 -0
  603. package/deps/librdkafka/tests/fixtures/ssl/client2.key +46 -0
  604. package/deps/librdkafka/tests/fixtures/ssl/create_keys.sh +168 -0
  605. package/deps/librdkafka/tests/fuzzers/Makefile +12 -0
  606. package/deps/librdkafka/tests/fuzzers/README.md +31 -0
  607. package/deps/librdkafka/tests/fuzzers/fuzz_regex.c +74 -0
  608. package/deps/librdkafka/tests/fuzzers/helpers.h +90 -0
  609. package/deps/librdkafka/tests/gen-ssl-certs.sh +165 -0
  610. package/deps/librdkafka/tests/interactive_broker_version.py +170 -0
  611. package/deps/librdkafka/tests/interceptor_test/CMakeLists.txt +16 -0
  612. package/deps/librdkafka/tests/interceptor_test/Makefile +22 -0
  613. package/deps/librdkafka/tests/interceptor_test/interceptor_test.c +314 -0
  614. package/deps/librdkafka/tests/interceptor_test/interceptor_test.h +54 -0
  615. package/deps/librdkafka/tests/java/IncrementalRebalanceCli.java +97 -0
  616. package/deps/librdkafka/tests/java/Makefile +13 -0
  617. package/deps/librdkafka/tests/java/Murmur2Cli.java +46 -0
  618. package/deps/librdkafka/tests/java/README.md +14 -0
  619. package/deps/librdkafka/tests/java/TransactionProducerCli.java +162 -0
  620. package/deps/librdkafka/tests/java/run-class.sh +11 -0
  621. package/deps/librdkafka/tests/librdkafka.suppressions +483 -0
  622. package/deps/librdkafka/tests/lz4_manual_test.sh +59 -0
  623. package/deps/librdkafka/tests/multi-broker-version-test.sh +50 -0
  624. package/deps/librdkafka/tests/parse-refcnt.sh +43 -0
  625. package/deps/librdkafka/tests/performance_plot.py +115 -0
  626. package/deps/librdkafka/tests/plugin_test/Makefile +19 -0
  627. package/deps/librdkafka/tests/plugin_test/plugin_test.c +58 -0
  628. package/deps/librdkafka/tests/requirements.txt +2 -0
  629. package/deps/librdkafka/tests/run-all-tests.sh +79 -0
  630. package/deps/librdkafka/tests/run-consumer-tests.sh +16 -0
  631. package/deps/librdkafka/tests/run-producer-tests.sh +16 -0
  632. package/deps/librdkafka/tests/run-test-batches.py +157 -0
  633. package/deps/librdkafka/tests/run-test.sh +140 -0
  634. package/deps/librdkafka/tests/rusage.c +249 -0
  635. package/deps/librdkafka/tests/sasl_test.py +289 -0
  636. package/deps/librdkafka/tests/scenarios/README.md +6 -0
  637. package/deps/librdkafka/tests/scenarios/ak23.json +6 -0
  638. package/deps/librdkafka/tests/scenarios/default.json +5 -0
  639. package/deps/librdkafka/tests/scenarios/noautocreate.json +5 -0
  640. package/deps/librdkafka/tests/sockem.c +801 -0
  641. package/deps/librdkafka/tests/sockem.h +85 -0
  642. package/deps/librdkafka/tests/sockem_ctrl.c +145 -0
  643. package/deps/librdkafka/tests/sockem_ctrl.h +61 -0
  644. package/deps/librdkafka/tests/test.c +7778 -0
  645. package/deps/librdkafka/tests/test.conf.example +27 -0
  646. package/deps/librdkafka/tests/test.h +1028 -0
  647. package/deps/librdkafka/tests/testcpp.cpp +131 -0
  648. package/deps/librdkafka/tests/testcpp.h +388 -0
  649. package/deps/librdkafka/tests/testshared.h +416 -0
  650. package/deps/librdkafka/tests/tools/README.md +4 -0
  651. package/deps/librdkafka/tests/tools/stats/README.md +21 -0
  652. package/deps/librdkafka/tests/tools/stats/filter.jq +42 -0
  653. package/deps/librdkafka/tests/tools/stats/graph.py +150 -0
  654. package/deps/librdkafka/tests/tools/stats/requirements.txt +3 -0
  655. package/deps/librdkafka/tests/tools/stats/to_csv.py +124 -0
  656. package/deps/librdkafka/tests/trivup/trivup-0.14.0.tar.gz +0 -0
  657. package/deps/librdkafka/tests/until-fail.sh +87 -0
  658. package/deps/librdkafka/tests/xxxx-assign_partition.c +122 -0
  659. package/deps/librdkafka/tests/xxxx-metadata.cpp +159 -0
  660. package/deps/librdkafka/vcpkg.json +23 -0
  661. package/deps/librdkafka/win32/README.md +5 -0
  662. package/deps/librdkafka/win32/build-package.bat +3 -0
  663. package/deps/librdkafka/win32/build.bat +19 -0
  664. package/deps/librdkafka/win32/common.vcxproj +84 -0
  665. package/deps/librdkafka/win32/interceptor_test/interceptor_test.vcxproj +87 -0
  666. package/deps/librdkafka/win32/librdkafka.autopkg.template +54 -0
  667. package/deps/librdkafka/win32/librdkafka.master.testing.targets +13 -0
  668. package/deps/librdkafka/win32/librdkafka.sln +226 -0
  669. package/deps/librdkafka/win32/librdkafka.vcxproj +276 -0
  670. package/deps/librdkafka/win32/librdkafkacpp/librdkafkacpp.vcxproj +104 -0
  671. package/deps/librdkafka/win32/msbuild.ps1 +15 -0
  672. package/deps/librdkafka/win32/openssl_engine_example/openssl_engine_example.vcxproj +132 -0
  673. package/deps/librdkafka/win32/package-zip.ps1 +46 -0
  674. package/deps/librdkafka/win32/packages/repositories.config +4 -0
  675. package/deps/librdkafka/win32/push-package.bat +4 -0
  676. package/deps/librdkafka/win32/rdkafka_complex_consumer_example_cpp/rdkafka_complex_consumer_example_cpp.vcxproj +67 -0
  677. package/deps/librdkafka/win32/rdkafka_example/rdkafka_example.vcxproj +97 -0
  678. package/deps/librdkafka/win32/rdkafka_performance/rdkafka_performance.vcxproj +97 -0
  679. package/deps/librdkafka/win32/setup-msys2.ps1 +47 -0
  680. package/deps/librdkafka/win32/setup-vcpkg.ps1 +34 -0
  681. package/deps/librdkafka/win32/tests/test.conf.example +25 -0
  682. package/deps/librdkafka/win32/tests/tests.vcxproj +253 -0
  683. package/deps/librdkafka/win32/win_ssl_cert_store/win_ssl_cert_store.vcxproj +132 -0
  684. package/deps/librdkafka/win32/wingetopt.c +564 -0
  685. package/deps/librdkafka/win32/wingetopt.h +101 -0
  686. package/deps/librdkafka/win32/wintime.h +33 -0
  687. package/deps/librdkafka.gyp +62 -0
  688. package/lib/admin.js +233 -0
  689. package/lib/client.js +573 -0
  690. package/lib/error.js +500 -0
  691. package/lib/index.js +34 -0
  692. package/lib/kafka-consumer-stream.js +397 -0
  693. package/lib/kafka-consumer.js +698 -0
  694. package/lib/producer/high-level-producer.js +323 -0
  695. package/lib/producer-stream.js +307 -0
  696. package/lib/producer.js +375 -0
  697. package/lib/tools/ref-counter.js +52 -0
  698. package/lib/topic-partition.js +88 -0
  699. package/lib/topic.js +42 -0
  700. package/lib/util.js +29 -0
  701. package/package.json +61 -0
  702. package/prebuilds/darwin-arm64/@point3+node-rdkafka.node +0 -0
  703. package/prebuilds/linux-x64/@point3+node-rdkafka.node +0 -0
  704. package/util/configure.js +30 -0
  705. package/util/get-env.js +6 -0
  706. package/util/test-compile.js +11 -0
  707. package/util/test-producer-delivery.js +100 -0
@@ -0,0 +1,1727 @@
1
+ /* pb_decode.c -- decode a protobuf using minimal resources
2
+ *
3
+ * 2011 Petteri Aimonen <jpa@kapsi.fi>
4
+ */
5
+
6
+ /* Use the GCC warn_unused_result attribute to check that all return values
7
+ * are propagated correctly. On other compilers and gcc before 3.4.0 just
8
+ * ignore the annotation.
9
+ */
10
+ #if !defined(__GNUC__) || ( __GNUC__ < 3) || (__GNUC__ == 3 && __GNUC_MINOR__ < 4)
11
+ #define checkreturn
12
+ #else
13
+ #define checkreturn __attribute__((warn_unused_result))
14
+ #endif
15
+
16
+ #include "nanopb/pb.h"
17
+ #include "nanopb/pb_decode.h"
18
+ #include "nanopb/pb_common.h"
19
+
20
+ /**************************************
21
+ * Declarations internal to this file *
22
+ **************************************/
23
+
24
+ static bool checkreturn buf_read(pb_istream_t *stream, pb_byte_t *buf, size_t count);
25
+ static bool checkreturn pb_decode_varint32_eof(pb_istream_t *stream, uint32_t *dest, bool *eof);
26
+ static bool checkreturn read_raw_value(pb_istream_t *stream, pb_wire_type_t wire_type, pb_byte_t *buf, size_t *size);
27
+ static bool checkreturn decode_basic_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *field);
28
+ static bool checkreturn decode_static_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *field);
29
+ static bool checkreturn decode_pointer_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *field);
30
+ static bool checkreturn decode_callback_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *field);
31
+ static bool checkreturn decode_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *field);
32
+ static bool checkreturn default_extension_decoder(pb_istream_t *stream, pb_extension_t *extension, uint32_t tag, pb_wire_type_t wire_type);
33
+ static bool checkreturn decode_extension(pb_istream_t *stream, uint32_t tag, pb_wire_type_t wire_type, pb_extension_t *extension);
34
+ static bool pb_field_set_to_default(pb_field_iter_t *field);
35
+ static bool pb_message_set_to_defaults(pb_field_iter_t *iter);
36
+ static bool checkreturn pb_dec_bool(pb_istream_t *stream, const pb_field_iter_t *field);
37
+ static bool checkreturn pb_dec_varint(pb_istream_t *stream, const pb_field_iter_t *field);
38
+ static bool checkreturn pb_dec_bytes(pb_istream_t *stream, const pb_field_iter_t *field);
39
+ static bool checkreturn pb_dec_string(pb_istream_t *stream, const pb_field_iter_t *field);
40
+ static bool checkreturn pb_dec_submessage(pb_istream_t *stream, const pb_field_iter_t *field);
41
+ static bool checkreturn pb_dec_fixed_length_bytes(pb_istream_t *stream, const pb_field_iter_t *field);
42
+ static bool checkreturn pb_skip_varint(pb_istream_t *stream);
43
+ static bool checkreturn pb_skip_string(pb_istream_t *stream);
44
+
45
+ #ifdef PB_ENABLE_MALLOC
46
+ static bool checkreturn allocate_field(pb_istream_t *stream, void *pData, size_t data_size, size_t array_size);
47
+ static void initialize_pointer_field(void *pItem, pb_field_iter_t *field);
48
+ static bool checkreturn pb_release_union_field(pb_istream_t *stream, pb_field_iter_t *field);
49
+ static void pb_release_single_field(pb_field_iter_t *field);
50
+ #endif
51
+
52
+ #ifdef PB_WITHOUT_64BIT
53
+ #define pb_int64_t int32_t
54
+ #define pb_uint64_t uint32_t
55
+ #else
56
+ #define pb_int64_t int64_t
57
+ #define pb_uint64_t uint64_t
58
+ #endif
59
+
60
+ typedef struct {
61
+ uint32_t bitfield[(PB_MAX_REQUIRED_FIELDS + 31) / 32];
62
+ } pb_fields_seen_t;
63
+
64
+ /*******************************
65
+ * pb_istream_t implementation *
66
+ *******************************/
67
+
68
+ static bool checkreturn buf_read(pb_istream_t *stream, pb_byte_t *buf, size_t count)
69
+ {
70
+ const pb_byte_t *source = (const pb_byte_t*)stream->state;
71
+ stream->state = (pb_byte_t*)stream->state + count;
72
+
73
+ if (buf != NULL)
74
+ {
75
+ memcpy(buf, source, count * sizeof(pb_byte_t));
76
+ }
77
+
78
+ return true;
79
+ }
80
+
81
+ bool checkreturn pb_read(pb_istream_t *stream, pb_byte_t *buf, size_t count)
82
+ {
83
+ if (count == 0)
84
+ return true;
85
+
86
+ #ifndef PB_BUFFER_ONLY
87
+ if (buf == NULL && stream->callback != buf_read)
88
+ {
89
+ /* Skip input bytes */
90
+ pb_byte_t tmp[16];
91
+ while (count > 16)
92
+ {
93
+ if (!pb_read(stream, tmp, 16))
94
+ return false;
95
+
96
+ count -= 16;
97
+ }
98
+
99
+ return pb_read(stream, tmp, count);
100
+ }
101
+ #endif
102
+
103
+ if (stream->bytes_left < count)
104
+ PB_RETURN_ERROR(stream, "end-of-stream");
105
+
106
+ #ifndef PB_BUFFER_ONLY
107
+ if (!stream->callback(stream, buf, count))
108
+ PB_RETURN_ERROR(stream, "io error");
109
+ #else
110
+ if (!buf_read(stream, buf, count))
111
+ return false;
112
+ #endif
113
+
114
+ if (stream->bytes_left < count)
115
+ stream->bytes_left = 0;
116
+ else
117
+ stream->bytes_left -= count;
118
+
119
+ return true;
120
+ }
121
+
122
+ /* Read a single byte from input stream. buf may not be NULL.
123
+ * This is an optimization for the varint decoding. */
124
+ static bool checkreturn pb_readbyte(pb_istream_t *stream, pb_byte_t *buf)
125
+ {
126
+ if (stream->bytes_left == 0)
127
+ PB_RETURN_ERROR(stream, "end-of-stream");
128
+
129
+ #ifndef PB_BUFFER_ONLY
130
+ if (!stream->callback(stream, buf, 1))
131
+ PB_RETURN_ERROR(stream, "io error");
132
+ #else
133
+ *buf = *(const pb_byte_t*)stream->state;
134
+ stream->state = (pb_byte_t*)stream->state + 1;
135
+ #endif
136
+
137
+ stream->bytes_left--;
138
+
139
+ return true;
140
+ }
141
+
142
+ pb_istream_t pb_istream_from_buffer(const pb_byte_t *buf, size_t msglen)
143
+ {
144
+ pb_istream_t stream;
145
+ /* Cast away the const from buf without a compiler error. We are
146
+ * careful to use it only in a const manner in the callbacks.
147
+ */
148
+ union {
149
+ void *state;
150
+ const void *c_state;
151
+ } state;
152
+ #ifdef PB_BUFFER_ONLY
153
+ stream.callback = NULL;
154
+ #else
155
+ stream.callback = &buf_read;
156
+ #endif
157
+ state.c_state = buf;
158
+ stream.state = state.state;
159
+ stream.bytes_left = msglen;
160
+ #ifndef PB_NO_ERRMSG
161
+ stream.errmsg = NULL;
162
+ #endif
163
+ return stream;
164
+ }
165
+
166
+ /********************
167
+ * Helper functions *
168
+ ********************/
169
+
170
+ static bool checkreturn pb_decode_varint32_eof(pb_istream_t *stream, uint32_t *dest, bool *eof)
171
+ {
172
+ pb_byte_t byte;
173
+ uint32_t result;
174
+
175
+ if (!pb_readbyte(stream, &byte))
176
+ {
177
+ if (stream->bytes_left == 0)
178
+ {
179
+ if (eof)
180
+ {
181
+ *eof = true;
182
+ }
183
+ }
184
+
185
+ return false;
186
+ }
187
+
188
+ if ((byte & 0x80) == 0)
189
+ {
190
+ /* Quick case, 1 byte value */
191
+ result = byte;
192
+ }
193
+ else
194
+ {
195
+ /* Multibyte case */
196
+ uint_fast8_t bitpos = 7;
197
+ result = byte & 0x7F;
198
+
199
+ do
200
+ {
201
+ if (!pb_readbyte(stream, &byte))
202
+ return false;
203
+
204
+ if (bitpos >= 32)
205
+ {
206
+ /* Note: The varint could have trailing 0x80 bytes, or 0xFF for negative. */
207
+ pb_byte_t sign_extension = (bitpos < 63) ? 0xFF : 0x01;
208
+ bool valid_extension = ((byte & 0x7F) == 0x00 ||
209
+ ((result >> 31) != 0 && byte == sign_extension));
210
+
211
+ if (bitpos >= 64 || !valid_extension)
212
+ {
213
+ PB_RETURN_ERROR(stream, "varint overflow");
214
+ }
215
+ }
216
+ else if (bitpos == 28)
217
+ {
218
+ if ((byte & 0x70) != 0 && (byte & 0x78) != 0x78)
219
+ {
220
+ PB_RETURN_ERROR(stream, "varint overflow");
221
+ }
222
+ result |= (uint32_t)(byte & 0x0F) << bitpos;
223
+ }
224
+ else
225
+ {
226
+ result |= (uint32_t)(byte & 0x7F) << bitpos;
227
+ }
228
+ bitpos = (uint_fast8_t)(bitpos + 7);
229
+ } while (byte & 0x80);
230
+ }
231
+
232
+ *dest = result;
233
+ return true;
234
+ }
235
+
236
+ bool checkreturn pb_decode_varint32(pb_istream_t *stream, uint32_t *dest)
237
+ {
238
+ return pb_decode_varint32_eof(stream, dest, NULL);
239
+ }
240
+
241
+ #ifndef PB_WITHOUT_64BIT
242
+ bool checkreturn pb_decode_varint(pb_istream_t *stream, uint64_t *dest)
243
+ {
244
+ pb_byte_t byte;
245
+ uint_fast8_t bitpos = 0;
246
+ uint64_t result = 0;
247
+
248
+ do
249
+ {
250
+ if (!pb_readbyte(stream, &byte))
251
+ return false;
252
+
253
+ if (bitpos >= 63 && (byte & 0xFE) != 0)
254
+ PB_RETURN_ERROR(stream, "varint overflow");
255
+
256
+ result |= (uint64_t)(byte & 0x7F) << bitpos;
257
+ bitpos = (uint_fast8_t)(bitpos + 7);
258
+ } while (byte & 0x80);
259
+
260
+ *dest = result;
261
+ return true;
262
+ }
263
+ #endif
264
+
265
+ bool checkreturn pb_skip_varint(pb_istream_t *stream)
266
+ {
267
+ pb_byte_t byte;
268
+ do
269
+ {
270
+ if (!pb_read(stream, &byte, 1))
271
+ return false;
272
+ } while (byte & 0x80);
273
+ return true;
274
+ }
275
+
276
+ bool checkreturn pb_skip_string(pb_istream_t *stream)
277
+ {
278
+ uint32_t length;
279
+ if (!pb_decode_varint32(stream, &length))
280
+ return false;
281
+
282
+ if ((size_t)length != length)
283
+ {
284
+ PB_RETURN_ERROR(stream, "size too large");
285
+ }
286
+
287
+ return pb_read(stream, NULL, (size_t)length);
288
+ }
289
+
290
+ bool checkreturn pb_decode_tag(pb_istream_t *stream, pb_wire_type_t *wire_type, uint32_t *tag, bool *eof)
291
+ {
292
+ uint32_t temp;
293
+ *eof = false;
294
+ *wire_type = (pb_wire_type_t) 0;
295
+ *tag = 0;
296
+
297
+ if (!pb_decode_varint32_eof(stream, &temp, eof))
298
+ {
299
+ return false;
300
+ }
301
+
302
+ *tag = temp >> 3;
303
+ *wire_type = (pb_wire_type_t)(temp & 7);
304
+ return true;
305
+ }
306
+
307
+ bool checkreturn pb_skip_field(pb_istream_t *stream, pb_wire_type_t wire_type)
308
+ {
309
+ switch (wire_type)
310
+ {
311
+ case PB_WT_VARINT: return pb_skip_varint(stream);
312
+ case PB_WT_64BIT: return pb_read(stream, NULL, 8);
313
+ case PB_WT_STRING: return pb_skip_string(stream);
314
+ case PB_WT_32BIT: return pb_read(stream, NULL, 4);
315
+ default: PB_RETURN_ERROR(stream, "invalid wire_type");
316
+ }
317
+ }
318
+
319
+ /* Read a raw value to buffer, for the purpose of passing it to callback as
320
+ * a substream. Size is maximum size on call, and actual size on return.
321
+ */
322
+ static bool checkreturn read_raw_value(pb_istream_t *stream, pb_wire_type_t wire_type, pb_byte_t *buf, size_t *size)
323
+ {
324
+ size_t max_size = *size;
325
+ switch (wire_type)
326
+ {
327
+ case PB_WT_VARINT:
328
+ *size = 0;
329
+ do
330
+ {
331
+ (*size)++;
332
+ if (*size > max_size)
333
+ PB_RETURN_ERROR(stream, "varint overflow");
334
+
335
+ if (!pb_read(stream, buf, 1))
336
+ return false;
337
+ } while (*buf++ & 0x80);
338
+ return true;
339
+
340
+ case PB_WT_64BIT:
341
+ *size = 8;
342
+ return pb_read(stream, buf, 8);
343
+
344
+ case PB_WT_32BIT:
345
+ *size = 4;
346
+ return pb_read(stream, buf, 4);
347
+
348
+ case PB_WT_STRING:
349
+ /* Calling read_raw_value with a PB_WT_STRING is an error.
350
+ * Explicitly handle this case and fallthrough to default to avoid
351
+ * compiler warnings.
352
+ */
353
+
354
+ default: PB_RETURN_ERROR(stream, "invalid wire_type");
355
+ }
356
+ }
357
+
358
+ /* Decode string length from stream and return a substream with limited length.
359
+ * Remember to close the substream using pb_close_string_substream().
360
+ */
361
+ bool checkreturn pb_make_string_substream(pb_istream_t *stream, pb_istream_t *substream)
362
+ {
363
+ uint32_t size;
364
+ if (!pb_decode_varint32(stream, &size))
365
+ return false;
366
+
367
+ *substream = *stream;
368
+ if (substream->bytes_left < size)
369
+ PB_RETURN_ERROR(stream, "parent stream too short");
370
+
371
+ substream->bytes_left = (size_t)size;
372
+ stream->bytes_left -= (size_t)size;
373
+ return true;
374
+ }
375
+
376
+ bool checkreturn pb_close_string_substream(pb_istream_t *stream, pb_istream_t *substream)
377
+ {
378
+ if (substream->bytes_left) {
379
+ if (!pb_read(substream, NULL, substream->bytes_left))
380
+ return false;
381
+ }
382
+
383
+ stream->state = substream->state;
384
+
385
+ #ifndef PB_NO_ERRMSG
386
+ stream->errmsg = substream->errmsg;
387
+ #endif
388
+ return true;
389
+ }
390
+
391
+ /*************************
392
+ * Decode a single field *
393
+ *************************/
394
+
395
+ static bool checkreturn decode_basic_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *field)
396
+ {
397
+ switch (PB_LTYPE(field->type))
398
+ {
399
+ case PB_LTYPE_BOOL:
400
+ if (wire_type != PB_WT_VARINT && wire_type != PB_WT_PACKED)
401
+ PB_RETURN_ERROR(stream, "wrong wire type");
402
+
403
+ return pb_dec_bool(stream, field);
404
+
405
+ case PB_LTYPE_VARINT:
406
+ case PB_LTYPE_UVARINT:
407
+ case PB_LTYPE_SVARINT:
408
+ if (wire_type != PB_WT_VARINT && wire_type != PB_WT_PACKED)
409
+ PB_RETURN_ERROR(stream, "wrong wire type");
410
+
411
+ return pb_dec_varint(stream, field);
412
+
413
+ case PB_LTYPE_FIXED32:
414
+ if (wire_type != PB_WT_32BIT && wire_type != PB_WT_PACKED)
415
+ PB_RETURN_ERROR(stream, "wrong wire type");
416
+
417
+ return pb_decode_fixed32(stream, field->pData);
418
+
419
+ case PB_LTYPE_FIXED64:
420
+ if (wire_type != PB_WT_64BIT && wire_type != PB_WT_PACKED)
421
+ PB_RETURN_ERROR(stream, "wrong wire type");
422
+
423
+ #ifdef PB_CONVERT_DOUBLE_FLOAT
424
+ if (field->data_size == sizeof(float))
425
+ {
426
+ return pb_decode_double_as_float(stream, (float*)field->pData);
427
+ }
428
+ #endif
429
+
430
+ #ifdef PB_WITHOUT_64BIT
431
+ PB_RETURN_ERROR(stream, "invalid data_size");
432
+ #else
433
+ return pb_decode_fixed64(stream, field->pData);
434
+ #endif
435
+
436
+ case PB_LTYPE_BYTES:
437
+ if (wire_type != PB_WT_STRING)
438
+ PB_RETURN_ERROR(stream, "wrong wire type");
439
+
440
+ return pb_dec_bytes(stream, field);
441
+
442
+ case PB_LTYPE_STRING:
443
+ if (wire_type != PB_WT_STRING)
444
+ PB_RETURN_ERROR(stream, "wrong wire type");
445
+
446
+ return pb_dec_string(stream, field);
447
+
448
+ case PB_LTYPE_SUBMESSAGE:
449
+ case PB_LTYPE_SUBMSG_W_CB:
450
+ if (wire_type != PB_WT_STRING)
451
+ PB_RETURN_ERROR(stream, "wrong wire type");
452
+
453
+ return pb_dec_submessage(stream, field);
454
+
455
+ case PB_LTYPE_FIXED_LENGTH_BYTES:
456
+ if (wire_type != PB_WT_STRING)
457
+ PB_RETURN_ERROR(stream, "wrong wire type");
458
+
459
+ return pb_dec_fixed_length_bytes(stream, field);
460
+
461
+ default:
462
+ PB_RETURN_ERROR(stream, "invalid field type");
463
+ }
464
+ }
465
+
466
+ static bool checkreturn decode_static_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *field)
467
+ {
468
+ switch (PB_HTYPE(field->type))
469
+ {
470
+ case PB_HTYPE_REQUIRED:
471
+ return decode_basic_field(stream, wire_type, field);
472
+
473
+ case PB_HTYPE_OPTIONAL:
474
+ if (field->pSize != NULL)
475
+ *(bool*)field->pSize = true;
476
+ return decode_basic_field(stream, wire_type, field);
477
+
478
+ case PB_HTYPE_REPEATED:
479
+ if (wire_type == PB_WT_STRING
480
+ && PB_LTYPE(field->type) <= PB_LTYPE_LAST_PACKABLE)
481
+ {
482
+ /* Packed array */
483
+ bool status = true;
484
+ pb_istream_t substream;
485
+ pb_size_t *size = (pb_size_t*)field->pSize;
486
+ field->pData = (char*)field->pField + field->data_size * (*size);
487
+
488
+ if (!pb_make_string_substream(stream, &substream))
489
+ return false;
490
+
491
+ while (substream.bytes_left > 0 && *size < field->array_size)
492
+ {
493
+ if (!decode_basic_field(&substream, PB_WT_PACKED, field))
494
+ {
495
+ status = false;
496
+ break;
497
+ }
498
+ (*size)++;
499
+ field->pData = (char*)field->pData + field->data_size;
500
+ }
501
+
502
+ if (substream.bytes_left != 0)
503
+ PB_RETURN_ERROR(stream, "array overflow");
504
+ if (!pb_close_string_substream(stream, &substream))
505
+ return false;
506
+
507
+ return status;
508
+ }
509
+ else
510
+ {
511
+ /* Repeated field */
512
+ pb_size_t *size = (pb_size_t*)field->pSize;
513
+ field->pData = (char*)field->pField + field->data_size * (*size);
514
+
515
+ if ((*size)++ >= field->array_size)
516
+ PB_RETURN_ERROR(stream, "array overflow");
517
+
518
+ return decode_basic_field(stream, wire_type, field);
519
+ }
520
+
521
+ case PB_HTYPE_ONEOF:
522
+ if (PB_LTYPE_IS_SUBMSG(field->type) &&
523
+ *(pb_size_t*)field->pSize != field->tag)
524
+ {
525
+ /* We memset to zero so that any callbacks are set to NULL.
526
+ * This is because the callbacks might otherwise have values
527
+ * from some other union field.
528
+ * If callbacks are needed inside oneof field, use .proto
529
+ * option submsg_callback to have a separate callback function
530
+ * that can set the fields before submessage is decoded.
531
+ * pb_dec_submessage() will set any default values. */
532
+ memset(field->pData, 0, (size_t)field->data_size);
533
+
534
+ /* Set default values for the submessage fields. */
535
+ if (field->submsg_desc->default_value != NULL ||
536
+ field->submsg_desc->field_callback != NULL ||
537
+ field->submsg_desc->submsg_info[0] != NULL)
538
+ {
539
+ pb_field_iter_t submsg_iter;
540
+ if (pb_field_iter_begin(&submsg_iter, field->submsg_desc, field->pData))
541
+ {
542
+ if (!pb_message_set_to_defaults(&submsg_iter))
543
+ PB_RETURN_ERROR(stream, "failed to set defaults");
544
+ }
545
+ }
546
+ }
547
+ *(pb_size_t*)field->pSize = field->tag;
548
+
549
+ return decode_basic_field(stream, wire_type, field);
550
+
551
+ default:
552
+ PB_RETURN_ERROR(stream, "invalid field type");
553
+ }
554
+ }
555
+
556
+ #ifdef PB_ENABLE_MALLOC
557
+ /* Allocate storage for the field and store the pointer at iter->pData.
558
+ * array_size is the number of entries to reserve in an array.
559
+ * Zero size is not allowed, use pb_free() for releasing.
560
+ */
561
+ static bool checkreturn allocate_field(pb_istream_t *stream, void *pData, size_t data_size, size_t array_size)
562
+ {
563
+ void *ptr = *(void**)pData;
564
+
565
+ if (data_size == 0 || array_size == 0)
566
+ PB_RETURN_ERROR(stream, "invalid size");
567
+
568
+ #ifdef __AVR__
569
+ /* Workaround for AVR libc bug 53284: http://savannah.nongnu.org/bugs/?53284
570
+ * Realloc to size of 1 byte can cause corruption of the malloc structures.
571
+ */
572
+ if (data_size == 1 && array_size == 1)
573
+ {
574
+ data_size = 2;
575
+ }
576
+ #endif
577
+
578
+ /* Check for multiplication overflows.
579
+ * This code avoids the costly division if the sizes are small enough.
580
+ * Multiplication is safe as long as only half of bits are set
581
+ * in either multiplicand.
582
+ */
583
+ {
584
+ const size_t check_limit = (size_t)1 << (sizeof(size_t) * 4);
585
+ if (data_size >= check_limit || array_size >= check_limit)
586
+ {
587
+ const size_t size_max = (size_t)-1;
588
+ if (size_max / array_size < data_size)
589
+ {
590
+ PB_RETURN_ERROR(stream, "size too large");
591
+ }
592
+ }
593
+ }
594
+
595
+ /* Allocate new or expand previous allocation */
596
+ /* Note: on failure the old pointer will remain in the structure,
597
+ * the message must be freed by caller also on error return. */
598
+ ptr = pb_realloc(ptr, array_size * data_size);
599
+ if (ptr == NULL)
600
+ PB_RETURN_ERROR(stream, "realloc failed");
601
+
602
+ *(void**)pData = ptr;
603
+ return true;
604
+ }
605
+
606
+ /* Clear a newly allocated item in case it contains a pointer, or is a submessage. */
607
+ static void initialize_pointer_field(void *pItem, pb_field_iter_t *field)
608
+ {
609
+ if (PB_LTYPE(field->type) == PB_LTYPE_STRING ||
610
+ PB_LTYPE(field->type) == PB_LTYPE_BYTES)
611
+ {
612
+ *(void**)pItem = NULL;
613
+ }
614
+ else if (PB_LTYPE_IS_SUBMSG(field->type))
615
+ {
616
+ /* We memset to zero so that any callbacks are set to NULL.
617
+ * Default values will be set by pb_dec_submessage(). */
618
+ memset(pItem, 0, field->data_size);
619
+ }
620
+ }
621
+ #endif
622
+
623
+ static bool checkreturn decode_pointer_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *field)
624
+ {
625
+ #ifndef PB_ENABLE_MALLOC
626
+ PB_UNUSED(wire_type);
627
+ PB_UNUSED(field);
628
+ PB_RETURN_ERROR(stream, "no malloc support");
629
+ #else
630
+ switch (PB_HTYPE(field->type))
631
+ {
632
+ case PB_HTYPE_REQUIRED:
633
+ case PB_HTYPE_OPTIONAL:
634
+ case PB_HTYPE_ONEOF:
635
+ if (PB_LTYPE_IS_SUBMSG(field->type) && *(void**)field->pField != NULL)
636
+ {
637
+ /* Duplicate field, have to release the old allocation first. */
638
+ /* FIXME: Does this work correctly for oneofs? */
639
+ pb_release_single_field(field);
640
+ }
641
+
642
+ if (PB_HTYPE(field->type) == PB_HTYPE_ONEOF)
643
+ {
644
+ *(pb_size_t*)field->pSize = field->tag;
645
+ }
646
+
647
+ if (PB_LTYPE(field->type) == PB_LTYPE_STRING ||
648
+ PB_LTYPE(field->type) == PB_LTYPE_BYTES)
649
+ {
650
+ /* pb_dec_string and pb_dec_bytes handle allocation themselves */
651
+ field->pData = field->pField;
652
+ return decode_basic_field(stream, wire_type, field);
653
+ }
654
+ else
655
+ {
656
+ if (!allocate_field(stream, field->pField, field->data_size, 1))
657
+ return false;
658
+
659
+ field->pData = *(void**)field->pField;
660
+ initialize_pointer_field(field->pData, field);
661
+ return decode_basic_field(stream, wire_type, field);
662
+ }
663
+
664
+ case PB_HTYPE_REPEATED:
665
+ if (wire_type == PB_WT_STRING
666
+ && PB_LTYPE(field->type) <= PB_LTYPE_LAST_PACKABLE)
667
+ {
668
+ /* Packed array, multiple items come in at once. */
669
+ bool status = true;
670
+ pb_size_t *size = (pb_size_t*)field->pSize;
671
+ size_t allocated_size = *size;
672
+ pb_istream_t substream;
673
+
674
+ if (!pb_make_string_substream(stream, &substream))
675
+ return false;
676
+
677
+ while (substream.bytes_left)
678
+ {
679
+ if (*size == PB_SIZE_MAX)
680
+ {
681
+ #ifndef PB_NO_ERRMSG
682
+ stream->errmsg = "too many array entries";
683
+ #endif
684
+ status = false;
685
+ break;
686
+ }
687
+
688
+ if ((size_t)*size + 1 > allocated_size)
689
+ {
690
+ /* Allocate more storage. This tries to guess the
691
+ * number of remaining entries. Round the division
692
+ * upwards. */
693
+ size_t remain = (substream.bytes_left - 1) / field->data_size + 1;
694
+ if (remain < PB_SIZE_MAX - allocated_size)
695
+ allocated_size += remain;
696
+ else
697
+ allocated_size += 1;
698
+
699
+ if (!allocate_field(&substream, field->pField, field->data_size, allocated_size))
700
+ {
701
+ status = false;
702
+ break;
703
+ }
704
+ }
705
+
706
+ /* Decode the array entry */
707
+ field->pData = *(char**)field->pField + field->data_size * (*size);
708
+ if (field->pData == NULL)
709
+ {
710
+ /* Shouldn't happen, but satisfies static analyzers */
711
+ status = false;
712
+ break;
713
+ }
714
+ initialize_pointer_field(field->pData, field);
715
+ if (!decode_basic_field(&substream, PB_WT_PACKED, field))
716
+ {
717
+ status = false;
718
+ break;
719
+ }
720
+
721
+ (*size)++;
722
+ }
723
+ if (!pb_close_string_substream(stream, &substream))
724
+ return false;
725
+
726
+ return status;
727
+ }
728
+ else
729
+ {
730
+ /* Normal repeated field, i.e. only one item at a time. */
731
+ pb_size_t *size = (pb_size_t*)field->pSize;
732
+
733
+ if (*size == PB_SIZE_MAX)
734
+ PB_RETURN_ERROR(stream, "too many array entries");
735
+
736
+ if (!allocate_field(stream, field->pField, field->data_size, (size_t)(*size + 1)))
737
+ return false;
738
+
739
+ field->pData = *(char**)field->pField + field->data_size * (*size);
740
+ (*size)++;
741
+ initialize_pointer_field(field->pData, field);
742
+ return decode_basic_field(stream, wire_type, field);
743
+ }
744
+
745
+ default:
746
+ PB_RETURN_ERROR(stream, "invalid field type");
747
+ }
748
+ #endif
749
+ }
750
+
751
+ static bool checkreturn decode_callback_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *field)
752
+ {
753
+ if (!field->descriptor->field_callback)
754
+ return pb_skip_field(stream, wire_type);
755
+
756
+ if (wire_type == PB_WT_STRING)
757
+ {
758
+ pb_istream_t substream;
759
+ size_t prev_bytes_left;
760
+
761
+ if (!pb_make_string_substream(stream, &substream))
762
+ return false;
763
+
764
+ do
765
+ {
766
+ prev_bytes_left = substream.bytes_left;
767
+ if (!field->descriptor->field_callback(&substream, NULL, field))
768
+ {
769
+ PB_SET_ERROR(stream, substream.errmsg ? substream.errmsg : "callback failed");
770
+ return false;
771
+ }
772
+ } while (substream.bytes_left > 0 && substream.bytes_left < prev_bytes_left);
773
+
774
+ if (!pb_close_string_substream(stream, &substream))
775
+ return false;
776
+
777
+ return true;
778
+ }
779
+ else
780
+ {
781
+ /* Copy the single scalar value to stack.
782
+ * This is required so that we can limit the stream length,
783
+ * which in turn allows to use same callback for packed and
784
+ * not-packed fields. */
785
+ pb_istream_t substream;
786
+ pb_byte_t buffer[10];
787
+ size_t size = sizeof(buffer);
788
+
789
+ if (!read_raw_value(stream, wire_type, buffer, &size))
790
+ return false;
791
+ substream = pb_istream_from_buffer(buffer, size);
792
+
793
+ return field->descriptor->field_callback(&substream, NULL, field);
794
+ }
795
+ }
796
+
797
+ static bool checkreturn decode_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *field)
798
+ {
799
+ #ifdef PB_ENABLE_MALLOC
800
+ /* When decoding an oneof field, check if there is old data that must be
801
+ * released first. */
802
+ if (PB_HTYPE(field->type) == PB_HTYPE_ONEOF)
803
+ {
804
+ if (!pb_release_union_field(stream, field))
805
+ return false;
806
+ }
807
+ #endif
808
+
809
+ switch (PB_ATYPE(field->type))
810
+ {
811
+ case PB_ATYPE_STATIC:
812
+ return decode_static_field(stream, wire_type, field);
813
+
814
+ case PB_ATYPE_POINTER:
815
+ return decode_pointer_field(stream, wire_type, field);
816
+
817
+ case PB_ATYPE_CALLBACK:
818
+ return decode_callback_field(stream, wire_type, field);
819
+
820
+ default:
821
+ PB_RETURN_ERROR(stream, "invalid field type");
822
+ }
823
+ }
824
+
825
+ /* Default handler for extension fields. Expects to have a pb_msgdesc_t
826
+ * pointer in the extension->type->arg field, pointing to a message with
827
+ * only one field in it. */
828
+ static bool checkreturn default_extension_decoder(pb_istream_t *stream,
829
+ pb_extension_t *extension, uint32_t tag, pb_wire_type_t wire_type)
830
+ {
831
+ pb_field_iter_t iter;
832
+
833
+ if (!pb_field_iter_begin_extension(&iter, extension))
834
+ PB_RETURN_ERROR(stream, "invalid extension");
835
+
836
+ if (iter.tag != tag || !iter.message)
837
+ return true;
838
+
839
+ extension->found = true;
840
+ return decode_field(stream, wire_type, &iter);
841
+ }
842
+
843
+ /* Try to decode an unknown field as an extension field. Tries each extension
844
+ * decoder in turn, until one of them handles the field or loop ends. */
845
+ static bool checkreturn decode_extension(pb_istream_t *stream,
846
+ uint32_t tag, pb_wire_type_t wire_type, pb_extension_t *extension)
847
+ {
848
+ size_t pos = stream->bytes_left;
849
+
850
+ while (extension != NULL && pos == stream->bytes_left)
851
+ {
852
+ bool status;
853
+ if (extension->type->decode)
854
+ status = extension->type->decode(stream, extension, tag, wire_type);
855
+ else
856
+ status = default_extension_decoder(stream, extension, tag, wire_type);
857
+
858
+ if (!status)
859
+ return false;
860
+
861
+ extension = extension->next;
862
+ }
863
+
864
+ return true;
865
+ }
866
+
867
+ /* Initialize message fields to default values, recursively */
868
+ static bool pb_field_set_to_default(pb_field_iter_t *field)
869
+ {
870
+ pb_type_t type;
871
+ type = field->type;
872
+
873
+ if (PB_LTYPE(type) == PB_LTYPE_EXTENSION)
874
+ {
875
+ pb_extension_t *ext = *(pb_extension_t* const *)field->pData;
876
+ while (ext != NULL)
877
+ {
878
+ pb_field_iter_t ext_iter;
879
+ if (pb_field_iter_begin_extension(&ext_iter, ext))
880
+ {
881
+ ext->found = false;
882
+ if (!pb_message_set_to_defaults(&ext_iter))
883
+ return false;
884
+ }
885
+ ext = ext->next;
886
+ }
887
+ }
888
+ else if (PB_ATYPE(type) == PB_ATYPE_STATIC)
889
+ {
890
+ bool init_data = true;
891
+ if (PB_HTYPE(type) == PB_HTYPE_OPTIONAL && field->pSize != NULL)
892
+ {
893
+ /* Set has_field to false. Still initialize the optional field
894
+ * itself also. */
895
+ *(bool*)field->pSize = false;
896
+ }
897
+ else if (PB_HTYPE(type) == PB_HTYPE_REPEATED ||
898
+ PB_HTYPE(type) == PB_HTYPE_ONEOF)
899
+ {
900
+ /* REPEATED: Set array count to 0, no need to initialize contents.
901
+ ONEOF: Set which_field to 0. */
902
+ *(pb_size_t*)field->pSize = 0;
903
+ init_data = false;
904
+ }
905
+
906
+ if (init_data)
907
+ {
908
+ if (PB_LTYPE_IS_SUBMSG(field->type) &&
909
+ (field->submsg_desc->default_value != NULL ||
910
+ field->submsg_desc->field_callback != NULL ||
911
+ field->submsg_desc->submsg_info[0] != NULL))
912
+ {
913
+ /* Initialize submessage to defaults.
914
+ * Only needed if it has default values
915
+ * or callback/submessage fields. */
916
+ pb_field_iter_t submsg_iter;
917
+ if (pb_field_iter_begin(&submsg_iter, field->submsg_desc, field->pData))
918
+ {
919
+ if (!pb_message_set_to_defaults(&submsg_iter))
920
+ return false;
921
+ }
922
+ }
923
+ else
924
+ {
925
+ /* Initialize to zeros */
926
+ memset(field->pData, 0, (size_t)field->data_size);
927
+ }
928
+ }
929
+ }
930
+ else if (PB_ATYPE(type) == PB_ATYPE_POINTER)
931
+ {
932
+ /* Initialize the pointer to NULL. */
933
+ *(void**)field->pField = NULL;
934
+
935
+ /* Initialize array count to 0. */
936
+ if (PB_HTYPE(type) == PB_HTYPE_REPEATED ||
937
+ PB_HTYPE(type) == PB_HTYPE_ONEOF)
938
+ {
939
+ *(pb_size_t*)field->pSize = 0;
940
+ }
941
+ }
942
+ else if (PB_ATYPE(type) == PB_ATYPE_CALLBACK)
943
+ {
944
+ /* Don't overwrite callback */
945
+ }
946
+
947
+ return true;
948
+ }
949
+
950
+ static bool pb_message_set_to_defaults(pb_field_iter_t *iter)
951
+ {
952
+ pb_istream_t defstream = PB_ISTREAM_EMPTY;
953
+ uint32_t tag = 0;
954
+ pb_wire_type_t wire_type = PB_WT_VARINT;
955
+ bool eof;
956
+
957
+ if (iter->descriptor->default_value)
958
+ {
959
+ defstream = pb_istream_from_buffer(iter->descriptor->default_value, (size_t)-1);
960
+ if (!pb_decode_tag(&defstream, &wire_type, &tag, &eof))
961
+ return false;
962
+ }
963
+
964
+ do
965
+ {
966
+ if (!pb_field_set_to_default(iter))
967
+ return false;
968
+
969
+ if (tag != 0 && iter->tag == tag)
970
+ {
971
+ /* We have a default value for this field in the defstream */
972
+ if (!decode_field(&defstream, wire_type, iter))
973
+ return false;
974
+ if (!pb_decode_tag(&defstream, &wire_type, &tag, &eof))
975
+ return false;
976
+
977
+ if (iter->pSize)
978
+ *(bool*)iter->pSize = false;
979
+ }
980
+ } while (pb_field_iter_next(iter));
981
+
982
+ return true;
983
+ }
984
+
985
+ /*********************
986
+ * Decode all fields *
987
+ *********************/
988
+
989
+ static bool checkreturn pb_decode_inner(pb_istream_t *stream, const pb_msgdesc_t *fields, void *dest_struct, unsigned int flags)
990
+ {
991
+ uint32_t extension_range_start = 0;
992
+ pb_extension_t *extensions = NULL;
993
+
994
+ /* 'fixed_count_field' and 'fixed_count_size' track position of a repeated fixed
995
+ * count field. This can only handle _one_ repeated fixed count field that
996
+ * is unpacked and unordered among other (non repeated fixed count) fields.
997
+ */
998
+ pb_size_t fixed_count_field = PB_SIZE_MAX;
999
+ pb_size_t fixed_count_size = 0;
1000
+ pb_size_t fixed_count_total_size = 0;
1001
+
1002
+ pb_fields_seen_t fields_seen = {{0, 0}};
1003
+ const uint32_t allbits = ~(uint32_t)0;
1004
+ pb_field_iter_t iter;
1005
+
1006
+ if (pb_field_iter_begin(&iter, fields, dest_struct))
1007
+ {
1008
+ if ((flags & PB_DECODE_NOINIT) == 0)
1009
+ {
1010
+ if (!pb_message_set_to_defaults(&iter))
1011
+ PB_RETURN_ERROR(stream, "failed to set defaults");
1012
+ }
1013
+ }
1014
+
1015
+ while (stream->bytes_left)
1016
+ {
1017
+ uint32_t tag;
1018
+ pb_wire_type_t wire_type;
1019
+ bool eof;
1020
+
1021
+ if (!pb_decode_tag(stream, &wire_type, &tag, &eof))
1022
+ {
1023
+ if (eof)
1024
+ break;
1025
+ else
1026
+ return false;
1027
+ }
1028
+
1029
+ if (tag == 0)
1030
+ {
1031
+ if (flags & PB_DECODE_NULLTERMINATED)
1032
+ {
1033
+ break;
1034
+ }
1035
+ else
1036
+ {
1037
+ PB_RETURN_ERROR(stream, "zero tag");
1038
+ }
1039
+ }
1040
+
1041
+ if (!pb_field_iter_find(&iter, tag) || PB_LTYPE(iter.type) == PB_LTYPE_EXTENSION)
1042
+ {
1043
+ /* No match found, check if it matches an extension. */
1044
+ if (extension_range_start == 0)
1045
+ {
1046
+ if (pb_field_iter_find_extension(&iter))
1047
+ {
1048
+ extensions = *(pb_extension_t* const *)iter.pData;
1049
+ extension_range_start = iter.tag;
1050
+ }
1051
+
1052
+ if (!extensions)
1053
+ {
1054
+ extension_range_start = (uint32_t)-1;
1055
+ }
1056
+ }
1057
+
1058
+ if (tag >= extension_range_start)
1059
+ {
1060
+ size_t pos = stream->bytes_left;
1061
+
1062
+ if (!decode_extension(stream, tag, wire_type, extensions))
1063
+ return false;
1064
+
1065
+ if (pos != stream->bytes_left)
1066
+ {
1067
+ /* The field was handled */
1068
+ continue;
1069
+ }
1070
+ }
1071
+
1072
+ /* No match found, skip data */
1073
+ if (!pb_skip_field(stream, wire_type))
1074
+ return false;
1075
+ continue;
1076
+ }
1077
+
1078
+ /* If a repeated fixed count field was found, get size from
1079
+ * 'fixed_count_field' as there is no counter contained in the struct.
1080
+ */
1081
+ if (PB_HTYPE(iter.type) == PB_HTYPE_REPEATED && iter.pSize == &iter.array_size)
1082
+ {
1083
+ if (fixed_count_field != iter.index) {
1084
+ /* If the new fixed count field does not match the previous one,
1085
+ * check that the previous one is NULL or that it finished
1086
+ * receiving all the expected data.
1087
+ */
1088
+ if (fixed_count_field != PB_SIZE_MAX &&
1089
+ fixed_count_size != fixed_count_total_size)
1090
+ {
1091
+ PB_RETURN_ERROR(stream, "wrong size for fixed count field");
1092
+ }
1093
+
1094
+ fixed_count_field = iter.index;
1095
+ fixed_count_size = 0;
1096
+ fixed_count_total_size = iter.array_size;
1097
+ }
1098
+
1099
+ iter.pSize = &fixed_count_size;
1100
+ }
1101
+
1102
+ if (PB_HTYPE(iter.type) == PB_HTYPE_REQUIRED
1103
+ && iter.required_field_index < PB_MAX_REQUIRED_FIELDS)
1104
+ {
1105
+ uint32_t tmp = ((uint32_t)1 << (iter.required_field_index & 31));
1106
+ fields_seen.bitfield[iter.required_field_index >> 5] |= tmp;
1107
+ }
1108
+
1109
+ if (!decode_field(stream, wire_type, &iter))
1110
+ return false;
1111
+ }
1112
+
1113
+ /* Check that all elements of the last decoded fixed count field were present. */
1114
+ if (fixed_count_field != PB_SIZE_MAX &&
1115
+ fixed_count_size != fixed_count_total_size)
1116
+ {
1117
+ PB_RETURN_ERROR(stream, "wrong size for fixed count field");
1118
+ }
1119
+
1120
+ /* Check that all required fields were present. */
1121
+ {
1122
+ pb_size_t req_field_count = iter.descriptor->required_field_count;
1123
+
1124
+ if (req_field_count > 0)
1125
+ {
1126
+ pb_size_t i;
1127
+
1128
+ if (req_field_count > PB_MAX_REQUIRED_FIELDS)
1129
+ req_field_count = PB_MAX_REQUIRED_FIELDS;
1130
+
1131
+ /* Check the whole words */
1132
+ for (i = 0; i < (req_field_count >> 5); i++)
1133
+ {
1134
+ if (fields_seen.bitfield[i] != allbits)
1135
+ PB_RETURN_ERROR(stream, "missing required field");
1136
+ }
1137
+
1138
+ /* Check the remaining bits (if any) */
1139
+ if ((req_field_count & 31) != 0)
1140
+ {
1141
+ if (fields_seen.bitfield[req_field_count >> 5] !=
1142
+ (allbits >> (uint_least8_t)(32 - (req_field_count & 31))))
1143
+ {
1144
+ PB_RETURN_ERROR(stream, "missing required field");
1145
+ }
1146
+ }
1147
+ }
1148
+ }
1149
+
1150
+ return true;
1151
+ }
1152
+
1153
+ bool checkreturn pb_decode_ex(pb_istream_t *stream, const pb_msgdesc_t *fields, void *dest_struct, unsigned int flags)
1154
+ {
1155
+ bool status;
1156
+
1157
+ if ((flags & PB_DECODE_DELIMITED) == 0)
1158
+ {
1159
+ status = pb_decode_inner(stream, fields, dest_struct, flags);
1160
+ }
1161
+ else
1162
+ {
1163
+ pb_istream_t substream;
1164
+ if (!pb_make_string_substream(stream, &substream))
1165
+ return false;
1166
+
1167
+ status = pb_decode_inner(&substream, fields, dest_struct, flags);
1168
+
1169
+ if (!pb_close_string_substream(stream, &substream))
1170
+ return false;
1171
+ }
1172
+
1173
+ #ifdef PB_ENABLE_MALLOC
1174
+ if (!status)
1175
+ pb_release(fields, dest_struct);
1176
+ #endif
1177
+
1178
+ return status;
1179
+ }
1180
+
1181
+ bool checkreturn pb_decode(pb_istream_t *stream, const pb_msgdesc_t *fields, void *dest_struct)
1182
+ {
1183
+ bool status;
1184
+
1185
+ status = pb_decode_inner(stream, fields, dest_struct, 0);
1186
+
1187
+ #ifdef PB_ENABLE_MALLOC
1188
+ if (!status)
1189
+ pb_release(fields, dest_struct);
1190
+ #endif
1191
+
1192
+ return status;
1193
+ }
1194
+
1195
+ #ifdef PB_ENABLE_MALLOC
1196
+ /* Given an oneof field, if there has already been a field inside this oneof,
1197
+ * release it before overwriting with a different one. */
1198
+ static bool pb_release_union_field(pb_istream_t *stream, pb_field_iter_t *field)
1199
+ {
1200
+ pb_field_iter_t old_field = *field;
1201
+ pb_size_t old_tag = *(pb_size_t*)field->pSize; /* Previous which_ value */
1202
+ pb_size_t new_tag = field->tag; /* New which_ value */
1203
+
1204
+ if (old_tag == 0)
1205
+ return true; /* Ok, no old data in union */
1206
+
1207
+ if (old_tag == new_tag)
1208
+ return true; /* Ok, old data is of same type => merge */
1209
+
1210
+ /* Release old data. The find can fail if the message struct contains
1211
+ * invalid data. */
1212
+ if (!pb_field_iter_find(&old_field, old_tag))
1213
+ PB_RETURN_ERROR(stream, "invalid union tag");
1214
+
1215
+ pb_release_single_field(&old_field);
1216
+
1217
+ if (PB_ATYPE(field->type) == PB_ATYPE_POINTER)
1218
+ {
1219
+ /* Initialize the pointer to NULL to make sure it is valid
1220
+ * even in case of error return. */
1221
+ *(void**)field->pField = NULL;
1222
+ field->pData = NULL;
1223
+ }
1224
+
1225
+ return true;
1226
+ }
1227
+
1228
+ static void pb_release_single_field(pb_field_iter_t *field)
1229
+ {
1230
+ pb_type_t type;
1231
+ type = field->type;
1232
+
1233
+ if (PB_HTYPE(type) == PB_HTYPE_ONEOF)
1234
+ {
1235
+ if (*(pb_size_t*)field->pSize != field->tag)
1236
+ return; /* This is not the current field in the union */
1237
+ }
1238
+
1239
+ /* Release anything contained inside an extension or submsg.
1240
+ * This has to be done even if the submsg itself is statically
1241
+ * allocated. */
1242
+ if (PB_LTYPE(type) == PB_LTYPE_EXTENSION)
1243
+ {
1244
+ /* Release fields from all extensions in the linked list */
1245
+ pb_extension_t *ext = *(pb_extension_t**)field->pData;
1246
+ while (ext != NULL)
1247
+ {
1248
+ pb_field_iter_t ext_iter;
1249
+ if (pb_field_iter_begin_extension(&ext_iter, ext))
1250
+ {
1251
+ pb_release_single_field(&ext_iter);
1252
+ }
1253
+ ext = ext->next;
1254
+ }
1255
+ }
1256
+ else if (PB_LTYPE_IS_SUBMSG(type) && PB_ATYPE(type) != PB_ATYPE_CALLBACK)
1257
+ {
1258
+ /* Release fields in submessage or submsg array */
1259
+ pb_size_t count = 1;
1260
+
1261
+ if (PB_ATYPE(type) == PB_ATYPE_POINTER)
1262
+ {
1263
+ field->pData = *(void**)field->pField;
1264
+ }
1265
+ else
1266
+ {
1267
+ field->pData = field->pField;
1268
+ }
1269
+
1270
+ if (PB_HTYPE(type) == PB_HTYPE_REPEATED)
1271
+ {
1272
+ count = *(pb_size_t*)field->pSize;
1273
+
1274
+ if (PB_ATYPE(type) == PB_ATYPE_STATIC && count > field->array_size)
1275
+ {
1276
+ /* Protect against corrupted _count fields */
1277
+ count = field->array_size;
1278
+ }
1279
+ }
1280
+
1281
+ if (field->pData)
1282
+ {
1283
+ for (; count > 0; count--)
1284
+ {
1285
+ pb_release(field->submsg_desc, field->pData);
1286
+ field->pData = (char*)field->pData + field->data_size;
1287
+ }
1288
+ }
1289
+ }
1290
+
1291
+ if (PB_ATYPE(type) == PB_ATYPE_POINTER)
1292
+ {
1293
+ if (PB_HTYPE(type) == PB_HTYPE_REPEATED &&
1294
+ (PB_LTYPE(type) == PB_LTYPE_STRING ||
1295
+ PB_LTYPE(type) == PB_LTYPE_BYTES))
1296
+ {
1297
+ /* Release entries in repeated string or bytes array */
1298
+ void **pItem = *(void***)field->pField;
1299
+ pb_size_t count = *(pb_size_t*)field->pSize;
1300
+ for (; count > 0; count--)
1301
+ {
1302
+ pb_free(*pItem);
1303
+ *pItem++ = NULL;
1304
+ }
1305
+ }
1306
+
1307
+ if (PB_HTYPE(type) == PB_HTYPE_REPEATED)
1308
+ {
1309
+ /* We are going to release the array, so set the size to 0 */
1310
+ *(pb_size_t*)field->pSize = 0;
1311
+ }
1312
+
1313
+ /* Release main pointer */
1314
+ pb_free(*(void**)field->pField);
1315
+ *(void**)field->pField = NULL;
1316
+ }
1317
+ }
1318
+
1319
+ void pb_release(const pb_msgdesc_t *fields, void *dest_struct)
1320
+ {
1321
+ pb_field_iter_t iter;
1322
+
1323
+ if (!dest_struct)
1324
+ return; /* Ignore NULL pointers, similar to free() */
1325
+
1326
+ if (!pb_field_iter_begin(&iter, fields, dest_struct))
1327
+ return; /* Empty message type */
1328
+
1329
+ do
1330
+ {
1331
+ pb_release_single_field(&iter);
1332
+ } while (pb_field_iter_next(&iter));
1333
+ }
1334
+ #else
1335
+ void pb_release(const pb_msgdesc_t *fields, void *dest_struct)
1336
+ {
1337
+ /* Nothing to release without PB_ENABLE_MALLOC. */
1338
+ PB_UNUSED(fields);
1339
+ PB_UNUSED(dest_struct);
1340
+ }
1341
+ #endif
1342
+
1343
+ /* Field decoders */
1344
+
1345
+ bool pb_decode_bool(pb_istream_t *stream, bool *dest)
1346
+ {
1347
+ uint32_t value;
1348
+ if (!pb_decode_varint32(stream, &value))
1349
+ return false;
1350
+
1351
+ *(bool*)dest = (value != 0);
1352
+ return true;
1353
+ }
1354
+
1355
+ bool pb_decode_svarint(pb_istream_t *stream, pb_int64_t *dest)
1356
+ {
1357
+ pb_uint64_t value;
1358
+ if (!pb_decode_varint(stream, &value))
1359
+ return false;
1360
+
1361
+ if (value & 1)
1362
+ *dest = (pb_int64_t)(~(value >> 1));
1363
+ else
1364
+ *dest = (pb_int64_t)(value >> 1);
1365
+
1366
+ return true;
1367
+ }
1368
+
1369
+ bool pb_decode_fixed32(pb_istream_t *stream, void *dest)
1370
+ {
1371
+ union {
1372
+ uint32_t fixed32;
1373
+ pb_byte_t bytes[4];
1374
+ } u;
1375
+
1376
+ if (!pb_read(stream, u.bytes, 4))
1377
+ return false;
1378
+
1379
+ #if defined(PB_LITTLE_ENDIAN_8BIT) && PB_LITTLE_ENDIAN_8BIT == 1
1380
+ /* fast path - if we know that we're on little endian, assign directly */
1381
+ *(uint32_t*)dest = u.fixed32;
1382
+ #else
1383
+ *(uint32_t*)dest = ((uint32_t)u.bytes[0] << 0) |
1384
+ ((uint32_t)u.bytes[1] << 8) |
1385
+ ((uint32_t)u.bytes[2] << 16) |
1386
+ ((uint32_t)u.bytes[3] << 24);
1387
+ #endif
1388
+ return true;
1389
+ }
1390
+
1391
+ #ifndef PB_WITHOUT_64BIT
1392
+ bool pb_decode_fixed64(pb_istream_t *stream, void *dest)
1393
+ {
1394
+ union {
1395
+ uint64_t fixed64;
1396
+ pb_byte_t bytes[8];
1397
+ } u;
1398
+
1399
+ if (!pb_read(stream, u.bytes, 8))
1400
+ return false;
1401
+
1402
+ #if defined(PB_LITTLE_ENDIAN_8BIT) && PB_LITTLE_ENDIAN_8BIT == 1
1403
+ /* fast path - if we know that we're on little endian, assign directly */
1404
+ *(uint64_t*)dest = u.fixed64;
1405
+ #else
1406
+ *(uint64_t*)dest = ((uint64_t)u.bytes[0] << 0) |
1407
+ ((uint64_t)u.bytes[1] << 8) |
1408
+ ((uint64_t)u.bytes[2] << 16) |
1409
+ ((uint64_t)u.bytes[3] << 24) |
1410
+ ((uint64_t)u.bytes[4] << 32) |
1411
+ ((uint64_t)u.bytes[5] << 40) |
1412
+ ((uint64_t)u.bytes[6] << 48) |
1413
+ ((uint64_t)u.bytes[7] << 56);
1414
+ #endif
1415
+ return true;
1416
+ }
1417
+ #endif
1418
+
1419
+ static bool checkreturn pb_dec_bool(pb_istream_t *stream, const pb_field_iter_t *field)
1420
+ {
1421
+ return pb_decode_bool(stream, (bool*)field->pData);
1422
+ }
1423
+
1424
+ static bool checkreturn pb_dec_varint(pb_istream_t *stream, const pb_field_iter_t *field)
1425
+ {
1426
+ if (PB_LTYPE(field->type) == PB_LTYPE_UVARINT)
1427
+ {
1428
+ pb_uint64_t value, clamped;
1429
+ if (!pb_decode_varint(stream, &value))
1430
+ return false;
1431
+
1432
+ /* Cast to the proper field size, while checking for overflows */
1433
+ if (field->data_size == sizeof(pb_uint64_t))
1434
+ clamped = *(pb_uint64_t*)field->pData = value;
1435
+ else if (field->data_size == sizeof(uint32_t))
1436
+ clamped = *(uint32_t*)field->pData = (uint32_t)value;
1437
+ else if (field->data_size == sizeof(uint_least16_t))
1438
+ clamped = *(uint_least16_t*)field->pData = (uint_least16_t)value;
1439
+ else if (field->data_size == sizeof(uint_least8_t))
1440
+ clamped = *(uint_least8_t*)field->pData = (uint_least8_t)value;
1441
+ else
1442
+ PB_RETURN_ERROR(stream, "invalid data_size");
1443
+
1444
+ if (clamped != value)
1445
+ PB_RETURN_ERROR(stream, "integer too large");
1446
+
1447
+ return true;
1448
+ }
1449
+ else
1450
+ {
1451
+ pb_uint64_t value;
1452
+ pb_int64_t svalue;
1453
+ pb_int64_t clamped;
1454
+
1455
+ if (PB_LTYPE(field->type) == PB_LTYPE_SVARINT)
1456
+ {
1457
+ if (!pb_decode_svarint(stream, &svalue))
1458
+ return false;
1459
+ }
1460
+ else
1461
+ {
1462
+ if (!pb_decode_varint(stream, &value))
1463
+ return false;
1464
+
1465
+ /* See issue 97: Google's C++ protobuf allows negative varint values to
1466
+ * be cast as int32_t, instead of the int64_t that should be used when
1467
+ * encoding. Nanopb versions before 0.2.5 had a bug in encoding. In order to
1468
+ * not break decoding of such messages, we cast <=32 bit fields to
1469
+ * int32_t first to get the sign correct.
1470
+ */
1471
+ if (field->data_size == sizeof(pb_int64_t))
1472
+ svalue = (pb_int64_t)value;
1473
+ else
1474
+ svalue = (int32_t)value;
1475
+ }
1476
+
1477
+ /* Cast to the proper field size, while checking for overflows */
1478
+ if (field->data_size == sizeof(pb_int64_t))
1479
+ clamped = *(pb_int64_t*)field->pData = svalue;
1480
+ else if (field->data_size == sizeof(int32_t))
1481
+ clamped = *(int32_t*)field->pData = (int32_t)svalue;
1482
+ else if (field->data_size == sizeof(int_least16_t))
1483
+ clamped = *(int_least16_t*)field->pData = (int_least16_t)svalue;
1484
+ else if (field->data_size == sizeof(int_least8_t))
1485
+ clamped = *(int_least8_t*)field->pData = (int_least8_t)svalue;
1486
+ else
1487
+ PB_RETURN_ERROR(stream, "invalid data_size");
1488
+
1489
+ if (clamped != svalue)
1490
+ PB_RETURN_ERROR(stream, "integer too large");
1491
+
1492
+ return true;
1493
+ }
1494
+ }
1495
+
1496
+ static bool checkreturn pb_dec_bytes(pb_istream_t *stream, const pb_field_iter_t *field)
1497
+ {
1498
+ uint32_t size;
1499
+ size_t alloc_size;
1500
+ pb_bytes_array_t *dest;
1501
+
1502
+ if (!pb_decode_varint32(stream, &size))
1503
+ return false;
1504
+
1505
+ if (size > PB_SIZE_MAX)
1506
+ PB_RETURN_ERROR(stream, "bytes overflow");
1507
+
1508
+ alloc_size = PB_BYTES_ARRAY_T_ALLOCSIZE(size);
1509
+ if (size > alloc_size)
1510
+ PB_RETURN_ERROR(stream, "size too large");
1511
+
1512
+ if (PB_ATYPE(field->type) == PB_ATYPE_POINTER)
1513
+ {
1514
+ #ifndef PB_ENABLE_MALLOC
1515
+ PB_RETURN_ERROR(stream, "no malloc support");
1516
+ #else
1517
+ if (stream->bytes_left < size)
1518
+ PB_RETURN_ERROR(stream, "end-of-stream");
1519
+
1520
+ if (!allocate_field(stream, field->pData, alloc_size, 1))
1521
+ return false;
1522
+ dest = *(pb_bytes_array_t**)field->pData;
1523
+ #endif
1524
+ }
1525
+ else
1526
+ {
1527
+ if (alloc_size > field->data_size)
1528
+ PB_RETURN_ERROR(stream, "bytes overflow");
1529
+ dest = (pb_bytes_array_t*)field->pData;
1530
+ }
1531
+
1532
+ dest->size = (pb_size_t)size;
1533
+ return pb_read(stream, dest->bytes, (size_t)size);
1534
+ }
1535
+
1536
+ static bool checkreturn pb_dec_string(pb_istream_t *stream, const pb_field_iter_t *field)
1537
+ {
1538
+ uint32_t size;
1539
+ size_t alloc_size;
1540
+ pb_byte_t *dest = (pb_byte_t*)field->pData;
1541
+
1542
+ if (!pb_decode_varint32(stream, &size))
1543
+ return false;
1544
+
1545
+ if (size == (uint32_t)-1)
1546
+ PB_RETURN_ERROR(stream, "size too large");
1547
+
1548
+ /* Space for null terminator */
1549
+ alloc_size = (size_t)(size + 1);
1550
+
1551
+ if (alloc_size < size)
1552
+ PB_RETURN_ERROR(stream, "size too large");
1553
+
1554
+ if (PB_ATYPE(field->type) == PB_ATYPE_POINTER)
1555
+ {
1556
+ #ifndef PB_ENABLE_MALLOC
1557
+ PB_RETURN_ERROR(stream, "no malloc support");
1558
+ #else
1559
+ if (stream->bytes_left < size)
1560
+ PB_RETURN_ERROR(stream, "end-of-stream");
1561
+
1562
+ if (!allocate_field(stream, field->pData, alloc_size, 1))
1563
+ return false;
1564
+ dest = *(pb_byte_t**)field->pData;
1565
+ #endif
1566
+ }
1567
+ else
1568
+ {
1569
+ if (alloc_size > field->data_size)
1570
+ PB_RETURN_ERROR(stream, "string overflow");
1571
+ }
1572
+
1573
+ dest[size] = 0;
1574
+
1575
+ if (!pb_read(stream, dest, (size_t)size))
1576
+ return false;
1577
+
1578
+ #ifdef PB_VALIDATE_UTF8
1579
+ if (!pb_validate_utf8((const char*)dest))
1580
+ PB_RETURN_ERROR(stream, "invalid utf8");
1581
+ #endif
1582
+
1583
+ return true;
1584
+ }
1585
+
1586
+ static bool checkreturn pb_dec_submessage(pb_istream_t *stream, const pb_field_iter_t *field)
1587
+ {
1588
+ bool status = true;
1589
+ bool submsg_consumed = false;
1590
+ pb_istream_t substream;
1591
+
1592
+ if (!pb_make_string_substream(stream, &substream))
1593
+ return false;
1594
+
1595
+ if (field->submsg_desc == NULL)
1596
+ PB_RETURN_ERROR(stream, "invalid field descriptor");
1597
+
1598
+ /* Submessages can have a separate message-level callback that is called
1599
+ * before decoding the message. Typically it is used to set callback fields
1600
+ * inside oneofs. */
1601
+ if (PB_LTYPE(field->type) == PB_LTYPE_SUBMSG_W_CB && field->pSize != NULL)
1602
+ {
1603
+ /* Message callback is stored right before pSize. */
1604
+ pb_callback_t *callback = (pb_callback_t*)field->pSize - 1;
1605
+ if (callback->funcs.decode)
1606
+ {
1607
+ status = callback->funcs.decode(&substream, field, &callback->arg);
1608
+
1609
+ if (substream.bytes_left == 0)
1610
+ {
1611
+ submsg_consumed = true;
1612
+ }
1613
+ }
1614
+ }
1615
+
1616
+ /* Now decode the submessage contents */
1617
+ if (status && !submsg_consumed)
1618
+ {
1619
+ unsigned int flags = 0;
1620
+
1621
+ /* Static required/optional fields are already initialized by top-level
1622
+ * pb_decode(), no need to initialize them again. */
1623
+ if (PB_ATYPE(field->type) == PB_ATYPE_STATIC &&
1624
+ PB_HTYPE(field->type) != PB_HTYPE_REPEATED)
1625
+ {
1626
+ flags = PB_DECODE_NOINIT;
1627
+ }
1628
+
1629
+ status = pb_decode_inner(&substream, field->submsg_desc, field->pData, flags);
1630
+ }
1631
+
1632
+ if (!pb_close_string_substream(stream, &substream))
1633
+ return false;
1634
+
1635
+ return status;
1636
+ }
1637
+
1638
+ static bool checkreturn pb_dec_fixed_length_bytes(pb_istream_t *stream, const pb_field_iter_t *field)
1639
+ {
1640
+ uint32_t size;
1641
+
1642
+ if (!pb_decode_varint32(stream, &size))
1643
+ return false;
1644
+
1645
+ if (size > PB_SIZE_MAX)
1646
+ PB_RETURN_ERROR(stream, "bytes overflow");
1647
+
1648
+ if (size == 0)
1649
+ {
1650
+ /* As a special case, treat empty bytes string as all zeros for fixed_length_bytes. */
1651
+ memset(field->pData, 0, (size_t)field->data_size);
1652
+ return true;
1653
+ }
1654
+
1655
+ if (size != field->data_size)
1656
+ PB_RETURN_ERROR(stream, "incorrect fixed length bytes size");
1657
+
1658
+ return pb_read(stream, (pb_byte_t*)field->pData, (size_t)field->data_size);
1659
+ }
1660
+
1661
+ #ifdef PB_CONVERT_DOUBLE_FLOAT
1662
+ bool pb_decode_double_as_float(pb_istream_t *stream, float *dest)
1663
+ {
1664
+ uint_least8_t sign;
1665
+ int exponent;
1666
+ uint32_t mantissa;
1667
+ uint64_t value;
1668
+ union { float f; uint32_t i; } out;
1669
+
1670
+ if (!pb_decode_fixed64(stream, &value))
1671
+ return false;
1672
+
1673
+ /* Decompose input value */
1674
+ sign = (uint_least8_t)((value >> 63) & 1);
1675
+ exponent = (int)((value >> 52) & 0x7FF) - 1023;
1676
+ mantissa = (value >> 28) & 0xFFFFFF; /* Highest 24 bits */
1677
+
1678
+ /* Figure if value is in range representable by floats. */
1679
+ if (exponent == 1024)
1680
+ {
1681
+ /* Special value */
1682
+ exponent = 128;
1683
+ mantissa >>= 1;
1684
+ }
1685
+ else
1686
+ {
1687
+ if (exponent > 127)
1688
+ {
1689
+ /* Too large, convert to infinity */
1690
+ exponent = 128;
1691
+ mantissa = 0;
1692
+ }
1693
+ else if (exponent < -150)
1694
+ {
1695
+ /* Too small, convert to zero */
1696
+ exponent = -127;
1697
+ mantissa = 0;
1698
+ }
1699
+ else if (exponent < -126)
1700
+ {
1701
+ /* Denormalized */
1702
+ mantissa |= 0x1000000;
1703
+ mantissa >>= (-126 - exponent);
1704
+ exponent = -127;
1705
+ }
1706
+
1707
+ /* Round off mantissa */
1708
+ mantissa = (mantissa + 1) >> 1;
1709
+
1710
+ /* Check if mantissa went over 2.0 */
1711
+ if (mantissa & 0x800000)
1712
+ {
1713
+ exponent += 1;
1714
+ mantissa &= 0x7FFFFF;
1715
+ mantissa >>= 1;
1716
+ }
1717
+ }
1718
+
1719
+ /* Combine fields */
1720
+ out.i = mantissa;
1721
+ out.i |= (uint32_t)(exponent + 127) << 23;
1722
+ out.i |= (uint32_t)sign << 31;
1723
+
1724
+ *dest = out.f;
1725
+ return true;
1726
+ }
1727
+ #endif