@helm2/poc_jenki_rce 0.0.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of @helm2/poc_jenki_rce might be problematic. Click here for more details.

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