rsvg2 1.1.5-x86-mingw32 → 1.1.6-x86-mingw32

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 (224) hide show
  1. data/lib/1.8/rsvg2.so +0 -0
  2. data/lib/1.9/rsvg2.so +0 -0
  3. data/vendor/local/bin/libxml2-2.dll +0 -0
  4. data/vendor/local/bin/xmlcatalog.exe +0 -0
  5. data/vendor/local/bin/xmllint.exe +0 -0
  6. data/vendor/local/include/libxml2/libxml/DOCBparser.h +9 -9
  7. data/vendor/local/include/libxml2/libxml/HTMLparser.h +25 -23
  8. data/vendor/local/include/libxml2/libxml/HTMLtree.h +19 -19
  9. data/vendor/local/include/libxml2/libxml/SAX.h +37 -37
  10. data/vendor/local/include/libxml2/libxml/SAX2.h +34 -34
  11. data/vendor/local/include/libxml2/libxml/c14n.h +1 -1
  12. data/vendor/local/include/libxml2/libxml/catalog.h +35 -35
  13. data/vendor/local/include/libxml2/libxml/debugXML.h +26 -26
  14. data/vendor/local/include/libxml2/libxml/dict.h +16 -5
  15. data/vendor/local/include/libxml2/libxml/encoding.h +28 -14
  16. data/vendor/local/include/libxml2/libxml/hash.h +24 -24
  17. data/vendor/local/include/libxml2/libxml/list.h +26 -26
  18. data/vendor/local/include/libxml2/libxml/nanoftp.h +44 -24
  19. data/vendor/local/include/libxml2/libxml/nanohttp.h +13 -13
  20. data/vendor/local/include/libxml2/libxml/parser.h +78 -73
  21. data/vendor/local/include/libxml2/libxml/parserInternals.h +106 -73
  22. data/vendor/local/include/libxml2/libxml/schemasInternals.h +2 -2
  23. data/vendor/local/include/libxml2/libxml/schematron.h +11 -11
  24. data/vendor/local/include/libxml2/libxml/tree.h +203 -152
  25. data/vendor/local/include/libxml2/libxml/valid.h +72 -72
  26. data/vendor/local/include/libxml2/libxml/xlink.h +7 -7
  27. data/vendor/local/include/libxml2/libxml/xmlIO.h +71 -65
  28. data/vendor/local/include/libxml2/libxml/xmlautomata.h +22 -22
  29. data/vendor/local/include/libxml2/libxml/xmlerror.h +6 -6
  30. data/vendor/local/include/libxml2/libxml/xmlexports.h +2 -2
  31. data/vendor/local/include/libxml2/libxml/xmlmodule.h +1 -1
  32. data/vendor/local/include/libxml2/libxml/xmlreader.h +24 -20
  33. data/vendor/local/include/libxml2/libxml/xmlsave.h +2 -1
  34. data/vendor/local/include/libxml2/libxml/xmlschemas.h +30 -2
  35. data/vendor/local/include/libxml2/libxml/xmlschemastypes.h +20 -20
  36. data/vendor/local/include/libxml2/libxml/xmlstring.h +3 -3
  37. data/vendor/local/include/libxml2/libxml/xmlversion.h +29 -7
  38. data/vendor/local/include/libxml2/libxml/xmlwriter.h +4 -1
  39. data/vendor/local/include/libxml2/libxml/xpath.h +47 -43
  40. data/vendor/local/include/libxml2/libxml/xpathInternals.h +81 -79
  41. data/vendor/local/include/libxml2/libxml/xpointer.h +23 -23
  42. data/vendor/local/lib/libxml2.def +16 -14
  43. data/vendor/local/lib/libxml2.dll.a +0 -0
  44. data/vendor/local/lib/libxml2.lib +0 -0
  45. data/vendor/local/lib/pkgconfig/libxml-2.0.pc +3 -3
  46. data/vendor/local/manifest/libxml2-dev_2.9.0-1_win32.mft +268 -0
  47. data/vendor/local/manifest/libxml2_2.9.0-1_win32.mft +2 -0
  48. data/vendor/local/share/doc/libxml2-2.9.0/Copyright +27 -0
  49. data/vendor/local/share/doc/libxml2-2.9.0/examples/testHTML.c +880 -0
  50. data/vendor/local/share/doc/libxml2-2.9.0/examples/testSAX.c +1198 -0
  51. data/vendor/local/share/doc/libxml2-2.9.0/examples/testXPath.c +229 -0
  52. data/vendor/local/share/doc/libxml2-2.9.0/examples/xmllint.c +3770 -0
  53. data/vendor/local/share/doc/libxml2-2.9.0/html/DOM.gif +0 -0
  54. data/vendor/local/share/doc/libxml2-2.9.0/html/FAQ.html +282 -0
  55. data/vendor/local/share/doc/libxml2-2.9.0/html/Libxml2-Logo-180x168.gif +0 -0
  56. data/vendor/local/share/doc/libxml2-2.9.0/html/Libxml2-Logo-90x34.gif +0 -0
  57. data/vendor/local/share/doc/libxml2-2.9.0/html/encoding.html +207 -0
  58. data/vendor/local/share/doc/libxml2-2.9.0/html/examples.xml +751 -0
  59. data/vendor/local/share/doc/libxml2-2.9.0/html/examples.xsl +174 -0
  60. data/vendor/local/share/doc/libxml2-2.9.0/html/html/book1.html +13 -0
  61. data/vendor/local/share/doc/libxml2-2.9.0/html/html/home.png +0 -0
  62. data/vendor/local/share/doc/libxml2-2.9.0/html/html/index.html +13 -0
  63. data/vendor/local/share/doc/libxml2-2.9.0/html/html/left.png +0 -0
  64. data/vendor/local/share/doc/libxml2-2.9.0/html/html/libxml-DOCBparser.html +51 -0
  65. data/vendor/local/share/doc/libxml2-2.9.0/html/html/libxml-HTMLparser.html +184 -0
  66. data/vendor/local/share/doc/libxml2-2.9.0/html/html/libxml-HTMLtree.html +73 -0
  67. data/vendor/local/share/doc/libxml2-2.9.0/html/html/libxml-SAX.html +125 -0
  68. data/vendor/local/share/doc/libxml2-2.9.0/html/html/libxml-SAX2.html +128 -0
  69. data/vendor/local/share/doc/libxml2-2.9.0/html/html/libxml-c14n.html +38 -0
  70. data/vendor/local/share/doc/libxml2-2.9.0/html/html/libxml-catalog.html +142 -0
  71. data/vendor/local/share/doc/libxml2-2.9.0/html/html/libxml-chvalid.html +72 -0
  72. data/vendor/local/share/doc/libxml2-2.9.0/html/html/libxml-debugXML.html +120 -0
  73. data/vendor/local/share/doc/libxml2-2.9.0/html/html/libxml-dict.html +58 -0
  74. data/vendor/local/share/doc/libxml2-2.9.0/html/html/libxml-encoding.html +124 -0
  75. data/vendor/local/share/doc/libxml2-2.9.0/html/html/libxml-entities.html +79 -0
  76. data/vendor/local/share/doc/libxml2-2.9.0/html/html/libxml-globals.html +152 -0
  77. data/vendor/local/share/doc/libxml2-2.9.0/html/html/libxml-hash.html +116 -0
  78. data/vendor/local/share/doc/libxml2-2.9.0/html/html/libxml-lib.html +13 -0
  79. data/vendor/local/share/doc/libxml2-2.9.0/html/html/libxml-list.html +120 -0
  80. data/vendor/local/share/doc/libxml2-2.9.0/html/html/libxml-nanoftp.html +94 -0
  81. data/vendor/local/share/doc/libxml2-2.9.0/html/html/libxml-nanohttp.html +65 -0
  82. data/vendor/local/share/doc/libxml2-2.9.0/html/html/libxml-parser.html +559 -0
  83. data/vendor/local/share/doc/libxml2-2.9.0/html/html/libxml-parserInternals.html +322 -0
  84. data/vendor/local/share/doc/libxml2-2.9.0/html/html/libxml-pattern.html +76 -0
  85. data/vendor/local/share/doc/libxml2-2.9.0/html/html/libxml-relaxng.html +162 -0
  86. data/vendor/local/share/doc/libxml2-2.9.0/html/html/libxml-schemasInternals.html +373 -0
  87. data/vendor/local/share/doc/libxml2-2.9.0/html/html/libxml-schematron.html +81 -0
  88. data/vendor/local/share/doc/libxml2-2.9.0/html/html/libxml-threads.html +72 -0
  89. data/vendor/local/share/doc/libxml2-2.9.0/html/html/libxml-tree.html +989 -0
  90. data/vendor/local/share/doc/libxml2-2.9.0/html/html/libxml-uri.html +73 -0
  91. data/vendor/local/share/doc/libxml2-2.9.0/html/html/libxml-valid.html +289 -0
  92. data/vendor/local/share/doc/libxml2-2.9.0/html/html/libxml-xinclude.html +59 -0
  93. data/vendor/local/share/doc/libxml2-2.9.0/html/html/libxml-xlink.html +82 -0
  94. data/vendor/local/share/doc/libxml2-2.9.0/html/html/libxml-xmlIO.html +212 -0
  95. data/vendor/local/share/doc/libxml2-2.9.0/html/html/libxml-xmlautomata.html +85 -0
  96. data/vendor/local/share/doc/libxml2-2.9.0/html/html/libxml-xmlerror.html +864 -0
  97. data/vendor/local/share/doc/libxml2-2.9.0/html/html/libxml-xmlexports.html +20 -0
  98. data/vendor/local/share/doc/libxml2-2.9.0/html/html/libxml-xmlmemory.html +107 -0
  99. data/vendor/local/share/doc/libxml2-2.9.0/html/html/libxml-xmlmodule.html +38 -0
  100. data/vendor/local/share/doc/libxml2-2.9.0/html/html/libxml-xmlreader.html +330 -0
  101. data/vendor/local/share/doc/libxml2-2.9.0/html/html/libxml-xmlregexp.html +143 -0
  102. data/vendor/local/share/doc/libxml2-2.9.0/html/html/libxml-xmlsave.html +60 -0
  103. data/vendor/local/share/doc/libxml2-2.9.0/html/html/libxml-xmlschemas.html +185 -0
  104. data/vendor/local/share/doc/libxml2-2.9.0/html/html/libxml-xmlschemastypes.html +123 -0
  105. data/vendor/local/share/doc/libxml2-2.9.0/html/html/libxml-xmlstring.html +108 -0
  106. data/vendor/local/share/doc/libxml2-2.9.0/html/html/libxml-xmlunicode.html +512 -0
  107. data/vendor/local/share/doc/libxml2-2.9.0/html/html/libxml-xmlversion.html +62 -0
  108. data/vendor/local/share/doc/libxml2-2.9.0/html/html/libxml-xmlwriter.html +261 -0
  109. data/vendor/local/share/doc/libxml2-2.9.0/html/html/libxml-xpath.html +310 -0
  110. data/vendor/local/share/doc/libxml2-2.9.0/html/html/libxml-xpathInternals.html +394 -0
  111. data/vendor/local/share/doc/libxml2-2.9.0/html/html/libxml-xpointer.html +83 -0
  112. data/vendor/local/share/doc/libxml2-2.9.0/html/html/right.png +0 -0
  113. data/vendor/local/share/doc/libxml2-2.9.0/html/html/up.png +0 -0
  114. data/vendor/local/share/doc/libxml2-2.9.0/html/index.html +14 -0
  115. data/vendor/local/share/doc/libxml2-2.9.0/html/io1.c +166 -0
  116. data/vendor/local/share/doc/libxml2-2.9.0/html/io1.res +5 -0
  117. data/vendor/local/share/doc/libxml2-2.9.0/html/io2.c +58 -0
  118. data/vendor/local/share/doc/libxml2-2.9.0/html/io2.res +2 -0
  119. data/vendor/local/share/doc/libxml2-2.9.0/html/libxml.gif +0 -0
  120. data/vendor/local/share/doc/libxml2-2.9.0/html/parse1.c +56 -0
  121. data/vendor/local/share/doc/libxml2-2.9.0/html/parse2.c +72 -0
  122. data/vendor/local/share/doc/libxml2-2.9.0/html/parse3.c +60 -0
  123. data/vendor/local/share/doc/libxml2-2.9.0/html/parse4.c +143 -0
  124. data/vendor/local/share/doc/libxml2-2.9.0/html/reader1.c +107 -0
  125. data/vendor/local/share/doc/libxml2-2.9.0/html/reader1.res +14 -0
  126. data/vendor/local/share/doc/libxml2-2.9.0/html/reader2.c +122 -0
  127. data/vendor/local/share/doc/libxml2-2.9.0/html/reader3.c +120 -0
  128. data/vendor/local/share/doc/libxml2-2.9.0/html/reader3.res +13 -0
  129. data/vendor/local/share/doc/libxml2-2.9.0/html/reader4.c +122 -0
  130. data/vendor/local/share/doc/libxml2-2.9.0/html/reader4.res +3 -0
  131. data/vendor/local/share/doc/libxml2-2.9.0/html/redhat.gif +0 -0
  132. data/vendor/local/share/doc/libxml2-2.9.0/html/smallfootonly.gif +0 -0
  133. data/vendor/local/share/doc/libxml2-2.9.0/html/structure.gif +0 -0
  134. data/vendor/local/share/doc/libxml2-2.9.0/html/test1.xml +1 -0
  135. data/vendor/local/share/doc/libxml2-2.9.0/html/test2.xml +13 -0
  136. data/vendor/local/share/doc/libxml2-2.9.0/html/test3.xml +39 -0
  137. data/vendor/local/share/doc/libxml2-2.9.0/html/testWriter.c +1198 -0
  138. data/vendor/local/share/doc/libxml2-2.9.0/html/tree1.c +94 -0
  139. data/vendor/local/share/doc/libxml2-2.9.0/html/tree1.res +4 -0
  140. data/vendor/local/share/doc/libxml2-2.9.0/html/tree2.c +118 -0
  141. data/vendor/local/share/doc/libxml2-2.9.0/html/tree2.res +18 -0
  142. data/vendor/local/share/doc/libxml2-2.9.0/html/tst.xml +7 -0
  143. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/apa.html +8 -0
  144. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/apb.html +14 -0
  145. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/apc.html +82 -0
  146. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/apd.html +76 -0
  147. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/ape.html +78 -0
  148. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/apf.html +67 -0
  149. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/apg.html +75 -0
  150. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/aph.html +76 -0
  151. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/api.html +4 -0
  152. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/ar01s02.html +14 -0
  153. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/ar01s03.html +47 -0
  154. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/ar01s04.html +54 -0
  155. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/ar01s05.html +55 -0
  156. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/ar01s06.html +35 -0
  157. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/ar01s07.html +30 -0
  158. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/ar01s08.html +38 -0
  159. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/ar01s09.html +63 -0
  160. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/images/blank.png +0 -0
  161. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/images/callouts/1.png +0 -0
  162. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/images/callouts/10.png +0 -0
  163. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/images/callouts/2.png +0 -0
  164. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/images/callouts/3.png +0 -0
  165. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/images/callouts/4.png +0 -0
  166. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/images/callouts/5.png +0 -0
  167. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/images/callouts/6.png +0 -0
  168. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/images/callouts/7.png +0 -0
  169. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/images/callouts/8.png +0 -0
  170. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/images/callouts/9.png +0 -0
  171. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/images/caution.png +0 -0
  172. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/images/draft.png +0 -0
  173. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/images/home.png +0 -0
  174. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/images/important.png +0 -0
  175. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/images/next.png +0 -0
  176. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/images/note.png +0 -0
  177. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/images/prev.png +0 -0
  178. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/images/tip.png +0 -0
  179. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/images/toc-blank.png +0 -0
  180. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/images/toc-minus.png +0 -0
  181. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/images/toc-plus.png +0 -0
  182. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/images/up.png +0 -0
  183. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/images/warning.png +0 -0
  184. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/includeaddattribute.c +64 -0
  185. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/includeaddkeyword.c +75 -0
  186. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/includeconvert.c +73 -0
  187. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/includegetattribute.c +72 -0
  188. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/includekeyword.c +79 -0
  189. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/includexpath.c +74 -0
  190. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/index.html +14 -0
  191. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/ix01.html +1 -0
  192. data/vendor/local/share/doc/libxml2-2.9.0/html/tutorial/xmltutorial.pdf +1336 -0
  193. data/vendor/local/share/doc/libxml2-2.9.0/html/w3c.png +0 -0
  194. data/vendor/local/share/doc/libxml2-2.9.0/html/writer.xml +2 -0
  195. data/vendor/local/share/doc/libxml2-2.9.0/html/xml.html +5715 -0
  196. data/vendor/local/share/doc/libxml2-2.9.0/html/xpath1.c +250 -0
  197. data/vendor/local/share/doc/libxml2-2.9.0/html/xpath1.res +5 -0
  198. data/vendor/local/share/doc/libxml2-2.9.0/html/xpath2.c +190 -0
  199. data/vendor/local/share/doc/libxml2-2.9.0/html/xpath2.res +30 -0
  200. data/vendor/local/share/gtk-doc/html/libxml2/general.html +1 -1
  201. data/vendor/local/share/gtk-doc/html/libxml2/libxml2-HTMLparser.html +3 -1
  202. data/vendor/local/share/gtk-doc/html/libxml2/libxml2-dict.html +16 -1
  203. data/vendor/local/share/gtk-doc/html/libxml2/libxml2-encoding.html +11 -1
  204. data/vendor/local/share/gtk-doc/html/libxml2/libxml2-nanoftp.html +15 -5
  205. data/vendor/local/share/gtk-doc/html/libxml2/libxml2-parser.html +8 -4
  206. data/vendor/local/share/gtk-doc/html/libxml2/libxml2-parserInternals.html +20 -5
  207. data/vendor/local/share/gtk-doc/html/libxml2/libxml2-tree.html +72 -18
  208. data/vendor/local/share/gtk-doc/html/libxml2/libxml2-xmlIO.html +10 -0
  209. data/vendor/local/share/gtk-doc/html/libxml2/libxml2-xmlerror.html +5 -3
  210. data/vendor/local/share/gtk-doc/html/libxml2/libxml2-xmlmodule.html +2 -2
  211. data/vendor/local/share/gtk-doc/html/libxml2/libxml2-xmlreader.html +8 -3
  212. data/vendor/local/share/gtk-doc/html/libxml2/libxml2-xmlsave.html +2 -1
  213. data/vendor/local/share/gtk-doc/html/libxml2/libxml2-xmlschemas.html +15 -0
  214. data/vendor/local/share/gtk-doc/html/libxml2/libxml2-xmlversion.html +12 -2
  215. data/vendor/local/share/gtk-doc/html/libxml2/libxml2-xmlwriter.html +8 -3
  216. data/vendor/local/share/gtk-doc/html/libxml2/libxml2-xpath.html +3 -0
  217. data/vendor/local/share/gtk-doc/html/libxml2/libxml2-xpathInternals.html +9 -9
  218. data/vendor/local/share/gtk-doc/html/libxml2/libxml2.devhelp +42 -2
  219. data/vendor/local/share/man/man1/xml2-config.1 +0 -1
  220. data/vendor/local/share/man/man1/xmlcatalog.1 +204 -93
  221. data/vendor/local/share/man/man3/libxml.3 +1 -1
  222. data/vendor/local/src/dieterv/packaging/libxml2_2.9.0-1_win32.log +867 -0
  223. data/vendor/local/src/dieterv/packaging/libxml2_2.9.0-1_win32.sh +68 -0
  224. metadata +163 -7
@@ -0,0 +1,229 @@
1
+ /*
2
+ * testXPath.c : a small tester program for XPath.
3
+ *
4
+ * See Copyright for the status of this software.
5
+ *
6
+ * daniel@veillard.com
7
+ */
8
+
9
+ #include "libxml.h"
10
+ #if defined(LIBXML_XPATH_ENABLED) && defined(LIBXML_DEBUG_ENABLED)
11
+
12
+ #include <string.h>
13
+
14
+ #ifdef HAVE_SYS_TYPES_H
15
+ #include <sys/types.h>
16
+ #endif
17
+ #ifdef HAVE_SYS_STAT_H
18
+ #include <sys/stat.h>
19
+ #endif
20
+ #ifdef HAVE_FCNTL_H
21
+ #include <fcntl.h>
22
+ #endif
23
+ #ifdef HAVE_UNISTD_H
24
+ #include <unistd.h>
25
+ #endif
26
+ #ifdef HAVE_STDLIB_H
27
+ #include <stdlib.h>
28
+ #endif
29
+
30
+
31
+ #include <libxml/xpath.h>
32
+ #include <libxml/tree.h>
33
+ #include <libxml/parser.h>
34
+ #include <libxml/debugXML.h>
35
+ #include <libxml/xmlmemory.h>
36
+ #include <libxml/parserInternals.h>
37
+ #include <libxml/xpathInternals.h>
38
+ #include <libxml/xmlerror.h>
39
+ #include <libxml/globals.h>
40
+ #if defined(LIBXML_XPTR_ENABLED)
41
+ #include <libxml/xpointer.h>
42
+ static int xptr = 0;
43
+ #endif
44
+ static int debug = 0;
45
+ static int valid = 0;
46
+ static int expr = 0;
47
+ static int tree = 0;
48
+ static int nocdata = 0;
49
+ static xmlDocPtr document = NULL;
50
+
51
+ /*
52
+ * Default document
53
+ */
54
+ static xmlChar buffer[] =
55
+ "<?xml version=\"1.0\"?>\n\
56
+ <EXAMPLE prop1=\"gnome is great\" prop2=\"&amp; linux too\">\n\
57
+ <head>\n\
58
+ <title>Welcome to Gnome</title>\n\
59
+ </head>\n\
60
+ <chapter>\n\
61
+ <title>The Linux adventure</title>\n\
62
+ <p>bla bla bla ...</p>\n\
63
+ <image href=\"linus.gif\"/>\n\
64
+ <p>...</p>\n\
65
+ </chapter>\n\
66
+ <chapter>\n\
67
+ <title>Chapter 2</title>\n\
68
+ <p>this is chapter 2 ...</p>\n\
69
+ </chapter>\n\
70
+ <chapter>\n\
71
+ <title>Chapter 3</title>\n\
72
+ <p>this is chapter 3 ...</p>\n\
73
+ </chapter>\n\
74
+ </EXAMPLE>\n\
75
+ ";
76
+
77
+
78
+ static void
79
+ testXPath(const char *str) {
80
+ xmlXPathObjectPtr res;
81
+ xmlXPathContextPtr ctxt;
82
+
83
+ #if defined(LIBXML_XPTR_ENABLED)
84
+ if (xptr) {
85
+ ctxt = xmlXPtrNewContext(document, NULL, NULL);
86
+ res = xmlXPtrEval(BAD_CAST str, ctxt);
87
+ } else {
88
+ #endif
89
+ ctxt = xmlXPathNewContext(document);
90
+ ctxt->node = xmlDocGetRootElement(document);
91
+ if (expr)
92
+ res = xmlXPathEvalExpression(BAD_CAST str, ctxt);
93
+ else {
94
+ /* res = xmlXPathEval(BAD_CAST str, ctxt); */
95
+ xmlXPathCompExprPtr comp;
96
+
97
+ comp = xmlXPathCompile(BAD_CAST str);
98
+ if (comp != NULL) {
99
+ if (tree)
100
+ xmlXPathDebugDumpCompExpr(stdout, comp, 0);
101
+
102
+ res = xmlXPathCompiledEval(comp, ctxt);
103
+ xmlXPathFreeCompExpr(comp);
104
+ } else
105
+ res = NULL;
106
+ }
107
+ #if defined(LIBXML_XPTR_ENABLED)
108
+ }
109
+ #endif
110
+ xmlXPathDebugDumpObject(stdout, res, 0);
111
+ xmlXPathFreeObject(res);
112
+ xmlXPathFreeContext(ctxt);
113
+ }
114
+
115
+ static void
116
+ testXPathFile(const char *filename) {
117
+ FILE *input;
118
+ char expression[5000];
119
+ int len;
120
+
121
+ input = fopen(filename, "r");
122
+ if (input == NULL) {
123
+ xmlGenericError(xmlGenericErrorContext,
124
+ "Cannot open %s for reading\n", filename);
125
+ return;
126
+ }
127
+ while (fgets(expression, 4500, input) != NULL) {
128
+ len = strlen(expression);
129
+ len--;
130
+ while ((len >= 0) &&
131
+ ((expression[len] == '\n') || (expression[len] == '\t') ||
132
+ (expression[len] == '\r') || (expression[len] == ' '))) len--;
133
+ expression[len + 1] = 0;
134
+ if (len >= 0) {
135
+ printf("\n========================\nExpression: %s\n", expression) ;
136
+ testXPath(expression);
137
+ }
138
+ }
139
+
140
+ fclose(input);
141
+ }
142
+
143
+ int main(int argc, char **argv) {
144
+ int i;
145
+ int strings = 0;
146
+ int usefile = 0;
147
+ char *filename = NULL;
148
+
149
+ for (i = 1; i < argc ; i++) {
150
+ #if defined(LIBXML_XPTR_ENABLED)
151
+ if ((!strcmp(argv[i], "-xptr")) || (!strcmp(argv[i], "--xptr")))
152
+ xptr++;
153
+ else
154
+ #endif
155
+ if ((!strcmp(argv[i], "-debug")) || (!strcmp(argv[i], "--debug")))
156
+ debug++;
157
+ else if ((!strcmp(argv[i], "-valid")) || (!strcmp(argv[i], "--valid")))
158
+ valid++;
159
+ else if ((!strcmp(argv[i], "-expr")) || (!strcmp(argv[i], "--expr")))
160
+ expr++;
161
+ else if ((!strcmp(argv[i], "-tree")) || (!strcmp(argv[i], "--tree")))
162
+ tree++;
163
+ else if ((!strcmp(argv[i], "-nocdata")) ||
164
+ (!strcmp(argv[i], "--nocdata")))
165
+ nocdata++;
166
+ else if ((!strcmp(argv[i], "-i")) || (!strcmp(argv[i], "--input")))
167
+ filename = argv[++i];
168
+ else if ((!strcmp(argv[i], "-f")) || (!strcmp(argv[i], "--file")))
169
+ usefile++;
170
+ }
171
+ if (valid != 0) xmlDoValidityCheckingDefaultValue = 1;
172
+ xmlLoadExtDtdDefaultValue |= XML_DETECT_IDS;
173
+ xmlLoadExtDtdDefaultValue |= XML_COMPLETE_ATTRS;
174
+ xmlSubstituteEntitiesDefaultValue = 1;
175
+ #ifdef LIBXML_SAX1_ENABLED
176
+ if (nocdata != 0) {
177
+ xmlDefaultSAXHandlerInit();
178
+ xmlDefaultSAXHandler.cdataBlock = NULL;
179
+ }
180
+ #endif
181
+ if (document == NULL) {
182
+ if (filename == NULL)
183
+ document = xmlReadDoc(buffer,NULL,NULL,XML_PARSE_COMPACT);
184
+ else
185
+ document = xmlReadFile(filename,NULL,XML_PARSE_COMPACT);
186
+ }
187
+ for (i = 1; i < argc ; i++) {
188
+ if ((!strcmp(argv[i], "-i")) || (!strcmp(argv[i], "--input"))) {
189
+ i++; continue;
190
+ }
191
+ if (argv[i][0] != '-') {
192
+ if (usefile)
193
+ testXPathFile(argv[i]);
194
+ else
195
+ testXPath(argv[i]);
196
+ strings ++;
197
+ }
198
+ }
199
+ if (strings == 0) {
200
+ printf("Usage : %s [--debug] [--copy] stringsorfiles ...\n",
201
+ argv[0]);
202
+ printf("\tParse the XPath strings and output the result of the parsing\n");
203
+ printf("\t--debug : dump a debug version of the result\n");
204
+ printf("\t--valid : switch on DTD support in the parser\n");
205
+ #if defined(LIBXML_XPTR_ENABLED)
206
+ printf("\t--xptr : expressions are XPointer expressions\n");
207
+ #endif
208
+ printf("\t--expr : debug XPath expressions only\n");
209
+ printf("\t--tree : show the compiled XPath tree\n");
210
+ printf("\t--nocdata : do not generate CDATA nodes\n");
211
+ printf("\t--input filename : or\n");
212
+ printf("\t-i filename : read the document from filename\n");
213
+ printf("\t--file : or\n");
214
+ printf("\t-f : read queries from files, args\n");
215
+ }
216
+ if (document != NULL)
217
+ xmlFreeDoc(document);
218
+ xmlCleanupParser();
219
+ xmlMemoryDump();
220
+
221
+ return(0);
222
+ }
223
+ #else
224
+ #include <stdio.h>
225
+ int main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) {
226
+ printf("%s : XPath/Debug support not compiled in\n", argv[0]);
227
+ return(0);
228
+ }
229
+ #endif /* LIBXML_XPATH_ENABLED */
@@ -0,0 +1,3770 @@
1
+ /*
2
+ * xmllint.c : a small tester program for XML input.
3
+ *
4
+ * See Copyright for the status of this software.
5
+ *
6
+ * daniel@veillard.com
7
+ */
8
+
9
+ #include "libxml.h"
10
+
11
+ #include <string.h>
12
+ #include <stdarg.h>
13
+ #include <assert.h>
14
+
15
+ #if defined (_WIN32) && !defined(__CYGWIN__)
16
+ #if defined (_MSC_VER) || defined(__BORLANDC__)
17
+ #include <winsock2.h>
18
+ #pragma comment(lib, "ws2_32.lib")
19
+ #define gettimeofday(p1,p2)
20
+ #endif /* _MSC_VER */
21
+ #endif /* _WIN32 */
22
+
23
+ #ifdef HAVE_SYS_TIME_H
24
+ #include <sys/time.h>
25
+ #endif
26
+ #ifdef HAVE_TIME_H
27
+ #include <time.h>
28
+ #endif
29
+
30
+ #ifdef __MINGW32__
31
+ #define _WINSOCKAPI_
32
+ #include <wsockcompat.h>
33
+ #include <winsock2.h>
34
+ #undef XML_SOCKLEN_T
35
+ #define XML_SOCKLEN_T unsigned int
36
+ #endif
37
+
38
+ #ifdef HAVE_SYS_TIMEB_H
39
+ #include <sys/timeb.h>
40
+ #endif
41
+
42
+ #ifdef HAVE_SYS_TYPES_H
43
+ #include <sys/types.h>
44
+ #endif
45
+ #ifdef HAVE_SYS_STAT_H
46
+ #include <sys/stat.h>
47
+ #endif
48
+ #ifdef HAVE_FCNTL_H
49
+ #include <fcntl.h>
50
+ #endif
51
+ #ifdef HAVE_UNISTD_H
52
+ #include <unistd.h>
53
+ #endif
54
+ #ifdef HAVE_SYS_MMAN_H
55
+ #include <sys/mman.h>
56
+ /* seems needed for Solaris */
57
+ #ifndef MAP_FAILED
58
+ #define MAP_FAILED ((void *) -1)
59
+ #endif
60
+ #endif
61
+ #ifdef HAVE_STDLIB_H
62
+ #include <stdlib.h>
63
+ #endif
64
+ #ifdef HAVE_LIBREADLINE
65
+ #include <readline/readline.h>
66
+ #ifdef HAVE_LIBHISTORY
67
+ #include <readline/history.h>
68
+ #endif
69
+ #endif
70
+
71
+ #include <libxml/xmlmemory.h>
72
+ #include <libxml/parser.h>
73
+ #include <libxml/parserInternals.h>
74
+ #include <libxml/HTMLparser.h>
75
+ #include <libxml/HTMLtree.h>
76
+ #include <libxml/tree.h>
77
+ #include <libxml/xpath.h>
78
+ #include <libxml/debugXML.h>
79
+ #include <libxml/xmlerror.h>
80
+ #ifdef LIBXML_XINCLUDE_ENABLED
81
+ #include <libxml/xinclude.h>
82
+ #endif
83
+ #ifdef LIBXML_CATALOG_ENABLED
84
+ #include <libxml/catalog.h>
85
+ #endif
86
+ #include <libxml/globals.h>
87
+ #include <libxml/xmlreader.h>
88
+ #ifdef LIBXML_SCHEMATRON_ENABLED
89
+ #include <libxml/schematron.h>
90
+ #endif
91
+ #ifdef LIBXML_SCHEMAS_ENABLED
92
+ #include <libxml/relaxng.h>
93
+ #include <libxml/xmlschemas.h>
94
+ #endif
95
+ #ifdef LIBXML_PATTERN_ENABLED
96
+ #include <libxml/pattern.h>
97
+ #endif
98
+ #ifdef LIBXML_C14N_ENABLED
99
+ #include <libxml/c14n.h>
100
+ #endif
101
+ #ifdef LIBXML_OUTPUT_ENABLED
102
+ #include <libxml/xmlsave.h>
103
+ #endif
104
+
105
+ #ifndef XML_XML_DEFAULT_CATALOG
106
+ #define XML_XML_DEFAULT_CATALOG "file:///etc/xml/catalog"
107
+ #endif
108
+
109
+ typedef enum {
110
+ XMLLINT_RETURN_OK = 0, /* No error */
111
+ XMLLINT_ERR_UNCLASS = 1, /* Unclassified */
112
+ XMLLINT_ERR_DTD = 2, /* Error in DTD */
113
+ XMLLINT_ERR_VALID = 3, /* Validation error */
114
+ XMLLINT_ERR_RDFILE = 4, /* CtxtReadFile error */
115
+ XMLLINT_ERR_SCHEMACOMP = 5, /* Schema compilation */
116
+ XMLLINT_ERR_OUT = 6, /* Error writing output */
117
+ XMLLINT_ERR_SCHEMAPAT = 7, /* Error in schema pattern */
118
+ XMLLINT_ERR_RDREGIS = 8, /* Error in Reader registration */
119
+ XMLLINT_ERR_MEM = 9, /* Out of memory error */
120
+ XMLLINT_ERR_XPATH = 10 /* XPath evaluation error */
121
+ } xmllintReturnCode;
122
+ #ifdef LIBXML_DEBUG_ENABLED
123
+ static int shell = 0;
124
+ static int debugent = 0;
125
+ #endif
126
+ static int debug = 0;
127
+ static int maxmem = 0;
128
+ #ifdef LIBXML_TREE_ENABLED
129
+ static int copy = 0;
130
+ #endif /* LIBXML_TREE_ENABLED */
131
+ static int recovery = 0;
132
+ static int noent = 0;
133
+ static int noenc = 0;
134
+ static int noblanks = 0;
135
+ static int noout = 0;
136
+ static int nowrap = 0;
137
+ #ifdef LIBXML_OUTPUT_ENABLED
138
+ static int format = 0;
139
+ static const char *output = NULL;
140
+ static int compress = 0;
141
+ static int oldout = 0;
142
+ #endif /* LIBXML_OUTPUT_ENABLED */
143
+ #ifdef LIBXML_VALID_ENABLED
144
+ static int valid = 0;
145
+ static int postvalid = 0;
146
+ static char * dtdvalid = NULL;
147
+ static char * dtdvalidfpi = NULL;
148
+ #endif
149
+ #ifdef LIBXML_SCHEMAS_ENABLED
150
+ static char * relaxng = NULL;
151
+ static xmlRelaxNGPtr relaxngschemas = NULL;
152
+ static char * schema = NULL;
153
+ static xmlSchemaPtr wxschemas = NULL;
154
+ #endif
155
+ #ifdef LIBXML_SCHEMATRON_ENABLED
156
+ static char * schematron = NULL;
157
+ static xmlSchematronPtr wxschematron = NULL;
158
+ #endif
159
+ static int repeat = 0;
160
+ static int insert = 0;
161
+ #if defined(LIBXML_HTML_ENABLED) || defined(LIBXML_VALID_ENABLED)
162
+ static int html = 0;
163
+ static int xmlout = 0;
164
+ #endif
165
+ static int htmlout = 0;
166
+ #if defined(LIBXML_HTML_ENABLED)
167
+ static int nodefdtd = 0;
168
+ #endif
169
+ #ifdef LIBXML_PUSH_ENABLED
170
+ static int push = 0;
171
+ #endif /* LIBXML_PUSH_ENABLED */
172
+ #ifdef HAVE_MMAP
173
+ static int memory = 0;
174
+ #endif
175
+ static int testIO = 0;
176
+ static char *encoding = NULL;
177
+ #ifdef LIBXML_XINCLUDE_ENABLED
178
+ static int xinclude = 0;
179
+ #endif
180
+ static int dtdattrs = 0;
181
+ static int loaddtd = 0;
182
+ static xmllintReturnCode progresult = XMLLINT_RETURN_OK;
183
+ static int timing = 0;
184
+ static int generate = 0;
185
+ static int dropdtd = 0;
186
+ #ifdef LIBXML_CATALOG_ENABLED
187
+ static int catalogs = 0;
188
+ static int nocatalogs = 0;
189
+ #endif
190
+ #ifdef LIBXML_C14N_ENABLED
191
+ static int canonical = 0;
192
+ static int canonical_11 = 0;
193
+ static int exc_canonical = 0;
194
+ #endif
195
+ #ifdef LIBXML_READER_ENABLED
196
+ static int stream = 0;
197
+ static int walker = 0;
198
+ #endif /* LIBXML_READER_ENABLED */
199
+ static int chkregister = 0;
200
+ static int nbregister = 0;
201
+ #ifdef LIBXML_SAX1_ENABLED
202
+ static int sax1 = 0;
203
+ #endif /* LIBXML_SAX1_ENABLED */
204
+ #ifdef LIBXML_PATTERN_ENABLED
205
+ static const char *pattern = NULL;
206
+ static xmlPatternPtr patternc = NULL;
207
+ static xmlStreamCtxtPtr patstream = NULL;
208
+ #endif
209
+ #ifdef LIBXML_XPATH_ENABLED
210
+ static const char *xpathquery = NULL;
211
+ #endif
212
+ static int options = XML_PARSE_COMPACT | XML_PARSE_BIG_LINES;
213
+ static int sax = 0;
214
+ static int oldxml10 = 0;
215
+
216
+ /************************************************************************
217
+ * *
218
+ * Entity loading control and customization. *
219
+ * *
220
+ ************************************************************************/
221
+ #define MAX_PATHS 64
222
+ #ifdef _WIN32
223
+ # define PATH_SEPARATOR ';'
224
+ #else
225
+ # define PATH_SEPARATOR ':'
226
+ #endif
227
+ static xmlChar *paths[MAX_PATHS + 1];
228
+ static int nbpaths = 0;
229
+ static int load_trace = 0;
230
+
231
+ static
232
+ void parsePath(const xmlChar *path) {
233
+ const xmlChar *cur;
234
+
235
+ if (path == NULL)
236
+ return;
237
+ while (*path != 0) {
238
+ if (nbpaths >= MAX_PATHS) {
239
+ fprintf(stderr, "MAX_PATHS reached: too many paths\n");
240
+ return;
241
+ }
242
+ cur = path;
243
+ while ((*cur == ' ') || (*cur == PATH_SEPARATOR))
244
+ cur++;
245
+ path = cur;
246
+ while ((*cur != 0) && (*cur != ' ') && (*cur != PATH_SEPARATOR))
247
+ cur++;
248
+ if (cur != path) {
249
+ paths[nbpaths] = xmlStrndup(path, cur - path);
250
+ if (paths[nbpaths] != NULL)
251
+ nbpaths++;
252
+ path = cur;
253
+ }
254
+ }
255
+ }
256
+
257
+ static xmlExternalEntityLoader defaultEntityLoader = NULL;
258
+
259
+ static xmlParserInputPtr
260
+ xmllintExternalEntityLoader(const char *URL, const char *ID,
261
+ xmlParserCtxtPtr ctxt) {
262
+ xmlParserInputPtr ret;
263
+ warningSAXFunc warning = NULL;
264
+ errorSAXFunc err = NULL;
265
+
266
+ int i;
267
+ const char *lastsegment = URL;
268
+ const char *iter = URL;
269
+
270
+ if ((nbpaths > 0) && (iter != NULL)) {
271
+ while (*iter != 0) {
272
+ if (*iter == '/')
273
+ lastsegment = iter + 1;
274
+ iter++;
275
+ }
276
+ }
277
+
278
+ if ((ctxt != NULL) && (ctxt->sax != NULL)) {
279
+ warning = ctxt->sax->warning;
280
+ err = ctxt->sax->error;
281
+ ctxt->sax->warning = NULL;
282
+ ctxt->sax->error = NULL;
283
+ }
284
+
285
+ if (defaultEntityLoader != NULL) {
286
+ ret = defaultEntityLoader(URL, ID, ctxt);
287
+ if (ret != NULL) {
288
+ if (warning != NULL)
289
+ ctxt->sax->warning = warning;
290
+ if (err != NULL)
291
+ ctxt->sax->error = err;
292
+ if (load_trace) {
293
+ fprintf \
294
+ (stderr,
295
+ "Loaded URL=\"%s\" ID=\"%s\"\n",
296
+ URL ? URL : "(null)",
297
+ ID ? ID : "(null)");
298
+ }
299
+ return(ret);
300
+ }
301
+ }
302
+ for (i = 0;i < nbpaths;i++) {
303
+ xmlChar *newURL;
304
+
305
+ newURL = xmlStrdup((const xmlChar *) paths[i]);
306
+ newURL = xmlStrcat(newURL, (const xmlChar *) "/");
307
+ newURL = xmlStrcat(newURL, (const xmlChar *) lastsegment);
308
+ if (newURL != NULL) {
309
+ ret = defaultEntityLoader((const char *)newURL, ID, ctxt);
310
+ if (ret != NULL) {
311
+ if (warning != NULL)
312
+ ctxt->sax->warning = warning;
313
+ if (err != NULL)
314
+ ctxt->sax->error = err;
315
+ if (load_trace) {
316
+ fprintf \
317
+ (stderr,
318
+ "Loaded URL=\"%s\" ID=\"%s\"\n",
319
+ newURL,
320
+ ID ? ID : "(null)");
321
+ }
322
+ xmlFree(newURL);
323
+ return(ret);
324
+ }
325
+ xmlFree(newURL);
326
+ }
327
+ }
328
+ if (err != NULL)
329
+ ctxt->sax->error = err;
330
+ if (warning != NULL) {
331
+ ctxt->sax->warning = warning;
332
+ if (URL != NULL)
333
+ warning(ctxt, "failed to load external entity \"%s\"\n", URL);
334
+ else if (ID != NULL)
335
+ warning(ctxt, "failed to load external entity \"%s\"\n", ID);
336
+ }
337
+ return(NULL);
338
+ }
339
+ /************************************************************************
340
+ * *
341
+ * Memory allocation consumption debugging *
342
+ * *
343
+ ************************************************************************/
344
+
345
+ static void
346
+ OOM(void)
347
+ {
348
+ fprintf(stderr, "Ran out of memory needs > %d bytes\n", maxmem);
349
+ progresult = XMLLINT_ERR_MEM;
350
+ }
351
+
352
+ static void
353
+ myFreeFunc(void *mem)
354
+ {
355
+ xmlMemFree(mem);
356
+ }
357
+ static void *
358
+ myMallocFunc(size_t size)
359
+ {
360
+ void *ret;
361
+
362
+ ret = xmlMemMalloc(size);
363
+ if (ret != NULL) {
364
+ if (xmlMemUsed() > maxmem) {
365
+ OOM();
366
+ xmlMemFree(ret);
367
+ return (NULL);
368
+ }
369
+ }
370
+ return (ret);
371
+ }
372
+ static void *
373
+ myReallocFunc(void *mem, size_t size)
374
+ {
375
+ void *ret;
376
+
377
+ ret = xmlMemRealloc(mem, size);
378
+ if (ret != NULL) {
379
+ if (xmlMemUsed() > maxmem) {
380
+ OOM();
381
+ xmlMemFree(ret);
382
+ return (NULL);
383
+ }
384
+ }
385
+ return (ret);
386
+ }
387
+ static char *
388
+ myStrdupFunc(const char *str)
389
+ {
390
+ char *ret;
391
+
392
+ ret = xmlMemoryStrdup(str);
393
+ if (ret != NULL) {
394
+ if (xmlMemUsed() > maxmem) {
395
+ OOM();
396
+ xmlFree(ret);
397
+ return (NULL);
398
+ }
399
+ }
400
+ return (ret);
401
+ }
402
+ /************************************************************************
403
+ * *
404
+ * Internal timing routines to remove the necessity to have *
405
+ * unix-specific function calls. *
406
+ * *
407
+ ************************************************************************/
408
+
409
+ #ifndef HAVE_GETTIMEOFDAY
410
+ #ifdef HAVE_SYS_TIMEB_H
411
+ #ifdef HAVE_SYS_TIME_H
412
+ #ifdef HAVE_FTIME
413
+
414
+ static int
415
+ my_gettimeofday(struct timeval *tvp, void *tzp)
416
+ {
417
+ struct timeb timebuffer;
418
+
419
+ ftime(&timebuffer);
420
+ if (tvp) {
421
+ tvp->tv_sec = timebuffer.time;
422
+ tvp->tv_usec = timebuffer.millitm * 1000L;
423
+ }
424
+ return (0);
425
+ }
426
+ #define HAVE_GETTIMEOFDAY 1
427
+ #define gettimeofday my_gettimeofday
428
+
429
+ #endif /* HAVE_FTIME */
430
+ #endif /* HAVE_SYS_TIME_H */
431
+ #endif /* HAVE_SYS_TIMEB_H */
432
+ #endif /* !HAVE_GETTIMEOFDAY */
433
+
434
+ #if defined(HAVE_GETTIMEOFDAY)
435
+ static struct timeval begin, end;
436
+
437
+ /*
438
+ * startTimer: call where you want to start timing
439
+ */
440
+ static void
441
+ startTimer(void)
442
+ {
443
+ gettimeofday(&begin, NULL);
444
+ }
445
+
446
+ /*
447
+ * endTimer: call where you want to stop timing and to print out a
448
+ * message about the timing performed; format is a printf
449
+ * type argument
450
+ */
451
+ static void XMLCDECL
452
+ endTimer(const char *fmt, ...)
453
+ {
454
+ long msec;
455
+ va_list ap;
456
+
457
+ gettimeofday(&end, NULL);
458
+ msec = end.tv_sec - begin.tv_sec;
459
+ msec *= 1000;
460
+ msec += (end.tv_usec - begin.tv_usec) / 1000;
461
+
462
+ #ifndef HAVE_STDARG_H
463
+ #error "endTimer required stdarg functions"
464
+ #endif
465
+ va_start(ap, fmt);
466
+ vfprintf(stderr, fmt, ap);
467
+ va_end(ap);
468
+
469
+ fprintf(stderr, " took %ld ms\n", msec);
470
+ }
471
+ #elif defined(HAVE_TIME_H)
472
+ /*
473
+ * No gettimeofday function, so we have to make do with calling clock.
474
+ * This is obviously less accurate, but there's little we can do about
475
+ * that.
476
+ */
477
+ #ifndef CLOCKS_PER_SEC
478
+ #define CLOCKS_PER_SEC 100
479
+ #endif
480
+
481
+ static clock_t begin, end;
482
+ static void
483
+ startTimer(void)
484
+ {
485
+ begin = clock();
486
+ }
487
+ static void XMLCDECL
488
+ endTimer(const char *fmt, ...)
489
+ {
490
+ long msec;
491
+ va_list ap;
492
+
493
+ end = clock();
494
+ msec = ((end - begin) * 1000) / CLOCKS_PER_SEC;
495
+
496
+ #ifndef HAVE_STDARG_H
497
+ #error "endTimer required stdarg functions"
498
+ #endif
499
+ va_start(ap, fmt);
500
+ vfprintf(stderr, fmt, ap);
501
+ va_end(ap);
502
+ fprintf(stderr, " took %ld ms\n", msec);
503
+ }
504
+ #else
505
+
506
+ /*
507
+ * We don't have a gettimeofday or time.h, so we just don't do timing
508
+ */
509
+ static void
510
+ startTimer(void)
511
+ {
512
+ /*
513
+ * Do nothing
514
+ */
515
+ }
516
+ static void XMLCDECL
517
+ endTimer(char *format, ...)
518
+ {
519
+ /*
520
+ * We cannot do anything because we don't have a timing function
521
+ */
522
+ #ifdef HAVE_STDARG_H
523
+ va_list ap;
524
+ va_start(ap, format);
525
+ vfprintf(stderr, format, ap);
526
+ va_end(ap);
527
+ fprintf(stderr, " was not timed\n");
528
+ #else
529
+ /* We don't have gettimeofday, time or stdarg.h, what crazy world is
530
+ * this ?!
531
+ */
532
+ #endif
533
+ }
534
+ #endif
535
+ /************************************************************************
536
+ * *
537
+ * HTML ouput *
538
+ * *
539
+ ************************************************************************/
540
+ static char buffer[50000];
541
+
542
+ static void
543
+ xmlHTMLEncodeSend(void) {
544
+ char *result;
545
+
546
+ result = (char *) xmlEncodeEntitiesReentrant(NULL, BAD_CAST buffer);
547
+ if (result) {
548
+ xmlGenericError(xmlGenericErrorContext, "%s", result);
549
+ xmlFree(result);
550
+ }
551
+ buffer[0] = 0;
552
+ }
553
+
554
+ /**
555
+ * xmlHTMLPrintFileInfo:
556
+ * @input: an xmlParserInputPtr input
557
+ *
558
+ * Displays the associated file and line informations for the current input
559
+ */
560
+
561
+ static void
562
+ xmlHTMLPrintFileInfo(xmlParserInputPtr input) {
563
+ int len;
564
+ xmlGenericError(xmlGenericErrorContext, "<p>");
565
+
566
+ len = strlen(buffer);
567
+ if (input != NULL) {
568
+ if (input->filename) {
569
+ snprintf(&buffer[len], sizeof(buffer) - len, "%s:%d: ", input->filename,
570
+ input->line);
571
+ } else {
572
+ snprintf(&buffer[len], sizeof(buffer) - len, "Entity: line %d: ", input->line);
573
+ }
574
+ }
575
+ xmlHTMLEncodeSend();
576
+ }
577
+
578
+ /**
579
+ * xmlHTMLPrintFileContext:
580
+ * @input: an xmlParserInputPtr input
581
+ *
582
+ * Displays current context within the input content for error tracking
583
+ */
584
+
585
+ static void
586
+ xmlHTMLPrintFileContext(xmlParserInputPtr input) {
587
+ const xmlChar *cur, *base;
588
+ int len;
589
+ int n;
590
+
591
+ if (input == NULL) return;
592
+ xmlGenericError(xmlGenericErrorContext, "<pre>\n");
593
+ cur = input->cur;
594
+ base = input->base;
595
+ while ((cur > base) && ((*cur == '\n') || (*cur == '\r'))) {
596
+ cur--;
597
+ }
598
+ n = 0;
599
+ while ((n++ < 80) && (cur > base) && (*cur != '\n') && (*cur != '\r'))
600
+ cur--;
601
+ if ((*cur == '\n') || (*cur == '\r')) cur++;
602
+ base = cur;
603
+ n = 0;
604
+ while ((*cur != 0) && (*cur != '\n') && (*cur != '\r') && (n < 79)) {
605
+ len = strlen(buffer);
606
+ snprintf(&buffer[len], sizeof(buffer) - len, "%c",
607
+ (unsigned char) *cur++);
608
+ n++;
609
+ }
610
+ len = strlen(buffer);
611
+ snprintf(&buffer[len], sizeof(buffer) - len, "\n");
612
+ cur = input->cur;
613
+ while ((*cur == '\n') || (*cur == '\r'))
614
+ cur--;
615
+ n = 0;
616
+ while ((cur != base) && (n++ < 80)) {
617
+ len = strlen(buffer);
618
+ snprintf(&buffer[len], sizeof(buffer) - len, " ");
619
+ base++;
620
+ }
621
+ len = strlen(buffer);
622
+ snprintf(&buffer[len], sizeof(buffer) - len, "^\n");
623
+ xmlHTMLEncodeSend();
624
+ xmlGenericError(xmlGenericErrorContext, "</pre>");
625
+ }
626
+
627
+ /**
628
+ * xmlHTMLError:
629
+ * @ctx: an XML parser context
630
+ * @msg: the message to display/transmit
631
+ * @...: extra parameters for the message display
632
+ *
633
+ * Display and format an error messages, gives file, line, position and
634
+ * extra parameters.
635
+ */
636
+ static void XMLCDECL
637
+ xmlHTMLError(void *ctx, const char *msg, ...)
638
+ {
639
+ xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
640
+ xmlParserInputPtr input;
641
+ va_list args;
642
+ int len;
643
+
644
+ buffer[0] = 0;
645
+ input = ctxt->input;
646
+ if ((input != NULL) && (input->filename == NULL) && (ctxt->inputNr > 1)) {
647
+ input = ctxt->inputTab[ctxt->inputNr - 2];
648
+ }
649
+
650
+ xmlHTMLPrintFileInfo(input);
651
+
652
+ xmlGenericError(xmlGenericErrorContext, "<b>error</b>: ");
653
+ va_start(args, msg);
654
+ len = strlen(buffer);
655
+ vsnprintf(&buffer[len], sizeof(buffer) - len, msg, args);
656
+ va_end(args);
657
+ xmlHTMLEncodeSend();
658
+ xmlGenericError(xmlGenericErrorContext, "</p>\n");
659
+
660
+ xmlHTMLPrintFileContext(input);
661
+ xmlHTMLEncodeSend();
662
+ }
663
+
664
+ /**
665
+ * xmlHTMLWarning:
666
+ * @ctx: an XML parser context
667
+ * @msg: the message to display/transmit
668
+ * @...: extra parameters for the message display
669
+ *
670
+ * Display and format a warning messages, gives file, line, position and
671
+ * extra parameters.
672
+ */
673
+ static void XMLCDECL
674
+ xmlHTMLWarning(void *ctx, const char *msg, ...)
675
+ {
676
+ xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
677
+ xmlParserInputPtr input;
678
+ va_list args;
679
+ int len;
680
+
681
+ buffer[0] = 0;
682
+ input = ctxt->input;
683
+ if ((input != NULL) && (input->filename == NULL) && (ctxt->inputNr > 1)) {
684
+ input = ctxt->inputTab[ctxt->inputNr - 2];
685
+ }
686
+
687
+
688
+ xmlHTMLPrintFileInfo(input);
689
+
690
+ xmlGenericError(xmlGenericErrorContext, "<b>warning</b>: ");
691
+ va_start(args, msg);
692
+ len = strlen(buffer);
693
+ vsnprintf(&buffer[len], sizeof(buffer) - len, msg, args);
694
+ va_end(args);
695
+ xmlHTMLEncodeSend();
696
+ xmlGenericError(xmlGenericErrorContext, "</p>\n");
697
+
698
+ xmlHTMLPrintFileContext(input);
699
+ xmlHTMLEncodeSend();
700
+ }
701
+
702
+ /**
703
+ * xmlHTMLValidityError:
704
+ * @ctx: an XML parser context
705
+ * @msg: the message to display/transmit
706
+ * @...: extra parameters for the message display
707
+ *
708
+ * Display and format an validity error messages, gives file,
709
+ * line, position and extra parameters.
710
+ */
711
+ static void XMLCDECL
712
+ xmlHTMLValidityError(void *ctx, const char *msg, ...)
713
+ {
714
+ xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
715
+ xmlParserInputPtr input;
716
+ va_list args;
717
+ int len;
718
+
719
+ buffer[0] = 0;
720
+ input = ctxt->input;
721
+ if ((input->filename == NULL) && (ctxt->inputNr > 1))
722
+ input = ctxt->inputTab[ctxt->inputNr - 2];
723
+
724
+ xmlHTMLPrintFileInfo(input);
725
+
726
+ xmlGenericError(xmlGenericErrorContext, "<b>validity error</b>: ");
727
+ len = strlen(buffer);
728
+ va_start(args, msg);
729
+ vsnprintf(&buffer[len], sizeof(buffer) - len, msg, args);
730
+ va_end(args);
731
+ xmlHTMLEncodeSend();
732
+ xmlGenericError(xmlGenericErrorContext, "</p>\n");
733
+
734
+ xmlHTMLPrintFileContext(input);
735
+ xmlHTMLEncodeSend();
736
+ progresult = XMLLINT_ERR_VALID;
737
+ }
738
+
739
+ /**
740
+ * xmlHTMLValidityWarning:
741
+ * @ctx: an XML parser context
742
+ * @msg: the message to display/transmit
743
+ * @...: extra parameters for the message display
744
+ *
745
+ * Display and format a validity warning messages, gives file, line,
746
+ * position and extra parameters.
747
+ */
748
+ static void XMLCDECL
749
+ xmlHTMLValidityWarning(void *ctx, const char *msg, ...)
750
+ {
751
+ xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
752
+ xmlParserInputPtr input;
753
+ va_list args;
754
+ int len;
755
+
756
+ buffer[0] = 0;
757
+ input = ctxt->input;
758
+ if ((input->filename == NULL) && (ctxt->inputNr > 1))
759
+ input = ctxt->inputTab[ctxt->inputNr - 2];
760
+
761
+ xmlHTMLPrintFileInfo(input);
762
+
763
+ xmlGenericError(xmlGenericErrorContext, "<b>validity warning</b>: ");
764
+ va_start(args, msg);
765
+ len = strlen(buffer);
766
+ vsnprintf(&buffer[len], sizeof(buffer) - len, msg, args);
767
+ va_end(args);
768
+ xmlHTMLEncodeSend();
769
+ xmlGenericError(xmlGenericErrorContext, "</p>\n");
770
+
771
+ xmlHTMLPrintFileContext(input);
772
+ xmlHTMLEncodeSend();
773
+ }
774
+
775
+ /************************************************************************
776
+ * *
777
+ * Shell Interface *
778
+ * *
779
+ ************************************************************************/
780
+ #ifdef LIBXML_DEBUG_ENABLED
781
+ #ifdef LIBXML_XPATH_ENABLED
782
+ /**
783
+ * xmlShellReadline:
784
+ * @prompt: the prompt value
785
+ *
786
+ * Read a string
787
+ *
788
+ * Returns a pointer to it or NULL on EOF the caller is expected to
789
+ * free the returned string.
790
+ */
791
+ static char *
792
+ xmlShellReadline(char *prompt) {
793
+ #ifdef HAVE_LIBREADLINE
794
+ char *line_read;
795
+
796
+ /* Get a line from the user. */
797
+ line_read = readline (prompt);
798
+
799
+ /* If the line has any text in it, save it on the history. */
800
+ if (line_read && *line_read)
801
+ add_history (line_read);
802
+
803
+ return (line_read);
804
+ #else
805
+ char line_read[501];
806
+ char *ret;
807
+ int len;
808
+
809
+ if (prompt != NULL)
810
+ fprintf(stdout, "%s", prompt);
811
+ if (!fgets(line_read, 500, stdin))
812
+ return(NULL);
813
+ line_read[500] = 0;
814
+ len = strlen(line_read);
815
+ ret = (char *) malloc(len + 1);
816
+ if (ret != NULL) {
817
+ memcpy (ret, line_read, len + 1);
818
+ }
819
+ return(ret);
820
+ #endif
821
+ }
822
+ #endif /* LIBXML_XPATH_ENABLED */
823
+ #endif /* LIBXML_DEBUG_ENABLED */
824
+
825
+ /************************************************************************
826
+ * *
827
+ * I/O Interfaces *
828
+ * *
829
+ ************************************************************************/
830
+
831
+ static int myRead(FILE *f, char * buf, int len) {
832
+ return(fread(buf, 1, len, f));
833
+ }
834
+ static void myClose(FILE *f) {
835
+ if (f != stdin) {
836
+ fclose(f);
837
+ }
838
+ }
839
+
840
+ /************************************************************************
841
+ * *
842
+ * SAX based tests *
843
+ * *
844
+ ************************************************************************/
845
+
846
+ /*
847
+ * empty SAX block
848
+ */
849
+ static xmlSAXHandler emptySAXHandlerStruct = {
850
+ NULL, /* internalSubset */
851
+ NULL, /* isStandalone */
852
+ NULL, /* hasInternalSubset */
853
+ NULL, /* hasExternalSubset */
854
+ NULL, /* resolveEntity */
855
+ NULL, /* getEntity */
856
+ NULL, /* entityDecl */
857
+ NULL, /* notationDecl */
858
+ NULL, /* attributeDecl */
859
+ NULL, /* elementDecl */
860
+ NULL, /* unparsedEntityDecl */
861
+ NULL, /* setDocumentLocator */
862
+ NULL, /* startDocument */
863
+ NULL, /* endDocument */
864
+ NULL, /* startElement */
865
+ NULL, /* endElement */
866
+ NULL, /* reference */
867
+ NULL, /* characters */
868
+ NULL, /* ignorableWhitespace */
869
+ NULL, /* processingInstruction */
870
+ NULL, /* comment */
871
+ NULL, /* xmlParserWarning */
872
+ NULL, /* xmlParserError */
873
+ NULL, /* xmlParserError */
874
+ NULL, /* getParameterEntity */
875
+ NULL, /* cdataBlock; */
876
+ NULL, /* externalSubset; */
877
+ XML_SAX2_MAGIC,
878
+ NULL,
879
+ NULL, /* startElementNs */
880
+ NULL, /* endElementNs */
881
+ NULL /* xmlStructuredErrorFunc */
882
+ };
883
+
884
+ static xmlSAXHandlerPtr emptySAXHandler = &emptySAXHandlerStruct;
885
+ extern xmlSAXHandlerPtr debugSAXHandler;
886
+ static int callbacks;
887
+
888
+ /**
889
+ * isStandaloneDebug:
890
+ * @ctxt: An XML parser context
891
+ *
892
+ * Is this document tagged standalone ?
893
+ *
894
+ * Returns 1 if true
895
+ */
896
+ static int
897
+ isStandaloneDebug(void *ctx ATTRIBUTE_UNUSED)
898
+ {
899
+ callbacks++;
900
+ if (noout)
901
+ return(0);
902
+ fprintf(stdout, "SAX.isStandalone()\n");
903
+ return(0);
904
+ }
905
+
906
+ /**
907
+ * hasInternalSubsetDebug:
908
+ * @ctxt: An XML parser context
909
+ *
910
+ * Does this document has an internal subset
911
+ *
912
+ * Returns 1 if true
913
+ */
914
+ static int
915
+ hasInternalSubsetDebug(void *ctx ATTRIBUTE_UNUSED)
916
+ {
917
+ callbacks++;
918
+ if (noout)
919
+ return(0);
920
+ fprintf(stdout, "SAX.hasInternalSubset()\n");
921
+ return(0);
922
+ }
923
+
924
+ /**
925
+ * hasExternalSubsetDebug:
926
+ * @ctxt: An XML parser context
927
+ *
928
+ * Does this document has an external subset
929
+ *
930
+ * Returns 1 if true
931
+ */
932
+ static int
933
+ hasExternalSubsetDebug(void *ctx ATTRIBUTE_UNUSED)
934
+ {
935
+ callbacks++;
936
+ if (noout)
937
+ return(0);
938
+ fprintf(stdout, "SAX.hasExternalSubset()\n");
939
+ return(0);
940
+ }
941
+
942
+ /**
943
+ * internalSubsetDebug:
944
+ * @ctxt: An XML parser context
945
+ *
946
+ * Does this document has an internal subset
947
+ */
948
+ static void
949
+ internalSubsetDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name,
950
+ const xmlChar *ExternalID, const xmlChar *SystemID)
951
+ {
952
+ callbacks++;
953
+ if (noout)
954
+ return;
955
+ fprintf(stdout, "SAX.internalSubset(%s,", name);
956
+ if (ExternalID == NULL)
957
+ fprintf(stdout, " ,");
958
+ else
959
+ fprintf(stdout, " %s,", ExternalID);
960
+ if (SystemID == NULL)
961
+ fprintf(stdout, " )\n");
962
+ else
963
+ fprintf(stdout, " %s)\n", SystemID);
964
+ }
965
+
966
+ /**
967
+ * externalSubsetDebug:
968
+ * @ctxt: An XML parser context
969
+ *
970
+ * Does this document has an external subset
971
+ */
972
+ static void
973
+ externalSubsetDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name,
974
+ const xmlChar *ExternalID, const xmlChar *SystemID)
975
+ {
976
+ callbacks++;
977
+ if (noout)
978
+ return;
979
+ fprintf(stdout, "SAX.externalSubset(%s,", name);
980
+ if (ExternalID == NULL)
981
+ fprintf(stdout, " ,");
982
+ else
983
+ fprintf(stdout, " %s,", ExternalID);
984
+ if (SystemID == NULL)
985
+ fprintf(stdout, " )\n");
986
+ else
987
+ fprintf(stdout, " %s)\n", SystemID);
988
+ }
989
+
990
+ /**
991
+ * resolveEntityDebug:
992
+ * @ctxt: An XML parser context
993
+ * @publicId: The public ID of the entity
994
+ * @systemId: The system ID of the entity
995
+ *
996
+ * Special entity resolver, better left to the parser, it has
997
+ * more context than the application layer.
998
+ * The default behaviour is to NOT resolve the entities, in that case
999
+ * the ENTITY_REF nodes are built in the structure (and the parameter
1000
+ * values).
1001
+ *
1002
+ * Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour.
1003
+ */
1004
+ static xmlParserInputPtr
1005
+ resolveEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *publicId, const xmlChar *systemId)
1006
+ {
1007
+ callbacks++;
1008
+ if (noout)
1009
+ return(NULL);
1010
+ /* xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; */
1011
+
1012
+
1013
+ fprintf(stdout, "SAX.resolveEntity(");
1014
+ if (publicId != NULL)
1015
+ fprintf(stdout, "%s", (char *)publicId);
1016
+ else
1017
+ fprintf(stdout, " ");
1018
+ if (systemId != NULL)
1019
+ fprintf(stdout, ", %s)\n", (char *)systemId);
1020
+ else
1021
+ fprintf(stdout, ", )\n");
1022
+ return(NULL);
1023
+ }
1024
+
1025
+ /**
1026
+ * getEntityDebug:
1027
+ * @ctxt: An XML parser context
1028
+ * @name: The entity name
1029
+ *
1030
+ * Get an entity by name
1031
+ *
1032
+ * Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour.
1033
+ */
1034
+ static xmlEntityPtr
1035
+ getEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name)
1036
+ {
1037
+ callbacks++;
1038
+ if (noout)
1039
+ return(NULL);
1040
+ fprintf(stdout, "SAX.getEntity(%s)\n", name);
1041
+ return(NULL);
1042
+ }
1043
+
1044
+ /**
1045
+ * getParameterEntityDebug:
1046
+ * @ctxt: An XML parser context
1047
+ * @name: The entity name
1048
+ *
1049
+ * Get a parameter entity by name
1050
+ *
1051
+ * Returns the xmlParserInputPtr
1052
+ */
1053
+ static xmlEntityPtr
1054
+ getParameterEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name)
1055
+ {
1056
+ callbacks++;
1057
+ if (noout)
1058
+ return(NULL);
1059
+ fprintf(stdout, "SAX.getParameterEntity(%s)\n", name);
1060
+ return(NULL);
1061
+ }
1062
+
1063
+
1064
+ /**
1065
+ * entityDeclDebug:
1066
+ * @ctxt: An XML parser context
1067
+ * @name: the entity name
1068
+ * @type: the entity type
1069
+ * @publicId: The public ID of the entity
1070
+ * @systemId: The system ID of the entity
1071
+ * @content: the entity value (without processing).
1072
+ *
1073
+ * An entity definition has been parsed
1074
+ */
1075
+ static void
1076
+ entityDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, int type,
1077
+ const xmlChar *publicId, const xmlChar *systemId, xmlChar *content)
1078
+ {
1079
+ const xmlChar *nullstr = BAD_CAST "(null)";
1080
+ /* not all libraries handle printing null pointers nicely */
1081
+ if (publicId == NULL)
1082
+ publicId = nullstr;
1083
+ if (systemId == NULL)
1084
+ systemId = nullstr;
1085
+ if (content == NULL)
1086
+ content = (xmlChar *)nullstr;
1087
+ callbacks++;
1088
+ if (noout)
1089
+ return;
1090
+ fprintf(stdout, "SAX.entityDecl(%s, %d, %s, %s, %s)\n",
1091
+ name, type, publicId, systemId, content);
1092
+ }
1093
+
1094
+ /**
1095
+ * attributeDeclDebug:
1096
+ * @ctxt: An XML parser context
1097
+ * @name: the attribute name
1098
+ * @type: the attribute type
1099
+ *
1100
+ * An attribute definition has been parsed
1101
+ */
1102
+ static void
1103
+ attributeDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar * elem,
1104
+ const xmlChar * name, int type, int def,
1105
+ const xmlChar * defaultValue, xmlEnumerationPtr tree)
1106
+ {
1107
+ callbacks++;
1108
+ if (noout)
1109
+ return;
1110
+ if (defaultValue == NULL)
1111
+ fprintf(stdout, "SAX.attributeDecl(%s, %s, %d, %d, NULL, ...)\n",
1112
+ elem, name, type, def);
1113
+ else
1114
+ fprintf(stdout, "SAX.attributeDecl(%s, %s, %d, %d, %s, ...)\n",
1115
+ elem, name, type, def, defaultValue);
1116
+ xmlFreeEnumeration(tree);
1117
+ }
1118
+
1119
+ /**
1120
+ * elementDeclDebug:
1121
+ * @ctxt: An XML parser context
1122
+ * @name: the element name
1123
+ * @type: the element type
1124
+ * @content: the element value (without processing).
1125
+ *
1126
+ * An element definition has been parsed
1127
+ */
1128
+ static void
1129
+ elementDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, int type,
1130
+ xmlElementContentPtr content ATTRIBUTE_UNUSED)
1131
+ {
1132
+ callbacks++;
1133
+ if (noout)
1134
+ return;
1135
+ fprintf(stdout, "SAX.elementDecl(%s, %d, ...)\n",
1136
+ name, type);
1137
+ }
1138
+
1139
+ /**
1140
+ * notationDeclDebug:
1141
+ * @ctxt: An XML parser context
1142
+ * @name: The name of the notation
1143
+ * @publicId: The public ID of the entity
1144
+ * @systemId: The system ID of the entity
1145
+ *
1146
+ * What to do when a notation declaration has been parsed.
1147
+ */
1148
+ static void
1149
+ notationDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name,
1150
+ const xmlChar *publicId, const xmlChar *systemId)
1151
+ {
1152
+ callbacks++;
1153
+ if (noout)
1154
+ return;
1155
+ fprintf(stdout, "SAX.notationDecl(%s, %s, %s)\n",
1156
+ (char *) name, (char *) publicId, (char *) systemId);
1157
+ }
1158
+
1159
+ /**
1160
+ * unparsedEntityDeclDebug:
1161
+ * @ctxt: An XML parser context
1162
+ * @name: The name of the entity
1163
+ * @publicId: The public ID of the entity
1164
+ * @systemId: The system ID of the entity
1165
+ * @notationName: the name of the notation
1166
+ *
1167
+ * What to do when an unparsed entity declaration is parsed
1168
+ */
1169
+ static void
1170
+ unparsedEntityDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name,
1171
+ const xmlChar *publicId, const xmlChar *systemId,
1172
+ const xmlChar *notationName)
1173
+ {
1174
+ const xmlChar *nullstr = BAD_CAST "(null)";
1175
+
1176
+ if (publicId == NULL)
1177
+ publicId = nullstr;
1178
+ if (systemId == NULL)
1179
+ systemId = nullstr;
1180
+ if (notationName == NULL)
1181
+ notationName = nullstr;
1182
+ callbacks++;
1183
+ if (noout)
1184
+ return;
1185
+ fprintf(stdout, "SAX.unparsedEntityDecl(%s, %s, %s, %s)\n",
1186
+ (char *) name, (char *) publicId, (char *) systemId,
1187
+ (char *) notationName);
1188
+ }
1189
+
1190
+ /**
1191
+ * setDocumentLocatorDebug:
1192
+ * @ctxt: An XML parser context
1193
+ * @loc: A SAX Locator
1194
+ *
1195
+ * Receive the document locator at startup, actually xmlDefaultSAXLocator
1196
+ * Everything is available on the context, so this is useless in our case.
1197
+ */
1198
+ static void
1199
+ setDocumentLocatorDebug(void *ctx ATTRIBUTE_UNUSED, xmlSAXLocatorPtr loc ATTRIBUTE_UNUSED)
1200
+ {
1201
+ callbacks++;
1202
+ if (noout)
1203
+ return;
1204
+ fprintf(stdout, "SAX.setDocumentLocator()\n");
1205
+ }
1206
+
1207
+ /**
1208
+ * startDocumentDebug:
1209
+ * @ctxt: An XML parser context
1210
+ *
1211
+ * called when the document start being processed.
1212
+ */
1213
+ static void
1214
+ startDocumentDebug(void *ctx ATTRIBUTE_UNUSED)
1215
+ {
1216
+ callbacks++;
1217
+ if (noout)
1218
+ return;
1219
+ fprintf(stdout, "SAX.startDocument()\n");
1220
+ }
1221
+
1222
+ /**
1223
+ * endDocumentDebug:
1224
+ * @ctxt: An XML parser context
1225
+ *
1226
+ * called when the document end has been detected.
1227
+ */
1228
+ static void
1229
+ endDocumentDebug(void *ctx ATTRIBUTE_UNUSED)
1230
+ {
1231
+ callbacks++;
1232
+ if (noout)
1233
+ return;
1234
+ fprintf(stdout, "SAX.endDocument()\n");
1235
+ }
1236
+
1237
+ /**
1238
+ * startElementDebug:
1239
+ * @ctxt: An XML parser context
1240
+ * @name: The element name
1241
+ *
1242
+ * called when an opening tag has been processed.
1243
+ */
1244
+ static void
1245
+ startElementDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, const xmlChar **atts)
1246
+ {
1247
+ int i;
1248
+
1249
+ callbacks++;
1250
+ if (noout)
1251
+ return;
1252
+ fprintf(stdout, "SAX.startElement(%s", (char *) name);
1253
+ if (atts != NULL) {
1254
+ for (i = 0;(atts[i] != NULL);i++) {
1255
+ fprintf(stdout, ", %s='", atts[i++]);
1256
+ if (atts[i] != NULL)
1257
+ fprintf(stdout, "%s'", atts[i]);
1258
+ }
1259
+ }
1260
+ fprintf(stdout, ")\n");
1261
+ }
1262
+
1263
+ /**
1264
+ * endElementDebug:
1265
+ * @ctxt: An XML parser context
1266
+ * @name: The element name
1267
+ *
1268
+ * called when the end of an element has been detected.
1269
+ */
1270
+ static void
1271
+ endElementDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name)
1272
+ {
1273
+ callbacks++;
1274
+ if (noout)
1275
+ return;
1276
+ fprintf(stdout, "SAX.endElement(%s)\n", (char *) name);
1277
+ }
1278
+
1279
+ /**
1280
+ * charactersDebug:
1281
+ * @ctxt: An XML parser context
1282
+ * @ch: a xmlChar string
1283
+ * @len: the number of xmlChar
1284
+ *
1285
+ * receiving some chars from the parser.
1286
+ * Question: how much at a time ???
1287
+ */
1288
+ static void
1289
+ charactersDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *ch, int len)
1290
+ {
1291
+ char out[40];
1292
+ int i;
1293
+
1294
+ callbacks++;
1295
+ if (noout)
1296
+ return;
1297
+ for (i = 0;(i<len) && (i < 30);i++)
1298
+ out[i] = ch[i];
1299
+ out[i] = 0;
1300
+
1301
+ fprintf(stdout, "SAX.characters(%s, %d)\n", out, len);
1302
+ }
1303
+
1304
+ /**
1305
+ * referenceDebug:
1306
+ * @ctxt: An XML parser context
1307
+ * @name: The entity name
1308
+ *
1309
+ * called when an entity reference is detected.
1310
+ */
1311
+ static void
1312
+ referenceDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name)
1313
+ {
1314
+ callbacks++;
1315
+ if (noout)
1316
+ return;
1317
+ fprintf(stdout, "SAX.reference(%s)\n", name);
1318
+ }
1319
+
1320
+ /**
1321
+ * ignorableWhitespaceDebug:
1322
+ * @ctxt: An XML parser context
1323
+ * @ch: a xmlChar string
1324
+ * @start: the first char in the string
1325
+ * @len: the number of xmlChar
1326
+ *
1327
+ * receiving some ignorable whitespaces from the parser.
1328
+ * Question: how much at a time ???
1329
+ */
1330
+ static void
1331
+ ignorableWhitespaceDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *ch, int len)
1332
+ {
1333
+ char out[40];
1334
+ int i;
1335
+
1336
+ callbacks++;
1337
+ if (noout)
1338
+ return;
1339
+ for (i = 0;(i<len) && (i < 30);i++)
1340
+ out[i] = ch[i];
1341
+ out[i] = 0;
1342
+ fprintf(stdout, "SAX.ignorableWhitespace(%s, %d)\n", out, len);
1343
+ }
1344
+
1345
+ /**
1346
+ * processingInstructionDebug:
1347
+ * @ctxt: An XML parser context
1348
+ * @target: the target name
1349
+ * @data: the PI data's
1350
+ * @len: the number of xmlChar
1351
+ *
1352
+ * A processing instruction has been parsed.
1353
+ */
1354
+ static void
1355
+ processingInstructionDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *target,
1356
+ const xmlChar *data)
1357
+ {
1358
+ callbacks++;
1359
+ if (noout)
1360
+ return;
1361
+ if (data != NULL)
1362
+ fprintf(stdout, "SAX.processingInstruction(%s, %s)\n",
1363
+ (char *) target, (char *) data);
1364
+ else
1365
+ fprintf(stdout, "SAX.processingInstruction(%s, NULL)\n",
1366
+ (char *) target);
1367
+ }
1368
+
1369
+ /**
1370
+ * cdataBlockDebug:
1371
+ * @ctx: the user data (XML parser context)
1372
+ * @value: The pcdata content
1373
+ * @len: the block length
1374
+ *
1375
+ * called when a pcdata block has been parsed
1376
+ */
1377
+ static void
1378
+ cdataBlockDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *value, int len)
1379
+ {
1380
+ callbacks++;
1381
+ if (noout)
1382
+ return;
1383
+ fprintf(stdout, "SAX.pcdata(%.20s, %d)\n",
1384
+ (char *) value, len);
1385
+ }
1386
+
1387
+ /**
1388
+ * commentDebug:
1389
+ * @ctxt: An XML parser context
1390
+ * @value: the comment content
1391
+ *
1392
+ * A comment has been parsed.
1393
+ */
1394
+ static void
1395
+ commentDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *value)
1396
+ {
1397
+ callbacks++;
1398
+ if (noout)
1399
+ return;
1400
+ fprintf(stdout, "SAX.comment(%s)\n", value);
1401
+ }
1402
+
1403
+ /**
1404
+ * warningDebug:
1405
+ * @ctxt: An XML parser context
1406
+ * @msg: the message to display/transmit
1407
+ * @...: extra parameters for the message display
1408
+ *
1409
+ * Display and format a warning messages, gives file, line, position and
1410
+ * extra parameters.
1411
+ */
1412
+ static void XMLCDECL
1413
+ warningDebug(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...)
1414
+ {
1415
+ va_list args;
1416
+
1417
+ callbacks++;
1418
+ if (noout)
1419
+ return;
1420
+ va_start(args, msg);
1421
+ fprintf(stdout, "SAX.warning: ");
1422
+ vfprintf(stdout, msg, args);
1423
+ va_end(args);
1424
+ }
1425
+
1426
+ /**
1427
+ * errorDebug:
1428
+ * @ctxt: An XML parser context
1429
+ * @msg: the message to display/transmit
1430
+ * @...: extra parameters for the message display
1431
+ *
1432
+ * Display and format a error messages, gives file, line, position and
1433
+ * extra parameters.
1434
+ */
1435
+ static void XMLCDECL
1436
+ errorDebug(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...)
1437
+ {
1438
+ va_list args;
1439
+
1440
+ callbacks++;
1441
+ if (noout)
1442
+ return;
1443
+ va_start(args, msg);
1444
+ fprintf(stdout, "SAX.error: ");
1445
+ vfprintf(stdout, msg, args);
1446
+ va_end(args);
1447
+ }
1448
+
1449
+ /**
1450
+ * fatalErrorDebug:
1451
+ * @ctxt: An XML parser context
1452
+ * @msg: the message to display/transmit
1453
+ * @...: extra parameters for the message display
1454
+ *
1455
+ * Display and format a fatalError messages, gives file, line, position and
1456
+ * extra parameters.
1457
+ */
1458
+ static void XMLCDECL
1459
+ fatalErrorDebug(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...)
1460
+ {
1461
+ va_list args;
1462
+
1463
+ callbacks++;
1464
+ if (noout)
1465
+ return;
1466
+ va_start(args, msg);
1467
+ fprintf(stdout, "SAX.fatalError: ");
1468
+ vfprintf(stdout, msg, args);
1469
+ va_end(args);
1470
+ }
1471
+
1472
+ static xmlSAXHandler debugSAXHandlerStruct = {
1473
+ internalSubsetDebug,
1474
+ isStandaloneDebug,
1475
+ hasInternalSubsetDebug,
1476
+ hasExternalSubsetDebug,
1477
+ resolveEntityDebug,
1478
+ getEntityDebug,
1479
+ entityDeclDebug,
1480
+ notationDeclDebug,
1481
+ attributeDeclDebug,
1482
+ elementDeclDebug,
1483
+ unparsedEntityDeclDebug,
1484
+ setDocumentLocatorDebug,
1485
+ startDocumentDebug,
1486
+ endDocumentDebug,
1487
+ startElementDebug,
1488
+ endElementDebug,
1489
+ referenceDebug,
1490
+ charactersDebug,
1491
+ ignorableWhitespaceDebug,
1492
+ processingInstructionDebug,
1493
+ commentDebug,
1494
+ warningDebug,
1495
+ errorDebug,
1496
+ fatalErrorDebug,
1497
+ getParameterEntityDebug,
1498
+ cdataBlockDebug,
1499
+ externalSubsetDebug,
1500
+ 1,
1501
+ NULL,
1502
+ NULL,
1503
+ NULL,
1504
+ NULL
1505
+ };
1506
+
1507
+ xmlSAXHandlerPtr debugSAXHandler = &debugSAXHandlerStruct;
1508
+
1509
+ /*
1510
+ * SAX2 specific callbacks
1511
+ */
1512
+ /**
1513
+ * startElementNsDebug:
1514
+ * @ctxt: An XML parser context
1515
+ * @name: The element name
1516
+ *
1517
+ * called when an opening tag has been processed.
1518
+ */
1519
+ static void
1520
+ startElementNsDebug(void *ctx ATTRIBUTE_UNUSED,
1521
+ const xmlChar *localname,
1522
+ const xmlChar *prefix,
1523
+ const xmlChar *URI,
1524
+ int nb_namespaces,
1525
+ const xmlChar **namespaces,
1526
+ int nb_attributes,
1527
+ int nb_defaulted,
1528
+ const xmlChar **attributes)
1529
+ {
1530
+ int i;
1531
+
1532
+ callbacks++;
1533
+ if (noout)
1534
+ return;
1535
+ fprintf(stdout, "SAX.startElementNs(%s", (char *) localname);
1536
+ if (prefix == NULL)
1537
+ fprintf(stdout, ", NULL");
1538
+ else
1539
+ fprintf(stdout, ", %s", (char *) prefix);
1540
+ if (URI == NULL)
1541
+ fprintf(stdout, ", NULL");
1542
+ else
1543
+ fprintf(stdout, ", '%s'", (char *) URI);
1544
+ fprintf(stdout, ", %d", nb_namespaces);
1545
+
1546
+ if (namespaces != NULL) {
1547
+ for (i = 0;i < nb_namespaces * 2;i++) {
1548
+ fprintf(stdout, ", xmlns");
1549
+ if (namespaces[i] != NULL)
1550
+ fprintf(stdout, ":%s", namespaces[i]);
1551
+ i++;
1552
+ fprintf(stdout, "='%s'", namespaces[i]);
1553
+ }
1554
+ }
1555
+ fprintf(stdout, ", %d, %d", nb_attributes, nb_defaulted);
1556
+ if (attributes != NULL) {
1557
+ for (i = 0;i < nb_attributes * 5;i += 5) {
1558
+ if (attributes[i + 1] != NULL)
1559
+ fprintf(stdout, ", %s:%s='", attributes[i + 1], attributes[i]);
1560
+ else
1561
+ fprintf(stdout, ", %s='", attributes[i]);
1562
+ fprintf(stdout, "%.4s...', %d", attributes[i + 3],
1563
+ (int)(attributes[i + 4] - attributes[i + 3]));
1564
+ }
1565
+ }
1566
+ fprintf(stdout, ")\n");
1567
+ }
1568
+
1569
+ /**
1570
+ * endElementDebug:
1571
+ * @ctxt: An XML parser context
1572
+ * @name: The element name
1573
+ *
1574
+ * called when the end of an element has been detected.
1575
+ */
1576
+ static void
1577
+ endElementNsDebug(void *ctx ATTRIBUTE_UNUSED,
1578
+ const xmlChar *localname,
1579
+ const xmlChar *prefix,
1580
+ const xmlChar *URI)
1581
+ {
1582
+ callbacks++;
1583
+ if (noout)
1584
+ return;
1585
+ fprintf(stdout, "SAX.endElementNs(%s", (char *) localname);
1586
+ if (prefix == NULL)
1587
+ fprintf(stdout, ", NULL");
1588
+ else
1589
+ fprintf(stdout, ", %s", (char *) prefix);
1590
+ if (URI == NULL)
1591
+ fprintf(stdout, ", NULL)\n");
1592
+ else
1593
+ fprintf(stdout, ", '%s')\n", (char *) URI);
1594
+ }
1595
+
1596
+ static xmlSAXHandler debugSAX2HandlerStruct = {
1597
+ internalSubsetDebug,
1598
+ isStandaloneDebug,
1599
+ hasInternalSubsetDebug,
1600
+ hasExternalSubsetDebug,
1601
+ resolveEntityDebug,
1602
+ getEntityDebug,
1603
+ entityDeclDebug,
1604
+ notationDeclDebug,
1605
+ attributeDeclDebug,
1606
+ elementDeclDebug,
1607
+ unparsedEntityDeclDebug,
1608
+ setDocumentLocatorDebug,
1609
+ startDocumentDebug,
1610
+ endDocumentDebug,
1611
+ NULL,
1612
+ NULL,
1613
+ referenceDebug,
1614
+ charactersDebug,
1615
+ ignorableWhitespaceDebug,
1616
+ processingInstructionDebug,
1617
+ commentDebug,
1618
+ warningDebug,
1619
+ errorDebug,
1620
+ fatalErrorDebug,
1621
+ getParameterEntityDebug,
1622
+ cdataBlockDebug,
1623
+ externalSubsetDebug,
1624
+ XML_SAX2_MAGIC,
1625
+ NULL,
1626
+ startElementNsDebug,
1627
+ endElementNsDebug,
1628
+ NULL
1629
+ };
1630
+
1631
+ static xmlSAXHandlerPtr debugSAX2Handler = &debugSAX2HandlerStruct;
1632
+
1633
+ static void
1634
+ testSAX(const char *filename) {
1635
+ xmlSAXHandlerPtr handler;
1636
+ const char *user_data = "user_data"; /* mostly for debugging */
1637
+ xmlParserInputBufferPtr buf = NULL;
1638
+ xmlParserInputPtr inputStream;
1639
+ xmlParserCtxtPtr ctxt = NULL;
1640
+ xmlSAXHandlerPtr old_sax = NULL;
1641
+
1642
+ callbacks = 0;
1643
+
1644
+ if (noout) {
1645
+ handler = emptySAXHandler;
1646
+ #ifdef LIBXML_SAX1_ENABLED
1647
+ } else if (sax1) {
1648
+ handler = debugSAXHandler;
1649
+ #endif
1650
+ } else {
1651
+ handler = debugSAX2Handler;
1652
+ }
1653
+
1654
+ /*
1655
+ * it's not the simplest code but the most generic in term of I/O
1656
+ */
1657
+ buf = xmlParserInputBufferCreateFilename(filename, XML_CHAR_ENCODING_NONE);
1658
+ if (buf == NULL) {
1659
+ goto error;
1660
+ }
1661
+
1662
+ #ifdef LIBXML_SCHEMAS_ENABLED
1663
+ if (wxschemas != NULL) {
1664
+ int ret;
1665
+ xmlSchemaValidCtxtPtr vctxt;
1666
+
1667
+ vctxt = xmlSchemaNewValidCtxt(wxschemas);
1668
+ xmlSchemaSetValidErrors(vctxt,
1669
+ (xmlSchemaValidityErrorFunc) fprintf,
1670
+ (xmlSchemaValidityWarningFunc) fprintf,
1671
+ stderr);
1672
+ xmlSchemaValidateSetFilename(vctxt, filename);
1673
+
1674
+ ret = xmlSchemaValidateStream(vctxt, buf, 0, handler,
1675
+ (void *)user_data);
1676
+ if (repeat == 0) {
1677
+ if (ret == 0) {
1678
+ fprintf(stderr, "%s validates\n", filename);
1679
+ } else if (ret > 0) {
1680
+ fprintf(stderr, "%s fails to validate\n", filename);
1681
+ progresult = XMLLINT_ERR_VALID;
1682
+ } else {
1683
+ fprintf(stderr, "%s validation generated an internal error\n",
1684
+ filename);
1685
+ progresult = XMLLINT_ERR_VALID;
1686
+ }
1687
+ }
1688
+ xmlSchemaFreeValidCtxt(vctxt);
1689
+ } else
1690
+ #endif
1691
+ {
1692
+ /*
1693
+ * Create the parser context amd hook the input
1694
+ */
1695
+ ctxt = xmlNewParserCtxt();
1696
+ if (ctxt == NULL) {
1697
+ xmlFreeParserInputBuffer(buf);
1698
+ goto error;
1699
+ }
1700
+ old_sax = ctxt->sax;
1701
+ ctxt->sax = handler;
1702
+ ctxt->userData = (void *) user_data;
1703
+ inputStream = xmlNewIOInputStream(ctxt, buf, XML_CHAR_ENCODING_NONE);
1704
+ if (inputStream == NULL) {
1705
+ xmlFreeParserInputBuffer(buf);
1706
+ goto error;
1707
+ }
1708
+ inputPush(ctxt, inputStream);
1709
+
1710
+ /* do the parsing */
1711
+ xmlParseDocument(ctxt);
1712
+
1713
+ if (ctxt->myDoc != NULL) {
1714
+ fprintf(stderr, "SAX generated a doc !\n");
1715
+ xmlFreeDoc(ctxt->myDoc);
1716
+ ctxt->myDoc = NULL;
1717
+ }
1718
+ }
1719
+
1720
+ error:
1721
+ if (ctxt != NULL) {
1722
+ ctxt->sax = old_sax;
1723
+ xmlFreeParserCtxt(ctxt);
1724
+ }
1725
+ }
1726
+
1727
+ /************************************************************************
1728
+ * *
1729
+ * Stream Test processing *
1730
+ * *
1731
+ ************************************************************************/
1732
+ #ifdef LIBXML_READER_ENABLED
1733
+ static void processNode(xmlTextReaderPtr reader) {
1734
+ const xmlChar *name, *value;
1735
+ int type, empty;
1736
+
1737
+ type = xmlTextReaderNodeType(reader);
1738
+ empty = xmlTextReaderIsEmptyElement(reader);
1739
+
1740
+ if (debug) {
1741
+ name = xmlTextReaderConstName(reader);
1742
+ if (name == NULL)
1743
+ name = BAD_CAST "--";
1744
+
1745
+ value = xmlTextReaderConstValue(reader);
1746
+
1747
+
1748
+ printf("%d %d %s %d %d",
1749
+ xmlTextReaderDepth(reader),
1750
+ type,
1751
+ name,
1752
+ empty,
1753
+ xmlTextReaderHasValue(reader));
1754
+ if (value == NULL)
1755
+ printf("\n");
1756
+ else {
1757
+ printf(" %s\n", value);
1758
+ }
1759
+ }
1760
+ #ifdef LIBXML_PATTERN_ENABLED
1761
+ if (patternc) {
1762
+ xmlChar *path = NULL;
1763
+ int match = -1;
1764
+
1765
+ if (type == XML_READER_TYPE_ELEMENT) {
1766
+ /* do the check only on element start */
1767
+ match = xmlPatternMatch(patternc, xmlTextReaderCurrentNode(reader));
1768
+
1769
+ if (match) {
1770
+ #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_DEBUG_ENABLED)
1771
+ path = xmlGetNodePath(xmlTextReaderCurrentNode(reader));
1772
+ printf("Node %s matches pattern %s\n", path, pattern);
1773
+ #else
1774
+ printf("Node %s matches pattern %s\n",
1775
+ xmlTextReaderConstName(reader), pattern);
1776
+ #endif
1777
+ }
1778
+ }
1779
+ if (patstream != NULL) {
1780
+ int ret;
1781
+
1782
+ if (type == XML_READER_TYPE_ELEMENT) {
1783
+ ret = xmlStreamPush(patstream,
1784
+ xmlTextReaderConstLocalName(reader),
1785
+ xmlTextReaderConstNamespaceUri(reader));
1786
+ if (ret < 0) {
1787
+ fprintf(stderr, "xmlStreamPush() failure\n");
1788
+ xmlFreeStreamCtxt(patstream);
1789
+ patstream = NULL;
1790
+ } else if (ret != match) {
1791
+ #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_DEBUG_ENABLED)
1792
+ if (path == NULL) {
1793
+ path = xmlGetNodePath(
1794
+ xmlTextReaderCurrentNode(reader));
1795
+ }
1796
+ #endif
1797
+ fprintf(stderr,
1798
+ "xmlPatternMatch and xmlStreamPush disagree\n");
1799
+ if (path != NULL)
1800
+ fprintf(stderr, " pattern %s node %s\n",
1801
+ pattern, path);
1802
+ else
1803
+ fprintf(stderr, " pattern %s node %s\n",
1804
+ pattern, xmlTextReaderConstName(reader));
1805
+ }
1806
+
1807
+ }
1808
+ if ((type == XML_READER_TYPE_END_ELEMENT) ||
1809
+ ((type == XML_READER_TYPE_ELEMENT) && (empty))) {
1810
+ ret = xmlStreamPop(patstream);
1811
+ if (ret < 0) {
1812
+ fprintf(stderr, "xmlStreamPop() failure\n");
1813
+ xmlFreeStreamCtxt(patstream);
1814
+ patstream = NULL;
1815
+ }
1816
+ }
1817
+ }
1818
+ if (path != NULL)
1819
+ xmlFree(path);
1820
+ }
1821
+ #endif
1822
+ }
1823
+
1824
+ static void streamFile(char *filename) {
1825
+ xmlTextReaderPtr reader;
1826
+ int ret;
1827
+ #ifdef HAVE_MMAP
1828
+ int fd = -1;
1829
+ struct stat info;
1830
+ const char *base = NULL;
1831
+ xmlParserInputBufferPtr input = NULL;
1832
+
1833
+ if (memory) {
1834
+ if (stat(filename, &info) < 0)
1835
+ return;
1836
+ if ((fd = open(filename, O_RDONLY)) < 0)
1837
+ return;
1838
+ base = mmap(NULL, info.st_size, PROT_READ, MAP_SHARED, fd, 0) ;
1839
+ if (base == (void *) MAP_FAILED)
1840
+ return;
1841
+
1842
+ reader = xmlReaderForMemory(base, info.st_size, filename,
1843
+ NULL, options);
1844
+ } else
1845
+ #endif
1846
+ reader = xmlReaderForFile(filename, NULL, options);
1847
+ #ifdef LIBXML_PATTERN_ENABLED
1848
+ if (pattern != NULL) {
1849
+ patternc = xmlPatterncompile((const xmlChar *) pattern, NULL, 0, NULL);
1850
+ if (patternc == NULL) {
1851
+ xmlGenericError(xmlGenericErrorContext,
1852
+ "Pattern %s failed to compile\n", pattern);
1853
+ progresult = XMLLINT_ERR_SCHEMAPAT;
1854
+ pattern = NULL;
1855
+ }
1856
+ }
1857
+ if (patternc != NULL) {
1858
+ patstream = xmlPatternGetStreamCtxt(patternc);
1859
+ if (patstream != NULL) {
1860
+ ret = xmlStreamPush(patstream, NULL, NULL);
1861
+ if (ret < 0) {
1862
+ fprintf(stderr, "xmlStreamPush() failure\n");
1863
+ xmlFreeStreamCtxt(patstream);
1864
+ patstream = NULL;
1865
+ }
1866
+ }
1867
+ }
1868
+ #endif
1869
+
1870
+
1871
+ if (reader != NULL) {
1872
+ #ifdef LIBXML_VALID_ENABLED
1873
+ if (valid)
1874
+ xmlTextReaderSetParserProp(reader, XML_PARSER_VALIDATE, 1);
1875
+ else
1876
+ #endif /* LIBXML_VALID_ENABLED */
1877
+ xmlTextReaderSetParserProp(reader, XML_PARSER_LOADDTD, 1);
1878
+ #ifdef LIBXML_SCHEMAS_ENABLED
1879
+ if (relaxng != NULL) {
1880
+ if ((timing) && (!repeat)) {
1881
+ startTimer();
1882
+ }
1883
+ ret = xmlTextReaderRelaxNGValidate(reader, relaxng);
1884
+ if (ret < 0) {
1885
+ xmlGenericError(xmlGenericErrorContext,
1886
+ "Relax-NG schema %s failed to compile\n", relaxng);
1887
+ progresult = XMLLINT_ERR_SCHEMACOMP;
1888
+ relaxng = NULL;
1889
+ }
1890
+ if ((timing) && (!repeat)) {
1891
+ endTimer("Compiling the schemas");
1892
+ }
1893
+ }
1894
+ if (schema != NULL) {
1895
+ if ((timing) && (!repeat)) {
1896
+ startTimer();
1897
+ }
1898
+ ret = xmlTextReaderSchemaValidate(reader, schema);
1899
+ if (ret < 0) {
1900
+ xmlGenericError(xmlGenericErrorContext,
1901
+ "XSD schema %s failed to compile\n", schema);
1902
+ progresult = XMLLINT_ERR_SCHEMACOMP;
1903
+ schema = NULL;
1904
+ }
1905
+ if ((timing) && (!repeat)) {
1906
+ endTimer("Compiling the schemas");
1907
+ }
1908
+ }
1909
+ #endif
1910
+
1911
+ /*
1912
+ * Process all nodes in sequence
1913
+ */
1914
+ if ((timing) && (!repeat)) {
1915
+ startTimer();
1916
+ }
1917
+ ret = xmlTextReaderRead(reader);
1918
+ while (ret == 1) {
1919
+ if ((debug)
1920
+ #ifdef LIBXML_PATTERN_ENABLED
1921
+ || (patternc)
1922
+ #endif
1923
+ )
1924
+ processNode(reader);
1925
+ ret = xmlTextReaderRead(reader);
1926
+ }
1927
+ if ((timing) && (!repeat)) {
1928
+ #ifdef LIBXML_SCHEMAS_ENABLED
1929
+ if (relaxng != NULL)
1930
+ endTimer("Parsing and validating");
1931
+ else
1932
+ #endif
1933
+ #ifdef LIBXML_VALID_ENABLED
1934
+ if (valid)
1935
+ endTimer("Parsing and validating");
1936
+ else
1937
+ #endif
1938
+ endTimer("Parsing");
1939
+ }
1940
+
1941
+ #ifdef LIBXML_VALID_ENABLED
1942
+ if (valid) {
1943
+ if (xmlTextReaderIsValid(reader) != 1) {
1944
+ xmlGenericError(xmlGenericErrorContext,
1945
+ "Document %s does not validate\n", filename);
1946
+ progresult = XMLLINT_ERR_VALID;
1947
+ }
1948
+ }
1949
+ #endif /* LIBXML_VALID_ENABLED */
1950
+ #ifdef LIBXML_SCHEMAS_ENABLED
1951
+ if ((relaxng != NULL) || (schema != NULL)) {
1952
+ if (xmlTextReaderIsValid(reader) != 1) {
1953
+ fprintf(stderr, "%s fails to validate\n", filename);
1954
+ progresult = XMLLINT_ERR_VALID;
1955
+ } else {
1956
+ fprintf(stderr, "%s validates\n", filename);
1957
+ }
1958
+ }
1959
+ #endif
1960
+ /*
1961
+ * Done, cleanup and status
1962
+ */
1963
+ xmlFreeTextReader(reader);
1964
+ if (ret != 0) {
1965
+ fprintf(stderr, "%s : failed to parse\n", filename);
1966
+ progresult = XMLLINT_ERR_UNCLASS;
1967
+ }
1968
+ } else {
1969
+ fprintf(stderr, "Unable to open %s\n", filename);
1970
+ progresult = XMLLINT_ERR_UNCLASS;
1971
+ }
1972
+ #ifdef LIBXML_PATTERN_ENABLED
1973
+ if (patstream != NULL) {
1974
+ xmlFreeStreamCtxt(patstream);
1975
+ patstream = NULL;
1976
+ }
1977
+ #endif
1978
+ #ifdef HAVE_MMAP
1979
+ if (memory) {
1980
+ xmlFreeParserInputBuffer(input);
1981
+ munmap((char *) base, info.st_size);
1982
+ close(fd);
1983
+ }
1984
+ #endif
1985
+ }
1986
+
1987
+ static void walkDoc(xmlDocPtr doc) {
1988
+ xmlTextReaderPtr reader;
1989
+ int ret;
1990
+
1991
+ #ifdef LIBXML_PATTERN_ENABLED
1992
+ xmlNodePtr root;
1993
+ const xmlChar *namespaces[22];
1994
+ int i;
1995
+ xmlNsPtr ns;
1996
+
1997
+ root = xmlDocGetRootElement(doc);
1998
+ for (ns = root->nsDef, i = 0;ns != NULL && i < 20;ns=ns->next) {
1999
+ namespaces[i++] = ns->href;
2000
+ namespaces[i++] = ns->prefix;
2001
+ }
2002
+ namespaces[i++] = NULL;
2003
+ namespaces[i] = NULL;
2004
+
2005
+ if (pattern != NULL) {
2006
+ patternc = xmlPatterncompile((const xmlChar *) pattern, doc->dict,
2007
+ 0, &namespaces[0]);
2008
+ if (patternc == NULL) {
2009
+ xmlGenericError(xmlGenericErrorContext,
2010
+ "Pattern %s failed to compile\n", pattern);
2011
+ progresult = XMLLINT_ERR_SCHEMAPAT;
2012
+ pattern = NULL;
2013
+ }
2014
+ }
2015
+ if (patternc != NULL) {
2016
+ patstream = xmlPatternGetStreamCtxt(patternc);
2017
+ if (patstream != NULL) {
2018
+ ret = xmlStreamPush(patstream, NULL, NULL);
2019
+ if (ret < 0) {
2020
+ fprintf(stderr, "xmlStreamPush() failure\n");
2021
+ xmlFreeStreamCtxt(patstream);
2022
+ patstream = NULL;
2023
+ }
2024
+ }
2025
+ }
2026
+ #endif /* LIBXML_PATTERN_ENABLED */
2027
+ reader = xmlReaderWalker(doc);
2028
+ if (reader != NULL) {
2029
+ if ((timing) && (!repeat)) {
2030
+ startTimer();
2031
+ }
2032
+ ret = xmlTextReaderRead(reader);
2033
+ while (ret == 1) {
2034
+ if ((debug)
2035
+ #ifdef LIBXML_PATTERN_ENABLED
2036
+ || (patternc)
2037
+ #endif
2038
+ )
2039
+ processNode(reader);
2040
+ ret = xmlTextReaderRead(reader);
2041
+ }
2042
+ if ((timing) && (!repeat)) {
2043
+ endTimer("walking through the doc");
2044
+ }
2045
+ xmlFreeTextReader(reader);
2046
+ if (ret != 0) {
2047
+ fprintf(stderr, "failed to walk through the doc\n");
2048
+ progresult = XMLLINT_ERR_UNCLASS;
2049
+ }
2050
+ } else {
2051
+ fprintf(stderr, "Failed to crate a reader from the document\n");
2052
+ progresult = XMLLINT_ERR_UNCLASS;
2053
+ }
2054
+ #ifdef LIBXML_PATTERN_ENABLED
2055
+ if (patstream != NULL) {
2056
+ xmlFreeStreamCtxt(patstream);
2057
+ patstream = NULL;
2058
+ }
2059
+ #endif
2060
+ }
2061
+ #endif /* LIBXML_READER_ENABLED */
2062
+
2063
+ #ifdef LIBXML_XPATH_ENABLED
2064
+ /************************************************************************
2065
+ * *
2066
+ * XPath Query *
2067
+ * *
2068
+ ************************************************************************/
2069
+
2070
+ static void doXPathDump(xmlXPathObjectPtr cur) {
2071
+ switch(cur->type) {
2072
+ case XPATH_NODESET: {
2073
+ int i;
2074
+ xmlNodePtr node;
2075
+ #ifdef LIBXML_OUTPUT_ENABLED
2076
+ xmlSaveCtxtPtr ctxt;
2077
+
2078
+ if ((cur->nodesetval == NULL) || (cur->nodesetval->nodeNr <= 0)) {
2079
+ fprintf(stderr, "XPath set is empty\n");
2080
+ progresult = XMLLINT_ERR_XPATH;
2081
+ break;
2082
+ }
2083
+ ctxt = xmlSaveToFd(1, NULL, 0);
2084
+ if (ctxt == NULL) {
2085
+ fprintf(stderr, "Out of memory for XPath\n");
2086
+ progresult = XMLLINT_ERR_MEM;
2087
+ return;
2088
+ }
2089
+ for (i = 0;i < cur->nodesetval->nodeNr;i++) {
2090
+ node = cur->nodesetval->nodeTab[i];
2091
+ xmlSaveTree(ctxt, node);
2092
+ }
2093
+ xmlSaveClose(ctxt);
2094
+ #else
2095
+ printf("xpath returned %d nodes\n", cur->nodesetval->nodeNr);
2096
+ #endif
2097
+ break;
2098
+ }
2099
+ case XPATH_BOOLEAN:
2100
+ if (cur->boolval) printf("true");
2101
+ else printf("false");
2102
+ break;
2103
+ case XPATH_NUMBER:
2104
+ switch (xmlXPathIsInf(cur->floatval)) {
2105
+ case 1:
2106
+ printf("Infinity");
2107
+ break;
2108
+ case -1:
2109
+ printf("-Infinity");
2110
+ break;
2111
+ default:
2112
+ if (xmlXPathIsNaN(cur->floatval)) {
2113
+ printf("NaN");
2114
+ } else {
2115
+ printf("%0g", cur->floatval);
2116
+ }
2117
+ }
2118
+ break;
2119
+ case XPATH_STRING:
2120
+ printf("%s", (const char *) cur->stringval);
2121
+ break;
2122
+ case XPATH_UNDEFINED:
2123
+ fprintf(stderr, "XPath Object is uninitialized\n");
2124
+ progresult = XMLLINT_ERR_XPATH;
2125
+ break;
2126
+ default:
2127
+ fprintf(stderr, "XPath object of unexpected type\n");
2128
+ progresult = XMLLINT_ERR_XPATH;
2129
+ break;
2130
+ }
2131
+ }
2132
+
2133
+ static void doXPathQuery(xmlDocPtr doc, const char *query) {
2134
+ xmlXPathContextPtr ctxt;
2135
+ xmlXPathObjectPtr res;
2136
+
2137
+ ctxt = xmlXPathNewContext(doc);
2138
+ if (ctxt == NULL) {
2139
+ fprintf(stderr, "Out of memory for XPath\n");
2140
+ progresult = XMLLINT_ERR_MEM;
2141
+ return;
2142
+ }
2143
+ ctxt->node = (xmlNodePtr) doc;
2144
+ res = xmlXPathEval(BAD_CAST query, ctxt);
2145
+ xmlXPathFreeContext(ctxt);
2146
+
2147
+ if (res == NULL) {
2148
+ fprintf(stderr, "XPath evaluation failure\n");
2149
+ progresult = XMLLINT_ERR_XPATH;
2150
+ return;
2151
+ }
2152
+ doXPathDump(res);
2153
+ xmlXPathFreeObject(res);
2154
+ }
2155
+ #endif /* LIBXML_XPATH_ENABLED */
2156
+
2157
+ /************************************************************************
2158
+ * *
2159
+ * Tree Test processing *
2160
+ * *
2161
+ ************************************************************************/
2162
+ static void parseAndPrintFile(char *filename, xmlParserCtxtPtr rectxt) {
2163
+ xmlDocPtr doc = NULL;
2164
+ #ifdef LIBXML_TREE_ENABLED
2165
+ xmlDocPtr tmp;
2166
+ #endif /* LIBXML_TREE_ENABLED */
2167
+
2168
+ if ((timing) && (!repeat))
2169
+ startTimer();
2170
+
2171
+
2172
+ #ifdef LIBXML_TREE_ENABLED
2173
+ if (filename == NULL) {
2174
+ if (generate) {
2175
+ xmlNodePtr n;
2176
+
2177
+ doc = xmlNewDoc(BAD_CAST "1.0");
2178
+ n = xmlNewDocNode(doc, NULL, BAD_CAST "info", NULL);
2179
+ xmlNodeSetContent(n, BAD_CAST "abc");
2180
+ xmlDocSetRootElement(doc, n);
2181
+ }
2182
+ }
2183
+ #endif /* LIBXML_TREE_ENABLED */
2184
+ #ifdef LIBXML_HTML_ENABLED
2185
+ #ifdef LIBXML_PUSH_ENABLED
2186
+ else if ((html) && (push)) {
2187
+ FILE *f;
2188
+
2189
+ #if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
2190
+ f = fopen(filename, "rb");
2191
+ #else
2192
+ f = fopen(filename, "r");
2193
+ #endif
2194
+ if (f != NULL) {
2195
+ int res, size = 3;
2196
+ char chars[4096];
2197
+ htmlParserCtxtPtr ctxt;
2198
+
2199
+ /* if (repeat) */
2200
+ size = 4096;
2201
+ res = fread(chars, 1, 4, f);
2202
+ if (res > 0) {
2203
+ ctxt = htmlCreatePushParserCtxt(NULL, NULL,
2204
+ chars, res, filename, XML_CHAR_ENCODING_NONE);
2205
+ while ((res = fread(chars, 1, size, f)) > 0) {
2206
+ htmlParseChunk(ctxt, chars, res, 0);
2207
+ }
2208
+ htmlParseChunk(ctxt, chars, 0, 1);
2209
+ doc = ctxt->myDoc;
2210
+ htmlFreeParserCtxt(ctxt);
2211
+ }
2212
+ fclose(f);
2213
+ }
2214
+ }
2215
+ #endif /* LIBXML_PUSH_ENABLED */
2216
+ #ifdef HAVE_MMAP
2217
+ else if ((html) && (memory)) {
2218
+ int fd;
2219
+ struct stat info;
2220
+ const char *base;
2221
+ if (stat(filename, &info) < 0)
2222
+ return;
2223
+ if ((fd = open(filename, O_RDONLY)) < 0)
2224
+ return;
2225
+ base = mmap(NULL, info.st_size, PROT_READ, MAP_SHARED, fd, 0) ;
2226
+ if (base == (void *) MAP_FAILED)
2227
+ return;
2228
+
2229
+ doc = htmlReadMemory((char *) base, info.st_size, filename,
2230
+ NULL, options);
2231
+
2232
+ munmap((char *) base, info.st_size);
2233
+ close(fd);
2234
+ }
2235
+ #endif
2236
+ else if (html) {
2237
+ doc = htmlReadFile(filename, NULL, options);
2238
+ }
2239
+ #endif /* LIBXML_HTML_ENABLED */
2240
+ else {
2241
+ #ifdef LIBXML_PUSH_ENABLED
2242
+ /*
2243
+ * build an XML tree from a string;
2244
+ */
2245
+ if (push) {
2246
+ FILE *f;
2247
+
2248
+ /* '-' Usually means stdin -<sven@zen.org> */
2249
+ if ((filename[0] == '-') && (filename[1] == 0)) {
2250
+ f = stdin;
2251
+ } else {
2252
+ #if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
2253
+ f = fopen(filename, "rb");
2254
+ #else
2255
+ f = fopen(filename, "r");
2256
+ #endif
2257
+ }
2258
+ if (f != NULL) {
2259
+ int ret;
2260
+ int res, size = 1024;
2261
+ char chars[1024];
2262
+ xmlParserCtxtPtr ctxt;
2263
+
2264
+ /* if (repeat) size = 1024; */
2265
+ res = fread(chars, 1, 4, f);
2266
+ if (res > 0) {
2267
+ ctxt = xmlCreatePushParserCtxt(NULL, NULL,
2268
+ chars, res, filename);
2269
+ xmlCtxtUseOptions(ctxt, options);
2270
+ while ((res = fread(chars, 1, size, f)) > 0) {
2271
+ xmlParseChunk(ctxt, chars, res, 0);
2272
+ }
2273
+ xmlParseChunk(ctxt, chars, 0, 1);
2274
+ doc = ctxt->myDoc;
2275
+ ret = ctxt->wellFormed;
2276
+ xmlFreeParserCtxt(ctxt);
2277
+ if (!ret) {
2278
+ xmlFreeDoc(doc);
2279
+ doc = NULL;
2280
+ }
2281
+ }
2282
+ if (f != stdin)
2283
+ fclose(f);
2284
+ }
2285
+ } else
2286
+ #endif /* LIBXML_PUSH_ENABLED */
2287
+ if (testIO) {
2288
+ if ((filename[0] == '-') && (filename[1] == 0)) {
2289
+ doc = xmlReadFd(0, NULL, NULL, options);
2290
+ } else {
2291
+ FILE *f;
2292
+
2293
+ #if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
2294
+ f = fopen(filename, "rb");
2295
+ #else
2296
+ f = fopen(filename, "r");
2297
+ #endif
2298
+ if (f != NULL) {
2299
+ if (rectxt == NULL)
2300
+ doc = xmlReadIO((xmlInputReadCallback) myRead,
2301
+ (xmlInputCloseCallback) myClose, f,
2302
+ filename, NULL, options);
2303
+ else
2304
+ doc = xmlCtxtReadIO(rectxt,
2305
+ (xmlInputReadCallback) myRead,
2306
+ (xmlInputCloseCallback) myClose, f,
2307
+ filename, NULL, options);
2308
+ } else
2309
+ doc = NULL;
2310
+ }
2311
+ } else if (htmlout) {
2312
+ xmlParserCtxtPtr ctxt;
2313
+
2314
+ if (rectxt == NULL)
2315
+ ctxt = xmlNewParserCtxt();
2316
+ else
2317
+ ctxt = rectxt;
2318
+ if (ctxt == NULL) {
2319
+ doc = NULL;
2320
+ } else {
2321
+ ctxt->sax->error = xmlHTMLError;
2322
+ ctxt->sax->warning = xmlHTMLWarning;
2323
+ ctxt->vctxt.error = xmlHTMLValidityError;
2324
+ ctxt->vctxt.warning = xmlHTMLValidityWarning;
2325
+
2326
+ doc = xmlCtxtReadFile(ctxt, filename, NULL, options);
2327
+
2328
+ if (rectxt == NULL)
2329
+ xmlFreeParserCtxt(ctxt);
2330
+ }
2331
+ #ifdef HAVE_MMAP
2332
+ } else if (memory) {
2333
+ int fd;
2334
+ struct stat info;
2335
+ const char *base;
2336
+ if (stat(filename, &info) < 0)
2337
+ return;
2338
+ if ((fd = open(filename, O_RDONLY)) < 0)
2339
+ return;
2340
+ base = mmap(NULL, info.st_size, PROT_READ, MAP_SHARED, fd, 0) ;
2341
+ if (base == (void *) MAP_FAILED)
2342
+ return;
2343
+
2344
+ if (rectxt == NULL)
2345
+ doc = xmlReadMemory((char *) base, info.st_size,
2346
+ filename, NULL, options);
2347
+ else
2348
+ doc = xmlCtxtReadMemory(rectxt, (char *) base, info.st_size,
2349
+ filename, NULL, options);
2350
+
2351
+ munmap((char *) base, info.st_size);
2352
+ close(fd);
2353
+ #endif
2354
+ #ifdef LIBXML_VALID_ENABLED
2355
+ } else if (valid) {
2356
+ xmlParserCtxtPtr ctxt = NULL;
2357
+
2358
+ if (rectxt == NULL)
2359
+ ctxt = xmlNewParserCtxt();
2360
+ else
2361
+ ctxt = rectxt;
2362
+ if (ctxt == NULL) {
2363
+ doc = NULL;
2364
+ } else {
2365
+ doc = xmlCtxtReadFile(ctxt, filename, NULL, options);
2366
+
2367
+ if (ctxt->valid == 0)
2368
+ progresult = XMLLINT_ERR_RDFILE;
2369
+ if (rectxt == NULL)
2370
+ xmlFreeParserCtxt(ctxt);
2371
+ }
2372
+ #endif /* LIBXML_VALID_ENABLED */
2373
+ } else {
2374
+ if (rectxt != NULL)
2375
+ doc = xmlCtxtReadFile(rectxt, filename, NULL, options);
2376
+ else {
2377
+ #ifdef LIBXML_SAX1_ENABLED
2378
+ if (sax1)
2379
+ doc = xmlParseFile(filename);
2380
+ else
2381
+ #endif /* LIBXML_SAX1_ENABLED */
2382
+ doc = xmlReadFile(filename, NULL, options);
2383
+ }
2384
+ }
2385
+ }
2386
+
2387
+ /*
2388
+ * If we don't have a document we might as well give up. Do we
2389
+ * want an error message here? <sven@zen.org> */
2390
+ if (doc == NULL) {
2391
+ progresult = XMLLINT_ERR_UNCLASS;
2392
+ return;
2393
+ }
2394
+
2395
+ if ((timing) && (!repeat)) {
2396
+ endTimer("Parsing");
2397
+ }
2398
+
2399
+ /*
2400
+ * Remove DOCTYPE nodes
2401
+ */
2402
+ if (dropdtd) {
2403
+ xmlDtdPtr dtd;
2404
+
2405
+ dtd = xmlGetIntSubset(doc);
2406
+ if (dtd != NULL) {
2407
+ xmlUnlinkNode((xmlNodePtr)dtd);
2408
+ xmlFreeDtd(dtd);
2409
+ }
2410
+ }
2411
+
2412
+ #ifdef LIBXML_XINCLUDE_ENABLED
2413
+ if (xinclude) {
2414
+ if ((timing) && (!repeat)) {
2415
+ startTimer();
2416
+ }
2417
+ if (xmlXIncludeProcessFlags(doc, options) < 0)
2418
+ progresult = XMLLINT_ERR_UNCLASS;
2419
+ if ((timing) && (!repeat)) {
2420
+ endTimer("Xinclude processing");
2421
+ }
2422
+ }
2423
+ #endif
2424
+
2425
+ #ifdef LIBXML_XPATH_ENABLED
2426
+ if (xpathquery != NULL) {
2427
+ doXPathQuery(doc, xpathquery);
2428
+ }
2429
+ #endif
2430
+
2431
+ #ifdef LIBXML_DEBUG_ENABLED
2432
+ #ifdef LIBXML_XPATH_ENABLED
2433
+ /*
2434
+ * shell interaction
2435
+ */
2436
+ if (shell) {
2437
+ xmlXPathOrderDocElems(doc);
2438
+ xmlShell(doc, filename, xmlShellReadline, stdout);
2439
+ }
2440
+ #endif
2441
+ #endif
2442
+
2443
+ #ifdef LIBXML_TREE_ENABLED
2444
+ /*
2445
+ * test intermediate copy if needed.
2446
+ */
2447
+ if (copy) {
2448
+ tmp = doc;
2449
+ if (timing) {
2450
+ startTimer();
2451
+ }
2452
+ doc = xmlCopyDoc(doc, 1);
2453
+ if (timing) {
2454
+ endTimer("Copying");
2455
+ }
2456
+ if (timing) {
2457
+ startTimer();
2458
+ }
2459
+ xmlFreeDoc(tmp);
2460
+ if (timing) {
2461
+ endTimer("Freeing original");
2462
+ }
2463
+ }
2464
+ #endif /* LIBXML_TREE_ENABLED */
2465
+
2466
+ #ifdef LIBXML_VALID_ENABLED
2467
+ if ((insert) && (!html)) {
2468
+ const xmlChar* list[256];
2469
+ int nb, i;
2470
+ xmlNodePtr node;
2471
+
2472
+ if (doc->children != NULL) {
2473
+ node = doc->children;
2474
+ while ((node != NULL) && (node->last == NULL)) node = node->next;
2475
+ if (node != NULL) {
2476
+ nb = xmlValidGetValidElements(node->last, NULL, list, 256);
2477
+ if (nb < 0) {
2478
+ fprintf(stderr, "could not get valid list of elements\n");
2479
+ } else if (nb == 0) {
2480
+ fprintf(stderr, "No element can be inserted under root\n");
2481
+ } else {
2482
+ fprintf(stderr, "%d element types can be inserted under root:\n",
2483
+ nb);
2484
+ for (i = 0;i < nb;i++) {
2485
+ fprintf(stderr, "%s\n", (char *) list[i]);
2486
+ }
2487
+ }
2488
+ }
2489
+ }
2490
+ }else
2491
+ #endif /* LIBXML_VALID_ENABLED */
2492
+ #ifdef LIBXML_READER_ENABLED
2493
+ if (walker) {
2494
+ walkDoc(doc);
2495
+ }
2496
+ #endif /* LIBXML_READER_ENABLED */
2497
+ #ifdef LIBXML_OUTPUT_ENABLED
2498
+ if (noout == 0) {
2499
+ int ret;
2500
+
2501
+ /*
2502
+ * print it.
2503
+ */
2504
+ #ifdef LIBXML_DEBUG_ENABLED
2505
+ if (!debug) {
2506
+ #endif
2507
+ if ((timing) && (!repeat)) {
2508
+ startTimer();
2509
+ }
2510
+ #ifdef LIBXML_HTML_ENABLED
2511
+ if ((html) && (!xmlout)) {
2512
+ if (compress) {
2513
+ htmlSaveFile(output ? output : "-", doc);
2514
+ }
2515
+ else if (encoding != NULL) {
2516
+ if (format == 1) {
2517
+ htmlSaveFileFormat(output ? output : "-", doc, encoding, 1);
2518
+ }
2519
+ else {
2520
+ htmlSaveFileFormat(output ? output : "-", doc, encoding, 0);
2521
+ }
2522
+ }
2523
+ else if (format == 1) {
2524
+ htmlSaveFileFormat(output ? output : "-", doc, NULL, 1);
2525
+ }
2526
+ else {
2527
+ FILE *out;
2528
+ if (output == NULL)
2529
+ out = stdout;
2530
+ else {
2531
+ out = fopen(output,"wb");
2532
+ }
2533
+ if (out != NULL) {
2534
+ if (htmlDocDump(out, doc) < 0)
2535
+ progresult = XMLLINT_ERR_OUT;
2536
+
2537
+ if (output != NULL)
2538
+ fclose(out);
2539
+ } else {
2540
+ fprintf(stderr, "failed to open %s\n", output);
2541
+ progresult = XMLLINT_ERR_OUT;
2542
+ }
2543
+ }
2544
+ if ((timing) && (!repeat)) {
2545
+ endTimer("Saving");
2546
+ }
2547
+ } else
2548
+ #endif
2549
+ #ifdef LIBXML_C14N_ENABLED
2550
+ if (canonical) {
2551
+ xmlChar *result = NULL;
2552
+ int size;
2553
+
2554
+ size = xmlC14NDocDumpMemory(doc, NULL, XML_C14N_1_0, NULL, 1, &result);
2555
+ if (size >= 0) {
2556
+ if (write(1, result, size) == -1) {
2557
+ fprintf(stderr, "Can't write data\n");
2558
+ }
2559
+ xmlFree(result);
2560
+ } else {
2561
+ fprintf(stderr, "Failed to canonicalize\n");
2562
+ progresult = XMLLINT_ERR_OUT;
2563
+ }
2564
+ } else if (canonical) {
2565
+ xmlChar *result = NULL;
2566
+ int size;
2567
+
2568
+ size = xmlC14NDocDumpMemory(doc, NULL, XML_C14N_1_1, NULL, 1, &result);
2569
+ if (size >= 0) {
2570
+ if (write(1, result, size) == -1) {
2571
+ fprintf(stderr, "Can't write data\n");
2572
+ }
2573
+ xmlFree(result);
2574
+ } else {
2575
+ fprintf(stderr, "Failed to canonicalize\n");
2576
+ progresult = XMLLINT_ERR_OUT;
2577
+ }
2578
+ } else
2579
+ if (exc_canonical) {
2580
+ xmlChar *result = NULL;
2581
+ int size;
2582
+
2583
+ size = xmlC14NDocDumpMemory(doc, NULL, XML_C14N_EXCLUSIVE_1_0, NULL, 1, &result);
2584
+ if (size >= 0) {
2585
+ if (write(1, result, size) == -1) {
2586
+ fprintf(stderr, "Can't write data\n");
2587
+ }
2588
+ xmlFree(result);
2589
+ } else {
2590
+ fprintf(stderr, "Failed to canonicalize\n");
2591
+ progresult = XMLLINT_ERR_OUT;
2592
+ }
2593
+ } else
2594
+ #endif
2595
+ #ifdef HAVE_MMAP
2596
+ if (memory) {
2597
+ xmlChar *result;
2598
+ int len;
2599
+
2600
+ if (encoding != NULL) {
2601
+ if (format == 1) {
2602
+ xmlDocDumpFormatMemoryEnc(doc, &result, &len, encoding, 1);
2603
+ } else {
2604
+ xmlDocDumpMemoryEnc(doc, &result, &len, encoding);
2605
+ }
2606
+ } else {
2607
+ if (format == 1)
2608
+ xmlDocDumpFormatMemory(doc, &result, &len, 1);
2609
+ else
2610
+ xmlDocDumpMemory(doc, &result, &len);
2611
+ }
2612
+ if (result == NULL) {
2613
+ fprintf(stderr, "Failed to save\n");
2614
+ progresult = XMLLINT_ERR_OUT;
2615
+ } else {
2616
+ if (write(1, result, len) == -1) {
2617
+ fprintf(stderr, "Can't write data\n");
2618
+ }
2619
+ xmlFree(result);
2620
+ }
2621
+
2622
+ } else
2623
+ #endif /* HAVE_MMAP */
2624
+ if (compress) {
2625
+ xmlSaveFile(output ? output : "-", doc);
2626
+ } else if (oldout) {
2627
+ if (encoding != NULL) {
2628
+ if (format == 1) {
2629
+ ret = xmlSaveFormatFileEnc(output ? output : "-", doc,
2630
+ encoding, 1);
2631
+ }
2632
+ else {
2633
+ ret = xmlSaveFileEnc(output ? output : "-", doc,
2634
+ encoding);
2635
+ }
2636
+ if (ret < 0) {
2637
+ fprintf(stderr, "failed save to %s\n",
2638
+ output ? output : "-");
2639
+ progresult = XMLLINT_ERR_OUT;
2640
+ }
2641
+ } else if (format == 1) {
2642
+ ret = xmlSaveFormatFile(output ? output : "-", doc, 1);
2643
+ if (ret < 0) {
2644
+ fprintf(stderr, "failed save to %s\n",
2645
+ output ? output : "-");
2646
+ progresult = XMLLINT_ERR_OUT;
2647
+ }
2648
+ } else {
2649
+ FILE *out;
2650
+ if (output == NULL)
2651
+ out = stdout;
2652
+ else {
2653
+ out = fopen(output,"wb");
2654
+ }
2655
+ if (out != NULL) {
2656
+ if (xmlDocDump(out, doc) < 0)
2657
+ progresult = XMLLINT_ERR_OUT;
2658
+
2659
+ if (output != NULL)
2660
+ fclose(out);
2661
+ } else {
2662
+ fprintf(stderr, "failed to open %s\n", output);
2663
+ progresult = XMLLINT_ERR_OUT;
2664
+ }
2665
+ }
2666
+ } else {
2667
+ xmlSaveCtxtPtr ctxt;
2668
+ int saveOpts = 0;
2669
+
2670
+ if (format == 1)
2671
+ saveOpts |= XML_SAVE_FORMAT;
2672
+ else if (format == 2)
2673
+ saveOpts |= XML_SAVE_WSNONSIG;
2674
+
2675
+ #if defined(LIBXML_HTML_ENABLED) || defined(LIBXML_VALID_ENABLED)
2676
+ if (xmlout)
2677
+ saveOpts |= XML_SAVE_AS_XML;
2678
+ #endif
2679
+
2680
+ if (output == NULL)
2681
+ ctxt = xmlSaveToFd(1, encoding, saveOpts);
2682
+ else
2683
+ ctxt = xmlSaveToFilename(output, encoding, saveOpts);
2684
+
2685
+ if (ctxt != NULL) {
2686
+ if (xmlSaveDoc(ctxt, doc) < 0) {
2687
+ fprintf(stderr, "failed save to %s\n",
2688
+ output ? output : "-");
2689
+ progresult = XMLLINT_ERR_OUT;
2690
+ }
2691
+ xmlSaveClose(ctxt);
2692
+ } else {
2693
+ progresult = XMLLINT_ERR_OUT;
2694
+ }
2695
+ }
2696
+ if ((timing) && (!repeat)) {
2697
+ endTimer("Saving");
2698
+ }
2699
+ #ifdef LIBXML_DEBUG_ENABLED
2700
+ } else {
2701
+ FILE *out;
2702
+ if (output == NULL)
2703
+ out = stdout;
2704
+ else {
2705
+ out = fopen(output,"wb");
2706
+ }
2707
+ if (out != NULL) {
2708
+ xmlDebugDumpDocument(out, doc);
2709
+
2710
+ if (output != NULL)
2711
+ fclose(out);
2712
+ } else {
2713
+ fprintf(stderr, "failed to open %s\n", output);
2714
+ progresult = XMLLINT_ERR_OUT;
2715
+ }
2716
+ }
2717
+ #endif
2718
+ }
2719
+ #endif /* LIBXML_OUTPUT_ENABLED */
2720
+
2721
+ #ifdef LIBXML_VALID_ENABLED
2722
+ /*
2723
+ * A posteriori validation test
2724
+ */
2725
+ if ((dtdvalid != NULL) || (dtdvalidfpi != NULL)) {
2726
+ xmlDtdPtr dtd;
2727
+
2728
+ if ((timing) && (!repeat)) {
2729
+ startTimer();
2730
+ }
2731
+ if (dtdvalid != NULL)
2732
+ dtd = xmlParseDTD(NULL, (const xmlChar *)dtdvalid);
2733
+ else
2734
+ dtd = xmlParseDTD((const xmlChar *)dtdvalidfpi, NULL);
2735
+ if ((timing) && (!repeat)) {
2736
+ endTimer("Parsing DTD");
2737
+ }
2738
+ if (dtd == NULL) {
2739
+ if (dtdvalid != NULL)
2740
+ xmlGenericError(xmlGenericErrorContext,
2741
+ "Could not parse DTD %s\n", dtdvalid);
2742
+ else
2743
+ xmlGenericError(xmlGenericErrorContext,
2744
+ "Could not parse DTD %s\n", dtdvalidfpi);
2745
+ progresult = XMLLINT_ERR_DTD;
2746
+ } else {
2747
+ xmlValidCtxtPtr cvp;
2748
+
2749
+ if ((cvp = xmlNewValidCtxt()) == NULL) {
2750
+ xmlGenericError(xmlGenericErrorContext,
2751
+ "Couldn't allocate validation context\n");
2752
+ exit(-1);
2753
+ }
2754
+ cvp->userData = (void *) stderr;
2755
+ cvp->error = (xmlValidityErrorFunc) fprintf;
2756
+ cvp->warning = (xmlValidityWarningFunc) fprintf;
2757
+
2758
+ if ((timing) && (!repeat)) {
2759
+ startTimer();
2760
+ }
2761
+ if (!xmlValidateDtd(cvp, doc, dtd)) {
2762
+ if (dtdvalid != NULL)
2763
+ xmlGenericError(xmlGenericErrorContext,
2764
+ "Document %s does not validate against %s\n",
2765
+ filename, dtdvalid);
2766
+ else
2767
+ xmlGenericError(xmlGenericErrorContext,
2768
+ "Document %s does not validate against %s\n",
2769
+ filename, dtdvalidfpi);
2770
+ progresult = XMLLINT_ERR_VALID;
2771
+ }
2772
+ if ((timing) && (!repeat)) {
2773
+ endTimer("Validating against DTD");
2774
+ }
2775
+ xmlFreeValidCtxt(cvp);
2776
+ xmlFreeDtd(dtd);
2777
+ }
2778
+ } else if (postvalid) {
2779
+ xmlValidCtxtPtr cvp;
2780
+
2781
+ if ((cvp = xmlNewValidCtxt()) == NULL) {
2782
+ xmlGenericError(xmlGenericErrorContext,
2783
+ "Couldn't allocate validation context\n");
2784
+ exit(-1);
2785
+ }
2786
+
2787
+ if ((timing) && (!repeat)) {
2788
+ startTimer();
2789
+ }
2790
+ cvp->userData = (void *) stderr;
2791
+ cvp->error = (xmlValidityErrorFunc) fprintf;
2792
+ cvp->warning = (xmlValidityWarningFunc) fprintf;
2793
+ if (!xmlValidateDocument(cvp, doc)) {
2794
+ xmlGenericError(xmlGenericErrorContext,
2795
+ "Document %s does not validate\n", filename);
2796
+ progresult = XMLLINT_ERR_VALID;
2797
+ }
2798
+ if ((timing) && (!repeat)) {
2799
+ endTimer("Validating");
2800
+ }
2801
+ xmlFreeValidCtxt(cvp);
2802
+ }
2803
+ #endif /* LIBXML_VALID_ENABLED */
2804
+ #ifdef LIBXML_SCHEMATRON_ENABLED
2805
+ if (wxschematron != NULL) {
2806
+ xmlSchematronValidCtxtPtr ctxt;
2807
+ int ret;
2808
+ int flag;
2809
+
2810
+ if ((timing) && (!repeat)) {
2811
+ startTimer();
2812
+ }
2813
+
2814
+ if (debug)
2815
+ flag = XML_SCHEMATRON_OUT_XML;
2816
+ else
2817
+ flag = XML_SCHEMATRON_OUT_TEXT;
2818
+ if (noout)
2819
+ flag |= XML_SCHEMATRON_OUT_QUIET;
2820
+ ctxt = xmlSchematronNewValidCtxt(wxschematron, flag);
2821
+ #if 0
2822
+ xmlSchematronSetValidErrors(ctxt,
2823
+ (xmlSchematronValidityErrorFunc) fprintf,
2824
+ (xmlSchematronValidityWarningFunc) fprintf,
2825
+ stderr);
2826
+ #endif
2827
+ ret = xmlSchematronValidateDoc(ctxt, doc);
2828
+ if (ret == 0) {
2829
+ fprintf(stderr, "%s validates\n", filename);
2830
+ } else if (ret > 0) {
2831
+ fprintf(stderr, "%s fails to validate\n", filename);
2832
+ progresult = XMLLINT_ERR_VALID;
2833
+ } else {
2834
+ fprintf(stderr, "%s validation generated an internal error\n",
2835
+ filename);
2836
+ progresult = XMLLINT_ERR_VALID;
2837
+ }
2838
+ xmlSchematronFreeValidCtxt(ctxt);
2839
+ if ((timing) && (!repeat)) {
2840
+ endTimer("Validating");
2841
+ }
2842
+ }
2843
+ #endif
2844
+ #ifdef LIBXML_SCHEMAS_ENABLED
2845
+ if (relaxngschemas != NULL) {
2846
+ xmlRelaxNGValidCtxtPtr ctxt;
2847
+ int ret;
2848
+
2849
+ if ((timing) && (!repeat)) {
2850
+ startTimer();
2851
+ }
2852
+
2853
+ ctxt = xmlRelaxNGNewValidCtxt(relaxngschemas);
2854
+ xmlRelaxNGSetValidErrors(ctxt,
2855
+ (xmlRelaxNGValidityErrorFunc) fprintf,
2856
+ (xmlRelaxNGValidityWarningFunc) fprintf,
2857
+ stderr);
2858
+ ret = xmlRelaxNGValidateDoc(ctxt, doc);
2859
+ if (ret == 0) {
2860
+ fprintf(stderr, "%s validates\n", filename);
2861
+ } else if (ret > 0) {
2862
+ fprintf(stderr, "%s fails to validate\n", filename);
2863
+ progresult = XMLLINT_ERR_VALID;
2864
+ } else {
2865
+ fprintf(stderr, "%s validation generated an internal error\n",
2866
+ filename);
2867
+ progresult = XMLLINT_ERR_VALID;
2868
+ }
2869
+ xmlRelaxNGFreeValidCtxt(ctxt);
2870
+ if ((timing) && (!repeat)) {
2871
+ endTimer("Validating");
2872
+ }
2873
+ } else if (wxschemas != NULL) {
2874
+ xmlSchemaValidCtxtPtr ctxt;
2875
+ int ret;
2876
+
2877
+ if ((timing) && (!repeat)) {
2878
+ startTimer();
2879
+ }
2880
+
2881
+ ctxt = xmlSchemaNewValidCtxt(wxschemas);
2882
+ xmlSchemaSetValidErrors(ctxt,
2883
+ (xmlSchemaValidityErrorFunc) fprintf,
2884
+ (xmlSchemaValidityWarningFunc) fprintf,
2885
+ stderr);
2886
+ ret = xmlSchemaValidateDoc(ctxt, doc);
2887
+ if (ret == 0) {
2888
+ fprintf(stderr, "%s validates\n", filename);
2889
+ } else if (ret > 0) {
2890
+ fprintf(stderr, "%s fails to validate\n", filename);
2891
+ progresult = XMLLINT_ERR_VALID;
2892
+ } else {
2893
+ fprintf(stderr, "%s validation generated an internal error\n",
2894
+ filename);
2895
+ progresult = XMLLINT_ERR_VALID;
2896
+ }
2897
+ xmlSchemaFreeValidCtxt(ctxt);
2898
+ if ((timing) && (!repeat)) {
2899
+ endTimer("Validating");
2900
+ }
2901
+ }
2902
+ #endif
2903
+
2904
+ #ifdef LIBXML_DEBUG_ENABLED
2905
+ #if defined(LIBXML_HTML_ENABLED) || defined(LIBXML_VALID_ENABLED)
2906
+ if ((debugent) && (!html))
2907
+ xmlDebugDumpEntities(stderr, doc);
2908
+ #endif
2909
+ #endif
2910
+
2911
+ /*
2912
+ * free it.
2913
+ */
2914
+ if ((timing) && (!repeat)) {
2915
+ startTimer();
2916
+ }
2917
+ xmlFreeDoc(doc);
2918
+ if ((timing) && (!repeat)) {
2919
+ endTimer("Freeing");
2920
+ }
2921
+ }
2922
+
2923
+ /************************************************************************
2924
+ * *
2925
+ * Usage and Main *
2926
+ * *
2927
+ ************************************************************************/
2928
+
2929
+ static void showVersion(const char *name) {
2930
+ fprintf(stderr, "%s: using libxml version %s\n", name, xmlParserVersion);
2931
+ fprintf(stderr, " compiled with: ");
2932
+ if (xmlHasFeature(XML_WITH_THREAD)) fprintf(stderr, "Threads ");
2933
+ if (xmlHasFeature(XML_WITH_TREE)) fprintf(stderr, "Tree ");
2934
+ if (xmlHasFeature(XML_WITH_OUTPUT)) fprintf(stderr, "Output ");
2935
+ if (xmlHasFeature(XML_WITH_PUSH)) fprintf(stderr, "Push ");
2936
+ if (xmlHasFeature(XML_WITH_READER)) fprintf(stderr, "Reader ");
2937
+ if (xmlHasFeature(XML_WITH_PATTERN)) fprintf(stderr, "Patterns ");
2938
+ if (xmlHasFeature(XML_WITH_WRITER)) fprintf(stderr, "Writer ");
2939
+ if (xmlHasFeature(XML_WITH_SAX1)) fprintf(stderr, "SAXv1 ");
2940
+ if (xmlHasFeature(XML_WITH_FTP)) fprintf(stderr, "FTP ");
2941
+ if (xmlHasFeature(XML_WITH_HTTP)) fprintf(stderr, "HTTP ");
2942
+ if (xmlHasFeature(XML_WITH_VALID)) fprintf(stderr, "DTDValid ");
2943
+ if (xmlHasFeature(XML_WITH_HTML)) fprintf(stderr, "HTML ");
2944
+ if (xmlHasFeature(XML_WITH_LEGACY)) fprintf(stderr, "Legacy ");
2945
+ if (xmlHasFeature(XML_WITH_C14N)) fprintf(stderr, "C14N ");
2946
+ if (xmlHasFeature(XML_WITH_CATALOG)) fprintf(stderr, "Catalog ");
2947
+ if (xmlHasFeature(XML_WITH_XPATH)) fprintf(stderr, "XPath ");
2948
+ if (xmlHasFeature(XML_WITH_XPTR)) fprintf(stderr, "XPointer ");
2949
+ if (xmlHasFeature(XML_WITH_XINCLUDE)) fprintf(stderr, "XInclude ");
2950
+ if (xmlHasFeature(XML_WITH_ICONV)) fprintf(stderr, "Iconv ");
2951
+ if (xmlHasFeature(XML_WITH_ISO8859X)) fprintf(stderr, "ISO8859X ");
2952
+ if (xmlHasFeature(XML_WITH_UNICODE)) fprintf(stderr, "Unicode ");
2953
+ if (xmlHasFeature(XML_WITH_REGEXP)) fprintf(stderr, "Regexps ");
2954
+ if (xmlHasFeature(XML_WITH_AUTOMATA)) fprintf(stderr, "Automata ");
2955
+ if (xmlHasFeature(XML_WITH_EXPR)) fprintf(stderr, "Expr ");
2956
+ if (xmlHasFeature(XML_WITH_SCHEMAS)) fprintf(stderr, "Schemas ");
2957
+ if (xmlHasFeature(XML_WITH_SCHEMATRON)) fprintf(stderr, "Schematron ");
2958
+ if (xmlHasFeature(XML_WITH_MODULES)) fprintf(stderr, "Modules ");
2959
+ if (xmlHasFeature(XML_WITH_DEBUG)) fprintf(stderr, "Debug ");
2960
+ if (xmlHasFeature(XML_WITH_DEBUG_MEM)) fprintf(stderr, "MemDebug ");
2961
+ if (xmlHasFeature(XML_WITH_DEBUG_RUN)) fprintf(stderr, "RunDebug ");
2962
+ if (xmlHasFeature(XML_WITH_ZLIB)) fprintf(stderr, "Zlib ");
2963
+ if (xmlHasFeature(XML_WITH_LZMA)) fprintf(stderr, "Lzma ");
2964
+ fprintf(stderr, "\n");
2965
+ }
2966
+
2967
+ static void usage(const char *name) {
2968
+ printf("Usage : %s [options] XMLfiles ...\n", name);
2969
+ #ifdef LIBXML_OUTPUT_ENABLED
2970
+ printf("\tParse the XML files and output the result of the parsing\n");
2971
+ #else
2972
+ printf("\tParse the XML files\n");
2973
+ #endif /* LIBXML_OUTPUT_ENABLED */
2974
+ printf("\t--version : display the version of the XML library used\n");
2975
+ #ifdef LIBXML_DEBUG_ENABLED
2976
+ printf("\t--debug : dump a debug tree of the in-memory document\n");
2977
+ printf("\t--shell : run a navigating shell\n");
2978
+ printf("\t--debugent : debug the entities defined in the document\n");
2979
+ #else
2980
+ #ifdef LIBXML_READER_ENABLED
2981
+ printf("\t--debug : dump the nodes content when using --stream\n");
2982
+ #endif /* LIBXML_READER_ENABLED */
2983
+ #endif
2984
+ #ifdef LIBXML_TREE_ENABLED
2985
+ printf("\t--copy : used to test the internal copy implementation\n");
2986
+ #endif /* LIBXML_TREE_ENABLED */
2987
+ printf("\t--recover : output what was parsable on broken XML documents\n");
2988
+ printf("\t--huge : remove any internal arbitrary parser limits\n");
2989
+ printf("\t--noent : substitute entity references by their value\n");
2990
+ printf("\t--noenc : ignore any encoding specified inside the document\n");
2991
+ printf("\t--noout : don't output the result tree\n");
2992
+ printf("\t--path 'paths': provide a set of paths for resources\n");
2993
+ printf("\t--load-trace : print trace of all external entites loaded\n");
2994
+ printf("\t--nonet : refuse to fetch DTDs or entities over network\n");
2995
+ printf("\t--nocompact : do not generate compact text nodes\n");
2996
+ printf("\t--htmlout : output results as HTML\n");
2997
+ printf("\t--nowrap : do not put HTML doc wrapper\n");
2998
+ #ifdef LIBXML_VALID_ENABLED
2999
+ printf("\t--valid : validate the document in addition to std well-formed check\n");
3000
+ printf("\t--postvalid : do a posteriori validation, i.e after parsing\n");
3001
+ printf("\t--dtdvalid URL : do a posteriori validation against a given DTD\n");
3002
+ printf("\t--dtdvalidfpi FPI : same but name the DTD with a Public Identifier\n");
3003
+ #endif /* LIBXML_VALID_ENABLED */
3004
+ printf("\t--timing : print some timings\n");
3005
+ printf("\t--output file or -o file: save to a given file\n");
3006
+ printf("\t--repeat : repeat 100 times, for timing or profiling\n");
3007
+ printf("\t--insert : ad-hoc test for valid insertions\n");
3008
+ #ifdef LIBXML_OUTPUT_ENABLED
3009
+ #ifdef HAVE_ZLIB_H
3010
+ printf("\t--compress : turn on gzip compression of output\n");
3011
+ #endif
3012
+ #endif /* LIBXML_OUTPUT_ENABLED */
3013
+ #ifdef LIBXML_HTML_ENABLED
3014
+ printf("\t--html : use the HTML parser\n");
3015
+ printf("\t--xmlout : force to use the XML serializer when using --html\n");
3016
+ printf("\t--nodefdtd : do not default HTML doctype\n");
3017
+ #endif
3018
+ #ifdef LIBXML_PUSH_ENABLED
3019
+ printf("\t--push : use the push mode of the parser\n");
3020
+ #endif /* LIBXML_PUSH_ENABLED */
3021
+ #ifdef HAVE_MMAP
3022
+ printf("\t--memory : parse from memory\n");
3023
+ #endif
3024
+ printf("\t--maxmem nbbytes : limits memory allocation to nbbytes bytes\n");
3025
+ printf("\t--nowarning : do not emit warnings from parser/validator\n");
3026
+ printf("\t--noblanks : drop (ignorable?) blanks spaces\n");
3027
+ printf("\t--nocdata : replace cdata section with text nodes\n");
3028
+ #ifdef LIBXML_OUTPUT_ENABLED
3029
+ printf("\t--format : reformat/reindent the input\n");
3030
+ printf("\t--encode encoding : output in the given encoding\n");
3031
+ printf("\t--dropdtd : remove the DOCTYPE of the input docs\n");
3032
+ printf("\t--pretty STYLE : pretty-print in a particular style\n");
3033
+ printf("\t 0 Do not pretty print\n");
3034
+ printf("\t 1 Format the XML content, as --format\n");
3035
+ printf("\t 2 Add whitespace inside tags, preserving content\n");
3036
+ #endif /* LIBXML_OUTPUT_ENABLED */
3037
+ printf("\t--c14n : save in W3C canonical format v1.0 (with comments)\n");
3038
+ printf("\t--c14n11 : save in W3C canonical format v1.1 (with comments)\n");
3039
+ printf("\t--exc-c14n : save in W3C exclusive canonical format (with comments)\n");
3040
+ #ifdef LIBXML_C14N_ENABLED
3041
+ #endif /* LIBXML_C14N_ENABLED */
3042
+ printf("\t--nsclean : remove redundant namespace declarations\n");
3043
+ printf("\t--testIO : test user I/O support\n");
3044
+ #ifdef LIBXML_CATALOG_ENABLED
3045
+ printf("\t--catalogs : use SGML catalogs from $SGML_CATALOG_FILES\n");
3046
+ printf("\t otherwise XML Catalogs starting from \n");
3047
+ printf("\t %s are activated by default\n", XML_XML_DEFAULT_CATALOG);
3048
+ printf("\t--nocatalogs: deactivate all catalogs\n");
3049
+ #endif
3050
+ printf("\t--auto : generate a small doc on the fly\n");
3051
+ #ifdef LIBXML_XINCLUDE_ENABLED
3052
+ printf("\t--xinclude : do XInclude processing\n");
3053
+ printf("\t--noxincludenode : same but do not generate XInclude nodes\n");
3054
+ printf("\t--nofixup-base-uris : do not fixup xml:base uris\n");
3055
+ #endif
3056
+ printf("\t--loaddtd : fetch external DTD\n");
3057
+ printf("\t--dtdattr : loaddtd + populate the tree with inherited attributes \n");
3058
+ #ifdef LIBXML_READER_ENABLED
3059
+ printf("\t--stream : use the streaming interface to process very large files\n");
3060
+ printf("\t--walker : create a reader and walk though the resulting doc\n");
3061
+ #endif /* LIBXML_READER_ENABLED */
3062
+ #ifdef LIBXML_PATTERN_ENABLED
3063
+ printf("\t--pattern pattern_value : test the pattern support\n");
3064
+ #endif
3065
+ printf("\t--chkregister : verify the node registration code\n");
3066
+ #ifdef LIBXML_SCHEMAS_ENABLED
3067
+ printf("\t--relaxng schema : do RelaxNG validation against the schema\n");
3068
+ printf("\t--schema schema : do validation against the WXS schema\n");
3069
+ #endif
3070
+ #ifdef LIBXML_SCHEMATRON_ENABLED
3071
+ printf("\t--schematron schema : do validation against a schematron\n");
3072
+ #endif
3073
+ #ifdef LIBXML_SAX1_ENABLED
3074
+ printf("\t--sax1: use the old SAX1 interfaces for processing\n");
3075
+ #endif
3076
+ printf("\t--sax: do not build a tree but work just at the SAX level\n");
3077
+ printf("\t--oldxml10: use XML-1.0 parsing rules before the 5th edition\n");
3078
+ #ifdef LIBXML_XPATH_ENABLED
3079
+ printf("\t--xpath expr: evaluate the XPath expression, inply --noout\n");
3080
+ #endif
3081
+
3082
+ printf("\nLibxml project home page: http://xmlsoft.org/\n");
3083
+ printf("To report bugs or get some help check: http://xmlsoft.org/bugs.html\n");
3084
+ }
3085
+
3086
+ static void registerNode(xmlNodePtr node)
3087
+ {
3088
+ node->_private = malloc(sizeof(long));
3089
+ *(long*)node->_private = (long) 0x81726354;
3090
+ nbregister++;
3091
+ }
3092
+
3093
+ static void deregisterNode(xmlNodePtr node)
3094
+ {
3095
+ assert(node->_private != NULL);
3096
+ assert(*(long*)node->_private == (long) 0x81726354);
3097
+ free(node->_private);
3098
+ nbregister--;
3099
+ }
3100
+
3101
+ int
3102
+ main(int argc, char **argv) {
3103
+ int i, acount;
3104
+ int files = 0;
3105
+ int version = 0;
3106
+ const char* indent;
3107
+
3108
+ if (argc <= 1) {
3109
+ usage(argv[0]);
3110
+ return(1);
3111
+ }
3112
+ LIBXML_TEST_VERSION
3113
+ for (i = 1; i < argc ; i++) {
3114
+ if (!strcmp(argv[i], "-"))
3115
+ break;
3116
+
3117
+ if (argv[i][0] != '-')
3118
+ continue;
3119
+ if ((!strcmp(argv[i], "-debug")) || (!strcmp(argv[i], "--debug")))
3120
+ debug++;
3121
+ else
3122
+ #ifdef LIBXML_DEBUG_ENABLED
3123
+ if ((!strcmp(argv[i], "-shell")) ||
3124
+ (!strcmp(argv[i], "--shell"))) {
3125
+ shell++;
3126
+ noout = 1;
3127
+ } else
3128
+ #endif
3129
+ #ifdef LIBXML_TREE_ENABLED
3130
+ if ((!strcmp(argv[i], "-copy")) || (!strcmp(argv[i], "--copy")))
3131
+ copy++;
3132
+ else
3133
+ #endif /* LIBXML_TREE_ENABLED */
3134
+ if ((!strcmp(argv[i], "-recover")) ||
3135
+ (!strcmp(argv[i], "--recover"))) {
3136
+ recovery++;
3137
+ options |= XML_PARSE_RECOVER;
3138
+ } else if ((!strcmp(argv[i], "-huge")) ||
3139
+ (!strcmp(argv[i], "--huge"))) {
3140
+ options |= XML_PARSE_HUGE;
3141
+ } else if ((!strcmp(argv[i], "-noent")) ||
3142
+ (!strcmp(argv[i], "--noent"))) {
3143
+ noent++;
3144
+ options |= XML_PARSE_NOENT;
3145
+ } else if ((!strcmp(argv[i], "-noenc")) ||
3146
+ (!strcmp(argv[i], "--noenc"))) {
3147
+ noenc++;
3148
+ options |= XML_PARSE_IGNORE_ENC;
3149
+ } else if ((!strcmp(argv[i], "-nsclean")) ||
3150
+ (!strcmp(argv[i], "--nsclean"))) {
3151
+ options |= XML_PARSE_NSCLEAN;
3152
+ } else if ((!strcmp(argv[i], "-nocdata")) ||
3153
+ (!strcmp(argv[i], "--nocdata"))) {
3154
+ options |= XML_PARSE_NOCDATA;
3155
+ } else if ((!strcmp(argv[i], "-nodict")) ||
3156
+ (!strcmp(argv[i], "--nodict"))) {
3157
+ options |= XML_PARSE_NODICT;
3158
+ } else if ((!strcmp(argv[i], "-version")) ||
3159
+ (!strcmp(argv[i], "--version"))) {
3160
+ showVersion(argv[0]);
3161
+ version = 1;
3162
+ } else if ((!strcmp(argv[i], "-noout")) ||
3163
+ (!strcmp(argv[i], "--noout")))
3164
+ noout++;
3165
+ #ifdef LIBXML_OUTPUT_ENABLED
3166
+ else if ((!strcmp(argv[i], "-o")) ||
3167
+ (!strcmp(argv[i], "-output")) ||
3168
+ (!strcmp(argv[i], "--output"))) {
3169
+ i++;
3170
+ output = argv[i];
3171
+ }
3172
+ #endif /* LIBXML_OUTPUT_ENABLED */
3173
+ else if ((!strcmp(argv[i], "-htmlout")) ||
3174
+ (!strcmp(argv[i], "--htmlout")))
3175
+ htmlout++;
3176
+ else if ((!strcmp(argv[i], "-nowrap")) ||
3177
+ (!strcmp(argv[i], "--nowrap")))
3178
+ nowrap++;
3179
+ #ifdef LIBXML_HTML_ENABLED
3180
+ else if ((!strcmp(argv[i], "-html")) ||
3181
+ (!strcmp(argv[i], "--html"))) {
3182
+ html++;
3183
+ }
3184
+ else if ((!strcmp(argv[i], "-xmlout")) ||
3185
+ (!strcmp(argv[i], "--xmlout"))) {
3186
+ xmlout++;
3187
+ } else if ((!strcmp(argv[i], "-nodefdtd")) ||
3188
+ (!strcmp(argv[i], "--nodefdtd"))) {
3189
+ nodefdtd++;
3190
+ options |= HTML_PARSE_NODEFDTD;
3191
+ }
3192
+ #endif /* LIBXML_HTML_ENABLED */
3193
+ else if ((!strcmp(argv[i], "-loaddtd")) ||
3194
+ (!strcmp(argv[i], "--loaddtd"))) {
3195
+ loaddtd++;
3196
+ options |= XML_PARSE_DTDLOAD;
3197
+ } else if ((!strcmp(argv[i], "-dtdattr")) ||
3198
+ (!strcmp(argv[i], "--dtdattr"))) {
3199
+ loaddtd++;
3200
+ dtdattrs++;
3201
+ options |= XML_PARSE_DTDATTR;
3202
+ }
3203
+ #ifdef LIBXML_VALID_ENABLED
3204
+ else if ((!strcmp(argv[i], "-valid")) ||
3205
+ (!strcmp(argv[i], "--valid"))) {
3206
+ valid++;
3207
+ options |= XML_PARSE_DTDVALID;
3208
+ } else if ((!strcmp(argv[i], "-postvalid")) ||
3209
+ (!strcmp(argv[i], "--postvalid"))) {
3210
+ postvalid++;
3211
+ loaddtd++;
3212
+ options |= XML_PARSE_DTDLOAD;
3213
+ } else if ((!strcmp(argv[i], "-dtdvalid")) ||
3214
+ (!strcmp(argv[i], "--dtdvalid"))) {
3215
+ i++;
3216
+ dtdvalid = argv[i];
3217
+ loaddtd++;
3218
+ options |= XML_PARSE_DTDLOAD;
3219
+ } else if ((!strcmp(argv[i], "-dtdvalidfpi")) ||
3220
+ (!strcmp(argv[i], "--dtdvalidfpi"))) {
3221
+ i++;
3222
+ dtdvalidfpi = argv[i];
3223
+ loaddtd++;
3224
+ options |= XML_PARSE_DTDLOAD;
3225
+ }
3226
+ #endif /* LIBXML_VALID_ENABLED */
3227
+ else if ((!strcmp(argv[i], "-dropdtd")) ||
3228
+ (!strcmp(argv[i], "--dropdtd")))
3229
+ dropdtd++;
3230
+ else if ((!strcmp(argv[i], "-insert")) ||
3231
+ (!strcmp(argv[i], "--insert")))
3232
+ insert++;
3233
+ else if ((!strcmp(argv[i], "-timing")) ||
3234
+ (!strcmp(argv[i], "--timing")))
3235
+ timing++;
3236
+ else if ((!strcmp(argv[i], "-auto")) ||
3237
+ (!strcmp(argv[i], "--auto")))
3238
+ generate++;
3239
+ else if ((!strcmp(argv[i], "-repeat")) ||
3240
+ (!strcmp(argv[i], "--repeat"))) {
3241
+ if (repeat)
3242
+ repeat *= 10;
3243
+ else
3244
+ repeat = 100;
3245
+ }
3246
+ #ifdef LIBXML_PUSH_ENABLED
3247
+ else if ((!strcmp(argv[i], "-push")) ||
3248
+ (!strcmp(argv[i], "--push")))
3249
+ push++;
3250
+ #endif /* LIBXML_PUSH_ENABLED */
3251
+ #ifdef HAVE_MMAP
3252
+ else if ((!strcmp(argv[i], "-memory")) ||
3253
+ (!strcmp(argv[i], "--memory")))
3254
+ memory++;
3255
+ #endif
3256
+ else if ((!strcmp(argv[i], "-testIO")) ||
3257
+ (!strcmp(argv[i], "--testIO")))
3258
+ testIO++;
3259
+ #ifdef LIBXML_XINCLUDE_ENABLED
3260
+ else if ((!strcmp(argv[i], "-xinclude")) ||
3261
+ (!strcmp(argv[i], "--xinclude"))) {
3262
+ xinclude++;
3263
+ options |= XML_PARSE_XINCLUDE;
3264
+ }
3265
+ else if ((!strcmp(argv[i], "-noxincludenode")) ||
3266
+ (!strcmp(argv[i], "--noxincludenode"))) {
3267
+ xinclude++;
3268
+ options |= XML_PARSE_XINCLUDE;
3269
+ options |= XML_PARSE_NOXINCNODE;
3270
+ }
3271
+ else if ((!strcmp(argv[i], "-nofixup-base-uris")) ||
3272
+ (!strcmp(argv[i], "--nofixup-base-uris"))) {
3273
+ xinclude++;
3274
+ options |= XML_PARSE_XINCLUDE;
3275
+ options |= XML_PARSE_NOBASEFIX;
3276
+ }
3277
+ #endif
3278
+ #ifdef LIBXML_OUTPUT_ENABLED
3279
+ #ifdef HAVE_ZLIB_H
3280
+ else if ((!strcmp(argv[i], "-compress")) ||
3281
+ (!strcmp(argv[i], "--compress"))) {
3282
+ compress++;
3283
+ xmlSetCompressMode(9);
3284
+ }
3285
+ #endif
3286
+ #endif /* LIBXML_OUTPUT_ENABLED */
3287
+ else if ((!strcmp(argv[i], "-nowarning")) ||
3288
+ (!strcmp(argv[i], "--nowarning"))) {
3289
+ xmlGetWarningsDefaultValue = 0;
3290
+ xmlPedanticParserDefault(0);
3291
+ options |= XML_PARSE_NOWARNING;
3292
+ }
3293
+ else if ((!strcmp(argv[i], "-pedantic")) ||
3294
+ (!strcmp(argv[i], "--pedantic"))) {
3295
+ xmlGetWarningsDefaultValue = 1;
3296
+ xmlPedanticParserDefault(1);
3297
+ options |= XML_PARSE_PEDANTIC;
3298
+ }
3299
+ #ifdef LIBXML_DEBUG_ENABLED
3300
+ else if ((!strcmp(argv[i], "-debugent")) ||
3301
+ (!strcmp(argv[i], "--debugent"))) {
3302
+ debugent++;
3303
+ xmlParserDebugEntities = 1;
3304
+ }
3305
+ #endif
3306
+ #ifdef LIBXML_C14N_ENABLED
3307
+ else if ((!strcmp(argv[i], "-c14n")) ||
3308
+ (!strcmp(argv[i], "--c14n"))) {
3309
+ canonical++;
3310
+ options |= XML_PARSE_NOENT | XML_PARSE_DTDATTR | XML_PARSE_DTDLOAD;
3311
+ }
3312
+ else if ((!strcmp(argv[i], "-c14n11")) ||
3313
+ (!strcmp(argv[i], "--c14n11"))) {
3314
+ canonical_11++;
3315
+ options |= XML_PARSE_NOENT | XML_PARSE_DTDATTR | XML_PARSE_DTDLOAD;
3316
+ }
3317
+ else if ((!strcmp(argv[i], "-exc-c14n")) ||
3318
+ (!strcmp(argv[i], "--exc-c14n"))) {
3319
+ exc_canonical++;
3320
+ options |= XML_PARSE_NOENT | XML_PARSE_DTDATTR | XML_PARSE_DTDLOAD;
3321
+ }
3322
+ #endif
3323
+ #ifdef LIBXML_CATALOG_ENABLED
3324
+ else if ((!strcmp(argv[i], "-catalogs")) ||
3325
+ (!strcmp(argv[i], "--catalogs"))) {
3326
+ catalogs++;
3327
+ } else if ((!strcmp(argv[i], "-nocatalogs")) ||
3328
+ (!strcmp(argv[i], "--nocatalogs"))) {
3329
+ nocatalogs++;
3330
+ }
3331
+ #endif
3332
+ else if ((!strcmp(argv[i], "-encode")) ||
3333
+ (!strcmp(argv[i], "--encode"))) {
3334
+ i++;
3335
+ encoding = argv[i];
3336
+ /*
3337
+ * OK it's for testing purposes
3338
+ */
3339
+ xmlAddEncodingAlias("UTF-8", "DVEnc");
3340
+ }
3341
+ else if ((!strcmp(argv[i], "-noblanks")) ||
3342
+ (!strcmp(argv[i], "--noblanks"))) {
3343
+ noblanks++;
3344
+ xmlKeepBlanksDefault(0);
3345
+ options |= XML_PARSE_NOBLANKS;
3346
+ }
3347
+ else if ((!strcmp(argv[i], "-maxmem")) ||
3348
+ (!strcmp(argv[i], "--maxmem"))) {
3349
+ i++;
3350
+ if (sscanf(argv[i], "%d", &maxmem) == 1) {
3351
+ xmlMemSetup(myFreeFunc, myMallocFunc, myReallocFunc,
3352
+ myStrdupFunc);
3353
+ } else {
3354
+ maxmem = 0;
3355
+ }
3356
+ }
3357
+ else if ((!strcmp(argv[i], "-format")) ||
3358
+ (!strcmp(argv[i], "--format"))) {
3359
+ noblanks++;
3360
+ #ifdef LIBXML_OUTPUT_ENABLED
3361
+ format = 1;
3362
+ #endif /* LIBXML_OUTPUT_ENABLED */
3363
+ xmlKeepBlanksDefault(0);
3364
+ }
3365
+ else if ((!strcmp(argv[i], "-pretty")) ||
3366
+ (!strcmp(argv[i], "--pretty"))) {
3367
+ i++;
3368
+ #ifdef LIBXML_OUTPUT_ENABLED
3369
+ format = atoi(argv[i]);
3370
+ if (format == 1) {
3371
+ noblanks++;
3372
+ xmlKeepBlanksDefault(0);
3373
+ }
3374
+ #endif /* LIBXML_OUTPUT_ENABLED */
3375
+ }
3376
+ #ifdef LIBXML_READER_ENABLED
3377
+ else if ((!strcmp(argv[i], "-stream")) ||
3378
+ (!strcmp(argv[i], "--stream"))) {
3379
+ stream++;
3380
+ }
3381
+ else if ((!strcmp(argv[i], "-walker")) ||
3382
+ (!strcmp(argv[i], "--walker"))) {
3383
+ walker++;
3384
+ noout++;
3385
+ }
3386
+ #endif /* LIBXML_READER_ENABLED */
3387
+ #ifdef LIBXML_SAX1_ENABLED
3388
+ else if ((!strcmp(argv[i], "-sax1")) ||
3389
+ (!strcmp(argv[i], "--sax1"))) {
3390
+ sax1++;
3391
+ options |= XML_PARSE_SAX1;
3392
+ }
3393
+ #endif /* LIBXML_SAX1_ENABLED */
3394
+ else if ((!strcmp(argv[i], "-sax")) ||
3395
+ (!strcmp(argv[i], "--sax"))) {
3396
+ sax++;
3397
+ }
3398
+ else if ((!strcmp(argv[i], "-chkregister")) ||
3399
+ (!strcmp(argv[i], "--chkregister"))) {
3400
+ chkregister++;
3401
+ #ifdef LIBXML_SCHEMAS_ENABLED
3402
+ } else if ((!strcmp(argv[i], "-relaxng")) ||
3403
+ (!strcmp(argv[i], "--relaxng"))) {
3404
+ i++;
3405
+ relaxng = argv[i];
3406
+ noent++;
3407
+ options |= XML_PARSE_NOENT;
3408
+ } else if ((!strcmp(argv[i], "-schema")) ||
3409
+ (!strcmp(argv[i], "--schema"))) {
3410
+ i++;
3411
+ schema = argv[i];
3412
+ noent++;
3413
+ #endif
3414
+ #ifdef LIBXML_SCHEMATRON_ENABLED
3415
+ } else if ((!strcmp(argv[i], "-schematron")) ||
3416
+ (!strcmp(argv[i], "--schematron"))) {
3417
+ i++;
3418
+ schematron = argv[i];
3419
+ noent++;
3420
+ #endif
3421
+ } else if ((!strcmp(argv[i], "-nonet")) ||
3422
+ (!strcmp(argv[i], "--nonet"))) {
3423
+ options |= XML_PARSE_NONET;
3424
+ xmlSetExternalEntityLoader(xmlNoNetExternalEntityLoader);
3425
+ } else if ((!strcmp(argv[i], "-nocompact")) ||
3426
+ (!strcmp(argv[i], "--nocompact"))) {
3427
+ options &= ~XML_PARSE_COMPACT;
3428
+ } else if ((!strcmp(argv[i], "-load-trace")) ||
3429
+ (!strcmp(argv[i], "--load-trace"))) {
3430
+ load_trace++;
3431
+ } else if ((!strcmp(argv[i], "-path")) ||
3432
+ (!strcmp(argv[i], "--path"))) {
3433
+ i++;
3434
+ parsePath(BAD_CAST argv[i]);
3435
+ #ifdef LIBXML_PATTERN_ENABLED
3436
+ } else if ((!strcmp(argv[i], "-pattern")) ||
3437
+ (!strcmp(argv[i], "--pattern"))) {
3438
+ i++;
3439
+ pattern = argv[i];
3440
+ #endif
3441
+ #ifdef LIBXML_XPATH_ENABLED
3442
+ } else if ((!strcmp(argv[i], "-xpath")) ||
3443
+ (!strcmp(argv[i], "--xpath"))) {
3444
+ i++;
3445
+ noout++;
3446
+ xpathquery = argv[i];
3447
+ #endif
3448
+ } else if ((!strcmp(argv[i], "-oldxml10")) ||
3449
+ (!strcmp(argv[i], "--oldxml10"))) {
3450
+ oldxml10++;
3451
+ options |= XML_PARSE_OLD10;
3452
+ } else {
3453
+ fprintf(stderr, "Unknown option %s\n", argv[i]);
3454
+ usage(argv[0]);
3455
+ return(1);
3456
+ }
3457
+ }
3458
+
3459
+ #ifdef LIBXML_CATALOG_ENABLED
3460
+ if (nocatalogs == 0) {
3461
+ if (catalogs) {
3462
+ const char *catal;
3463
+
3464
+ catal = getenv("SGML_CATALOG_FILES");
3465
+ if (catal != NULL) {
3466
+ xmlLoadCatalogs(catal);
3467
+ } else {
3468
+ fprintf(stderr, "Variable $SGML_CATALOG_FILES not set\n");
3469
+ }
3470
+ }
3471
+ }
3472
+ #endif
3473
+
3474
+ #ifdef LIBXML_SAX1_ENABLED
3475
+ if (sax1)
3476
+ xmlSAXDefaultVersion(1);
3477
+ else
3478
+ xmlSAXDefaultVersion(2);
3479
+ #endif /* LIBXML_SAX1_ENABLED */
3480
+
3481
+ if (chkregister) {
3482
+ xmlRegisterNodeDefault(registerNode);
3483
+ xmlDeregisterNodeDefault(deregisterNode);
3484
+ }
3485
+
3486
+ indent = getenv("XMLLINT_INDENT");
3487
+ if(indent != NULL) {
3488
+ xmlTreeIndentString = indent;
3489
+ }
3490
+
3491
+
3492
+ defaultEntityLoader = xmlGetExternalEntityLoader();
3493
+ xmlSetExternalEntityLoader(xmllintExternalEntityLoader);
3494
+
3495
+ xmlLineNumbersDefault(1);
3496
+ if (loaddtd != 0)
3497
+ xmlLoadExtDtdDefaultValue |= XML_DETECT_IDS;
3498
+ if (dtdattrs)
3499
+ xmlLoadExtDtdDefaultValue |= XML_COMPLETE_ATTRS;
3500
+ if (noent != 0) xmlSubstituteEntitiesDefault(1);
3501
+ #ifdef LIBXML_VALID_ENABLED
3502
+ if (valid != 0) xmlDoValidityCheckingDefaultValue = 1;
3503
+ #endif /* LIBXML_VALID_ENABLED */
3504
+ if ((htmlout) && (!nowrap)) {
3505
+ xmlGenericError(xmlGenericErrorContext,
3506
+ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\"\n");
3507
+ xmlGenericError(xmlGenericErrorContext,
3508
+ "\t\"http://www.w3.org/TR/REC-html40/loose.dtd\">\n");
3509
+ xmlGenericError(xmlGenericErrorContext,
3510
+ "<html><head><title>%s output</title></head>\n",
3511
+ argv[0]);
3512
+ xmlGenericError(xmlGenericErrorContext,
3513
+ "<body bgcolor=\"#ffffff\"><h1 align=\"center\">%s output</h1>\n",
3514
+ argv[0]);
3515
+ }
3516
+
3517
+ #ifdef LIBXML_SCHEMATRON_ENABLED
3518
+ if ((schematron != NULL) && (sax == 0)
3519
+ #ifdef LIBXML_READER_ENABLED
3520
+ && (stream == 0)
3521
+ #endif /* LIBXML_READER_ENABLED */
3522
+ ) {
3523
+ xmlSchematronParserCtxtPtr ctxt;
3524
+
3525
+ /* forces loading the DTDs */
3526
+ xmlLoadExtDtdDefaultValue |= 1;
3527
+ options |= XML_PARSE_DTDLOAD;
3528
+ if (timing) {
3529
+ startTimer();
3530
+ }
3531
+ ctxt = xmlSchematronNewParserCtxt(schematron);
3532
+ #if 0
3533
+ xmlSchematronSetParserErrors(ctxt,
3534
+ (xmlSchematronValidityErrorFunc) fprintf,
3535
+ (xmlSchematronValidityWarningFunc) fprintf,
3536
+ stderr);
3537
+ #endif
3538
+ wxschematron = xmlSchematronParse(ctxt);
3539
+ if (wxschematron == NULL) {
3540
+ xmlGenericError(xmlGenericErrorContext,
3541
+ "Schematron schema %s failed to compile\n", schematron);
3542
+ progresult = XMLLINT_ERR_SCHEMACOMP;
3543
+ schematron = NULL;
3544
+ }
3545
+ xmlSchematronFreeParserCtxt(ctxt);
3546
+ if (timing) {
3547
+ endTimer("Compiling the schemas");
3548
+ }
3549
+ }
3550
+ #endif
3551
+ #ifdef LIBXML_SCHEMAS_ENABLED
3552
+ if ((relaxng != NULL) && (sax == 0)
3553
+ #ifdef LIBXML_READER_ENABLED
3554
+ && (stream == 0)
3555
+ #endif /* LIBXML_READER_ENABLED */
3556
+ ) {
3557
+ xmlRelaxNGParserCtxtPtr ctxt;
3558
+
3559
+ /* forces loading the DTDs */
3560
+ xmlLoadExtDtdDefaultValue |= 1;
3561
+ options |= XML_PARSE_DTDLOAD;
3562
+ if (timing) {
3563
+ startTimer();
3564
+ }
3565
+ ctxt = xmlRelaxNGNewParserCtxt(relaxng);
3566
+ xmlRelaxNGSetParserErrors(ctxt,
3567
+ (xmlRelaxNGValidityErrorFunc) fprintf,
3568
+ (xmlRelaxNGValidityWarningFunc) fprintf,
3569
+ stderr);
3570
+ relaxngschemas = xmlRelaxNGParse(ctxt);
3571
+ if (relaxngschemas == NULL) {
3572
+ xmlGenericError(xmlGenericErrorContext,
3573
+ "Relax-NG schema %s failed to compile\n", relaxng);
3574
+ progresult = XMLLINT_ERR_SCHEMACOMP;
3575
+ relaxng = NULL;
3576
+ }
3577
+ xmlRelaxNGFreeParserCtxt(ctxt);
3578
+ if (timing) {
3579
+ endTimer("Compiling the schemas");
3580
+ }
3581
+ } else if ((schema != NULL)
3582
+ #ifdef LIBXML_READER_ENABLED
3583
+ && (stream == 0)
3584
+ #endif
3585
+ ) {
3586
+ xmlSchemaParserCtxtPtr ctxt;
3587
+
3588
+ if (timing) {
3589
+ startTimer();
3590
+ }
3591
+ ctxt = xmlSchemaNewParserCtxt(schema);
3592
+ xmlSchemaSetParserErrors(ctxt,
3593
+ (xmlSchemaValidityErrorFunc) fprintf,
3594
+ (xmlSchemaValidityWarningFunc) fprintf,
3595
+ stderr);
3596
+ wxschemas = xmlSchemaParse(ctxt);
3597
+ if (wxschemas == NULL) {
3598
+ xmlGenericError(xmlGenericErrorContext,
3599
+ "WXS schema %s failed to compile\n", schema);
3600
+ progresult = XMLLINT_ERR_SCHEMACOMP;
3601
+ schema = NULL;
3602
+ }
3603
+ xmlSchemaFreeParserCtxt(ctxt);
3604
+ if (timing) {
3605
+ endTimer("Compiling the schemas");
3606
+ }
3607
+ }
3608
+ #endif /* LIBXML_SCHEMAS_ENABLED */
3609
+ #ifdef LIBXML_PATTERN_ENABLED
3610
+ if ((pattern != NULL)
3611
+ #ifdef LIBXML_READER_ENABLED
3612
+ && (walker == 0)
3613
+ #endif
3614
+ ) {
3615
+ patternc = xmlPatterncompile((const xmlChar *) pattern, NULL, 0, NULL);
3616
+ if (patternc == NULL) {
3617
+ xmlGenericError(xmlGenericErrorContext,
3618
+ "Pattern %s failed to compile\n", pattern);
3619
+ progresult = XMLLINT_ERR_SCHEMAPAT;
3620
+ pattern = NULL;
3621
+ }
3622
+ }
3623
+ #endif /* LIBXML_PATTERN_ENABLED */
3624
+ for (i = 1; i < argc ; i++) {
3625
+ if ((!strcmp(argv[i], "-encode")) ||
3626
+ (!strcmp(argv[i], "--encode"))) {
3627
+ i++;
3628
+ continue;
3629
+ } else if ((!strcmp(argv[i], "-o")) ||
3630
+ (!strcmp(argv[i], "-output")) ||
3631
+ (!strcmp(argv[i], "--output"))) {
3632
+ i++;
3633
+ continue;
3634
+ }
3635
+ #ifdef LIBXML_VALID_ENABLED
3636
+ if ((!strcmp(argv[i], "-dtdvalid")) ||
3637
+ (!strcmp(argv[i], "--dtdvalid"))) {
3638
+ i++;
3639
+ continue;
3640
+ }
3641
+ if ((!strcmp(argv[i], "-path")) ||
3642
+ (!strcmp(argv[i], "--path"))) {
3643
+ i++;
3644
+ continue;
3645
+ }
3646
+ if ((!strcmp(argv[i], "-dtdvalidfpi")) ||
3647
+ (!strcmp(argv[i], "--dtdvalidfpi"))) {
3648
+ i++;
3649
+ continue;
3650
+ }
3651
+ #endif /* LIBXML_VALID_ENABLED */
3652
+ if ((!strcmp(argv[i], "-relaxng")) ||
3653
+ (!strcmp(argv[i], "--relaxng"))) {
3654
+ i++;
3655
+ continue;
3656
+ }
3657
+ if ((!strcmp(argv[i], "-maxmem")) ||
3658
+ (!strcmp(argv[i], "--maxmem"))) {
3659
+ i++;
3660
+ continue;
3661
+ }
3662
+ if ((!strcmp(argv[i], "-pretty")) ||
3663
+ (!strcmp(argv[i], "--pretty"))) {
3664
+ i++;
3665
+ continue;
3666
+ }
3667
+ if ((!strcmp(argv[i], "-schema")) ||
3668
+ (!strcmp(argv[i], "--schema"))) {
3669
+ i++;
3670
+ continue;
3671
+ }
3672
+ if ((!strcmp(argv[i], "-schematron")) ||
3673
+ (!strcmp(argv[i], "--schematron"))) {
3674
+ i++;
3675
+ continue;
3676
+ }
3677
+ #ifdef LIBXML_PATTERN_ENABLED
3678
+ if ((!strcmp(argv[i], "-pattern")) ||
3679
+ (!strcmp(argv[i], "--pattern"))) {
3680
+ i++;
3681
+ continue;
3682
+ }
3683
+ #endif
3684
+ #ifdef LIBXML_XPATH_ENABLED
3685
+ if ((!strcmp(argv[i], "-xpath")) ||
3686
+ (!strcmp(argv[i], "--xpath"))) {
3687
+ i++;
3688
+ continue;
3689
+ }
3690
+ #endif
3691
+ if ((timing) && (repeat))
3692
+ startTimer();
3693
+ /* Remember file names. "-" means stdin. <sven@zen.org> */
3694
+ if ((argv[i][0] != '-') || (strcmp(argv[i], "-") == 0)) {
3695
+ if (repeat) {
3696
+ xmlParserCtxtPtr ctxt = NULL;
3697
+
3698
+ for (acount = 0;acount < repeat;acount++) {
3699
+ #ifdef LIBXML_READER_ENABLED
3700
+ if (stream != 0) {
3701
+ streamFile(argv[i]);
3702
+ } else {
3703
+ #endif /* LIBXML_READER_ENABLED */
3704
+ if (sax) {
3705
+ testSAX(argv[i]);
3706
+ } else {
3707
+ if (ctxt == NULL)
3708
+ ctxt = xmlNewParserCtxt();
3709
+ parseAndPrintFile(argv[i], ctxt);
3710
+ }
3711
+ #ifdef LIBXML_READER_ENABLED
3712
+ }
3713
+ #endif /* LIBXML_READER_ENABLED */
3714
+ }
3715
+ if (ctxt != NULL)
3716
+ xmlFreeParserCtxt(ctxt);
3717
+ } else {
3718
+ nbregister = 0;
3719
+
3720
+ #ifdef LIBXML_READER_ENABLED
3721
+ if (stream != 0)
3722
+ streamFile(argv[i]);
3723
+ else
3724
+ #endif /* LIBXML_READER_ENABLED */
3725
+ if (sax) {
3726
+ testSAX(argv[i]);
3727
+ } else {
3728
+ parseAndPrintFile(argv[i], NULL);
3729
+ }
3730
+
3731
+ if ((chkregister) && (nbregister != 0)) {
3732
+ fprintf(stderr, "Registration count off: %d\n", nbregister);
3733
+ progresult = XMLLINT_ERR_RDREGIS;
3734
+ }
3735
+ }
3736
+ files ++;
3737
+ if ((timing) && (repeat)) {
3738
+ endTimer("%d iterations", repeat);
3739
+ }
3740
+ }
3741
+ }
3742
+ if (generate)
3743
+ parseAndPrintFile(NULL, NULL);
3744
+ if ((htmlout) && (!nowrap)) {
3745
+ xmlGenericError(xmlGenericErrorContext, "</body></html>\n");
3746
+ }
3747
+ if ((files == 0) && (!generate) && (version == 0)) {
3748
+ usage(argv[0]);
3749
+ }
3750
+ #ifdef LIBXML_SCHEMATRON_ENABLED
3751
+ if (wxschematron != NULL)
3752
+ xmlSchematronFree(wxschematron);
3753
+ #endif
3754
+ #ifdef LIBXML_SCHEMAS_ENABLED
3755
+ if (relaxngschemas != NULL)
3756
+ xmlRelaxNGFree(relaxngschemas);
3757
+ if (wxschemas != NULL)
3758
+ xmlSchemaFree(wxschemas);
3759
+ xmlRelaxNGCleanupTypes();
3760
+ #endif
3761
+ #ifdef LIBXML_PATTERN_ENABLED
3762
+ if (patternc != NULL)
3763
+ xmlFreePattern(patternc);
3764
+ #endif
3765
+ xmlCleanupParser();
3766
+ xmlMemoryDump();
3767
+
3768
+ return(progresult);
3769
+ }
3770
+