react-native-quick-crypto 1.0.18 → 1.1.0

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 (751) hide show
  1. package/QuickCrypto.podspec +12 -38
  2. package/README.md +2 -0
  3. package/android/CMakeLists.txt +3 -0
  4. package/cpp/utils/HybridUtils.cpp +39 -77
  5. package/deps/simdutf/.clang-format +4 -0
  6. package/deps/simdutf/.github/ISSUE_TEMPLATE/bug_report.md +62 -0
  7. package/deps/simdutf/.github/ISSUE_TEMPLATE/config.yml +1 -0
  8. package/deps/simdutf/.github/ISSUE_TEMPLATE/feature_request.md +35 -0
  9. package/deps/simdutf/.github/ISSUE_TEMPLATE/standard-issue-template.md +29 -0
  10. package/deps/simdutf/.github/pull_request_template.md +51 -0
  11. package/deps/simdutf/.github/workflows/aarch64.yml +39 -0
  12. package/deps/simdutf/.github/workflows/alpine.yml +27 -0
  13. package/deps/simdutf/.github/workflows/amalgamation_demos.yml +34 -0
  14. package/deps/simdutf/.github/workflows/armv7.yml +32 -0
  15. package/deps/simdutf/.github/workflows/atomic_fuzz.yml +25 -0
  16. package/deps/simdutf/.github/workflows/cifuzz.yml +37 -0
  17. package/deps/simdutf/.github/workflows/clangformat.yml +36 -0
  18. package/deps/simdutf/.github/workflows/debian-latestcxxstandards.yml +40 -0
  19. package/deps/simdutf/.github/workflows/debian.yml +33 -0
  20. package/deps/simdutf/.github/workflows/documentation.yml +36 -0
  21. package/deps/simdutf/.github/workflows/emscripten.yml +19 -0
  22. package/deps/simdutf/.github/workflows/loongarch64-gcc-14.2.yml +39 -0
  23. package/deps/simdutf/.github/workflows/macos-latest.yml +29 -0
  24. package/deps/simdutf/.github/workflows/msys2-clang.yml +48 -0
  25. package/deps/simdutf/.github/workflows/msys2.yml +50 -0
  26. package/deps/simdutf/.github/workflows/ppc64le.yml +29 -0
  27. package/deps/simdutf/.github/workflows/rvv-1024-clang-18.yml +35 -0
  28. package/deps/simdutf/.github/workflows/rvv-128-clang-17.yml +35 -0
  29. package/deps/simdutf/.github/workflows/rvv-256-gcc-14.yml +31 -0
  30. package/deps/simdutf/.github/workflows/s390x.yml +29 -0
  31. package/deps/simdutf/.github/workflows/selective-amalgamation.yml +29 -0
  32. package/deps/simdutf/.github/workflows/typos.yml +19 -0
  33. package/deps/simdutf/.github/workflows/ubuntu22-cxx20.yml +30 -0
  34. package/deps/simdutf/.github/workflows/ubuntu22.yml +32 -0
  35. package/deps/simdutf/.github/workflows/ubuntu22_gcc12.yml +27 -0
  36. package/deps/simdutf/.github/workflows/ubuntu22sani.yml +29 -0
  37. package/deps/simdutf/.github/workflows/ubuntu24-cxxstandards.yml +34 -0
  38. package/deps/simdutf/.github/workflows/ubuntu24-unsignedchar.yml +34 -0
  39. package/deps/simdutf/.github/workflows/ubuntu24.yml +32 -0
  40. package/deps/simdutf/.github/workflows/ubuntu24sani.yml +36 -0
  41. package/deps/simdutf/.github/workflows/ubuntu24sani_clang.yml +29 -0
  42. package/deps/simdutf/.github/workflows/vs17-arm-ci.yml +21 -0
  43. package/deps/simdutf/.github/workflows/vs17-ci-cxx20.yml +41 -0
  44. package/deps/simdutf/.github/workflows/vs17-ci.yml +41 -0
  45. package/deps/simdutf/.github/workflows/vs17-clang-ci.yml +41 -0
  46. package/deps/simdutf/.github/workflows/vs17-cxxstandards.yml +36 -0
  47. package/deps/simdutf/AI_USAGE_POLICY.md +56 -0
  48. package/deps/simdutf/AUTHORS +6 -0
  49. package/deps/simdutf/CMakeLists.txt +231 -0
  50. package/deps/simdutf/CONTRIBUTING.md +214 -0
  51. package/deps/simdutf/CONTRIBUTORS +1 -0
  52. package/deps/simdutf/Doxyfile +2584 -0
  53. package/deps/simdutf/LICENSE-APACHE +201 -0
  54. package/deps/simdutf/LICENSE-MIT +18 -0
  55. package/deps/simdutf/Makefile.crosscompile +54 -0
  56. package/deps/simdutf/README-RVV.md +16 -0
  57. package/deps/simdutf/README.md +2782 -0
  58. package/deps/simdutf/SECURITY.md +8 -0
  59. package/deps/simdutf/benchmarks/CMakeLists.txt +101 -0
  60. package/deps/simdutf/benchmarks/alignment.cpp +150 -0
  61. package/deps/simdutf/benchmarks/base64/CMakeLists.txt +30 -0
  62. package/deps/simdutf/benchmarks/base64/benchmark_base64.cpp +875 -0
  63. package/deps/simdutf/benchmarks/base64/libbase64_spaces.h +49 -0
  64. package/deps/simdutf/benchmarks/base64/node_base64.h +227 -0
  65. package/deps/simdutf/benchmarks/base64/openssl3_base64.h +334 -0
  66. package/deps/simdutf/benchmarks/benchmark.cpp +65 -0
  67. package/deps/simdutf/benchmarks/benchmark_to_well_formed_utf16.cpp +347 -0
  68. package/deps/simdutf/benchmarks/competition/.clang-format-ignore +5 -0
  69. package/deps/simdutf/benchmarks/competition/CppCon2018/utf_utils.cpp +1276 -0
  70. package/deps/simdutf/benchmarks/competition/CppCon2018/utf_utils.h +595 -0
  71. package/deps/simdutf/benchmarks/competition/README.md +7 -0
  72. package/deps/simdutf/benchmarks/competition/hoehrmann/hoehrmann.h +91 -0
  73. package/deps/simdutf/benchmarks/competition/inoue2008/inoue_utf8_to_utf16.h +444 -0
  74. package/deps/simdutf/benchmarks/competition/inoue2008/inoue_utf8_to_utf16_tables.h +13183 -0
  75. package/deps/simdutf/benchmarks/competition/inoue2008/script.py +73 -0
  76. package/deps/simdutf/benchmarks/competition/llvm/ConvertUTF.cpp +738 -0
  77. package/deps/simdutf/benchmarks/competition/llvm/ConvertUTF.h +293 -0
  78. package/deps/simdutf/benchmarks/competition/u8u16/COPYRIGHT +8 -0
  79. package/deps/simdutf/benchmarks/competition/u8u16/Makefile +44 -0
  80. package/deps/simdutf/benchmarks/competition/u8u16/OSL3.0.txt +169 -0
  81. package/deps/simdutf/benchmarks/competition/u8u16/Profiling/BOM_Profiler.h +148 -0
  82. package/deps/simdutf/benchmarks/competition/u8u16/Profiling/i386_timer.h +45 -0
  83. package/deps/simdutf/benchmarks/competition/u8u16/Profiling/ppc_timer.c +34 -0
  84. package/deps/simdutf/benchmarks/competition/u8u16/README +56 -0
  85. package/deps/simdutf/benchmarks/competition/u8u16/config/config_defs.h +43 -0
  86. package/deps/simdutf/benchmarks/competition/u8u16/config/g4_config.h +27 -0
  87. package/deps/simdutf/benchmarks/competition/u8u16/config/mmx_config.h +16 -0
  88. package/deps/simdutf/benchmarks/competition/u8u16/config/p4_config.h +18 -0
  89. package/deps/simdutf/benchmarks/competition/u8u16/config/p4_ideal_config.h +16 -0
  90. package/deps/simdutf/benchmarks/competition/u8u16/config/spu_config.h +28 -0
  91. package/deps/simdutf/benchmarks/competition/u8u16/config/ssse3_config.h +20 -0
  92. package/deps/simdutf/benchmarks/competition/u8u16/iconv_u8u16.c +2 -0
  93. package/deps/simdutf/benchmarks/competition/u8u16/lib/altivec_simd.h +440 -0
  94. package/deps/simdutf/benchmarks/competition/u8u16/lib/libgen/make_basic_ops.py +121 -0
  95. package/deps/simdutf/benchmarks/competition/u8u16/lib/libgen/make_half_operand_versions.py +158 -0
  96. package/deps/simdutf/benchmarks/competition/u8u16/lib/libgen/make_test.py +270 -0
  97. package/deps/simdutf/benchmarks/competition/u8u16/lib/mmx_simd.h +141 -0
  98. package/deps/simdutf/benchmarks/competition/u8u16/lib/mmx_simd_basic.h +216 -0
  99. package/deps/simdutf/benchmarks/competition/u8u16/lib/mmx_simd_built_in.h +119 -0
  100. package/deps/simdutf/benchmarks/competition/u8u16/lib/mmx_simd_modified.h +2430 -0
  101. package/deps/simdutf/benchmarks/competition/u8u16/lib/outline.txt +39 -0
  102. package/deps/simdutf/benchmarks/competition/u8u16/lib/spu_simd.h +421 -0
  103. package/deps/simdutf/benchmarks/competition/u8u16/lib/sse_simd.h +836 -0
  104. package/deps/simdutf/benchmarks/competition/u8u16/lib/stdint.h +222 -0
  105. package/deps/simdutf/benchmarks/competition/u8u16/libu8u16_BE.c +4 -0
  106. package/deps/simdutf/benchmarks/competition/u8u16/libu8u16_LE.c +5 -0
  107. package/deps/simdutf/benchmarks/competition/u8u16/proto/u8u16.py +390 -0
  108. package/deps/simdutf/benchmarks/competition/u8u16/src/Makefile +18 -0
  109. package/deps/simdutf/benchmarks/competition/u8u16/src/bytelex.h +448 -0
  110. package/deps/simdutf/benchmarks/competition/u8u16/src/charsets/ASCII_EBCDIC.h +284 -0
  111. package/deps/simdutf/benchmarks/competition/u8u16/src/libu8u16.c +1975 -0
  112. package/deps/simdutf/benchmarks/competition/u8u16/src/libu8u16.pdf +0 -0
  113. package/deps/simdutf/benchmarks/competition/u8u16/src/libu8u16.w +2263 -0
  114. package/deps/simdutf/benchmarks/competition/u8u16/src/multiliteral.h +239 -0
  115. package/deps/simdutf/benchmarks/competition/u8u16/src/u8u16.c +232 -0
  116. package/deps/simdutf/benchmarks/competition/u8u16/src/x8x16.c +194 -0
  117. package/deps/simdutf/benchmarks/competition/u8u16/src/xml_error.c +193 -0
  118. package/deps/simdutf/benchmarks/competition/u8u16/src/xml_error.h +167 -0
  119. package/deps/simdutf/benchmarks/competition/u8u16/src/xmldecl.c +288 -0
  120. package/deps/simdutf/benchmarks/competition/u8u16/src/xmldecl.h +117 -0
  121. package/deps/simdutf/benchmarks/competition/u8u16/u8u16_g4.c +2 -0
  122. package/deps/simdutf/benchmarks/competition/u8u16/u8u16_mmx.c +2 -0
  123. package/deps/simdutf/benchmarks/competition/u8u16/u8u16_p4.c +3 -0
  124. package/deps/simdutf/benchmarks/competition/u8u16/u8u16_p4_ideal.c +2 -0
  125. package/deps/simdutf/benchmarks/competition/u8u16/u8u16_spu.c +2 -0
  126. package/deps/simdutf/benchmarks/competition/u8u16/u8u16_ssse3.c +3 -0
  127. package/deps/simdutf/benchmarks/competition/u8u16/x8x16_p4.c +2 -0
  128. package/deps/simdutf/benchmarks/competition/utf8lut/LICENSE +23 -0
  129. package/deps/simdutf/benchmarks/competition/utf8lut/data/test_minimal.txt +44 -0
  130. package/deps/simdutf/benchmarks/competition/utf8lut/readme.md +106 -0
  131. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_clang_corr_tests.cmd +11 -0
  132. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_clang_corr_tests.sh +13 -0
  133. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_gcc_corr_tests.sh +13 -0
  134. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_gcc_example.sh +13 -0
  135. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_gcc_file_conv.sh +14 -0
  136. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_gcc_iconv_lib.sh +11 -0
  137. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_gcc_iconv_sample.sh +8 -0
  138. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_mingw_corr_tests.cmd +12 -0
  139. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_mingw_example.cmd +13 -0
  140. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_mingw_file_conv.cmd +14 -0
  141. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_mingw_iconv_lib.cmd +11 -0
  142. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_mingw_iconv_sample.cmd +8 -0
  143. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_msvc_corr_tests.cmd +11 -0
  144. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_msvc_example.cmd +12 -0
  145. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_msvc_file_conv.cmd +13 -0
  146. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_msvc_iconv_lib.cmd +10 -0
  147. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_msvc_iconv_sample.cmd +9 -0
  148. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/html_table.py +25 -0
  149. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/measure.py +94 -0
  150. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/resize.py +20 -0
  151. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/wipe_all.cmd +2 -0
  152. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/wipe_interm.cmd +1 -0
  153. package/deps/simdutf/benchmarks/competition/utf8lut/src/base/CustomMemcpy.h +75 -0
  154. package/deps/simdutf/benchmarks/competition/utf8lut/src/base/PerfDefs.h +47 -0
  155. package/deps/simdutf/benchmarks/competition/utf8lut/src/base/Timing.cpp +17 -0
  156. package/deps/simdutf/benchmarks/competition/utf8lut/src/base/Timing.h +76 -0
  157. package/deps/simdutf/benchmarks/competition/utf8lut/src/buffer/AllProcessors.cpp +35 -0
  158. package/deps/simdutf/benchmarks/competition/utf8lut/src/buffer/BaseBufferProcessor.cpp +117 -0
  159. package/deps/simdutf/benchmarks/competition/utf8lut/src/buffer/BaseBufferProcessor.h +210 -0
  160. package/deps/simdutf/benchmarks/competition/utf8lut/src/buffer/BufferDecoder.h +158 -0
  161. package/deps/simdutf/benchmarks/competition/utf8lut/src/buffer/BufferEncoder.h +104 -0
  162. package/deps/simdutf/benchmarks/competition/utf8lut/src/buffer/ProcessorPlugins.h +334 -0
  163. package/deps/simdutf/benchmarks/competition/utf8lut/src/buffer/ProcessorSelector.h +186 -0
  164. package/deps/simdutf/benchmarks/competition/utf8lut/src/core/DecoderLut.cpp +140 -0
  165. package/deps/simdutf/benchmarks/competition/utf8lut/src/core/DecoderLut.h +42 -0
  166. package/deps/simdutf/benchmarks/competition/utf8lut/src/core/DecoderProcess.h +100 -0
  167. package/deps/simdutf/benchmarks/competition/utf8lut/src/core/Dfa.h +57 -0
  168. package/deps/simdutf/benchmarks/competition/utf8lut/src/core/EncoderLut.cpp +85 -0
  169. package/deps/simdutf/benchmarks/competition/utf8lut/src/core/EncoderLut.h +27 -0
  170. package/deps/simdutf/benchmarks/competition/utf8lut/src/core/EncoderProcess.h +126 -0
  171. package/deps/simdutf/benchmarks/competition/utf8lut/src/core/ProcessTrivial.h +108 -0
  172. package/deps/simdutf/benchmarks/competition/utf8lut/src/iconv/iconv.cpp +139 -0
  173. package/deps/simdutf/benchmarks/competition/utf8lut/src/iconv/iconv.h +74 -0
  174. package/deps/simdutf/benchmarks/competition/utf8lut/src/message/MessageConverter.cpp +65 -0
  175. package/deps/simdutf/benchmarks/competition/utf8lut/src/message/MessageConverter.h +91 -0
  176. package/deps/simdutf/benchmarks/competition/utf8lut/src/tests/CorrectnessTests.cpp +772 -0
  177. package/deps/simdutf/benchmarks/competition/utf8lut/src/tests/Example.cpp +12 -0
  178. package/deps/simdutf/benchmarks/competition/utf8lut/src/tests/FileConverter.cpp +486 -0
  179. package/deps/simdutf/benchmarks/competition/utf8lut/src/tests/iconv_sample.c +162 -0
  180. package/deps/simdutf/benchmarks/competition/utf8lut/src/utf8lut.h +15 -0
  181. package/deps/simdutf/benchmarks/competition/utf8sse4/fromutf8-sse.cpp +292 -0
  182. package/deps/simdutf/benchmarks/competition/utfcpp/LICENSE +23 -0
  183. package/deps/simdutf/benchmarks/competition/utfcpp/README.md +1503 -0
  184. package/deps/simdutf/benchmarks/competition/utfcpp/source/utf8/checked.h +335 -0
  185. package/deps/simdutf/benchmarks/competition/utfcpp/source/utf8/core.h +338 -0
  186. package/deps/simdutf/benchmarks/competition/utfcpp/source/utf8/cpp11.h +103 -0
  187. package/deps/simdutf/benchmarks/competition/utfcpp/source/utf8/cpp17.h +103 -0
  188. package/deps/simdutf/benchmarks/competition/utfcpp/source/utf8/unchecked.h +274 -0
  189. package/deps/simdutf/benchmarks/competition/utfcpp/source/utf8.h +34 -0
  190. package/deps/simdutf/benchmarks/dataset/README.md +155 -0
  191. package/deps/simdutf/benchmarks/dataset/emoji.txt +204 -0
  192. package/deps/simdutf/benchmarks/dataset/scripts/utf8type.py +40 -0
  193. package/deps/simdutf/benchmarks/dataset/wikipedia_mars/Makefile +80 -0
  194. package/deps/simdutf/benchmarks/dataset/wikipedia_mars/convert_to_utf6.py +20 -0
  195. package/deps/simdutf/benchmarks/find/CMakeLists.txt +6 -0
  196. package/deps/simdutf/benchmarks/find/findbenchmark.cpp +63 -0
  197. package/deps/simdutf/benchmarks/find/findbenchmarker.h +46 -0
  198. package/deps/simdutf/benchmarks/shortbench.cpp +555 -0
  199. package/deps/simdutf/benchmarks/src/CMakeLists.txt +52 -0
  200. package/deps/simdutf/benchmarks/src/apple_arm_events.h +1104 -0
  201. package/deps/simdutf/benchmarks/src/benchmark.cpp +3899 -0
  202. package/deps/simdutf/benchmarks/src/benchmark.h +317 -0
  203. package/deps/simdutf/benchmarks/src/benchmark_base.cpp +144 -0
  204. package/deps/simdutf/benchmarks/src/benchmark_base.h +98 -0
  205. package/deps/simdutf/benchmarks/src/cmdline.cpp +176 -0
  206. package/deps/simdutf/benchmarks/src/cmdline.h +35 -0
  207. package/deps/simdutf/benchmarks/src/event_counter.h +162 -0
  208. package/deps/simdutf/benchmarks/src/linux-perf-events.h +104 -0
  209. package/deps/simdutf/benchmarks/stream.cpp +209 -0
  210. package/deps/simdutf/benchmarks/threaded.cpp +123 -0
  211. package/deps/simdutf/cmake/CPM.cmake +1363 -0
  212. package/deps/simdutf/cmake/JoinPaths.cmake +23 -0
  213. package/deps/simdutf/cmake/add_cpp_test.cmake +68 -0
  214. package/deps/simdutf/cmake/simdutf-config.cmake.in +2 -0
  215. package/deps/simdutf/cmake/simdutf-flags.cmake +26 -0
  216. package/deps/simdutf/cmake/toolchains-ci/riscv64-linux-gnu.cmake +4 -0
  217. package/deps/simdutf/cmake/toolchains-dev/README.md +32 -0
  218. package/deps/simdutf/cmake/toolchains-dev/aarch64.cmake +14 -0
  219. package/deps/simdutf/cmake/toolchains-dev/loongarch64.cmake +22 -0
  220. package/deps/simdutf/cmake/toolchains-dev/powerpc64.cmake +16 -0
  221. package/deps/simdutf/cmake/toolchains-dev/powerpc64le.cmake +16 -0
  222. package/deps/simdutf/cmake/toolchains-dev/riscv64.cmake +16 -0
  223. package/deps/simdutf/cmake/toolchains-dev/rvv-spike.cmake +38 -0
  224. package/deps/simdutf/doc/avx512.png +0 -0
  225. package/deps/simdutf/doc/logo.png +0 -0
  226. package/deps/simdutf/doc/logo.svg +165 -0
  227. package/deps/simdutf/doc/node2023.png +0 -0
  228. package/deps/simdutf/doc/shortinput.md +78 -0
  229. package/deps/simdutf/doc/utf16utf8.png +0 -0
  230. package/deps/simdutf/doc/utf8utf16.png +0 -0
  231. package/deps/simdutf/doc/widelogo.png +0 -0
  232. package/deps/simdutf/doxygen.py +50 -0
  233. package/deps/simdutf/fuzz/.clang-format +9 -0
  234. package/deps/simdutf/fuzz/CMakeLists.txt +45 -0
  235. package/deps/simdutf/fuzz/README.md +168 -0
  236. package/deps/simdutf/fuzz/atomic_base64.cpp +448 -0
  237. package/deps/simdutf/fuzz/base64.cpp +278 -0
  238. package/deps/simdutf/fuzz/build.sh +83 -0
  239. package/deps/simdutf/fuzz/conversion.cpp +669 -0
  240. package/deps/simdutf/fuzz/helpers/.clang-format-ignore +1 -0
  241. package/deps/simdutf/fuzz/helpers/common.h +135 -0
  242. package/deps/simdutf/fuzz/helpers/nameof.hpp +1258 -0
  243. package/deps/simdutf/fuzz/main.cpp +72 -0
  244. package/deps/simdutf/fuzz/minimize_and_cleanse.sh +87 -0
  245. package/deps/simdutf/fuzz/misc.cpp +216 -0
  246. package/deps/simdutf/fuzz/random_fuzz.sh +154 -0
  247. package/deps/simdutf/fuzz/roundtrip.cpp +588 -0
  248. package/deps/simdutf/fuzz/safe_conversion.cpp +104 -0
  249. package/deps/simdutf/include/simdutf/avx512.h +79 -0
  250. package/deps/simdutf/include/simdutf/base64_implementation.h +158 -0
  251. package/deps/simdutf/include/simdutf/base64_tables.h +887 -0
  252. package/deps/simdutf/include/simdutf/common_defs.h +186 -0
  253. package/deps/simdutf/include/simdutf/compiler_check.h +50 -0
  254. package/deps/simdutf/include/simdutf/constexpr_ptr.h +138 -0
  255. package/deps/simdutf/include/simdutf/encoding_types.h +189 -0
  256. package/deps/simdutf/include/simdutf/error.h +126 -0
  257. package/deps/simdutf/include/simdutf/implementation.h +7081 -0
  258. package/deps/simdutf/include/simdutf/internal/isadetection.h +325 -0
  259. package/deps/simdutf/include/simdutf/portability.h +285 -0
  260. package/deps/simdutf/include/simdutf/scalar/ascii.h +86 -0
  261. package/deps/simdutf/include/simdutf/scalar/atomic_util.h +105 -0
  262. package/deps/simdutf/include/simdutf/scalar/base64.h +911 -0
  263. package/deps/simdutf/include/simdutf/scalar/latin1.h +26 -0
  264. package/deps/simdutf/include/simdutf/scalar/latin1_to_utf16/latin1_to_utf16.h +52 -0
  265. package/deps/simdutf/include/simdutf/scalar/latin1_to_utf32/latin1_to_utf32.h +27 -0
  266. package/deps/simdutf/include/simdutf/scalar/latin1_to_utf8/latin1_to_utf8.h +191 -0
  267. package/deps/simdutf/include/simdutf/scalar/swap_bytes.h +35 -0
  268. package/deps/simdutf/include/simdutf/scalar/utf16.h +226 -0
  269. package/deps/simdutf/include/simdutf/scalar/utf16_to_latin1/utf16_to_latin1.h +108 -0
  270. package/deps/simdutf/include/simdutf/scalar/utf16_to_latin1/valid_utf16_to_latin1.h +40 -0
  271. package/deps/simdutf/include/simdutf/scalar/utf16_to_utf32/utf16_to_utf32.h +86 -0
  272. package/deps/simdutf/include/simdutf/scalar/utf16_to_utf32/valid_utf16_to_utf32.h +44 -0
  273. package/deps/simdutf/include/simdutf/scalar/utf16_to_utf8/utf16_to_utf8.h +295 -0
  274. package/deps/simdutf/include/simdutf/scalar/utf16_to_utf8/valid_utf16_to_utf8.h +91 -0
  275. package/deps/simdutf/include/simdutf/scalar/utf32.h +82 -0
  276. package/deps/simdutf/include/simdutf/scalar/utf32_to_latin1/utf32_to_latin1.h +68 -0
  277. package/deps/simdutf/include/simdutf/scalar/utf32_to_latin1/valid_utf32_to_latin1.h +67 -0
  278. package/deps/simdutf/include/simdutf/scalar/utf32_to_utf16/utf32_to_utf16.h +84 -0
  279. package/deps/simdutf/include/simdutf/scalar/utf32_to_utf16/valid_utf32_to_utf16.h +44 -0
  280. package/deps/simdutf/include/simdutf/scalar/utf32_to_utf8/utf32_to_utf8.h +142 -0
  281. package/deps/simdutf/include/simdutf/scalar/utf32_to_utf8/valid_utf32_to_utf8.h +72 -0
  282. package/deps/simdutf/include/simdutf/scalar/utf8.h +326 -0
  283. package/deps/simdutf/include/simdutf/scalar/utf8_to_latin1/utf8_to_latin1.h +225 -0
  284. package/deps/simdutf/include/simdutf/scalar/utf8_to_latin1/valid_utf8_to_latin1.h +87 -0
  285. package/deps/simdutf/include/simdutf/scalar/utf8_to_utf16/utf8_to_utf16.h +342 -0
  286. package/deps/simdutf/include/simdutf/scalar/utf8_to_utf16/valid_utf8_to_utf16.h +106 -0
  287. package/deps/simdutf/include/simdutf/scalar/utf8_to_utf32/utf8_to_utf32.h +299 -0
  288. package/deps/simdutf/include/simdutf/scalar/utf8_to_utf32/valid_utf8_to_utf32.h +83 -0
  289. package/deps/simdutf/include/simdutf/simdutf_version.h +26 -0
  290. package/deps/simdutf/include/simdutf.h +26 -0
  291. package/deps/simdutf/include/simdutf_c.h +342 -0
  292. package/deps/simdutf/riscv/Dockerfile +16 -0
  293. package/deps/simdutf/riscv/README.md +24 -0
  294. package/deps/simdutf/riscv/remove-docker-station +8 -0
  295. package/deps/simdutf/riscv/run-docker-station +31 -0
  296. package/deps/simdutf/scripts/.flake8 +2 -0
  297. package/deps/simdutf/scripts/Makefile +2 -0
  298. package/deps/simdutf/scripts/README_ADD_FUNCTION.md +49 -0
  299. package/deps/simdutf/scripts/add_function.py +330 -0
  300. package/deps/simdutf/scripts/amalgamation_tests.py +156 -0
  301. package/deps/simdutf/scripts/base64/Makefile +2 -0
  302. package/deps/simdutf/scripts/base64/README.md +2 -0
  303. package/deps/simdutf/scripts/base64/avx512.py +76 -0
  304. package/deps/simdutf/scripts/base64/neon_decode.py +143 -0
  305. package/deps/simdutf/scripts/base64/neon_generate_lut.py +101 -0
  306. package/deps/simdutf/scripts/base64/sse.py +252 -0
  307. package/deps/simdutf/scripts/base64/sseregular.py +160 -0
  308. package/deps/simdutf/scripts/base64/sseurl.py +283 -0
  309. package/deps/simdutf/scripts/base64/table.py +59 -0
  310. package/deps/simdutf/scripts/base64bench_print.py +145 -0
  311. package/deps/simdutf/scripts/benchmark-all.py +119 -0
  312. package/deps/simdutf/scripts/benchmark_print.py +324 -0
  313. package/deps/simdutf/scripts/check_feature_macros.py +156 -0
  314. package/deps/simdutf/scripts/check_typos.sh +13 -0
  315. package/deps/simdutf/scripts/clang_format.sh +35 -0
  316. package/deps/simdutf/scripts/clang_format_docker.sh +38 -0
  317. package/deps/simdutf/scripts/common.py +24 -0
  318. package/deps/simdutf/scripts/compilation_benchmark.py +55 -0
  319. package/deps/simdutf/scripts/compile_many_variations.sh +64 -0
  320. package/deps/simdutf/scripts/create_latex_table.py +62 -0
  321. package/deps/simdutf/scripts/docker/Dockerfile +14 -0
  322. package/deps/simdutf/scripts/docker/Makefile +9 -0
  323. package/deps/simdutf/scripts/docker/README.md +30 -0
  324. package/deps/simdutf/scripts/docker/llvm.gpg +0 -0
  325. package/deps/simdutf/scripts/ppc64_convert_utf16_to_utf8.py +155 -0
  326. package/deps/simdutf/scripts/prepare_doxygen.sh +21 -0
  327. package/deps/simdutf/scripts/release.py +197 -0
  328. package/deps/simdutf/scripts/shortinputplots.py +97 -0
  329. package/deps/simdutf/scripts/sse_convert_utf16_to_utf8.py +422 -0
  330. package/deps/simdutf/scripts/sse_convert_utf32_to_utf16.py +105 -0
  331. package/deps/simdutf/scripts/sse_utf8_utf16_decode.py +186 -0
  332. package/deps/simdutf/scripts/sse_validate_utf16le_proof.py +137 -0
  333. package/deps/simdutf/scripts/sse_validate_utf16le_testcases.py +129 -0
  334. package/deps/simdutf/scripts/table.py +207 -0
  335. package/deps/simdutf/scripts/tests/new.txt +33 -0
  336. package/deps/simdutf/scripts/tests/old.txt +33 -0
  337. package/deps/simdutf/scripts/tests/results.txt +272 -0
  338. package/deps/simdutf/simdutf.pc.in +11 -0
  339. package/deps/simdutf/singleheader/.flake8 +2 -0
  340. package/deps/simdutf/singleheader/CMakeLists.txt +64 -0
  341. package/deps/simdutf/singleheader/README-dev.md +81 -0
  342. package/deps/simdutf/singleheader/README.md +19 -0
  343. package/deps/simdutf/singleheader/amalgamate.py +513 -0
  344. package/deps/simdutf/singleheader/amalgamation_demo.c +59 -0
  345. package/deps/simdutf/singleheader/amalgamation_demo.cpp +54 -0
  346. package/deps/simdutf/singleheader/test-features.py +262 -0
  347. package/deps/simdutf/src/CMakeLists.txt +78 -0
  348. package/deps/simdutf/src/arm64/arm_base64.cpp +791 -0
  349. package/deps/simdutf/src/arm64/arm_convert_latin1_to_utf16.cpp +24 -0
  350. package/deps/simdutf/src/arm64/arm_convert_latin1_to_utf32.cpp +24 -0
  351. package/deps/simdutf/src/arm64/arm_convert_latin1_to_utf8.cpp +70 -0
  352. package/deps/simdutf/src/arm64/arm_convert_utf16_to_latin1.cpp +61 -0
  353. package/deps/simdutf/src/arm64/arm_convert_utf16_to_utf32.cpp +185 -0
  354. package/deps/simdutf/src/arm64/arm_convert_utf16_to_utf8.cpp +780 -0
  355. package/deps/simdutf/src/arm64/arm_convert_utf32_to_latin1.cpp +60 -0
  356. package/deps/simdutf/src/arm64/arm_convert_utf32_to_utf16.cpp +208 -0
  357. package/deps/simdutf/src/arm64/arm_convert_utf32_to_utf8.cpp +505 -0
  358. package/deps/simdutf/src/arm64/arm_convert_utf8_to_latin1.cpp +69 -0
  359. package/deps/simdutf/src/arm64/arm_convert_utf8_to_utf16.cpp +313 -0
  360. package/deps/simdutf/src/arm64/arm_convert_utf8_to_utf32.cpp +179 -0
  361. package/deps/simdutf/src/arm64/arm_find.cpp +199 -0
  362. package/deps/simdutf/src/arm64/arm_utf16fix.cpp +185 -0
  363. package/deps/simdutf/src/arm64/arm_validate_utf16.cpp +165 -0
  364. package/deps/simdutf/src/arm64/arm_validate_utf32le.cpp +65 -0
  365. package/deps/simdutf/src/arm64/implementation.cpp +1442 -0
  366. package/deps/simdutf/src/encoding_types.cpp +67 -0
  367. package/deps/simdutf/src/error.cpp +3 -0
  368. package/deps/simdutf/src/fallback/implementation.cpp +589 -0
  369. package/deps/simdutf/src/generic/ascii_validation.h +50 -0
  370. package/deps/simdutf/src/generic/base64.h +233 -0
  371. package/deps/simdutf/src/generic/base64lengths.h +63 -0
  372. package/deps/simdutf/src/generic/buf_block_reader.h +109 -0
  373. package/deps/simdutf/src/generic/find.h +75 -0
  374. package/deps/simdutf/src/generic/utf16/change_endianness.h +24 -0
  375. package/deps/simdutf/src/generic/utf16/count_code_points_bytemask.h +58 -0
  376. package/deps/simdutf/src/generic/utf16/to_well_formed.h +93 -0
  377. package/deps/simdutf/src/generic/utf16/utf32_length_from_utf16.h +15 -0
  378. package/deps/simdutf/src/generic/utf16/utf8_length_from_utf16.h +35 -0
  379. package/deps/simdutf/src/generic/utf16/utf8_length_from_utf16_bytemask.h +199 -0
  380. package/deps/simdutf/src/generic/utf16.h +73 -0
  381. package/deps/simdutf/src/generic/utf32.h +136 -0
  382. package/deps/simdutf/src/generic/utf8/utf16_length_from_utf8_bytemask.h +53 -0
  383. package/deps/simdutf/src/generic/utf8.h +92 -0
  384. package/deps/simdutf/src/generic/utf8_to_latin1/utf8_to_latin1.h +316 -0
  385. package/deps/simdutf/src/generic/utf8_to_latin1/valid_utf8_to_latin1.h +78 -0
  386. package/deps/simdutf/src/generic/utf8_to_utf16/utf8_to_utf16.h +332 -0
  387. package/deps/simdutf/src/generic/utf8_to_utf16/valid_utf8_to_utf16.h +74 -0
  388. package/deps/simdutf/src/generic/utf8_to_utf32/utf8_to_utf32.h +318 -0
  389. package/deps/simdutf/src/generic/utf8_to_utf32/valid_utf8_to_utf32.h +42 -0
  390. package/deps/simdutf/src/generic/utf8_validation/utf8_lookup4_algorithm.h +223 -0
  391. package/deps/simdutf/src/generic/utf8_validation/utf8_validator.h +84 -0
  392. package/deps/simdutf/src/generic/validate_utf16.h +164 -0
  393. package/deps/simdutf/src/generic/validate_utf32.h +99 -0
  394. package/deps/simdutf/src/haswell/avx2_base64.cpp +837 -0
  395. package/deps/simdutf/src/haswell/avx2_convert_latin1_to_utf16.cpp +28 -0
  396. package/deps/simdutf/src/haswell/avx2_convert_latin1_to_utf32.cpp +20 -0
  397. package/deps/simdutf/src/haswell/avx2_convert_latin1_to_utf8.cpp +83 -0
  398. package/deps/simdutf/src/haswell/avx2_convert_utf16_to_latin1.cpp +83 -0
  399. package/deps/simdutf/src/haswell/avx2_convert_utf16_to_utf32.cpp +210 -0
  400. package/deps/simdutf/src/haswell/avx2_convert_utf16_to_utf8.cpp +602 -0
  401. package/deps/simdutf/src/haswell/avx2_convert_utf32_to_latin1.cpp +116 -0
  402. package/deps/simdutf/src/haswell/avx2_convert_utf32_to_utf16.cpp +164 -0
  403. package/deps/simdutf/src/haswell/avx2_convert_utf32_to_utf8.cpp +569 -0
  404. package/deps/simdutf/src/haswell/avx2_convert_utf8_to_latin1.cpp +60 -0
  405. package/deps/simdutf/src/haswell/avx2_convert_utf8_to_utf16.cpp +195 -0
  406. package/deps/simdutf/src/haswell/avx2_convert_utf8_to_utf32.cpp +135 -0
  407. package/deps/simdutf/src/haswell/avx2_utf16fix.cpp +173 -0
  408. package/deps/simdutf/src/haswell/avx2_validate_utf16.cpp +17 -0
  409. package/deps/simdutf/src/haswell/implementation.cpp +1447 -0
  410. package/deps/simdutf/src/icelake/icelake_ascii_validation.inl.cpp +19 -0
  411. package/deps/simdutf/src/icelake/icelake_base64.inl.cpp +630 -0
  412. package/deps/simdutf/src/icelake/icelake_common.inl.cpp +37 -0
  413. package/deps/simdutf/src/icelake/icelake_convert_latin1_to_utf16.inl.cpp +36 -0
  414. package/deps/simdutf/src/icelake/icelake_convert_latin1_to_utf32.inl.cpp +23 -0
  415. package/deps/simdutf/src/icelake/icelake_convert_latin1_to_utf8.inl.cpp +107 -0
  416. package/deps/simdutf/src/icelake/icelake_convert_utf16_to_latin1.inl.cpp +103 -0
  417. package/deps/simdutf/src/icelake/icelake_convert_utf16_to_utf32.inl.cpp +136 -0
  418. package/deps/simdutf/src/icelake/icelake_convert_utf16_to_utf8.inl.cpp +206 -0
  419. package/deps/simdutf/src/icelake/icelake_convert_utf32_to_latin1.inl.cpp +74 -0
  420. package/deps/simdutf/src/icelake/icelake_convert_utf32_to_utf16.inl.cpp +338 -0
  421. package/deps/simdutf/src/icelake/icelake_convert_utf32_to_utf8.inl.cpp +574 -0
  422. package/deps/simdutf/src/icelake/icelake_convert_utf8_to_latin1.inl.cpp +104 -0
  423. package/deps/simdutf/src/icelake/icelake_convert_utf8_to_utf16.inl.cpp +75 -0
  424. package/deps/simdutf/src/icelake/icelake_convert_valid_utf8_to_latin1.inl.cpp +69 -0
  425. package/deps/simdutf/src/icelake/icelake_find.inl.cpp +146 -0
  426. package/deps/simdutf/src/icelake/icelake_from_utf8.inl.cpp +266 -0
  427. package/deps/simdutf/src/icelake/icelake_from_valid_utf8.inl.cpp +136 -0
  428. package/deps/simdutf/src/icelake/icelake_macros.inl.cpp +143 -0
  429. package/deps/simdutf/src/icelake/icelake_utf16fix.cpp +138 -0
  430. package/deps/simdutf/src/icelake/icelake_utf32_validation.inl.cpp +63 -0
  431. package/deps/simdutf/src/icelake/icelake_utf8_common.inl.cpp +753 -0
  432. package/deps/simdutf/src/icelake/icelake_utf8_length_from_utf16.inl.cpp +269 -0
  433. package/deps/simdutf/src/icelake/icelake_utf8_validation.inl.cpp +116 -0
  434. package/deps/simdutf/src/icelake/implementation.cpp +1903 -0
  435. package/deps/simdutf/src/implementation.cpp +2526 -0
  436. package/deps/simdutf/src/lasx/implementation.cpp +1531 -0
  437. package/deps/simdutf/src/lasx/lasx_base64.cpp +695 -0
  438. package/deps/simdutf/src/lasx/lasx_convert_latin1_to_utf16.cpp +76 -0
  439. package/deps/simdutf/src/lasx/lasx_convert_latin1_to_utf32.cpp +55 -0
  440. package/deps/simdutf/src/lasx/lasx_convert_latin1_to_utf8.cpp +65 -0
  441. package/deps/simdutf/src/lasx/lasx_convert_utf16_to_latin1.cpp +64 -0
  442. package/deps/simdutf/src/lasx/lasx_convert_utf16_to_utf32.cpp +183 -0
  443. package/deps/simdutf/src/lasx/lasx_convert_utf16_to_utf8.cpp +550 -0
  444. package/deps/simdutf/src/lasx/lasx_convert_utf32_to_latin1.cpp +73 -0
  445. package/deps/simdutf/src/lasx/lasx_convert_utf32_to_utf16.cpp +218 -0
  446. package/deps/simdutf/src/lasx/lasx_convert_utf32_to_utf8.cpp +589 -0
  447. package/deps/simdutf/src/lasx/lasx_convert_utf8_to_latin1.cpp +72 -0
  448. package/deps/simdutf/src/lasx/lasx_convert_utf8_to_utf16.cpp +296 -0
  449. package/deps/simdutf/src/lasx/lasx_convert_utf8_to_utf32.cpp +190 -0
  450. package/deps/simdutf/src/lasx/lasx_find.cpp +64 -0
  451. package/deps/simdutf/src/lasx/lasx_validate_utf16.cpp +13 -0
  452. package/deps/simdutf/src/lasx/lasx_validate_utf32le.cpp +84 -0
  453. package/deps/simdutf/src/lsx/implementation.cpp +1417 -0
  454. package/deps/simdutf/src/lsx/lsx_base64.cpp +675 -0
  455. package/deps/simdutf/src/lsx/lsx_convert_latin1_to_utf16.cpp +39 -0
  456. package/deps/simdutf/src/lsx/lsx_convert_latin1_to_utf32.cpp +27 -0
  457. package/deps/simdutf/src/lsx/lsx_convert_latin1_to_utf8.cpp +56 -0
  458. package/deps/simdutf/src/lsx/lsx_convert_utf16_to_latin1.cpp +64 -0
  459. package/deps/simdutf/src/lsx/lsx_convert_utf16_to_utf32.cpp +133 -0
  460. package/deps/simdutf/src/lsx/lsx_convert_utf16_to_utf8.cpp +518 -0
  461. package/deps/simdutf/src/lsx/lsx_convert_utf32_to_latin1.cpp +66 -0
  462. package/deps/simdutf/src/lsx/lsx_convert_utf32_to_utf16.cpp +155 -0
  463. package/deps/simdutf/src/lsx/lsx_convert_utf32_to_utf8.cpp +459 -0
  464. package/deps/simdutf/src/lsx/lsx_convert_utf8_to_latin1.cpp +75 -0
  465. package/deps/simdutf/src/lsx/lsx_convert_utf8_to_utf16.cpp +291 -0
  466. package/deps/simdutf/src/lsx/lsx_convert_utf8_to_utf32.cpp +179 -0
  467. package/deps/simdutf/src/lsx/lsx_find.cpp +60 -0
  468. package/deps/simdutf/src/lsx/lsx_validate_utf16.cpp +13 -0
  469. package/deps/simdutf/src/lsx/lsx_validate_utf32le.cpp +68 -0
  470. package/deps/simdutf/src/ppc64/implementation.cpp +992 -0
  471. package/deps/simdutf/src/ppc64/ppc64_base64.cpp +480 -0
  472. package/deps/simdutf/src/ppc64/ppc64_base64_internal_tests.cpp +401 -0
  473. package/deps/simdutf/src/ppc64/ppc64_convert_latin1_to_utf16.cpp +12 -0
  474. package/deps/simdutf/src/ppc64/ppc64_convert_latin1_to_utf32.cpp +12 -0
  475. package/deps/simdutf/src/ppc64/ppc64_convert_latin1_to_utf8.cpp +149 -0
  476. package/deps/simdutf/src/ppc64/ppc64_convert_utf16_to_latin1.cpp +67 -0
  477. package/deps/simdutf/src/ppc64/ppc64_convert_utf16_to_utf32.cpp +87 -0
  478. package/deps/simdutf/src/ppc64/ppc64_convert_utf16_to_utf8.cpp +296 -0
  479. package/deps/simdutf/src/ppc64/ppc64_convert_utf32_to_latin1.cpp +57 -0
  480. package/deps/simdutf/src/ppc64/ppc64_convert_utf32_to_utf16.cpp +117 -0
  481. package/deps/simdutf/src/ppc64/ppc64_convert_utf32_to_utf8.cpp +166 -0
  482. package/deps/simdutf/src/ppc64/ppc64_convert_utf8_to_latin1.cpp +69 -0
  483. package/deps/simdutf/src/ppc64/ppc64_convert_utf8_to_utf16.cpp +211 -0
  484. package/deps/simdutf/src/ppc64/ppc64_convert_utf8_to_utf32.cpp +153 -0
  485. package/deps/simdutf/src/ppc64/ppc64_utf16_to_utf8_tables.h +1011 -0
  486. package/deps/simdutf/src/ppc64/ppc64_utf8_length_from_latin1.cpp +37 -0
  487. package/deps/simdutf/src/ppc64/ppc64_validate_utf16.cpp +19 -0
  488. package/deps/simdutf/src/ppc64/templates.cpp +91 -0
  489. package/deps/simdutf/src/rvv/implementation.cpp +138 -0
  490. package/deps/simdutf/src/rvv/rvv_find.cpp +27 -0
  491. package/deps/simdutf/src/rvv/rvv_helpers.inl.cpp +23 -0
  492. package/deps/simdutf/src/rvv/rvv_latin1_to.inl.cpp +71 -0
  493. package/deps/simdutf/src/rvv/rvv_length_from.inl.cpp +164 -0
  494. package/deps/simdutf/src/rvv/rvv_utf16_to.inl.cpp +399 -0
  495. package/deps/simdutf/src/rvv/rvv_utf16fix.cpp +110 -0
  496. package/deps/simdutf/src/rvv/rvv_utf32_to.inl.cpp +307 -0
  497. package/deps/simdutf/src/rvv/rvv_utf8_to.inl.cpp +435 -0
  498. package/deps/simdutf/src/rvv/rvv_validate.inl.cpp +275 -0
  499. package/deps/simdutf/src/simdutf/arm64/begin.h +2 -0
  500. package/deps/simdutf/src/simdutf/arm64/bitmanipulation.h +34 -0
  501. package/deps/simdutf/src/simdutf/arm64/end.h +2 -0
  502. package/deps/simdutf/src/simdutf/arm64/implementation.h +307 -0
  503. package/deps/simdutf/src/simdutf/arm64/intrinsics.h +10 -0
  504. package/deps/simdutf/src/simdutf/arm64/simd.h +547 -0
  505. package/deps/simdutf/src/simdutf/arm64/simd16-inl.h +403 -0
  506. package/deps/simdutf/src/simdutf/arm64/simd32-inl.h +129 -0
  507. package/deps/simdutf/src/simdutf/arm64/simd64-inl.h +28 -0
  508. package/deps/simdutf/src/simdutf/arm64.h +43 -0
  509. package/deps/simdutf/src/simdutf/fallback/begin.h +1 -0
  510. package/deps/simdutf/src/simdutf/fallback/bitmanipulation.h +13 -0
  511. package/deps/simdutf/src/simdutf/fallback/end.h +1 -0
  512. package/deps/simdutf/src/simdutf/fallback/implementation.h +331 -0
  513. package/deps/simdutf/src/simdutf/fallback.h +42 -0
  514. package/deps/simdutf/src/simdutf/haswell/begin.h +15 -0
  515. package/deps/simdutf/src/simdutf/haswell/bitmanipulation.h +35 -0
  516. package/deps/simdutf/src/simdutf/haswell/end.h +13 -0
  517. package/deps/simdutf/src/simdutf/haswell/implementation.h +338 -0
  518. package/deps/simdutf/src/simdutf/haswell/intrinsics.h +67 -0
  519. package/deps/simdutf/src/simdutf/haswell/simd.h +363 -0
  520. package/deps/simdutf/src/simdutf/haswell/simd16-inl.h +261 -0
  521. package/deps/simdutf/src/simdutf/haswell/simd32-inl.h +111 -0
  522. package/deps/simdutf/src/simdutf/haswell/simd64-inl.h +34 -0
  523. package/deps/simdutf/src/simdutf/haswell.h +63 -0
  524. package/deps/simdutf/src/simdutf/icelake/begin.h +14 -0
  525. package/deps/simdutf/src/simdutf/icelake/bitmanipulation.h +44 -0
  526. package/deps/simdutf/src/simdutf/icelake/end.h +12 -0
  527. package/deps/simdutf/src/simdutf/icelake/implementation.h +346 -0
  528. package/deps/simdutf/src/simdutf/icelake/intrinsics.h +138 -0
  529. package/deps/simdutf/src/simdutf/icelake/simd.h +17 -0
  530. package/deps/simdutf/src/simdutf/icelake/simd16-inl.h +90 -0
  531. package/deps/simdutf/src/simdutf/icelake/simd32-inl.h +47 -0
  532. package/deps/simdutf/src/simdutf/icelake.h +81 -0
  533. package/deps/simdutf/src/simdutf/lasx/begin.h +8 -0
  534. package/deps/simdutf/src/simdutf/lasx/bitmanipulation.h +25 -0
  535. package/deps/simdutf/src/simdutf/lasx/end.h +8 -0
  536. package/deps/simdutf/src/simdutf/lasx/implementation.h +310 -0
  537. package/deps/simdutf/src/simdutf/lasx/intrinsics.h +319 -0
  538. package/deps/simdutf/src/simdutf/lasx/simd.h +551 -0
  539. package/deps/simdutf/src/simdutf/lasx/simd16-inl.h +234 -0
  540. package/deps/simdutf/src/simdutf/lasx/simd32-inl.h +74 -0
  541. package/deps/simdutf/src/simdutf/lasx/simd64-inl.h +52 -0
  542. package/deps/simdutf/src/simdutf/lasx.h +49 -0
  543. package/deps/simdutf/src/simdutf/lsx/begin.h +2 -0
  544. package/deps/simdutf/src/simdutf/lsx/bitmanipulation.h +25 -0
  545. package/deps/simdutf/src/simdutf/lsx/end.h +2 -0
  546. package/deps/simdutf/src/simdutf/lsx/implementation.h +309 -0
  547. package/deps/simdutf/src/simdutf/lsx/intrinsics.h +196 -0
  548. package/deps/simdutf/src/simdutf/lsx/simd.h +421 -0
  549. package/deps/simdutf/src/simdutf/lsx/simd16-inl.h +242 -0
  550. package/deps/simdutf/src/simdutf/lsx/simd32-inl.h +69 -0
  551. package/deps/simdutf/src/simdutf/lsx/simd64-inl.h +50 -0
  552. package/deps/simdutf/src/simdutf/lsx.h +52 -0
  553. package/deps/simdutf/src/simdutf/ppc64/begin.h +1 -0
  554. package/deps/simdutf/src/simdutf/ppc64/bitmanipulation.h +29 -0
  555. package/deps/simdutf/src/simdutf/ppc64/end.h +1 -0
  556. package/deps/simdutf/src/simdutf/ppc64/implementation.h +348 -0
  557. package/deps/simdutf/src/simdutf/ppc64/intrinsics.h +19 -0
  558. package/deps/simdutf/src/simdutf/ppc64/simd.h +177 -0
  559. package/deps/simdutf/src/simdutf/ppc64/simd16-inl.h +327 -0
  560. package/deps/simdutf/src/simdutf/ppc64/simd32-inl.h +247 -0
  561. package/deps/simdutf/src/simdutf/ppc64/simd8-inl.h +618 -0
  562. package/deps/simdutf/src/simdutf/ppc64.h +40 -0
  563. package/deps/simdutf/src/simdutf/rvv/begin.h +7 -0
  564. package/deps/simdutf/src/simdutf/rvv/end.h +7 -0
  565. package/deps/simdutf/src/simdutf/rvv/implementation.h +321 -0
  566. package/deps/simdutf/src/simdutf/rvv/intrinsics.h +131 -0
  567. package/deps/simdutf/src/simdutf/rvv.h +41 -0
  568. package/deps/simdutf/src/simdutf/westmere/begin.h +8 -0
  569. package/deps/simdutf/src/simdutf/westmere/bitmanipulation.h +37 -0
  570. package/deps/simdutf/src/simdutf/westmere/end.h +8 -0
  571. package/deps/simdutf/src/simdutf/westmere/implementation.h +338 -0
  572. package/deps/simdutf/src/simdutf/westmere/intrinsics.h +38 -0
  573. package/deps/simdutf/src/simdutf/westmere/simd.h +379 -0
  574. package/deps/simdutf/src/simdutf/westmere/simd16-inl.h +242 -0
  575. package/deps/simdutf/src/simdutf/westmere/simd32-inl.h +151 -0
  576. package/deps/simdutf/src/simdutf/westmere/simd64-inl.h +33 -0
  577. package/deps/simdutf/src/simdutf/westmere.h +59 -0
  578. package/deps/simdutf/src/simdutf.cpp +152 -0
  579. package/deps/simdutf/src/simdutf_c.cpp +525 -0
  580. package/deps/simdutf/src/tables/utf16_to_utf8_tables.h +768 -0
  581. package/deps/simdutf/src/tables/utf32_to_utf16_tables.h +53 -0
  582. package/deps/simdutf/src/tables/utf8_to_utf16_tables.h +826 -0
  583. package/deps/simdutf/src/westmere/implementation.cpp +1479 -0
  584. package/deps/simdutf/src/westmere/internal/loader.cpp +7 -0
  585. package/deps/simdutf/src/westmere/internal/write_v_u16_11bits_to_utf8.cpp +66 -0
  586. package/deps/simdutf/src/westmere/sse_base64.cpp +672 -0
  587. package/deps/simdutf/src/westmere/sse_convert_latin1_to_utf16.cpp +21 -0
  588. package/deps/simdutf/src/westmere/sse_convert_latin1_to_utf32.cpp +31 -0
  589. package/deps/simdutf/src/westmere/sse_convert_latin1_to_utf8.cpp +71 -0
  590. package/deps/simdutf/src/westmere/sse_convert_utf16_to_latin1.cpp +70 -0
  591. package/deps/simdutf/src/westmere/sse_convert_utf16_to_utf32.cpp +206 -0
  592. package/deps/simdutf/src/westmere/sse_convert_utf16_to_utf8.cpp +504 -0
  593. package/deps/simdutf/src/westmere/sse_convert_utf32_to_latin1.cpp +82 -0
  594. package/deps/simdutf/src/westmere/sse_convert_utf32_to_utf16.cpp +209 -0
  595. package/deps/simdutf/src/westmere/sse_convert_utf32_to_utf8.cpp +589 -0
  596. package/deps/simdutf/src/westmere/sse_convert_utf8_to_latin1.cpp +58 -0
  597. package/deps/simdutf/src/westmere/sse_convert_utf8_to_utf16.cpp +197 -0
  598. package/deps/simdutf/src/westmere/sse_convert_utf8_to_utf32.cpp +141 -0
  599. package/deps/simdutf/src/westmere/sse_utf16fix.cpp +82 -0
  600. package/deps/simdutf/src/westmere/sse_validate_utf16.cpp +17 -0
  601. package/deps/simdutf/tests/CMakeLists.txt +483 -0
  602. package/deps/simdutf/tests/atomic_base64_tests.cpp +2845 -0
  603. package/deps/simdutf/tests/base64_tests.cpp +3617 -0
  604. package/deps/simdutf/tests/basic_fuzzer.cpp +805 -0
  605. package/deps/simdutf/tests/bele_tests.cpp +182 -0
  606. package/deps/simdutf/tests/constexpr_base64_tests.cpp +387 -0
  607. package/deps/simdutf/tests/convert_latin1_to_utf16be_tests.cpp +52 -0
  608. package/deps/simdutf/tests/convert_latin1_to_utf16le_tests.cpp +80 -0
  609. package/deps/simdutf/tests/convert_latin1_to_utf32_tests.cpp +66 -0
  610. package/deps/simdutf/tests/convert_latin1_to_utf8_tests.cpp +120 -0
  611. package/deps/simdutf/tests/convert_utf16_to_utf8_safe_tests.cpp +203 -0
  612. package/deps/simdutf/tests/convert_utf16_to_utf8_with_replacement_tests.cpp +276 -0
  613. package/deps/simdutf/tests/convert_utf16be_to_latin1_tests.cpp +109 -0
  614. package/deps/simdutf/tests/convert_utf16be_to_latin1_tests_with_errors.cpp +136 -0
  615. package/deps/simdutf/tests/convert_utf16be_to_utf32_tests.cpp +193 -0
  616. package/deps/simdutf/tests/convert_utf16be_to_utf32_with_errors_tests.cpp +381 -0
  617. package/deps/simdutf/tests/convert_utf16be_to_utf8_tests.cpp +259 -0
  618. package/deps/simdutf/tests/convert_utf16be_to_utf8_with_errors_tests.cpp +266 -0
  619. package/deps/simdutf/tests/convert_utf16le_to_latin1_tests.cpp +148 -0
  620. package/deps/simdutf/tests/convert_utf16le_to_latin1_tests_with_errors.cpp +176 -0
  621. package/deps/simdutf/tests/convert_utf16le_to_utf32_tests.cpp +213 -0
  622. package/deps/simdutf/tests/convert_utf16le_to_utf32_with_errors_tests.cpp +318 -0
  623. package/deps/simdutf/tests/convert_utf16le_to_utf8_tests.cpp +343 -0
  624. package/deps/simdutf/tests/convert_utf16le_to_utf8_with_errors_tests.cpp +271 -0
  625. package/deps/simdutf/tests/convert_utf32_to_latin1_tests.cpp +111 -0
  626. package/deps/simdutf/tests/convert_utf32_to_latin1_with_errors_tests.cpp +96 -0
  627. package/deps/simdutf/tests/convert_utf32_to_utf16be_tests.cpp +148 -0
  628. package/deps/simdutf/tests/convert_utf32_to_utf16be_with_errors_tests.cpp +192 -0
  629. package/deps/simdutf/tests/convert_utf32_to_utf16le_tests.cpp +166 -0
  630. package/deps/simdutf/tests/convert_utf32_to_utf16le_with_errors_tests.cpp +215 -0
  631. package/deps/simdutf/tests/convert_utf32_to_utf8_tests.cpp +181 -0
  632. package/deps/simdutf/tests/convert_utf32_to_utf8_with_errors_tests.cpp +261 -0
  633. package/deps/simdutf/tests/convert_utf8_to_latin1_tests.cpp +516 -0
  634. package/deps/simdutf/tests/convert_utf8_to_latin1_with_errors_tests.cpp +579 -0
  635. package/deps/simdutf/tests/convert_utf8_to_utf16be_tests.cpp +412 -0
  636. package/deps/simdutf/tests/convert_utf8_to_utf16be_with_errors_tests.cpp +480 -0
  637. package/deps/simdutf/tests/convert_utf8_to_utf16le_tests.cpp +671 -0
  638. package/deps/simdutf/tests/convert_utf8_to_utf16le_with_errors_tests.cpp +455 -0
  639. package/deps/simdutf/tests/convert_utf8_to_utf32_tests.cpp +1204 -0
  640. package/deps/simdutf/tests/convert_utf8_to_utf32_with_errors_tests.cpp +337 -0
  641. package/deps/simdutf/tests/convert_valid_utf16be_to_latin1_tests.cpp +37 -0
  642. package/deps/simdutf/tests/convert_valid_utf16be_to_utf32_tests.cpp +97 -0
  643. package/deps/simdutf/tests/convert_valid_utf16be_to_utf8_tests.cpp +126 -0
  644. package/deps/simdutf/tests/convert_valid_utf16le_to_latin1_tests.cpp +71 -0
  645. package/deps/simdutf/tests/convert_valid_utf16le_to_utf32_tests.cpp +122 -0
  646. package/deps/simdutf/tests/convert_valid_utf16le_to_utf8_tests.cpp +244 -0
  647. package/deps/simdutf/tests/convert_valid_utf32_to_latin1_tests.cpp +49 -0
  648. package/deps/simdutf/tests/convert_valid_utf32_to_utf16be_tests.cpp +92 -0
  649. package/deps/simdutf/tests/convert_valid_utf32_to_utf16le_tests.cpp +114 -0
  650. package/deps/simdutf/tests/convert_valid_utf32_to_utf8_tests.cpp +109 -0
  651. package/deps/simdutf/tests/convert_valid_utf8_to_latin1_tests.cpp +84 -0
  652. package/deps/simdutf/tests/convert_valid_utf8_to_utf16be_tests.cpp +124 -0
  653. package/deps/simdutf/tests/convert_valid_utf8_to_utf16le_tests.cpp +221 -0
  654. package/deps/simdutf/tests/convert_valid_utf8_to_utf32_tests.cpp +155 -0
  655. package/deps/simdutf/tests/count_utf16be.cpp +64 -0
  656. package/deps/simdutf/tests/count_utf16le.cpp +61 -0
  657. package/deps/simdutf/tests/count_utf8.cpp +87 -0
  658. package/deps/simdutf/tests/detect_encodings_tests.cpp +312 -0
  659. package/deps/simdutf/tests/embed/valid_utf8.txt +1 -0
  660. package/deps/simdutf/tests/embed_tests.cpp +22 -0
  661. package/deps/simdutf/tests/find_tests.cpp +77 -0
  662. package/deps/simdutf/tests/fixed_string_tests.cpp +153 -0
  663. package/deps/simdutf/tests/helpers/CMakeLists.txt +25 -0
  664. package/deps/simdutf/tests/helpers/compiletime_conversions.h +222 -0
  665. package/deps/simdutf/tests/helpers/fixed_string.h +267 -0
  666. package/deps/simdutf/tests/helpers/random_int.cpp +30 -0
  667. package/deps/simdutf/tests/helpers/random_int.h +39 -0
  668. package/deps/simdutf/tests/helpers/random_utf16.cpp +123 -0
  669. package/deps/simdutf/tests/helpers/random_utf16.h +52 -0
  670. package/deps/simdutf/tests/helpers/random_utf32.cpp +41 -0
  671. package/deps/simdutf/tests/helpers/random_utf32.h +40 -0
  672. package/deps/simdutf/tests/helpers/random_utf8.cpp +93 -0
  673. package/deps/simdutf/tests/helpers/random_utf8.h +36 -0
  674. package/deps/simdutf/tests/helpers/test.cpp +231 -0
  675. package/deps/simdutf/tests/helpers/test.h +193 -0
  676. package/deps/simdutf/tests/helpers/transcode_test_base.cpp +1257 -0
  677. package/deps/simdutf/tests/helpers/transcode_test_base.h +683 -0
  678. package/deps/simdutf/tests/helpers/utf16.h +27 -0
  679. package/deps/simdutf/tests/installation_tests/find/CMakeLists.txt +43 -0
  680. package/deps/simdutf/tests/installation_tests/from_fetch/CMakeLists.txt +47 -0
  681. package/deps/simdutf/tests/internal_tests.cpp +27 -0
  682. package/deps/simdutf/tests/null_safety_tests.cpp +94 -0
  683. package/deps/simdutf/tests/random_fuzzer.cpp +779 -0
  684. package/deps/simdutf/tests/readme_tests.cpp +274 -0
  685. package/deps/simdutf/tests/reference/CMakeLists.txt +23 -0
  686. package/deps/simdutf/tests/reference/decode_utf16.h +81 -0
  687. package/deps/simdutf/tests/reference/decode_utf32.h +47 -0
  688. package/deps/simdutf/tests/reference/encode_latin1.cpp +1 -0
  689. package/deps/simdutf/tests/reference/encode_latin1.h +32 -0
  690. package/deps/simdutf/tests/reference/encode_utf16.cpp +49 -0
  691. package/deps/simdutf/tests/reference/encode_utf16.h +20 -0
  692. package/deps/simdutf/tests/reference/encode_utf32.cpp +1 -0
  693. package/deps/simdutf/tests/reference/encode_utf32.h +36 -0
  694. package/deps/simdutf/tests/reference/encode_utf8.cpp +1 -0
  695. package/deps/simdutf/tests/reference/encode_utf8.h +40 -0
  696. package/deps/simdutf/tests/reference/validate_utf16.cpp +60 -0
  697. package/deps/simdutf/tests/reference/validate_utf16.h +14 -0
  698. package/deps/simdutf/tests/reference/validate_utf16_to_latin1.cpp +35 -0
  699. package/deps/simdutf/tests/reference/validate_utf16_to_latin1.h +13 -0
  700. package/deps/simdutf/tests/reference/validate_utf32.cpp +27 -0
  701. package/deps/simdutf/tests/reference/validate_utf32.h +12 -0
  702. package/deps/simdutf/tests/reference/validate_utf32_to_latin1.cpp +27 -0
  703. package/deps/simdutf/tests/reference/validate_utf32_to_latin1.h +12 -0
  704. package/deps/simdutf/tests/reference/validate_utf8.cpp +82 -0
  705. package/deps/simdutf/tests/reference/validate_utf8.h +11 -0
  706. package/deps/simdutf/tests/reference/validate_utf8_to_latin1.cpp +43 -0
  707. package/deps/simdutf/tests/reference/validate_utf8_to_latin1.h +12 -0
  708. package/deps/simdutf/tests/select_implementation.cpp +43 -0
  709. package/deps/simdutf/tests/simdutf_c_tests.cpp +244 -0
  710. package/deps/simdutf/tests/span_tests.cpp +401 -0
  711. package/deps/simdutf/tests/special_tests.cpp +559 -0
  712. package/deps/simdutf/tests/straight_c_test.c +187 -0
  713. package/deps/simdutf/tests/text_encoding_tests.cpp +77 -0
  714. package/deps/simdutf/tests/to_well_formed_utf16_tests.cpp +377 -0
  715. package/deps/simdutf/tests/utf8_length_from_utf16_tests.cpp +202 -0
  716. package/deps/simdutf/tests/validate_ascii_basic_tests.cpp +165 -0
  717. package/deps/simdutf/tests/validate_ascii_with_errors_tests.cpp +77 -0
  718. package/deps/simdutf/tests/validate_utf16be_basic_tests.cpp +175 -0
  719. package/deps/simdutf/tests/validate_utf16be_with_errors_tests.cpp +188 -0
  720. package/deps/simdutf/tests/validate_utf16le_basic_tests.cpp +268 -0
  721. package/deps/simdutf/tests/validate_utf16le_with_errors_tests.cpp +274 -0
  722. package/deps/simdutf/tests/validate_utf32_basic_tests.cpp +92 -0
  723. package/deps/simdutf/tests/validate_utf32_with_errors_tests.cpp +114 -0
  724. package/deps/simdutf/tests/validate_utf8_basic_tests.cpp +178 -0
  725. package/deps/simdutf/tests/validate_utf8_brute_force_tests.cpp +88 -0
  726. package/deps/simdutf/tests/validate_utf8_puzzler_tests.cpp +33 -0
  727. package/deps/simdutf/tests/validate_utf8_with_errors_tests.cpp +228 -0
  728. package/deps/simdutf/tools/CMakeLists.txt +85 -0
  729. package/deps/simdutf/tools/fastbase64.cpp +250 -0
  730. package/deps/simdutf/tools/sutf.cpp +556 -0
  731. package/deps/simdutf/tools/sutf.h +40 -0
  732. package/lib/commonjs/blake3.js +2 -1
  733. package/lib/commonjs/blake3.js.map +1 -1
  734. package/lib/commonjs/diffie-hellman.js +5 -4
  735. package/lib/commonjs/diffie-hellman.js.map +1 -1
  736. package/lib/commonjs/ecdh.js +5 -4
  737. package/lib/commonjs/ecdh.js.map +1 -1
  738. package/lib/module/blake3.js +2 -1
  739. package/lib/module/blake3.js.map +1 -1
  740. package/lib/module/diffie-hellman.js +5 -4
  741. package/lib/module/diffie-hellman.js.map +1 -1
  742. package/lib/module/ecdh.js +5 -4
  743. package/lib/module/ecdh.js.map +1 -1
  744. package/lib/tsconfig.tsbuildinfo +1 -1
  745. package/lib/typescript/blake3.d.ts.map +1 -1
  746. package/lib/typescript/diffie-hellman.d.ts.map +1 -1
  747. package/lib/typescript/ecdh.d.ts.map +1 -1
  748. package/package.json +2 -2
  749. package/src/blake3.ts +2 -1
  750. package/src/diffie-hellman.ts +5 -7
  751. package/src/ecdh.ts +5 -8
@@ -0,0 +1,911 @@
1
+ #ifndef SIMDUTF_BASE64_H
2
+ #define SIMDUTF_BASE64_H
3
+
4
+ #include <algorithm>
5
+ #include <cstddef>
6
+ #include <cstdint>
7
+ #include <cstring>
8
+ #include <iostream>
9
+
10
+ namespace simdutf {
11
+ namespace scalar {
12
+ namespace {
13
+ namespace base64 {
14
+
15
+ // This function is not expected to be fast. Do not use in long loops.
16
+ // In most instances you should be using is_ignorable.
17
+ template <class char_type> bool is_ascii_white_space(char_type c) {
18
+ return c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == '\f';
19
+ }
20
+
21
+ template <class char_type> simdutf_constexpr23 bool is_eight_byte(char_type c) {
22
+ if simdutf_constexpr (sizeof(char_type) == 1) {
23
+ return true;
24
+ }
25
+ return uint8_t(c) == c;
26
+ }
27
+
28
+ template <class char_type>
29
+ simdutf_constexpr23 bool is_ignorable(char_type c,
30
+ simdutf::base64_options options) {
31
+ const uint8_t *to_base64 =
32
+ (options & base64_default_or_url)
33
+ ? tables::base64::to_base64_default_or_url_value
34
+ : ((options & base64_url) ? tables::base64::to_base64_url_value
35
+ : tables::base64::to_base64_value);
36
+ const bool ignore_garbage =
37
+ (options == base64_options::base64_url_accept_garbage) ||
38
+ (options == base64_options::base64_default_accept_garbage) ||
39
+ (options == base64_options::base64_default_or_url_accept_garbage);
40
+ uint8_t code = to_base64[uint8_t(c)];
41
+ if (is_eight_byte(c) && code <= 63) {
42
+ return false;
43
+ }
44
+ if (is_eight_byte(c) && code == 64) {
45
+ return true;
46
+ }
47
+ return ignore_garbage;
48
+ }
49
+ template <class char_type>
50
+ simdutf_constexpr23 bool is_base64(char_type c,
51
+ simdutf::base64_options options) {
52
+ const uint8_t *to_base64 =
53
+ (options & base64_default_or_url)
54
+ ? tables::base64::to_base64_default_or_url_value
55
+ : ((options & base64_url) ? tables::base64::to_base64_url_value
56
+ : tables::base64::to_base64_value);
57
+ uint8_t code = to_base64[uint8_t(c)];
58
+ if (is_eight_byte(c) && code <= 63) {
59
+ return true;
60
+ }
61
+ return false;
62
+ }
63
+
64
+ template <class char_type>
65
+ simdutf_constexpr23 bool is_base64_or_padding(char_type c,
66
+ simdutf::base64_options options) {
67
+ const uint8_t *to_base64 =
68
+ (options & base64_default_or_url)
69
+ ? tables::base64::to_base64_default_or_url_value
70
+ : ((options & base64_url) ? tables::base64::to_base64_url_value
71
+ : tables::base64::to_base64_value);
72
+ if (c == '=') {
73
+ return true;
74
+ }
75
+ uint8_t code = to_base64[uint8_t(c)];
76
+ if (is_eight_byte(c) && code <= 63) {
77
+ return true;
78
+ }
79
+ return false;
80
+ }
81
+
82
+ template <class char_type>
83
+ bool is_ignorable_or_padding(char_type c, simdutf::base64_options options) {
84
+ return is_ignorable(c, options) || c == '=';
85
+ }
86
+
87
+ struct reduced_input {
88
+ size_t equalsigns; // number of padding characters '=', typically 0, 1, 2.
89
+ size_t equallocation; // location of the first padding character if any
90
+ size_t srclen; // length of the input buffer before padding
91
+ size_t full_input_length; // length of the input buffer with padding but
92
+ // without ignorable characters
93
+ };
94
+
95
+ // find the end of the base64 input buffer
96
+ // It returns the number of padding characters, the location of the first
97
+ // padding character if any, the length of the input buffer before padding
98
+ // and the length of the input buffer with padding. The input buffer is not
99
+ // modified. The function assumes that there are at most two padding characters.
100
+ template <class char_type>
101
+ simdutf_constexpr23 reduced_input find_end(const char_type *src, size_t srclen,
102
+ simdutf::base64_options options) {
103
+ const uint8_t *to_base64 =
104
+ (options & base64_default_or_url)
105
+ ? tables::base64::to_base64_default_or_url_value
106
+ : ((options & base64_url) ? tables::base64::to_base64_url_value
107
+ : tables::base64::to_base64_value);
108
+ const bool ignore_garbage =
109
+ (options == base64_options::base64_url_accept_garbage) ||
110
+ (options == base64_options::base64_default_accept_garbage) ||
111
+ (options == base64_options::base64_default_or_url_accept_garbage);
112
+
113
+ size_t equalsigns = 0;
114
+ // We intentionally include trailing spaces in the full input length.
115
+ // See https://github.com/simdutf/simdutf/issues/824
116
+ size_t full_input_length = srclen;
117
+ // skip trailing spaces
118
+ while (!ignore_garbage && srclen > 0 &&
119
+ scalar::base64::is_eight_byte(src[srclen - 1]) &&
120
+ to_base64[uint8_t(src[srclen - 1])] == 64) {
121
+ srclen--;
122
+ }
123
+ size_t equallocation =
124
+ srclen; // location of the first padding character if any
125
+ if (ignore_garbage) {
126
+ // Technically, we don't need to find the first padding character, we can
127
+ // just change our algorithms, but it adds substantial complexity.
128
+ auto it = simdutf::find(src, src + srclen, '=');
129
+ if (it != src + srclen) {
130
+ equallocation = it - src;
131
+ equalsigns = 1;
132
+ srclen = equallocation;
133
+ full_input_length = equallocation + 1;
134
+ }
135
+ return {equalsigns, equallocation, srclen, full_input_length};
136
+ }
137
+ if (!ignore_garbage && srclen > 0 && src[srclen - 1] == '=') {
138
+ // This is the last '=' sign.
139
+ equallocation = srclen - 1;
140
+ srclen--;
141
+ equalsigns = 1;
142
+ // skip trailing spaces
143
+ while (srclen > 0 && scalar::base64::is_eight_byte(src[srclen - 1]) &&
144
+ to_base64[uint8_t(src[srclen - 1])] == 64) {
145
+ srclen--;
146
+ }
147
+ if (srclen > 0 && src[srclen - 1] == '=') {
148
+ // This is the second '=' sign.
149
+ equallocation = srclen - 1;
150
+ srclen--;
151
+ equalsigns = 2;
152
+ }
153
+ }
154
+ return {equalsigns, equallocation, srclen, full_input_length};
155
+ }
156
+
157
+ // Returns true upon success. The destination buffer must be large enough.
158
+ // This functions assumes that the padding (=) has been removed.
159
+ // if check_capacity is true, it will check that the destination buffer is
160
+ // large enough. If it is not, it will return OUTPUT_BUFFER_TOO_SMALL.
161
+ template <bool check_capacity, class char_type>
162
+ simdutf_constexpr23 full_result base64_tail_decode_impl(
163
+ char *dst, size_t outlen, const char_type *src, size_t length,
164
+ size_t padding_characters, // number of padding characters
165
+ // '=', typically 0, 1, 2.
166
+ base64_options options, last_chunk_handling_options last_chunk_options) {
167
+ char *dstend = dst + outlen;
168
+ (void)dstend;
169
+ // This looks like 10 branches, but we expect the compiler to resolve this to
170
+ // two branches (easily predicted):
171
+ const uint8_t *to_base64 =
172
+ (options & base64_default_or_url)
173
+ ? tables::base64::to_base64_default_or_url_value
174
+ : ((options & base64_url) ? tables::base64::to_base64_url_value
175
+ : tables::base64::to_base64_value);
176
+ const uint32_t *d0 =
177
+ (options & base64_default_or_url)
178
+ ? tables::base64::base64_default_or_url::d0
179
+ : ((options & base64_url) ? tables::base64::base64_url::d0
180
+ : tables::base64::base64_default::d0);
181
+ const uint32_t *d1 =
182
+ (options & base64_default_or_url)
183
+ ? tables::base64::base64_default_or_url::d1
184
+ : ((options & base64_url) ? tables::base64::base64_url::d1
185
+ : tables::base64::base64_default::d1);
186
+ const uint32_t *d2 =
187
+ (options & base64_default_or_url)
188
+ ? tables::base64::base64_default_or_url::d2
189
+ : ((options & base64_url) ? tables::base64::base64_url::d2
190
+ : tables::base64::base64_default::d2);
191
+ const uint32_t *d3 =
192
+ (options & base64_default_or_url)
193
+ ? tables::base64::base64_default_or_url::d3
194
+ : ((options & base64_url) ? tables::base64::base64_url::d3
195
+ : tables::base64::base64_default::d3);
196
+ const bool ignore_garbage =
197
+ (options == base64_options::base64_url_accept_garbage) ||
198
+ (options == base64_options::base64_default_accept_garbage) ||
199
+ (options == base64_options::base64_default_or_url_accept_garbage);
200
+
201
+ const char_type *srcend = src + length;
202
+ const char_type *srcinit = src;
203
+ const char *dstinit = dst;
204
+
205
+ uint32_t x;
206
+ size_t idx;
207
+ uint8_t buffer[4];
208
+ while (true) {
209
+ while (srcend - src >= 4 && is_eight_byte(src[0]) &&
210
+ is_eight_byte(src[1]) && is_eight_byte(src[2]) &&
211
+ is_eight_byte(src[3]) &&
212
+ (x = d0[uint8_t(src[0])] | d1[uint8_t(src[1])] |
213
+ d2[uint8_t(src[2])] | d3[uint8_t(src[3])]) < 0x01FFFFFF) {
214
+ if (check_capacity && dstend - dst < 3) {
215
+ return {OUTPUT_BUFFER_TOO_SMALL, size_t(src - srcinit),
216
+ size_t(dst - dstinit)};
217
+ }
218
+ *dst++ = static_cast<char>(x & 0xFF);
219
+ *dst++ = static_cast<char>((x >> 8) & 0xFF);
220
+ *dst++ = static_cast<char>((x >> 16) & 0xFF);
221
+ src += 4;
222
+ }
223
+ const char_type *srccur = src;
224
+ idx = 0;
225
+ // we need at least four characters.
226
+ #ifdef __clang__
227
+ // If possible, we read four characters at a time. (It is an optimization.)
228
+ if (ignore_garbage && src + 4 <= srcend) {
229
+ char_type c0 = src[0];
230
+ char_type c1 = src[1];
231
+ char_type c2 = src[2];
232
+ char_type c3 = src[3];
233
+
234
+ uint8_t code0 = to_base64[uint8_t(c0)];
235
+ uint8_t code1 = to_base64[uint8_t(c1)];
236
+ uint8_t code2 = to_base64[uint8_t(c2)];
237
+ uint8_t code3 = to_base64[uint8_t(c3)];
238
+
239
+ buffer[idx] = code0;
240
+ idx += (is_eight_byte(c0) && code0 <= 63);
241
+ buffer[idx] = code1;
242
+ idx += (is_eight_byte(c1) && code1 <= 63);
243
+ buffer[idx] = code2;
244
+ idx += (is_eight_byte(c2) && code2 <= 63);
245
+ buffer[idx] = code3;
246
+ idx += (is_eight_byte(c3) && code3 <= 63);
247
+ src += 4;
248
+ }
249
+ #endif
250
+ while ((idx < 4) && (src < srcend)) {
251
+ char_type c = *src;
252
+
253
+ uint8_t code = to_base64[uint8_t(c)];
254
+ buffer[idx] = uint8_t(code);
255
+ if (is_eight_byte(c) && code <= 63) {
256
+ idx++;
257
+ } else if (!ignore_garbage &&
258
+ (code > 64 || !scalar::base64::is_eight_byte(c))) {
259
+ return {INVALID_BASE64_CHARACTER, size_t(src - srcinit),
260
+ size_t(dst - dstinit)};
261
+ } else {
262
+ // We have a space or a newline or garbage. We ignore it.
263
+ }
264
+ src++;
265
+ }
266
+ if (idx != 4) {
267
+ simdutf_log_assert(idx < 4, "idx should be less than 4");
268
+ // We never should have that the number of base64 characters + the
269
+ // number of padding characters is more than 4.
270
+ if (!ignore_garbage && (idx + padding_characters > 4)) {
271
+ return {INVALID_BASE64_CHARACTER, size_t(src - srcinit),
272
+ size_t(dst - dstinit), true};
273
+ }
274
+
275
+ // The idea here is that in loose mode,
276
+ // if there is padding at all, it must be used
277
+ // to form 4-wise chunk. However, in loose mode,
278
+ // we do accept no padding at all.
279
+ if (!ignore_garbage &&
280
+ last_chunk_options == last_chunk_handling_options::loose &&
281
+ (idx >= 2) && padding_characters > 0 &&
282
+ ((idx + padding_characters) & 3) != 0) {
283
+ return {INVALID_BASE64_CHARACTER, size_t(src - srcinit),
284
+ size_t(dst - dstinit), true};
285
+ } else
286
+
287
+ // The idea here is that in strict mode, we do not want to accept
288
+ // incomplete base64 chunks. So if the chunk was otherwise valid, we
289
+ // return BASE64_INPUT_REMAINDER.
290
+ if (!ignore_garbage &&
291
+ last_chunk_options == last_chunk_handling_options::strict &&
292
+ (idx >= 2) && ((idx + padding_characters) & 3) != 0) {
293
+ // The partial chunk was at src - idx
294
+ return {BASE64_INPUT_REMAINDER, size_t(src - srcinit),
295
+ size_t(dst - dstinit), true};
296
+ } else
297
+ // If there is a partial chunk with insufficient padding, with
298
+ // stop_before_partial, we need to just ignore it. In "only full"
299
+ // mode, skip the minute there are padding characters.
300
+ if ((last_chunk_options ==
301
+ last_chunk_handling_options::stop_before_partial &&
302
+ (padding_characters + idx < 4) && (idx != 0) &&
303
+ (idx >= 2 || padding_characters == 0)) ||
304
+ (last_chunk_options ==
305
+ last_chunk_handling_options::only_full_chunks &&
306
+ (idx >= 2 || padding_characters == 0))) {
307
+ // partial means that we are *not* going to consume the read
308
+ // characters. We need to rewind the src pointer.
309
+ src = srccur;
310
+ return {SUCCESS, size_t(src - srcinit), size_t(dst - dstinit)};
311
+ } else {
312
+ if (idx == 2) {
313
+ uint32_t triple = (uint32_t(buffer[0]) << 3 * 6) +
314
+ (uint32_t(buffer[1]) << 2 * 6);
315
+ if (!ignore_garbage &&
316
+ (last_chunk_options == last_chunk_handling_options::strict) &&
317
+ (triple & 0xffff)) {
318
+ return {BASE64_EXTRA_BITS, size_t(src - srcinit),
319
+ size_t(dst - dstinit)};
320
+ }
321
+ if (check_capacity && dstend - dst < 1) {
322
+ return {OUTPUT_BUFFER_TOO_SMALL, size_t(srccur - srcinit),
323
+ size_t(dst - dstinit)};
324
+ }
325
+ *dst++ = static_cast<char>((triple >> 16) & 0xFF);
326
+ } else if (idx == 3) {
327
+ uint32_t triple = (uint32_t(buffer[0]) << 3 * 6) +
328
+ (uint32_t(buffer[1]) << 2 * 6) +
329
+ (uint32_t(buffer[2]) << 1 * 6);
330
+ if (!ignore_garbage &&
331
+ (last_chunk_options == last_chunk_handling_options::strict) &&
332
+ (triple & 0xff)) {
333
+ return {BASE64_EXTRA_BITS, size_t(src - srcinit),
334
+ size_t(dst - dstinit)};
335
+ }
336
+ if (check_capacity && dstend - dst < 2) {
337
+ return {OUTPUT_BUFFER_TOO_SMALL, size_t(srccur - srcinit),
338
+ size_t(dst - dstinit)};
339
+ }
340
+ *dst++ = static_cast<char>((triple >> 16) & 0xFF);
341
+ *dst++ = static_cast<char>((triple >> 8) & 0xFF);
342
+ } else if (!ignore_garbage && idx == 1 &&
343
+ (!is_partial(last_chunk_options) ||
344
+ (is_partial(last_chunk_options) &&
345
+ padding_characters > 0))) {
346
+ return {BASE64_INPUT_REMAINDER, size_t(src - srcinit),
347
+ size_t(dst - dstinit)};
348
+ } else if (!ignore_garbage && idx == 0 && padding_characters > 0) {
349
+ return {INVALID_BASE64_CHARACTER, size_t(src - srcinit),
350
+ size_t(dst - dstinit), true};
351
+ }
352
+ return {SUCCESS, size_t(src - srcinit), size_t(dst - dstinit)};
353
+ }
354
+ }
355
+ if (check_capacity && dstend - dst < 3) {
356
+ return {OUTPUT_BUFFER_TOO_SMALL, size_t(srccur - srcinit),
357
+ size_t(dst - dstinit)};
358
+ }
359
+ uint32_t triple =
360
+ (uint32_t(buffer[0]) << 3 * 6) + (uint32_t(buffer[1]) << 2 * 6) +
361
+ (uint32_t(buffer[2]) << 1 * 6) + (uint32_t(buffer[3]) << 0 * 6);
362
+ *dst++ = static_cast<char>((triple >> 16) & 0xFF);
363
+ *dst++ = static_cast<char>((triple >> 8) & 0xFF);
364
+ *dst++ = static_cast<char>(triple & 0xFF);
365
+ }
366
+ }
367
+
368
+ template <class char_type>
369
+ simdutf_constexpr23 full_result base64_tail_decode(
370
+ char *dst, const char_type *src, size_t length,
371
+ size_t padding_characters, // number of padding characters
372
+ // '=', typically 0, 1, 2.
373
+ base64_options options, last_chunk_handling_options last_chunk_options) {
374
+ return base64_tail_decode_impl<false>(dst, 0, src, length, padding_characters,
375
+ options, last_chunk_options);
376
+ }
377
+
378
+ // like base64_tail_decode, but it will not write past the end of the output
379
+ // buffer. The outlen parameter is modified to reflect the number of bytes
380
+ // written. This functions assumes that the padding (=) has been removed.
381
+ //
382
+ template <class char_type>
383
+ simdutf_constexpr23 full_result base64_tail_decode_safe(
384
+ char *dst, size_t outlen, const char_type *src, size_t length,
385
+ size_t padding_characters, // number of padding characters
386
+ // '=', typically 0, 1, 2.
387
+ base64_options options, last_chunk_handling_options last_chunk_options) {
388
+ return base64_tail_decode_impl<true>(dst, outlen, src, length,
389
+ padding_characters, options,
390
+ last_chunk_options);
391
+ }
392
+
393
+ inline simdutf_constexpr23 full_result
394
+ patch_tail_result(full_result r, size_t previous_input, size_t previous_output,
395
+ size_t equallocation, size_t full_input_length,
396
+ last_chunk_handling_options last_chunk_options) {
397
+ r.input_count += previous_input;
398
+ r.output_count += previous_output;
399
+ if (r.padding_error) {
400
+ r.input_count = equallocation;
401
+ }
402
+
403
+ if (r.error == error_code::SUCCESS) {
404
+ if (!is_partial(last_chunk_options)) {
405
+ // A success when we are not in stop_before_partial mode.
406
+ // means that we have consumed the whole input buffer.
407
+ r.input_count = full_input_length;
408
+ } else if (r.output_count % 3 != 0) {
409
+ r.input_count = full_input_length;
410
+ }
411
+ }
412
+ return r;
413
+ }
414
+
415
+ // Returns the number of bytes written. The destination buffer must be large
416
+ // enough. It will add padding (=) if needed.
417
+ template <bool use_lines = false>
418
+ simdutf_constexpr23 size_t tail_encode_base64_impl(
419
+ char *dst, const char *src, size_t srclen, base64_options options,
420
+ size_t line_length = simdutf::default_line_length, size_t line_offset = 0) {
421
+ if simdutf_constexpr (use_lines) {
422
+ // sanitize line_length and starting_line_offset.
423
+ // line_length must be greater than 3.
424
+ if (line_length < 4) {
425
+ line_length = 4;
426
+ }
427
+ simdutf_log_assert(line_offset <= line_length,
428
+ "line_offset should be less than line_length");
429
+ }
430
+ // By default, we use padding if we are not using the URL variant.
431
+ // This is check with ((options & base64_url) == 0) which returns true if we
432
+ // are not using the URL variant. However, we also allow 'inversion' of the
433
+ // convention with the base64_reverse_padding option. If the
434
+ // base64_reverse_padding option is set, we use padding if we are using the
435
+ // URL variant, and we omit it if we are not using the URL variant. This is
436
+ // checked with
437
+ // ((options & base64_reverse_padding) == base64_reverse_padding).
438
+ bool use_padding =
439
+ ((options & base64_url) == 0) ^
440
+ ((options & base64_reverse_padding) == base64_reverse_padding);
441
+ // This looks like 3 branches, but we expect the compiler to resolve this to
442
+ // a single branch:
443
+ const char *e0 = (options & base64_url) ? tables::base64::base64_url::e0
444
+ : tables::base64::base64_default::e0;
445
+ const char *e1 = (options & base64_url) ? tables::base64::base64_url::e1
446
+ : tables::base64::base64_default::e1;
447
+ const char *e2 = (options & base64_url) ? tables::base64::base64_url::e2
448
+ : tables::base64::base64_default::e2;
449
+ char *out = dst;
450
+ size_t i = 0;
451
+ uint8_t t1, t2, t3;
452
+ for (; i + 2 < srclen; i += 3) {
453
+ t1 = uint8_t(src[i]);
454
+ t2 = uint8_t(src[i + 1]);
455
+ t3 = uint8_t(src[i + 2]);
456
+ if simdutf_constexpr (use_lines) {
457
+ if (line_offset + 3 >= line_length) {
458
+ if (line_offset == line_length) {
459
+ *out++ = '\n';
460
+ *out++ = e0[t1];
461
+ *out++ = e1[((t1 & 0x03) << 4) | ((t2 >> 4) & 0x0F)];
462
+ *out++ = e1[((t2 & 0x0F) << 2) | ((t3 >> 6) & 0x03)];
463
+ *out++ = e2[t3];
464
+ line_offset = 4;
465
+ } else if (line_offset + 1 == line_length) {
466
+ *out++ = e0[t1];
467
+ *out++ = '\n';
468
+ *out++ = e1[((t1 & 0x03) << 4) | ((t2 >> 4) & 0x0F)];
469
+ *out++ = e1[((t2 & 0x0F) << 2) | ((t3 >> 6) & 0x03)];
470
+ *out++ = e2[t3];
471
+ line_offset = 3;
472
+ } else if (line_offset + 2 == line_length) {
473
+ *out++ = e0[t1];
474
+ *out++ = e1[((t1 & 0x03) << 4) | ((t2 >> 4) & 0x0F)];
475
+ *out++ = '\n';
476
+ *out++ = e1[((t2 & 0x0F) << 2) | ((t3 >> 6) & 0x03)];
477
+ *out++ = e2[t3];
478
+ line_offset = 2;
479
+ } else if (line_offset + 3 == line_length) {
480
+ *out++ = e0[t1];
481
+ *out++ = e1[((t1 & 0x03) << 4) | ((t2 >> 4) & 0x0F)];
482
+ *out++ = e1[((t2 & 0x0F) << 2) | ((t3 >> 6) & 0x03)];
483
+ *out++ = '\n';
484
+ *out++ = e2[t3];
485
+ line_offset = 1;
486
+ }
487
+ } else {
488
+ *out++ = e0[t1];
489
+ *out++ = e1[((t1 & 0x03) << 4) | ((t2 >> 4) & 0x0F)];
490
+ *out++ = e1[((t2 & 0x0F) << 2) | ((t3 >> 6) & 0x03)];
491
+ *out++ = e2[t3];
492
+ line_offset += 4;
493
+ }
494
+ } else {
495
+ *out++ = e0[t1];
496
+ *out++ = e1[((t1 & 0x03) << 4) | ((t2 >> 4) & 0x0F)];
497
+ *out++ = e1[((t2 & 0x0F) << 2) | ((t3 >> 6) & 0x03)];
498
+ *out++ = e2[t3];
499
+ }
500
+ }
501
+ switch (srclen - i) {
502
+ case 0:
503
+ break;
504
+ case 1:
505
+ t1 = uint8_t(src[i]);
506
+ if simdutf_constexpr (use_lines) {
507
+ if (use_padding) {
508
+ if (line_offset + 3 >= line_length) {
509
+ if (line_offset == line_length) {
510
+ *out++ = '\n';
511
+ *out++ = e0[t1];
512
+ *out++ = e1[(t1 & 0x03) << 4];
513
+ *out++ = '=';
514
+ *out++ = '=';
515
+ } else if (line_offset + 1 == line_length) {
516
+ *out++ = e0[t1];
517
+ *out++ = '\n';
518
+ *out++ = e1[(t1 & 0x03) << 4];
519
+ *out++ = '=';
520
+ *out++ = '=';
521
+ } else if (line_offset + 2 == line_length) {
522
+ *out++ = e0[t1];
523
+ *out++ = e1[(t1 & 0x03) << 4];
524
+ *out++ = '\n';
525
+ *out++ = '=';
526
+ *out++ = '=';
527
+ } else if (line_offset + 3 == line_length) {
528
+ *out++ = e0[t1];
529
+ *out++ = e1[(t1 & 0x03) << 4];
530
+ *out++ = '=';
531
+ *out++ = '\n';
532
+ *out++ = '=';
533
+ }
534
+ } else {
535
+ *out++ = e0[t1];
536
+ *out++ = e1[(t1 & 0x03) << 4];
537
+ *out++ = '=';
538
+ *out++ = '=';
539
+ }
540
+ } else {
541
+ if (line_offset + 2 >= line_length) {
542
+ if (line_offset == line_length) {
543
+ *out++ = '\n';
544
+ *out++ = e0[uint8_t(src[i])];
545
+ *out++ = e1[(uint8_t(src[i]) & 0x03) << 4];
546
+ } else if (line_offset + 1 == line_length) {
547
+ *out++ = e0[uint8_t(src[i])];
548
+ *out++ = '\n';
549
+ *out++ = e1[(uint8_t(src[i]) & 0x03) << 4];
550
+ } else {
551
+ *out++ = e0[uint8_t(src[i])];
552
+ *out++ = e1[(uint8_t(src[i]) & 0x03) << 4];
553
+ // *out++ = '\n'; ==> no newline at the end of the output
554
+ }
555
+ } else {
556
+ *out++ = e0[uint8_t(src[i])];
557
+ *out++ = e1[(uint8_t(src[i]) & 0x03) << 4];
558
+ }
559
+ }
560
+ } else {
561
+ *out++ = e0[t1];
562
+ *out++ = e1[(t1 & 0x03) << 4];
563
+ if (use_padding) {
564
+ *out++ = '=';
565
+ *out++ = '=';
566
+ }
567
+ }
568
+ break;
569
+ default: /* case 2 */
570
+ t1 = uint8_t(src[i]);
571
+ t2 = uint8_t(src[i + 1]);
572
+ if simdutf_constexpr (use_lines) {
573
+ if (use_padding) {
574
+ if (line_offset + 3 >= line_length) {
575
+ if (line_offset == line_length) {
576
+ *out++ = '\n';
577
+ *out++ = e0[t1];
578
+ *out++ = e1[((t1 & 0x03) << 4) | ((t2 >> 4) & 0x0F)];
579
+ *out++ = e2[(t2 & 0x0F) << 2];
580
+ *out++ = '=';
581
+ } else if (line_offset + 1 == line_length) {
582
+ *out++ = e0[t1];
583
+ *out++ = '\n';
584
+ *out++ = e1[((t1 & 0x03) << 4) | ((t2 >> 4) & 0x0F)];
585
+ *out++ = e2[(t2 & 0x0F) << 2];
586
+ *out++ = '=';
587
+ } else if (line_offset + 2 == line_length) {
588
+ *out++ = e0[t1];
589
+ *out++ = e1[((t1 & 0x03) << 4) | ((t2 >> 4) & 0x0F)];
590
+ *out++ = '\n';
591
+ *out++ = e2[(t2 & 0x0F) << 2];
592
+ *out++ = '=';
593
+ } else if (line_offset + 3 == line_length) {
594
+ *out++ = e0[t1];
595
+ *out++ = e1[((t1 & 0x03) << 4) | ((t2 >> 4) & 0x0F)];
596
+ *out++ = e2[(t2 & 0x0F) << 2];
597
+ *out++ = '\n';
598
+ *out++ = '=';
599
+ }
600
+ } else {
601
+ *out++ = e0[t1];
602
+ *out++ = e1[((t1 & 0x03) << 4) | ((t2 >> 4) & 0x0F)];
603
+ *out++ = e2[(t2 & 0x0F) << 2];
604
+ *out++ = '=';
605
+ }
606
+ } else {
607
+ if (line_offset + 3 >= line_length) {
608
+ if (line_offset == line_length) {
609
+ *out++ = '\n';
610
+ *out++ = e0[t1];
611
+ *out++ = e1[((t1 & 0x03) << 4) | ((t2 >> 4) & 0x0F)];
612
+ *out++ = e2[(t2 & 0x0F) << 2];
613
+ } else if (line_offset + 1 == line_length) {
614
+ *out++ = e0[t1];
615
+ *out++ = '\n';
616
+ *out++ = e1[((t1 & 0x03) << 4) | ((t2 >> 4) & 0x0F)];
617
+ *out++ = e2[(t2 & 0x0F) << 2];
618
+ } else if (line_offset + 2 == line_length) {
619
+ *out++ = e0[t1];
620
+ *out++ = e1[((t1 & 0x03) << 4) | ((t2 >> 4) & 0x0F)];
621
+ *out++ = '\n';
622
+ *out++ = e2[(t2 & 0x0F) << 2];
623
+ } else {
624
+ *out++ = e0[t1];
625
+ *out++ = e1[((t1 & 0x03) << 4) | ((t2 >> 4) & 0x0F)];
626
+ *out++ = e2[(t2 & 0x0F) << 2];
627
+ // *out++ = '\n'; ==> no newline at the end of the output
628
+ }
629
+ } else {
630
+ *out++ = e0[t1];
631
+ *out++ = e1[((t1 & 0x03) << 4) | ((t2 >> 4) & 0x0F)];
632
+ *out++ = e2[(t2 & 0x0F) << 2];
633
+ }
634
+ }
635
+ } else {
636
+ *out++ = e0[t1];
637
+ *out++ = e1[((t1 & 0x03) << 4) | ((t2 >> 4) & 0x0F)];
638
+ *out++ = e2[(t2 & 0x0F) << 2];
639
+ if (use_padding) {
640
+ *out++ = '=';
641
+ }
642
+ }
643
+ }
644
+ return (size_t)(out - dst);
645
+ }
646
+
647
+ // Returns the number of bytes written. The destination buffer must be large
648
+ // enough. It will add padding (=) if needed.
649
+ inline simdutf_constexpr23 size_t tail_encode_base64(char *dst, const char *src,
650
+ size_t srclen,
651
+ base64_options options) {
652
+ return tail_encode_base64_impl(dst, src, srclen, options);
653
+ }
654
+
655
+ template <class InputPtr>
656
+ simdutf_warn_unused simdutf_constexpr23 size_t
657
+ maximal_binary_length_from_base64(InputPtr input, size_t length) noexcept {
658
+ // We process the padding characters ('=') at the end to make sure
659
+ // that we return an exact result when the input has no ignorable characters
660
+ // (e.g., spaces).
661
+ size_t padding = 0;
662
+ if (length > 0) {
663
+ if (input[length - 1] == '=') {
664
+ padding++;
665
+ if (length > 1 && input[length - 2] == '=') {
666
+ padding++;
667
+ }
668
+ }
669
+ }
670
+ // The input is not otherwise processed for ignorable characters or
671
+ // validation, so that the function runs in constant time (very fast). In
672
+ // practice, base64 inputs without ignorable characters are common and the
673
+ // common case are line separated inputs with relatively long lines (e.g., 76
674
+ // characters) which leads this function to a slight (1%) overestimation of
675
+ // the output size.
676
+ //
677
+ // Of course, some inputs might contain an arbitrary number of spaces or
678
+ // newlines, which would make this function return a very pessimistic output
679
+ // size but systems that produce base64 outputs typically do not do that and
680
+ // if they do, they do not care much about minimizing memory usage.
681
+ //
682
+ // In specialized applications, users may know that their input is line
683
+ // separated, which can be checked very quickly by by iterating (e.g., over 76
684
+ // character chunks, looking for the linefeed characters only). We could
685
+ // provide a specialized function for that, but it is not clear that the added
686
+ // complexity is worth it for us.
687
+ //
688
+ size_t actual_length = length - padding;
689
+ if (actual_length % 4 <= 1) {
690
+ return actual_length / 4 * 3;
691
+ }
692
+ // if we have a valid input, then the remainder must be 2 or 3 adding one or
693
+ // two extra bytes.
694
+ return actual_length / 4 * 3 + (actual_length % 4) - 1;
695
+ }
696
+
697
+ // This function computes the binary length by iterating through the input
698
+ // and counting non-whitespace characters (excluding padding characters).
699
+ // We use a simple check (c > ' ') which is easy to parallelize and matches
700
+ // SIMD behavior. Only the last few characters are checked for padding '='.
701
+ template <class char_type>
702
+ simdutf_warn_unused simdutf_constexpr23 size_t
703
+ binary_length_from_base64(const char_type *input, size_t length) noexcept {
704
+ // Count non-whitespace characters (c > ' ') with loop unrolling
705
+ size_t count = 0;
706
+ for (size_t i = 0; i < length; i++) {
707
+ count += (input[i] > ' ');
708
+ }
709
+
710
+ // Check for padding '=' at the end (at most 2 padding characters)
711
+ // Scan backwards, skipping whitespace, to find padding
712
+ size_t padding = 0;
713
+ size_t pos = length;
714
+ // Skip trailing whitespace
715
+ while (pos > 0 && padding < 2) {
716
+ char_type c = input[--pos];
717
+ if (c == '=') {
718
+ padding++;
719
+ } else if (c > ' ') {
720
+ break;
721
+ }
722
+ }
723
+ return ((count - padding) * 3) / 4;
724
+ }
725
+
726
+ template <typename char_type>
727
+ simdutf_warn_unused simdutf_constexpr23 full_result
728
+ base64_to_binary_details_impl(
729
+ const char_type *input, size_t length, char *output, base64_options options,
730
+ last_chunk_handling_options last_chunk_options) noexcept {
731
+ const bool ignore_garbage =
732
+ (options == base64_options::base64_url_accept_garbage) ||
733
+ (options == base64_options::base64_default_accept_garbage) ||
734
+ (options == base64_options::base64_default_or_url_accept_garbage);
735
+ auto ri = simdutf::scalar::base64::find_end(input, length, options);
736
+ size_t equallocation = ri.equallocation;
737
+ size_t equalsigns = ri.equalsigns;
738
+ length = ri.srclen;
739
+ size_t full_input_length = ri.full_input_length;
740
+ if (length == 0) {
741
+ if (!ignore_garbage && equalsigns > 0) {
742
+ return {INVALID_BASE64_CHARACTER, equallocation, 0};
743
+ }
744
+ return {SUCCESS, full_input_length, 0};
745
+ }
746
+ full_result r = scalar::base64::base64_tail_decode(
747
+ output, input, length, equalsigns, options, last_chunk_options);
748
+ r = scalar::base64::patch_tail_result(r, 0, 0, equallocation,
749
+ full_input_length, last_chunk_options);
750
+ if (!is_partial(last_chunk_options) && r.error == error_code::SUCCESS &&
751
+ equalsigns > 0 && !ignore_garbage) {
752
+ // additional checks
753
+ if ((r.output_count % 3 == 0) ||
754
+ ((r.output_count % 3) + 1 + equalsigns != 4)) {
755
+ return {INVALID_BASE64_CHARACTER, equallocation, r.output_count};
756
+ }
757
+ }
758
+ // When is_partial(last_chunk_options) is true, we must either end with
759
+ // the end of the stream (beyond whitespace) or right after a non-ignorable
760
+ // character or at the very beginning of the stream.
761
+ // See https://tc39.es/proposal-arraybuffer-base64/spec/#sec-frombase64
762
+ if (is_partial(last_chunk_options) && r.error == error_code::SUCCESS &&
763
+ r.input_count < full_input_length) {
764
+ // First check if we can extend the input to the end of the stream
765
+ while (r.input_count < full_input_length &&
766
+ base64_ignorable(*(input + r.input_count), options)) {
767
+ r.input_count++;
768
+ }
769
+ // If we are still not at the end of the stream, then we must backtrack
770
+ // to the last non-ignorable character.
771
+ if (r.input_count < full_input_length) {
772
+ while (r.input_count > 0 &&
773
+ base64_ignorable(*(input + r.input_count - 1), options)) {
774
+ r.input_count--;
775
+ }
776
+ }
777
+ }
778
+ return r;
779
+ }
780
+
781
+ template <typename char_type>
782
+ simdutf_constexpr23 simdutf_warn_unused full_result
783
+ base64_to_binary_details_safe_impl(
784
+ const char_type *input, size_t length, char *output, size_t outlen,
785
+ base64_options options,
786
+ last_chunk_handling_options last_chunk_options) noexcept {
787
+ const bool ignore_garbage =
788
+ (options == base64_options::base64_url_accept_garbage) ||
789
+ (options == base64_options::base64_default_accept_garbage) ||
790
+ (options == base64_options::base64_default_or_url_accept_garbage);
791
+ auto ri = simdutf::scalar::base64::find_end(input, length, options);
792
+ size_t equallocation = ri.equallocation;
793
+ size_t equalsigns = ri.equalsigns;
794
+ length = ri.srclen;
795
+ size_t full_input_length = ri.full_input_length;
796
+ if (length == 0) {
797
+ if (!ignore_garbage && equalsigns > 0) {
798
+ return {INVALID_BASE64_CHARACTER, equallocation, 0};
799
+ }
800
+ return {SUCCESS, full_input_length, 0};
801
+ }
802
+ full_result r = scalar::base64::base64_tail_decode_safe(
803
+ output, outlen, input, length, equalsigns, options, last_chunk_options);
804
+ r = scalar::base64::patch_tail_result(r, 0, 0, equallocation,
805
+ full_input_length, last_chunk_options);
806
+ if (!is_partial(last_chunk_options) && r.error == error_code::SUCCESS &&
807
+ equalsigns > 0 && !ignore_garbage) {
808
+ // additional checks
809
+ if ((r.output_count % 3 == 0) ||
810
+ ((r.output_count % 3) + 1 + equalsigns != 4)) {
811
+ return {INVALID_BASE64_CHARACTER, equallocation, r.output_count};
812
+ }
813
+ }
814
+
815
+ // When is_partial(last_chunk_options) is true, we must either end with
816
+ // the end of the stream (beyond whitespace) or right after a non-ignorable
817
+ // character or at the very beginning of the stream.
818
+ // See https://tc39.es/proposal-arraybuffer-base64/spec/#sec-frombase64
819
+ if (is_partial(last_chunk_options) && r.error == error_code::SUCCESS &&
820
+ r.input_count < full_input_length) {
821
+ // First check if we can extend the input to the end of the stream
822
+ while (r.input_count < full_input_length &&
823
+ base64_ignorable(*(input + r.input_count), options)) {
824
+ r.input_count++;
825
+ }
826
+ // If we are still not at the end of the stream, then we must backtrack
827
+ // to the last non-ignorable character.
828
+ if (r.input_count < full_input_length) {
829
+ while (r.input_count > 0 &&
830
+ base64_ignorable(*(input + r.input_count - 1), options)) {
831
+ r.input_count--;
832
+ }
833
+ }
834
+ }
835
+ return r;
836
+ }
837
+
838
+ simdutf_warn_unused simdutf_constexpr23 size_t
839
+ base64_length_from_binary(size_t length, base64_options options) noexcept {
840
+ // By default, we use padding if we are not using the URL variant.
841
+ // This is check with ((options & base64_url) == 0) which returns true if we
842
+ // are not using the URL variant. However, we also allow 'inversion' of the
843
+ // convention with the base64_reverse_padding option. If the
844
+ // base64_reverse_padding option is set, we use padding if we are using the
845
+ // URL variant, and we omit it if we are not using the URL variant. This is
846
+ // checked with
847
+ // ((options & base64_reverse_padding) == base64_reverse_padding).
848
+ bool use_padding =
849
+ ((options & base64_url) == 0) ^
850
+ ((options & base64_reverse_padding) == base64_reverse_padding);
851
+ if (!use_padding) {
852
+ return length / 3 * 4 + ((length % 3) ? (length % 3) + 1 : 0);
853
+ }
854
+ return (length + 2) / 3 *
855
+ 4; // We use padding to make the length a multiple of 4.
856
+ }
857
+
858
+ simdutf_warn_unused simdutf_constexpr23 size_t
859
+ base64_length_from_binary_with_lines(size_t length, base64_options options,
860
+ size_t line_length) noexcept {
861
+ if (length == 0) {
862
+ return 0;
863
+ }
864
+ size_t base64_length =
865
+ scalar::base64::base64_length_from_binary(length, options);
866
+ if (line_length < 4) {
867
+ line_length = 4;
868
+ }
869
+ size_t lines =
870
+ (base64_length + line_length - 1) / line_length; // number of lines
871
+ return base64_length + lines - 1;
872
+ }
873
+
874
+ // Return the length of the prefix that contains count base64 characters.
875
+ // Thus, if count is 3, the function returns the length of the prefix
876
+ // that contains 3 base64 characters.
877
+ // The function returns (size_t)-1 if there is not enough base64 characters in
878
+ // the input.
879
+ template <typename char_type>
880
+ simdutf_warn_unused size_t prefix_length(size_t count,
881
+ simdutf::base64_options options,
882
+ const char_type *input,
883
+ size_t length) noexcept {
884
+ size_t i = 0;
885
+ while (i < length && is_ignorable(input[i], options)) {
886
+ i++;
887
+ }
888
+ if (count == 0) {
889
+ return i; // duh!
890
+ }
891
+ for (; i < length; i++) {
892
+ if (is_ignorable(input[i], options)) {
893
+ continue;
894
+ }
895
+ // We have a base64 character or a padding character.
896
+ count--;
897
+ if (count == 0) {
898
+ return i + 1;
899
+ }
900
+ }
901
+ simdutf_log_assert(false, "You never get here");
902
+
903
+ return -1; // should never happen
904
+ }
905
+
906
+ } // namespace base64
907
+ } // unnamed namespace
908
+ } // namespace scalar
909
+ } // namespace simdutf
910
+
911
+ #endif