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.
Files changed (375) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +1 -1
  3. data/lib/leptris/version.rb +1 -1
  4. data/lib/leptris/xml/ffi.rb +13 -0
  5. data/lib/leptris/xml/xsd.rb +61 -0
  6. data/lib/leptris/xml.rb +1 -0
  7. data/lib/libleptris.so +0 -0
  8. data/vendor-src/README.md +1 -1
  9. data/vendor-src/libleptris/CHANGELOG.md +21 -0
  10. data/vendor-src/libleptris/CMakeLists.txt +1 -1
  11. data/vendor-src/libleptris/src/CMakeLists.txt +1 -0
  12. data/vendor-src/libleptris/src/include/leptris/types.h +2 -0
  13. data/vendor-src/libleptris/src/include/leptris.h +27 -0
  14. data/vendor-src/libleptris/src/leptris/dom/element.h +1 -0
  15. data/vendor-src/libleptris/src/leptris/memory/arena.c +83 -3
  16. data/vendor-src/libleptris/src/leptris/xpath/evaluator.h +1 -0
  17. data/vendor-src/libleptris/src/leptris/xsd/compile.c +121 -0
  18. data/vendor-src/libleptris/test/CMakeLists.txt +3 -0
  19. data/vendor-src/libleptris/test/abi/test_descriptor.cpp +126 -0
  20. data/vendor-src/libleptris/test/memory/test_arena.cpp +106 -0
  21. data/vendor-src/libleptris/test/parser/test_large_documents.cpp +74 -0
  22. data/vendor-src/libleptris/test/xsd/README.md +12 -0
  23. data/vendor-src/libleptris/test/xsd/libxml2-cases/570702_0.xml +13 -0
  24. data/vendor-src/libleptris/test/xsd/libxml2-cases/570702_0.xsd +25 -0
  25. data/vendor-src/libleptris/test/xsd/libxml2-cases/579746_0.xml +3 -0
  26. data/vendor-src/libleptris/test/xsd/libxml2-cases/579746_0.xsd +11 -0
  27. data/vendor-src/libleptris/test/xsd/libxml2-cases/579746_1.xml +4 -0
  28. data/vendor-src/libleptris/test/xsd/libxml2-cases/579746_1.xsd +10 -0
  29. data/vendor-src/libleptris/test/xsd/libxml2-cases/579746_2.xml +5 -0
  30. data/vendor-src/libleptris/test/xsd/libxml2-cases/579746_3.xml +7 -0
  31. data/vendor-src/libleptris/test/xsd/libxml2-cases/579746_4.xml +5 -0
  32. data/vendor-src/libleptris/test/xsd/libxml2-cases/579746_5.xml +6 -0
  33. data/vendor-src/libleptris/test/xsd/libxml2-cases/582887-attribute.xsd +12 -0
  34. data/vendor-src/libleptris/test/xsd/libxml2-cases/582887-common.xsd +8 -0
  35. data/vendor-src/libleptris/test/xsd/libxml2-cases/582887-element.xsd +11 -0
  36. data/vendor-src/libleptris/test/xsd/libxml2-cases/582887_0.xml +7 -0
  37. data/vendor-src/libleptris/test/xsd/libxml2-cases/582887_0.xsd +17 -0
  38. data/vendor-src/libleptris/test/xsd/libxml2-cases/582906-1-common.xsd +6 -0
  39. data/vendor-src/libleptris/test/xsd/libxml2-cases/582906-1-prog1.xsd +11 -0
  40. data/vendor-src/libleptris/test/xsd/libxml2-cases/582906-1-prog2-include.xsd +9 -0
  41. data/vendor-src/libleptris/test/xsd/libxml2-cases/582906-1-prog2.xsd +13 -0
  42. data/vendor-src/libleptris/test/xsd/libxml2-cases/582906-1_0.xml +5 -0
  43. data/vendor-src/libleptris/test/xsd/libxml2-cases/582906-1_0.xsd +20 -0
  44. data/vendor-src/libleptris/test/xsd/libxml2-cases/582906-2-common.xsd +7 -0
  45. data/vendor-src/libleptris/test/xsd/libxml2-cases/582906-2-prog1.xsd +11 -0
  46. data/vendor-src/libleptris/test/xsd/libxml2-cases/582906-2-prog2-include.xsd +9 -0
  47. data/vendor-src/libleptris/test/xsd/libxml2-cases/582906-2-prog2.xsd +13 -0
  48. data/vendor-src/libleptris/test/xsd/libxml2-cases/582906-2_0.xml +5 -0
  49. data/vendor-src/libleptris/test/xsd/libxml2-cases/582906-2_0.xsd +20 -0
  50. data/vendor-src/libleptris/test/xsd/libxml2-cases/all.xsd +16 -0
  51. data/vendor-src/libleptris/test/xsd/libxml2-cases/all1_0.xml +4 -0
  52. data/vendor-src/libleptris/test/xsd/libxml2-cases/all1_0.xsd +10 -0
  53. data/vendor-src/libleptris/test/xsd/libxml2-cases/all_0.xml +1 -0
  54. data/vendor-src/libleptris/test/xsd/libxml2-cases/all_0.xsd +12 -0
  55. data/vendor-src/libleptris/test/xsd/libxml2-cases/all_1.xml +2 -0
  56. data/vendor-src/libleptris/test/xsd/libxml2-cases/all_1.xsd +12 -0
  57. data/vendor-src/libleptris/test/xsd/libxml2-cases/all_2.xml +1 -0
  58. data/vendor-src/libleptris/test/xsd/libxml2-cases/all_2.xsd +11 -0
  59. data/vendor-src/libleptris/test/xsd/libxml2-cases/all_3.xml +1 -0
  60. data/vendor-src/libleptris/test/xsd/libxml2-cases/all_4.xml +1 -0
  61. data/vendor-src/libleptris/test/xsd/libxml2-cases/all_5.xml +1 -0
  62. data/vendor-src/libleptris/test/xsd/libxml2-cases/all_6.xml +1 -0
  63. data/vendor-src/libleptris/test/xsd/libxml2-cases/all_7.xml +1 -0
  64. data/vendor-src/libleptris/test/xsd/libxml2-cases/allsg_0.xml +7 -0
  65. data/vendor-src/libleptris/test/xsd/libxml2-cases/allsg_0.xsd +26 -0
  66. data/vendor-src/libleptris/test/xsd/libxml2-cases/allsg_1.xml +8 -0
  67. data/vendor-src/libleptris/test/xsd/libxml2-cases/allsg_2.xml +8 -0
  68. data/vendor-src/libleptris/test/xsd/libxml2-cases/allsg_3.xml +7 -0
  69. data/vendor-src/libleptris/test/xsd/libxml2-cases/allsg_4.xml +7 -0
  70. data/vendor-src/libleptris/test/xsd/libxml2-cases/allsg_5.xml +8 -0
  71. data/vendor-src/libleptris/test/xsd/libxml2-cases/annot-err_0.xml +4 -0
  72. data/vendor-src/libleptris/test/xsd/libxml2-cases/annot-err_0.xsd +21 -0
  73. data/vendor-src/libleptris/test/xsd/libxml2-cases/any1_0.xml +21 -0
  74. data/vendor-src/libleptris/test/xsd/libxml2-cases/any1_0.xsd +22 -0
  75. data/vendor-src/libleptris/test/xsd/libxml2-cases/any2_0.xml +24 -0
  76. data/vendor-src/libleptris/test/xsd/libxml2-cases/any2_0.xsd +26 -0
  77. data/vendor-src/libleptris/test/xsd/libxml2-cases/any3_0.xml +17 -0
  78. data/vendor-src/libleptris/test/xsd/libxml2-cases/any3_0.xsd +17 -0
  79. data/vendor-src/libleptris/test/xsd/libxml2-cases/any4_0.xml +17 -0
  80. data/vendor-src/libleptris/test/xsd/libxml2-cases/any4_0.xsd +28 -0
  81. data/vendor-src/libleptris/test/xsd/libxml2-cases/any5_0.xml +7 -0
  82. data/vendor-src/libleptris/test/xsd/libxml2-cases/any5_0.xsd +13 -0
  83. data/vendor-src/libleptris/test/xsd/libxml2-cases/any5_1.xml +12 -0
  84. data/vendor-src/libleptris/test/xsd/libxml2-cases/any5_1.xsd +14 -0
  85. data/vendor-src/libleptris/test/xsd/libxml2-cases/any5_2.xml +8 -0
  86. data/vendor-src/libleptris/test/xsd/libxml2-cases/any5_3.xml +11 -0
  87. data/vendor-src/libleptris/test/xsd/libxml2-cases/any5_4.xml +12 -0
  88. data/vendor-src/libleptris/test/xsd/libxml2-cases/any5_5.xml +12 -0
  89. data/vendor-src/libleptris/test/xsd/libxml2-cases/any5_6.xml +13 -0
  90. data/vendor-src/libleptris/test/xsd/libxml2-cases/any6_0.xml +8 -0
  91. data/vendor-src/libleptris/test/xsd/libxml2-cases/any6_1.xsd +36 -0
  92. data/vendor-src/libleptris/test/xsd/libxml2-cases/any6_2.xsd +19 -0
  93. data/vendor-src/libleptris/test/xsd/libxml2-cases/any7_0.xml +19 -0
  94. data/vendor-src/libleptris/test/xsd/libxml2-cases/any7_1.xml +18 -0
  95. data/vendor-src/libleptris/test/xsd/libxml2-cases/any7_1.xsd +13 -0
  96. data/vendor-src/libleptris/test/xsd/libxml2-cases/any7_2.xml +20 -0
  97. data/vendor-src/libleptris/test/xsd/libxml2-cases/any7_2.xsd +13 -0
  98. data/vendor-src/libleptris/test/xsd/libxml2-cases/any8_0.xml +9 -0
  99. data/vendor-src/libleptris/test/xsd/libxml2-cases/any8_1.xsd +20 -0
  100. data/vendor-src/libleptris/test/xsd/libxml2-cases/anyAttr-derive-errors1_0.xml +30 -0
  101. data/vendor-src/libleptris/test/xsd/libxml2-cases/anyAttr-derive-errors1_0.xsd +223 -0
  102. data/vendor-src/libleptris/test/xsd/libxml2-cases/anyAttr-derive1_0.xml +30 -0
  103. data/vendor-src/libleptris/test/xsd/libxml2-cases/anyAttr-derive1_0.xsd +227 -0
  104. data/vendor-src/libleptris/test/xsd/libxml2-cases/anyAttr-derive2_0.xml +9 -0
  105. data/vendor-src/libleptris/test/xsd/libxml2-cases/anyAttr-derive2_0.xsd +33 -0
  106. data/vendor-src/libleptris/test/xsd/libxml2-cases/anyAttr-errors1_0.xml +26 -0
  107. data/vendor-src/libleptris/test/xsd/libxml2-cases/anyAttr-processContents-err1_0.xml +11 -0
  108. data/vendor-src/libleptris/test/xsd/libxml2-cases/anyAttr-processContents-err1_0.xsd +26 -0
  109. data/vendor-src/libleptris/test/xsd/libxml2-cases/anyAttr-processContents1_0.xml +13 -0
  110. data/vendor-src/libleptris/test/xsd/libxml2-cases/anyAttr-processContents1_0.xsd +32 -0
  111. data/vendor-src/libleptris/test/xsd/libxml2-cases/anyAttr.importA.1_0.xsd +24 -0
  112. data/vendor-src/libleptris/test/xsd/libxml2-cases/anyAttr.importB.1_0.xsd +21 -0
  113. data/vendor-src/libleptris/test/xsd/libxml2-cases/anyAttr1_0.xml +31 -0
  114. data/vendor-src/libleptris/test/xsd/libxml2-cases/anyAttr1_0.xsd +144 -0
  115. data/vendor-src/libleptris/test/xsd/libxml2-cases/attr0_0.xml +1 -0
  116. data/vendor-src/libleptris/test/xsd/libxml2-cases/attr0_0.xsd +13 -0
  117. data/vendor-src/libleptris/test/xsd/libxml2-cases/attruse_0_0.xml +8 -0
  118. data/vendor-src/libleptris/test/xsd/libxml2-cases/attruse_0_0.xsd +32 -0
  119. data/vendor-src/libleptris/test/xsd/libxml2-cases/attruse_0_1.xml +8 -0
  120. data/vendor-src/libleptris/test/xsd/libxml2-cases/attruse_0_2.xml +8 -0
  121. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug141312_0.xml +2 -0
  122. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug141312_0.xsd +16 -0
  123. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug141333.xml +9 -0
  124. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug141333.xsd +25 -0
  125. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug141333_0.xml +9 -0
  126. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug141333_0.xsd +25 -0
  127. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug143951.imp +12 -0
  128. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug143951_0.xml +9 -0
  129. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug143951_0.xsd +17 -0
  130. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug145246.xsd.imp +119 -0
  131. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug145246_0.xml +30 -0
  132. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug145246_0.xsd +173 -0
  133. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug152470_1.xml +9 -0
  134. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug152470_1.xsd +49 -0
  135. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug167754_0.xml +12 -0
  136. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug167754_0.xsd +29 -0
  137. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug303566_1.xml +19 -0
  138. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug303566_1.xsd +63 -0
  139. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug306806_0.xml +111 -0
  140. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug306806_1.xsd +544 -0
  141. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug309338_0.xml +4 -0
  142. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug309338_1.xsd +13 -0
  143. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug310264_0.xml +41 -0
  144. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug310264_0.xsd +18 -0
  145. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug312957_0.xml +14 -0
  146. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug312957_1.xsd +39 -0
  147. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug313982_0.xml +4 -0
  148. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug313982_0.xsd +11 -0
  149. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug321475_0.xml +10 -0
  150. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug321475_1.xsd +48 -0
  151. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug322411_0.xml +93 -0
  152. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug322411_1.xml +67 -0
  153. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug322411_1.xsd +35 -0
  154. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug323510_0.xml +3 -0
  155. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug323510_1.xsd +12 -0
  156. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug455953_0.xml +9 -0
  157. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug455953_0.xsd +29 -0
  158. data/vendor-src/libleptris/test/xsd/libxml2-cases/changelog093_0.xml +14 -0
  159. data/vendor-src/libleptris/test/xsd/libxml2-cases/changelog093_1.xsd +253 -0
  160. data/vendor-src/libleptris/test/xsd/libxml2-cases/choice_0.xml +3 -0
  161. data/vendor-src/libleptris/test/xsd/libxml2-cases/choice_0.xsd +13 -0
  162. data/vendor-src/libleptris/test/xsd/libxml2-cases/choice_1.xml +3 -0
  163. data/vendor-src/libleptris/test/xsd/libxml2-cases/choice_1.xsd +13 -0
  164. data/vendor-src/libleptris/test/xsd/libxml2-cases/choice_2.xml +4 -0
  165. data/vendor-src/libleptris/test/xsd/libxml2-cases/choice_2.xsd +13 -0
  166. data/vendor-src/libleptris/test/xsd/libxml2-cases/choice_3.xml +4 -0
  167. data/vendor-src/libleptris/test/xsd/libxml2-cases/choice_4.xml +2 -0
  168. data/vendor-src/libleptris/test/xsd/libxml2-cases/choice_5.xml +6 -0
  169. data/vendor-src/libleptris/test/xsd/libxml2-cases/choice_6.xml +7 -0
  170. data/vendor-src/libleptris/test/xsd/libxml2-cases/complex-type-extension_0.xml +12 -0
  171. data/vendor-src/libleptris/test/xsd/libxml2-cases/complex-type-extension_0.xsd +27 -0
  172. data/vendor-src/libleptris/test/xsd/libxml2-cases/cos-ct-extends-1-3_0.xml +9 -0
  173. data/vendor-src/libleptris/test/xsd/libxml2-cases/cos-ct-extends-1-3_0.xsd +51 -0
  174. data/vendor-src/libleptris/test/xsd/libxml2-cases/cos-st-restricts-1-2-err_0.xml +3 -0
  175. data/vendor-src/libleptris/test/xsd/libxml2-cases/cos-st-restricts-1-2-err_0.xsd +30 -0
  176. data/vendor-src/libleptris/test/xsd/libxml2-cases/ct-sc-nobase_0.xml +4 -0
  177. data/vendor-src/libleptris/test/xsd/libxml2-cases/ct-sc-nobase_0.xsd +24 -0
  178. data/vendor-src/libleptris/test/xsd/libxml2-cases/date-whitespace_0.xml +29 -0
  179. data/vendor-src/libleptris/test/xsd/libxml2-cases/date-whitespace_0.xsd +20 -0
  180. data/vendor-src/libleptris/test/xsd/libxml2-cases/date-whitespace_1.xml +33 -0
  181. data/vendor-src/libleptris/test/xsd/libxml2-cases/date_0.xml +27 -0
  182. data/vendor-src/libleptris/test/xsd/libxml2-cases/date_0.xsd +122 -0
  183. data/vendor-src/libleptris/test/xsd/libxml2-cases/decimal-1.xml +37 -0
  184. data/vendor-src/libleptris/test/xsd/libxml2-cases/decimal-1.xsd +29 -0
  185. data/vendor-src/libleptris/test/xsd/libxml2-cases/decimal-1_0.xml +24 -0
  186. data/vendor-src/libleptris/test/xsd/libxml2-cases/decimal-1_1.xsd +19 -0
  187. data/vendor-src/libleptris/test/xsd/libxml2-cases/decimal-2_0.xml +14 -0
  188. data/vendor-src/libleptris/test/xsd/libxml2-cases/decimal-2_1.xsd +18 -0
  189. data/vendor-src/libleptris/test/xsd/libxml2-cases/decimal-3_0.xml +17 -0
  190. data/vendor-src/libleptris/test/xsd/libxml2-cases/decimal-3_1.xsd +18 -0
  191. data/vendor-src/libleptris/test/xsd/libxml2-cases/derivation-ok-extension-err_0.xml +9 -0
  192. data/vendor-src/libleptris/test/xsd/libxml2-cases/derivation-ok-extension-err_0.xsd +22 -0
  193. data/vendor-src/libleptris/test/xsd/libxml2-cases/derivation-ok-extension_0.xml +9 -0
  194. data/vendor-src/libleptris/test/xsd/libxml2-cases/derivation-ok-extension_0.xsd +22 -0
  195. data/vendor-src/libleptris/test/xsd/libxml2-cases/derivation-ok-restriction-2-1-1_0.xml +8 -0
  196. data/vendor-src/libleptris/test/xsd/libxml2-cases/derivation-ok-restriction-2-1-1_0.xsd +56 -0
  197. data/vendor-src/libleptris/test/xsd/libxml2-cases/derivation-ok-restriction-4-1-err_0.xml +8 -0
  198. data/vendor-src/libleptris/test/xsd/libxml2-cases/derivation-ok-restriction-4-1-err_0.xsd +69 -0
  199. data/vendor-src/libleptris/test/xsd/libxml2-cases/derivation-restriction-anyAttr_0.xml +12 -0
  200. data/vendor-src/libleptris/test/xsd/libxml2-cases/derivation-restriction-anyAttr_0.xsd +24 -0
  201. data/vendor-src/libleptris/test/xsd/libxml2-cases/derivation-restriction-anyType.xml +9 -0
  202. data/vendor-src/libleptris/test/xsd/libxml2-cases/derivation-restriction-anyType.xsd +22 -0
  203. data/vendor-src/libleptris/test/xsd/libxml2-cases/deter0_0.xml +5 -0
  204. data/vendor-src/libleptris/test/xsd/libxml2-cases/deter0_0.xsd +16 -0
  205. data/vendor-src/libleptris/test/xsd/libxml2-cases/dur_0.xml +13 -0
  206. data/vendor-src/libleptris/test/xsd/libxml2-cases/dur_0.xsd +72 -0
  207. data/vendor-src/libleptris/test/xsd/libxml2-cases/elem0_0.xml +3 -0
  208. data/vendor-src/libleptris/test/xsd/libxml2-cases/elem0_0.xsd +16 -0
  209. data/vendor-src/libleptris/test/xsd/libxml2-cases/element-err_0.xml +4 -0
  210. data/vendor-src/libleptris/test/xsd/libxml2-cases/element-err_0.xsd +39 -0
  211. data/vendor-src/libleptris/test/xsd/libxml2-cases/element-minmax-err_0.xml +5 -0
  212. data/vendor-src/libleptris/test/xsd/libxml2-cases/element-minmax-err_0.xsd +11 -0
  213. data/vendor-src/libleptris/test/xsd/libxml2-cases/empty-value_0.xml +2 -0
  214. data/vendor-src/libleptris/test/xsd/libxml2-cases/empty-value_1.xml +2 -0
  215. data/vendor-src/libleptris/test/xsd/libxml2-cases/empty-value_1.xsd +24 -0
  216. data/vendor-src/libleptris/test/xsd/libxml2-cases/empty_0.xml +1 -0
  217. data/vendor-src/libleptris/test/xsd/libxml2-cases/empty_0.xsd +13 -0
  218. data/vendor-src/libleptris/test/xsd/libxml2-cases/empty_1.xsd +9 -0
  219. data/vendor-src/libleptris/test/xsd/libxml2-cases/extension0_0.xml +7 -0
  220. data/vendor-src/libleptris/test/xsd/libxml2-cases/extension0_0.xsd +20 -0
  221. data/vendor-src/libleptris/test/xsd/libxml2-cases/extension1_0.xml +1 -0
  222. data/vendor-src/libleptris/test/xsd/libxml2-cases/extension1_0.xsd +17 -0
  223. data/vendor-src/libleptris/test/xsd/libxml2-cases/extension1_1.xml +1 -0
  224. data/vendor-src/libleptris/test/xsd/libxml2-cases/extension1_2.xml +1 -0
  225. data/vendor-src/libleptris/test/xsd/libxml2-cases/extension2_0.xml +4 -0
  226. data/vendor-src/libleptris/test/xsd/libxml2-cases/extension2_1.xsd +17 -0
  227. data/vendor-src/libleptris/test/xsd/libxml2-cases/facet-unionST-err1_0.xml +4 -0
  228. data/vendor-src/libleptris/test/xsd/libxml2-cases/facet-unionST-err1_0.xsd +27 -0
  229. data/vendor-src/libleptris/test/xsd/libxml2-cases/facet-whiteSpace_0.xml +7 -0
  230. data/vendor-src/libleptris/test/xsd/libxml2-cases/facet-whiteSpace_0.xsd +12 -0
  231. data/vendor-src/libleptris/test/xsd/libxml2-cases/group0_0.xml +3 -0
  232. data/vendor-src/libleptris/test/xsd/libxml2-cases/group0_0.xsd +18 -0
  233. data/vendor-src/libleptris/test/xsd/libxml2-cases/hexbinary_0.xml +20 -0
  234. data/vendor-src/libleptris/test/xsd/libxml2-cases/hexbinary_0.xsd +35 -0
  235. data/vendor-src/libleptris/test/xsd/libxml2-cases/hexbinary_1.xml +15 -0
  236. data/vendor-src/libleptris/test/xsd/libxml2-cases/idc-keyref-err1_0.xml +14 -0
  237. data/vendor-src/libleptris/test/xsd/libxml2-cases/idc-keyref-err1_1.xsd +53 -0
  238. data/vendor-src/libleptris/test/xsd/libxml2-cases/import-455953.xsd +24 -0
  239. data/vendor-src/libleptris/test/xsd/libxml2-cases/import-bad-1_0.imp +5 -0
  240. data/vendor-src/libleptris/test/xsd/libxml2-cases/import0_0.imp +13 -0
  241. data/vendor-src/libleptris/test/xsd/libxml2-cases/import0_0.xml +8 -0
  242. data/vendor-src/libleptris/test/xsd/libxml2-cases/import0_0.xsd +21 -0
  243. data/vendor-src/libleptris/test/xsd/libxml2-cases/import1_0.imp +8 -0
  244. data/vendor-src/libleptris/test/xsd/libxml2-cases/import1_0.xml +11 -0
  245. data/vendor-src/libleptris/test/xsd/libxml2-cases/import1_0.xsd +30 -0
  246. data/vendor-src/libleptris/test/xsd/libxml2-cases/import1_0b.imp +8 -0
  247. data/vendor-src/libleptris/test/xsd/libxml2-cases/import2_0.imp +24 -0
  248. data/vendor-src/libleptris/test/xsd/libxml2-cases/import2_0.xml +8 -0
  249. data/vendor-src/libleptris/test/xsd/libxml2-cases/import2_0.xsd +24 -0
  250. data/vendor-src/libleptris/test/xsd/libxml2-cases/include1_0.inc +28 -0
  251. data/vendor-src/libleptris/test/xsd/libxml2-cases/include1_0.xml +8 -0
  252. data/vendor-src/libleptris/test/xsd/libxml2-cases/include1_0.xsd +15 -0
  253. data/vendor-src/libleptris/test/xsd/libxml2-cases/include2_0.inc +17 -0
  254. data/vendor-src/libleptris/test/xsd/libxml2-cases/include2_0.xml +9 -0
  255. data/vendor-src/libleptris/test/xsd/libxml2-cases/include2_0.xsd +14 -0
  256. data/vendor-src/libleptris/test/xsd/libxml2-cases/include3_0.inc +5 -0
  257. data/vendor-src/libleptris/test/xsd/libxml2-cases/include3_0.xml +7 -0
  258. data/vendor-src/libleptris/test/xsd/libxml2-cases/include3_0.xsd +9 -0
  259. data/vendor-src/libleptris/test/xsd/libxml2-cases/issue303_0.xml +1 -0
  260. data/vendor-src/libleptris/test/xsd/libxml2-cases/issue303_0.xsd +19 -0
  261. data/vendor-src/libleptris/test/xsd/libxml2-cases/issue40_0.xml +3 -0
  262. data/vendor-src/libleptris/test/xsd/libxml2-cases/issue40_0.xsd +10 -0
  263. data/vendor-src/libleptris/test/xsd/libxml2-cases/issue491_0.xml +1 -0
  264. data/vendor-src/libleptris/test/xsd/libxml2-cases/issue491_0.xsd +18 -0
  265. data/vendor-src/libleptris/test/xsd/libxml2-cases/item_0.xml +6 -0
  266. data/vendor-src/libleptris/test/xsd/libxml2-cases/item_0.xsd +39 -0
  267. data/vendor-src/libleptris/test/xsd/libxml2-cases/item_1.xsd +42 -0
  268. data/vendor-src/libleptris/test/xsd/libxml2-cases/length1_0.xml +1 -0
  269. data/vendor-src/libleptris/test/xsd/libxml2-cases/length1_0.xsd +11 -0
  270. data/vendor-src/libleptris/test/xsd/libxml2-cases/length2_0.xml +5 -0
  271. data/vendor-src/libleptris/test/xsd/libxml2-cases/length2_0.xsd +14 -0
  272. data/vendor-src/libleptris/test/xsd/libxml2-cases/length3_0.xml +5 -0
  273. data/vendor-src/libleptris/test/xsd/libxml2-cases/length3_0.xsd +10 -0
  274. data/vendor-src/libleptris/test/xsd/libxml2-cases/list0_0.xml +6 -0
  275. data/vendor-src/libleptris/test/xsd/libxml2-cases/list0_0.xsd +13 -0
  276. data/vendor-src/libleptris/test/xsd/libxml2-cases/list0_1.xml +3 -0
  277. data/vendor-src/libleptris/test/xsd/libxml2-cases/list0_1.xsd +13 -0
  278. data/vendor-src/libleptris/test/xsd/libxml2-cases/list0_2.xml +4 -0
  279. data/vendor-src/libleptris/test/xsd/libxml2-cases/mixed0_0.xml +1 -0
  280. data/vendor-src/libleptris/test/xsd/libxml2-cases/mixed0_0.xsd +5 -0
  281. data/vendor-src/libleptris/test/xsd/libxml2-cases/mixed1_0.xml +1 -0
  282. data/vendor-src/libleptris/test/xsd/libxml2-cases/mixed1_0.xsd +7 -0
  283. data/vendor-src/libleptris/test/xsd/libxml2-cases/ns0_0.xml +2 -0
  284. data/vendor-src/libleptris/test/xsd/libxml2-cases/ns0_0.xsd +16 -0
  285. data/vendor-src/libleptris/test/xsd/libxml2-cases/ns0_1.xml +2 -0
  286. data/vendor-src/libleptris/test/xsd/libxml2-cases/ns0_1.xsd +16 -0
  287. data/vendor-src/libleptris/test/xsd/libxml2-cases/ns0_2.xml +2 -0
  288. data/vendor-src/libleptris/test/xsd/libxml2-cases/ns0_3.xml +2 -0
  289. data/vendor-src/libleptris/test/xsd/libxml2-cases/ns0_4.xml +3 -0
  290. data/vendor-src/libleptris/test/xsd/libxml2-cases/ns1_0.xml +2 -0
  291. data/vendor-src/libleptris/test/xsd/libxml2-cases/ns1_0.xsd +3 -0
  292. data/vendor-src/libleptris/test/xsd/libxml2-cases/ns2_0.xml +1 -0
  293. data/vendor-src/libleptris/test/xsd/libxml2-cases/ns2_0.xsd +15 -0
  294. data/vendor-src/libleptris/test/xsd/libxml2-cases/nvdcve_0.xml +5235 -0
  295. data/vendor-src/libleptris/test/xsd/libxml2-cases/nvdcve_0.xsd +498 -0
  296. data/vendor-src/libleptris/test/xsd/libxml2-cases/oss-fuzz-51295_0.xml +1 -0
  297. data/vendor-src/libleptris/test/xsd/libxml2-cases/oss-fuzz-51295_0.xsd +4 -0
  298. data/vendor-src/libleptris/test/xsd/libxml2-cases/po0_0.xml +32 -0
  299. data/vendor-src/libleptris/test/xsd/libxml2-cases/po0_0.xsd +59 -0
  300. data/vendor-src/libleptris/test/xsd/libxml2-cases/po1_0.xml +34 -0
  301. data/vendor-src/libleptris/test/xsd/libxml2-cases/po1_0.xsd +64 -0
  302. data/vendor-src/libleptris/test/xsd/libxml2-cases/poschargrp0_0.xml +2 -0
  303. data/vendor-src/libleptris/test/xsd/libxml2-cases/poschargrp0_0.xsd +14 -0
  304. data/vendor-src/libleptris/test/xsd/libxml2-cases/regexp-char-ref_0.xml +7 -0
  305. data/vendor-src/libleptris/test/xsd/libxml2-cases/regexp-char-ref_0.xsd +20 -0
  306. data/vendor-src/libleptris/test/xsd/libxml2-cases/regexp-char-ref_1.xsd +20 -0
  307. data/vendor-src/libleptris/test/xsd/libxml2-cases/restrict-CT-attr-ref_0.xml +3 -0
  308. data/vendor-src/libleptris/test/xsd/libxml2-cases/restrict-CT-attr-ref_0.xsd +30 -0
  309. data/vendor-src/libleptris/test/xsd/libxml2-cases/restriction-attr1_0.xml +3 -0
  310. data/vendor-src/libleptris/test/xsd/libxml2-cases/restriction-attr1_0.xsd +18 -0
  311. data/vendor-src/libleptris/test/xsd/libxml2-cases/restriction-enum-1_0.xml +7 -0
  312. data/vendor-src/libleptris/test/xsd/libxml2-cases/restriction-enum-1_1.xsd +19 -0
  313. data/vendor-src/libleptris/test/xsd/libxml2-cases/restriction0_0.xml +5 -0
  314. data/vendor-src/libleptris/test/xsd/libxml2-cases/restriction0_0.xsd +21 -0
  315. data/vendor-src/libleptris/test/xsd/libxml2-cases/scc-no-xmlns_0.xml +3 -0
  316. data/vendor-src/libleptris/test/xsd/libxml2-cases/scc-no-xmlns_0.xsd +11 -0
  317. data/vendor-src/libleptris/test/xsd/libxml2-cases/scc-no-xsi_0.xml +3 -0
  318. data/vendor-src/libleptris/test/xsd/libxml2-cases/scc-no-xsi_0.xsd +11 -0
  319. data/vendor-src/libleptris/test/xsd/libxml2-cases/seq-dubl-elem1_0.xml +7 -0
  320. data/vendor-src/libleptris/test/xsd/libxml2-cases/seq-dubl-elem1_0.xsd +25 -0
  321. data/vendor-src/libleptris/test/xsd/libxml2-cases/seq0_0.xml +61 -0
  322. data/vendor-src/libleptris/test/xsd/libxml2-cases/seq0_0.xsd +64 -0
  323. data/vendor-src/libleptris/test/xsd/libxml2-cases/src-attribute1_0.xml +2 -0
  324. data/vendor-src/libleptris/test/xsd/libxml2-cases/src-attribute1_0.xsd +13 -0
  325. data/vendor-src/libleptris/test/xsd/libxml2-cases/src-attribute2_0.xml +2 -0
  326. data/vendor-src/libleptris/test/xsd/libxml2-cases/src-attribute2_0.xsd +13 -0
  327. data/vendor-src/libleptris/test/xsd/libxml2-cases/src-attribute3-1_0.xml +2 -0
  328. data/vendor-src/libleptris/test/xsd/libxml2-cases/src-attribute3-1_0.xsd +15 -0
  329. data/vendor-src/libleptris/test/xsd/libxml2-cases/src-attribute3-2-form_0.xml +2 -0
  330. data/vendor-src/libleptris/test/xsd/libxml2-cases/src-attribute3-2-form_0.xsd +16 -0
  331. data/vendor-src/libleptris/test/xsd/libxml2-cases/src-attribute3-2-st_0.xml +2 -0
  332. data/vendor-src/libleptris/test/xsd/libxml2-cases/src-attribute3-2-st_0.xsd +22 -0
  333. data/vendor-src/libleptris/test/xsd/libxml2-cases/src-attribute3-2-type_0.xml +2 -0
  334. data/vendor-src/libleptris/test/xsd/libxml2-cases/src-attribute3-2-type_0.xsd +16 -0
  335. data/vendor-src/libleptris/test/xsd/libxml2-cases/src-attribute4_0.xml +2 -0
  336. data/vendor-src/libleptris/test/xsd/libxml2-cases/src-attribute4_0.xsd +17 -0
  337. data/vendor-src/libleptris/test/xsd/libxml2-cases/src-element1_0.xml +2 -0
  338. data/vendor-src/libleptris/test/xsd/libxml2-cases/src-element1_0.xsd +9 -0
  339. data/vendor-src/libleptris/test/xsd/libxml2-cases/src-element2-1_0.xml +2 -0
  340. data/vendor-src/libleptris/test/xsd/libxml2-cases/src-element2-1_0.xsd +17 -0
  341. data/vendor-src/libleptris/test/xsd/libxml2-cases/src-element2-2_0.xml +2 -0
  342. data/vendor-src/libleptris/test/xsd/libxml2-cases/src-element2-2_0.xsd +48 -0
  343. data/vendor-src/libleptris/test/xsd/libxml2-cases/src-element3_0.xml +2 -0
  344. data/vendor-src/libleptris/test/xsd/libxml2-cases/src-element3_0.xsd +29 -0
  345. data/vendor-src/libleptris/test/xsd/libxml2-cases/subst-group-1_0.xsd +45 -0
  346. data/vendor-src/libleptris/test/xsd/libxml2-cases/subst-group-1_1.xml +12 -0
  347. data/vendor-src/libleptris/test/xsd/libxml2-cases/union2_1.xml +6 -0
  348. data/vendor-src/libleptris/test/xsd/libxml2-cases/union2_1.xsd +21 -0
  349. data/vendor-src/libleptris/test/xsd/libxml2-cases/union_0_0.xml +8 -0
  350. data/vendor-src/libleptris/test/xsd/libxml2-cases/union_0_0.xsd +53 -0
  351. data/vendor-src/libleptris/test/xsd/libxml2-cases/v012-reader-schema-main.xsd +6 -0
  352. data/vendor-src/libleptris/test/xsd/libxml2-cases/vdv-complexTypes.xsd +37 -0
  353. data/vendor-src/libleptris/test/xsd/libxml2-cases/vdv-first0_0.xml +33 -0
  354. data/vendor-src/libleptris/test/xsd/libxml2-cases/vdv-first0_0.xsd +67 -0
  355. data/vendor-src/libleptris/test/xsd/libxml2-cases/vdv-first1_0.xml +33 -0
  356. data/vendor-src/libleptris/test/xsd/libxml2-cases/vdv-first1_0.xsd +47 -0
  357. data/vendor-src/libleptris/test/xsd/libxml2-cases/vdv-first2_0.xml +33 -0
  358. data/vendor-src/libleptris/test/xsd/libxml2-cases/vdv-first2_0.xsd +89 -0
  359. data/vendor-src/libleptris/test/xsd/libxml2-cases/vdv-first3_0.xml +33 -0
  360. data/vendor-src/libleptris/test/xsd/libxml2-cases/vdv-first3_0.xsd +68 -0
  361. data/vendor-src/libleptris/test/xsd/libxml2-cases/vdv-first4_0.xml +33 -0
  362. data/vendor-src/libleptris/test/xsd/libxml2-cases/vdv-first4_0.xsd +150 -0
  363. data/vendor-src/libleptris/test/xsd/libxml2-cases/vdv-first4_1.xml +33 -0
  364. data/vendor-src/libleptris/test/xsd/libxml2-cases/vdv-first4_2.xml +33 -0
  365. data/vendor-src/libleptris/test/xsd/libxml2-cases/vdv-first5_0.xml +33 -0
  366. data/vendor-src/libleptris/test/xsd/libxml2-cases/vdv-first5_0.xsd +85 -0
  367. data/vendor-src/libleptris/test/xsd/libxml2-cases/vdv-simpleTypes.xsd +38 -0
  368. data/vendor-src/libleptris/test/xsd/libxml2-cases/xml.xsd +117 -0
  369. data/vendor-src/libleptris/test/xsd/libxml2-cases/xsd-list-itemType_0.xml +3 -0
  370. data/vendor-src/libleptris/test/xsd/libxml2-cases/xsd-list-itemType_0.xsd +14 -0
  371. data/vendor-src/libleptris/test/xsd/libxml2-cases/xsd-simpleType-varieties_0.xml +8 -0
  372. data/vendor-src/libleptris/test/xsd/libxml2-cases/xsd-simpleType-varieties_0.xsd +45 -0
  373. data/vendor-src/libleptris/test/xsd/test_xsd_compile.cpp +154 -0
  374. data/vendor-src/libleptris/vcpkg.json +1 -1
  375. metadata +355 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2824d22f679e46bb0bcb8d79a163886812769ba8c9fe668e1243e27723cd0d7d
4
- data.tar.gz: ab423424bd971f3dd6088ecae5ef9b2e15ab25b6ee64bcda617ab0cd19b7098b
3
+ metadata.gz: ee7babaf2291f4504600ca04e9ae6bc2ec2ae180b6ab7ebaae467ad175ed240e
4
+ data.tar.gz: 1be2ebb114b6f49629edd3c7200ac9cc56f4afe8e346d13731d83fe8f6bb1681
5
5
  SHA512:
6
- metadata.gz: e355e20bc42352cf12697bcbb34b56b767fd6efa7ab82247bb57d89333d565d50fe1009a5c6b0dbd56aaf256f6c877970b95d6ea741c37d83140de432e9022ad
7
- data.tar.gz: e04b01514ed223d2ef660c69cf9d2294f0903e3a12523e37c154bb61b18ba54458f8e6b5847c53077c0d4d94755ca767221b4f5997563240cbd6bf4c761feb5e
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.317"
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Leptris
4
- VERSION = "1.9.317.1"
4
+ VERSION = "1.9.318.0"
5
5
  end
@@ -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,7 +1,7 @@
1
1
  Sources vendored in this gem (recompile rights; the ruby
2
2
  variant builds them at install via extconf.rb):
3
3
 
4
- - libleptris v1.9.317
4
+ - libleptris v1.9.318
5
5
  - utf8proc v2.11.0
6
6
 
7
7
  Rebuild by hand:
@@ -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
@@ -3,7 +3,7 @@
3
3
  cmake_minimum_required(VERSION 3.20)
4
4
 
5
5
  project(leptris
6
- VERSION 1.9.317
6
+ VERSION 1.9.318
7
7
  DESCRIPTION "Fast XML parser and XPath evaluator in pure C"
8
8
  LANGUAGES C CXX
9
9
  )
@@ -27,6 +27,7 @@ set(LEPTRIS_SOURCES
27
27
  leptris/sch/schematron.c
28
28
  leptris/diff/diff.c
29
29
  leptris/rng/parse.c
30
+ leptris/xsd/compile.c
30
31
  leptris/rng/rng_public.c
31
32
  leptris/rng/rng_regex.c
32
33
  leptris/rng/validate.c
@@ -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 (or
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
- leptris_free_hook(base);
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
+ }