leptris 1.9.317.1-ppc64le-linux → 1.9.319.0-ppc64le-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 (381) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +30 -0
  3. data/Rakefile +1 -1
  4. data/lib/leptris/version.rb +1 -1
  5. data/lib/leptris/xml/ffi.rb +22 -0
  6. data/lib/leptris/xml/xsd.rb +93 -0
  7. data/lib/leptris/xml.rb +1 -0
  8. data/lib/libleptris.so +0 -0
  9. data/vendor-src/README.md +1 -1
  10. data/vendor-src/libleptris/CHANGELOG.md +55 -0
  11. data/vendor-src/libleptris/CMakeLists.txt +1 -1
  12. data/vendor-src/libleptris/src/CMakeLists.txt +2 -0
  13. data/vendor-src/libleptris/src/include/leptris/types.h +2 -0
  14. data/vendor-src/libleptris/src/include/leptris.h +38 -0
  15. data/vendor-src/libleptris/src/leptris/dom/element.h +1 -0
  16. data/vendor-src/libleptris/src/leptris/memory/arena.c +83 -3
  17. data/vendor-src/libleptris/src/leptris/rng/rng_internal.h +8 -0
  18. data/vendor-src/libleptris/src/leptris/rng/rng_regex.c +4 -0
  19. data/vendor-src/libleptris/src/leptris/xpath/evaluator.h +1 -0
  20. data/vendor-src/libleptris/src/leptris/xsd/compile.c +272 -0
  21. data/vendor-src/libleptris/src/leptris/xsd/datatypes.c +445 -0
  22. data/vendor-src/libleptris/src/leptris/xsd/xsd_internal.h +43 -0
  23. data/vendor-src/libleptris/test/CMakeLists.txt +3 -0
  24. data/vendor-src/libleptris/test/abi/test_descriptor.cpp +126 -0
  25. data/vendor-src/libleptris/test/memory/test_arena.cpp +106 -0
  26. data/vendor-src/libleptris/test/parser/test_large_documents.cpp +74 -0
  27. data/vendor-src/libleptris/test/rng/test_rng.cpp +15 -0
  28. data/vendor-src/libleptris/test/xsd/README.md +12 -0
  29. data/vendor-src/libleptris/test/xsd/libxml2-cases/570702_0.xml +13 -0
  30. data/vendor-src/libleptris/test/xsd/libxml2-cases/570702_0.xsd +25 -0
  31. data/vendor-src/libleptris/test/xsd/libxml2-cases/579746_0.xml +3 -0
  32. data/vendor-src/libleptris/test/xsd/libxml2-cases/579746_0.xsd +11 -0
  33. data/vendor-src/libleptris/test/xsd/libxml2-cases/579746_1.xml +4 -0
  34. data/vendor-src/libleptris/test/xsd/libxml2-cases/579746_1.xsd +10 -0
  35. data/vendor-src/libleptris/test/xsd/libxml2-cases/579746_2.xml +5 -0
  36. data/vendor-src/libleptris/test/xsd/libxml2-cases/579746_3.xml +7 -0
  37. data/vendor-src/libleptris/test/xsd/libxml2-cases/579746_4.xml +5 -0
  38. data/vendor-src/libleptris/test/xsd/libxml2-cases/579746_5.xml +6 -0
  39. data/vendor-src/libleptris/test/xsd/libxml2-cases/582887-attribute.xsd +12 -0
  40. data/vendor-src/libleptris/test/xsd/libxml2-cases/582887-common.xsd +8 -0
  41. data/vendor-src/libleptris/test/xsd/libxml2-cases/582887-element.xsd +11 -0
  42. data/vendor-src/libleptris/test/xsd/libxml2-cases/582887_0.xml +7 -0
  43. data/vendor-src/libleptris/test/xsd/libxml2-cases/582887_0.xsd +17 -0
  44. data/vendor-src/libleptris/test/xsd/libxml2-cases/582906-1-common.xsd +6 -0
  45. data/vendor-src/libleptris/test/xsd/libxml2-cases/582906-1-prog1.xsd +11 -0
  46. data/vendor-src/libleptris/test/xsd/libxml2-cases/582906-1-prog2-include.xsd +9 -0
  47. data/vendor-src/libleptris/test/xsd/libxml2-cases/582906-1-prog2.xsd +13 -0
  48. data/vendor-src/libleptris/test/xsd/libxml2-cases/582906-1_0.xml +5 -0
  49. data/vendor-src/libleptris/test/xsd/libxml2-cases/582906-1_0.xsd +20 -0
  50. data/vendor-src/libleptris/test/xsd/libxml2-cases/582906-2-common.xsd +7 -0
  51. data/vendor-src/libleptris/test/xsd/libxml2-cases/582906-2-prog1.xsd +11 -0
  52. data/vendor-src/libleptris/test/xsd/libxml2-cases/582906-2-prog2-include.xsd +9 -0
  53. data/vendor-src/libleptris/test/xsd/libxml2-cases/582906-2-prog2.xsd +13 -0
  54. data/vendor-src/libleptris/test/xsd/libxml2-cases/582906-2_0.xml +5 -0
  55. data/vendor-src/libleptris/test/xsd/libxml2-cases/582906-2_0.xsd +20 -0
  56. data/vendor-src/libleptris/test/xsd/libxml2-cases/all.xsd +16 -0
  57. data/vendor-src/libleptris/test/xsd/libxml2-cases/all1_0.xml +4 -0
  58. data/vendor-src/libleptris/test/xsd/libxml2-cases/all1_0.xsd +10 -0
  59. data/vendor-src/libleptris/test/xsd/libxml2-cases/all_0.xml +1 -0
  60. data/vendor-src/libleptris/test/xsd/libxml2-cases/all_0.xsd +12 -0
  61. data/vendor-src/libleptris/test/xsd/libxml2-cases/all_1.xml +2 -0
  62. data/vendor-src/libleptris/test/xsd/libxml2-cases/all_1.xsd +12 -0
  63. data/vendor-src/libleptris/test/xsd/libxml2-cases/all_2.xml +1 -0
  64. data/vendor-src/libleptris/test/xsd/libxml2-cases/all_2.xsd +11 -0
  65. data/vendor-src/libleptris/test/xsd/libxml2-cases/all_3.xml +1 -0
  66. data/vendor-src/libleptris/test/xsd/libxml2-cases/all_4.xml +1 -0
  67. data/vendor-src/libleptris/test/xsd/libxml2-cases/all_5.xml +1 -0
  68. data/vendor-src/libleptris/test/xsd/libxml2-cases/all_6.xml +1 -0
  69. data/vendor-src/libleptris/test/xsd/libxml2-cases/all_7.xml +1 -0
  70. data/vendor-src/libleptris/test/xsd/libxml2-cases/allsg_0.xml +7 -0
  71. data/vendor-src/libleptris/test/xsd/libxml2-cases/allsg_0.xsd +26 -0
  72. data/vendor-src/libleptris/test/xsd/libxml2-cases/allsg_1.xml +8 -0
  73. data/vendor-src/libleptris/test/xsd/libxml2-cases/allsg_2.xml +8 -0
  74. data/vendor-src/libleptris/test/xsd/libxml2-cases/allsg_3.xml +7 -0
  75. data/vendor-src/libleptris/test/xsd/libxml2-cases/allsg_4.xml +7 -0
  76. data/vendor-src/libleptris/test/xsd/libxml2-cases/allsg_5.xml +8 -0
  77. data/vendor-src/libleptris/test/xsd/libxml2-cases/annot-err_0.xml +4 -0
  78. data/vendor-src/libleptris/test/xsd/libxml2-cases/annot-err_0.xsd +21 -0
  79. data/vendor-src/libleptris/test/xsd/libxml2-cases/any1_0.xml +21 -0
  80. data/vendor-src/libleptris/test/xsd/libxml2-cases/any1_0.xsd +22 -0
  81. data/vendor-src/libleptris/test/xsd/libxml2-cases/any2_0.xml +24 -0
  82. data/vendor-src/libleptris/test/xsd/libxml2-cases/any2_0.xsd +26 -0
  83. data/vendor-src/libleptris/test/xsd/libxml2-cases/any3_0.xml +17 -0
  84. data/vendor-src/libleptris/test/xsd/libxml2-cases/any3_0.xsd +17 -0
  85. data/vendor-src/libleptris/test/xsd/libxml2-cases/any4_0.xml +17 -0
  86. data/vendor-src/libleptris/test/xsd/libxml2-cases/any4_0.xsd +28 -0
  87. data/vendor-src/libleptris/test/xsd/libxml2-cases/any5_0.xml +7 -0
  88. data/vendor-src/libleptris/test/xsd/libxml2-cases/any5_0.xsd +13 -0
  89. data/vendor-src/libleptris/test/xsd/libxml2-cases/any5_1.xml +12 -0
  90. data/vendor-src/libleptris/test/xsd/libxml2-cases/any5_1.xsd +14 -0
  91. data/vendor-src/libleptris/test/xsd/libxml2-cases/any5_2.xml +8 -0
  92. data/vendor-src/libleptris/test/xsd/libxml2-cases/any5_3.xml +11 -0
  93. data/vendor-src/libleptris/test/xsd/libxml2-cases/any5_4.xml +12 -0
  94. data/vendor-src/libleptris/test/xsd/libxml2-cases/any5_5.xml +12 -0
  95. data/vendor-src/libleptris/test/xsd/libxml2-cases/any5_6.xml +13 -0
  96. data/vendor-src/libleptris/test/xsd/libxml2-cases/any6_0.xml +8 -0
  97. data/vendor-src/libleptris/test/xsd/libxml2-cases/any6_1.xsd +36 -0
  98. data/vendor-src/libleptris/test/xsd/libxml2-cases/any6_2.xsd +19 -0
  99. data/vendor-src/libleptris/test/xsd/libxml2-cases/any7_0.xml +19 -0
  100. data/vendor-src/libleptris/test/xsd/libxml2-cases/any7_1.xml +18 -0
  101. data/vendor-src/libleptris/test/xsd/libxml2-cases/any7_1.xsd +13 -0
  102. data/vendor-src/libleptris/test/xsd/libxml2-cases/any7_2.xml +20 -0
  103. data/vendor-src/libleptris/test/xsd/libxml2-cases/any7_2.xsd +13 -0
  104. data/vendor-src/libleptris/test/xsd/libxml2-cases/any8_0.xml +9 -0
  105. data/vendor-src/libleptris/test/xsd/libxml2-cases/any8_1.xsd +20 -0
  106. data/vendor-src/libleptris/test/xsd/libxml2-cases/anyAttr-derive-errors1_0.xml +30 -0
  107. data/vendor-src/libleptris/test/xsd/libxml2-cases/anyAttr-derive-errors1_0.xsd +223 -0
  108. data/vendor-src/libleptris/test/xsd/libxml2-cases/anyAttr-derive1_0.xml +30 -0
  109. data/vendor-src/libleptris/test/xsd/libxml2-cases/anyAttr-derive1_0.xsd +227 -0
  110. data/vendor-src/libleptris/test/xsd/libxml2-cases/anyAttr-derive2_0.xml +9 -0
  111. data/vendor-src/libleptris/test/xsd/libxml2-cases/anyAttr-derive2_0.xsd +33 -0
  112. data/vendor-src/libleptris/test/xsd/libxml2-cases/anyAttr-errors1_0.xml +26 -0
  113. data/vendor-src/libleptris/test/xsd/libxml2-cases/anyAttr-processContents-err1_0.xml +11 -0
  114. data/vendor-src/libleptris/test/xsd/libxml2-cases/anyAttr-processContents-err1_0.xsd +26 -0
  115. data/vendor-src/libleptris/test/xsd/libxml2-cases/anyAttr-processContents1_0.xml +13 -0
  116. data/vendor-src/libleptris/test/xsd/libxml2-cases/anyAttr-processContents1_0.xsd +32 -0
  117. data/vendor-src/libleptris/test/xsd/libxml2-cases/anyAttr.importA.1_0.xsd +24 -0
  118. data/vendor-src/libleptris/test/xsd/libxml2-cases/anyAttr.importB.1_0.xsd +21 -0
  119. data/vendor-src/libleptris/test/xsd/libxml2-cases/anyAttr1_0.xml +31 -0
  120. data/vendor-src/libleptris/test/xsd/libxml2-cases/anyAttr1_0.xsd +144 -0
  121. data/vendor-src/libleptris/test/xsd/libxml2-cases/attr0_0.xml +1 -0
  122. data/vendor-src/libleptris/test/xsd/libxml2-cases/attr0_0.xsd +13 -0
  123. data/vendor-src/libleptris/test/xsd/libxml2-cases/attruse_0_0.xml +8 -0
  124. data/vendor-src/libleptris/test/xsd/libxml2-cases/attruse_0_0.xsd +32 -0
  125. data/vendor-src/libleptris/test/xsd/libxml2-cases/attruse_0_1.xml +8 -0
  126. data/vendor-src/libleptris/test/xsd/libxml2-cases/attruse_0_2.xml +8 -0
  127. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug141312_0.xml +2 -0
  128. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug141312_0.xsd +16 -0
  129. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug141333.xml +9 -0
  130. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug141333.xsd +25 -0
  131. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug141333_0.xml +9 -0
  132. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug141333_0.xsd +25 -0
  133. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug143951.imp +12 -0
  134. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug143951_0.xml +9 -0
  135. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug143951_0.xsd +17 -0
  136. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug145246.xsd.imp +119 -0
  137. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug145246_0.xml +30 -0
  138. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug145246_0.xsd +173 -0
  139. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug152470_1.xml +9 -0
  140. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug152470_1.xsd +49 -0
  141. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug167754_0.xml +12 -0
  142. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug167754_0.xsd +29 -0
  143. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug303566_1.xml +19 -0
  144. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug303566_1.xsd +63 -0
  145. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug306806_0.xml +111 -0
  146. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug306806_1.xsd +544 -0
  147. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug309338_0.xml +4 -0
  148. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug309338_1.xsd +13 -0
  149. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug310264_0.xml +41 -0
  150. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug310264_0.xsd +18 -0
  151. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug312957_0.xml +14 -0
  152. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug312957_1.xsd +39 -0
  153. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug313982_0.xml +4 -0
  154. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug313982_0.xsd +11 -0
  155. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug321475_0.xml +10 -0
  156. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug321475_1.xsd +48 -0
  157. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug322411_0.xml +93 -0
  158. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug322411_1.xml +67 -0
  159. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug322411_1.xsd +35 -0
  160. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug323510_0.xml +3 -0
  161. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug323510_1.xsd +12 -0
  162. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug455953_0.xml +9 -0
  163. data/vendor-src/libleptris/test/xsd/libxml2-cases/bug455953_0.xsd +29 -0
  164. data/vendor-src/libleptris/test/xsd/libxml2-cases/changelog093_0.xml +14 -0
  165. data/vendor-src/libleptris/test/xsd/libxml2-cases/changelog093_1.xsd +253 -0
  166. data/vendor-src/libleptris/test/xsd/libxml2-cases/choice_0.xml +3 -0
  167. data/vendor-src/libleptris/test/xsd/libxml2-cases/choice_0.xsd +13 -0
  168. data/vendor-src/libleptris/test/xsd/libxml2-cases/choice_1.xml +3 -0
  169. data/vendor-src/libleptris/test/xsd/libxml2-cases/choice_1.xsd +13 -0
  170. data/vendor-src/libleptris/test/xsd/libxml2-cases/choice_2.xml +4 -0
  171. data/vendor-src/libleptris/test/xsd/libxml2-cases/choice_2.xsd +13 -0
  172. data/vendor-src/libleptris/test/xsd/libxml2-cases/choice_3.xml +4 -0
  173. data/vendor-src/libleptris/test/xsd/libxml2-cases/choice_4.xml +2 -0
  174. data/vendor-src/libleptris/test/xsd/libxml2-cases/choice_5.xml +6 -0
  175. data/vendor-src/libleptris/test/xsd/libxml2-cases/choice_6.xml +7 -0
  176. data/vendor-src/libleptris/test/xsd/libxml2-cases/complex-type-extension_0.xml +12 -0
  177. data/vendor-src/libleptris/test/xsd/libxml2-cases/complex-type-extension_0.xsd +27 -0
  178. data/vendor-src/libleptris/test/xsd/libxml2-cases/cos-ct-extends-1-3_0.xml +9 -0
  179. data/vendor-src/libleptris/test/xsd/libxml2-cases/cos-ct-extends-1-3_0.xsd +51 -0
  180. data/vendor-src/libleptris/test/xsd/libxml2-cases/cos-st-restricts-1-2-err_0.xml +3 -0
  181. data/vendor-src/libleptris/test/xsd/libxml2-cases/cos-st-restricts-1-2-err_0.xsd +30 -0
  182. data/vendor-src/libleptris/test/xsd/libxml2-cases/ct-sc-nobase_0.xml +4 -0
  183. data/vendor-src/libleptris/test/xsd/libxml2-cases/ct-sc-nobase_0.xsd +24 -0
  184. data/vendor-src/libleptris/test/xsd/libxml2-cases/date-whitespace_0.xml +29 -0
  185. data/vendor-src/libleptris/test/xsd/libxml2-cases/date-whitespace_0.xsd +20 -0
  186. data/vendor-src/libleptris/test/xsd/libxml2-cases/date-whitespace_1.xml +33 -0
  187. data/vendor-src/libleptris/test/xsd/libxml2-cases/date_0.xml +27 -0
  188. data/vendor-src/libleptris/test/xsd/libxml2-cases/date_0.xsd +122 -0
  189. data/vendor-src/libleptris/test/xsd/libxml2-cases/decimal-1.xml +37 -0
  190. data/vendor-src/libleptris/test/xsd/libxml2-cases/decimal-1.xsd +29 -0
  191. data/vendor-src/libleptris/test/xsd/libxml2-cases/decimal-1_0.xml +24 -0
  192. data/vendor-src/libleptris/test/xsd/libxml2-cases/decimal-1_1.xsd +19 -0
  193. data/vendor-src/libleptris/test/xsd/libxml2-cases/decimal-2_0.xml +14 -0
  194. data/vendor-src/libleptris/test/xsd/libxml2-cases/decimal-2_1.xsd +18 -0
  195. data/vendor-src/libleptris/test/xsd/libxml2-cases/decimal-3_0.xml +17 -0
  196. data/vendor-src/libleptris/test/xsd/libxml2-cases/decimal-3_1.xsd +18 -0
  197. data/vendor-src/libleptris/test/xsd/libxml2-cases/derivation-ok-extension-err_0.xml +9 -0
  198. data/vendor-src/libleptris/test/xsd/libxml2-cases/derivation-ok-extension-err_0.xsd +22 -0
  199. data/vendor-src/libleptris/test/xsd/libxml2-cases/derivation-ok-extension_0.xml +9 -0
  200. data/vendor-src/libleptris/test/xsd/libxml2-cases/derivation-ok-extension_0.xsd +22 -0
  201. data/vendor-src/libleptris/test/xsd/libxml2-cases/derivation-ok-restriction-2-1-1_0.xml +8 -0
  202. data/vendor-src/libleptris/test/xsd/libxml2-cases/derivation-ok-restriction-2-1-1_0.xsd +56 -0
  203. data/vendor-src/libleptris/test/xsd/libxml2-cases/derivation-ok-restriction-4-1-err_0.xml +8 -0
  204. data/vendor-src/libleptris/test/xsd/libxml2-cases/derivation-ok-restriction-4-1-err_0.xsd +69 -0
  205. data/vendor-src/libleptris/test/xsd/libxml2-cases/derivation-restriction-anyAttr_0.xml +12 -0
  206. data/vendor-src/libleptris/test/xsd/libxml2-cases/derivation-restriction-anyAttr_0.xsd +24 -0
  207. data/vendor-src/libleptris/test/xsd/libxml2-cases/derivation-restriction-anyType.xml +9 -0
  208. data/vendor-src/libleptris/test/xsd/libxml2-cases/derivation-restriction-anyType.xsd +22 -0
  209. data/vendor-src/libleptris/test/xsd/libxml2-cases/deter0_0.xml +5 -0
  210. data/vendor-src/libleptris/test/xsd/libxml2-cases/deter0_0.xsd +16 -0
  211. data/vendor-src/libleptris/test/xsd/libxml2-cases/dur_0.xml +13 -0
  212. data/vendor-src/libleptris/test/xsd/libxml2-cases/dur_0.xsd +72 -0
  213. data/vendor-src/libleptris/test/xsd/libxml2-cases/elem0_0.xml +3 -0
  214. data/vendor-src/libleptris/test/xsd/libxml2-cases/elem0_0.xsd +16 -0
  215. data/vendor-src/libleptris/test/xsd/libxml2-cases/element-err_0.xml +4 -0
  216. data/vendor-src/libleptris/test/xsd/libxml2-cases/element-err_0.xsd +39 -0
  217. data/vendor-src/libleptris/test/xsd/libxml2-cases/element-minmax-err_0.xml +5 -0
  218. data/vendor-src/libleptris/test/xsd/libxml2-cases/element-minmax-err_0.xsd +11 -0
  219. data/vendor-src/libleptris/test/xsd/libxml2-cases/empty-value_0.xml +2 -0
  220. data/vendor-src/libleptris/test/xsd/libxml2-cases/empty-value_1.xml +2 -0
  221. data/vendor-src/libleptris/test/xsd/libxml2-cases/empty-value_1.xsd +24 -0
  222. data/vendor-src/libleptris/test/xsd/libxml2-cases/empty_0.xml +1 -0
  223. data/vendor-src/libleptris/test/xsd/libxml2-cases/empty_0.xsd +13 -0
  224. data/vendor-src/libleptris/test/xsd/libxml2-cases/empty_1.xsd +9 -0
  225. data/vendor-src/libleptris/test/xsd/libxml2-cases/extension0_0.xml +7 -0
  226. data/vendor-src/libleptris/test/xsd/libxml2-cases/extension0_0.xsd +20 -0
  227. data/vendor-src/libleptris/test/xsd/libxml2-cases/extension1_0.xml +1 -0
  228. data/vendor-src/libleptris/test/xsd/libxml2-cases/extension1_0.xsd +17 -0
  229. data/vendor-src/libleptris/test/xsd/libxml2-cases/extension1_1.xml +1 -0
  230. data/vendor-src/libleptris/test/xsd/libxml2-cases/extension1_2.xml +1 -0
  231. data/vendor-src/libleptris/test/xsd/libxml2-cases/extension2_0.xml +4 -0
  232. data/vendor-src/libleptris/test/xsd/libxml2-cases/extension2_1.xsd +17 -0
  233. data/vendor-src/libleptris/test/xsd/libxml2-cases/facet-unionST-err1_0.xml +4 -0
  234. data/vendor-src/libleptris/test/xsd/libxml2-cases/facet-unionST-err1_0.xsd +27 -0
  235. data/vendor-src/libleptris/test/xsd/libxml2-cases/facet-whiteSpace_0.xml +7 -0
  236. data/vendor-src/libleptris/test/xsd/libxml2-cases/facet-whiteSpace_0.xsd +12 -0
  237. data/vendor-src/libleptris/test/xsd/libxml2-cases/group0_0.xml +3 -0
  238. data/vendor-src/libleptris/test/xsd/libxml2-cases/group0_0.xsd +18 -0
  239. data/vendor-src/libleptris/test/xsd/libxml2-cases/hexbinary_0.xml +20 -0
  240. data/vendor-src/libleptris/test/xsd/libxml2-cases/hexbinary_0.xsd +35 -0
  241. data/vendor-src/libleptris/test/xsd/libxml2-cases/hexbinary_1.xml +15 -0
  242. data/vendor-src/libleptris/test/xsd/libxml2-cases/idc-keyref-err1_0.xml +14 -0
  243. data/vendor-src/libleptris/test/xsd/libxml2-cases/idc-keyref-err1_1.xsd +53 -0
  244. data/vendor-src/libleptris/test/xsd/libxml2-cases/import-455953.xsd +24 -0
  245. data/vendor-src/libleptris/test/xsd/libxml2-cases/import-bad-1_0.imp +5 -0
  246. data/vendor-src/libleptris/test/xsd/libxml2-cases/import0_0.imp +13 -0
  247. data/vendor-src/libleptris/test/xsd/libxml2-cases/import0_0.xml +8 -0
  248. data/vendor-src/libleptris/test/xsd/libxml2-cases/import0_0.xsd +21 -0
  249. data/vendor-src/libleptris/test/xsd/libxml2-cases/import1_0.imp +8 -0
  250. data/vendor-src/libleptris/test/xsd/libxml2-cases/import1_0.xml +11 -0
  251. data/vendor-src/libleptris/test/xsd/libxml2-cases/import1_0.xsd +30 -0
  252. data/vendor-src/libleptris/test/xsd/libxml2-cases/import1_0b.imp +8 -0
  253. data/vendor-src/libleptris/test/xsd/libxml2-cases/import2_0.imp +24 -0
  254. data/vendor-src/libleptris/test/xsd/libxml2-cases/import2_0.xml +8 -0
  255. data/vendor-src/libleptris/test/xsd/libxml2-cases/import2_0.xsd +24 -0
  256. data/vendor-src/libleptris/test/xsd/libxml2-cases/include1_0.inc +28 -0
  257. data/vendor-src/libleptris/test/xsd/libxml2-cases/include1_0.xml +8 -0
  258. data/vendor-src/libleptris/test/xsd/libxml2-cases/include1_0.xsd +15 -0
  259. data/vendor-src/libleptris/test/xsd/libxml2-cases/include2_0.inc +17 -0
  260. data/vendor-src/libleptris/test/xsd/libxml2-cases/include2_0.xml +9 -0
  261. data/vendor-src/libleptris/test/xsd/libxml2-cases/include2_0.xsd +14 -0
  262. data/vendor-src/libleptris/test/xsd/libxml2-cases/include3_0.inc +5 -0
  263. data/vendor-src/libleptris/test/xsd/libxml2-cases/include3_0.xml +7 -0
  264. data/vendor-src/libleptris/test/xsd/libxml2-cases/include3_0.xsd +9 -0
  265. data/vendor-src/libleptris/test/xsd/libxml2-cases/issue303_0.xml +1 -0
  266. data/vendor-src/libleptris/test/xsd/libxml2-cases/issue303_0.xsd +19 -0
  267. data/vendor-src/libleptris/test/xsd/libxml2-cases/issue40_0.xml +3 -0
  268. data/vendor-src/libleptris/test/xsd/libxml2-cases/issue40_0.xsd +10 -0
  269. data/vendor-src/libleptris/test/xsd/libxml2-cases/issue491_0.xml +1 -0
  270. data/vendor-src/libleptris/test/xsd/libxml2-cases/issue491_0.xsd +18 -0
  271. data/vendor-src/libleptris/test/xsd/libxml2-cases/item_0.xml +6 -0
  272. data/vendor-src/libleptris/test/xsd/libxml2-cases/item_0.xsd +39 -0
  273. data/vendor-src/libleptris/test/xsd/libxml2-cases/item_1.xsd +42 -0
  274. data/vendor-src/libleptris/test/xsd/libxml2-cases/length1_0.xml +1 -0
  275. data/vendor-src/libleptris/test/xsd/libxml2-cases/length1_0.xsd +11 -0
  276. data/vendor-src/libleptris/test/xsd/libxml2-cases/length2_0.xml +5 -0
  277. data/vendor-src/libleptris/test/xsd/libxml2-cases/length2_0.xsd +14 -0
  278. data/vendor-src/libleptris/test/xsd/libxml2-cases/length3_0.xml +5 -0
  279. data/vendor-src/libleptris/test/xsd/libxml2-cases/length3_0.xsd +10 -0
  280. data/vendor-src/libleptris/test/xsd/libxml2-cases/list0_0.xml +6 -0
  281. data/vendor-src/libleptris/test/xsd/libxml2-cases/list0_0.xsd +13 -0
  282. data/vendor-src/libleptris/test/xsd/libxml2-cases/list0_1.xml +3 -0
  283. data/vendor-src/libleptris/test/xsd/libxml2-cases/list0_1.xsd +13 -0
  284. data/vendor-src/libleptris/test/xsd/libxml2-cases/list0_2.xml +4 -0
  285. data/vendor-src/libleptris/test/xsd/libxml2-cases/mixed0_0.xml +1 -0
  286. data/vendor-src/libleptris/test/xsd/libxml2-cases/mixed0_0.xsd +5 -0
  287. data/vendor-src/libleptris/test/xsd/libxml2-cases/mixed1_0.xml +1 -0
  288. data/vendor-src/libleptris/test/xsd/libxml2-cases/mixed1_0.xsd +7 -0
  289. data/vendor-src/libleptris/test/xsd/libxml2-cases/ns0_0.xml +2 -0
  290. data/vendor-src/libleptris/test/xsd/libxml2-cases/ns0_0.xsd +16 -0
  291. data/vendor-src/libleptris/test/xsd/libxml2-cases/ns0_1.xml +2 -0
  292. data/vendor-src/libleptris/test/xsd/libxml2-cases/ns0_1.xsd +16 -0
  293. data/vendor-src/libleptris/test/xsd/libxml2-cases/ns0_2.xml +2 -0
  294. data/vendor-src/libleptris/test/xsd/libxml2-cases/ns0_3.xml +2 -0
  295. data/vendor-src/libleptris/test/xsd/libxml2-cases/ns0_4.xml +3 -0
  296. data/vendor-src/libleptris/test/xsd/libxml2-cases/ns1_0.xml +2 -0
  297. data/vendor-src/libleptris/test/xsd/libxml2-cases/ns1_0.xsd +3 -0
  298. data/vendor-src/libleptris/test/xsd/libxml2-cases/ns2_0.xml +1 -0
  299. data/vendor-src/libleptris/test/xsd/libxml2-cases/ns2_0.xsd +15 -0
  300. data/vendor-src/libleptris/test/xsd/libxml2-cases/nvdcve_0.xml +5235 -0
  301. data/vendor-src/libleptris/test/xsd/libxml2-cases/nvdcve_0.xsd +498 -0
  302. data/vendor-src/libleptris/test/xsd/libxml2-cases/oss-fuzz-51295_0.xml +1 -0
  303. data/vendor-src/libleptris/test/xsd/libxml2-cases/oss-fuzz-51295_0.xsd +4 -0
  304. data/vendor-src/libleptris/test/xsd/libxml2-cases/po0_0.xml +32 -0
  305. data/vendor-src/libleptris/test/xsd/libxml2-cases/po0_0.xsd +59 -0
  306. data/vendor-src/libleptris/test/xsd/libxml2-cases/po1_0.xml +34 -0
  307. data/vendor-src/libleptris/test/xsd/libxml2-cases/po1_0.xsd +64 -0
  308. data/vendor-src/libleptris/test/xsd/libxml2-cases/poschargrp0_0.xml +2 -0
  309. data/vendor-src/libleptris/test/xsd/libxml2-cases/poschargrp0_0.xsd +14 -0
  310. data/vendor-src/libleptris/test/xsd/libxml2-cases/regexp-char-ref_0.xml +7 -0
  311. data/vendor-src/libleptris/test/xsd/libxml2-cases/regexp-char-ref_0.xsd +20 -0
  312. data/vendor-src/libleptris/test/xsd/libxml2-cases/regexp-char-ref_1.xsd +20 -0
  313. data/vendor-src/libleptris/test/xsd/libxml2-cases/restrict-CT-attr-ref_0.xml +3 -0
  314. data/vendor-src/libleptris/test/xsd/libxml2-cases/restrict-CT-attr-ref_0.xsd +30 -0
  315. data/vendor-src/libleptris/test/xsd/libxml2-cases/restriction-attr1_0.xml +3 -0
  316. data/vendor-src/libleptris/test/xsd/libxml2-cases/restriction-attr1_0.xsd +18 -0
  317. data/vendor-src/libleptris/test/xsd/libxml2-cases/restriction-enum-1_0.xml +7 -0
  318. data/vendor-src/libleptris/test/xsd/libxml2-cases/restriction-enum-1_1.xsd +19 -0
  319. data/vendor-src/libleptris/test/xsd/libxml2-cases/restriction0_0.xml +5 -0
  320. data/vendor-src/libleptris/test/xsd/libxml2-cases/restriction0_0.xsd +21 -0
  321. data/vendor-src/libleptris/test/xsd/libxml2-cases/scc-no-xmlns_0.xml +3 -0
  322. data/vendor-src/libleptris/test/xsd/libxml2-cases/scc-no-xmlns_0.xsd +11 -0
  323. data/vendor-src/libleptris/test/xsd/libxml2-cases/scc-no-xsi_0.xml +3 -0
  324. data/vendor-src/libleptris/test/xsd/libxml2-cases/scc-no-xsi_0.xsd +11 -0
  325. data/vendor-src/libleptris/test/xsd/libxml2-cases/seq-dubl-elem1_0.xml +7 -0
  326. data/vendor-src/libleptris/test/xsd/libxml2-cases/seq-dubl-elem1_0.xsd +25 -0
  327. data/vendor-src/libleptris/test/xsd/libxml2-cases/seq0_0.xml +61 -0
  328. data/vendor-src/libleptris/test/xsd/libxml2-cases/seq0_0.xsd +64 -0
  329. data/vendor-src/libleptris/test/xsd/libxml2-cases/src-attribute1_0.xml +2 -0
  330. data/vendor-src/libleptris/test/xsd/libxml2-cases/src-attribute1_0.xsd +13 -0
  331. data/vendor-src/libleptris/test/xsd/libxml2-cases/src-attribute2_0.xml +2 -0
  332. data/vendor-src/libleptris/test/xsd/libxml2-cases/src-attribute2_0.xsd +13 -0
  333. data/vendor-src/libleptris/test/xsd/libxml2-cases/src-attribute3-1_0.xml +2 -0
  334. data/vendor-src/libleptris/test/xsd/libxml2-cases/src-attribute3-1_0.xsd +15 -0
  335. data/vendor-src/libleptris/test/xsd/libxml2-cases/src-attribute3-2-form_0.xml +2 -0
  336. data/vendor-src/libleptris/test/xsd/libxml2-cases/src-attribute3-2-form_0.xsd +16 -0
  337. data/vendor-src/libleptris/test/xsd/libxml2-cases/src-attribute3-2-st_0.xml +2 -0
  338. data/vendor-src/libleptris/test/xsd/libxml2-cases/src-attribute3-2-st_0.xsd +22 -0
  339. data/vendor-src/libleptris/test/xsd/libxml2-cases/src-attribute3-2-type_0.xml +2 -0
  340. data/vendor-src/libleptris/test/xsd/libxml2-cases/src-attribute3-2-type_0.xsd +16 -0
  341. data/vendor-src/libleptris/test/xsd/libxml2-cases/src-attribute4_0.xml +2 -0
  342. data/vendor-src/libleptris/test/xsd/libxml2-cases/src-attribute4_0.xsd +17 -0
  343. data/vendor-src/libleptris/test/xsd/libxml2-cases/src-element1_0.xml +2 -0
  344. data/vendor-src/libleptris/test/xsd/libxml2-cases/src-element1_0.xsd +9 -0
  345. data/vendor-src/libleptris/test/xsd/libxml2-cases/src-element2-1_0.xml +2 -0
  346. data/vendor-src/libleptris/test/xsd/libxml2-cases/src-element2-1_0.xsd +17 -0
  347. data/vendor-src/libleptris/test/xsd/libxml2-cases/src-element2-2_0.xml +2 -0
  348. data/vendor-src/libleptris/test/xsd/libxml2-cases/src-element2-2_0.xsd +48 -0
  349. data/vendor-src/libleptris/test/xsd/libxml2-cases/src-element3_0.xml +2 -0
  350. data/vendor-src/libleptris/test/xsd/libxml2-cases/src-element3_0.xsd +29 -0
  351. data/vendor-src/libleptris/test/xsd/libxml2-cases/subst-group-1_0.xsd +45 -0
  352. data/vendor-src/libleptris/test/xsd/libxml2-cases/subst-group-1_1.xml +12 -0
  353. data/vendor-src/libleptris/test/xsd/libxml2-cases/union2_1.xml +6 -0
  354. data/vendor-src/libleptris/test/xsd/libxml2-cases/union2_1.xsd +21 -0
  355. data/vendor-src/libleptris/test/xsd/libxml2-cases/union_0_0.xml +8 -0
  356. data/vendor-src/libleptris/test/xsd/libxml2-cases/union_0_0.xsd +53 -0
  357. data/vendor-src/libleptris/test/xsd/libxml2-cases/v012-reader-schema-main.xsd +6 -0
  358. data/vendor-src/libleptris/test/xsd/libxml2-cases/vdv-complexTypes.xsd +37 -0
  359. data/vendor-src/libleptris/test/xsd/libxml2-cases/vdv-first0_0.xml +33 -0
  360. data/vendor-src/libleptris/test/xsd/libxml2-cases/vdv-first0_0.xsd +67 -0
  361. data/vendor-src/libleptris/test/xsd/libxml2-cases/vdv-first1_0.xml +33 -0
  362. data/vendor-src/libleptris/test/xsd/libxml2-cases/vdv-first1_0.xsd +47 -0
  363. data/vendor-src/libleptris/test/xsd/libxml2-cases/vdv-first2_0.xml +33 -0
  364. data/vendor-src/libleptris/test/xsd/libxml2-cases/vdv-first2_0.xsd +89 -0
  365. data/vendor-src/libleptris/test/xsd/libxml2-cases/vdv-first3_0.xml +33 -0
  366. data/vendor-src/libleptris/test/xsd/libxml2-cases/vdv-first3_0.xsd +68 -0
  367. data/vendor-src/libleptris/test/xsd/libxml2-cases/vdv-first4_0.xml +33 -0
  368. data/vendor-src/libleptris/test/xsd/libxml2-cases/vdv-first4_0.xsd +150 -0
  369. data/vendor-src/libleptris/test/xsd/libxml2-cases/vdv-first4_1.xml +33 -0
  370. data/vendor-src/libleptris/test/xsd/libxml2-cases/vdv-first4_2.xml +33 -0
  371. data/vendor-src/libleptris/test/xsd/libxml2-cases/vdv-first5_0.xml +33 -0
  372. data/vendor-src/libleptris/test/xsd/libxml2-cases/vdv-first5_0.xsd +85 -0
  373. data/vendor-src/libleptris/test/xsd/libxml2-cases/vdv-simpleTypes.xsd +38 -0
  374. data/vendor-src/libleptris/test/xsd/libxml2-cases/xml.xsd +117 -0
  375. data/vendor-src/libleptris/test/xsd/libxml2-cases/xsd-list-itemType_0.xml +3 -0
  376. data/vendor-src/libleptris/test/xsd/libxml2-cases/xsd-list-itemType_0.xsd +14 -0
  377. data/vendor-src/libleptris/test/xsd/libxml2-cases/xsd-simpleType-varieties_0.xml +8 -0
  378. data/vendor-src/libleptris/test/xsd/libxml2-cases/xsd-simpleType-varieties_0.xsd +45 -0
  379. data/vendor-src/libleptris/test/xsd/test_xsd_compile.cpp +266 -0
  380. data/vendor-src/libleptris/vcpkg.json +1 -1
  381. metadata +357 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 944ac557c94da9d3acaeed47cba1976d3bfd4e5f323e21098fea1029995df8fa
4
- data.tar.gz: ad5487f4689224c7003c0c60baf496825d2a824b71416c7d8709ca859ae31cc3
3
+ metadata.gz: 4ee497bb903d46114b37f9f792a4777b341e8979d5588a04a21f67e54ae7e6ca
4
+ data.tar.gz: 248491ca63975b2ecfb2e1b558a098b6f58d8a6c4db487ac7a2b4a40829a58d9
5
5
  SHA512:
6
- metadata.gz: 63946188ca1a4a6d7026ef8971b4363875204e4ccf4f4208cd702fa8444c22dbfb70b284e4401116994827ebb03bb88705487798fda0e0265138d6e71788fd68
7
- data.tar.gz: f04507851cbc46e6bcd949a80134053abca9410e4dc819922563e4a375a0b5090d6f49b3aa0530df456d6974be40020ed0719f5b362d876797123cdfc05cab55
6
+ metadata.gz: 22969ea6a40c82c0b83fcd05d94ebd8fbf08b5e5ebc3f49a4f7252eb428692d4c9bea982ba72a884561713f1854b92a4d9e10c0ae111e4939e6ded546d4e8ceb
7
+ data.tar.gz: 1606e4a9131361bd12a52fdc947f3fc59e0389121a21189370eb813c725491a7f25caa7e0929e060785c374793eea06a55b87290141803bfbe6a4bb92fc9e6f2
data/CHANGELOG.md CHANGED
@@ -1,3 +1,33 @@
1
+ ## [1.9.319.0] - 2026-10-08
2
+
3
+ ### Added — engine sync (libleptris 1.9.319)
4
+
5
+ - **XSD lexical validation, slice 2 (#1075)**:
6
+ `XSD.builtin_valid?` covers the tier-1 built-in table (string
7
+ family, token, boolean, decimal/integer ranges, float/double,
8
+ date/time with bounds, duration, hex/base64Binary) by the
9
+ "xs:NAME" reference spelling; `Schema#simple_valid?` resolves
10
+ user simpleTypes through cycle-guarded restriction chains
11
+ (pattern / enumeration / min-max / length / digits facets).
12
+ The C face's -1 (not-in-table / unknown type) raises — a silent
13
+ false would let misspelled types validate nothing forever.
14
+ (Slice 1's compile surface rode in the parallel 1.9.318.0.)
15
+
16
+ ### Fixed — engine sync (1.9.319)
17
+
18
+ - **RELAX NG exact `{n}` quantifiers (PR #1583)**: the regex
19
+ engine's no-comma branch never set the hi bound — `[A-Z]{3}`
20
+ matched `ABCD`, so any schema using exact bounds silently
21
+ over-accepted. Pinned through the binding's datatype path
22
+ (accepts ABC, rejects ABCD).
23
+
24
+ ### Performance — engine sync (1.9.318)
25
+
26
+ - Per-thread small-span arena recycle (#1436): the tiny-doc
27
+ create/destroy row drops ~15% (183→159 ns/doc quiet-hardware) —
28
+ engine-internal; the binding inherits it on every
29
+ Document.create cycle.
30
+
1
31
  ## [1.9.317.1] - 2026-10-08
2
32
 
3
33
  ### Fixed
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.319"
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.319.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,27 @@ 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
+ # Slice 2 (libleptris 1.9.319, #1075): lexical validation.
1299
+ # Built-ins take the "xs:NAME" reference spelling; -1 = not
1300
+ # in the tier-1 table. simple_valid resolves a user
1301
+ # simpleType by local name through cycle-guarded restriction
1302
+ # chains; -1 = unknown type.
1303
+ attach_function :leptris_xsd_builtin_valid,
1304
+ [:string, :string], :int
1305
+ attach_function :leptris_xsd_simple_valid,
1306
+ [:leptris_xsd_schema, :string, :string], :int
1307
+
1286
1308
  attach_function :leptris_rng_parse,
1287
1309
  [:string, :size_t, :pointer], :leptris_relaxng
1288
1310
  attach_function :leptris_rng_parse_file,
@@ -0,0 +1,93 @@
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
+ # Slice 2 (libleptris 1.9.319, #1075): built-in lexical table.
13
+ # +builtin+ takes the "xs:NAME" reference spelling. Returns
14
+ # true/false; an unknown table name raises — a silent false
15
+ # would let misspelled types validate nothing forever.
16
+ def builtin_valid?(builtin, lexical)
17
+ r = Leptris::XML::FFI.leptris_xsd_builtin_valid(
18
+ builtin.to_s, lexical.to_s)
19
+ case r
20
+ when 1 then true
21
+ when 0 then false
22
+ else
23
+ raise ArgumentError,
24
+ "#{builtin.inspect} is not in the tier-1 built-in table"
25
+ end
26
+ end
27
+
28
+ # A compiled XSD schema (libleptris >= 1.9.318, #1075 tier-1):
29
+ # the compilation surface — a declaration census and schema-level
30
+ # error reporting. Validation is a later tier and not exposed yet.
31
+ #
32
+ # schema = Leptris::XML::XSD.compile(xsd_text)
33
+ # schema.declaration_count # => top-level schema declarations
34
+ # schema.error # => nil, or the engine's message
35
+ #
36
+ class Schema
37
+ # GC-managed compiled handle.
38
+ class Handle < ::FFI::AutoPointer
39
+ def self.release(ptr)
40
+ Leptris::XML::FFI.leptris_xsd_free(ptr)
41
+ end
42
+ end
43
+
44
+ # Compile a schema from XML text. Raises Error when the text is
45
+ # not usable at all (not well-formed, no root); schema-level
46
+ # problems compile to a handle whose #error carries the detail
47
+ # — the tier-1 contract.
48
+ def self.compile(schema_xml)
49
+ xml = schema_xml.to_s
50
+ status = ::FFI::MemoryPointer.new(:int)
51
+ raw = Leptris::XML::FFI.leptris_xsd_compile(xml, xml.bytesize, status)
52
+ if raw.null?
53
+ raise Leptris::XML::Error,
54
+ "schema compile failed (status #{status.read_int}): " \
55
+ "#{Leptris::XML::FFI.leptris_last_error}"
56
+ end
57
+ new(Handle.new(raw))
58
+ end
59
+
60
+ def initialize(handle)
61
+ @handle = handle
62
+ end
63
+
64
+ # Number of top-level schema declarations the compiler
65
+ # recognized (elements, types, groups, ...).
66
+ def declaration_count
67
+ Leptris::XML::FFI.leptris_xsd_declaration_count(@handle)
68
+ end
69
+
70
+ # The engine's schema-level error message, or nil when the
71
+ # schema compiled cleanly.
72
+ def error
73
+ msg = Leptris::XML::FFI.leptris_xsd_error(@handle)
74
+ msg.nil? || msg.empty? ? nil : msg
75
+ end
76
+
77
+ # Slice 2 (libleptris 1.9.319, #1075): lexical validation of
78
+ # +lexical+ against the user simpleType +type_name+ (local
79
+ # name) — restriction chains validate every hop's facets,
80
+ # cycle-guarded. Unknown type names raise (the -1 contract).
81
+ def simple_valid?(type_name, lexical)
82
+ r = Leptris::XML::FFI.leptris_xsd_simple_valid(
83
+ @handle, type_name.to_s, lexical.to_s)
84
+ case r
85
+ when 1 then true
86
+ when 0 then false
87
+ else
88
+ raise ArgumentError,
89
+ "#{type_name.inspect} is not a simpleType in this schema"
90
+ end
91
+ end
92
+ end
93
+ 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.319
5
5
  - utf8proc v2.11.0
6
6
 
7
7
  Rebuild by hand:
@@ -1,5 +1,60 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [1.9.319] - 2026-10-08
4
+
5
+ ### Added
6
+
7
+ - **XSD validation, tier 1, slices 1–2 (#1075, PRs #1581/#1583).**
8
+ Slice 1: the `leptris_xsd_compile` surface (xs:schema identity
9
+ under any namespace spelling, top-level declaration enumeration,
10
+ error-carrying failure handles) plus the corpus gate — libxml2's
11
+ own `test/schemas` set (350 files, MIT) vendored at
12
+ `test/xsd/libxml2-cases`, **163/163 fixtures compiling** with a
13
+ pinned monotonic floor. Slice 2: `leptris_xsd_builtin_valid` —
14
+ the tier-1 built-in lexical table (string/Name family, token,
15
+ language, anyURI, QName, boolean, decimal, the integer-derivation
16
+ ranges, float/double, the date/time family with month/day bounds,
17
+ duration, hex/base64Binary) — and `leptris_xsd_simple_valid`:
18
+ named simpleTypes captured at compile (base + pattern /
19
+ enumeration / min-max inclusive-exclusive / length family /
20
+ total-fractionDigits facets), validated through cycle-guarded
21
+ restriction chains where every hop's facets bind.
22
+
23
+ ### Fixed
24
+
25
+ - **Regex engine: `{n}` EXACT quantifiers parsed open-ended
26
+ (PR #1583).** The no-comma branch never set the hi bound, so
27
+ `[A-Z]{3}` matched `ABCD` — any RELAX NG schema using exact
28
+ quantifier bounds silently accepted longer runs. Root fix in the
29
+ quantifier parser plus a never-again spec on the direct engine
30
+ call; `rng_internal.h` gained C++ guards for test-side calls.
31
+ - Amalgamated single-TU build: the XSD datatype statics now carry
32
+ the `xsd_` prefix (collision with the xpath lexer's same-named
33
+ statics — the #1217 class).
34
+
35
+
36
+
37
+ ## [1.9.318] - 2026-10-08
38
+
39
+ ### Performance
40
+
41
+ - **Per-thread small-span arena recycle — the tiny-doc fixed row
42
+ (#1436, PR #1580).** The global retain tier deliberately skipped
43
+ spans below 256 KB, so every small document paid full malloc/free
44
+ bookkeeping per create/destroy cycle; the quiet-hardware profile
45
+ named that cycle as the heart of the ~185 ns/doc tiny-doc row. A
46
+ per-thread LIFO cache inside the arena's retain seam hands the
47
+ previous document's span back with no allocator, no spinlock, and
48
+ no cross-thread traffic. Three standing contracts preserved:
49
+ exact-size take (the fail-fast capacity never silently widens),
50
+ custom-allocator stand-down (hooked accounting sees every
51
+ malloc/free pair), and ASAN bypass with thread-cleanup drain.
52
+ Measured on bench_doc_lifecycle (interleaved A/B, Release):
53
+ tight cycle 183/203/183 → 166/159/159 ns/doc (~15% off the
54
+ fixed row).
55
+
56
+
57
+
3
58
  ## [1.9.317] - 2026-10-07
4
59
 
5
60
  ### 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.319
7
7
  DESCRIPTION "Fast XML parser and XPath evaluator in pure C"
8
8
  LANGUAGES C CXX
9
9
  )
@@ -27,6 +27,8 @@ 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
31
+ leptris/xsd/datatypes.c
30
32
  leptris/rng/rng_public.c
31
33
  leptris/rng/rng_regex.c
32
34
  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,44 @@ 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);
912
+
913
+ /* Slice 2 — lexical validation. Built-ins take the "xs:NAME"
914
+ * reference spelling; -1 = not in the tier-1 table. */
915
+ LEPTRIS_API int leptris_xsd_builtin_valid(const char* builtin,
916
+ const char* lexical);
917
+ /* A user simpleType compiled into the schema, by local name:
918
+ * 1 valid, 0 invalid, -1 unknown type. Restriction chains (local
919
+ * bases) validate every hop's facets, cycle-guarded. */
920
+ LEPTRIS_API int leptris_xsd_simple_valid(LeptrisXsdSchema schema,
921
+ const char* type_name,
922
+ const char* lexical);
885
923
  /* Validate an instance document against the parsed schema
886
924
  * (phase-2 core subset: element/attribute/text/data/value/
887
925
  * 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]);
@@ -8,6 +8,10 @@
8
8
  #ifndef LEPTRIS_RNG_INTERNAL_H
9
9
  #define LEPTRIS_RNG_INTERNAL_H
10
10
 
11
+ #ifdef __cplusplus
12
+ extern "C" {
13
+ #endif
14
+
11
15
  #include "../include/leptris.h"
12
16
  #include "../dom/diag.h"
13
17
  #include <stddef.h>
@@ -109,4 +113,8 @@ int rng_regex_matches(const char* pat, const char* text);
109
113
  void rng_pattern_free(RngPattern* p);
110
114
  void rng_grammar_free(RngGrammar* g);
111
115
 
116
+ #ifdef __cplusplus
117
+ }
118
+ #endif
119
+
112
120
  #endif
@@ -289,6 +289,10 @@ static RreNode* parse_piece(RreParser* ps) {
289
289
  }
290
290
  }
291
291
  }
292
+ /* {n} with no comma is EXACT — h must be l, not the
293
+ * -1 "unbounded" sentinel. The old code left h = -1,
294
+ * so [A-Z]{3} matched ABCD (open-ended {3,}). */
295
+ if (*q != ',' && h == -1) h = l;
292
296
  if (*q == '}' && l >= 0 && (h == -1 || h >= l)) {
293
297
  lo = l;
294
298
  hi = h;
@@ -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
  /* ============================================================================