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

Sign up to get free protection for your applications and to get access to all the features.
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
+