@port-labs/jq-node-bindings 0.0.13 → 0.0.15-dev1
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.
- package/README.md +6 -1
- package/binding.gyp +41 -19
- package/configure +1 -1
- package/deps/jq/.gitattributes +12 -0
- package/deps/jq/AUTHORS +149 -43
- package/deps/jq/COPYING +75 -1
- package/deps/jq/ChangeLog +2 -2
- package/deps/jq/Makefile.am +106 -65
- package/deps/jq/NEWS.md +391 -0
- package/deps/jq/README.md +54 -52
- package/deps/jq/SECURITY.md +7 -0
- package/deps/jq/compile-ios.sh +106 -102
- package/deps/jq/configure.ac +72 -59
- package/deps/jq/docs/Pipfile +14 -0
- package/deps/jq/docs/Pipfile.lock +415 -0
- package/deps/jq/docs/README.md +15 -14
- package/deps/jq/docs/build_manpage.py +251 -0
- package/deps/jq/docs/build_mantests.py +21 -0
- package/deps/jq/docs/build_website.py +95 -0
- package/deps/jq/docs/content/download/default.yml +249 -0
- package/deps/jq/docs/content/index.yml +83 -0
- package/deps/jq/docs/content/{3.manual/v1.6 → manual/dev}/manual.yml +992 -452
- package/deps/jq/docs/content/{3.manual → manual}/v1.3/manual.yml +105 -116
- package/deps/jq/docs/content/{3.manual → manual}/v1.4/manual.yml +122 -129
- package/deps/jq/docs/content/{3.manual → manual}/v1.5/manual.yml +313 -262
- package/deps/jq/docs/content/{3.manual → manual/v1.6}/manual.yml +407 -332
- package/deps/jq/docs/content/manual/v1.7/manual.yml +3697 -0
- package/deps/jq/docs/content/tutorial/default.yml +337 -0
- package/deps/jq/docs/manual_schema.yml +60 -0
- package/deps/jq/docs/public/css/style.css +99 -0
- package/deps/jq/docs/public/icon.png +0 -0
- package/deps/jq/docs/public/icon.svg +1 -0
- package/deps/jq/docs/public/jq.svg +1 -0
- package/deps/jq/docs/public/js/manual-search.js +31 -49
- package/deps/jq/docs/templates/default.html.j2 +31 -0
- package/deps/jq/docs/templates/index.html.j2 +58 -0
- package/deps/jq/docs/templates/manual.html.j2 +120 -0
- package/deps/jq/docs/templates/shared/_footer.html.j2 +14 -0
- package/deps/jq/docs/templates/shared/_head.html.j2 +23 -0
- package/deps/jq/docs/templates/shared/_navbar.html.j2 +40 -0
- package/deps/jq/docs/validate_manual_schema.py +19 -0
- package/deps/jq/jq.1.prebuilt +1102 -294
- package/deps/jq/jq.spec +2 -3
- package/deps/jq/libjq.pc.in +11 -0
- package/deps/jq/m4/ax_pthread.m4 +522 -0
- package/deps/jq/modules/oniguruma/.travis.yml +17 -0
- package/deps/jq/modules/oniguruma/CMakeLists.txt +206 -41
- package/deps/jq/modules/oniguruma/COPYING +23 -25
- package/deps/jq/modules/oniguruma/HISTORY +368 -23
- package/deps/jq/modules/oniguruma/Makefile.am +61 -7
- package/deps/jq/modules/oniguruma/README +34 -20
- package/deps/jq/modules/oniguruma/README.md +106 -33
- package/deps/jq/modules/oniguruma/README_japanese +183 -0
- package/deps/jq/modules/oniguruma/autogen.sh +9 -0
- package/deps/jq/modules/oniguruma/cmake/Config.cmake.in +4 -0
- package/deps/jq/modules/oniguruma/configure.ac +66 -55
- package/deps/jq/modules/oniguruma/doc/API +485 -42
- package/deps/jq/modules/oniguruma/doc/API.ja +732 -293
- package/deps/jq/modules/oniguruma/doc/CALLOUTS.API +397 -0
- package/deps/jq/modules/oniguruma/doc/CALLOUTS.API.ja +393 -0
- package/deps/jq/modules/oniguruma/doc/CALLOUTS.BUILTIN +95 -0
- package/deps/jq/modules/oniguruma/doc/CALLOUTS.BUILTIN.ja +93 -0
- package/deps/jq/modules/oniguruma/doc/FAQ +3 -3
- package/deps/jq/modules/oniguruma/doc/FAQ.ja +8 -8
- package/deps/jq/modules/oniguruma/doc/RE +223 -63
- package/deps/jq/modules/oniguruma/doc/RE.ja +420 -265
- package/deps/jq/modules/oniguruma/doc/SYNTAX.md +1091 -0
- package/deps/jq/modules/oniguruma/doc/UNICODE_PROPERTIES +840 -697
- package/deps/jq/modules/oniguruma/harnesses/ascii_compatible.dict +113 -0
- package/deps/jq/modules/oniguruma/harnesses/base.c +749 -0
- package/deps/jq/modules/oniguruma/harnesses/deluxe.c +206 -0
- package/deps/jq/modules/oniguruma/harnesses/dict_conv.py +72 -0
- package/deps/jq/modules/oniguruma/harnesses/fuzzer.options +2 -0
- package/deps/jq/modules/oniguruma/harnesses/libfuzzer-onig.cpp +45 -0
- package/deps/jq/modules/oniguruma/harnesses/regset.c +392 -0
- package/deps/jq/modules/oniguruma/index.html +16 -5
- package/deps/jq/modules/oniguruma/index_ja.html +16 -5
- package/deps/jq/modules/oniguruma/make_win.bat +5 -0
- package/deps/jq/modules/oniguruma/make_win32.bat +5 -3
- package/deps/jq/modules/oniguruma/make_win64.bat +5 -3
- package/deps/jq/modules/oniguruma/onig-config.cmake.in +80 -0
- package/deps/jq/modules/oniguruma/onig-config.in +1 -1
- package/deps/jq/modules/oniguruma/oniguruma.pc.cmake.in +1 -1
- package/deps/jq/modules/oniguruma/oniguruma.pc.in +0 -1
- package/deps/jq/modules/oniguruma/sample/CMakeLists.txt +9 -2
- package/deps/jq/modules/oniguruma/sample/Makefile.am +24 -5
- package/deps/jq/modules/oniguruma/sample/bug_fix.c +13 -51
- package/deps/jq/modules/oniguruma/sample/callback_each_match.c +168 -0
- package/deps/jq/modules/oniguruma/sample/callout.c +268 -0
- package/deps/jq/modules/oniguruma/sample/count.c +125 -0
- package/deps/jq/modules/oniguruma/sample/crnl.c +6 -4
- package/deps/jq/modules/oniguruma/sample/echo.c +136 -0
- package/deps/jq/modules/oniguruma/sample/encode.c +53 -146
- package/deps/jq/modules/oniguruma/sample/listcap.c +18 -10
- package/deps/jq/modules/oniguruma/sample/names.c +10 -6
- package/deps/jq/modules/oniguruma/sample/posix.c +13 -2
- package/deps/jq/modules/oniguruma/sample/regset.c +95 -0
- package/deps/jq/modules/oniguruma/sample/scan.c +20 -6
- package/deps/jq/modules/oniguruma/sample/simple.c +8 -4
- package/deps/jq/modules/oniguruma/sample/sql.c +13 -8
- package/deps/jq/modules/oniguruma/sample/syntax.c +11 -10
- package/deps/jq/modules/oniguruma/sample/user_property.c +12 -7
- package/deps/jq/modules/oniguruma/src/Makefile.am +41 -15
- package/deps/jq/modules/oniguruma/src/Makefile.windows +196 -183
- package/deps/jq/modules/oniguruma/src/ascii.c +64 -7
- package/deps/jq/modules/oniguruma/src/big5.c +25 -15
- package/deps/jq/modules/oniguruma/src/config.h.cmake.in +7 -22
- package/deps/jq/modules/oniguruma/src/config.h.win32 +56 -84
- package/deps/jq/modules/oniguruma/src/config.h.win64 +56 -84
- package/deps/jq/modules/oniguruma/src/config.h.windows.in +62 -0
- package/deps/jq/modules/oniguruma/src/cp1251.c +14 -8
- package/deps/jq/modules/oniguruma/src/euc_jp.c +28 -30
- package/deps/jq/modules/oniguruma/src/euc_jp_prop.c +25 -32
- package/deps/jq/modules/oniguruma/src/euc_jp_prop.gperf +1 -2
- package/deps/jq/modules/oniguruma/src/euc_kr.c +27 -15
- package/deps/jq/modules/oniguruma/src/euc_tw.c +40 -17
- package/deps/jq/modules/oniguruma/src/gb18030.c +177 -119
- package/deps/jq/modules/oniguruma/src/gperf_fold_key_conv.py +12 -8
- package/deps/jq/modules/oniguruma/src/gperf_unfold_key_conv.py +8 -6
- package/deps/jq/modules/oniguruma/src/iso8859_1.c +92 -91
- package/deps/jq/modules/oniguruma/src/iso8859_10.c +13 -29
- package/deps/jq/modules/oniguruma/src/iso8859_11.c +4 -2
- package/deps/jq/modules/oniguruma/src/iso8859_13.c +13 -33
- package/deps/jq/modules/oniguruma/src/iso8859_14.c +13 -30
- package/deps/jq/modules/oniguruma/src/iso8859_15.c +13 -34
- package/deps/jq/modules/oniguruma/src/iso8859_16.c +13 -29
- package/deps/jq/modules/oniguruma/src/iso8859_2.c +13 -29
- package/deps/jq/modules/oniguruma/src/iso8859_3.c +13 -33
- package/deps/jq/modules/oniguruma/src/iso8859_4.c +13 -32
- package/deps/jq/modules/oniguruma/src/iso8859_5.c +16 -23
- package/deps/jq/modules/oniguruma/src/iso8859_6.c +4 -2
- package/deps/jq/modules/oniguruma/src/iso8859_7.c +14 -29
- package/deps/jq/modules/oniguruma/src/iso8859_8.c +4 -2
- package/deps/jq/modules/oniguruma/src/iso8859_9.c +13 -33
- package/deps/jq/modules/oniguruma/src/koi8.c +14 -27
- package/deps/jq/modules/oniguruma/src/koi8_r.c +12 -19
- package/deps/jq/modules/oniguruma/src/make_property.sh +21 -0
- package/deps/jq/modules/oniguruma/src/make_unicode_egcb.sh +7 -0
- package/deps/jq/modules/oniguruma/src/make_unicode_egcb_data.py +267 -0
- package/deps/jq/modules/oniguruma/src/make_unicode_fold.sh +25 -11
- package/deps/jq/modules/oniguruma/src/make_unicode_fold_data.py +206 -26
- package/deps/jq/modules/oniguruma/src/make_unicode_property.sh +19 -10
- package/deps/jq/modules/oniguruma/src/make_unicode_property_data.py +474 -375
- package/deps/jq/modules/oniguruma/src/make_unicode_wb.sh +7 -0
- package/deps/jq/modules/oniguruma/src/make_unicode_wb_data.py +267 -0
- package/deps/jq/modules/oniguruma/src/mktable.c +28 -24
- package/deps/jq/modules/oniguruma/src/onig_init.c +2 -2
- package/deps/jq/modules/oniguruma/src/oniggnu.h +7 -5
- package/deps/jq/modules/oniguruma/src/onigposix.h +40 -16
- package/deps/jq/modules/oniguruma/src/oniguruma.h +357 -107
- package/deps/jq/modules/oniguruma/src/regcomp.c +6214 -3933
- package/deps/jq/modules/oniguruma/src/regenc.c +197 -120
- package/deps/jq/modules/oniguruma/src/regenc.h +106 -63
- package/deps/jq/modules/oniguruma/src/regerror.c +112 -91
- package/deps/jq/modules/oniguruma/src/regexec.c +4876 -2010
- package/deps/jq/modules/oniguruma/src/regext.c +8 -8
- package/deps/jq/modules/oniguruma/src/reggnu.c +13 -17
- package/deps/jq/modules/oniguruma/src/regint.h +757 -491
- package/deps/jq/modules/oniguruma/src/regparse.c +7204 -3240
- package/deps/jq/modules/oniguruma/src/regparse.h +361 -218
- package/deps/jq/modules/oniguruma/src/regposerr.c +49 -9
- package/deps/jq/modules/oniguruma/src/regposix.c +106 -24
- package/deps/jq/modules/oniguruma/src/regsyntax.c +66 -13
- package/deps/jq/modules/oniguruma/src/regtrav.c +1 -1
- package/deps/jq/modules/oniguruma/src/regversion.c +6 -4
- package/deps/jq/modules/oniguruma/src/sjis.c +23 -52
- package/deps/jq/modules/oniguruma/src/sjis_prop.c +25 -32
- package/deps/jq/modules/oniguruma/src/sjis_prop.gperf +1 -2
- package/deps/jq/modules/oniguruma/src/st.c +248 -249
- package/deps/jq/modules/oniguruma/src/st.h +4 -5
- package/deps/jq/modules/oniguruma/src/unicode.c +869 -294
- package/deps/jq/modules/oniguruma/src/unicode_egcb_data.c +1419 -0
- package/deps/jq/modules/oniguruma/src/unicode_fold1_key.c +1829 -1300
- package/deps/jq/modules/oniguruma/src/unicode_fold2_key.c +32 -9
- package/deps/jq/modules/oniguruma/src/unicode_fold3_key.c +32 -9
- package/deps/jq/modules/oniguruma/src/unicode_fold_data.c +1210 -984
- package/deps/jq/modules/oniguruma/src/unicode_property_data.c +22480 -15198
- package/deps/jq/modules/oniguruma/src/unicode_property_data_posix.c +1463 -591
- package/deps/jq/modules/oniguruma/src/unicode_unfold_key.c +1958 -1418
- package/deps/jq/modules/oniguruma/src/unicode_wb_data.c +1106 -0
- package/deps/jq/modules/oniguruma/src/utf16_be.c +90 -49
- package/deps/jq/modules/oniguruma/src/utf16_le.c +80 -49
- package/deps/jq/modules/oniguruma/src/utf32_be.c +14 -42
- package/deps/jq/modules/oniguruma/src/utf32_le.c +13 -40
- package/deps/jq/modules/oniguruma/src/utf8.c +33 -78
- package/deps/jq/modules/oniguruma/test/CMakeLists.txt +55 -0
- package/deps/jq/modules/oniguruma/test/Makefile.am +65 -10
- package/deps/jq/modules/oniguruma/test/test.sh +17 -0
- package/deps/jq/modules/oniguruma/test/test_back.c +1450 -0
- package/deps/jq/modules/oniguruma/test/test_options.c +228 -0
- package/deps/jq/modules/oniguruma/test/test_regset.c +466 -0
- package/deps/jq/modules/oniguruma/test/test_syntax.c +365 -0
- package/deps/jq/modules/oniguruma/test/test_utf8.c +1761 -0
- package/deps/jq/modules/oniguruma/test/testc.c +128 -88
- package/deps/jq/modules/oniguruma/test/testp.c +613 -0
- package/deps/jq/modules/oniguruma/test/testu.c +75 -28
- package/deps/jq/modules/oniguruma/tis-ci/stub.c +3 -0
- package/deps/jq/modules/oniguruma/tis-ci/test_back.config +26 -0
- package/deps/jq/modules/oniguruma/tis-ci/test_regset.config +20 -0
- package/deps/jq/modules/oniguruma/tis-ci/test_syntax.config +26 -0
- package/deps/jq/modules/oniguruma/tis-ci/test_utf8.config +25 -0
- package/deps/jq/modules/oniguruma/tis-ci/testc.config +26 -0
- package/deps/jq/modules/oniguruma/tis-ci/testu.config +24 -0
- package/deps/jq/modules/oniguruma/tis.config +1336 -0
- package/deps/jq/modules/oniguruma/windows/CMakeLists.txt +8 -0
- package/deps/jq/modules/oniguruma/windows/testc.c +865 -869
- package/deps/jq/scripts/update-website +6 -5
- package/deps/jq/scripts/version +10 -7
- package/deps/jq/sig/jq-release-new.key +29 -0
- package/deps/jq/sig/v1.4/sha256sum.txt +1 -0
- package/deps/jq/sig/v1.5/sha256sum.txt +2 -0
- package/deps/jq/sig/v1.5rc1/sha256sum.txt +1 -0
- package/deps/jq/sig/v1.5rc2/sha256sum.txt +2 -0
- package/deps/jq/sig/v1.6/sha256sum.txt +2 -0
- package/deps/jq/sig/v1.7/jq-1.7.tar.gz.asc +16 -0
- package/deps/jq/sig/v1.7/jq-1.7.zip.asc +16 -0
- package/deps/jq/sig/v1.7/jq-linux-amd64.asc +16 -0
- package/deps/jq/sig/v1.7/jq-linux-arm64.asc +16 -0
- package/deps/jq/sig/v1.7/jq-linux-armel.asc +16 -0
- package/deps/jq/sig/v1.7/jq-linux-armhf.asc +16 -0
- package/deps/jq/sig/v1.7/jq-linux-i386.asc +16 -0
- package/deps/jq/sig/v1.7/jq-linux-mips.asc +16 -0
- package/deps/jq/sig/v1.7/jq-linux-mips64.asc +16 -0
- package/deps/jq/sig/v1.7/jq-linux-mips64el.asc +16 -0
- package/deps/jq/sig/v1.7/jq-linux-mips64r6.asc +16 -0
- package/deps/jq/sig/v1.7/jq-linux-mips64r6el.asc +16 -0
- package/deps/jq/sig/v1.7/jq-linux-mipsel.asc +16 -0
- package/deps/jq/sig/v1.7/jq-linux-mipsr6.asc +16 -0
- package/deps/jq/sig/v1.7/jq-linux-mipsr6el.asc +16 -0
- package/deps/jq/sig/v1.7/jq-linux-powerpc.asc +16 -0
- package/deps/jq/sig/v1.7/jq-linux-ppc64el.asc +16 -0
- package/deps/jq/sig/v1.7/jq-linux-riscv64.asc +16 -0
- package/deps/jq/sig/v1.7/jq-linux-s390x.asc +16 -0
- package/deps/jq/sig/v1.7/jq-macos-amd64.asc +16 -0
- package/deps/jq/sig/v1.7/jq-macos-arm64.asc +16 -0
- package/deps/jq/sig/v1.7/jq-windows-amd64.exe.asc +16 -0
- package/deps/jq/sig/v1.7/jq-windows-i386.exe.asc +16 -0
- package/deps/jq/sig/v1.7/sha256sum.txt +23 -0
- package/deps/jq/sig/v1.7.1/jq-1.7.1.tar.gz.asc +16 -0
- package/deps/jq/sig/v1.7.1/jq-1.7.1.zip.asc +16 -0
- package/deps/jq/sig/v1.7.1/jq-linux-amd64.asc +16 -0
- package/deps/jq/sig/v1.7.1/jq-linux-arm64.asc +16 -0
- package/deps/jq/sig/v1.7.1/jq-linux-armel.asc +16 -0
- package/deps/jq/sig/v1.7.1/jq-linux-armhf.asc +16 -0
- package/deps/jq/sig/v1.7.1/jq-linux-i386.asc +16 -0
- package/deps/jq/sig/v1.7.1/jq-linux-mips.asc +16 -0
- package/deps/jq/sig/v1.7.1/jq-linux-mips64.asc +16 -0
- package/deps/jq/sig/v1.7.1/jq-linux-mips64el.asc +16 -0
- package/deps/jq/sig/v1.7.1/jq-linux-mips64r6.asc +16 -0
- package/deps/jq/sig/v1.7.1/jq-linux-mips64r6el.asc +16 -0
- package/deps/jq/sig/v1.7.1/jq-linux-mipsel.asc +16 -0
- package/deps/jq/sig/v1.7.1/jq-linux-mipsr6.asc +16 -0
- package/deps/jq/sig/v1.7.1/jq-linux-mipsr6el.asc +16 -0
- package/deps/jq/sig/v1.7.1/jq-linux-powerpc.asc +16 -0
- package/deps/jq/sig/v1.7.1/jq-linux-ppc64el.asc +16 -0
- package/deps/jq/sig/v1.7.1/jq-linux-riscv64.asc +16 -0
- package/deps/jq/sig/v1.7.1/jq-linux-s390x.asc +16 -0
- package/deps/jq/sig/v1.7.1/jq-linux64.asc +16 -0
- package/deps/jq/sig/v1.7.1/jq-macos-amd64.asc +16 -0
- package/deps/jq/sig/v1.7.1/jq-macos-arm64.asc +16 -0
- package/deps/jq/sig/v1.7.1/jq-osx-amd64.asc +16 -0
- package/deps/jq/sig/v1.7.1/jq-win64.exe.asc +16 -0
- package/deps/jq/sig/v1.7.1/jq-windows-amd64.exe.asc +16 -0
- package/deps/jq/sig/v1.7.1/jq-windows-i386.exe.asc +16 -0
- package/deps/jq/sig/v1.7.1/sha256sum.txt +26 -0
- package/deps/jq/sig/v1.7rc1/jq-1.7rc1.tar.gz.asc +16 -0
- package/deps/jq/sig/v1.7rc1/jq-1.7rc1.zip.asc +16 -0
- package/deps/jq/sig/v1.7rc1/jq-linux-amd64.asc +16 -0
- package/deps/jq/sig/v1.7rc1/jq-linux-arm64.asc +16 -0
- package/deps/jq/sig/v1.7rc1/jq-linux-armel.asc +16 -0
- package/deps/jq/sig/v1.7rc1/jq-linux-armhf.asc +16 -0
- package/deps/jq/sig/v1.7rc1/jq-linux-i386.asc +16 -0
- package/deps/jq/sig/v1.7rc1/jq-linux-mips.asc +16 -0
- package/deps/jq/sig/v1.7rc1/jq-linux-mips64.asc +16 -0
- package/deps/jq/sig/v1.7rc1/jq-linux-mips64el.asc +16 -0
- package/deps/jq/sig/v1.7rc1/jq-linux-mips64r6.asc +16 -0
- package/deps/jq/sig/v1.7rc1/jq-linux-mips64r6el.asc +16 -0
- package/deps/jq/sig/v1.7rc1/jq-linux-mipsel.asc +16 -0
- package/deps/jq/sig/v1.7rc1/jq-linux-mipsr6.asc +16 -0
- package/deps/jq/sig/v1.7rc1/jq-linux-mipsr6el.asc +16 -0
- package/deps/jq/sig/v1.7rc1/jq-linux-powerpc.asc +16 -0
- package/deps/jq/sig/v1.7rc1/jq-linux-ppc64el.asc +16 -0
- package/deps/jq/sig/v1.7rc1/jq-linux-riscv64.asc +16 -0
- package/deps/jq/sig/v1.7rc1/jq-linux-s390x.asc +16 -0
- package/deps/jq/sig/v1.7rc1/jq-macos-amd64.asc +16 -0
- package/deps/jq/sig/v1.7rc1/jq-macos-arm64.asc +16 -0
- package/deps/jq/sig/v1.7rc1/jq-windows-amd64.exe.asc +16 -0
- package/deps/jq/sig/v1.7rc1/jq-windows-i386.exe.asc +16 -0
- package/deps/jq/sig/v1.7rc1/sha256sum.txt +23 -0
- package/deps/jq/sig/v1.7rc2/jq-1.7rc2.tar.gz.asc +16 -0
- package/deps/jq/sig/v1.7rc2/jq-1.7rc2.zip.asc +16 -0
- package/deps/jq/sig/v1.7rc2/jq-linux-amd64.asc +16 -0
- package/deps/jq/sig/v1.7rc2/jq-linux-arm64.asc +16 -0
- package/deps/jq/sig/v1.7rc2/jq-linux-armel.asc +16 -0
- package/deps/jq/sig/v1.7rc2/jq-linux-armhf.asc +16 -0
- package/deps/jq/sig/v1.7rc2/jq-linux-i386.asc +16 -0
- package/deps/jq/sig/v1.7rc2/jq-linux-mips.asc +16 -0
- package/deps/jq/sig/v1.7rc2/jq-linux-mips64.asc +16 -0
- package/deps/jq/sig/v1.7rc2/jq-linux-mips64el.asc +16 -0
- package/deps/jq/sig/v1.7rc2/jq-linux-mips64r6.asc +16 -0
- package/deps/jq/sig/v1.7rc2/jq-linux-mips64r6el.asc +16 -0
- package/deps/jq/sig/v1.7rc2/jq-linux-mipsel.asc +16 -0
- package/deps/jq/sig/v1.7rc2/jq-linux-mipsr6.asc +16 -0
- package/deps/jq/sig/v1.7rc2/jq-linux-mipsr6el.asc +16 -0
- package/deps/jq/sig/v1.7rc2/jq-linux-powerpc.asc +16 -0
- package/deps/jq/sig/v1.7rc2/jq-linux-ppc64el.asc +16 -0
- package/deps/jq/sig/v1.7rc2/jq-linux-riscv64.asc +16 -0
- package/deps/jq/sig/v1.7rc2/jq-linux-s390x.asc +16 -0
- package/deps/jq/sig/v1.7rc2/jq-macos-amd64.asc +16 -0
- package/deps/jq/sig/v1.7rc2/jq-macos-arm64.asc +16 -0
- package/deps/jq/sig/v1.7rc2/jq-windows-amd64.exe.asc +16 -0
- package/deps/jq/sig/v1.7rc2/jq-windows-i386.exe.asc +16 -0
- package/deps/jq/sig/v1.7rc2/sha256sum.txt +23 -0
- package/deps/jq/src/builtin.c +537 -343
- package/deps/jq/src/builtin.h +18 -0
- package/deps/jq/src/builtin.jq +116 -143
- package/deps/jq/src/bytecode.h +8 -4
- package/deps/jq/src/compile.c +157 -143
- package/deps/jq/src/compile.h +3 -4
- package/deps/jq/src/decNumber/ICU-license.html +45 -0
- package/deps/jq/src/decNumber/decBasic.c +3908 -0
- package/deps/jq/src/decNumber/decCommon.c +1835 -0
- package/deps/jq/src/decNumber/decContext.c +437 -0
- package/deps/jq/src/decNumber/decContext.h +254 -0
- package/deps/jq/src/decNumber/decDPD.h +1185 -0
- package/deps/jq/src/decNumber/decDouble.c +140 -0
- package/deps/jq/src/decNumber/decDouble.h +155 -0
- package/deps/jq/src/decNumber/decNumber.c +8143 -0
- package/deps/jq/src/decNumber/decNumber.h +182 -0
- package/deps/jq/src/decNumber/decNumberLocal.h +757 -0
- package/deps/jq/src/decNumber/decPacked.c +220 -0
- package/deps/jq/src/decNumber/decPacked.h +52 -0
- package/deps/jq/src/decNumber/decQuad.c +135 -0
- package/deps/jq/src/decNumber/decQuad.h +177 -0
- package/deps/jq/src/decNumber/decSingle.c +71 -0
- package/deps/jq/src/decNumber/decSingle.h +86 -0
- package/deps/jq/src/decNumber/decimal128.c +553 -0
- package/deps/jq/src/decNumber/decimal128.h +81 -0
- package/deps/jq/src/decNumber/decimal32.c +476 -0
- package/deps/jq/src/decNumber/decimal32.h +81 -0
- package/deps/jq/src/decNumber/decimal64.c +839 -0
- package/deps/jq/src/decNumber/decimal64.h +83 -0
- package/deps/jq/src/decNumber/decnumber.pdf +0 -0
- package/deps/jq/src/decNumber/example1.c +38 -0
- package/deps/jq/src/decNumber/example2.c +52 -0
- package/deps/jq/src/decNumber/example3.c +64 -0
- package/deps/jq/src/decNumber/example4.c +61 -0
- package/deps/jq/src/decNumber/example5.c +36 -0
- package/deps/jq/src/decNumber/example6.c +61 -0
- package/deps/jq/src/decNumber/example7.c +35 -0
- package/deps/jq/src/decNumber/example8.c +39 -0
- package/deps/jq/src/decNumber/readme.txt +81 -0
- package/deps/jq/src/exec_stack.h +5 -3
- package/deps/jq/src/execute.c +126 -44
- package/deps/jq/src/inject_errors.c +0 -2
- package/deps/jq/src/jq.h +10 -1
- package/deps/jq/src/jq_test.c +222 -11
- package/deps/jq/src/jv.c +807 -176
- package/deps/jq/src/jv.h +22 -1
- package/deps/jq/src/jv_alloc.c +33 -26
- package/deps/jq/src/jv_alloc.h +0 -11
- package/deps/jq/src/jv_aux.c +153 -67
- package/deps/jq/src/jv_dtoa.c +12 -2
- package/deps/jq/src/jv_dtoa_tsd.c +51 -0
- package/deps/jq/src/jv_dtoa_tsd.h +4 -0
- package/deps/jq/src/jv_parse.c +70 -15
- package/deps/jq/src/jv_print.c +56 -60
- package/deps/jq/src/jv_private.h +7 -0
- package/deps/jq/src/jv_thread.h +76 -0
- package/deps/jq/src/jv_unicode.c +18 -0
- package/deps/jq/src/jv_unicode.h +2 -0
- package/deps/jq/src/lexer.c +782 -543
- package/deps/jq/src/lexer.h +438 -64
- package/deps/jq/src/lexer.l +10 -3
- package/deps/jq/src/libm.h +16 -6
- package/deps/jq/src/linker.c +97 -40
- package/deps/jq/src/locfile.c +2 -1
- package/deps/jq/src/main.c +384 -336
- package/deps/jq/src/opcode_list.h +5 -2
- package/deps/jq/src/parser.c +2260 -1898
- package/deps/jq/src/parser.h +115 -98
- package/deps/jq/src/parser.y +124 -89
- package/deps/jq/src/util.c +854 -55
- package/deps/jq/src/util.h +6 -4
- package/deps/jq/tests/jq.test +762 -26
- package/deps/jq/tests/jq_fuzz_compile.c +27 -0
- package/deps/jq/tests/jq_fuzz_execute.cpp +42 -0
- package/deps/jq/tests/jq_fuzz_fixed.cpp +297 -0
- package/deps/jq/tests/jq_fuzz_load_file.c +28 -0
- package/deps/jq/tests/jq_fuzz_parse.c +21 -0
- package/deps/jq/tests/jq_fuzz_parse_extended.c +36 -0
- package/deps/jq/tests/jq_fuzz_parse_stream.c +21 -0
- package/deps/jq/tests/local.supp +14 -0
- package/deps/jq/tests/man.test +979 -0
- package/deps/jq/tests/manonig.test +76 -0
- package/deps/jq/tests/manonigtest +5 -0
- package/deps/jq/tests/mantest +1 -2
- package/deps/jq/tests/modules/home2/.jq/g.jq +1 -0
- package/deps/jq/tests/modules/shadow1.jq +2 -0
- package/deps/jq/tests/modules/shadow2.jq +1 -0
- package/deps/jq/tests/modules/test_bind_order0.jq +1 -0
- package/deps/jq/tests/modules/test_bind_order1.jq +1 -1
- package/deps/jq/tests/modules/test_bind_order2.jq +0 -1
- package/deps/jq/tests/no-main-program.jq +1 -0
- package/deps/jq/tests/onig.test +77 -2
- package/deps/jq/tests/setup +7 -2
- package/deps/jq/tests/shtest +478 -59
- package/deps/jq/tests/uri.test +38 -0
- package/deps/jq/tests/uritest +5 -0
- package/deps/jq/tests/yes-main-program.jq +2 -0
- package/lib/index.js +3 -0
- package/lib/jq.js +15 -1
- package/lib/templateAsync.js +137 -0
- package/package.json +7 -7
- package/src/binding.cc +623 -146
- package/src/binding.h +3 -4
- package/test/santiy-async.test.js +171 -0
- package/test/santiy.test.js +2 -2
- package/test/template-async.test.js +182 -0
- package/test/template.test.js +3 -3
- package/deps/jq/.travis.yml +0 -202
- package/deps/jq/NEWS +0 -89
- package/deps/jq/appveyor.yml +0 -53
- package/deps/jq/docs/Gemfile +0 -7
- package/deps/jq/docs/Gemfile.lock +0 -63
- package/deps/jq/docs/Rakefile +0 -24
- package/deps/jq/docs/Rakefile.manual +0 -49
- package/deps/jq/docs/Rakefile.website +0 -76
- package/deps/jq/docs/content/1.tutorial/default.yml +0 -327
- package/deps/jq/docs/content/2.download/default.yml +0 -193
- package/deps/jq/docs/content/index/index.yml +0 -73
- package/deps/jq/docs/public/css/base.scss +0 -181
- package/deps/jq/docs/public/jq.png +0 -0
- package/deps/jq/docs/site.yml +0 -9
- package/deps/jq/docs/templates/default.liquid +0 -34
- package/deps/jq/docs/templates/index.liquid +0 -73
- package/deps/jq/docs/templates/manual.liquid +0 -99
- package/deps/jq/docs/templates/shared/_footer.liquid +0 -10
- package/deps/jq/docs/templates/shared/_head.liquid +0 -17
- package/deps/jq/docs/templates/shared/_navbar.liquid +0 -27
- package/deps/jq/modules/oniguruma/README.ja +0 -195
- package/deps/jq/modules/oniguruma/cmake/dist.cmake +0 -321
- package/deps/jq/modules/oniguruma/contributed/libfuzzer-onig.cpp +0 -31
- package/deps/jq/modules/oniguruma/dist.info +0 -10
- package/deps/jq/modules/oniguruma/src/unicode-7.0/unicode_fold1_key.c +0 -2250
- package/deps/jq/modules/oniguruma/src/unicode-7.0/unicode_fold2_key.c +0 -203
- package/deps/jq/modules/oniguruma/src/unicode-7.0/unicode_fold3_key.c +0 -113
- package/deps/jq/modules/oniguruma/src/unicode-7.0/unicode_fold_data.c +0 -1225
- package/deps/jq/modules/oniguruma/src/unicode-7.0/unicode_property_data.c +0 -24742
- package/deps/jq/modules/oniguruma/src/unicode-7.0/unicode_property_data_posix.c +0 -4846
- package/deps/jq/modules/oniguruma/src/unicode-7.0/unicode_unfold_key.c +0 -2571
- /package/deps/jq/sig/{jq-release.key → jq-release-old.key} +0 -0
- /package/deps/jq/tests/modules/{.jq → home1/.jq} +0 -0
package/deps/jq/src/jv.c
CHANGED
|
@@ -1,3 +1,35 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Portions Copyright (c) 2016 Kungliga Tekniska Högskolan
|
|
3
|
+
* (Royal Institute of Technology, Stockholm, Sweden).
|
|
4
|
+
* All rights reserved.
|
|
5
|
+
*
|
|
6
|
+
* Redistribution and use in source and binary forms, with or without
|
|
7
|
+
* modification, are permitted provided that the following conditions
|
|
8
|
+
* are met:
|
|
9
|
+
*
|
|
10
|
+
* 1. Redistributions of source code must retain the above copyright
|
|
11
|
+
* notice, this list of conditions and the following disclaimer.
|
|
12
|
+
*
|
|
13
|
+
* 2. Redistributions in binary form must reproduce the above copyright
|
|
14
|
+
* notice, this list of conditions and the following disclaimer in the
|
|
15
|
+
* documentation and/or other materials provided with the distribution.
|
|
16
|
+
*
|
|
17
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
18
|
+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
19
|
+
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
20
|
+
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
21
|
+
* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
|
22
|
+
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
23
|
+
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
24
|
+
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
25
|
+
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
26
|
+
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
27
|
+
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
|
28
|
+
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
29
|
+
*
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
|
|
1
33
|
#include <stdint.h>
|
|
2
34
|
#include <stddef.h>
|
|
3
35
|
#include <assert.h>
|
|
@@ -7,6 +39,7 @@
|
|
|
7
39
|
#include <stdarg.h>
|
|
8
40
|
#include <limits.h>
|
|
9
41
|
#include <math.h>
|
|
42
|
+
#include <float.h>
|
|
10
43
|
|
|
11
44
|
#include "jv_alloc.h"
|
|
12
45
|
#include "jv.h"
|
|
@@ -37,14 +70,33 @@ static int jvp_refcnt_unshared(jv_refcnt* c) {
|
|
|
37
70
|
return c->count == 1;
|
|
38
71
|
}
|
|
39
72
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
73
|
+
#define KIND_MASK 0xF
|
|
74
|
+
#define PFLAGS_MASK 0xF0
|
|
75
|
+
#define PTYPE_MASK 0x70
|
|
76
|
+
|
|
77
|
+
typedef enum {
|
|
78
|
+
JVP_PAYLOAD_NONE = 0,
|
|
79
|
+
JVP_PAYLOAD_ALLOCATED = 0x80,
|
|
80
|
+
} payload_flags;
|
|
81
|
+
|
|
82
|
+
#define JVP_MAKE_PFLAGS(ptype, allocated) ((((ptype) << 4) & PTYPE_MASK) | ((allocated) ? JVP_PAYLOAD_ALLOCATED : 0))
|
|
83
|
+
#define JVP_MAKE_FLAGS(kind, pflags) ((kind & KIND_MASK) | (pflags & PFLAGS_MASK))
|
|
84
|
+
|
|
85
|
+
#define JVP_FLAGS(j) ((j).kind_flags)
|
|
86
|
+
#define JVP_KIND(j) (JVP_FLAGS(j) & KIND_MASK)
|
|
43
87
|
|
|
44
|
-
#define
|
|
88
|
+
#define JVP_HAS_FLAGS(j, flags) (JVP_FLAGS(j) == flags)
|
|
89
|
+
#define JVP_HAS_KIND(j, kind) (JVP_KIND(j) == kind)
|
|
90
|
+
|
|
91
|
+
#define JVP_IS_ALLOCATED(j) (j.kind_flags & JVP_PAYLOAD_ALLOCATED)
|
|
92
|
+
|
|
93
|
+
#define JVP_FLAGS_NULL JVP_MAKE_FLAGS(JV_KIND_NULL, JVP_PAYLOAD_NONE)
|
|
94
|
+
#define JVP_FLAGS_INVALID JVP_MAKE_FLAGS(JV_KIND_INVALID, JVP_PAYLOAD_NONE)
|
|
95
|
+
#define JVP_FLAGS_FALSE JVP_MAKE_FLAGS(JV_KIND_FALSE, JVP_PAYLOAD_NONE)
|
|
96
|
+
#define JVP_FLAGS_TRUE JVP_MAKE_FLAGS(JV_KIND_TRUE, JVP_PAYLOAD_NONE)
|
|
45
97
|
|
|
46
98
|
jv_kind jv_get_kind(jv x) {
|
|
47
|
-
return x
|
|
99
|
+
return JVP_KIND(x);
|
|
48
100
|
}
|
|
49
101
|
|
|
50
102
|
const char* jv_kind_name(jv_kind k) {
|
|
@@ -62,10 +114,10 @@ const char* jv_kind_name(jv_kind k) {
|
|
|
62
114
|
return "<unknown>";
|
|
63
115
|
}
|
|
64
116
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
117
|
+
const jv JV_NULL = {JVP_FLAGS_NULL, 0, 0, 0, {0}};
|
|
118
|
+
const jv JV_INVALID = {JVP_FLAGS_INVALID, 0, 0, 0, {0}};
|
|
119
|
+
const jv JV_FALSE = {JVP_FLAGS_FALSE, 0, 0, 0, {0}};
|
|
120
|
+
const jv JV_TRUE = {JVP_FLAGS_TRUE, 0, 0, 0, {0}};
|
|
69
121
|
|
|
70
122
|
jv jv_true() {
|
|
71
123
|
return JV_TRUE;
|
|
@@ -87,19 +139,19 @@ jv jv_bool(int x) {
|
|
|
87
139
|
* Invalid objects, with optional error messages
|
|
88
140
|
*/
|
|
89
141
|
|
|
142
|
+
#define JVP_FLAGS_INVALID_MSG JVP_MAKE_FLAGS(JV_KIND_INVALID, JVP_PAYLOAD_ALLOCATED)
|
|
143
|
+
|
|
90
144
|
typedef struct {
|
|
91
145
|
jv_refcnt refcnt;
|
|
92
146
|
jv errmsg;
|
|
93
147
|
} jvp_invalid;
|
|
94
148
|
|
|
95
149
|
jv jv_invalid_with_msg(jv err) {
|
|
96
|
-
if (jv_get_kind(err) == JV_KIND_NULL)
|
|
97
|
-
return JV_INVALID;
|
|
98
150
|
jvp_invalid* i = jv_mem_alloc(sizeof(jvp_invalid));
|
|
99
151
|
i->refcnt = JV_REFCNT_INIT;
|
|
100
152
|
i->errmsg = err;
|
|
101
153
|
|
|
102
|
-
jv x = {
|
|
154
|
+
jv x = {JVP_FLAGS_INVALID_MSG, 0, 0, 0, {&i->refcnt}};
|
|
103
155
|
return x;
|
|
104
156
|
}
|
|
105
157
|
|
|
@@ -108,26 +160,30 @@ jv jv_invalid() {
|
|
|
108
160
|
}
|
|
109
161
|
|
|
110
162
|
jv jv_invalid_get_msg(jv inv) {
|
|
111
|
-
assert(
|
|
163
|
+
assert(JVP_HAS_KIND(inv, JV_KIND_INVALID));
|
|
164
|
+
|
|
112
165
|
jv x;
|
|
113
|
-
if (inv
|
|
114
|
-
x = jv_null();
|
|
115
|
-
else
|
|
166
|
+
if (JVP_HAS_FLAGS(inv, JVP_FLAGS_INVALID_MSG)) {
|
|
116
167
|
x = jv_copy(((jvp_invalid*)inv.u.ptr)->errmsg);
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
x = jv_null();
|
|
171
|
+
}
|
|
172
|
+
|
|
117
173
|
jv_free(inv);
|
|
118
174
|
return x;
|
|
119
175
|
}
|
|
120
176
|
|
|
121
177
|
int jv_invalid_has_msg(jv inv) {
|
|
122
|
-
|
|
123
|
-
int r =
|
|
124
|
-
jv_free(
|
|
178
|
+
assert(JVP_HAS_KIND(inv, JV_KIND_INVALID));
|
|
179
|
+
int r = JVP_HAS_FLAGS(inv, JVP_FLAGS_INVALID_MSG);
|
|
180
|
+
jv_free(inv);
|
|
125
181
|
return r;
|
|
126
182
|
}
|
|
127
183
|
|
|
128
184
|
static void jvp_invalid_free(jv x) {
|
|
129
|
-
assert(
|
|
130
|
-
if (x
|
|
185
|
+
assert(JVP_HAS_KIND(x, JV_KIND_INVALID));
|
|
186
|
+
if (JVP_HAS_FLAGS(x, JVP_FLAGS_INVALID_MSG) && jvp_refcnt_dec(x.u.ptr)) {
|
|
131
187
|
jv_free(((jvp_invalid*)x.u.ptr)->errmsg);
|
|
132
188
|
jv_mem_free(x.u.ptr);
|
|
133
189
|
}
|
|
@@ -137,26 +193,584 @@ static void jvp_invalid_free(jv x) {
|
|
|
137
193
|
* Numbers
|
|
138
194
|
*/
|
|
139
195
|
|
|
196
|
+
#ifdef USE_DECNUM
|
|
197
|
+
#include "jv_dtoa.h"
|
|
198
|
+
#include "jv_dtoa_tsd.h"
|
|
199
|
+
|
|
200
|
+
// we will manage the space for the struct
|
|
201
|
+
#define DECNUMDIGITS 1
|
|
202
|
+
#include "decNumber/decNumber.h"
|
|
203
|
+
|
|
204
|
+
enum {
|
|
205
|
+
JVP_NUMBER_NATIVE = 0,
|
|
206
|
+
JVP_NUMBER_DECIMAL = 1
|
|
207
|
+
};
|
|
208
|
+
|
|
209
|
+
#define JV_NUMBER_SIZE_INIT (0)
|
|
210
|
+
#define JV_NUMBER_SIZE_CONVERTED (1)
|
|
211
|
+
|
|
212
|
+
#define JVP_FLAGS_NUMBER_NATIVE JVP_MAKE_FLAGS(JV_KIND_NUMBER, JVP_MAKE_PFLAGS(JVP_NUMBER_NATIVE, 0))
|
|
213
|
+
#define JVP_FLAGS_NUMBER_LITERAL JVP_MAKE_FLAGS(JV_KIND_NUMBER, JVP_MAKE_PFLAGS(JVP_NUMBER_DECIMAL, 1))
|
|
214
|
+
|
|
215
|
+
// the decimal precision of binary double
|
|
216
|
+
#define DEC_NUMBER_DOUBLE_PRECISION (17)
|
|
217
|
+
#define DEC_NUMBER_STRING_GUARD (14)
|
|
218
|
+
#define DEC_NUMBER_DOUBLE_EXTRA_UNITS ((DEC_NUMBER_DOUBLE_PRECISION - DECNUMDIGITS + DECDPUN - 1)/DECDPUN)
|
|
219
|
+
|
|
220
|
+
#include "jv_thread.h"
|
|
221
|
+
#ifdef WIN32
|
|
222
|
+
#ifndef __MINGW32__
|
|
223
|
+
/* Copied from Heimdal: thread-specific keys; see lib/base/dll.c in Heimdal */
|
|
224
|
+
|
|
225
|
+
/*
|
|
226
|
+
* This is an implementation of thread-specific storage with
|
|
227
|
+
* destructors. WIN32 doesn't quite have this. Instead it has
|
|
228
|
+
* DllMain(), an entry point in every DLL that gets called to notify the
|
|
229
|
+
* DLL of thread/process "attach"/"detach" events.
|
|
230
|
+
*
|
|
231
|
+
* We use __thread (or __declspec(thread)) for the thread-local itself
|
|
232
|
+
* and DllMain() DLL_THREAD_DETACH events to drive destruction of
|
|
233
|
+
* thread-local values.
|
|
234
|
+
*
|
|
235
|
+
* When building in maintainer mode on non-Windows pthread systems this
|
|
236
|
+
* uses a single pthread key instead to implement multiple keys. This
|
|
237
|
+
* keeps the code from rotting when modified by non-Windows developers.
|
|
238
|
+
*/
|
|
239
|
+
|
|
240
|
+
/* Logical array of keys that grows lock-lessly */
|
|
241
|
+
typedef struct tls_keys tls_keys;
|
|
242
|
+
struct tls_keys {
|
|
243
|
+
void (**keys_dtors)(void *); /* array of destructors */
|
|
244
|
+
size_t keys_start_idx; /* index of first destructor */
|
|
245
|
+
size_t keys_num;
|
|
246
|
+
tls_keys *keys_next;
|
|
247
|
+
};
|
|
248
|
+
|
|
249
|
+
/*
|
|
250
|
+
* Well, not quite locklessly. We need synchronization primitives to do
|
|
251
|
+
* this locklessly. An atomic CAS will do.
|
|
252
|
+
*/
|
|
253
|
+
static pthread_mutex_t tls_key_defs_lock = PTHREAD_MUTEX_INITIALIZER;
|
|
254
|
+
static tls_keys *tls_key_defs;
|
|
255
|
+
|
|
256
|
+
/* Logical array of values (per-thread; no locking needed here) */
|
|
257
|
+
struct tls_values {
|
|
258
|
+
void **values; /* realloc()ed */
|
|
259
|
+
size_t values_num;
|
|
260
|
+
};
|
|
261
|
+
|
|
262
|
+
#ifdef _MSC_VER
|
|
263
|
+
static __declspec(thread) struct nomem_handler nomem_handler;
|
|
264
|
+
#else
|
|
265
|
+
static __thread struct tls_values values;
|
|
266
|
+
#endif
|
|
267
|
+
|
|
268
|
+
#define DEAD_KEY ((void *)8)
|
|
269
|
+
|
|
270
|
+
static void
|
|
271
|
+
w32_service_thread_detach(void *unused)
|
|
272
|
+
{
|
|
273
|
+
tls_keys *key_defs;
|
|
274
|
+
void (*dtor)(void*);
|
|
275
|
+
size_t i;
|
|
276
|
+
|
|
277
|
+
pthread_mutex_lock(&tls_key_defs_lock);
|
|
278
|
+
key_defs = tls_key_defs;
|
|
279
|
+
pthread_mutex_unlock(&tls_key_defs_lock);
|
|
280
|
+
|
|
281
|
+
if (key_defs == NULL)
|
|
282
|
+
return;
|
|
283
|
+
|
|
284
|
+
for (i = 0; i < values.values_num; i++) {
|
|
285
|
+
assert(i >= key_defs->keys_start_idx);
|
|
286
|
+
if (i >= key_defs->keys_start_idx + key_defs->keys_num) {
|
|
287
|
+
pthread_mutex_lock(&tls_key_defs_lock);
|
|
288
|
+
key_defs = key_defs->keys_next;
|
|
289
|
+
pthread_mutex_unlock(&tls_key_defs_lock);
|
|
290
|
+
|
|
291
|
+
assert(key_defs != NULL);
|
|
292
|
+
assert(i >= key_defs->keys_start_idx);
|
|
293
|
+
assert(i < key_defs->keys_start_idx + key_defs->keys_num);
|
|
294
|
+
}
|
|
295
|
+
dtor = key_defs->keys_dtors[i - key_defs->keys_start_idx];
|
|
296
|
+
if (values.values[i] != NULL && dtor != NULL && dtor != DEAD_KEY)
|
|
297
|
+
dtor(values.values[i]);
|
|
298
|
+
values.values[i] = NULL;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
extern void jv_tsd_dtoa_ctx_init();
|
|
303
|
+
extern void jv_tsd_dtoa_ctx_fini();
|
|
304
|
+
void jv_tsd_dec_ctx_fini();
|
|
305
|
+
void jv_tsd_dec_ctx_init();
|
|
306
|
+
|
|
307
|
+
BOOL WINAPI DllMain(HINSTANCE hinstDLL,
|
|
308
|
+
DWORD fdwReason,
|
|
309
|
+
LPVOID lpvReserved)
|
|
310
|
+
{
|
|
311
|
+
switch (fdwReason) {
|
|
312
|
+
case DLL_PROCESS_ATTACH:
|
|
313
|
+
/*create_pt_key();*/
|
|
314
|
+
jv_tsd_dtoa_ctx_init();
|
|
315
|
+
jv_tsd_dec_ctx_init();
|
|
316
|
+
return TRUE;
|
|
317
|
+
case DLL_PROCESS_DETACH:
|
|
318
|
+
jv_tsd_dtoa_ctx_fini();
|
|
319
|
+
jv_tsd_dec_ctx_fini();
|
|
320
|
+
return TRUE;
|
|
321
|
+
case DLL_THREAD_ATTACH: return 0;
|
|
322
|
+
case DLL_THREAD_DETACH:
|
|
323
|
+
w32_service_thread_detach(NULL);
|
|
324
|
+
return TRUE;
|
|
325
|
+
default: return TRUE;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
int
|
|
330
|
+
pthread_key_create(pthread_key_t *key, void (*dtor)(void *))
|
|
331
|
+
{
|
|
332
|
+
tls_keys *key_defs, *new_key_defs;
|
|
333
|
+
size_t i, k;
|
|
334
|
+
int ret = ENOMEM;
|
|
335
|
+
|
|
336
|
+
pthread_mutex_lock(&tls_key_defs_lock);
|
|
337
|
+
if (tls_key_defs == NULL) {
|
|
338
|
+
/* First key */
|
|
339
|
+
new_key_defs = calloc(1, sizeof(*new_key_defs));
|
|
340
|
+
if (new_key_defs == NULL) {
|
|
341
|
+
pthread_mutex_unlock(&tls_key_defs_lock);
|
|
342
|
+
return ENOMEM;
|
|
343
|
+
}
|
|
344
|
+
new_key_defs->keys_num = 8;
|
|
345
|
+
new_key_defs->keys_dtors = calloc(new_key_defs->keys_num,
|
|
346
|
+
sizeof(*new_key_defs->keys_dtors));
|
|
347
|
+
if (new_key_defs->keys_dtors == NULL) {
|
|
348
|
+
pthread_mutex_unlock(&tls_key_defs_lock);
|
|
349
|
+
free(new_key_defs);
|
|
350
|
+
return ENOMEM;
|
|
351
|
+
}
|
|
352
|
+
tls_key_defs = new_key_defs;
|
|
353
|
+
new_key_defs->keys_dtors[0] = dtor;
|
|
354
|
+
for (i = 1; i < new_key_defs->keys_num; i++)
|
|
355
|
+
new_key_defs->keys_dtors[i] = NULL;
|
|
356
|
+
pthread_mutex_unlock(&tls_key_defs_lock);
|
|
357
|
+
return 0;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
for (key_defs = tls_key_defs;
|
|
361
|
+
key_defs != NULL;
|
|
362
|
+
key_defs = key_defs->keys_next) {
|
|
363
|
+
k = key_defs->keys_start_idx;
|
|
364
|
+
for (i = 0; i < key_defs->keys_num; i++, k++) {
|
|
365
|
+
if (key_defs->keys_dtors[i] == NULL) {
|
|
366
|
+
/* Found free slot; use it */
|
|
367
|
+
key_defs->keys_dtors[i] = dtor;
|
|
368
|
+
*key = k;
|
|
369
|
+
pthread_mutex_unlock(&tls_key_defs_lock);
|
|
370
|
+
return 0;
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
if (key_defs->keys_next != NULL)
|
|
374
|
+
continue;
|
|
375
|
+
|
|
376
|
+
/* Grow the registration array */
|
|
377
|
+
/* XXX DRY */
|
|
378
|
+
new_key_defs = calloc(1, sizeof(*new_key_defs));
|
|
379
|
+
if (new_key_defs == NULL)
|
|
380
|
+
break;
|
|
381
|
+
|
|
382
|
+
new_key_defs->keys_dtors =
|
|
383
|
+
calloc(key_defs->keys_num + key_defs->keys_num / 2,
|
|
384
|
+
sizeof(*new_key_defs->keys_dtors));
|
|
385
|
+
if (new_key_defs->keys_dtors == NULL) {
|
|
386
|
+
free(new_key_defs);
|
|
387
|
+
break;
|
|
388
|
+
}
|
|
389
|
+
new_key_defs->keys_start_idx = key_defs->keys_start_idx +
|
|
390
|
+
key_defs->keys_num;
|
|
391
|
+
new_key_defs->keys_num = key_defs->keys_num + key_defs->keys_num / 2;
|
|
392
|
+
new_key_defs->keys_dtors[i] = dtor;
|
|
393
|
+
for (i = 1; i < new_key_defs->keys_num; i++)
|
|
394
|
+
new_key_defs->keys_dtors[i] = NULL;
|
|
395
|
+
key_defs->keys_next = new_key_defs;
|
|
396
|
+
ret = 0;
|
|
397
|
+
break;
|
|
398
|
+
}
|
|
399
|
+
pthread_mutex_unlock(&tls_key_defs_lock);
|
|
400
|
+
return ret;
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
static void
|
|
404
|
+
key_lookup(pthread_key_t key, tls_keys **kd,
|
|
405
|
+
size_t *dtor_idx, void (**dtor)(void *))
|
|
406
|
+
{
|
|
407
|
+
tls_keys *key_defs;
|
|
408
|
+
|
|
409
|
+
if (kd != NULL)
|
|
410
|
+
*kd = NULL;
|
|
411
|
+
if (dtor_idx != NULL)
|
|
412
|
+
*dtor_idx = 0;
|
|
413
|
+
if (dtor != NULL)
|
|
414
|
+
*dtor = NULL;
|
|
415
|
+
|
|
416
|
+
pthread_mutex_lock(&tls_key_defs_lock);
|
|
417
|
+
key_defs = tls_key_defs;
|
|
418
|
+
pthread_mutex_unlock(&tls_key_defs_lock);
|
|
419
|
+
|
|
420
|
+
while (key_defs != NULL) {
|
|
421
|
+
if (key >= key_defs->keys_start_idx &&
|
|
422
|
+
key < key_defs->keys_start_idx + key_defs->keys_num) {
|
|
423
|
+
if (kd != NULL)
|
|
424
|
+
*kd = key_defs;
|
|
425
|
+
if (dtor_idx != NULL)
|
|
426
|
+
*dtor_idx = key - key_defs->keys_start_idx;
|
|
427
|
+
if (dtor != NULL)
|
|
428
|
+
*dtor = key_defs->keys_dtors[key - key_defs->keys_start_idx];
|
|
429
|
+
return;
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
pthread_mutex_lock(&tls_key_defs_lock);
|
|
433
|
+
key_defs = key_defs->keys_next;
|
|
434
|
+
pthread_mutex_unlock(&tls_key_defs_lock);
|
|
435
|
+
assert(key_defs != NULL);
|
|
436
|
+
assert(key >= key_defs->keys_start_idx);
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
int
|
|
441
|
+
pthread_setspecific(pthread_key_t key, void *value)
|
|
442
|
+
{
|
|
443
|
+
void **new_values;
|
|
444
|
+
size_t new_num;
|
|
445
|
+
void (*dtor)(void *);
|
|
446
|
+
size_t i;
|
|
447
|
+
|
|
448
|
+
key_lookup(key, NULL, NULL, &dtor);
|
|
449
|
+
if (dtor == NULL)
|
|
450
|
+
return EINVAL;
|
|
451
|
+
|
|
452
|
+
if (key >= values.values_num) {
|
|
453
|
+
if (values.values_num == 0) {
|
|
454
|
+
values.values = NULL;
|
|
455
|
+
new_num = 8;
|
|
456
|
+
} else {
|
|
457
|
+
new_num = (values.values_num + values.values_num / 2);
|
|
458
|
+
}
|
|
459
|
+
new_values = realloc(values.values, sizeof(void *) * new_num);
|
|
460
|
+
if (new_values == NULL)
|
|
461
|
+
return ENOMEM;
|
|
462
|
+
for (i = values.values_num; i < new_num; i++)
|
|
463
|
+
new_values[i] = NULL;
|
|
464
|
+
values.values = new_values;
|
|
465
|
+
values.values_num = new_num;
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
assert(key < values.values_num);
|
|
469
|
+
|
|
470
|
+
if (values.values[key] != NULL && dtor != NULL && dtor != DEAD_KEY)
|
|
471
|
+
dtor(values.values[key]);
|
|
472
|
+
|
|
473
|
+
values.values[key] = value;
|
|
474
|
+
return 0;
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
void *
|
|
478
|
+
pthread_getspecific(pthread_key_t key)
|
|
479
|
+
{
|
|
480
|
+
if (key >= values.values_num)
|
|
481
|
+
return NULL;
|
|
482
|
+
return values.values[key];
|
|
483
|
+
}
|
|
484
|
+
#else
|
|
485
|
+
#include <pthread.h>
|
|
486
|
+
#endif
|
|
487
|
+
#else
|
|
488
|
+
#include <pthread.h>
|
|
489
|
+
#endif
|
|
490
|
+
|
|
491
|
+
static pthread_key_t dec_ctx_key;
|
|
492
|
+
static pthread_once_t dec_ctx_once = PTHREAD_ONCE_INIT;
|
|
493
|
+
|
|
494
|
+
#define DEC_CONTEXT() tsd_dec_ctx_get(&dec_ctx_key)
|
|
495
|
+
|
|
496
|
+
// atexit finalizer to clean up the tsd dec contexts if main() exits
|
|
497
|
+
// without having called pthread_exit()
|
|
498
|
+
void jv_tsd_dec_ctx_fini() {
|
|
499
|
+
jv_mem_free(pthread_getspecific(dec_ctx_key));
|
|
500
|
+
pthread_setspecific(dec_ctx_key, NULL);
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
void jv_tsd_dec_ctx_init() {
|
|
504
|
+
if (pthread_key_create(&dec_ctx_key, jv_mem_free) != 0) {
|
|
505
|
+
fprintf(stderr, "error: cannot create thread specific key");
|
|
506
|
+
abort();
|
|
507
|
+
}
|
|
508
|
+
atexit(jv_tsd_dec_ctx_fini);
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
static decContext* tsd_dec_ctx_get(pthread_key_t *key) {
|
|
512
|
+
pthread_once(&dec_ctx_once, jv_tsd_dec_ctx_init); // cannot fail
|
|
513
|
+
decContext *ctx = (decContext*)pthread_getspecific(*key);
|
|
514
|
+
if (ctx) {
|
|
515
|
+
return ctx;
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
ctx = malloc(sizeof(decContext));
|
|
519
|
+
if (ctx) {
|
|
520
|
+
if (key == &dec_ctx_key)
|
|
521
|
+
{
|
|
522
|
+
decContextDefault(ctx, DEC_INIT_BASE);
|
|
523
|
+
// make sure (Int)D2U(rhs->exponent-lhs->exponent) does not overflow
|
|
524
|
+
ctx->digits = MIN(DEC_MAX_DIGITS,
|
|
525
|
+
INT32_MAX - (DECDPUN - 1) - (ctx->emax - ctx->emin - 1));
|
|
526
|
+
ctx->traps = 0; /*no errors*/
|
|
527
|
+
}
|
|
528
|
+
if (pthread_setspecific(*key, ctx) != 0) {
|
|
529
|
+
fprintf(stderr, "error: cannot store thread specific data");
|
|
530
|
+
abort();
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
return ctx;
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
typedef struct {
|
|
537
|
+
jv_refcnt refcnt;
|
|
538
|
+
double num_double;
|
|
539
|
+
char * literal_data;
|
|
540
|
+
decNumber num_decimal; // must be the last field in the structure for memory management
|
|
541
|
+
} jvp_literal_number;
|
|
542
|
+
|
|
543
|
+
typedef struct {
|
|
544
|
+
decNumber number;
|
|
545
|
+
decNumberUnit units[DEC_NUMBER_DOUBLE_EXTRA_UNITS];
|
|
546
|
+
} decNumberDoublePrecision;
|
|
547
|
+
|
|
548
|
+
|
|
549
|
+
static inline int jvp_number_is_literal(jv n) {
|
|
550
|
+
assert(JVP_HAS_KIND(n, JV_KIND_NUMBER));
|
|
551
|
+
return JVP_HAS_FLAGS(n, JVP_FLAGS_NUMBER_LITERAL);
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
static jvp_literal_number* jvp_literal_number_ptr(jv j) {
|
|
555
|
+
assert(JVP_HAS_FLAGS(j, JVP_FLAGS_NUMBER_LITERAL));
|
|
556
|
+
return (jvp_literal_number*)j.u.ptr;
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
static decNumber* jvp_dec_number_ptr(jv j) {
|
|
560
|
+
assert(JVP_HAS_FLAGS(j, JVP_FLAGS_NUMBER_LITERAL));
|
|
561
|
+
return &(((jvp_literal_number*)j.u.ptr)->num_decimal);
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
static jvp_literal_number* jvp_literal_number_alloc(unsigned literal_length) {
|
|
565
|
+
|
|
566
|
+
/* The number of units needed is ceil(DECNUMDIGITS/DECDPUN) */
|
|
567
|
+
int units = ((literal_length+DECDPUN-1)/DECDPUN);
|
|
568
|
+
|
|
569
|
+
jvp_literal_number* n = jv_mem_alloc(
|
|
570
|
+
sizeof(jvp_literal_number)
|
|
571
|
+
+ sizeof(decNumberUnit) * units
|
|
572
|
+
);
|
|
573
|
+
|
|
574
|
+
return n;
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
static jv jvp_literal_number_new(const char * literal) {
|
|
578
|
+
|
|
579
|
+
jvp_literal_number * n = jvp_literal_number_alloc(strlen(literal));
|
|
580
|
+
|
|
581
|
+
n->refcnt = JV_REFCNT_INIT;
|
|
582
|
+
n->literal_data = NULL;
|
|
583
|
+
decContext *ctx = DEC_CONTEXT();
|
|
584
|
+
decContextClearStatus(ctx, DEC_Conversion_syntax);
|
|
585
|
+
decNumberFromString(&n->num_decimal, literal, ctx);
|
|
586
|
+
n->num_double = NAN;
|
|
587
|
+
|
|
588
|
+
if (ctx->status & DEC_Conversion_syntax) {
|
|
589
|
+
jv_mem_free(n);
|
|
590
|
+
return JV_INVALID;
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
jv r = {JVP_FLAGS_NUMBER_LITERAL, 0, 0, JV_NUMBER_SIZE_INIT, {&n->refcnt}};
|
|
594
|
+
return r;
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
static double jvp_literal_number_to_double(jv j) {
|
|
598
|
+
assert(JVP_HAS_FLAGS(j, JVP_FLAGS_NUMBER_LITERAL));
|
|
599
|
+
decContext dblCtx;
|
|
600
|
+
|
|
601
|
+
// init as decimal64 but change digits to allow conversion to binary64 (double)
|
|
602
|
+
decContextDefault(&dblCtx, DEC_INIT_DECIMAL64);
|
|
603
|
+
dblCtx.digits = DEC_NUMBER_DOUBLE_PRECISION;
|
|
604
|
+
|
|
605
|
+
decNumber *p_dec_number = jvp_dec_number_ptr(j);
|
|
606
|
+
decNumberDoublePrecision dec_double;
|
|
607
|
+
char literal[DEC_NUMBER_DOUBLE_PRECISION + DEC_NUMBER_STRING_GUARD + 1];
|
|
608
|
+
|
|
609
|
+
// reduce the number to the shortest possible form
|
|
610
|
+
// that fits into the 64 bit floating point representation
|
|
611
|
+
decNumberReduce(&dec_double.number, p_dec_number, &dblCtx);
|
|
612
|
+
|
|
613
|
+
decNumberToString(&dec_double.number, literal);
|
|
614
|
+
|
|
615
|
+
char *end;
|
|
616
|
+
return jvp_strtod(tsd_dtoa_context_get(), literal, &end);
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
static const char* jvp_literal_number_literal(jv n) {
|
|
620
|
+
assert(JVP_HAS_FLAGS(n, JVP_FLAGS_NUMBER_LITERAL));
|
|
621
|
+
decNumber *pdec = jvp_dec_number_ptr(n);
|
|
622
|
+
jvp_literal_number* plit = jvp_literal_number_ptr(n);
|
|
623
|
+
|
|
624
|
+
if (decNumberIsNaN(pdec)) {
|
|
625
|
+
return "null";
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
if (decNumberIsInfinite(pdec)) {
|
|
629
|
+
// We cannot preserve the literal data of numbers outside the limited
|
|
630
|
+
// range of exponent. Since `decNumberToString` returns "Infinity"
|
|
631
|
+
// (or "-Infinity"), and to reduce stack allocations as possible, we
|
|
632
|
+
// normalize infinities in the callers instead of printing the maximum
|
|
633
|
+
// (or minimum) double here.
|
|
634
|
+
return NULL;
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
if (plit->literal_data == NULL) {
|
|
638
|
+
int len = jvp_dec_number_ptr(n)->digits + 15 /* 14 + NUL */;
|
|
639
|
+
plit->literal_data = jv_mem_alloc(len);
|
|
640
|
+
|
|
641
|
+
// Preserve the actual precision as we have parsed it
|
|
642
|
+
// don't do decNumberTrim(pdec);
|
|
643
|
+
|
|
644
|
+
decNumberToString(pdec, plit->literal_data);
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
return plit->literal_data;
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
int jv_number_has_literal(jv n) {
|
|
651
|
+
assert(JVP_HAS_KIND(n, JV_KIND_NUMBER));
|
|
652
|
+
return JVP_HAS_FLAGS(n, JVP_FLAGS_NUMBER_LITERAL);
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
const char* jv_number_get_literal(jv n) {
|
|
656
|
+
assert(JVP_HAS_KIND(n, JV_KIND_NUMBER));
|
|
657
|
+
|
|
658
|
+
if (JVP_HAS_FLAGS(n, JVP_FLAGS_NUMBER_LITERAL)) {
|
|
659
|
+
return jvp_literal_number_literal(n);
|
|
660
|
+
} else {
|
|
661
|
+
return NULL;
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
jv jv_number_with_literal(const char * literal) {
|
|
666
|
+
return jvp_literal_number_new(literal);
|
|
667
|
+
}
|
|
668
|
+
#endif /* USE_DECNUM */
|
|
669
|
+
|
|
140
670
|
jv jv_number(double x) {
|
|
141
|
-
jv j = {
|
|
671
|
+
jv j = {
|
|
672
|
+
#ifdef USE_DECNUM
|
|
673
|
+
JVP_FLAGS_NUMBER_NATIVE,
|
|
674
|
+
#else
|
|
675
|
+
JV_KIND_NUMBER,
|
|
676
|
+
#endif
|
|
677
|
+
0, 0, 0, {.number = x}
|
|
678
|
+
};
|
|
142
679
|
return j;
|
|
143
680
|
}
|
|
144
681
|
|
|
682
|
+
static void jvp_number_free(jv j) {
|
|
683
|
+
assert(JVP_HAS_KIND(j, JV_KIND_NUMBER));
|
|
684
|
+
#ifdef USE_DECNUM
|
|
685
|
+
if (JVP_HAS_FLAGS(j, JVP_FLAGS_NUMBER_LITERAL) && jvp_refcnt_dec(j.u.ptr)) {
|
|
686
|
+
jvp_literal_number* n = jvp_literal_number_ptr(j);
|
|
687
|
+
if (n->literal_data) {
|
|
688
|
+
jv_mem_free(n->literal_data);
|
|
689
|
+
}
|
|
690
|
+
jv_mem_free(n);
|
|
691
|
+
}
|
|
692
|
+
#endif
|
|
693
|
+
}
|
|
694
|
+
|
|
145
695
|
double jv_number_value(jv j) {
|
|
146
|
-
assert(
|
|
696
|
+
assert(JVP_HAS_KIND(j, JV_KIND_NUMBER));
|
|
697
|
+
#ifdef USE_DECNUM
|
|
698
|
+
if (JVP_HAS_FLAGS(j, JVP_FLAGS_NUMBER_LITERAL)) {
|
|
699
|
+
jvp_literal_number* n = jvp_literal_number_ptr(j);
|
|
700
|
+
|
|
701
|
+
if (j.size != JV_NUMBER_SIZE_CONVERTED) {
|
|
702
|
+
n->num_double = jvp_literal_number_to_double(j);
|
|
703
|
+
j.size = JV_NUMBER_SIZE_CONVERTED;
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
return n->num_double;
|
|
707
|
+
}
|
|
708
|
+
#endif
|
|
147
709
|
return j.u.number;
|
|
148
710
|
}
|
|
149
711
|
|
|
150
712
|
int jv_is_integer(jv j){
|
|
151
|
-
if(
|
|
713
|
+
if (!JVP_HAS_KIND(j, JV_KIND_NUMBER)){
|
|
152
714
|
return 0;
|
|
153
715
|
}
|
|
716
|
+
|
|
154
717
|
double x = jv_number_value(j);
|
|
155
|
-
|
|
718
|
+
|
|
719
|
+
double ipart;
|
|
720
|
+
double fpart = modf(x, &ipart);
|
|
721
|
+
|
|
722
|
+
return fabs(fpart) < DBL_EPSILON;
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
int jvp_number_is_nan(jv n) {
|
|
726
|
+
assert(JVP_HAS_KIND(n, JV_KIND_NUMBER));
|
|
727
|
+
|
|
728
|
+
#ifdef USE_DECNUM
|
|
729
|
+
if (JVP_HAS_FLAGS(n, JVP_FLAGS_NUMBER_LITERAL)) {
|
|
730
|
+
decNumber *pdec = jvp_dec_number_ptr(n);
|
|
731
|
+
return decNumberIsNaN(pdec);
|
|
732
|
+
}
|
|
733
|
+
#endif
|
|
734
|
+
return n.u.number != n.u.number;
|
|
735
|
+
}
|
|
736
|
+
|
|
737
|
+
int jvp_number_cmp(jv a, jv b) {
|
|
738
|
+
assert(JVP_HAS_KIND(a, JV_KIND_NUMBER));
|
|
739
|
+
assert(JVP_HAS_KIND(b, JV_KIND_NUMBER));
|
|
740
|
+
|
|
741
|
+
#ifdef USE_DECNUM
|
|
742
|
+
if (JVP_HAS_FLAGS(a, JVP_FLAGS_NUMBER_LITERAL) && JVP_HAS_FLAGS(b, JVP_FLAGS_NUMBER_LITERAL)) {
|
|
743
|
+
struct {
|
|
744
|
+
decNumber number;
|
|
745
|
+
decNumberUnit units[1];
|
|
746
|
+
} res;
|
|
747
|
+
|
|
748
|
+
decNumberCompare(&res.number,
|
|
749
|
+
jvp_dec_number_ptr(a),
|
|
750
|
+
jvp_dec_number_ptr(b),
|
|
751
|
+
DEC_CONTEXT()
|
|
752
|
+
);
|
|
753
|
+
if (decNumberIsZero(&res.number)) {
|
|
754
|
+
return 0;
|
|
755
|
+
} else if (decNumberIsNegative(&res.number)) {
|
|
756
|
+
return -1;
|
|
757
|
+
} else {
|
|
758
|
+
return 1;
|
|
759
|
+
}
|
|
760
|
+
}
|
|
761
|
+
#endif
|
|
762
|
+
double da = jv_number_value(a), db = jv_number_value(b);
|
|
763
|
+
if (da < db) {
|
|
764
|
+
return -1;
|
|
765
|
+
} else if (da == db) {
|
|
156
766
|
return 0;
|
|
767
|
+
} else {
|
|
768
|
+
return 1;
|
|
157
769
|
}
|
|
770
|
+
}
|
|
158
771
|
|
|
159
|
-
|
|
772
|
+
static int jvp_number_equal(jv a, jv b) {
|
|
773
|
+
return jvp_number_cmp(a, b) == 0;
|
|
160
774
|
}
|
|
161
775
|
|
|
162
776
|
/*
|
|
@@ -164,6 +778,7 @@ int jv_is_integer(jv j){
|
|
|
164
778
|
*/
|
|
165
779
|
|
|
166
780
|
#define ARRAY_SIZE_ROUND_UP(n) (((n)*3)/2)
|
|
781
|
+
#define JVP_FLAGS_ARRAY JVP_MAKE_FLAGS(JV_KIND_ARRAY, JVP_PAYLOAD_ALLOCATED)
|
|
167
782
|
|
|
168
783
|
static int imax(int a, int b) {
|
|
169
784
|
if (a>b) return a;
|
|
@@ -178,7 +793,7 @@ typedef struct {
|
|
|
178
793
|
} jvp_array;
|
|
179
794
|
|
|
180
795
|
static jvp_array* jvp_array_ptr(jv a) {
|
|
181
|
-
assert(
|
|
796
|
+
assert(JVP_HAS_KIND(a, JV_KIND_ARRAY));
|
|
182
797
|
return (jvp_array*)a.u.ptr;
|
|
183
798
|
}
|
|
184
799
|
|
|
@@ -191,12 +806,12 @@ static jvp_array* jvp_array_alloc(unsigned size) {
|
|
|
191
806
|
}
|
|
192
807
|
|
|
193
808
|
static jv jvp_array_new(unsigned size) {
|
|
194
|
-
jv r = {
|
|
809
|
+
jv r = {JVP_FLAGS_ARRAY, 0, 0, 0, {&jvp_array_alloc(size)->refcnt}};
|
|
195
810
|
return r;
|
|
196
811
|
}
|
|
197
812
|
|
|
198
813
|
static void jvp_array_free(jv a) {
|
|
199
|
-
assert(
|
|
814
|
+
assert(JVP_HAS_KIND(a, JV_KIND_ARRAY));
|
|
200
815
|
if (jvp_refcnt_dec(a.u.ptr)) {
|
|
201
816
|
jvp_array* array = jvp_array_ptr(a);
|
|
202
817
|
for (int i=0; i<array->length; i++) {
|
|
@@ -207,17 +822,17 @@ static void jvp_array_free(jv a) {
|
|
|
207
822
|
}
|
|
208
823
|
|
|
209
824
|
static int jvp_array_length(jv a) {
|
|
210
|
-
assert(
|
|
825
|
+
assert(JVP_HAS_KIND(a, JV_KIND_ARRAY));
|
|
211
826
|
return a.size;
|
|
212
827
|
}
|
|
213
828
|
|
|
214
829
|
static int jvp_array_offset(jv a) {
|
|
215
|
-
assert(
|
|
830
|
+
assert(JVP_HAS_KIND(a, JV_KIND_ARRAY));
|
|
216
831
|
return a.offset;
|
|
217
832
|
}
|
|
218
833
|
|
|
219
834
|
static jv* jvp_array_read(jv a, int i) {
|
|
220
|
-
assert(
|
|
835
|
+
assert(JVP_HAS_KIND(a, JV_KIND_ARRAY));
|
|
221
836
|
if (i >= 0 && i < jvp_array_length(a)) {
|
|
222
837
|
jvp_array* array = jvp_array_ptr(a);
|
|
223
838
|
assert(i + jvp_array_offset(a) < array->length);
|
|
@@ -254,7 +869,7 @@ static jv* jvp_array_write(jv* a, int i) {
|
|
|
254
869
|
}
|
|
255
870
|
new_array->length = new_length;
|
|
256
871
|
jvp_array_free(*a);
|
|
257
|
-
jv new_jv = {
|
|
872
|
+
jv new_jv = {JVP_FLAGS_ARRAY, 0, 0, new_length, {&new_array->refcnt}};
|
|
258
873
|
*a = new_jv;
|
|
259
874
|
return &new_array->elements[i];
|
|
260
875
|
}
|
|
@@ -285,8 +900,33 @@ static void jvp_clamp_slice_params(int len, int *pstart, int *pend)
|
|
|
285
900
|
if (*pend < *pstart) *pend = *pstart;
|
|
286
901
|
}
|
|
287
902
|
|
|
903
|
+
|
|
904
|
+
static int jvp_array_contains(jv a, jv b) {
|
|
905
|
+
int r = 1;
|
|
906
|
+
jv_array_foreach(b, bi, belem) {
|
|
907
|
+
int ri = 0;
|
|
908
|
+
jv_array_foreach(a, ai, aelem) {
|
|
909
|
+
if (jv_contains(aelem, jv_copy(belem))) {
|
|
910
|
+
ri = 1;
|
|
911
|
+
break;
|
|
912
|
+
}
|
|
913
|
+
}
|
|
914
|
+
jv_free(belem);
|
|
915
|
+
if (!ri) {
|
|
916
|
+
r = 0;
|
|
917
|
+
break;
|
|
918
|
+
}
|
|
919
|
+
}
|
|
920
|
+
return r;
|
|
921
|
+
}
|
|
922
|
+
|
|
923
|
+
|
|
924
|
+
/*
|
|
925
|
+
* Public
|
|
926
|
+
*/
|
|
927
|
+
|
|
288
928
|
static jv jvp_array_slice(jv a, int start, int end) {
|
|
289
|
-
assert(
|
|
929
|
+
assert(JVP_HAS_KIND(a, JV_KIND_ARRAY));
|
|
290
930
|
int len = jvp_array_length(a);
|
|
291
931
|
jvp_clamp_slice_params(len, &start, &end);
|
|
292
932
|
assert(0 <= start && start <= end && end <= len);
|
|
@@ -323,14 +963,14 @@ jv jv_array() {
|
|
|
323
963
|
}
|
|
324
964
|
|
|
325
965
|
int jv_array_length(jv j) {
|
|
326
|
-
assert(
|
|
966
|
+
assert(JVP_HAS_KIND(j, JV_KIND_ARRAY));
|
|
327
967
|
int len = jvp_array_length(j);
|
|
328
968
|
jv_free(j);
|
|
329
969
|
return len;
|
|
330
970
|
}
|
|
331
971
|
|
|
332
972
|
jv jv_array_get(jv j, int idx) {
|
|
333
|
-
assert(
|
|
973
|
+
assert(JVP_HAS_KIND(j, JV_KIND_ARRAY));
|
|
334
974
|
jv* slot = jvp_array_read(j, idx);
|
|
335
975
|
jv val;
|
|
336
976
|
if (slot) {
|
|
@@ -343,7 +983,7 @@ jv jv_array_get(jv j, int idx) {
|
|
|
343
983
|
}
|
|
344
984
|
|
|
345
985
|
jv jv_array_set(jv j, int idx, jv val) {
|
|
346
|
-
assert(
|
|
986
|
+
assert(JVP_HAS_KIND(j, JV_KIND_ARRAY));
|
|
347
987
|
|
|
348
988
|
if (idx < 0)
|
|
349
989
|
idx = jvp_array_length(j) + idx;
|
|
@@ -365,8 +1005,8 @@ jv jv_array_append(jv j, jv val) {
|
|
|
365
1005
|
}
|
|
366
1006
|
|
|
367
1007
|
jv jv_array_concat(jv a, jv b) {
|
|
368
|
-
assert(
|
|
369
|
-
assert(
|
|
1008
|
+
assert(JVP_HAS_KIND(a, JV_KIND_ARRAY));
|
|
1009
|
+
assert(JVP_HAS_KIND(b, JV_KIND_ARRAY));
|
|
370
1010
|
|
|
371
1011
|
// FIXME: could be faster
|
|
372
1012
|
jv_array_foreach(b, i, elem) {
|
|
@@ -377,41 +1017,18 @@ jv jv_array_concat(jv a, jv b) {
|
|
|
377
1017
|
}
|
|
378
1018
|
|
|
379
1019
|
jv jv_array_slice(jv a, int start, int end) {
|
|
380
|
-
assert(
|
|
1020
|
+
assert(JVP_HAS_KIND(a, JV_KIND_ARRAY));
|
|
381
1021
|
// copy/free of a coalesced
|
|
382
1022
|
return jvp_array_slice(a, start, end);
|
|
383
1023
|
}
|
|
384
1024
|
|
|
385
|
-
int jv_array_contains(jv a, jv b) {
|
|
386
|
-
int r = 1;
|
|
387
|
-
jv_array_foreach(b, bi, belem) {
|
|
388
|
-
int ri = 0;
|
|
389
|
-
jv_array_foreach(a, ai, aelem) {
|
|
390
|
-
if (jv_contains(aelem, jv_copy(belem))) {
|
|
391
|
-
ri = 1;
|
|
392
|
-
break;
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
jv_free(belem);
|
|
396
|
-
if (!ri) {
|
|
397
|
-
r = 0;
|
|
398
|
-
break;
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
|
-
jv_free(a);
|
|
402
|
-
jv_free(b);
|
|
403
|
-
return r;
|
|
404
|
-
}
|
|
405
|
-
|
|
406
1025
|
jv jv_array_indexes(jv a, jv b) {
|
|
407
1026
|
jv res = jv_array();
|
|
408
1027
|
int idx = -1;
|
|
409
|
-
|
|
1028
|
+
int alen = jv_array_length(jv_copy(a));
|
|
1029
|
+
for (int ai = 0; ai < alen; ++ai) {
|
|
410
1030
|
jv_array_foreach(b, bi, belem) {
|
|
411
|
-
|
|
412
|
-
// using it
|
|
413
|
-
if ((bi == 0 && !jv_equal(jv_copy(aelem), jv_copy(belem))) ||
|
|
414
|
-
(bi > 0 && !jv_equal(jv_array_get(jv_copy(a), ai + bi), jv_copy(belem))))
|
|
1031
|
+
if (!jv_equal(jv_array_get(jv_copy(a), ai + bi), belem))
|
|
415
1032
|
idx = -1;
|
|
416
1033
|
else if (bi == 0 && idx == -1)
|
|
417
1034
|
idx = ai;
|
|
@@ -425,11 +1042,12 @@ jv jv_array_indexes(jv a, jv b) {
|
|
|
425
1042
|
return res;
|
|
426
1043
|
}
|
|
427
1044
|
|
|
428
|
-
|
|
429
1045
|
/*
|
|
430
1046
|
* Strings (internal helpers)
|
|
431
1047
|
*/
|
|
432
1048
|
|
|
1049
|
+
#define JVP_FLAGS_STRING JVP_MAKE_FLAGS(JV_KIND_STRING, JVP_PAYLOAD_ALLOCATED)
|
|
1050
|
+
|
|
433
1051
|
typedef struct {
|
|
434
1052
|
jv_refcnt refcnt;
|
|
435
1053
|
uint32_t hash;
|
|
@@ -441,7 +1059,7 @@ typedef struct {
|
|
|
441
1059
|
} jvp_string;
|
|
442
1060
|
|
|
443
1061
|
static jvp_string* jvp_string_ptr(jv a) {
|
|
444
|
-
assert(
|
|
1062
|
+
assert(JVP_HAS_KIND(a, JV_KIND_STRING));
|
|
445
1063
|
return (jvp_string*)a.u.ptr;
|
|
446
1064
|
}
|
|
447
1065
|
|
|
@@ -456,14 +1074,13 @@ static jvp_string* jvp_string_alloc(uint32_t size) {
|
|
|
456
1074
|
static jv jvp_string_copy_replace_bad(const char* data, uint32_t length) {
|
|
457
1075
|
const char* end = data + length;
|
|
458
1076
|
const char* i = data;
|
|
459
|
-
const char* cstart;
|
|
460
1077
|
|
|
461
1078
|
uint32_t maxlength = length * 3 + 1; // worst case: all bad bytes, each becomes a 3-byte U+FFFD
|
|
462
1079
|
jvp_string* s = jvp_string_alloc(maxlength);
|
|
463
1080
|
char* out = s->data;
|
|
464
1081
|
int c = 0;
|
|
465
1082
|
|
|
466
|
-
while ((i = jvp_utf8_next(
|
|
1083
|
+
while ((i = jvp_utf8_next(i, end, &c))) {
|
|
467
1084
|
if (c == -1) {
|
|
468
1085
|
c = 0xFFFD; // U+FFFD REPLACEMENT CHARACTER
|
|
469
1086
|
}
|
|
@@ -473,7 +1090,7 @@ static jv jvp_string_copy_replace_bad(const char* data, uint32_t length) {
|
|
|
473
1090
|
length = out - s->data;
|
|
474
1091
|
s->data[length] = 0;
|
|
475
1092
|
s->length_hashed = length << 1;
|
|
476
|
-
jv r = {
|
|
1093
|
+
jv r = {JVP_FLAGS_STRING, 0, 0, 0, {&s->refcnt}};
|
|
477
1094
|
return r;
|
|
478
1095
|
}
|
|
479
1096
|
|
|
@@ -484,7 +1101,7 @@ static jv jvp_string_new(const char* data, uint32_t length) {
|
|
|
484
1101
|
if (data != NULL)
|
|
485
1102
|
memcpy(s->data, data, length);
|
|
486
1103
|
s->data[length] = 0;
|
|
487
|
-
jv r = {
|
|
1104
|
+
jv r = {JVP_FLAGS_STRING, 0, 0, 0, {&s->refcnt}};
|
|
488
1105
|
return r;
|
|
489
1106
|
}
|
|
490
1107
|
|
|
@@ -492,7 +1109,7 @@ static jv jvp_string_empty_new(uint32_t length) {
|
|
|
492
1109
|
jvp_string* s = jvp_string_alloc(length);
|
|
493
1110
|
s->length_hashed = 0;
|
|
494
1111
|
memset(s->data, 0, length);
|
|
495
|
-
jv r = {
|
|
1112
|
+
jv r = {JVP_FLAGS_STRING, 0, 0, 0, {&s->refcnt}};
|
|
496
1113
|
return r;
|
|
497
1114
|
}
|
|
498
1115
|
|
|
@@ -535,7 +1152,7 @@ static jv jvp_string_append(jv string, const char* data, uint32_t len) {
|
|
|
535
1152
|
memcpy(news->data + currlen, data, len);
|
|
536
1153
|
news->data[currlen + len] = 0;
|
|
537
1154
|
jvp_string_free(string);
|
|
538
|
-
jv r = {
|
|
1155
|
+
jv r = {JVP_FLAGS_STRING, 0, 0, 0, {&news->refcnt}};
|
|
539
1156
|
return r;
|
|
540
1157
|
}
|
|
541
1158
|
}
|
|
@@ -583,7 +1200,9 @@ static uint32_t jvp_string_hash(jv jstr) {
|
|
|
583
1200
|
|
|
584
1201
|
switch(len & 3) {
|
|
585
1202
|
case 3: k1 ^= tail[2] << 16;
|
|
1203
|
+
JQ_FALLTHROUGH;
|
|
586
1204
|
case 2: k1 ^= tail[1] << 8;
|
|
1205
|
+
JQ_FALLTHROUGH;
|
|
587
1206
|
case 1: k1 ^= tail[0];
|
|
588
1207
|
k1 *= c1; k1 = rotl32(k1,15); k1 *= c2; h1 ^= k1;
|
|
589
1208
|
}
|
|
@@ -602,9 +1221,10 @@ static uint32_t jvp_string_hash(jv jstr) {
|
|
|
602
1221
|
return h1;
|
|
603
1222
|
}
|
|
604
1223
|
|
|
1224
|
+
|
|
605
1225
|
static int jvp_string_equal(jv a, jv b) {
|
|
606
|
-
assert(
|
|
607
|
-
assert(
|
|
1226
|
+
assert(JVP_HAS_KIND(a, JV_KIND_STRING));
|
|
1227
|
+
assert(JVP_HAS_KIND(b, JV_KIND_STRING));
|
|
608
1228
|
jvp_string* stra = jvp_string_ptr(a);
|
|
609
1229
|
jvp_string* strb = jvp_string_ptr(b);
|
|
610
1230
|
if (jvp_string_length(stra) != jvp_string_length(strb)) return 0;
|
|
@@ -631,14 +1251,14 @@ jv jv_string(const char* str) {
|
|
|
631
1251
|
}
|
|
632
1252
|
|
|
633
1253
|
int jv_string_length_bytes(jv j) {
|
|
634
|
-
assert(
|
|
1254
|
+
assert(JVP_HAS_KIND(j, JV_KIND_STRING));
|
|
635
1255
|
int r = jvp_string_length(jvp_string_ptr(j));
|
|
636
1256
|
jv_free(j);
|
|
637
1257
|
return r;
|
|
638
1258
|
}
|
|
639
1259
|
|
|
640
1260
|
int jv_string_length_codepoints(jv j) {
|
|
641
|
-
assert(
|
|
1261
|
+
assert(JVP_HAS_KIND(j, JV_KIND_STRING));
|
|
642
1262
|
const char* i = jv_string_value(j);
|
|
643
1263
|
const char* end = i + jv_string_length_bytes(jv_copy(j));
|
|
644
1264
|
int c = 0, len = 0;
|
|
@@ -649,19 +1269,27 @@ int jv_string_length_codepoints(jv j) {
|
|
|
649
1269
|
|
|
650
1270
|
|
|
651
1271
|
jv jv_string_indexes(jv j, jv k) {
|
|
652
|
-
assert(
|
|
653
|
-
assert(
|
|
1272
|
+
assert(JVP_HAS_KIND(j, JV_KIND_STRING));
|
|
1273
|
+
assert(JVP_HAS_KIND(k, JV_KIND_STRING));
|
|
654
1274
|
const char *jstr = jv_string_value(j);
|
|
655
1275
|
const char *idxstr = jv_string_value(k);
|
|
656
|
-
const char *p;
|
|
1276
|
+
const char *p, *lp;
|
|
657
1277
|
int jlen = jv_string_length_bytes(jv_copy(j));
|
|
658
1278
|
int idxlen = jv_string_length_bytes(jv_copy(k));
|
|
659
1279
|
jv a = jv_array();
|
|
660
1280
|
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
p
|
|
1281
|
+
if (idxlen != 0) {
|
|
1282
|
+
int n = 0;
|
|
1283
|
+
p = lp = jstr;
|
|
1284
|
+
while ((p = _jq_memmem(p, (jstr + jlen) - p, idxstr, idxlen)) != NULL) {
|
|
1285
|
+
while (lp < p) {
|
|
1286
|
+
lp += jvp_utf8_decode_length(*lp);
|
|
1287
|
+
n++;
|
|
1288
|
+
}
|
|
1289
|
+
|
|
1290
|
+
a = jv_array_append(a, jv_number(n));
|
|
1291
|
+
p++;
|
|
1292
|
+
}
|
|
665
1293
|
}
|
|
666
1294
|
jv_free(j);
|
|
667
1295
|
jv_free(k);
|
|
@@ -669,8 +1297,8 @@ jv jv_string_indexes(jv j, jv k) {
|
|
|
669
1297
|
}
|
|
670
1298
|
|
|
671
1299
|
jv jv_string_split(jv j, jv sep) {
|
|
672
|
-
assert(
|
|
673
|
-
assert(
|
|
1300
|
+
assert(JVP_HAS_KIND(j, JV_KIND_STRING));
|
|
1301
|
+
assert(JVP_HAS_KIND(sep, JV_KIND_STRING));
|
|
674
1302
|
const char *jstr = jv_string_value(j);
|
|
675
1303
|
const char *jend = jstr + jv_string_length_bytes(jv_copy(j));
|
|
676
1304
|
const char *sepstr = jv_string_value(sep);
|
|
@@ -701,7 +1329,7 @@ jv jv_string_split(jv j, jv sep) {
|
|
|
701
1329
|
}
|
|
702
1330
|
|
|
703
1331
|
jv jv_string_explode(jv j) {
|
|
704
|
-
assert(
|
|
1332
|
+
assert(JVP_HAS_KIND(j, JV_KIND_STRING));
|
|
705
1333
|
const char* i = jv_string_value(j);
|
|
706
1334
|
int len = jv_string_length_bytes(jv_copy(j));
|
|
707
1335
|
const char* end = i + len;
|
|
@@ -714,7 +1342,7 @@ jv jv_string_explode(jv j) {
|
|
|
714
1342
|
}
|
|
715
1343
|
|
|
716
1344
|
jv jv_string_implode(jv j) {
|
|
717
|
-
assert(
|
|
1345
|
+
assert(JVP_HAS_KIND(j, JV_KIND_ARRAY));
|
|
718
1346
|
int len = jv_array_length(jv_copy(j));
|
|
719
1347
|
jv s = jv_string_empty(len);
|
|
720
1348
|
int i;
|
|
@@ -723,9 +1351,11 @@ jv jv_string_implode(jv j) {
|
|
|
723
1351
|
|
|
724
1352
|
for (i = 0; i < len; i++) {
|
|
725
1353
|
jv n = jv_array_get(jv_copy(j), i);
|
|
726
|
-
assert(
|
|
1354
|
+
assert(JVP_HAS_KIND(n, JV_KIND_NUMBER));
|
|
727
1355
|
int nv = jv_number_value(n);
|
|
728
|
-
|
|
1356
|
+
jv_free(n);
|
|
1357
|
+
// outside codepoint range or in utf16 surrogate pair range
|
|
1358
|
+
if (nv < 0 || nv > 0x10FFFF || (nv >= 0xD800 && nv <= 0xDFFF))
|
|
729
1359
|
nv = 0xFFFD; // U+FFFD REPLACEMENT CHARACTER
|
|
730
1360
|
s = jv_string_append_codepoint(s, nv);
|
|
731
1361
|
}
|
|
@@ -735,19 +1365,19 @@ jv jv_string_implode(jv j) {
|
|
|
735
1365
|
}
|
|
736
1366
|
|
|
737
1367
|
unsigned long jv_string_hash(jv j) {
|
|
738
|
-
assert(
|
|
1368
|
+
assert(JVP_HAS_KIND(j, JV_KIND_STRING));
|
|
739
1369
|
uint32_t hash = jvp_string_hash(j);
|
|
740
1370
|
jv_free(j);
|
|
741
1371
|
return hash;
|
|
742
1372
|
}
|
|
743
1373
|
|
|
744
1374
|
const char* jv_string_value(jv j) {
|
|
745
|
-
assert(
|
|
1375
|
+
assert(JVP_HAS_KIND(j, JV_KIND_STRING));
|
|
746
1376
|
return jvp_string_ptr(j)->data;
|
|
747
1377
|
}
|
|
748
1378
|
|
|
749
1379
|
jv jv_string_slice(jv j, int start, int end) {
|
|
750
|
-
assert(
|
|
1380
|
+
assert(JVP_HAS_KIND(j, JV_KIND_STRING));
|
|
751
1381
|
const char *s = jv_string_value(j);
|
|
752
1382
|
int len = jv_string_length_bytes(jv_copy(j));
|
|
753
1383
|
int i;
|
|
@@ -858,6 +1488,8 @@ jv jv_string_fmt(const char* fmt, ...) {
|
|
|
858
1488
|
* Objects (internal helpers)
|
|
859
1489
|
*/
|
|
860
1490
|
|
|
1491
|
+
#define JVP_FLAGS_OBJECT JVP_MAKE_FLAGS(JV_KIND_OBJECT, JVP_PAYLOAD_ALLOCATED)
|
|
1492
|
+
|
|
861
1493
|
struct object_slot {
|
|
862
1494
|
int next; /* next slot with same hash, for collisions */
|
|
863
1495
|
uint32_t hash;
|
|
@@ -894,22 +1526,22 @@ static jv jvp_object_new(int size) {
|
|
|
894
1526
|
for (int i=0; i<size*2; i++) {
|
|
895
1527
|
hashbuckets[i] = -1;
|
|
896
1528
|
}
|
|
897
|
-
jv r = {
|
|
1529
|
+
jv r = {JVP_FLAGS_OBJECT, 0, 0, size, {&obj->refcnt}};
|
|
898
1530
|
return r;
|
|
899
1531
|
}
|
|
900
1532
|
|
|
901
1533
|
static jvp_object* jvp_object_ptr(jv o) {
|
|
902
|
-
assert(
|
|
1534
|
+
assert(JVP_HAS_KIND(o, JV_KIND_OBJECT));
|
|
903
1535
|
return (jvp_object*)o.u.ptr;
|
|
904
1536
|
}
|
|
905
1537
|
|
|
906
1538
|
static uint32_t jvp_object_mask(jv o) {
|
|
907
|
-
assert(
|
|
1539
|
+
assert(JVP_HAS_KIND(o, JV_KIND_OBJECT));
|
|
908
1540
|
return (o.size * 2) - 1;
|
|
909
1541
|
}
|
|
910
1542
|
|
|
911
1543
|
static int jvp_object_size(jv o) {
|
|
912
|
-
assert(
|
|
1544
|
+
assert(JVP_HAS_KIND(o, JV_KIND_OBJECT));
|
|
913
1545
|
return o.size;
|
|
914
1546
|
}
|
|
915
1547
|
|
|
@@ -957,7 +1589,7 @@ static struct object_slot* jvp_object_add_slot(jv object, jv key, int* bucket) {
|
|
|
957
1589
|
}
|
|
958
1590
|
|
|
959
1591
|
static jv* jvp_object_read(jv object, jv key) {
|
|
960
|
-
assert(
|
|
1592
|
+
assert(JVP_HAS_KIND(key, JV_KIND_STRING));
|
|
961
1593
|
int* bucket = jvp_object_find_bucket(object, key);
|
|
962
1594
|
struct object_slot* slot = jvp_object_find_slot(object, key, bucket);
|
|
963
1595
|
if (slot == 0) return 0;
|
|
@@ -965,7 +1597,7 @@ static jv* jvp_object_read(jv object, jv key) {
|
|
|
965
1597
|
}
|
|
966
1598
|
|
|
967
1599
|
static void jvp_object_free(jv o) {
|
|
968
|
-
assert(
|
|
1600
|
+
assert(JVP_HAS_KIND(o, JV_KIND_OBJECT));
|
|
969
1601
|
if (jvp_refcnt_dec(o.u.ptr)) {
|
|
970
1602
|
for (int i=0; i<jvp_object_size(o); i++) {
|
|
971
1603
|
struct object_slot* slot = jvp_object_get_slot(o, i);
|
|
@@ -979,7 +1611,7 @@ static void jvp_object_free(jv o) {
|
|
|
979
1611
|
}
|
|
980
1612
|
|
|
981
1613
|
static jv jvp_object_rehash(jv object) {
|
|
982
|
-
assert(
|
|
1614
|
+
assert(JVP_HAS_KIND(object, JV_KIND_OBJECT));
|
|
983
1615
|
assert(jvp_refcnt_unshared(object.u.ptr));
|
|
984
1616
|
int size = jvp_object_size(object);
|
|
985
1617
|
jv new_object = jvp_object_new(size * 2);
|
|
@@ -998,7 +1630,7 @@ static jv jvp_object_rehash(jv object) {
|
|
|
998
1630
|
}
|
|
999
1631
|
|
|
1000
1632
|
static jv jvp_object_unshare(jv object) {
|
|
1001
|
-
assert(
|
|
1633
|
+
assert(JVP_HAS_KIND(object, JV_KIND_OBJECT));
|
|
1002
1634
|
if (jvp_refcnt_unshared(object.u.ptr))
|
|
1003
1635
|
return object;
|
|
1004
1636
|
|
|
@@ -1047,7 +1679,7 @@ static jv* jvp_object_write(jv* object, jv key) {
|
|
|
1047
1679
|
}
|
|
1048
1680
|
|
|
1049
1681
|
static int jvp_object_delete(jv* object, jv key) {
|
|
1050
|
-
assert(
|
|
1682
|
+
assert(JVP_HAS_KIND(key, JV_KIND_STRING));
|
|
1051
1683
|
*object = jvp_object_unshare(*object);
|
|
1052
1684
|
int* bucket = jvp_object_find_bucket(*object, key);
|
|
1053
1685
|
int* prev_ptr = bucket;
|
|
@@ -1091,6 +1723,21 @@ static int jvp_object_equal(jv o1, jv o2) {
|
|
|
1091
1723
|
return len1 == len2;
|
|
1092
1724
|
}
|
|
1093
1725
|
|
|
1726
|
+
static int jvp_object_contains(jv a, jv b) {
|
|
1727
|
+
assert(JVP_HAS_KIND(a, JV_KIND_OBJECT));
|
|
1728
|
+
assert(JVP_HAS_KIND(b, JV_KIND_OBJECT));
|
|
1729
|
+
int r = 1;
|
|
1730
|
+
|
|
1731
|
+
jv_object_foreach(b, key, b_val) {
|
|
1732
|
+
jv a_val = jv_object_get(jv_copy(a), key);
|
|
1733
|
+
|
|
1734
|
+
r = jv_contains(a_val, b_val);
|
|
1735
|
+
|
|
1736
|
+
if (!r) break;
|
|
1737
|
+
}
|
|
1738
|
+
return r;
|
|
1739
|
+
}
|
|
1740
|
+
|
|
1094
1741
|
/*
|
|
1095
1742
|
* Objects (public interface)
|
|
1096
1743
|
*/
|
|
@@ -1100,8 +1747,8 @@ jv jv_object() {
|
|
|
1100
1747
|
}
|
|
1101
1748
|
|
|
1102
1749
|
jv jv_object_get(jv object, jv key) {
|
|
1103
|
-
assert(
|
|
1104
|
-
assert(
|
|
1750
|
+
assert(JVP_HAS_KIND(object, JV_KIND_OBJECT));
|
|
1751
|
+
assert(JVP_HAS_KIND(key, JV_KIND_STRING));
|
|
1105
1752
|
jv* slot = jvp_object_read(object, key);
|
|
1106
1753
|
jv val;
|
|
1107
1754
|
if (slot) {
|
|
@@ -1115,8 +1762,8 @@ jv jv_object_get(jv object, jv key) {
|
|
|
1115
1762
|
}
|
|
1116
1763
|
|
|
1117
1764
|
int jv_object_has(jv object, jv key) {
|
|
1118
|
-
assert(
|
|
1119
|
-
assert(
|
|
1765
|
+
assert(JVP_HAS_KIND(object, JV_KIND_OBJECT));
|
|
1766
|
+
assert(JVP_HAS_KIND(key, JV_KIND_STRING));
|
|
1120
1767
|
jv* slot = jvp_object_read(object, key);
|
|
1121
1768
|
int res = slot ? 1 : 0;
|
|
1122
1769
|
jv_free(object);
|
|
@@ -1125,8 +1772,8 @@ int jv_object_has(jv object, jv key) {
|
|
|
1125
1772
|
}
|
|
1126
1773
|
|
|
1127
1774
|
jv jv_object_set(jv object, jv key, jv value) {
|
|
1128
|
-
assert(
|
|
1129
|
-
assert(
|
|
1775
|
+
assert(JVP_HAS_KIND(object, JV_KIND_OBJECT));
|
|
1776
|
+
assert(JVP_HAS_KIND(key, JV_KIND_STRING));
|
|
1130
1777
|
// copy/free of object, key, value coalesced
|
|
1131
1778
|
jv* slot = jvp_object_write(&object, key);
|
|
1132
1779
|
jv_free(*slot);
|
|
@@ -1135,22 +1782,22 @@ jv jv_object_set(jv object, jv key, jv value) {
|
|
|
1135
1782
|
}
|
|
1136
1783
|
|
|
1137
1784
|
jv jv_object_delete(jv object, jv key) {
|
|
1138
|
-
assert(
|
|
1139
|
-
assert(
|
|
1785
|
+
assert(JVP_HAS_KIND(object, JV_KIND_OBJECT));
|
|
1786
|
+
assert(JVP_HAS_KIND(key, JV_KIND_STRING));
|
|
1140
1787
|
jvp_object_delete(&object, key);
|
|
1141
1788
|
jv_free(key);
|
|
1142
1789
|
return object;
|
|
1143
1790
|
}
|
|
1144
1791
|
|
|
1145
1792
|
int jv_object_length(jv object) {
|
|
1146
|
-
assert(
|
|
1793
|
+
assert(JVP_HAS_KIND(object, JV_KIND_OBJECT));
|
|
1147
1794
|
int n = jvp_object_length(object);
|
|
1148
1795
|
jv_free(object);
|
|
1149
1796
|
return n;
|
|
1150
1797
|
}
|
|
1151
1798
|
|
|
1152
1799
|
jv jv_object_merge(jv a, jv b) {
|
|
1153
|
-
assert(
|
|
1800
|
+
assert(JVP_HAS_KIND(a, JV_KIND_OBJECT));
|
|
1154
1801
|
jv_object_foreach(b, k, v) {
|
|
1155
1802
|
a = jv_object_set(a, k, v);
|
|
1156
1803
|
}
|
|
@@ -1159,14 +1806,14 @@ jv jv_object_merge(jv a, jv b) {
|
|
|
1159
1806
|
}
|
|
1160
1807
|
|
|
1161
1808
|
jv jv_object_merge_recursive(jv a, jv b) {
|
|
1162
|
-
assert(
|
|
1163
|
-
assert(
|
|
1809
|
+
assert(JVP_HAS_KIND(a, JV_KIND_OBJECT));
|
|
1810
|
+
assert(JVP_HAS_KIND(b, JV_KIND_OBJECT));
|
|
1164
1811
|
|
|
1165
1812
|
jv_object_foreach(b, k, v) {
|
|
1166
1813
|
jv elem = jv_object_get(jv_copy(a), jv_copy(k));
|
|
1167
1814
|
if (jv_is_valid(elem) &&
|
|
1168
|
-
|
|
1169
|
-
|
|
1815
|
+
JVP_HAS_KIND(elem, JV_KIND_OBJECT) &&
|
|
1816
|
+
JVP_HAS_KIND(v, JV_KIND_OBJECT)) {
|
|
1170
1817
|
a = jv_object_set(a, k, jv_object_merge_recursive(elem, v));
|
|
1171
1818
|
} else {
|
|
1172
1819
|
jv_free(elem);
|
|
@@ -1177,25 +1824,6 @@ jv jv_object_merge_recursive(jv a, jv b) {
|
|
|
1177
1824
|
return a;
|
|
1178
1825
|
}
|
|
1179
1826
|
|
|
1180
|
-
int jv_object_contains(jv a, jv b) {
|
|
1181
|
-
assert(jv_get_kind(a) == JV_KIND_OBJECT);
|
|
1182
|
-
assert(jv_get_kind(b) == JV_KIND_OBJECT);
|
|
1183
|
-
int r = 1;
|
|
1184
|
-
|
|
1185
|
-
jv_object_foreach(b, key, b_val) {
|
|
1186
|
-
jv a_val = jv_object_get(jv_copy(a), jv_copy(key));
|
|
1187
|
-
|
|
1188
|
-
r = jv_contains(a_val, b_val);
|
|
1189
|
-
jv_free(key);
|
|
1190
|
-
|
|
1191
|
-
if (!r) break;
|
|
1192
|
-
}
|
|
1193
|
-
|
|
1194
|
-
jv_free(a);
|
|
1195
|
-
jv_free(b);
|
|
1196
|
-
return r;
|
|
1197
|
-
}
|
|
1198
|
-
|
|
1199
1827
|
/*
|
|
1200
1828
|
* Object iteration (internal helpers)
|
|
1201
1829
|
*/
|
|
@@ -1207,12 +1835,12 @@ int jv_object_iter_valid(jv object, int i) {
|
|
|
1207
1835
|
}
|
|
1208
1836
|
|
|
1209
1837
|
int jv_object_iter(jv object) {
|
|
1210
|
-
assert(
|
|
1838
|
+
assert(JVP_HAS_KIND(object, JV_KIND_OBJECT));
|
|
1211
1839
|
return jv_object_iter_next(object, -1);
|
|
1212
1840
|
}
|
|
1213
1841
|
|
|
1214
1842
|
int jv_object_iter_next(jv object, int iter) {
|
|
1215
|
-
assert(
|
|
1843
|
+
assert(JVP_HAS_KIND(object, JV_KIND_OBJECT));
|
|
1216
1844
|
assert(iter != ITER_FINISHED);
|
|
1217
1845
|
struct object_slot* slot;
|
|
1218
1846
|
do {
|
|
@@ -1228,7 +1856,7 @@ int jv_object_iter_next(jv object, int iter) {
|
|
|
1228
1856
|
|
|
1229
1857
|
jv jv_object_iter_key(jv object, int iter) {
|
|
1230
1858
|
jv s = jvp_object_get_slot(object, iter)->string;
|
|
1231
|
-
assert(
|
|
1859
|
+
assert(JVP_HAS_KIND(s, JV_KIND_STRING));
|
|
1232
1860
|
return jv_copy(s);
|
|
1233
1861
|
}
|
|
1234
1862
|
|
|
@@ -1240,34 +1868,36 @@ jv jv_object_iter_value(jv object, int iter) {
|
|
|
1240
1868
|
* Memory management
|
|
1241
1869
|
*/
|
|
1242
1870
|
jv jv_copy(jv j) {
|
|
1243
|
-
if (
|
|
1244
|
-
jv_get_kind(j) == JV_KIND_STRING ||
|
|
1245
|
-
jv_get_kind(j) == JV_KIND_OBJECT ||
|
|
1246
|
-
(jv_get_kind(j) == JV_KIND_INVALID && j.u.ptr != 0)) {
|
|
1871
|
+
if (JVP_IS_ALLOCATED(j)) {
|
|
1247
1872
|
jvp_refcnt_inc(j.u.ptr);
|
|
1248
1873
|
}
|
|
1249
1874
|
return j;
|
|
1250
1875
|
}
|
|
1251
1876
|
|
|
1252
1877
|
void jv_free(jv j) {
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1878
|
+
switch(JVP_KIND(j)) {
|
|
1879
|
+
case JV_KIND_ARRAY:
|
|
1880
|
+
jvp_array_free(j);
|
|
1881
|
+
break;
|
|
1882
|
+
case JV_KIND_STRING:
|
|
1883
|
+
jvp_string_free(j);
|
|
1884
|
+
break;
|
|
1885
|
+
case JV_KIND_OBJECT:
|
|
1886
|
+
jvp_object_free(j);
|
|
1887
|
+
break;
|
|
1888
|
+
case JV_KIND_INVALID:
|
|
1889
|
+
jvp_invalid_free(j);
|
|
1890
|
+
break;
|
|
1891
|
+
case JV_KIND_NUMBER:
|
|
1892
|
+
jvp_number_free(j);
|
|
1893
|
+
break;
|
|
1261
1894
|
}
|
|
1262
1895
|
}
|
|
1263
1896
|
|
|
1264
1897
|
int jv_get_refcnt(jv j) {
|
|
1265
|
-
|
|
1266
|
-
case JV_KIND_ARRAY:
|
|
1267
|
-
case JV_KIND_STRING:
|
|
1268
|
-
case JV_KIND_OBJECT:
|
|
1898
|
+
if (JVP_IS_ALLOCATED(j)) {
|
|
1269
1899
|
return j.u.ptr->count;
|
|
1270
|
-
|
|
1900
|
+
} else {
|
|
1271
1901
|
return 1;
|
|
1272
1902
|
}
|
|
1273
1903
|
}
|
|
@@ -1280,14 +1910,17 @@ int jv_equal(jv a, jv b) {
|
|
|
1280
1910
|
int r;
|
|
1281
1911
|
if (jv_get_kind(a) != jv_get_kind(b)) {
|
|
1282
1912
|
r = 0;
|
|
1283
|
-
} else if (
|
|
1284
|
-
|
|
1285
|
-
|
|
1913
|
+
} else if (JVP_IS_ALLOCATED(a) &&
|
|
1914
|
+
JVP_IS_ALLOCATED(b) &&
|
|
1915
|
+
a.kind_flags == b.kind_flags &&
|
|
1286
1916
|
a.size == b.size &&
|
|
1287
1917
|
a.u.ptr == b.u.ptr) {
|
|
1288
1918
|
r = 1;
|
|
1289
1919
|
} else {
|
|
1290
1920
|
switch (jv_get_kind(a)) {
|
|
1921
|
+
case JV_KIND_NUMBER:
|
|
1922
|
+
r = jvp_number_equal(a, b);
|
|
1923
|
+
break;
|
|
1291
1924
|
case JV_KIND_ARRAY:
|
|
1292
1925
|
r = jvp_array_equal(a, b);
|
|
1293
1926
|
break;
|
|
@@ -1314,18 +1947,10 @@ int jv_identical(jv a, jv b) {
|
|
|
1314
1947
|
|| a.size != b.size) {
|
|
1315
1948
|
r = 0;
|
|
1316
1949
|
} else {
|
|
1317
|
-
|
|
1318
|
-
case JV_KIND_ARRAY:
|
|
1319
|
-
case JV_KIND_STRING:
|
|
1320
|
-
case JV_KIND_OBJECT:
|
|
1950
|
+
if (JVP_IS_ALLOCATED(a) /* b has the same flags */) {
|
|
1321
1951
|
r = a.u.ptr == b.u.ptr;
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
r = memcmp(&a.u.number, &b.u.number, sizeof(a.u.number)) == 0;
|
|
1325
|
-
break;
|
|
1326
|
-
default:
|
|
1327
|
-
r = 1;
|
|
1328
|
-
break;
|
|
1952
|
+
} else {
|
|
1953
|
+
r = memcmp(&a.u.ptr, &b.u.ptr, sizeof(a.u)) == 0;
|
|
1329
1954
|
}
|
|
1330
1955
|
}
|
|
1331
1956
|
jv_free(a);
|
|
@@ -1337,12 +1962,18 @@ int jv_contains(jv a, jv b) {
|
|
|
1337
1962
|
int r = 1;
|
|
1338
1963
|
if (jv_get_kind(a) != jv_get_kind(b)) {
|
|
1339
1964
|
r = 0;
|
|
1340
|
-
} else if (
|
|
1341
|
-
r =
|
|
1342
|
-
} else if (
|
|
1343
|
-
r =
|
|
1344
|
-
} else if (
|
|
1345
|
-
|
|
1965
|
+
} else if (JVP_HAS_KIND(a, JV_KIND_OBJECT)) {
|
|
1966
|
+
r = jvp_object_contains(a, b);
|
|
1967
|
+
} else if (JVP_HAS_KIND(a, JV_KIND_ARRAY)) {
|
|
1968
|
+
r = jvp_array_contains(a, b);
|
|
1969
|
+
} else if (JVP_HAS_KIND(a, JV_KIND_STRING)) {
|
|
1970
|
+
int b_len = jv_string_length_bytes(jv_copy(b));
|
|
1971
|
+
if (b_len != 0) {
|
|
1972
|
+
r = _jq_memmem(jv_string_value(a), jv_string_length_bytes(jv_copy(a)),
|
|
1973
|
+
jv_string_value(b), b_len) != 0;
|
|
1974
|
+
} else {
|
|
1975
|
+
r = 1;
|
|
1976
|
+
}
|
|
1346
1977
|
} else {
|
|
1347
1978
|
r = jv_equal(jv_copy(a), jv_copy(b));
|
|
1348
1979
|
}
|