appwrite-cli 0.14.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.
- package/.github/workflows/npm-publish.yml +41 -0
- package/Formula/appwrite.rb +19 -0
- package/LICENSE.md +12 -0
- package/README.md +102 -0
- package/docs/examples/account/create-anonymous-session.md +1 -0
- package/docs/examples/account/create-j-w-t.md +1 -0
- package/docs/examples/account/create-magic-u-r-l-session.md +4 -0
- package/docs/examples/account/create-o-auth2session.md +5 -0
- package/docs/examples/account/create-recovery.md +3 -0
- package/docs/examples/account/create-session.md +3 -0
- package/docs/examples/account/create-verification.md +2 -0
- package/docs/examples/account/create.md +5 -0
- package/docs/examples/account/delete-session.md +2 -0
- package/docs/examples/account/delete-sessions.md +1 -0
- package/docs/examples/account/delete.md +1 -0
- package/docs/examples/account/get-logs.md +3 -0
- package/docs/examples/account/get-prefs.md +1 -0
- package/docs/examples/account/get-session.md +2 -0
- package/docs/examples/account/get-sessions.md +1 -0
- package/docs/examples/account/get.md +1 -0
- package/docs/examples/account/update-email.md +3 -0
- package/docs/examples/account/update-magic-u-r-l-session.md +3 -0
- package/docs/examples/account/update-name.md +2 -0
- package/docs/examples/account/update-password.md +3 -0
- package/docs/examples/account/update-prefs.md +2 -0
- package/docs/examples/account/update-recovery.md +5 -0
- package/docs/examples/account/update-session.md +2 -0
- package/docs/examples/account/update-verification.md +3 -0
- package/docs/examples/avatars/get-browser.md +5 -0
- package/docs/examples/avatars/get-credit-card.md +5 -0
- package/docs/examples/avatars/get-favicon.md +2 -0
- package/docs/examples/avatars/get-flag.md +5 -0
- package/docs/examples/avatars/get-image.md +4 -0
- package/docs/examples/avatars/get-initials.md +6 -0
- package/docs/examples/avatars/get-q-r.md +5 -0
- package/docs/examples/database/create-boolean-attribute.md +6 -0
- package/docs/examples/database/create-collection.md +6 -0
- package/docs/examples/database/create-document.md +6 -0
- package/docs/examples/database/create-email-attribute.md +6 -0
- package/docs/examples/database/create-enum-attribute.md +7 -0
- package/docs/examples/database/create-float-attribute.md +8 -0
- package/docs/examples/database/create-index.md +6 -0
- package/docs/examples/database/create-integer-attribute.md +8 -0
- package/docs/examples/database/create-ip-attribute.md +6 -0
- package/docs/examples/database/create-string-attribute.md +7 -0
- package/docs/examples/database/create-url-attribute.md +6 -0
- package/docs/examples/database/delete-attribute.md +3 -0
- package/docs/examples/database/delete-collection.md +2 -0
- package/docs/examples/database/delete-document.md +3 -0
- package/docs/examples/database/delete-index.md +3 -0
- package/docs/examples/database/get-attribute.md +3 -0
- package/docs/examples/database/get-collection-usage.md +3 -0
- package/docs/examples/database/get-collection.md +2 -0
- package/docs/examples/database/get-document.md +3 -0
- package/docs/examples/database/get-index.md +3 -0
- package/docs/examples/database/get-usage.md +2 -0
- package/docs/examples/database/list-attributes.md +2 -0
- package/docs/examples/database/list-collection-logs.md +4 -0
- package/docs/examples/database/list-collections.md +7 -0
- package/docs/examples/database/list-document-logs.md +5 -0
- package/docs/examples/database/list-documents.md +9 -0
- package/docs/examples/database/list-indexes.md +2 -0
- package/docs/examples/database/update-collection.md +7 -0
- package/docs/examples/database/update-document.md +6 -0
- package/docs/examples/functions/create-deployment.md +5 -0
- package/docs/examples/functions/create-execution.md +4 -0
- package/docs/examples/functions/create.md +9 -0
- package/docs/examples/functions/delete-deployment.md +3 -0
- package/docs/examples/functions/delete.md +2 -0
- package/docs/examples/functions/get-deployment.md +3 -0
- package/docs/examples/functions/get-execution.md +3 -0
- package/docs/examples/functions/get-usage.md +3 -0
- package/docs/examples/functions/get.md +2 -0
- package/docs/examples/functions/list-deployments.md +8 -0
- package/docs/examples/functions/list-executions.md +7 -0
- package/docs/examples/functions/list-runtimes.md +1 -0
- package/docs/examples/functions/list.md +7 -0
- package/docs/examples/functions/retry-build.md +4 -0
- package/docs/examples/functions/update-deployment.md +3 -0
- package/docs/examples/functions/update.md +8 -0
- package/docs/examples/health/get-antivirus.md +1 -0
- package/docs/examples/health/get-cache.md +1 -0
- package/docs/examples/health/get-d-b.md +1 -0
- package/docs/examples/health/get-queue-certificates.md +1 -0
- package/docs/examples/health/get-queue-functions.md +1 -0
- package/docs/examples/health/get-queue-logs.md +1 -0
- package/docs/examples/health/get-queue-usage.md +1 -0
- package/docs/examples/health/get-queue-webhooks.md +1 -0
- package/docs/examples/health/get-storage-local.md +1 -0
- package/docs/examples/health/get-time.md +1 -0
- package/docs/examples/health/get.md +1 -0
- package/docs/examples/locale/get-continents.md +1 -0
- package/docs/examples/locale/get-countries-e-u.md +1 -0
- package/docs/examples/locale/get-countries-phones.md +1 -0
- package/docs/examples/locale/get-countries.md +1 -0
- package/docs/examples/locale/get-currencies.md +1 -0
- package/docs/examples/locale/get-languages.md +1 -0
- package/docs/examples/locale/get.md +1 -0
- package/docs/examples/projects/create-domain.md +3 -0
- package/docs/examples/projects/create-key.md +4 -0
- package/docs/examples/projects/create-platform.md +7 -0
- package/docs/examples/projects/create-webhook.md +8 -0
- package/docs/examples/projects/create.md +13 -0
- package/docs/examples/projects/delete-domain.md +3 -0
- package/docs/examples/projects/delete-key.md +3 -0
- package/docs/examples/projects/delete-platform.md +3 -0
- package/docs/examples/projects/delete-webhook.md +3 -0
- package/docs/examples/projects/delete.md +3 -0
- package/docs/examples/projects/get-domain.md +3 -0
- package/docs/examples/projects/get-key.md +3 -0
- package/docs/examples/projects/get-platform.md +3 -0
- package/docs/examples/projects/get-usage.md +3 -0
- package/docs/examples/projects/get-webhook.md +3 -0
- package/docs/examples/projects/get.md +2 -0
- package/docs/examples/projects/list-domains.md +2 -0
- package/docs/examples/projects/list-keys.md +2 -0
- package/docs/examples/projects/list-platforms.md +2 -0
- package/docs/examples/projects/list-webhooks.md +2 -0
- package/docs/examples/projects/list.md +7 -0
- package/docs/examples/projects/update-auth-limit.md +3 -0
- package/docs/examples/projects/update-auth-status.md +4 -0
- package/docs/examples/projects/update-domain-verification.md +3 -0
- package/docs/examples/projects/update-key.md +5 -0
- package/docs/examples/projects/update-o-auth2.md +5 -0
- package/docs/examples/projects/update-platform.md +7 -0
- package/docs/examples/projects/update-service-status.md +4 -0
- package/docs/examples/projects/update-webhook.md +9 -0
- package/docs/examples/projects/update.md +12 -0
- package/docs/examples/storage/create-bucket.md +11 -0
- package/docs/examples/storage/create-file.md +6 -0
- package/docs/examples/storage/delete-bucket.md +2 -0
- package/docs/examples/storage/delete-file.md +3 -0
- package/docs/examples/storage/get-bucket-usage.md +3 -0
- package/docs/examples/storage/get-bucket.md +2 -0
- package/docs/examples/storage/get-file-download.md +3 -0
- package/docs/examples/storage/get-file-preview.md +14 -0
- package/docs/examples/storage/get-file-view.md +3 -0
- package/docs/examples/storage/get-file.md +3 -0
- package/docs/examples/storage/get-usage.md +2 -0
- package/docs/examples/storage/list-buckets.md +7 -0
- package/docs/examples/storage/list-files.md +8 -0
- package/docs/examples/storage/update-bucket.md +11 -0
- package/docs/examples/storage/update-file.md +5 -0
- package/docs/examples/teams/create-membership.md +6 -0
- package/docs/examples/teams/create.md +4 -0
- package/docs/examples/teams/delete-membership.md +3 -0
- package/docs/examples/teams/delete.md +2 -0
- package/docs/examples/teams/get-membership.md +3 -0
- package/docs/examples/teams/get-memberships.md +8 -0
- package/docs/examples/teams/get.md +2 -0
- package/docs/examples/teams/list.md +7 -0
- package/docs/examples/teams/update-membership-roles.md +4 -0
- package/docs/examples/teams/update-membership-status.md +5 -0
- package/docs/examples/teams/update.md +3 -0
- package/docs/examples/users/create.md +5 -0
- package/docs/examples/users/delete-session.md +3 -0
- package/docs/examples/users/delete-sessions.md +2 -0
- package/docs/examples/users/delete.md +2 -0
- package/docs/examples/users/get-logs.md +4 -0
- package/docs/examples/users/get-prefs.md +2 -0
- package/docs/examples/users/get-sessions.md +2 -0
- package/docs/examples/users/get-usage.md +3 -0
- package/docs/examples/users/get.md +2 -0
- package/docs/examples/users/list.md +7 -0
- package/docs/examples/users/update-email.md +3 -0
- package/docs/examples/users/update-name.md +3 -0
- package/docs/examples/users/update-password.md +3 -0
- package/docs/examples/users/update-prefs.md +3 -0
- package/docs/examples/users/update-status.md +3 -0
- package/docs/examples/users/update-verification.md +3 -0
- package/index.js +49 -0
- package/install.sh +165 -0
- package/ldid/COPYING +661 -0
- package/ldid/Makefile +51 -0
- package/ldid/control +12 -0
- package/ldid/control.sh +5 -0
- package/ldid/deb.sh +10 -0
- package/ldid/ios.sh +2 -0
- package/ldid/ldid.cpp +3253 -0
- package/ldid/ldid.hpp +164 -0
- package/ldid/libplist/.github/workflows/build.yml +62 -0
- package/ldid/libplist/.github/workflows/codeql-analysis.yml +71 -0
- package/ldid/libplist/AUTHORS +28 -0
- package/ldid/libplist/COPYING +340 -0
- package/ldid/libplist/COPYING.LESSER +502 -0
- package/ldid/libplist/Makefile.am +20 -0
- package/ldid/libplist/NEWS +252 -0
- package/ldid/libplist/README.md +114 -0
- package/ldid/libplist/aclocal.m4 +1729 -0
- package/ldid/libplist/autogen.sh +26 -0
- package/ldid/libplist/configure.ac +292 -0
- package/ldid/libplist/cython/Makefile.am +53 -0
- package/ldid/libplist/cython/plist.pxd +78 -0
- package/ldid/libplist/cython/plist.pyx +947 -0
- package/ldid/libplist/cython/plist_util.c +40 -0
- package/ldid/libplist/cython/plist_util.h +5 -0
- package/ldid/libplist/docs/Makefile.am +3 -0
- package/ldid/libplist/docs/plistutil.1 +62 -0
- package/ldid/libplist/fuzz/Makefile.am +43 -0
- package/ldid/libplist/fuzz/bplist-crashes/clusterfuzz-testcase-4766291097288704 +0 -0
- package/ldid/libplist/fuzz/bplist-crashes/clusterfuzz-testcase-4930725262393344 +0 -0
- package/ldid/libplist/fuzz/bplist-crashes/clusterfuzz-testcase-5421965105954816 +0 -0
- package/ldid/libplist/fuzz/bplist-crashes/clusterfuzz-testcase-5556177727389696 +0 -0
- package/ldid/libplist/fuzz/bplist-crashes/clusterfuzz-testcase-6557963011489792 +0 -0
- package/ldid/libplist/fuzz/bplist-crashes/clusterfuzz-testcase-6605859144597504 +0 -0
- package/ldid/libplist/fuzz/bplist-crashes/crash-0ce4dd483b645bc05ec45a97d285dcf1933ee840 +0 -0
- package/ldid/libplist/fuzz/bplist-crashes/crash-0d59cdcb5c3416c2790612b78a631ce9f5622800 +0 -0
- package/ldid/libplist/fuzz/bplist-crashes/crash-17d635ab460fef74df1ac7561f1253533a6359c5 +0 -0
- package/ldid/libplist/fuzz/bplist-crashes/crash-33a67313fa7864cd627ef92d12017a127d342f28 +0 -0
- package/ldid/libplist/fuzz/bplist-crashes/crash-39f1347115f8fe9ac25cdc9332e3fc5cd32c7f7b +0 -0
- package/ldid/libplist/fuzz/bplist-crashes/crash-4bd78175fe01d07c5ee90104fbc68d95dd092210 +0 -0
- package/ldid/libplist/fuzz/bplist-crashes/crash-4c5404453bb7425aef9b953a5f6f3f0afcc48392 +0 -0
- package/ldid/libplist/fuzz/bplist-crashes/crash-52775e25f6af20af351cd616834e602fc988a032 +0 -0
- package/ldid/libplist/fuzz/bplist-crashes/crash-6d1399685b745d3d49fadc91072fabcdde8d16fa +0 -0
- package/ldid/libplist/fuzz/bplist-crashes/crash-94b3725900d63c6258448fd757559c81002de9c9 +0 -0
- package/ldid/libplist/fuzz/bplist-crashes/crash-a47195acbabc3f5b2cda9c6ebda42f2afc1cc5af +0 -0
- package/ldid/libplist/fuzz/bplist-crashes/crash-ce852bae6aeeffc4698a93660236f1b995ce966e +0 -0
- package/ldid/libplist/fuzz/bplist-crashes/crash-daddb6e82e3d1ed76e20e4131462f5247a6fb131 +0 -0
- package/ldid/libplist/fuzz/bplist-crashes/crash-f21be4ebce7f9c337bf96b93cec7e252f5c75a21 +0 -0
- package/ldid/libplist/fuzz/bplist-crashes/crash-f779dafccc0164684d1a264976e56037188b40e2 +0 -0
- package/ldid/libplist/fuzz/bplist-leaks/leak-96fb453b3ba18d31e164831795a708183b5a0dac +0 -0
- package/ldid/libplist/fuzz/bplist-leaks/leak-acb3c00a83d7635638a476a4e70fc1f1caa1a5b1 +0 -0
- package/ldid/libplist/fuzz/bplist-leaks/leak-fe2cd4b1f67e0c9b21e6225a4fb4ca19eab80074 +0 -0
- package/ldid/libplist/fuzz/bplist.dict +1 -0
- package/ldid/libplist/fuzz/bplist_fuzzer.cc +32 -0
- package/ldid/libplist/fuzz/bplist_fuzzer.options +3 -0
- package/ldid/libplist/fuzz/fuzzers.test +8 -0
- package/ldid/libplist/fuzz/init-fuzzers.sh +23 -0
- package/ldid/libplist/fuzz/test-fuzzers.sh +33 -0
- package/ldid/libplist/fuzz/xplist-crashes/clusterfuzz-testcase-4516959125241856 +0 -0
- package/ldid/libplist/fuzz/xplist-crashes/clusterfuzz-testcase-4663876528373760 +5 -0
- package/ldid/libplist/fuzz/xplist-crashes/clusterfuzz-testcase-5799076113154048 +45 -0
- package/ldid/libplist/fuzz/xplist-crashes/clusterfuzz-testcase-5922404220010496 +0 -0
- package/ldid/libplist/fuzz/xplist-crashes/clusterfuzz-testcase-6015098361479168 +0 -0
- package/ldid/libplist/fuzz/xplist-crashes/clusterfuzz-testcase-6043836860071936 +0 -0
- package/ldid/libplist/fuzz/xplist-crashes/clusterfuzz-testcase-6047509906456576 +10050 -0
- package/ldid/libplist/fuzz/xplist-crashes/clusterfuzz-testcase-6482601374121984 +0 -0
- package/ldid/libplist/fuzz/xplist-crashes/crash-09788d7acb46b4b177422f9c4ee54556a3ad1f17 +53 -0
- package/ldid/libplist/fuzz/xplist-crashes/crash-155c60d5c4b2778110fb4a633caa7d64eb9b99c1 +9 -0
- package/ldid/libplist/fuzz/xplist-crashes/crash-348c909a0b3532977185f551eb5d2ed04e694883 +11 -0
- package/ldid/libplist/fuzz/xplist-crashes/crash-7bc172e27a2b1d4fcaf031f59d1f08fb83081e4a +8 -0
- package/ldid/libplist/fuzz/xplist-crashes/crash-80c28b0e2a446665e68927dd4441c10c9a68e64e +0 -0
- package/ldid/libplist/fuzz/xplist-crashes/crash-8acf177da60ecf13c36d0da1b8e25de891980ea6 +5 -0
- package/ldid/libplist/fuzz/xplist-crashes/crash-94276cf69a50e78dd6cdf079c208cb80f357cd33 +0 -0
- package/ldid/libplist/fuzz/xplist-crashes/crash-9ddb891a0ec42401eb4629e6b99e01aef7909eb9 +0 -0
- package/ldid/libplist/fuzz/xplist-crashes/crash-a8b44e1f5be4f75f00a937016ec5405bce77a0f9 +0 -0
- package/ldid/libplist/fuzz/xplist-crashes/crash-da39a3ee5e6b4b0d3255bfef95601890afd80709 +0 -0
- package/ldid/libplist/fuzz/xplist-crashes/crash-f03c680ee1c4d84c28e731752df77a61e213a24d +72 -0
- package/ldid/libplist/fuzz/xplist-leaks/clusterfuzz-testcase-4634751103139840 +187 -0
- package/ldid/libplist/fuzz/xplist-leaks/clusterfuzz-testcase-6056412121661440 +12 -0
- package/ldid/libplist/fuzz/xplist-leaks/leak-47b0a9f21d3affab6cfc898e5140bb53265ada07 +0 -0
- package/ldid/libplist/fuzz/xplist-leaks/leak-4c81aae70b20d9b9408b78d40999a54205bdcfb7 +0 -0
- package/ldid/libplist/fuzz/xplist-leaks/leak-53bc466851eda790bd891733da5db0a7482886bf +6 -0
- package/ldid/libplist/fuzz/xplist.dict +51 -0
- package/ldid/libplist/fuzz/xplist_fuzzer.cc +32 -0
- package/ldid/libplist/fuzz/xplist_fuzzer.options +3 -0
- package/ldid/libplist/include/Makefile.am +15 -0
- package/ldid/libplist/include/plist/Array.h +55 -0
- package/ldid/libplist/include/plist/Boolean.h +48 -0
- package/ldid/libplist/include/plist/Data.h +49 -0
- package/ldid/libplist/include/plist/Date.h +50 -0
- package/ldid/libplist/include/plist/Dictionary.h +68 -0
- package/ldid/libplist/include/plist/Integer.h +48 -0
- package/ldid/libplist/include/plist/Key.h +49 -0
- package/ldid/libplist/include/plist/Node.h +57 -0
- package/ldid/libplist/include/plist/Real.h +48 -0
- package/ldid/libplist/include/plist/String.h +49 -0
- package/ldid/libplist/include/plist/Structure.h +59 -0
- package/ldid/libplist/include/plist/Uid.h +48 -0
- package/ldid/libplist/include/plist/plist++.h +39 -0
- package/ldid/libplist/include/plist/plist.h +953 -0
- package/ldid/libplist/libcnary/COPYING +502 -0
- package/ldid/libplist/libcnary/Makefile.am +15 -0
- package/ldid/libplist/libcnary/README +5 -0
- package/ldid/libplist/libcnary/cnary.c +46 -0
- package/ldid/libplist/libcnary/include/node.h +65 -0
- package/ldid/libplist/libcnary/include/node_list.h +47 -0
- package/ldid/libplist/libcnary/include/object.h +41 -0
- package/ldid/libplist/libcnary/node.c +216 -0
- package/ldid/libplist/libcnary/node_list.c +157 -0
- package/ldid/libplist/m4/ac_pkg_cython.m4 +67 -0
- package/ldid/libplist/m4/as-compiler-flag.m4 +62 -0
- package/ldid/libplist/m4/ax_pthread.m4 +485 -0
- package/ldid/libplist/m4/ax_python_devel.m4 +327 -0
- package/ldid/libplist/m4/cython_python.m4 +7 -0
- package/ldid/libplist/src/Array.cpp +148 -0
- package/ldid/libplist/src/Boolean.cpp +73 -0
- package/ldid/libplist/src/Data.cpp +79 -0
- package/ldid/libplist/src/Date.cpp +76 -0
- package/ldid/libplist/src/Dictionary.cpp +182 -0
- package/ldid/libplist/src/Integer.cpp +73 -0
- package/ldid/libplist/src/Key.cpp +80 -0
- package/ldid/libplist/src/Makefile.am +63 -0
- package/ldid/libplist/src/Node.cpp +166 -0
- package/ldid/libplist/src/Real.cpp +73 -0
- package/ldid/libplist/src/String.cpp +80 -0
- package/ldid/libplist/src/Structure.cpp +123 -0
- package/ldid/libplist/src/Uid.cpp +73 -0
- package/ldid/libplist/src/base64.c +119 -0
- package/ldid/libplist/src/base64.h +28 -0
- package/ldid/libplist/src/bplist.c +1381 -0
- package/ldid/libplist/src/bytearray.c +61 -0
- package/ldid/libplist/src/bytearray.h +36 -0
- package/ldid/libplist/src/hashtable.c +140 -0
- package/ldid/libplist/src/hashtable.h +50 -0
- package/ldid/libplist/src/plist.c +1356 -0
- package/ldid/libplist/src/plist.h +74 -0
- package/ldid/libplist/src/ptrarray.c +96 -0
- package/ldid/libplist/src/ptrarray.h +40 -0
- package/ldid/libplist/src/strbuf.h +34 -0
- package/ldid/libplist/src/time64.c +814 -0
- package/ldid/libplist/src/time64.h +81 -0
- package/ldid/libplist/src/time64_limits.h +97 -0
- package/ldid/libplist/src/xplist.c +1435 -0
- package/ldid/libplist/test/Makefile.am +93 -0
- package/ldid/libplist/test/amp.test +14 -0
- package/ldid/libplist/test/bigarray.test +15 -0
- package/ldid/libplist/test/cdata.test +12 -0
- package/ldid/libplist/test/data/1.plist +35 -0
- package/ldid/libplist/test/data/2.plist +100 -0
- package/ldid/libplist/test/data/3.plist +420 -0
- package/ldid/libplist/test/data/4.plist +5037 -0
- package/ldid/libplist/test/data/5.plist +55053 -0
- package/ldid/libplist/test/data/6.plist +4006 -0
- package/ldid/libplist/test/data/7.plist +14 -0
- package/ldid/libplist/test/data/amp.plist +6 -0
- package/ldid/libplist/test/data/cdata.plist +6 -0
- package/ldid/libplist/test/data/dictref1byte.bplist +0 -0
- package/ldid/libplist/test/data/dictref2bytes.bplist +0 -0
- package/ldid/libplist/test/data/dictref3bytes.bplist +0 -0
- package/ldid/libplist/test/data/dictref4bytes.bplist +0 -0
- package/ldid/libplist/test/data/dictref5bytes.bplist +0 -0
- package/ldid/libplist/test/data/dictref6bytes.bplist +0 -0
- package/ldid/libplist/test/data/dictref7bytes.bplist +0 -0
- package/ldid/libplist/test/data/dictref8bytes.bplist +0 -0
- package/ldid/libplist/test/data/empty_keys.plist +8 -0
- package/ldid/libplist/test/data/entities.plist +57 -0
- package/ldid/libplist/test/data/hex.plist +5 -0
- package/ldid/libplist/test/data/invalid_tag.plist +6 -0
- package/ldid/libplist/test/data/malformed_dict.bplist +0 -0
- package/ldid/libplist/test/data/off1byte.bplist +0 -0
- package/ldid/libplist/test/data/off2bytes.bplist +0 -0
- package/ldid/libplist/test/data/off3bytes.bplist +0 -0
- package/ldid/libplist/test/data/off4bytes.bplist +0 -0
- package/ldid/libplist/test/data/off5bytes.bplist +0 -0
- package/ldid/libplist/test/data/off6bytes.bplist +0 -0
- package/ldid/libplist/test/data/off7bytes.bplist +0 -0
- package/ldid/libplist/test/data/off8bytes.bplist +0 -0
- package/ldid/libplist/test/data/offxml.plist +8 -0
- package/ldid/libplist/test/data/order.bplist +0 -0
- package/ldid/libplist/test/data/order.plist +27 -0
- package/ldid/libplist/test/data/recursion.bplist +0 -0
- package/ldid/libplist/test/data/signed.bplist +0 -0
- package/ldid/libplist/test/data/signed.plist +5 -0
- package/ldid/libplist/test/data/signedunsigned.bplist +0 -0
- package/ldid/libplist/test/data/signedunsigned.plist +11 -0
- package/ldid/libplist/test/data/unsigned.bplist +0 -0
- package/ldid/libplist/test/data/unsigned.plist +5 -0
- package/ldid/libplist/test/dates.test +15 -0
- package/ldid/libplist/test/empty.test +15 -0
- package/ldid/libplist/test/empty_keys.test +12 -0
- package/ldid/libplist/test/entities.test +12 -0
- package/ldid/libplist/test/hex.test +12 -0
- package/ldid/libplist/test/huge.test +15 -0
- package/ldid/libplist/test/invalid_tag.test +14 -0
- package/ldid/libplist/test/large.test +15 -0
- package/ldid/libplist/test/malformed_dict.test +11 -0
- package/ldid/libplist/test/medium.test +15 -0
- package/ldid/libplist/test/offsetsize.test +12 -0
- package/ldid/libplist/test/order.test +13 -0
- package/ldid/libplist/test/plist_cmp.c +158 -0
- package/ldid/libplist/test/plist_test.c +135 -0
- package/ldid/libplist/test/recursion.test +11 -0
- package/ldid/libplist/test/refsize.test +12 -0
- package/ldid/libplist/test/signedunsigned1.test +23 -0
- package/ldid/libplist/test/signedunsigned2.test +23 -0
- package/ldid/libplist/test/signedunsigned3.test +23 -0
- package/ldid/libplist/test/small.test +15 -0
- package/ldid/libplist/test/timezone1.test +17 -0
- package/ldid/libplist/test/timezone2.test +21 -0
- package/ldid/libplist/tools/Makefile.am +10 -0
- package/ldid/libplist/tools/plistutil.c +299 -0
- package/ldid/lookup2.c +416 -0
- package/ldid/make.sh +90 -0
- package/ldid/minimal/hexdump.h +76 -0
- package/ldid/minimal/mapping.h +72 -0
- package/ldid/minimal/sqlite3.h +71 -0
- package/ldid/minimal/stdlib.h +129 -0
- package/ldid/minimal/string.h +51 -0
- package/ldid/plist.sh +2 -0
- package/ldid/sha1.h +64 -0
- package/ldid/sysroot.sh +31 -0
- package/ldid/version.sh +2 -0
- package/lib/client.js +243 -0
- package/lib/commands/account.js +785 -0
- package/lib/commands/avatars.js +349 -0
- package/lib/commands/database.js +1238 -0
- package/lib/commands/deploy.js +477 -0
- package/lib/commands/functions.js +689 -0
- package/lib/commands/generic.js +106 -0
- package/lib/commands/health.js +269 -0
- package/lib/commands/init.js +148 -0
- package/lib/commands/locale.js +177 -0
- package/lib/commands/projects.js +1191 -0
- package/lib/commands/storage.js +743 -0
- package/lib/commands/teams.js +435 -0
- package/lib/commands/users.js +542 -0
- package/lib/config.js +264 -0
- package/lib/exception.js +9 -0
- package/lib/parser.js +179 -0
- package/lib/questions.js +223 -0
- package/lib/sdks.js +82 -0
- package/package.json +41 -0
|
@@ -0,0 +1,1356 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* plist.c
|
|
3
|
+
* Builds plist XML structures
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) 2009-2019 Nikias Bassen, All Rights Reserved.
|
|
6
|
+
* Copyright (c) 2010-2015 Martin Szulecki, All Rights Reserved.
|
|
7
|
+
* Copyright (c) 2008 Zach C., All Rights Reserved.
|
|
8
|
+
*
|
|
9
|
+
* This library is free software; you can redistribute it and/or
|
|
10
|
+
* modify it under the terms of the GNU Lesser General Public
|
|
11
|
+
* License as published by the Free Software Foundation; either
|
|
12
|
+
* version 2.1 of the License, or (at your option) any later version.
|
|
13
|
+
*
|
|
14
|
+
* This library is distributed in the hope that it will be useful,
|
|
15
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
16
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
17
|
+
* Lesser General Public License for more details.
|
|
18
|
+
*
|
|
19
|
+
* You should have received a copy of the GNU Lesser General Public
|
|
20
|
+
* License along with this library; if not, write to the Free Software
|
|
21
|
+
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
#ifdef HAVE_CONFIG_H
|
|
25
|
+
#include <config.h>
|
|
26
|
+
#endif
|
|
27
|
+
|
|
28
|
+
#define _GNU_SOURCE 1
|
|
29
|
+
#include <string.h>
|
|
30
|
+
#include "plist.h"
|
|
31
|
+
#include <stdlib.h>
|
|
32
|
+
#include <stdio.h>
|
|
33
|
+
#include <math.h>
|
|
34
|
+
#include <assert.h>
|
|
35
|
+
#include <limits.h>
|
|
36
|
+
#include <float.h>
|
|
37
|
+
|
|
38
|
+
#ifdef WIN32
|
|
39
|
+
#include <windows.h>
|
|
40
|
+
#else
|
|
41
|
+
#include <pthread.h>
|
|
42
|
+
#endif
|
|
43
|
+
|
|
44
|
+
#include <node.h>
|
|
45
|
+
#include <hashtable.h>
|
|
46
|
+
#include <ptrarray.h>
|
|
47
|
+
|
|
48
|
+
extern void plist_xml_init(void);
|
|
49
|
+
extern void plist_xml_deinit(void);
|
|
50
|
+
extern void plist_bin_init(void);
|
|
51
|
+
extern void plist_bin_deinit(void);
|
|
52
|
+
|
|
53
|
+
static void internal_plist_init(void)
|
|
54
|
+
{
|
|
55
|
+
plist_bin_init();
|
|
56
|
+
plist_xml_init();
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
static void internal_plist_deinit(void)
|
|
60
|
+
{
|
|
61
|
+
plist_bin_deinit();
|
|
62
|
+
plist_xml_deinit();
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
#ifdef WIN32
|
|
66
|
+
|
|
67
|
+
typedef volatile struct {
|
|
68
|
+
LONG lock;
|
|
69
|
+
int state;
|
|
70
|
+
} thread_once_t;
|
|
71
|
+
|
|
72
|
+
static thread_once_t init_once = {0, 0};
|
|
73
|
+
static thread_once_t deinit_once = {0, 0};
|
|
74
|
+
|
|
75
|
+
void thread_once(thread_once_t *once_control, void (*init_routine)(void))
|
|
76
|
+
{
|
|
77
|
+
while (InterlockedExchange(&(once_control->lock), 1) != 0) {
|
|
78
|
+
Sleep(1);
|
|
79
|
+
}
|
|
80
|
+
if (!once_control->state) {
|
|
81
|
+
once_control->state = 1;
|
|
82
|
+
init_routine();
|
|
83
|
+
}
|
|
84
|
+
InterlockedExchange(&(once_control->lock), 0);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
BOOL WINAPI DllMain(HINSTANCE hModule, DWORD dwReason, LPVOID lpReserved)
|
|
88
|
+
{
|
|
89
|
+
switch (dwReason) {
|
|
90
|
+
case DLL_PROCESS_ATTACH:
|
|
91
|
+
thread_once(&init_once, internal_plist_init);
|
|
92
|
+
break;
|
|
93
|
+
case DLL_PROCESS_DETACH:
|
|
94
|
+
thread_once(&deinit_once, internal_plist_deinit);
|
|
95
|
+
break;
|
|
96
|
+
default:
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
return 1;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
#else
|
|
103
|
+
|
|
104
|
+
static pthread_once_t init_once = PTHREAD_ONCE_INIT;
|
|
105
|
+
static pthread_once_t deinit_once = PTHREAD_ONCE_INIT;
|
|
106
|
+
|
|
107
|
+
static void __attribute__((constructor)) libplist_initialize(void)
|
|
108
|
+
{
|
|
109
|
+
pthread_once(&init_once, internal_plist_init);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
static void __attribute__((destructor)) libplist_deinitialize(void)
|
|
113
|
+
{
|
|
114
|
+
pthread_once(&deinit_once, internal_plist_deinit);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
#endif
|
|
118
|
+
|
|
119
|
+
#ifndef HAVE_MEMMEM
|
|
120
|
+
// see https://sourceware.org/legacy-ml/libc-alpha/2007-12/msg00000.html
|
|
121
|
+
|
|
122
|
+
#ifndef _LIBC
|
|
123
|
+
# define __builtin_expect(expr, val) (expr)
|
|
124
|
+
#endif
|
|
125
|
+
|
|
126
|
+
#undef memmem
|
|
127
|
+
|
|
128
|
+
/* Return the first occurrence of NEEDLE in HAYSTACK. */
|
|
129
|
+
void* memmem(const void* haystack, size_t haystack_len, const void* needle, size_t needle_len)
|
|
130
|
+
{
|
|
131
|
+
/* not really Rabin-Karp, just using additive hashing */
|
|
132
|
+
char* haystack_ = (char*)haystack;
|
|
133
|
+
char* needle_ = (char*)needle;
|
|
134
|
+
int hash = 0; /* this is the static hash value of the needle */
|
|
135
|
+
int hay_hash = 0; /* rolling hash over the haystack */
|
|
136
|
+
char* last;
|
|
137
|
+
size_t i;
|
|
138
|
+
|
|
139
|
+
if (haystack_len < needle_len)
|
|
140
|
+
return NULL;
|
|
141
|
+
|
|
142
|
+
if (!needle_len)
|
|
143
|
+
return haystack_;
|
|
144
|
+
|
|
145
|
+
/* initialize hashes */
|
|
146
|
+
for (i = needle_len; i; --i) {
|
|
147
|
+
hash += *needle_++;
|
|
148
|
+
hay_hash += *haystack_++;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/* iterate over the haystack */
|
|
152
|
+
haystack_ = (char*)haystack;
|
|
153
|
+
needle_ = (char*)needle;
|
|
154
|
+
last = haystack_+(haystack_len - needle_len + 1);
|
|
155
|
+
for (; haystack_ < last; ++haystack_) {
|
|
156
|
+
if (__builtin_expect(hash == hay_hash, 0)
|
|
157
|
+
&& *haystack_ == *needle_ /* prevent calling memcmp, was a optimization from existing glibc */
|
|
158
|
+
&& !memcmp (haystack_, needle_, needle_len)) {
|
|
159
|
+
return haystack_;
|
|
160
|
+
}
|
|
161
|
+
/* roll the hash */
|
|
162
|
+
hay_hash -= *haystack_;
|
|
163
|
+
hay_hash += *(haystack_+needle_len);
|
|
164
|
+
}
|
|
165
|
+
return NULL;
|
|
166
|
+
}
|
|
167
|
+
#endif
|
|
168
|
+
|
|
169
|
+
PLIST_API int plist_is_binary(const char *plist_data, uint32_t length)
|
|
170
|
+
{
|
|
171
|
+
if (length < 8) {
|
|
172
|
+
return 0;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
return (memcmp(plist_data, "bplist00", 8) == 0);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
PLIST_API void plist_from_memory(const char *plist_data, uint32_t length, plist_t * plist)
|
|
180
|
+
{
|
|
181
|
+
if (length < 8) {
|
|
182
|
+
*plist = NULL;
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
if (plist_is_binary(plist_data, length)) {
|
|
187
|
+
plist_from_bin(plist_data, length, plist);
|
|
188
|
+
} else {
|
|
189
|
+
plist_from_xml(plist_data, length, plist);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
plist_t plist_new_node(plist_data_t data)
|
|
194
|
+
{
|
|
195
|
+
return (plist_t) node_create(NULL, data);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
plist_data_t plist_get_data(const plist_t node)
|
|
199
|
+
{
|
|
200
|
+
if (!node)
|
|
201
|
+
return NULL;
|
|
202
|
+
return ((node_t*)node)->data;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
plist_data_t plist_new_plist_data(void)
|
|
206
|
+
{
|
|
207
|
+
plist_data_t data = (plist_data_t) calloc(sizeof(struct plist_data_s), 1);
|
|
208
|
+
return data;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
static unsigned int dict_key_hash(const void *data)
|
|
212
|
+
{
|
|
213
|
+
plist_data_t keydata = (plist_data_t)data;
|
|
214
|
+
unsigned int hash = 5381;
|
|
215
|
+
size_t i;
|
|
216
|
+
char *str = keydata->strval;
|
|
217
|
+
for (i = 0; i < keydata->length; str++, i++) {
|
|
218
|
+
hash = ((hash << 5) + hash) + *str;
|
|
219
|
+
}
|
|
220
|
+
return hash;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
static int dict_key_compare(const void* a, const void* b)
|
|
224
|
+
{
|
|
225
|
+
plist_data_t data_a = (plist_data_t)a;
|
|
226
|
+
plist_data_t data_b = (plist_data_t)b;
|
|
227
|
+
if (data_a->strval == NULL || data_b->strval == NULL) {
|
|
228
|
+
return FALSE;
|
|
229
|
+
}
|
|
230
|
+
if (data_a->length != data_b->length) {
|
|
231
|
+
return FALSE;
|
|
232
|
+
}
|
|
233
|
+
return (strcmp(data_a->strval, data_b->strval) == 0) ? TRUE : FALSE;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
void plist_free_data(plist_data_t data)
|
|
237
|
+
{
|
|
238
|
+
if (data)
|
|
239
|
+
{
|
|
240
|
+
switch (data->type)
|
|
241
|
+
{
|
|
242
|
+
case PLIST_KEY:
|
|
243
|
+
case PLIST_STRING:
|
|
244
|
+
free(data->strval);
|
|
245
|
+
break;
|
|
246
|
+
case PLIST_DATA:
|
|
247
|
+
free(data->buff);
|
|
248
|
+
break;
|
|
249
|
+
case PLIST_ARRAY:
|
|
250
|
+
ptr_array_free(data->hashtable);
|
|
251
|
+
break;
|
|
252
|
+
case PLIST_DICT:
|
|
253
|
+
hash_table_destroy(data->hashtable);
|
|
254
|
+
break;
|
|
255
|
+
default:
|
|
256
|
+
break;
|
|
257
|
+
}
|
|
258
|
+
free(data);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
static int plist_free_node(node_t* node)
|
|
263
|
+
{
|
|
264
|
+
plist_data_t data = NULL;
|
|
265
|
+
int node_index = node_detach(node->parent, node);
|
|
266
|
+
data = plist_get_data(node);
|
|
267
|
+
plist_free_data(data);
|
|
268
|
+
node->data = NULL;
|
|
269
|
+
|
|
270
|
+
node_t *ch;
|
|
271
|
+
for (ch = node_first_child(node); ch; ) {
|
|
272
|
+
node_t *next = node_next_sibling(ch);
|
|
273
|
+
plist_free_node(ch);
|
|
274
|
+
ch = next;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
node_destroy(node);
|
|
278
|
+
|
|
279
|
+
return node_index;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
PLIST_API plist_t plist_new_dict(void)
|
|
283
|
+
{
|
|
284
|
+
plist_data_t data = plist_new_plist_data();
|
|
285
|
+
data->type = PLIST_DICT;
|
|
286
|
+
return plist_new_node(data);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
PLIST_API plist_t plist_new_array(void)
|
|
290
|
+
{
|
|
291
|
+
plist_data_t data = plist_new_plist_data();
|
|
292
|
+
data->type = PLIST_ARRAY;
|
|
293
|
+
return plist_new_node(data);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
//These nodes should not be handled by users
|
|
297
|
+
static plist_t plist_new_key(const char *val)
|
|
298
|
+
{
|
|
299
|
+
plist_data_t data = plist_new_plist_data();
|
|
300
|
+
data->type = PLIST_KEY;
|
|
301
|
+
data->strval = strdup(val);
|
|
302
|
+
data->length = strlen(val);
|
|
303
|
+
return plist_new_node(data);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
PLIST_API plist_t plist_new_string(const char *val)
|
|
307
|
+
{
|
|
308
|
+
plist_data_t data = plist_new_plist_data();
|
|
309
|
+
data->type = PLIST_STRING;
|
|
310
|
+
data->strval = strdup(val);
|
|
311
|
+
data->length = strlen(val);
|
|
312
|
+
return plist_new_node(data);
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
PLIST_API plist_t plist_new_bool(uint8_t val)
|
|
316
|
+
{
|
|
317
|
+
plist_data_t data = plist_new_plist_data();
|
|
318
|
+
data->type = PLIST_BOOLEAN;
|
|
319
|
+
data->boolval = val;
|
|
320
|
+
data->length = sizeof(uint8_t);
|
|
321
|
+
return plist_new_node(data);
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
PLIST_API plist_t plist_new_uint(uint64_t val)
|
|
325
|
+
{
|
|
326
|
+
plist_data_t data = plist_new_plist_data();
|
|
327
|
+
data->type = PLIST_UINT;
|
|
328
|
+
data->intval = val;
|
|
329
|
+
data->length = sizeof(uint64_t);
|
|
330
|
+
return plist_new_node(data);
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
PLIST_API plist_t plist_new_uid(uint64_t val)
|
|
334
|
+
{
|
|
335
|
+
plist_data_t data = plist_new_plist_data();
|
|
336
|
+
data->type = PLIST_UID;
|
|
337
|
+
data->intval = val;
|
|
338
|
+
data->length = sizeof(uint64_t);
|
|
339
|
+
return plist_new_node(data);
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
PLIST_API plist_t plist_new_real(double val)
|
|
343
|
+
{
|
|
344
|
+
plist_data_t data = plist_new_plist_data();
|
|
345
|
+
data->type = PLIST_REAL;
|
|
346
|
+
data->realval = val;
|
|
347
|
+
data->length = sizeof(double);
|
|
348
|
+
return plist_new_node(data);
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
PLIST_API plist_t plist_new_data(const char *val, uint64_t length)
|
|
352
|
+
{
|
|
353
|
+
plist_data_t data = plist_new_plist_data();
|
|
354
|
+
data->type = PLIST_DATA;
|
|
355
|
+
data->buff = (uint8_t *) malloc(length);
|
|
356
|
+
memcpy(data->buff, val, length);
|
|
357
|
+
data->length = length;
|
|
358
|
+
return plist_new_node(data);
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
PLIST_API plist_t plist_new_date(int32_t sec, int32_t usec)
|
|
362
|
+
{
|
|
363
|
+
plist_data_t data = plist_new_plist_data();
|
|
364
|
+
data->type = PLIST_DATE;
|
|
365
|
+
data->realval = (double)sec + (double)usec / 1000000;
|
|
366
|
+
data->length = sizeof(double);
|
|
367
|
+
return plist_new_node(data);
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
PLIST_API void plist_free(plist_t plist)
|
|
371
|
+
{
|
|
372
|
+
if (plist)
|
|
373
|
+
{
|
|
374
|
+
plist_free_node(plist);
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
static plist_t plist_copy_node(node_t *node)
|
|
379
|
+
{
|
|
380
|
+
plist_type node_type = PLIST_NONE;
|
|
381
|
+
plist_t newnode = NULL;
|
|
382
|
+
plist_data_t data = plist_get_data(node);
|
|
383
|
+
plist_data_t newdata = plist_new_plist_data();
|
|
384
|
+
|
|
385
|
+
assert(data); // plist should always have data
|
|
386
|
+
assert(newdata);
|
|
387
|
+
|
|
388
|
+
memcpy(newdata, data, sizeof(struct plist_data_s));
|
|
389
|
+
|
|
390
|
+
node_type = plist_get_node_type(node);
|
|
391
|
+
switch (node_type) {
|
|
392
|
+
case PLIST_DATA:
|
|
393
|
+
newdata->buff = (uint8_t *) malloc(data->length);
|
|
394
|
+
memcpy(newdata->buff, data->buff, data->length);
|
|
395
|
+
break;
|
|
396
|
+
case PLIST_KEY:
|
|
397
|
+
case PLIST_STRING:
|
|
398
|
+
newdata->strval = strdup((char *) data->strval);
|
|
399
|
+
break;
|
|
400
|
+
case PLIST_ARRAY:
|
|
401
|
+
if (data->hashtable) {
|
|
402
|
+
ptrarray_t* pa = ptr_array_new(((ptrarray_t*)data->hashtable)->capacity);
|
|
403
|
+
assert(pa);
|
|
404
|
+
newdata->hashtable = pa;
|
|
405
|
+
}
|
|
406
|
+
break;
|
|
407
|
+
case PLIST_DICT:
|
|
408
|
+
if (data->hashtable) {
|
|
409
|
+
hashtable_t* ht = hash_table_new(dict_key_hash, dict_key_compare, NULL);
|
|
410
|
+
assert(ht);
|
|
411
|
+
newdata->hashtable = ht;
|
|
412
|
+
}
|
|
413
|
+
break;
|
|
414
|
+
default:
|
|
415
|
+
break;
|
|
416
|
+
}
|
|
417
|
+
newnode = plist_new_node(newdata);
|
|
418
|
+
|
|
419
|
+
node_t *ch;
|
|
420
|
+
unsigned int node_index = 0;
|
|
421
|
+
for (ch = node_first_child(node); ch; ch = node_next_sibling(ch)) {
|
|
422
|
+
/* copy child node */
|
|
423
|
+
plist_t newch = plist_copy_node(ch);
|
|
424
|
+
/* attach to new parent node */
|
|
425
|
+
node_attach(newnode, newch);
|
|
426
|
+
/* if needed, add child node to lookup table of parent node */
|
|
427
|
+
switch (node_type) {
|
|
428
|
+
case PLIST_ARRAY:
|
|
429
|
+
if (newdata->hashtable) {
|
|
430
|
+
ptr_array_add((ptrarray_t*)newdata->hashtable, newch);
|
|
431
|
+
}
|
|
432
|
+
break;
|
|
433
|
+
case PLIST_DICT:
|
|
434
|
+
if (newdata->hashtable && (node_index % 2 != 0)) {
|
|
435
|
+
hash_table_insert((hashtable_t*)newdata->hashtable, (node_prev_sibling((node_t*)newch))->data, newch);
|
|
436
|
+
}
|
|
437
|
+
break;
|
|
438
|
+
default:
|
|
439
|
+
break;
|
|
440
|
+
}
|
|
441
|
+
node_index++;
|
|
442
|
+
}
|
|
443
|
+
return newnode;
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
PLIST_API plist_t plist_copy(plist_t node)
|
|
447
|
+
{
|
|
448
|
+
return node ? plist_copy_node(node) : NULL;
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
PLIST_API uint32_t plist_array_get_size(plist_t node)
|
|
452
|
+
{
|
|
453
|
+
uint32_t ret = 0;
|
|
454
|
+
if (node && PLIST_ARRAY == plist_get_node_type(node))
|
|
455
|
+
{
|
|
456
|
+
ret = node_n_children(node);
|
|
457
|
+
}
|
|
458
|
+
return ret;
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
PLIST_API plist_t plist_array_get_item(plist_t node, uint32_t n)
|
|
462
|
+
{
|
|
463
|
+
plist_t ret = NULL;
|
|
464
|
+
if (node && PLIST_ARRAY == plist_get_node_type(node) && n < INT_MAX)
|
|
465
|
+
{
|
|
466
|
+
ptrarray_t *pa = ((plist_data_t)((node_t*)node)->data)->hashtable;
|
|
467
|
+
if (pa) {
|
|
468
|
+
ret = (plist_t)ptr_array_index(pa, n);
|
|
469
|
+
} else {
|
|
470
|
+
ret = (plist_t)node_nth_child(node, n);
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
return ret;
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
PLIST_API uint32_t plist_array_get_item_index(plist_t node)
|
|
477
|
+
{
|
|
478
|
+
plist_t father = plist_get_parent(node);
|
|
479
|
+
if (PLIST_ARRAY == plist_get_node_type(father))
|
|
480
|
+
{
|
|
481
|
+
return node_child_position(father, node);
|
|
482
|
+
}
|
|
483
|
+
return UINT_MAX;
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
static void _plist_array_post_insert(plist_t node, plist_t item, long n)
|
|
487
|
+
{
|
|
488
|
+
ptrarray_t *pa = ((plist_data_t)((node_t*)node)->data)->hashtable;
|
|
489
|
+
if (pa) {
|
|
490
|
+
/* store pointer to item in array */
|
|
491
|
+
ptr_array_insert(pa, item, n);
|
|
492
|
+
} else {
|
|
493
|
+
if (((node_t*)node)->count > 100) {
|
|
494
|
+
/* make new lookup array */
|
|
495
|
+
pa = ptr_array_new(128);
|
|
496
|
+
plist_t current = NULL;
|
|
497
|
+
for (current = (plist_t)node_first_child(node);
|
|
498
|
+
pa && current;
|
|
499
|
+
current = (plist_t)node_next_sibling(current))
|
|
500
|
+
{
|
|
501
|
+
ptr_array_add(pa, current);
|
|
502
|
+
}
|
|
503
|
+
((plist_data_t)((node_t*)node)->data)->hashtable = pa;
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
PLIST_API void plist_array_set_item(plist_t node, plist_t item, uint32_t n)
|
|
509
|
+
{
|
|
510
|
+
if (node && PLIST_ARRAY == plist_get_node_type(node) && n < INT_MAX)
|
|
511
|
+
{
|
|
512
|
+
plist_t old_item = plist_array_get_item(node, n);
|
|
513
|
+
if (old_item)
|
|
514
|
+
{
|
|
515
|
+
int idx = plist_free_node(old_item);
|
|
516
|
+
assert(idx >= 0);
|
|
517
|
+
if (idx < 0) {
|
|
518
|
+
return;
|
|
519
|
+
} else {
|
|
520
|
+
node_insert(node, idx, item);
|
|
521
|
+
ptrarray_t* pa = ((plist_data_t)((node_t*)node)->data)->hashtable;
|
|
522
|
+
if (pa) {
|
|
523
|
+
ptr_array_set(pa, item, idx);
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
PLIST_API void plist_array_append_item(plist_t node, plist_t item)
|
|
531
|
+
{
|
|
532
|
+
if (node && PLIST_ARRAY == plist_get_node_type(node))
|
|
533
|
+
{
|
|
534
|
+
node_attach(node, item);
|
|
535
|
+
_plist_array_post_insert(node, item, -1);
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
PLIST_API void plist_array_insert_item(plist_t node, plist_t item, uint32_t n)
|
|
540
|
+
{
|
|
541
|
+
if (node && PLIST_ARRAY == plist_get_node_type(node) && n < INT_MAX)
|
|
542
|
+
{
|
|
543
|
+
node_insert(node, n, item);
|
|
544
|
+
_plist_array_post_insert(node, item, (long)n);
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
PLIST_API void plist_array_remove_item(plist_t node, uint32_t n)
|
|
549
|
+
{
|
|
550
|
+
if (node && PLIST_ARRAY == plist_get_node_type(node) && n < INT_MAX)
|
|
551
|
+
{
|
|
552
|
+
plist_t old_item = plist_array_get_item(node, n);
|
|
553
|
+
if (old_item)
|
|
554
|
+
{
|
|
555
|
+
ptrarray_t* pa = ((plist_data_t)((node_t*)node)->data)->hashtable;
|
|
556
|
+
if (pa) {
|
|
557
|
+
ptr_array_remove(pa, n);
|
|
558
|
+
}
|
|
559
|
+
plist_free(old_item);
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
PLIST_API void plist_array_item_remove(plist_t node)
|
|
565
|
+
{
|
|
566
|
+
plist_t father = plist_get_parent(node);
|
|
567
|
+
if (PLIST_ARRAY == plist_get_node_type(father))
|
|
568
|
+
{
|
|
569
|
+
int n = node_child_position(father, node);
|
|
570
|
+
if (n < 0) return;
|
|
571
|
+
ptrarray_t* pa = ((plist_data_t)((node_t*)father)->data)->hashtable;
|
|
572
|
+
if (pa) {
|
|
573
|
+
ptr_array_remove(pa, n);
|
|
574
|
+
}
|
|
575
|
+
plist_free(node);
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
PLIST_API void plist_array_new_iter(plist_t node, plist_array_iter *iter)
|
|
580
|
+
{
|
|
581
|
+
if (iter)
|
|
582
|
+
{
|
|
583
|
+
*iter = malloc(sizeof(node_t*));
|
|
584
|
+
*((node_t**)(*iter)) = node_first_child(node);
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
PLIST_API void plist_array_next_item(plist_t node, plist_array_iter iter, plist_t *item)
|
|
589
|
+
{
|
|
590
|
+
node_t** iter_node = (node_t**)iter;
|
|
591
|
+
|
|
592
|
+
if (item)
|
|
593
|
+
{
|
|
594
|
+
*item = NULL;
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
if (node && PLIST_ARRAY == plist_get_node_type(node) && *iter_node)
|
|
598
|
+
{
|
|
599
|
+
if (item)
|
|
600
|
+
{
|
|
601
|
+
*item = (plist_t)(*iter_node);
|
|
602
|
+
}
|
|
603
|
+
*iter_node = node_next_sibling(*iter_node);
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
PLIST_API uint32_t plist_dict_get_size(plist_t node)
|
|
608
|
+
{
|
|
609
|
+
uint32_t ret = 0;
|
|
610
|
+
if (node && PLIST_DICT == plist_get_node_type(node))
|
|
611
|
+
{
|
|
612
|
+
ret = node_n_children(node) / 2;
|
|
613
|
+
}
|
|
614
|
+
return ret;
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
PLIST_API void plist_dict_new_iter(plist_t node, plist_dict_iter *iter)
|
|
618
|
+
{
|
|
619
|
+
if (iter)
|
|
620
|
+
{
|
|
621
|
+
*iter = malloc(sizeof(node_t*));
|
|
622
|
+
*((node_t**)(*iter)) = node_first_child(node);
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
PLIST_API void plist_dict_next_item(plist_t node, plist_dict_iter iter, char **key, plist_t *val)
|
|
627
|
+
{
|
|
628
|
+
node_t** iter_node = (node_t**)iter;
|
|
629
|
+
|
|
630
|
+
if (key)
|
|
631
|
+
{
|
|
632
|
+
*key = NULL;
|
|
633
|
+
}
|
|
634
|
+
if (val)
|
|
635
|
+
{
|
|
636
|
+
*val = NULL;
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
if (node && PLIST_DICT == plist_get_node_type(node) && *iter_node)
|
|
640
|
+
{
|
|
641
|
+
if (key)
|
|
642
|
+
{
|
|
643
|
+
plist_get_key_val((plist_t)(*iter_node), key);
|
|
644
|
+
}
|
|
645
|
+
*iter_node = node_next_sibling(*iter_node);
|
|
646
|
+
if (val)
|
|
647
|
+
{
|
|
648
|
+
*val = (plist_t)(*iter_node);
|
|
649
|
+
}
|
|
650
|
+
*iter_node = node_next_sibling(*iter_node);
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
PLIST_API void plist_dict_get_item_key(plist_t node, char **key)
|
|
655
|
+
{
|
|
656
|
+
plist_t father = plist_get_parent(node);
|
|
657
|
+
if (PLIST_DICT == plist_get_node_type(father))
|
|
658
|
+
{
|
|
659
|
+
plist_get_key_val( (plist_t) node_prev_sibling(node), key);
|
|
660
|
+
}
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
PLIST_API plist_t plist_dict_item_get_key(plist_t node)
|
|
664
|
+
{
|
|
665
|
+
plist_t ret = NULL;
|
|
666
|
+
plist_t father = plist_get_parent(node);
|
|
667
|
+
if (PLIST_DICT == plist_get_node_type(father))
|
|
668
|
+
{
|
|
669
|
+
ret = (plist_t)node_prev_sibling(node);
|
|
670
|
+
}
|
|
671
|
+
return ret;
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
PLIST_API plist_t plist_dict_get_item(plist_t node, const char* key)
|
|
675
|
+
{
|
|
676
|
+
plist_t ret = NULL;
|
|
677
|
+
|
|
678
|
+
if (node && PLIST_DICT == plist_get_node_type(node))
|
|
679
|
+
{
|
|
680
|
+
plist_data_t data = plist_get_data(node);
|
|
681
|
+
hashtable_t *ht = (hashtable_t*)data->hashtable;
|
|
682
|
+
if (ht) {
|
|
683
|
+
struct plist_data_s sdata;
|
|
684
|
+
sdata.strval = (char*)key;
|
|
685
|
+
sdata.length = strlen(key);
|
|
686
|
+
ret = (plist_t)hash_table_lookup(ht, &sdata);
|
|
687
|
+
} else {
|
|
688
|
+
plist_t current = NULL;
|
|
689
|
+
for (current = (plist_t)node_first_child(node);
|
|
690
|
+
current;
|
|
691
|
+
current = (plist_t)node_next_sibling(node_next_sibling(current)))
|
|
692
|
+
{
|
|
693
|
+
data = plist_get_data(current);
|
|
694
|
+
assert( PLIST_KEY == plist_get_node_type(current) );
|
|
695
|
+
|
|
696
|
+
if (data && !strcmp(key, data->strval))
|
|
697
|
+
{
|
|
698
|
+
ret = (plist_t)node_next_sibling(current);
|
|
699
|
+
break;
|
|
700
|
+
}
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
}
|
|
704
|
+
return ret;
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
PLIST_API void plist_dict_set_item(plist_t node, const char* key, plist_t item)
|
|
708
|
+
{
|
|
709
|
+
if (node && PLIST_DICT == plist_get_node_type(node)) {
|
|
710
|
+
node_t* old_item = plist_dict_get_item(node, key);
|
|
711
|
+
plist_t key_node = NULL;
|
|
712
|
+
if (old_item) {
|
|
713
|
+
int idx = plist_free_node(old_item);
|
|
714
|
+
assert(idx >= 0);
|
|
715
|
+
if (idx < 0) {
|
|
716
|
+
return;
|
|
717
|
+
} else {
|
|
718
|
+
node_insert(node, idx, item);
|
|
719
|
+
}
|
|
720
|
+
key_node = node_prev_sibling(item);
|
|
721
|
+
} else {
|
|
722
|
+
key_node = plist_new_key(key);
|
|
723
|
+
node_attach(node, key_node);
|
|
724
|
+
node_attach(node, item);
|
|
725
|
+
}
|
|
726
|
+
|
|
727
|
+
hashtable_t *ht = ((plist_data_t)((node_t*)node)->data)->hashtable;
|
|
728
|
+
if (ht) {
|
|
729
|
+
/* store pointer to item in hash table */
|
|
730
|
+
hash_table_insert(ht, (plist_data_t)((node_t*)key_node)->data, item);
|
|
731
|
+
} else {
|
|
732
|
+
if (((node_t*)node)->count > 500) {
|
|
733
|
+
/* make new hash table */
|
|
734
|
+
ht = hash_table_new(dict_key_hash, dict_key_compare, NULL);
|
|
735
|
+
/* calculate the hashes for all entries we have so far */
|
|
736
|
+
plist_t current = NULL;
|
|
737
|
+
for (current = (plist_t)node_first_child(node);
|
|
738
|
+
ht && current;
|
|
739
|
+
current = (plist_t)node_next_sibling(node_next_sibling(current)))
|
|
740
|
+
{
|
|
741
|
+
hash_table_insert(ht, ((node_t*)current)->data, node_next_sibling(current));
|
|
742
|
+
}
|
|
743
|
+
((plist_data_t)((node_t*)node)->data)->hashtable = ht;
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
}
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
PLIST_API void plist_dict_insert_item(plist_t node, const char* key, plist_t item)
|
|
750
|
+
{
|
|
751
|
+
plist_dict_set_item(node, key, item);
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
PLIST_API void plist_dict_remove_item(plist_t node, const char* key)
|
|
755
|
+
{
|
|
756
|
+
if (node && PLIST_DICT == plist_get_node_type(node))
|
|
757
|
+
{
|
|
758
|
+
plist_t old_item = plist_dict_get_item(node, key);
|
|
759
|
+
if (old_item)
|
|
760
|
+
{
|
|
761
|
+
plist_t key_node = node_prev_sibling(old_item);
|
|
762
|
+
hashtable_t* ht = ((plist_data_t)((node_t*)node)->data)->hashtable;
|
|
763
|
+
if (ht) {
|
|
764
|
+
hash_table_remove(ht, ((node_t*)key_node)->data);
|
|
765
|
+
}
|
|
766
|
+
plist_free(key_node);
|
|
767
|
+
plist_free(old_item);
|
|
768
|
+
}
|
|
769
|
+
}
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
PLIST_API void plist_dict_merge(plist_t *target, plist_t source)
|
|
773
|
+
{
|
|
774
|
+
if (!target || !*target || (plist_get_node_type(*target) != PLIST_DICT) || !source || (plist_get_node_type(source) != PLIST_DICT))
|
|
775
|
+
return;
|
|
776
|
+
|
|
777
|
+
char* key = NULL;
|
|
778
|
+
plist_dict_iter it = NULL;
|
|
779
|
+
plist_t subnode = NULL;
|
|
780
|
+
plist_dict_new_iter(source, &it);
|
|
781
|
+
if (!it)
|
|
782
|
+
return;
|
|
783
|
+
|
|
784
|
+
do {
|
|
785
|
+
plist_dict_next_item(source, it, &key, &subnode);
|
|
786
|
+
if (!key)
|
|
787
|
+
break;
|
|
788
|
+
|
|
789
|
+
plist_dict_set_item(*target, key, plist_copy(subnode));
|
|
790
|
+
free(key);
|
|
791
|
+
key = NULL;
|
|
792
|
+
} while (1);
|
|
793
|
+
free(it);
|
|
794
|
+
}
|
|
795
|
+
|
|
796
|
+
PLIST_API plist_t plist_access_pathv(plist_t plist, uint32_t length, va_list v)
|
|
797
|
+
{
|
|
798
|
+
plist_t current = plist;
|
|
799
|
+
plist_type type = PLIST_NONE;
|
|
800
|
+
uint32_t i = 0;
|
|
801
|
+
|
|
802
|
+
for (i = 0; i < length && current; i++)
|
|
803
|
+
{
|
|
804
|
+
type = plist_get_node_type(current);
|
|
805
|
+
|
|
806
|
+
if (type == PLIST_ARRAY)
|
|
807
|
+
{
|
|
808
|
+
uint32_t n = va_arg(v, uint32_t);
|
|
809
|
+
current = plist_array_get_item(current, n);
|
|
810
|
+
}
|
|
811
|
+
else if (type == PLIST_DICT)
|
|
812
|
+
{
|
|
813
|
+
const char* key = va_arg(v, const char*);
|
|
814
|
+
current = plist_dict_get_item(current, key);
|
|
815
|
+
}
|
|
816
|
+
}
|
|
817
|
+
return current;
|
|
818
|
+
}
|
|
819
|
+
|
|
820
|
+
PLIST_API plist_t plist_access_path(plist_t plist, uint32_t length, ...)
|
|
821
|
+
{
|
|
822
|
+
plist_t ret = NULL;
|
|
823
|
+
va_list v;
|
|
824
|
+
|
|
825
|
+
va_start(v, length);
|
|
826
|
+
ret = plist_access_pathv(plist, length, v);
|
|
827
|
+
va_end(v);
|
|
828
|
+
return ret;
|
|
829
|
+
}
|
|
830
|
+
|
|
831
|
+
static void plist_get_type_and_value(plist_t node, plist_type * type, void *value, uint64_t * length)
|
|
832
|
+
{
|
|
833
|
+
plist_data_t data = NULL;
|
|
834
|
+
|
|
835
|
+
if (!node)
|
|
836
|
+
return;
|
|
837
|
+
|
|
838
|
+
data = plist_get_data(node);
|
|
839
|
+
|
|
840
|
+
*type = data->type;
|
|
841
|
+
*length = data->length;
|
|
842
|
+
|
|
843
|
+
switch (*type)
|
|
844
|
+
{
|
|
845
|
+
case PLIST_BOOLEAN:
|
|
846
|
+
*((char *) value) = data->boolval;
|
|
847
|
+
break;
|
|
848
|
+
case PLIST_UINT:
|
|
849
|
+
case PLIST_UID:
|
|
850
|
+
*((uint64_t *) value) = data->intval;
|
|
851
|
+
break;
|
|
852
|
+
case PLIST_REAL:
|
|
853
|
+
case PLIST_DATE:
|
|
854
|
+
*((double *) value) = data->realval;
|
|
855
|
+
break;
|
|
856
|
+
case PLIST_KEY:
|
|
857
|
+
case PLIST_STRING:
|
|
858
|
+
*((char **) value) = strdup(data->strval);
|
|
859
|
+
break;
|
|
860
|
+
case PLIST_DATA:
|
|
861
|
+
*((uint8_t **) value) = (uint8_t *) malloc(*length * sizeof(uint8_t));
|
|
862
|
+
memcpy(*((uint8_t **) value), data->buff, *length * sizeof(uint8_t));
|
|
863
|
+
break;
|
|
864
|
+
case PLIST_ARRAY:
|
|
865
|
+
case PLIST_DICT:
|
|
866
|
+
default:
|
|
867
|
+
break;
|
|
868
|
+
}
|
|
869
|
+
}
|
|
870
|
+
|
|
871
|
+
PLIST_API plist_t plist_get_parent(plist_t node)
|
|
872
|
+
{
|
|
873
|
+
return node ? (plist_t) ((node_t*) node)->parent : NULL;
|
|
874
|
+
}
|
|
875
|
+
|
|
876
|
+
PLIST_API plist_type plist_get_node_type(plist_t node)
|
|
877
|
+
{
|
|
878
|
+
if (node)
|
|
879
|
+
{
|
|
880
|
+
plist_data_t data = plist_get_data(node);
|
|
881
|
+
if (data)
|
|
882
|
+
return data->type;
|
|
883
|
+
}
|
|
884
|
+
return PLIST_NONE;
|
|
885
|
+
}
|
|
886
|
+
|
|
887
|
+
PLIST_API void plist_get_key_val(plist_t node, char **val)
|
|
888
|
+
{
|
|
889
|
+
if (!node || !val)
|
|
890
|
+
return;
|
|
891
|
+
plist_type type = plist_get_node_type(node);
|
|
892
|
+
uint64_t length = 0;
|
|
893
|
+
if (PLIST_KEY != type)
|
|
894
|
+
return;
|
|
895
|
+
plist_get_type_and_value(node, &type, (void *) val, &length);
|
|
896
|
+
if (!*val)
|
|
897
|
+
return;
|
|
898
|
+
assert(length == strlen(*val));
|
|
899
|
+
}
|
|
900
|
+
|
|
901
|
+
PLIST_API void plist_get_string_val(plist_t node, char **val)
|
|
902
|
+
{
|
|
903
|
+
if (!node || !val)
|
|
904
|
+
return;
|
|
905
|
+
plist_type type = plist_get_node_type(node);
|
|
906
|
+
uint64_t length = 0;
|
|
907
|
+
if (PLIST_STRING != type)
|
|
908
|
+
return;
|
|
909
|
+
plist_get_type_and_value(node, &type, (void *) val, &length);
|
|
910
|
+
if (!*val)
|
|
911
|
+
return;
|
|
912
|
+
assert(length == strlen(*val));
|
|
913
|
+
}
|
|
914
|
+
|
|
915
|
+
PLIST_API const char* plist_get_string_ptr(plist_t node, uint64_t* length)
|
|
916
|
+
{
|
|
917
|
+
if (!node)
|
|
918
|
+
return NULL;
|
|
919
|
+
plist_type type = plist_get_node_type(node);
|
|
920
|
+
if (PLIST_STRING != type)
|
|
921
|
+
return NULL;
|
|
922
|
+
plist_data_t data = plist_get_data(node);
|
|
923
|
+
if (length)
|
|
924
|
+
*length = data->length;
|
|
925
|
+
return (const char*)data->strval;
|
|
926
|
+
}
|
|
927
|
+
|
|
928
|
+
PLIST_API void plist_get_bool_val(plist_t node, uint8_t * val)
|
|
929
|
+
{
|
|
930
|
+
if (!node || !val)
|
|
931
|
+
return;
|
|
932
|
+
plist_type type = plist_get_node_type(node);
|
|
933
|
+
uint64_t length = 0;
|
|
934
|
+
if (PLIST_BOOLEAN != type)
|
|
935
|
+
return;
|
|
936
|
+
plist_get_type_and_value(node, &type, (void *) val, &length);
|
|
937
|
+
assert(length == sizeof(uint8_t));
|
|
938
|
+
}
|
|
939
|
+
|
|
940
|
+
PLIST_API void plist_get_uint_val(plist_t node, uint64_t * val)
|
|
941
|
+
{
|
|
942
|
+
if (!node || !val)
|
|
943
|
+
return;
|
|
944
|
+
plist_type type = plist_get_node_type(node);
|
|
945
|
+
uint64_t length = 0;
|
|
946
|
+
if (PLIST_UINT != type)
|
|
947
|
+
return;
|
|
948
|
+
plist_get_type_and_value(node, &type, (void *) val, &length);
|
|
949
|
+
assert(length == sizeof(uint64_t) || length == 16);
|
|
950
|
+
}
|
|
951
|
+
|
|
952
|
+
PLIST_API void plist_get_uid_val(plist_t node, uint64_t * val)
|
|
953
|
+
{
|
|
954
|
+
if (!node || !val)
|
|
955
|
+
return;
|
|
956
|
+
plist_type type = plist_get_node_type(node);
|
|
957
|
+
uint64_t length = 0;
|
|
958
|
+
if (PLIST_UID != type)
|
|
959
|
+
return;
|
|
960
|
+
plist_get_type_and_value(node, &type, (void *) val, &length);
|
|
961
|
+
assert(length == sizeof(uint64_t));
|
|
962
|
+
}
|
|
963
|
+
|
|
964
|
+
PLIST_API void plist_get_real_val(plist_t node, double *val)
|
|
965
|
+
{
|
|
966
|
+
if (!node || !val)
|
|
967
|
+
return;
|
|
968
|
+
plist_type type = plist_get_node_type(node);
|
|
969
|
+
uint64_t length = 0;
|
|
970
|
+
if (PLIST_REAL != type)
|
|
971
|
+
return;
|
|
972
|
+
plist_get_type_and_value(node, &type, (void *) val, &length);
|
|
973
|
+
assert(length == sizeof(double));
|
|
974
|
+
}
|
|
975
|
+
|
|
976
|
+
PLIST_API void plist_get_data_val(plist_t node, char **val, uint64_t * length)
|
|
977
|
+
{
|
|
978
|
+
if (!node || !val || !length)
|
|
979
|
+
return;
|
|
980
|
+
plist_type type = plist_get_node_type(node);
|
|
981
|
+
if (PLIST_DATA != type)
|
|
982
|
+
return;
|
|
983
|
+
plist_get_type_and_value(node, &type, (void *) val, length);
|
|
984
|
+
}
|
|
985
|
+
|
|
986
|
+
PLIST_API const char* plist_get_data_ptr(plist_t node, uint64_t* length)
|
|
987
|
+
{
|
|
988
|
+
if (!node || !length)
|
|
989
|
+
return NULL;
|
|
990
|
+
plist_type type = plist_get_node_type(node);
|
|
991
|
+
if (PLIST_DATA != type)
|
|
992
|
+
return NULL;
|
|
993
|
+
plist_data_t data = plist_get_data(node);
|
|
994
|
+
*length = data->length;
|
|
995
|
+
return (const char*)data->buff;
|
|
996
|
+
}
|
|
997
|
+
|
|
998
|
+
PLIST_API void plist_get_date_val(plist_t node, int32_t * sec, int32_t * usec)
|
|
999
|
+
{
|
|
1000
|
+
if (!node)
|
|
1001
|
+
return;
|
|
1002
|
+
plist_type type = plist_get_node_type(node);
|
|
1003
|
+
uint64_t length = 0;
|
|
1004
|
+
double val = 0;
|
|
1005
|
+
if (PLIST_DATE != type)
|
|
1006
|
+
return;
|
|
1007
|
+
plist_get_type_and_value(node, &type, (void *) &val, &length);
|
|
1008
|
+
assert(length == sizeof(double));
|
|
1009
|
+
if (sec)
|
|
1010
|
+
*sec = (int32_t)val;
|
|
1011
|
+
if (usec)
|
|
1012
|
+
*usec = (int32_t)fabs((val - (int64_t)val) * 1000000);
|
|
1013
|
+
}
|
|
1014
|
+
|
|
1015
|
+
int plist_data_compare(const void *a, const void *b)
|
|
1016
|
+
{
|
|
1017
|
+
plist_data_t val_a = NULL;
|
|
1018
|
+
plist_data_t val_b = NULL;
|
|
1019
|
+
|
|
1020
|
+
if (!a || !b)
|
|
1021
|
+
return FALSE;
|
|
1022
|
+
|
|
1023
|
+
if (!((node_t*) a)->data || !((node_t*) b)->data)
|
|
1024
|
+
return FALSE;
|
|
1025
|
+
|
|
1026
|
+
val_a = plist_get_data((plist_t) a);
|
|
1027
|
+
val_b = plist_get_data((plist_t) b);
|
|
1028
|
+
|
|
1029
|
+
if (val_a->type != val_b->type)
|
|
1030
|
+
return FALSE;
|
|
1031
|
+
|
|
1032
|
+
switch (val_a->type)
|
|
1033
|
+
{
|
|
1034
|
+
case PLIST_BOOLEAN:
|
|
1035
|
+
case PLIST_UINT:
|
|
1036
|
+
case PLIST_REAL:
|
|
1037
|
+
case PLIST_DATE:
|
|
1038
|
+
case PLIST_UID:
|
|
1039
|
+
if (val_a->length != val_b->length)
|
|
1040
|
+
return FALSE;
|
|
1041
|
+
if (val_a->intval == val_b->intval) //it is an union so this is sufficient
|
|
1042
|
+
return TRUE;
|
|
1043
|
+
else
|
|
1044
|
+
return FALSE;
|
|
1045
|
+
|
|
1046
|
+
case PLIST_KEY:
|
|
1047
|
+
case PLIST_STRING:
|
|
1048
|
+
if (!strcmp(val_a->strval, val_b->strval))
|
|
1049
|
+
return TRUE;
|
|
1050
|
+
else
|
|
1051
|
+
return FALSE;
|
|
1052
|
+
|
|
1053
|
+
case PLIST_DATA:
|
|
1054
|
+
if (val_a->length != val_b->length)
|
|
1055
|
+
return FALSE;
|
|
1056
|
+
if (!memcmp(val_a->buff, val_b->buff, val_a->length))
|
|
1057
|
+
return TRUE;
|
|
1058
|
+
else
|
|
1059
|
+
return FALSE;
|
|
1060
|
+
case PLIST_ARRAY:
|
|
1061
|
+
case PLIST_DICT:
|
|
1062
|
+
//compare pointer
|
|
1063
|
+
if (a == b)
|
|
1064
|
+
return TRUE;
|
|
1065
|
+
else
|
|
1066
|
+
return FALSE;
|
|
1067
|
+
break;
|
|
1068
|
+
default:
|
|
1069
|
+
break;
|
|
1070
|
+
}
|
|
1071
|
+
return FALSE;
|
|
1072
|
+
}
|
|
1073
|
+
|
|
1074
|
+
PLIST_API char plist_compare_node_value(plist_t node_l, plist_t node_r)
|
|
1075
|
+
{
|
|
1076
|
+
return plist_data_compare(node_l, node_r);
|
|
1077
|
+
}
|
|
1078
|
+
|
|
1079
|
+
static void plist_set_element_val(plist_t node, plist_type type, const void *value, uint64_t length)
|
|
1080
|
+
{
|
|
1081
|
+
//free previous allocated buffer
|
|
1082
|
+
plist_data_t data = plist_get_data(node);
|
|
1083
|
+
assert(data); // a node should always have data attached
|
|
1084
|
+
|
|
1085
|
+
switch (data->type)
|
|
1086
|
+
{
|
|
1087
|
+
case PLIST_KEY:
|
|
1088
|
+
case PLIST_STRING:
|
|
1089
|
+
free(data->strval);
|
|
1090
|
+
data->strval = NULL;
|
|
1091
|
+
break;
|
|
1092
|
+
case PLIST_DATA:
|
|
1093
|
+
free(data->buff);
|
|
1094
|
+
data->buff = NULL;
|
|
1095
|
+
break;
|
|
1096
|
+
default:
|
|
1097
|
+
break;
|
|
1098
|
+
}
|
|
1099
|
+
|
|
1100
|
+
//now handle value
|
|
1101
|
+
|
|
1102
|
+
data->type = type;
|
|
1103
|
+
data->length = length;
|
|
1104
|
+
|
|
1105
|
+
switch (type)
|
|
1106
|
+
{
|
|
1107
|
+
case PLIST_BOOLEAN:
|
|
1108
|
+
data->boolval = *((char *) value);
|
|
1109
|
+
break;
|
|
1110
|
+
case PLIST_UINT:
|
|
1111
|
+
case PLIST_UID:
|
|
1112
|
+
data->intval = *((uint64_t *) value);
|
|
1113
|
+
break;
|
|
1114
|
+
case PLIST_REAL:
|
|
1115
|
+
case PLIST_DATE:
|
|
1116
|
+
data->realval = *((double *) value);
|
|
1117
|
+
break;
|
|
1118
|
+
case PLIST_KEY:
|
|
1119
|
+
case PLIST_STRING:
|
|
1120
|
+
data->strval = strdup((char *) value);
|
|
1121
|
+
break;
|
|
1122
|
+
case PLIST_DATA:
|
|
1123
|
+
data->buff = (uint8_t *) malloc(length);
|
|
1124
|
+
memcpy(data->buff, value, length);
|
|
1125
|
+
break;
|
|
1126
|
+
case PLIST_ARRAY:
|
|
1127
|
+
case PLIST_DICT:
|
|
1128
|
+
default:
|
|
1129
|
+
break;
|
|
1130
|
+
}
|
|
1131
|
+
}
|
|
1132
|
+
|
|
1133
|
+
PLIST_API void plist_set_key_val(plist_t node, const char *val)
|
|
1134
|
+
{
|
|
1135
|
+
plist_t father = plist_get_parent(node);
|
|
1136
|
+
plist_t item = plist_dict_get_item(father, val);
|
|
1137
|
+
if (item) {
|
|
1138
|
+
return;
|
|
1139
|
+
}
|
|
1140
|
+
plist_set_element_val(node, PLIST_KEY, val, strlen(val));
|
|
1141
|
+
}
|
|
1142
|
+
|
|
1143
|
+
PLIST_API void plist_set_string_val(plist_t node, const char *val)
|
|
1144
|
+
{
|
|
1145
|
+
plist_set_element_val(node, PLIST_STRING, val, strlen(val));
|
|
1146
|
+
}
|
|
1147
|
+
|
|
1148
|
+
PLIST_API void plist_set_bool_val(plist_t node, uint8_t val)
|
|
1149
|
+
{
|
|
1150
|
+
plist_set_element_val(node, PLIST_BOOLEAN, &val, sizeof(uint8_t));
|
|
1151
|
+
}
|
|
1152
|
+
|
|
1153
|
+
PLIST_API void plist_set_uint_val(plist_t node, uint64_t val)
|
|
1154
|
+
{
|
|
1155
|
+
plist_set_element_val(node, PLIST_UINT, &val, sizeof(uint64_t));
|
|
1156
|
+
}
|
|
1157
|
+
|
|
1158
|
+
PLIST_API void plist_set_uid_val(plist_t node, uint64_t val)
|
|
1159
|
+
{
|
|
1160
|
+
plist_set_element_val(node, PLIST_UID, &val, sizeof(uint64_t));
|
|
1161
|
+
}
|
|
1162
|
+
|
|
1163
|
+
PLIST_API void plist_set_real_val(plist_t node, double val)
|
|
1164
|
+
{
|
|
1165
|
+
plist_set_element_val(node, PLIST_REAL, &val, sizeof(double));
|
|
1166
|
+
}
|
|
1167
|
+
|
|
1168
|
+
PLIST_API void plist_set_data_val(plist_t node, const char *val, uint64_t length)
|
|
1169
|
+
{
|
|
1170
|
+
plist_set_element_val(node, PLIST_DATA, val, length);
|
|
1171
|
+
}
|
|
1172
|
+
|
|
1173
|
+
PLIST_API void plist_set_date_val(plist_t node, int32_t sec, int32_t usec)
|
|
1174
|
+
{
|
|
1175
|
+
double val = (double)sec + (double)usec / 1000000;
|
|
1176
|
+
plist_set_element_val(node, PLIST_DATE, &val, sizeof(struct timeval));
|
|
1177
|
+
}
|
|
1178
|
+
|
|
1179
|
+
PLIST_API int plist_bool_val_is_true(plist_t boolnode)
|
|
1180
|
+
{
|
|
1181
|
+
if (!PLIST_IS_BOOLEAN(boolnode)) {
|
|
1182
|
+
return 0;
|
|
1183
|
+
}
|
|
1184
|
+
uint8_t bv = 0;
|
|
1185
|
+
plist_get_bool_val(boolnode, &bv);
|
|
1186
|
+
return (bv == 1);
|
|
1187
|
+
}
|
|
1188
|
+
|
|
1189
|
+
PLIST_API int plist_uint_val_compare(plist_t uintnode, uint64_t cmpval)
|
|
1190
|
+
{
|
|
1191
|
+
if (!PLIST_IS_UINT(uintnode)) {
|
|
1192
|
+
return -1;
|
|
1193
|
+
}
|
|
1194
|
+
uint64_t uintval = 0;
|
|
1195
|
+
plist_get_uint_val(uintnode, &uintval);
|
|
1196
|
+
if (uintval == cmpval) {
|
|
1197
|
+
return 0;
|
|
1198
|
+
} else if (uintval < cmpval) {
|
|
1199
|
+
return -1;
|
|
1200
|
+
} else {
|
|
1201
|
+
return 1;
|
|
1202
|
+
}
|
|
1203
|
+
}
|
|
1204
|
+
|
|
1205
|
+
PLIST_API int plist_uid_val_compare(plist_t uidnode, uint64_t cmpval)
|
|
1206
|
+
{
|
|
1207
|
+
if (!PLIST_IS_UID(uidnode)) {
|
|
1208
|
+
return -1;
|
|
1209
|
+
}
|
|
1210
|
+
uint64_t uidval = 0;
|
|
1211
|
+
plist_get_uid_val(uidnode, &uidval);
|
|
1212
|
+
if (uidval == cmpval) {
|
|
1213
|
+
return 0;
|
|
1214
|
+
} else if (uidval < cmpval) {
|
|
1215
|
+
return -1;
|
|
1216
|
+
} else {
|
|
1217
|
+
return 1;
|
|
1218
|
+
}
|
|
1219
|
+
}
|
|
1220
|
+
|
|
1221
|
+
PLIST_API int plist_real_val_compare(plist_t realnode, double cmpval)
|
|
1222
|
+
{
|
|
1223
|
+
if (!PLIST_IS_REAL(realnode)) {
|
|
1224
|
+
return -1;
|
|
1225
|
+
}
|
|
1226
|
+
double a = 0;
|
|
1227
|
+
double b = cmpval;
|
|
1228
|
+
plist_get_real_val(realnode, &a);
|
|
1229
|
+
double abs_a = fabs(a);
|
|
1230
|
+
double abs_b = fabs(b);
|
|
1231
|
+
double diff = fabs(a - b);
|
|
1232
|
+
if (a == b) {
|
|
1233
|
+
return 0;
|
|
1234
|
+
} else if (a == 0 || b == 0 || (abs_a + abs_b < DBL_MIN)) {
|
|
1235
|
+
if (diff < (DBL_EPSILON * DBL_MIN)) {
|
|
1236
|
+
return 0;
|
|
1237
|
+
} else if (a < b) {
|
|
1238
|
+
return -1;
|
|
1239
|
+
}
|
|
1240
|
+
} else {
|
|
1241
|
+
if ((diff / fmin(abs_a + abs_b, DBL_MAX)) < DBL_EPSILON) {
|
|
1242
|
+
return 0;
|
|
1243
|
+
} else if (a < b) {
|
|
1244
|
+
return -1;
|
|
1245
|
+
}
|
|
1246
|
+
}
|
|
1247
|
+
return 1;
|
|
1248
|
+
}
|
|
1249
|
+
|
|
1250
|
+
PLIST_API int plist_date_val_compare(plist_t datenode, int32_t cmpsec, int32_t cmpusec)
|
|
1251
|
+
{
|
|
1252
|
+
if (!PLIST_IS_DATE(datenode)) {
|
|
1253
|
+
return -1;
|
|
1254
|
+
}
|
|
1255
|
+
int32_t sec = 0;
|
|
1256
|
+
int32_t usec = 0;
|
|
1257
|
+
plist_get_date_val(datenode, &sec, &usec);
|
|
1258
|
+
uint64_t dateval = ((int64_t)sec << 32) | usec;
|
|
1259
|
+
uint64_t cmpval = ((int64_t)cmpsec << 32) | cmpusec;
|
|
1260
|
+
if (dateval == cmpval) {
|
|
1261
|
+
return 0;
|
|
1262
|
+
} else if (dateval < cmpval) {
|
|
1263
|
+
return -1;
|
|
1264
|
+
} else {
|
|
1265
|
+
return 1;
|
|
1266
|
+
}
|
|
1267
|
+
}
|
|
1268
|
+
|
|
1269
|
+
PLIST_API int plist_string_val_compare(plist_t strnode, const char* cmpval)
|
|
1270
|
+
{
|
|
1271
|
+
if (!PLIST_IS_STRING(strnode)) {
|
|
1272
|
+
return -1;
|
|
1273
|
+
}
|
|
1274
|
+
plist_data_t data = plist_get_data(strnode);
|
|
1275
|
+
return strcmp(data->strval, cmpval);
|
|
1276
|
+
}
|
|
1277
|
+
|
|
1278
|
+
PLIST_API int plist_string_val_compare_with_size(plist_t strnode, const char* cmpval, size_t n)
|
|
1279
|
+
{
|
|
1280
|
+
if (!PLIST_IS_STRING(strnode)) {
|
|
1281
|
+
return -1;
|
|
1282
|
+
}
|
|
1283
|
+
plist_data_t data = plist_get_data(strnode);
|
|
1284
|
+
return strncmp(data->strval, cmpval, n);
|
|
1285
|
+
}
|
|
1286
|
+
|
|
1287
|
+
PLIST_API int plist_string_val_contains(plist_t strnode, const char* substr)
|
|
1288
|
+
{
|
|
1289
|
+
if (!PLIST_IS_STRING(strnode)) {
|
|
1290
|
+
return 0;
|
|
1291
|
+
}
|
|
1292
|
+
plist_data_t data = plist_get_data(strnode);
|
|
1293
|
+
return (strstr(data->strval, substr) != NULL);
|
|
1294
|
+
}
|
|
1295
|
+
|
|
1296
|
+
PLIST_API int plist_key_val_compare(plist_t keynode, const char* cmpval)
|
|
1297
|
+
{
|
|
1298
|
+
if (!PLIST_IS_KEY(keynode)) {
|
|
1299
|
+
return -1;
|
|
1300
|
+
}
|
|
1301
|
+
plist_data_t data = plist_get_data(keynode);
|
|
1302
|
+
return strcmp(data->strval, cmpval);
|
|
1303
|
+
}
|
|
1304
|
+
|
|
1305
|
+
PLIST_API int plist_key_val_compare_with_size(plist_t keynode, const char* cmpval, size_t n)
|
|
1306
|
+
{
|
|
1307
|
+
if (!PLIST_IS_KEY(keynode)) {
|
|
1308
|
+
return -1;
|
|
1309
|
+
}
|
|
1310
|
+
plist_data_t data = plist_get_data(keynode);
|
|
1311
|
+
return strncmp(data->strval, cmpval, n);
|
|
1312
|
+
}
|
|
1313
|
+
|
|
1314
|
+
PLIST_API int plist_key_val_contains(plist_t keynode, const char* substr)
|
|
1315
|
+
{
|
|
1316
|
+
if (!PLIST_IS_KEY(keynode)) {
|
|
1317
|
+
return 0;
|
|
1318
|
+
}
|
|
1319
|
+
plist_data_t data = plist_get_data(keynode);
|
|
1320
|
+
return (strstr(data->strval, substr) != NULL);
|
|
1321
|
+
}
|
|
1322
|
+
|
|
1323
|
+
PLIST_API int plist_data_val_compare(plist_t datanode, const uint8_t* cmpval, size_t n)
|
|
1324
|
+
{
|
|
1325
|
+
if (!PLIST_IS_DATA(datanode)) {
|
|
1326
|
+
return -1;
|
|
1327
|
+
}
|
|
1328
|
+
plist_data_t data = plist_get_data(datanode);
|
|
1329
|
+
if (data->length < n) {
|
|
1330
|
+
return -1;
|
|
1331
|
+
} else if (data->length > n) {
|
|
1332
|
+
return 1;
|
|
1333
|
+
}
|
|
1334
|
+
return memcmp(data->buff, cmpval, n);
|
|
1335
|
+
}
|
|
1336
|
+
|
|
1337
|
+
PLIST_API int plist_data_val_compare_with_size(plist_t datanode, const uint8_t* cmpval, size_t n)
|
|
1338
|
+
{
|
|
1339
|
+
if (!PLIST_IS_DATA(datanode)) {
|
|
1340
|
+
return -1;
|
|
1341
|
+
}
|
|
1342
|
+
plist_data_t data = plist_get_data(datanode);
|
|
1343
|
+
if (data->length < n) {
|
|
1344
|
+
return -1;
|
|
1345
|
+
}
|
|
1346
|
+
return memcmp(data->buff, cmpval, n);
|
|
1347
|
+
}
|
|
1348
|
+
|
|
1349
|
+
PLIST_API int plist_data_val_contains(plist_t datanode, const uint8_t* cmpval, size_t n)
|
|
1350
|
+
{
|
|
1351
|
+
if (!PLIST_IS_DATA(datanode)) {
|
|
1352
|
+
return -1;
|
|
1353
|
+
}
|
|
1354
|
+
plist_data_t data = plist_get_data(datanode);
|
|
1355
|
+
return (memmem(data->buff, data->length, cmpval, n) != NULL);
|
|
1356
|
+
}
|