leptris 1.9.317.1-arm-linux → 1.9.318.0-arm-linux
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.
- checksums.yaml +4 -4
- data/Rakefile +1 -1
- data/lib/leptris/version.rb +1 -1
- data/lib/leptris/xml/ffi.rb +13 -0
- data/lib/leptris/xml/xsd.rb +61 -0
- data/lib/leptris/xml.rb +1 -0
- data/lib/libleptris.so +0 -0
- data/vendor-src/README.md +1 -1
- data/vendor-src/libleptris/CHANGELOG.md +21 -0
- data/vendor-src/libleptris/CMakeLists.txt +1 -1
- data/vendor-src/libleptris/src/CMakeLists.txt +1 -0
- data/vendor-src/libleptris/src/include/leptris/types.h +2 -0
- data/vendor-src/libleptris/src/include/leptris.h +27 -0
- data/vendor-src/libleptris/src/leptris/dom/element.h +1 -0
- data/vendor-src/libleptris/src/leptris/memory/arena.c +83 -3
- data/vendor-src/libleptris/src/leptris/xpath/evaluator.h +1 -0
- data/vendor-src/libleptris/src/leptris/xsd/compile.c +121 -0
- data/vendor-src/libleptris/test/CMakeLists.txt +3 -0
- data/vendor-src/libleptris/test/abi/test_descriptor.cpp +126 -0
- data/vendor-src/libleptris/test/memory/test_arena.cpp +106 -0
- data/vendor-src/libleptris/test/parser/test_large_documents.cpp +74 -0
- data/vendor-src/libleptris/test/xsd/README.md +12 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/570702_0.xml +13 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/570702_0.xsd +25 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/579746_0.xml +3 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/579746_0.xsd +11 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/579746_1.xml +4 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/579746_1.xsd +10 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/579746_2.xml +5 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/579746_3.xml +7 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/579746_4.xml +5 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/579746_5.xml +6 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/582887-attribute.xsd +12 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/582887-common.xsd +8 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/582887-element.xsd +11 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/582887_0.xml +7 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/582887_0.xsd +17 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/582906-1-common.xsd +6 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/582906-1-prog1.xsd +11 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/582906-1-prog2-include.xsd +9 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/582906-1-prog2.xsd +13 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/582906-1_0.xml +5 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/582906-1_0.xsd +20 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/582906-2-common.xsd +7 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/582906-2-prog1.xsd +11 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/582906-2-prog2-include.xsd +9 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/582906-2-prog2.xsd +13 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/582906-2_0.xml +5 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/582906-2_0.xsd +20 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/all.xsd +16 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/all1_0.xml +4 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/all1_0.xsd +10 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/all_0.xml +1 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/all_0.xsd +12 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/all_1.xml +2 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/all_1.xsd +12 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/all_2.xml +1 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/all_2.xsd +11 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/all_3.xml +1 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/all_4.xml +1 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/all_5.xml +1 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/all_6.xml +1 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/all_7.xml +1 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/allsg_0.xml +7 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/allsg_0.xsd +26 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/allsg_1.xml +8 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/allsg_2.xml +8 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/allsg_3.xml +7 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/allsg_4.xml +7 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/allsg_5.xml +8 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/annot-err_0.xml +4 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/annot-err_0.xsd +21 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/any1_0.xml +21 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/any1_0.xsd +22 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/any2_0.xml +24 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/any2_0.xsd +26 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/any3_0.xml +17 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/any3_0.xsd +17 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/any4_0.xml +17 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/any4_0.xsd +28 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/any5_0.xml +7 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/any5_0.xsd +13 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/any5_1.xml +12 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/any5_1.xsd +14 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/any5_2.xml +8 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/any5_3.xml +11 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/any5_4.xml +12 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/any5_5.xml +12 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/any5_6.xml +13 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/any6_0.xml +8 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/any6_1.xsd +36 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/any6_2.xsd +19 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/any7_0.xml +19 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/any7_1.xml +18 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/any7_1.xsd +13 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/any7_2.xml +20 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/any7_2.xsd +13 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/any8_0.xml +9 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/any8_1.xsd +20 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/anyAttr-derive-errors1_0.xml +30 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/anyAttr-derive-errors1_0.xsd +223 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/anyAttr-derive1_0.xml +30 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/anyAttr-derive1_0.xsd +227 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/anyAttr-derive2_0.xml +9 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/anyAttr-derive2_0.xsd +33 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/anyAttr-errors1_0.xml +26 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/anyAttr-processContents-err1_0.xml +11 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/anyAttr-processContents-err1_0.xsd +26 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/anyAttr-processContents1_0.xml +13 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/anyAttr-processContents1_0.xsd +32 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/anyAttr.importA.1_0.xsd +24 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/anyAttr.importB.1_0.xsd +21 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/anyAttr1_0.xml +31 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/anyAttr1_0.xsd +144 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/attr0_0.xml +1 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/attr0_0.xsd +13 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/attruse_0_0.xml +8 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/attruse_0_0.xsd +32 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/attruse_0_1.xml +8 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/attruse_0_2.xml +8 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/bug141312_0.xml +2 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/bug141312_0.xsd +16 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/bug141333.xml +9 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/bug141333.xsd +25 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/bug141333_0.xml +9 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/bug141333_0.xsd +25 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/bug143951.imp +12 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/bug143951_0.xml +9 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/bug143951_0.xsd +17 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/bug145246.xsd.imp +119 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/bug145246_0.xml +30 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/bug145246_0.xsd +173 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/bug152470_1.xml +9 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/bug152470_1.xsd +49 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/bug167754_0.xml +12 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/bug167754_0.xsd +29 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/bug303566_1.xml +19 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/bug303566_1.xsd +63 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/bug306806_0.xml +111 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/bug306806_1.xsd +544 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/bug309338_0.xml +4 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/bug309338_1.xsd +13 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/bug310264_0.xml +41 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/bug310264_0.xsd +18 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/bug312957_0.xml +14 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/bug312957_1.xsd +39 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/bug313982_0.xml +4 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/bug313982_0.xsd +11 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/bug321475_0.xml +10 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/bug321475_1.xsd +48 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/bug322411_0.xml +93 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/bug322411_1.xml +67 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/bug322411_1.xsd +35 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/bug323510_0.xml +3 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/bug323510_1.xsd +12 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/bug455953_0.xml +9 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/bug455953_0.xsd +29 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/changelog093_0.xml +14 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/changelog093_1.xsd +253 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/choice_0.xml +3 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/choice_0.xsd +13 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/choice_1.xml +3 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/choice_1.xsd +13 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/choice_2.xml +4 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/choice_2.xsd +13 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/choice_3.xml +4 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/choice_4.xml +2 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/choice_5.xml +6 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/choice_6.xml +7 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/complex-type-extension_0.xml +12 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/complex-type-extension_0.xsd +27 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/cos-ct-extends-1-3_0.xml +9 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/cos-ct-extends-1-3_0.xsd +51 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/cos-st-restricts-1-2-err_0.xml +3 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/cos-st-restricts-1-2-err_0.xsd +30 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/ct-sc-nobase_0.xml +4 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/ct-sc-nobase_0.xsd +24 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/date-whitespace_0.xml +29 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/date-whitespace_0.xsd +20 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/date-whitespace_1.xml +33 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/date_0.xml +27 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/date_0.xsd +122 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/decimal-1.xml +37 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/decimal-1.xsd +29 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/decimal-1_0.xml +24 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/decimal-1_1.xsd +19 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/decimal-2_0.xml +14 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/decimal-2_1.xsd +18 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/decimal-3_0.xml +17 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/decimal-3_1.xsd +18 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/derivation-ok-extension-err_0.xml +9 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/derivation-ok-extension-err_0.xsd +22 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/derivation-ok-extension_0.xml +9 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/derivation-ok-extension_0.xsd +22 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/derivation-ok-restriction-2-1-1_0.xml +8 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/derivation-ok-restriction-2-1-1_0.xsd +56 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/derivation-ok-restriction-4-1-err_0.xml +8 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/derivation-ok-restriction-4-1-err_0.xsd +69 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/derivation-restriction-anyAttr_0.xml +12 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/derivation-restriction-anyAttr_0.xsd +24 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/derivation-restriction-anyType.xml +9 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/derivation-restriction-anyType.xsd +22 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/deter0_0.xml +5 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/deter0_0.xsd +16 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/dur_0.xml +13 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/dur_0.xsd +72 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/elem0_0.xml +3 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/elem0_0.xsd +16 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/element-err_0.xml +4 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/element-err_0.xsd +39 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/element-minmax-err_0.xml +5 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/element-minmax-err_0.xsd +11 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/empty-value_0.xml +2 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/empty-value_1.xml +2 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/empty-value_1.xsd +24 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/empty_0.xml +1 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/empty_0.xsd +13 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/empty_1.xsd +9 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/extension0_0.xml +7 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/extension0_0.xsd +20 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/extension1_0.xml +1 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/extension1_0.xsd +17 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/extension1_1.xml +1 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/extension1_2.xml +1 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/extension2_0.xml +4 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/extension2_1.xsd +17 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/facet-unionST-err1_0.xml +4 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/facet-unionST-err1_0.xsd +27 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/facet-whiteSpace_0.xml +7 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/facet-whiteSpace_0.xsd +12 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/group0_0.xml +3 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/group0_0.xsd +18 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/hexbinary_0.xml +20 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/hexbinary_0.xsd +35 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/hexbinary_1.xml +15 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/idc-keyref-err1_0.xml +14 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/idc-keyref-err1_1.xsd +53 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/import-455953.xsd +24 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/import-bad-1_0.imp +5 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/import0_0.imp +13 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/import0_0.xml +8 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/import0_0.xsd +21 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/import1_0.imp +8 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/import1_0.xml +11 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/import1_0.xsd +30 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/import1_0b.imp +8 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/import2_0.imp +24 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/import2_0.xml +8 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/import2_0.xsd +24 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/include1_0.inc +28 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/include1_0.xml +8 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/include1_0.xsd +15 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/include2_0.inc +17 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/include2_0.xml +9 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/include2_0.xsd +14 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/include3_0.inc +5 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/include3_0.xml +7 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/include3_0.xsd +9 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/issue303_0.xml +1 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/issue303_0.xsd +19 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/issue40_0.xml +3 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/issue40_0.xsd +10 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/issue491_0.xml +1 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/issue491_0.xsd +18 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/item_0.xml +6 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/item_0.xsd +39 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/item_1.xsd +42 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/length1_0.xml +1 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/length1_0.xsd +11 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/length2_0.xml +5 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/length2_0.xsd +14 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/length3_0.xml +5 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/length3_0.xsd +10 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/list0_0.xml +6 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/list0_0.xsd +13 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/list0_1.xml +3 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/list0_1.xsd +13 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/list0_2.xml +4 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/mixed0_0.xml +1 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/mixed0_0.xsd +5 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/mixed1_0.xml +1 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/mixed1_0.xsd +7 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/ns0_0.xml +2 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/ns0_0.xsd +16 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/ns0_1.xml +2 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/ns0_1.xsd +16 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/ns0_2.xml +2 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/ns0_3.xml +2 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/ns0_4.xml +3 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/ns1_0.xml +2 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/ns1_0.xsd +3 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/ns2_0.xml +1 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/ns2_0.xsd +15 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/nvdcve_0.xml +5235 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/nvdcve_0.xsd +498 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/oss-fuzz-51295_0.xml +1 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/oss-fuzz-51295_0.xsd +4 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/po0_0.xml +32 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/po0_0.xsd +59 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/po1_0.xml +34 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/po1_0.xsd +64 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/poschargrp0_0.xml +2 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/poschargrp0_0.xsd +14 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/regexp-char-ref_0.xml +7 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/regexp-char-ref_0.xsd +20 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/regexp-char-ref_1.xsd +20 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/restrict-CT-attr-ref_0.xml +3 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/restrict-CT-attr-ref_0.xsd +30 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/restriction-attr1_0.xml +3 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/restriction-attr1_0.xsd +18 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/restriction-enum-1_0.xml +7 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/restriction-enum-1_1.xsd +19 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/restriction0_0.xml +5 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/restriction0_0.xsd +21 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/scc-no-xmlns_0.xml +3 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/scc-no-xmlns_0.xsd +11 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/scc-no-xsi_0.xml +3 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/scc-no-xsi_0.xsd +11 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/seq-dubl-elem1_0.xml +7 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/seq-dubl-elem1_0.xsd +25 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/seq0_0.xml +61 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/seq0_0.xsd +64 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/src-attribute1_0.xml +2 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/src-attribute1_0.xsd +13 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/src-attribute2_0.xml +2 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/src-attribute2_0.xsd +13 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/src-attribute3-1_0.xml +2 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/src-attribute3-1_0.xsd +15 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/src-attribute3-2-form_0.xml +2 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/src-attribute3-2-form_0.xsd +16 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/src-attribute3-2-st_0.xml +2 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/src-attribute3-2-st_0.xsd +22 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/src-attribute3-2-type_0.xml +2 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/src-attribute3-2-type_0.xsd +16 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/src-attribute4_0.xml +2 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/src-attribute4_0.xsd +17 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/src-element1_0.xml +2 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/src-element1_0.xsd +9 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/src-element2-1_0.xml +2 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/src-element2-1_0.xsd +17 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/src-element2-2_0.xml +2 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/src-element2-2_0.xsd +48 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/src-element3_0.xml +2 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/src-element3_0.xsd +29 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/subst-group-1_0.xsd +45 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/subst-group-1_1.xml +12 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/union2_1.xml +6 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/union2_1.xsd +21 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/union_0_0.xml +8 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/union_0_0.xsd +53 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/v012-reader-schema-main.xsd +6 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/vdv-complexTypes.xsd +37 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/vdv-first0_0.xml +33 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/vdv-first0_0.xsd +67 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/vdv-first1_0.xml +33 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/vdv-first1_0.xsd +47 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/vdv-first2_0.xml +33 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/vdv-first2_0.xsd +89 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/vdv-first3_0.xml +33 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/vdv-first3_0.xsd +68 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/vdv-first4_0.xml +33 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/vdv-first4_0.xsd +150 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/vdv-first4_1.xml +33 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/vdv-first4_2.xml +33 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/vdv-first5_0.xml +33 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/vdv-first5_0.xsd +85 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/vdv-simpleTypes.xsd +38 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/xml.xsd +117 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/xsd-list-itemType_0.xml +3 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/xsd-list-itemType_0.xsd +14 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/xsd-simpleType-varieties_0.xml +8 -0
- data/vendor-src/libleptris/test/xsd/libxml2-cases/xsd-simpleType-varieties_0.xsd +45 -0
- data/vendor-src/libleptris/test/xsd/test_xsd_compile.cpp +154 -0
- data/vendor-src/libleptris/vcpkg.json +1 -1
- metadata +355 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: ee7babaf2291f4504600ca04e9ae6bc2ec2ae180b6ab7ebaae467ad175ed240e
|
|
4
|
+
data.tar.gz: 1be2ebb114b6f49629edd3c7200ac9cc56f4afe8e346d13731d83fe8f6bb1681
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: a1fd9336ea9f80f28aa9768e387e8e7a1475de21a930ec4204047c9dc8d17f61812c97e74bf2c30b54f7c0b6fbfa7b49715b5e0a2c5be1c6ff860fe1cac6f175
|
|
7
|
+
data.tar.gz: baf8c3639dd59c27fa6a2a3bb5e1feb9449b6763a7fc221ca3cb00f5320a0ead3caf691f6c573fddaee99397d1b1679feb226bd28c97ba094a2a4627a93f8af6
|
data/Rakefile
CHANGED
|
@@ -8,7 +8,7 @@ RSpec::Core::RakeTask.new(:spec)
|
|
|
8
8
|
# Pin for `rake compile` and the platform-gem builds. Keep in lockstep
|
|
9
9
|
# with .github/workflows/build.yml (which calls `rake compile`) and the
|
|
10
10
|
# CHANGELOG when libleptris releases.
|
|
11
|
-
LIBLEPTRIS_VERSION = "1.9.
|
|
11
|
+
LIBLEPTRIS_VERSION = "1.9.318"
|
|
12
12
|
# Vendored alongside libleptris for fn:normalize-unicode (TODO
|
|
13
13
|
# .restructure/20): built per platform with a RELOCATABLE @rpath
|
|
14
14
|
# install name, loaded by ffi.rb before libleptris so the
|
data/lib/leptris/version.rb
CHANGED
data/lib/leptris/xml/ffi.rb
CHANGED
|
@@ -157,6 +157,7 @@ module Leptris
|
|
|
157
157
|
typedef :pointer, :leptris_xpath_ns_set
|
|
158
158
|
typedef :pointer, :leptris_xpath_compiled
|
|
159
159
|
typedef :pointer, :leptris_relaxng
|
|
160
|
+
typedef :pointer, :leptris_xsd_schema
|
|
160
161
|
typedef :pointer, :leptris_xslt
|
|
161
162
|
typedef :pointer, :leptris_xquery
|
|
162
163
|
typedef :pointer, :leptris_schematron
|
|
@@ -1283,6 +1284,18 @@ attach_function :leptris_parse_string,
|
|
|
1283
1284
|
:column, :int
|
|
1284
1285
|
end
|
|
1285
1286
|
|
|
1287
|
+
# XSD tier-1 (libleptris 1.9.318, #1075): compilation surface —
|
|
1288
|
+
# compile a schema, count its top-level declarations, surface
|
|
1289
|
+
# schema-level errors. Validation is a later tier.
|
|
1290
|
+
attach_function :leptris_xsd_compile,
|
|
1291
|
+
[:string, :size_t, :pointer], :leptris_xsd_schema
|
|
1292
|
+
attach_function :leptris_xsd_free,
|
|
1293
|
+
[:leptris_xsd_schema], :void
|
|
1294
|
+
attach_function :leptris_xsd_declaration_count,
|
|
1295
|
+
[:leptris_xsd_schema], :size_t
|
|
1296
|
+
attach_function :leptris_xsd_error,
|
|
1297
|
+
[:leptris_xsd_schema], UTF8_STRING
|
|
1298
|
+
|
|
1286
1299
|
attach_function :leptris_rng_parse,
|
|
1287
1300
|
[:string, :size_t, :pointer], :leptris_relaxng
|
|
1288
1301
|
attach_function :leptris_rng_parse_file,
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "ffi"
|
|
4
|
+
|
|
5
|
+
module Leptris::XML::XSD
|
|
6
|
+
module_function
|
|
7
|
+
|
|
8
|
+
def compile(schema_xml)
|
|
9
|
+
Schema.compile(schema_xml)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# A compiled XSD schema (libleptris >= 1.9.318, #1075 tier-1):
|
|
13
|
+
# the compilation surface — a declaration census and schema-level
|
|
14
|
+
# error reporting. Validation is a later tier and not exposed yet.
|
|
15
|
+
#
|
|
16
|
+
# schema = Leptris::XML::XSD.compile(xsd_text)
|
|
17
|
+
# schema.declaration_count # => top-level schema declarations
|
|
18
|
+
# schema.error # => nil, or the engine's message
|
|
19
|
+
#
|
|
20
|
+
class Schema
|
|
21
|
+
# GC-managed compiled handle.
|
|
22
|
+
class Handle < ::FFI::AutoPointer
|
|
23
|
+
def self.release(ptr)
|
|
24
|
+
Leptris::XML::FFI.leptris_xsd_free(ptr)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Compile a schema from XML text. Raises Error when the text is
|
|
29
|
+
# not usable at all (not well-formed, no root); schema-level
|
|
30
|
+
# problems compile to a handle whose #error carries the detail
|
|
31
|
+
# — the tier-1 contract.
|
|
32
|
+
def self.compile(schema_xml)
|
|
33
|
+
xml = schema_xml.to_s
|
|
34
|
+
status = ::FFI::MemoryPointer.new(:int)
|
|
35
|
+
raw = Leptris::XML::FFI.leptris_xsd_compile(xml, xml.bytesize, status)
|
|
36
|
+
if raw.null?
|
|
37
|
+
raise Leptris::XML::Error,
|
|
38
|
+
"schema compile failed (status #{status.read_int}): " \
|
|
39
|
+
"#{Leptris::XML::FFI.leptris_last_error}"
|
|
40
|
+
end
|
|
41
|
+
new(Handle.new(raw))
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def initialize(handle)
|
|
45
|
+
@handle = handle
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Number of top-level schema declarations the compiler
|
|
49
|
+
# recognized (elements, types, groups, ...).
|
|
50
|
+
def declaration_count
|
|
51
|
+
Leptris::XML::FFI.leptris_xsd_declaration_count(@handle)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# The engine's schema-level error message, or nil when the
|
|
55
|
+
# schema compiled cleanly.
|
|
56
|
+
def error
|
|
57
|
+
msg = Leptris::XML::FFI.leptris_xsd_error(@handle)
|
|
58
|
+
msg.nil? || msg.empty? ? nil : msg
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
data/lib/leptris/xml.rb
CHANGED
|
@@ -35,6 +35,7 @@ module Leptris
|
|
|
35
35
|
autoload :XSLT, "leptris/xml/xslt"
|
|
36
36
|
autoload :XQuery, "leptris/xml/xquery"
|
|
37
37
|
autoload :RelaxNG, "leptris/xml/relaxng"
|
|
38
|
+
autoload :XSD, "leptris/xml/xsd"
|
|
38
39
|
autoload :DTD, "leptris/xml/dtd"
|
|
39
40
|
autoload :Pull, "leptris/xml/pull"
|
|
40
41
|
autoload :Iterparse, "leptris/xml/iterparse"
|
data/lib/libleptris.so
CHANGED
|
Binary file
|
data/vendor-src/README.md
CHANGED
|
@@ -1,5 +1,26 @@
|
|
|
1
1
|
## [Unreleased]
|
|
2
2
|
|
|
3
|
+
## [1.9.318] - 2026-10-08
|
|
4
|
+
|
|
5
|
+
### Performance
|
|
6
|
+
|
|
7
|
+
- **Per-thread small-span arena recycle — the tiny-doc fixed row
|
|
8
|
+
(#1436, PR #1580).** The global retain tier deliberately skipped
|
|
9
|
+
spans below 256 KB, so every small document paid full malloc/free
|
|
10
|
+
bookkeeping per create/destroy cycle; the quiet-hardware profile
|
|
11
|
+
named that cycle as the heart of the ~185 ns/doc tiny-doc row. A
|
|
12
|
+
per-thread LIFO cache inside the arena's retain seam hands the
|
|
13
|
+
previous document's span back with no allocator, no spinlock, and
|
|
14
|
+
no cross-thread traffic. Three standing contracts preserved:
|
|
15
|
+
exact-size take (the fail-fast capacity never silently widens),
|
|
16
|
+
custom-allocator stand-down (hooked accounting sees every
|
|
17
|
+
malloc/free pair), and ASAN bypass with thread-cleanup drain.
|
|
18
|
+
Measured on bench_doc_lifecycle (interleaved A/B, Release):
|
|
19
|
+
tight cycle 183/203/183 → 166/159/159 ns/doc (~15% off the
|
|
20
|
+
fixed row).
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
3
24
|
## [1.9.317] - 2026-10-07
|
|
4
25
|
|
|
5
26
|
### Added
|
|
@@ -34,6 +34,8 @@ typedef struct leptris_doctype* LeptrisDoctype;
|
|
|
34
34
|
typedef const char* LeptrisNamespace;
|
|
35
35
|
typedef struct leptris_xpath_result* LeptrisXPathResult;
|
|
36
36
|
typedef struct leptris_relaxng* LeptrisRelaxNG;
|
|
37
|
+
/* #1075 XSD tier 1: opaque compiled W3C XML Schema handle. */
|
|
38
|
+
typedef struct leptris_xsd_schema* LeptrisXsdSchema;
|
|
37
39
|
#endif
|
|
38
40
|
|
|
39
41
|
/* ============================================================================
|
|
@@ -882,6 +882,33 @@ LEPTRIS_API LeptrisRelaxNG leptris_rng_parse(const char* schema,
|
|
|
882
882
|
LEPTRIS_API LeptrisRelaxNG leptris_rng_parse_file(const char* path,
|
|
883
883
|
LeptrisStatus* status);
|
|
884
884
|
LEPTRIS_API void leptris_rng_free(LeptrisRelaxNG rng);
|
|
885
|
+
|
|
886
|
+
/* ============================================================================
|
|
887
|
+
* XSD (W3C XML Schema) — #1075 tier 1, slice 1: compilation.
|
|
888
|
+
*
|
|
889
|
+
* leptris_xsd_compile parses schema text and builds the top-level
|
|
890
|
+
* declaration model (xs:element / xs:attribute / xs:simpleType /
|
|
891
|
+
* xs:complexType / xs:group / xs:attributeGroup / xs:notation).
|
|
892
|
+
* Slices that follow add the datatype/facet machinery, content
|
|
893
|
+
* models, identity constraints, and instance validation.
|
|
894
|
+
*
|
|
895
|
+
* @param xsd_text schema bytes (UTF-8)
|
|
896
|
+
* @param len byte length
|
|
897
|
+
* @param status LEPTRIS_OK, or LEPTRIS_ERROR_PARSE (not
|
|
898
|
+
* well-formed, not an xs:schema document, or no
|
|
899
|
+
* recognized XML Schema namespace spelling)
|
|
900
|
+
* @return compiled schema; on failure an error-carrying handle
|
|
901
|
+
* (leptris_xsd_error says why — free it the same way)
|
|
902
|
+
*/
|
|
903
|
+
LEPTRIS_API LeptrisXsdSchema leptris_xsd_compile(const char* xsd_text,
|
|
904
|
+
size_t len,
|
|
905
|
+
LeptrisStatus* status);
|
|
906
|
+
LEPTRIS_API void leptris_xsd_free(LeptrisXsdSchema schema);
|
|
907
|
+
/* Number of top-level schema declarations compiled (0 is valid). */
|
|
908
|
+
LEPTRIS_API size_t leptris_xsd_declaration_count(LeptrisXsdSchema schema);
|
|
909
|
+
/* Last compile error detail (NULL when the handle is valid).
|
|
910
|
+
* Schema-owned; lives until leptris_xsd_free. */
|
|
911
|
+
LEPTRIS_API const char* leptris_xsd_error(LeptrisXsdSchema schema);
|
|
885
912
|
/* Validate an instance document against the parsed schema
|
|
886
913
|
* (phase-2 core subset: element/attribute/text/data/value/
|
|
887
914
|
* choice/group/interleave/repeats/ref). Returns 1 valid; on 0,
|
|
@@ -29,6 +29,7 @@ typedef struct leptris_doctype* LeptrisDoctype;
|
|
|
29
29
|
typedef const char* LeptrisNamespace;
|
|
30
30
|
typedef struct leptris_xpath_result* LeptrisXPathResult;
|
|
31
31
|
typedef struct leptris_relaxng* LeptrisRelaxNG;
|
|
32
|
+
typedef struct leptris_xsd_schema* LeptrisXsdSchema;
|
|
32
33
|
#endif
|
|
33
34
|
|
|
34
35
|
#include "node.h"
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
#include "arena.h"
|
|
5
5
|
|
|
6
|
+
#include "../common/port.h" /* LEPTRIS_THREAD_LOCAL */
|
|
6
7
|
#include <stdint.h> /* uintptr_t: was transitive via glibc's mman graph */
|
|
7
8
|
#include <stdlib.h>
|
|
8
9
|
#include <string.h>
|
|
@@ -16,6 +17,7 @@
|
|
|
16
17
|
* every byte the library takes. */
|
|
17
18
|
void* leptris_alloc_hook(size_t size);
|
|
18
19
|
void leptris_free_hook(void* ptr);
|
|
20
|
+
int leptris_custom_allocator_active(void);
|
|
19
21
|
|
|
20
22
|
#define ARENA_ALIGNMENT 8u
|
|
21
23
|
|
|
@@ -92,11 +94,78 @@ static void retain_lock(void) {
|
|
|
92
94
|
static void retain_unlock(void) { __sync_lock_release(&g_retain_lock); }
|
|
93
95
|
#endif
|
|
94
96
|
|
|
97
|
+
/* ---- Small-span TLS recycle (#1436 tiny-doc fixed row) ---------
|
|
98
|
+
* The global retain deliberately skips spans below ARENA_RETAIN_MIN
|
|
99
|
+
* ("libc zone-reuses them"), but the per-document fixed-cost profile
|
|
100
|
+
* names arena create+destroy as the heart of the ~185 ns/doc
|
|
101
|
+
* tiny-doc row: even zone-recycled, malloc/free pay bookkeeping per
|
|
102
|
+
* span, and the batched-GC shape pays first-touch faults when a
|
|
103
|
+
* batch's spans outrun the zone cache. A per-thread LIFO of small
|
|
104
|
+
* spans hands the previous document's span back with no allocator,
|
|
105
|
+
* no global spinlock, and no cross-thread traffic. Same contract as
|
|
106
|
+
* the global tier: NOT zeroed, callers memset what they need. */
|
|
107
|
+
#define ARENA_TLS_SPANS 8u
|
|
108
|
+
#define ARENA_TLS_MAX_BYTES (2u * 1024u * 1024u)
|
|
109
|
+
|
|
110
|
+
typedef struct {
|
|
111
|
+
char* base[ARENA_TLS_SPANS];
|
|
112
|
+
size_t size[ARENA_TLS_SPANS];
|
|
113
|
+
size_t count;
|
|
114
|
+
size_t bytes;
|
|
115
|
+
} ArenaSmallCache;
|
|
116
|
+
|
|
117
|
+
static LEPTRIS_THREAD_LOCAL ArenaSmallCache g_small;
|
|
118
|
+
|
|
119
|
+
/* LIFO take, EXACT size only: a reused span must report exactly the
|
|
120
|
+
* requested capacity (same as a fresh malloc), or the fail-fast
|
|
121
|
+
* bound silently widens for whoever sized a span to its budget —
|
|
122
|
+
* the exhaustion specs pin that. Small spans are near-homogeneous
|
|
123
|
+
* per workload (a 64 KB-doc stream recycles 64 KB spans), so
|
|
124
|
+
* exact-match still catches the hot case. */
|
|
125
|
+
static char* small_take(size_t request, size_t* capacity) {
|
|
126
|
+
if (request >= ARENA_RETAIN_MIN) return NULL;
|
|
127
|
+
/* Stands down under custom allocators, same as the pool
|
|
128
|
+
* recycler: hooked accounting must see every malloc/free pair. */
|
|
129
|
+
if (leptris_custom_allocator_active()) return NULL;
|
|
130
|
+
for (size_t i = g_small.count; i > 0; i--) {
|
|
131
|
+
size_t idx = i - 1;
|
|
132
|
+
if (g_small.size[idx] == request) {
|
|
133
|
+
char* found = g_small.base[idx];
|
|
134
|
+
*capacity = g_small.size[idx];
|
|
135
|
+
g_small.bytes -= g_small.size[idx];
|
|
136
|
+
g_small.base[idx] = g_small.base[g_small.count - 1];
|
|
137
|
+
g_small.size[idx] = g_small.size[g_small.count - 1];
|
|
138
|
+
g_small.count--;
|
|
139
|
+
return found;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return NULL;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/* Returns 1 when the span was parked, 0 when the cache is full or
|
|
146
|
+
* the size belongs to the global tier — the caller frees then. */
|
|
147
|
+
static int small_give(char* base, size_t size) {
|
|
148
|
+
if (size >= ARENA_RETAIN_MIN) return 0;
|
|
149
|
+
if (leptris_custom_allocator_active()) return 0;
|
|
150
|
+
if (g_small.count >= ARENA_TLS_SPANS ||
|
|
151
|
+
g_small.bytes + size > ARENA_TLS_MAX_BYTES)
|
|
152
|
+
return 0;
|
|
153
|
+
g_small.base[g_small.count] = base;
|
|
154
|
+
g_small.size[g_small.count] = size;
|
|
155
|
+
g_small.count++;
|
|
156
|
+
g_small.bytes += size;
|
|
157
|
+
return 1;
|
|
158
|
+
}
|
|
159
|
+
|
|
95
160
|
/* Best fit: the smallest retained block that covers the request, so
|
|
96
161
|
* oversized blocks aren't burned on small documents. Returns the
|
|
97
|
-
* block and reports its true capacity; NULL when nothing fits
|
|
98
|
-
* the request is below the retain threshold — malloc territory). */
|
|
162
|
+
* block and reports its true capacity; NULL when nothing fits. */
|
|
99
163
|
static char* retain_take(size_t request, size_t* capacity) {
|
|
164
|
+
/* 'parked', never 'small' — MSVC's headers #define small (the
|
|
165
|
+
* OLE `#define small char`) and turn the local into a type
|
|
166
|
+
* token (C2059). */
|
|
167
|
+
char* parked = small_take(request, capacity);
|
|
168
|
+
if (parked) return parked;
|
|
100
169
|
if (request < ARENA_RETAIN_MIN) return NULL;
|
|
101
170
|
char* found = NULL;
|
|
102
171
|
size_t found_size = 0;
|
|
@@ -128,7 +197,8 @@ static void retain_give(char* base, size_t size) {
|
|
|
128
197
|
return;
|
|
129
198
|
#endif
|
|
130
199
|
if (size < ARENA_RETAIN_MIN) {
|
|
131
|
-
|
|
200
|
+
if (!small_give(base, size))
|
|
201
|
+
leptris_free_hook(base);
|
|
132
202
|
return;
|
|
133
203
|
}
|
|
134
204
|
retain_lock();
|
|
@@ -149,6 +219,16 @@ static void retain_give(char* base, size_t size) {
|
|
|
149
219
|
* blocks are process-lifetime parking by design; release them so
|
|
150
220
|
* embedded hosts and leak checkers see a clean exit. */
|
|
151
221
|
void leptris_arena_retain_drain(void) {
|
|
222
|
+
/* The small tier drains the CALLING thread's cache — the shape
|
|
223
|
+
* leptris_thread_cleanup serves. Other threads' cached spans
|
|
224
|
+
* stay reachable through their TLS slots and die with the
|
|
225
|
+
* process (the same still-reachable parking as the global
|
|
226
|
+
* tier). */
|
|
227
|
+
for (size_t i = 0; i < g_small.count; i++)
|
|
228
|
+
leptris_free_hook(g_small.base[i]);
|
|
229
|
+
g_small.count = 0;
|
|
230
|
+
g_small.bytes = 0;
|
|
231
|
+
|
|
152
232
|
retain_lock();
|
|
153
233
|
for (size_t i = 0; i < g_retain.count; i++)
|
|
154
234
|
leptris_free_hook(g_retain.base[i]);
|
|
@@ -25,6 +25,7 @@ typedef struct leptris_doctype* LeptrisDoctype;
|
|
|
25
25
|
typedef const char* LeptrisNamespace;
|
|
26
26
|
typedef struct leptris_xpath_result* LeptrisXPathResult;
|
|
27
27
|
typedef struct leptris_relaxng* LeptrisRelaxNG;
|
|
28
|
+
typedef struct leptris_xsd_schema* LeptrisXsdSchema;
|
|
28
29
|
#endif
|
|
29
30
|
|
|
30
31
|
/* ============================================================================
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/* lib/src/leptris/xsd/compile.c — #1075 XSD tier 1, slice 1: the
|
|
2
|
+
* compilation surface. Parses schema text through the standard XML
|
|
3
|
+
* parser and models the top-level declaration set. Later slices
|
|
4
|
+
* grow the model (datatypes, facets, content models, identity
|
|
5
|
+
* constraints) — this slice's contract is the API shape, the
|
|
6
|
+
* xs:schema identity check, and the declaration enumeration. */
|
|
7
|
+
#include <stdlib.h>
|
|
8
|
+
#include <string.h>
|
|
9
|
+
|
|
10
|
+
#include "../../include/leptris.h"
|
|
11
|
+
|
|
12
|
+
#define XSD_NS "http://www.w3.org/2001/XMLSchema"
|
|
13
|
+
|
|
14
|
+
struct leptris_xsd_schema {
|
|
15
|
+
size_t declaration_count;
|
|
16
|
+
char* error;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
static void xsd_set_error(struct leptris_xsd_schema* s, const char* msg) {
|
|
20
|
+
free(s->error);
|
|
21
|
+
s->error = NULL;
|
|
22
|
+
if (msg) {
|
|
23
|
+
size_t n = strlen(msg) + 1;
|
|
24
|
+
s->error = (char*)malloc(n);
|
|
25
|
+
if (s->error) memcpy(s->error, msg, n);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/* A top-level schema-language declaration component. */
|
|
30
|
+
static int xsd_is_declaration(const char* local, const char* uri) {
|
|
31
|
+
if (uri && strcmp(uri, XSD_NS) != 0) return 0;
|
|
32
|
+
if (!local) return 0;
|
|
33
|
+
static const char* names[] = {
|
|
34
|
+
"element", "attribute", "simpleType", "complexType",
|
|
35
|
+
"group", "attributeGroup", "notation", "include",
|
|
36
|
+
"import", "redefine", NULL
|
|
37
|
+
};
|
|
38
|
+
for (int i = 0; names[i]; i++)
|
|
39
|
+
if (strcmp(local, names[i]) == 0) return 1;
|
|
40
|
+
return 0;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
LEPTRIS_API LeptrisXsdSchema leptris_xsd_compile(const char* xsd_text,
|
|
44
|
+
size_t len,
|
|
45
|
+
LeptrisStatus* status) {
|
|
46
|
+
if (status) *status = LEPTRIS_OK;
|
|
47
|
+
if (!xsd_text || len == 0) {
|
|
48
|
+
if (status) *status = LEPTRIS_ERROR_PARSE;
|
|
49
|
+
return NULL;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
struct leptris_xsd_schema* s =
|
|
53
|
+
(struct leptris_xsd_schema*)calloc(1, sizeof(*s));
|
|
54
|
+
if (!s) {
|
|
55
|
+
if (status) *status = LEPTRIS_ERROR_MEMORY;
|
|
56
|
+
return NULL;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
LeptrisDocument doc = leptris_parse_string(xsd_text, len, status);
|
|
60
|
+
if (!doc) {
|
|
61
|
+
xsd_set_error(s, "schema document is not well-formed XML");
|
|
62
|
+
goto fail;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
LeptrisElement root = leptris_document_root(doc);
|
|
66
|
+
if (!root) {
|
|
67
|
+
xsd_set_error(s, "schema document has no root element");
|
|
68
|
+
goto fail;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const char* local = NULL;
|
|
72
|
+
const char* prefix = NULL;
|
|
73
|
+
const char* uri = NULL;
|
|
74
|
+
leptris_element_expanded_name(root, &local, &prefix, &uri);
|
|
75
|
+
/* Accept the XML Schema namespace under any prefix, and the
|
|
76
|
+
* unprefixed spelling libxml2 fixtures use without a default
|
|
77
|
+
* xmlns (compilation is namespace-driven from here on). */
|
|
78
|
+
if (!local || strcmp(local, "schema") != 0 ||
|
|
79
|
+
(uri && strcmp(uri, XSD_NS) != 0)) {
|
|
80
|
+
xsd_set_error(s, "root element is not xs:schema");
|
|
81
|
+
goto fail;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
for (LeptrisNodeRef n =
|
|
85
|
+
leptris_node_first_child(leptris_element_as_node(root));
|
|
86
|
+
n; n = leptris_node_next_sibling(n)) {
|
|
87
|
+
if (leptris_node_get_type(n) != LEPTRIS_NODE_TYPE_ELEMENT)
|
|
88
|
+
continue;
|
|
89
|
+
leptris_element_expanded_name((LeptrisElement)n, &local, &prefix,
|
|
90
|
+
&uri);
|
|
91
|
+
if (xsd_is_declaration(local, uri))
|
|
92
|
+
s->declaration_count++;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
leptris_document_free(doc);
|
|
96
|
+
return s;
|
|
97
|
+
|
|
98
|
+
fail:
|
|
99
|
+
if (doc) leptris_document_free(doc);
|
|
100
|
+
if (status) *status = LEPTRIS_ERROR_PARSE;
|
|
101
|
+
/* Failure returns an error-carrying handle (the documented
|
|
102
|
+
* contract): leptris_xsd_error says why, free it the same way. */
|
|
103
|
+
return (LeptrisXsdSchema)s;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
LEPTRIS_API void leptris_xsd_free(LeptrisXsdSchema schema) {
|
|
107
|
+
struct leptris_xsd_schema* s = (struct leptris_xsd_schema*)schema;
|
|
108
|
+
if (!s) return;
|
|
109
|
+
free(s->error);
|
|
110
|
+
free(s);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
LEPTRIS_API size_t leptris_xsd_declaration_count(LeptrisXsdSchema schema) {
|
|
114
|
+
if (!schema) return 0;
|
|
115
|
+
return ((struct leptris_xsd_schema*)schema)->declaration_count;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
LEPTRIS_API const char* leptris_xsd_error(LeptrisXsdSchema schema) {
|
|
119
|
+
if (!schema) return NULL;
|
|
120
|
+
return ((struct leptris_xsd_schema*)schema)->error;
|
|
121
|
+
}
|
|
@@ -116,6 +116,9 @@ leptris_add_test(test_text_borrowed dom/test_text_borrowed.cpp)
|
|
|
116
116
|
leptris_add_test(test_compact dom/test_compact.cpp)
|
|
117
117
|
leptris_add_test(test_digest dom/test_digest.cpp)
|
|
118
118
|
leptris_add_test(test_rng rng/test_rng.cpp)
|
|
119
|
+
leptris_add_test(test_xsd_compile xsd/test_xsd_compile.cpp)
|
|
120
|
+
target_compile_definitions(test_xsd_compile PRIVATE
|
|
121
|
+
LEPTRIS_XSD_CASES_DIR="${CMAKE_CURRENT_SOURCE_DIR}/xsd/libxml2-cases")
|
|
119
122
|
target_compile_definitions(test_rng PRIVATE
|
|
120
123
|
LEPTRIS_RNG_INCLUDE_DIR="${CMAKE_CURRENT_SOURCE_DIR}/rng/include-cases")
|
|
121
124
|
leptris_add_test(test_rng_corpus rng/test_rng_corpus.cpp)
|
|
@@ -1837,3 +1837,129 @@ TEST(Plan1560, UnqualifiedNsFormBindsNoPrefixSpellings) {
|
|
|
1837
1837
|
}
|
|
1838
1838
|
leptris_plan_free(plan);
|
|
1839
1839
|
}
|
|
1840
|
+
|
|
1841
|
+
// ---- #1563: nested attr parity -------------------------------------
|
|
1842
|
+
// The report: a two-level plan whose root carries one exact-URI
|
|
1843
|
+
// attribute row drops the CHILD's attribute capture — the child's
|
|
1844
|
+
// PlanValue answers attribute("name") nil for a prefixed w:name
|
|
1845
|
+
// while the same child plan compiled as ROOT binds it. This is the
|
|
1846
|
+
// A/B discriminator: one child plan (plain unset-form attr row, the
|
|
1847
|
+
// reporter's shape; ANY-form as the binding control), walked BOTH
|
|
1848
|
+
// ways. Whatever the outcome, the two paths must AGREE.
|
|
1849
|
+
TEST(Plan1563, PlainAttrRowAgreesNestedVsRoot) {
|
|
1850
|
+
LeptrisStatus st = LEPTRIS_OK;
|
|
1851
|
+
|
|
1852
|
+
leptris_attr_plan root_attrs[1] = {};
|
|
1853
|
+
root_attrs[0].wire_name = "Ignorable";
|
|
1854
|
+
root_attrs[0].kind = LEPTRIS_PLAN_KIND_SCALAR;
|
|
1855
|
+
root_attrs[0].type_tag = 1;
|
|
1856
|
+
root_attrs[0].ns_form = LEPTRIS_PLAN_NS_EXACT;
|
|
1857
|
+
root_attrs[0].ns_uri = "urn:mc";
|
|
1858
|
+
root_attrs[0].ns_prefix = "mc";
|
|
1859
|
+
|
|
1860
|
+
leptris_child_plan font_row[1] = {};
|
|
1861
|
+
font_row[0].wire_name = "font";
|
|
1862
|
+
font_row[0].kind = LEPTRIS_PLAN_KIND_NESTED;
|
|
1863
|
+
font_row[0].child_plan_index = 1;
|
|
1864
|
+
font_row[0].ns_form = LEPTRIS_PLAN_NS_EXACT;
|
|
1865
|
+
font_row[0].ns_uri = "urn:w";
|
|
1866
|
+
font_row[0].ns_prefix = "w";
|
|
1867
|
+
|
|
1868
|
+
/* The reporter's child row: PLAIN wire_name, unset ns_form. */
|
|
1869
|
+
leptris_attr_plan font_attrs_plain[1] = {};
|
|
1870
|
+
font_attrs_plain[0].wire_name = "name";
|
|
1871
|
+
font_attrs_plain[0].kind = LEPTRIS_PLAN_KIND_SCALAR;
|
|
1872
|
+
font_attrs_plain[0].type_tag = 1;
|
|
1873
|
+
|
|
1874
|
+
/* Control: ANY form with the LOCAL name must bind w:name. */
|
|
1875
|
+
leptris_attr_plan font_attrs_any[1] = {};
|
|
1876
|
+
font_attrs_any[0].wire_name = "name";
|
|
1877
|
+
font_attrs_any[0].kind = LEPTRIS_PLAN_KIND_SCALAR;
|
|
1878
|
+
font_attrs_any[0].type_tag = 1;
|
|
1879
|
+
font_attrs_any[0].ns_form = LEPTRIS_PLAN_NS_ANY;
|
|
1880
|
+
font_attrs_any[0].pad_ns = 1;
|
|
1881
|
+
|
|
1882
|
+
leptris_element_plan nested_plans[2] = {};
|
|
1883
|
+
nested_plans[0].element_name = "fonts";
|
|
1884
|
+
nested_plans[0].attribute_count = 1;
|
|
1885
|
+
nested_plans[0].attribute_plans = root_attrs;
|
|
1886
|
+
nested_plans[0].child_count = 1;
|
|
1887
|
+
nested_plans[0].child_plans = font_row;
|
|
1888
|
+
nested_plans[0].ns_form = LEPTRIS_PLAN_NS_EXACT;
|
|
1889
|
+
nested_plans[0].ns_uri = "urn:w";
|
|
1890
|
+
nested_plans[0].ns_prefix = "w";
|
|
1891
|
+
nested_plans[1].element_name = "font";
|
|
1892
|
+
nested_plans[1].attribute_count = 1;
|
|
1893
|
+
nested_plans[1].attribute_plans = font_attrs_plain;
|
|
1894
|
+
nested_plans[1].ns_form = LEPTRIS_PLAN_NS_EXACT;
|
|
1895
|
+
nested_plans[1].ns_uri = "urn:w";
|
|
1896
|
+
nested_plans[1].ns_prefix = "w";
|
|
1897
|
+
|
|
1898
|
+
leptris_plan_spec nested_spec = {};
|
|
1899
|
+
nested_spec.abi_version = leptris_plan_abi_version();
|
|
1900
|
+
nested_spec.plan_count = 2;
|
|
1901
|
+
nested_spec.plans = nested_plans;
|
|
1902
|
+
LeptrisPlan nested_plan = leptris_plan_build(&nested_spec, &st);
|
|
1903
|
+
ASSERT_NE(nested_plan, nullptr);
|
|
1904
|
+
|
|
1905
|
+
/* Root walk of the SAME child plan (reporter's standalone doc). */
|
|
1906
|
+
leptris_element_plan root_plans[1] = {};
|
|
1907
|
+
root_plans[0] = nested_plans[1];
|
|
1908
|
+
leptris_plan_spec root_spec = {};
|
|
1909
|
+
root_spec.abi_version = leptris_plan_abi_version();
|
|
1910
|
+
root_spec.plan_count = 1;
|
|
1911
|
+
root_spec.plans = root_plans;
|
|
1912
|
+
LeptrisPlan root_plan = leptris_plan_build(&root_spec, &st);
|
|
1913
|
+
ASSERT_NE(root_plan, nullptr);
|
|
1914
|
+
|
|
1915
|
+
const char* nested_xml =
|
|
1916
|
+
"<w:fonts xmlns:w=\"urn:w\" xmlns:mc=\"urn:mc\""
|
|
1917
|
+
" mc:Ignorable=\"w14\"><w:font w:name=\"Arial\"/></w:fonts>";
|
|
1918
|
+
const char* root_xml =
|
|
1919
|
+
"<w:font xmlns:w=\"urn:w\" w:name=\"Arial\"/>";
|
|
1920
|
+
|
|
1921
|
+
LeptrisDocument doc = leptris_parse_string(nested_xml, strlen(nested_xml), &st);
|
|
1922
|
+
ASSERT_NE(doc, nullptr);
|
|
1923
|
+
LeptrisPlanResult r = leptris_plan_walk(doc, leptris_document_root(doc), nested_plan, &st);
|
|
1924
|
+
ASSERT_NE(r, nullptr);
|
|
1925
|
+
ASSERT_EQ(leptris_plan_value_count(r), 1u);
|
|
1926
|
+
LeptrisPlanResult font_nested = leptris_plan_value_at(r, 0);
|
|
1927
|
+
ASSERT_NE(font_nested, nullptr);
|
|
1928
|
+
const char* nested_plain = leptris_plan_value_attribute(font_nested, "name");
|
|
1929
|
+
leptris_plan_result_free(r);
|
|
1930
|
+
leptris_document_free(doc);
|
|
1931
|
+
|
|
1932
|
+
LeptrisDocument doc2 = leptris_parse_string(root_xml, strlen(root_xml), &st);
|
|
1933
|
+
ASSERT_NE(doc2, nullptr);
|
|
1934
|
+
LeptrisPlanResult r2 = leptris_plan_walk(doc2, leptris_document_root(doc2), root_plan, &st);
|
|
1935
|
+
ASSERT_NE(r2, nullptr);
|
|
1936
|
+
/* The walk root carries no row stamp — its attrs answer through
|
|
1937
|
+
* the plan's rows. */
|
|
1938
|
+
const char* root_plain = leptris_plan_value_attribute(r2, "name");
|
|
1939
|
+
leptris_plan_result_free(r2);
|
|
1940
|
+
leptris_document_free(doc2);
|
|
1941
|
+
|
|
1942
|
+
RecordProperty("nested_plain_nil", nested_plain ? "0" : "1");
|
|
1943
|
+
RecordProperty("root_plain_nil", root_plain ? "0" : "1");
|
|
1944
|
+
/* The two paths must agree, whichever semantic that is. */
|
|
1945
|
+
ASSERT_EQ(nested_plain == nullptr, root_plain == nullptr)
|
|
1946
|
+
<< "nested=" << (nested_plain ? nested_plain : "(nil)")
|
|
1947
|
+
<< " root=" << (root_plain ? root_plain : "(nil)");
|
|
1948
|
+
|
|
1949
|
+
/* Control: ANY-form rows bind w:name BOTH ways. */
|
|
1950
|
+
nested_plans[1].attribute_plans = font_attrs_any;
|
|
1951
|
+
LeptrisPlan nested_any = leptris_plan_build(&nested_spec, &st);
|
|
1952
|
+
ASSERT_NE(nested_any, nullptr);
|
|
1953
|
+
LeptrisDocument doc3 = leptris_parse_string(nested_xml, strlen(nested_xml), &st);
|
|
1954
|
+
ASSERT_NE(doc3, nullptr);
|
|
1955
|
+
LeptrisPlanResult r3 = leptris_plan_walk(doc3, leptris_document_root(doc3), nested_any, &st);
|
|
1956
|
+
ASSERT_NE(r3, nullptr);
|
|
1957
|
+
LeptrisPlanResult font_any = leptris_plan_value_at(r3, 0);
|
|
1958
|
+
ASSERT_NE(font_any, nullptr);
|
|
1959
|
+
EXPECT_STREQ(leptris_plan_value_attribute(font_any, "name"), "Arial");
|
|
1960
|
+
leptris_plan_result_free(r3);
|
|
1961
|
+
leptris_document_free(doc3);
|
|
1962
|
+
leptris_plan_free(nested_any);
|
|
1963
|
+
leptris_plan_free(root_plan);
|
|
1964
|
+
leptris_plan_free(nested_plan);
|
|
1965
|
+
}
|