pocxxeci 0.30.1

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

Potentially problematic release.


This version of pocxxeci 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 +122 -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,2164 @@
1
+ /*
2
+ * parserInternals.c : Internal routines (and obsolete ones) needed for the
3
+ * XML and HTML parsers.
4
+ *
5
+ * See Copyright for the status of this software.
6
+ *
7
+ * daniel@veillard.com
8
+ */
9
+
10
+ #define IN_LIBXML
11
+ #include "libxml.h"
12
+
13
+ #if defined(_WIN32) && !defined (__CYGWIN__)
14
+ #define XML_DIR_SEP '\\'
15
+ #else
16
+ #define XML_DIR_SEP '/'
17
+ #endif
18
+
19
+ #include <string.h>
20
+ #ifdef HAVE_CTYPE_H
21
+ #include <ctype.h>
22
+ #endif
23
+ #ifdef HAVE_STDLIB_H
24
+ #include <stdlib.h>
25
+ #endif
26
+ #ifdef HAVE_SYS_STAT_H
27
+ #include <sys/stat.h>
28
+ #endif
29
+ #ifdef HAVE_FCNTL_H
30
+ #include <fcntl.h>
31
+ #endif
32
+ #ifdef HAVE_UNISTD_H
33
+ #include <unistd.h>
34
+ #endif
35
+ #ifdef LIBXML_ZLIB_ENABLED
36
+ #include <zlib.h>
37
+ #endif
38
+
39
+ #include <libxml/xmlmemory.h>
40
+ #include <libxml/tree.h>
41
+ #include <libxml/parser.h>
42
+ #include <libxml/parserInternals.h>
43
+ #include <libxml/valid.h>
44
+ #include <libxml/entities.h>
45
+ #include <libxml/xmlerror.h>
46
+ #include <libxml/encoding.h>
47
+ #include <libxml/valid.h>
48
+ #include <libxml/xmlIO.h>
49
+ #include <libxml/uri.h>
50
+ #include <libxml/dict.h>
51
+ #include <libxml/SAX.h>
52
+ #ifdef LIBXML_CATALOG_ENABLED
53
+ #include <libxml/catalog.h>
54
+ #endif
55
+ #include <libxml/globals.h>
56
+ #include <libxml/chvalid.h>
57
+
58
+ #define CUR(ctxt) ctxt->input->cur
59
+ #define END(ctxt) ctxt->input->end
60
+ #define VALID_CTXT(ctxt) (CUR(ctxt) <= END(ctxt))
61
+
62
+ #include "buf.h"
63
+ #include "enc.h"
64
+
65
+ /*
66
+ * Various global defaults for parsing
67
+ */
68
+
69
+ /**
70
+ * xmlCheckVersion:
71
+ * @version: the include version number
72
+ *
73
+ * check the compiled lib version against the include one.
74
+ * This can warn or immediately kill the application
75
+ */
76
+ void
77
+ xmlCheckVersion(int version) {
78
+ int myversion = (int) LIBXML_VERSION;
79
+
80
+ xmlInitParser();
81
+
82
+ if ((myversion / 10000) != (version / 10000)) {
83
+ xmlGenericError(xmlGenericErrorContext,
84
+ "Fatal: program compiled against libxml %d using libxml %d\n",
85
+ (version / 10000), (myversion / 10000));
86
+ fprintf(stderr,
87
+ "Fatal: program compiled against libxml %d using libxml %d\n",
88
+ (version / 10000), (myversion / 10000));
89
+ }
90
+ if ((myversion / 100) < (version / 100)) {
91
+ xmlGenericError(xmlGenericErrorContext,
92
+ "Warning: program compiled against libxml %d using older %d\n",
93
+ (version / 100), (myversion / 100));
94
+ }
95
+ }
96
+
97
+
98
+ /************************************************************************
99
+ * *
100
+ * Some factorized error routines *
101
+ * *
102
+ ************************************************************************/
103
+
104
+
105
+ /**
106
+ * xmlErrMemory:
107
+ * @ctxt: an XML parser context
108
+ * @extra: extra information
109
+ *
110
+ * Handle a redefinition of attribute error
111
+ */
112
+ void
113
+ xmlErrMemory(xmlParserCtxtPtr ctxt, const char *extra)
114
+ {
115
+ if ((ctxt != NULL) && (ctxt->disableSAX != 0) &&
116
+ (ctxt->instate == XML_PARSER_EOF))
117
+ return;
118
+ if (ctxt != NULL) {
119
+ ctxt->errNo = XML_ERR_NO_MEMORY;
120
+ ctxt->instate = XML_PARSER_EOF;
121
+ ctxt->disableSAX = 1;
122
+ }
123
+ if (extra)
124
+ __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER,
125
+ XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, extra,
126
+ NULL, NULL, 0, 0,
127
+ "Memory allocation failed : %s\n", extra);
128
+ else
129
+ __xmlRaiseError(NULL, NULL, NULL, ctxt, NULL, XML_FROM_PARSER,
130
+ XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, NULL,
131
+ NULL, NULL, 0, 0, "Memory allocation failed\n");
132
+ }
133
+
134
+ /**
135
+ * __xmlErrEncoding:
136
+ * @ctxt: an XML parser context
137
+ * @xmlerr: the error number
138
+ * @msg: the error message
139
+ * @str1: an string info
140
+ * @str2: an string info
141
+ *
142
+ * Handle an encoding error
143
+ */
144
+ void
145
+ __xmlErrEncoding(xmlParserCtxtPtr ctxt, xmlParserErrors xmlerr,
146
+ const char *msg, const xmlChar * str1, const xmlChar * str2)
147
+ {
148
+ if ((ctxt != NULL) && (ctxt->disableSAX != 0) &&
149
+ (ctxt->instate == XML_PARSER_EOF))
150
+ return;
151
+ if (ctxt != NULL)
152
+ ctxt->errNo = xmlerr;
153
+ __xmlRaiseError(NULL, NULL, NULL,
154
+ ctxt, NULL, XML_FROM_PARSER, xmlerr, XML_ERR_FATAL,
155
+ NULL, 0, (const char *) str1, (const char *) str2,
156
+ NULL, 0, 0, msg, str1, str2);
157
+ if (ctxt != NULL) {
158
+ ctxt->wellFormed = 0;
159
+ if (ctxt->recovery == 0)
160
+ ctxt->disableSAX = 1;
161
+ }
162
+ }
163
+
164
+ /**
165
+ * xmlErrInternal:
166
+ * @ctxt: an XML parser context
167
+ * @msg: the error message
168
+ * @str: error information
169
+ *
170
+ * Handle an internal error
171
+ */
172
+ static void LIBXML_ATTR_FORMAT(2,0)
173
+ xmlErrInternal(xmlParserCtxtPtr ctxt, const char *msg, const xmlChar * str)
174
+ {
175
+ if ((ctxt != NULL) && (ctxt->disableSAX != 0) &&
176
+ (ctxt->instate == XML_PARSER_EOF))
177
+ return;
178
+ if (ctxt != NULL)
179
+ ctxt->errNo = XML_ERR_INTERNAL_ERROR;
180
+ __xmlRaiseError(NULL, NULL, NULL,
181
+ ctxt, NULL, XML_FROM_PARSER, XML_ERR_INTERNAL_ERROR,
182
+ XML_ERR_FATAL, NULL, 0, (const char *) str, NULL, NULL,
183
+ 0, 0, msg, str);
184
+ if (ctxt != NULL) {
185
+ ctxt->wellFormed = 0;
186
+ if (ctxt->recovery == 0)
187
+ ctxt->disableSAX = 1;
188
+ }
189
+ }
190
+
191
+ /**
192
+ * xmlErrEncodingInt:
193
+ * @ctxt: an XML parser context
194
+ * @error: the error number
195
+ * @msg: the error message
196
+ * @val: an integer value
197
+ *
198
+ * n encoding error
199
+ */
200
+ static void LIBXML_ATTR_FORMAT(3,0)
201
+ xmlErrEncodingInt(xmlParserCtxtPtr ctxt, xmlParserErrors error,
202
+ const char *msg, int val)
203
+ {
204
+ if ((ctxt != NULL) && (ctxt->disableSAX != 0) &&
205
+ (ctxt->instate == XML_PARSER_EOF))
206
+ return;
207
+ if (ctxt != NULL)
208
+ ctxt->errNo = error;
209
+ __xmlRaiseError(NULL, NULL, NULL,
210
+ ctxt, NULL, XML_FROM_PARSER, error, XML_ERR_FATAL,
211
+ NULL, 0, NULL, NULL, NULL, val, 0, msg, val);
212
+ if (ctxt != NULL) {
213
+ ctxt->wellFormed = 0;
214
+ if (ctxt->recovery == 0)
215
+ ctxt->disableSAX = 1;
216
+ }
217
+ }
218
+
219
+ /**
220
+ * xmlIsLetter:
221
+ * @c: an unicode character (int)
222
+ *
223
+ * Check whether the character is allowed by the production
224
+ * [84] Letter ::= BaseChar | Ideographic
225
+ *
226
+ * Returns 0 if not, non-zero otherwise
227
+ */
228
+ int
229
+ xmlIsLetter(int c) {
230
+ return(IS_BASECHAR(c) || IS_IDEOGRAPHIC(c));
231
+ }
232
+
233
+ /************************************************************************
234
+ * *
235
+ * Input handling functions for progressive parsing *
236
+ * *
237
+ ************************************************************************/
238
+
239
+ /* #define DEBUG_INPUT */
240
+ /* #define DEBUG_STACK */
241
+ /* #define DEBUG_PUSH */
242
+
243
+
244
+ /* we need to keep enough input to show errors in context */
245
+ #define LINE_LEN 80
246
+
247
+ #ifdef DEBUG_INPUT
248
+ #define CHECK_BUFFER(in) check_buffer(in)
249
+
250
+ static
251
+ void check_buffer(xmlParserInputPtr in) {
252
+ if (in->base != xmlBufContent(in->buf->buffer)) {
253
+ xmlGenericError(xmlGenericErrorContext,
254
+ "xmlParserInput: base mismatch problem\n");
255
+ }
256
+ if (in->cur < in->base) {
257
+ xmlGenericError(xmlGenericErrorContext,
258
+ "xmlParserInput: cur < base problem\n");
259
+ }
260
+ if (in->cur > in->base + xmlBufUse(in->buf->buffer)) {
261
+ xmlGenericError(xmlGenericErrorContext,
262
+ "xmlParserInput: cur > base + use problem\n");
263
+ }
264
+ xmlGenericError(xmlGenericErrorContext,"buffer %x : content %x, cur %d, use %d\n",
265
+ (int) in, (int) xmlBufContent(in->buf->buffer), in->cur - in->base,
266
+ xmlBufUse(in->buf->buffer));
267
+ }
268
+
269
+ #else
270
+ #define CHECK_BUFFER(in)
271
+ #endif
272
+
273
+
274
+ /**
275
+ * xmlParserInputRead:
276
+ * @in: an XML parser input
277
+ * @len: an indicative size for the lookahead
278
+ *
279
+ * This function was internal and is deprecated.
280
+ *
281
+ * Returns -1 as this is an error to use it.
282
+ */
283
+ int
284
+ xmlParserInputRead(xmlParserInputPtr in ATTRIBUTE_UNUSED, int len ATTRIBUTE_UNUSED) {
285
+ return(-1);
286
+ }
287
+
288
+ /**
289
+ * xmlParserInputGrow:
290
+ * @in: an XML parser input
291
+ * @len: an indicative size for the lookahead
292
+ *
293
+ * This function increase the input for the parser. It tries to
294
+ * preserve pointers to the input buffer, and keep already read data
295
+ *
296
+ * Returns the amount of char read, or -1 in case of error, 0 indicate the
297
+ * end of this entity
298
+ */
299
+ int
300
+ xmlParserInputGrow(xmlParserInputPtr in, int len) {
301
+ int ret;
302
+ size_t indx;
303
+ const xmlChar *content;
304
+
305
+ if ((in == NULL) || (len < 0)) return(-1);
306
+ #ifdef DEBUG_INPUT
307
+ xmlGenericError(xmlGenericErrorContext, "Grow\n");
308
+ #endif
309
+ if (in->buf == NULL) return(-1);
310
+ if (in->base == NULL) return(-1);
311
+ if (in->cur == NULL) return(-1);
312
+ if (in->buf->buffer == NULL) return(-1);
313
+
314
+ CHECK_BUFFER(in);
315
+
316
+ indx = in->cur - in->base;
317
+ if (xmlBufUse(in->buf->buffer) > (unsigned int) indx + INPUT_CHUNK) {
318
+
319
+ CHECK_BUFFER(in);
320
+
321
+ return(0);
322
+ }
323
+ if (in->buf->readcallback != NULL) {
324
+ ret = xmlParserInputBufferGrow(in->buf, len);
325
+ } else
326
+ return(0);
327
+
328
+ /*
329
+ * NOTE : in->base may be a "dangling" i.e. freed pointer in this
330
+ * block, but we use it really as an integer to do some
331
+ * pointer arithmetic. Insure will raise it as a bug but in
332
+ * that specific case, that's not !
333
+ */
334
+
335
+ content = xmlBufContent(in->buf->buffer);
336
+ if (in->base != content) {
337
+ /*
338
+ * the buffer has been reallocated
339
+ */
340
+ indx = in->cur - in->base;
341
+ in->base = content;
342
+ in->cur = &content[indx];
343
+ }
344
+ in->end = xmlBufEnd(in->buf->buffer);
345
+
346
+ CHECK_BUFFER(in);
347
+
348
+ return(ret);
349
+ }
350
+
351
+ /**
352
+ * xmlParserInputShrink:
353
+ * @in: an XML parser input
354
+ *
355
+ * This function removes used input for the parser.
356
+ */
357
+ void
358
+ xmlParserInputShrink(xmlParserInputPtr in) {
359
+ size_t used;
360
+ size_t ret;
361
+ size_t indx;
362
+ const xmlChar *content;
363
+
364
+ #ifdef DEBUG_INPUT
365
+ xmlGenericError(xmlGenericErrorContext, "Shrink\n");
366
+ #endif
367
+ if (in == NULL) return;
368
+ if (in->buf == NULL) return;
369
+ if (in->base == NULL) return;
370
+ if (in->cur == NULL) return;
371
+ if (in->buf->buffer == NULL) return;
372
+
373
+ CHECK_BUFFER(in);
374
+
375
+ used = in->cur - xmlBufContent(in->buf->buffer);
376
+ /*
377
+ * Do not shrink on large buffers whose only a tiny fraction
378
+ * was consumed
379
+ */
380
+ if (used > INPUT_CHUNK) {
381
+ ret = xmlBufShrink(in->buf->buffer, used - LINE_LEN);
382
+ if (ret > 0) {
383
+ in->cur -= ret;
384
+ in->consumed += ret;
385
+ }
386
+ in->end = xmlBufEnd(in->buf->buffer);
387
+ }
388
+
389
+ CHECK_BUFFER(in);
390
+
391
+ if (xmlBufUse(in->buf->buffer) > INPUT_CHUNK) {
392
+ return;
393
+ }
394
+ xmlParserInputBufferRead(in->buf, 2 * INPUT_CHUNK);
395
+ content = xmlBufContent(in->buf->buffer);
396
+ if (in->base != content) {
397
+ /*
398
+ * the buffer has been reallocated
399
+ */
400
+ indx = in->cur - in->base;
401
+ in->base = content;
402
+ in->cur = &content[indx];
403
+ }
404
+ in->end = xmlBufEnd(in->buf->buffer);
405
+
406
+ CHECK_BUFFER(in);
407
+ }
408
+
409
+ /************************************************************************
410
+ * *
411
+ * UTF8 character input and related functions *
412
+ * *
413
+ ************************************************************************/
414
+
415
+ /**
416
+ * xmlNextChar:
417
+ * @ctxt: the XML parser context
418
+ *
419
+ * Skip to the next char input char.
420
+ */
421
+
422
+ void
423
+ xmlNextChar(xmlParserCtxtPtr ctxt)
424
+ {
425
+ if ((ctxt == NULL) || (ctxt->instate == XML_PARSER_EOF) ||
426
+ (ctxt->input == NULL))
427
+ return;
428
+
429
+ if (!(VALID_CTXT(ctxt))) {
430
+ xmlErrInternal(ctxt, "Parser input data memory error\n", NULL);
431
+ ctxt->errNo = XML_ERR_INTERNAL_ERROR;
432
+ xmlStopParser(ctxt);
433
+ return;
434
+ }
435
+
436
+ if ((*ctxt->input->cur == 0) &&
437
+ (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) {
438
+ return;
439
+ }
440
+
441
+ if (ctxt->charset == XML_CHAR_ENCODING_UTF8) {
442
+ const unsigned char *cur;
443
+ unsigned char c;
444
+
445
+ /*
446
+ * 2.11 End-of-Line Handling
447
+ * the literal two-character sequence "#xD#xA" or a standalone
448
+ * literal #xD, an XML processor must pass to the application
449
+ * the single character #xA.
450
+ */
451
+ if (*(ctxt->input->cur) == '\n') {
452
+ ctxt->input->line++; ctxt->input->col = 1;
453
+ } else
454
+ ctxt->input->col++;
455
+
456
+ /*
457
+ * We are supposed to handle UTF8, check it's valid
458
+ * From rfc2044: encoding of the Unicode values on UTF-8:
459
+ *
460
+ * UCS-4 range (hex.) UTF-8 octet sequence (binary)
461
+ * 0000 0000-0000 007F 0xxxxxxx
462
+ * 0000 0080-0000 07FF 110xxxxx 10xxxxxx
463
+ * 0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx
464
+ *
465
+ * Check for the 0x110000 limit too
466
+ */
467
+ cur = ctxt->input->cur;
468
+
469
+ c = *cur;
470
+ if (c & 0x80) {
471
+ if (c == 0xC0)
472
+ goto encoding_error;
473
+ if (cur[1] == 0) {
474
+ xmlParserInputGrow(ctxt->input, INPUT_CHUNK);
475
+ cur = ctxt->input->cur;
476
+ }
477
+ if ((cur[1] & 0xc0) != 0x80)
478
+ goto encoding_error;
479
+ if ((c & 0xe0) == 0xe0) {
480
+ unsigned int val;
481
+
482
+ if (cur[2] == 0) {
483
+ xmlParserInputGrow(ctxt->input, INPUT_CHUNK);
484
+ cur = ctxt->input->cur;
485
+ }
486
+ if ((cur[2] & 0xc0) != 0x80)
487
+ goto encoding_error;
488
+ if ((c & 0xf0) == 0xf0) {
489
+ if (cur[3] == 0) {
490
+ xmlParserInputGrow(ctxt->input, INPUT_CHUNK);
491
+ cur = ctxt->input->cur;
492
+ }
493
+ if (((c & 0xf8) != 0xf0) ||
494
+ ((cur[3] & 0xc0) != 0x80))
495
+ goto encoding_error;
496
+ /* 4-byte code */
497
+ ctxt->input->cur += 4;
498
+ val = (cur[0] & 0x7) << 18;
499
+ val |= (cur[1] & 0x3f) << 12;
500
+ val |= (cur[2] & 0x3f) << 6;
501
+ val |= cur[3] & 0x3f;
502
+ } else {
503
+ /* 3-byte code */
504
+ ctxt->input->cur += 3;
505
+ val = (cur[0] & 0xf) << 12;
506
+ val |= (cur[1] & 0x3f) << 6;
507
+ val |= cur[2] & 0x3f;
508
+ }
509
+ if (((val > 0xd7ff) && (val < 0xe000)) ||
510
+ ((val > 0xfffd) && (val < 0x10000)) ||
511
+ (val >= 0x110000)) {
512
+ xmlErrEncodingInt(ctxt, XML_ERR_INVALID_CHAR,
513
+ "Char 0x%X out of allowed range\n",
514
+ val);
515
+ }
516
+ } else
517
+ /* 2-byte code */
518
+ ctxt->input->cur += 2;
519
+ } else
520
+ /* 1-byte code */
521
+ ctxt->input->cur++;
522
+ } else {
523
+ /*
524
+ * Assume it's a fixed length encoding (1) with
525
+ * a compatible encoding for the ASCII set, since
526
+ * XML constructs only use < 128 chars
527
+ */
528
+
529
+ if (*(ctxt->input->cur) == '\n') {
530
+ ctxt->input->line++; ctxt->input->col = 1;
531
+ } else
532
+ ctxt->input->col++;
533
+ ctxt->input->cur++;
534
+ }
535
+ if (*ctxt->input->cur == 0)
536
+ xmlParserInputGrow(ctxt->input, INPUT_CHUNK);
537
+ return;
538
+ encoding_error:
539
+ /*
540
+ * If we detect an UTF8 error that probably mean that the
541
+ * input encoding didn't get properly advertised in the
542
+ * declaration header. Report the error and switch the encoding
543
+ * to ISO-Latin-1 (if you don't like this policy, just declare the
544
+ * encoding !)
545
+ */
546
+ if ((ctxt == NULL) || (ctxt->input == NULL) ||
547
+ (ctxt->input->end - ctxt->input->cur < 4)) {
548
+ __xmlErrEncoding(ctxt, XML_ERR_INVALID_CHAR,
549
+ "Input is not proper UTF-8, indicate encoding !\n",
550
+ NULL, NULL);
551
+ } else {
552
+ char buffer[150];
553
+
554
+ snprintf(buffer, 149, "Bytes: 0x%02X 0x%02X 0x%02X 0x%02X\n",
555
+ ctxt->input->cur[0], ctxt->input->cur[1],
556
+ ctxt->input->cur[2], ctxt->input->cur[3]);
557
+ __xmlErrEncoding(ctxt, XML_ERR_INVALID_CHAR,
558
+ "Input is not proper UTF-8, indicate encoding !\n%s",
559
+ BAD_CAST buffer, NULL);
560
+ }
561
+ ctxt->charset = XML_CHAR_ENCODING_8859_1;
562
+ ctxt->input->cur++;
563
+ return;
564
+ }
565
+
566
+ /**
567
+ * xmlCurrentChar:
568
+ * @ctxt: the XML parser context
569
+ * @len: pointer to the length of the char read
570
+ *
571
+ * The current char value, if using UTF-8 this may actually span multiple
572
+ * bytes in the input buffer. Implement the end of line normalization:
573
+ * 2.11 End-of-Line Handling
574
+ * Wherever an external parsed entity or the literal entity value
575
+ * of an internal parsed entity contains either the literal two-character
576
+ * sequence "#xD#xA" or a standalone literal #xD, an XML processor
577
+ * must pass to the application the single character #xA.
578
+ * This behavior can conveniently be produced by normalizing all
579
+ * line breaks to #xA on input, before parsing.)
580
+ *
581
+ * Returns the current char value and its length
582
+ */
583
+
584
+ int
585
+ xmlCurrentChar(xmlParserCtxtPtr ctxt, int *len) {
586
+ if ((ctxt == NULL) || (len == NULL) || (ctxt->input == NULL)) return(0);
587
+ if (ctxt->instate == XML_PARSER_EOF)
588
+ return(0);
589
+
590
+ if ((*ctxt->input->cur >= 0x20) && (*ctxt->input->cur <= 0x7F)) {
591
+ *len = 1;
592
+ return((int) *ctxt->input->cur);
593
+ }
594
+ if (ctxt->charset == XML_CHAR_ENCODING_UTF8) {
595
+ /*
596
+ * We are supposed to handle UTF8, check it's valid
597
+ * From rfc2044: encoding of the Unicode values on UTF-8:
598
+ *
599
+ * UCS-4 range (hex.) UTF-8 octet sequence (binary)
600
+ * 0000 0000-0000 007F 0xxxxxxx
601
+ * 0000 0080-0000 07FF 110xxxxx 10xxxxxx
602
+ * 0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx
603
+ *
604
+ * Check for the 0x110000 limit too
605
+ */
606
+ const unsigned char *cur = ctxt->input->cur;
607
+ unsigned char c;
608
+ unsigned int val;
609
+
610
+ c = *cur;
611
+ if (c & 0x80) {
612
+ if (((c & 0x40) == 0) || (c == 0xC0))
613
+ goto encoding_error;
614
+ if (cur[1] == 0) {
615
+ xmlParserInputGrow(ctxt->input, INPUT_CHUNK);
616
+ cur = ctxt->input->cur;
617
+ }
618
+ if ((cur[1] & 0xc0) != 0x80)
619
+ goto encoding_error;
620
+ if ((c & 0xe0) == 0xe0) {
621
+ if (cur[2] == 0) {
622
+ xmlParserInputGrow(ctxt->input, INPUT_CHUNK);
623
+ cur = ctxt->input->cur;
624
+ }
625
+ if ((cur[2] & 0xc0) != 0x80)
626
+ goto encoding_error;
627
+ if ((c & 0xf0) == 0xf0) {
628
+ if (cur[3] == 0) {
629
+ xmlParserInputGrow(ctxt->input, INPUT_CHUNK);
630
+ cur = ctxt->input->cur;
631
+ }
632
+ if (((c & 0xf8) != 0xf0) ||
633
+ ((cur[3] & 0xc0) != 0x80))
634
+ goto encoding_error;
635
+ /* 4-byte code */
636
+ *len = 4;
637
+ val = (cur[0] & 0x7) << 18;
638
+ val |= (cur[1] & 0x3f) << 12;
639
+ val |= (cur[2] & 0x3f) << 6;
640
+ val |= cur[3] & 0x3f;
641
+ if (val < 0x10000)
642
+ goto encoding_error;
643
+ } else {
644
+ /* 3-byte code */
645
+ *len = 3;
646
+ val = (cur[0] & 0xf) << 12;
647
+ val |= (cur[1] & 0x3f) << 6;
648
+ val |= cur[2] & 0x3f;
649
+ if (val < 0x800)
650
+ goto encoding_error;
651
+ }
652
+ } else {
653
+ /* 2-byte code */
654
+ *len = 2;
655
+ val = (cur[0] & 0x1f) << 6;
656
+ val |= cur[1] & 0x3f;
657
+ if (val < 0x80)
658
+ goto encoding_error;
659
+ }
660
+ if (!IS_CHAR(val)) {
661
+ xmlErrEncodingInt(ctxt, XML_ERR_INVALID_CHAR,
662
+ "Char 0x%X out of allowed range\n", val);
663
+ }
664
+ return(val);
665
+ } else {
666
+ /* 1-byte code */
667
+ *len = 1;
668
+ if (*ctxt->input->cur == 0)
669
+ xmlParserInputGrow(ctxt->input, INPUT_CHUNK);
670
+ if ((*ctxt->input->cur == 0) &&
671
+ (ctxt->input->end > ctxt->input->cur)) {
672
+ xmlErrEncodingInt(ctxt, XML_ERR_INVALID_CHAR,
673
+ "Char 0x0 out of allowed range\n", 0);
674
+ }
675
+ if (*ctxt->input->cur == 0xD) {
676
+ if (ctxt->input->cur[1] == 0xA) {
677
+ ctxt->input->cur++;
678
+ }
679
+ return(0xA);
680
+ }
681
+ return((int) *ctxt->input->cur);
682
+ }
683
+ }
684
+ /*
685
+ * Assume it's a fixed length encoding (1) with
686
+ * a compatible encoding for the ASCII set, since
687
+ * XML constructs only use < 128 chars
688
+ */
689
+ *len = 1;
690
+ if (*ctxt->input->cur == 0xD) {
691
+ if (ctxt->input->cur[1] == 0xA) {
692
+ ctxt->input->cur++;
693
+ }
694
+ return(0xA);
695
+ }
696
+ return((int) *ctxt->input->cur);
697
+ encoding_error:
698
+ /*
699
+ * An encoding problem may arise from a truncated input buffer
700
+ * splitting a character in the middle. In that case do not raise
701
+ * an error but return 0 to indicate an end of stream problem
702
+ */
703
+ if (ctxt->input->end - ctxt->input->cur < 4) {
704
+ *len = 0;
705
+ return(0);
706
+ }
707
+
708
+ /*
709
+ * If we detect an UTF8 error that probably mean that the
710
+ * input encoding didn't get properly advertised in the
711
+ * declaration header. Report the error and switch the encoding
712
+ * to ISO-Latin-1 (if you don't like this policy, just declare the
713
+ * encoding !)
714
+ */
715
+ {
716
+ char buffer[150];
717
+
718
+ snprintf(&buffer[0], 149, "Bytes: 0x%02X 0x%02X 0x%02X 0x%02X\n",
719
+ ctxt->input->cur[0], ctxt->input->cur[1],
720
+ ctxt->input->cur[2], ctxt->input->cur[3]);
721
+ __xmlErrEncoding(ctxt, XML_ERR_INVALID_CHAR,
722
+ "Input is not proper UTF-8, indicate encoding !\n%s",
723
+ BAD_CAST buffer, NULL);
724
+ }
725
+ ctxt->charset = XML_CHAR_ENCODING_8859_1;
726
+ *len = 1;
727
+ return((int) *ctxt->input->cur);
728
+ }
729
+
730
+ /**
731
+ * xmlStringCurrentChar:
732
+ * @ctxt: the XML parser context
733
+ * @cur: pointer to the beginning of the char
734
+ * @len: pointer to the length of the char read
735
+ *
736
+ * The current char value, if using UTF-8 this may actually span multiple
737
+ * bytes in the input buffer.
738
+ *
739
+ * Returns the current char value and its length
740
+ */
741
+
742
+ int
743
+ xmlStringCurrentChar(xmlParserCtxtPtr ctxt, const xmlChar * cur, int *len)
744
+ {
745
+ if ((len == NULL) || (cur == NULL)) return(0);
746
+ if ((ctxt == NULL) || (ctxt->charset == XML_CHAR_ENCODING_UTF8)) {
747
+ /*
748
+ * We are supposed to handle UTF8, check it's valid
749
+ * From rfc2044: encoding of the Unicode values on UTF-8:
750
+ *
751
+ * UCS-4 range (hex.) UTF-8 octet sequence (binary)
752
+ * 0000 0000-0000 007F 0xxxxxxx
753
+ * 0000 0080-0000 07FF 110xxxxx 10xxxxxx
754
+ * 0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx
755
+ *
756
+ * Check for the 0x110000 limit too
757
+ */
758
+ unsigned char c;
759
+ unsigned int val;
760
+
761
+ c = *cur;
762
+ if (c & 0x80) {
763
+ if ((cur[1] & 0xc0) != 0x80)
764
+ goto encoding_error;
765
+ if ((c & 0xe0) == 0xe0) {
766
+
767
+ if ((cur[2] & 0xc0) != 0x80)
768
+ goto encoding_error;
769
+ if ((c & 0xf0) == 0xf0) {
770
+ if (((c & 0xf8) != 0xf0) || ((cur[3] & 0xc0) != 0x80))
771
+ goto encoding_error;
772
+ /* 4-byte code */
773
+ *len = 4;
774
+ val = (cur[0] & 0x7) << 18;
775
+ val |= (cur[1] & 0x3f) << 12;
776
+ val |= (cur[2] & 0x3f) << 6;
777
+ val |= cur[3] & 0x3f;
778
+ } else {
779
+ /* 3-byte code */
780
+ *len = 3;
781
+ val = (cur[0] & 0xf) << 12;
782
+ val |= (cur[1] & 0x3f) << 6;
783
+ val |= cur[2] & 0x3f;
784
+ }
785
+ } else {
786
+ /* 2-byte code */
787
+ *len = 2;
788
+ val = (cur[0] & 0x1f) << 6;
789
+ val |= cur[1] & 0x3f;
790
+ }
791
+ if (!IS_CHAR(val)) {
792
+ xmlErrEncodingInt(ctxt, XML_ERR_INVALID_CHAR,
793
+ "Char 0x%X out of allowed range\n", val);
794
+ }
795
+ return (val);
796
+ } else {
797
+ /* 1-byte code */
798
+ *len = 1;
799
+ return ((int) *cur);
800
+ }
801
+ }
802
+ /*
803
+ * Assume it's a fixed length encoding (1) with
804
+ * a compatible encoding for the ASCII set, since
805
+ * XML constructs only use < 128 chars
806
+ */
807
+ *len = 1;
808
+ return ((int) *cur);
809
+ encoding_error:
810
+
811
+ /*
812
+ * An encoding problem may arise from a truncated input buffer
813
+ * splitting a character in the middle. In that case do not raise
814
+ * an error but return 0 to indicate an end of stream problem
815
+ */
816
+ if ((ctxt == NULL) || (ctxt->input == NULL) ||
817
+ (ctxt->input->end - ctxt->input->cur < 4)) {
818
+ *len = 0;
819
+ return(0);
820
+ }
821
+ /*
822
+ * If we detect an UTF8 error that probably mean that the
823
+ * input encoding didn't get properly advertised in the
824
+ * declaration header. Report the error and switch the encoding
825
+ * to ISO-Latin-1 (if you don't like this policy, just declare the
826
+ * encoding !)
827
+ */
828
+ {
829
+ char buffer[150];
830
+
831
+ snprintf(buffer, 149, "Bytes: 0x%02X 0x%02X 0x%02X 0x%02X\n",
832
+ ctxt->input->cur[0], ctxt->input->cur[1],
833
+ ctxt->input->cur[2], ctxt->input->cur[3]);
834
+ __xmlErrEncoding(ctxt, XML_ERR_INVALID_CHAR,
835
+ "Input is not proper UTF-8, indicate encoding !\n%s",
836
+ BAD_CAST buffer, NULL);
837
+ }
838
+ *len = 1;
839
+ return ((int) *cur);
840
+ }
841
+
842
+ /**
843
+ * xmlCopyCharMultiByte:
844
+ * @out: pointer to an array of xmlChar
845
+ * @val: the char value
846
+ *
847
+ * append the char value in the array
848
+ *
849
+ * Returns the number of xmlChar written
850
+ */
851
+ int
852
+ xmlCopyCharMultiByte(xmlChar *out, int val) {
853
+ if (out == NULL) return(0);
854
+ /*
855
+ * We are supposed to handle UTF8, check it's valid
856
+ * From rfc2044: encoding of the Unicode values on UTF-8:
857
+ *
858
+ * UCS-4 range (hex.) UTF-8 octet sequence (binary)
859
+ * 0000 0000-0000 007F 0xxxxxxx
860
+ * 0000 0080-0000 07FF 110xxxxx 10xxxxxx
861
+ * 0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx
862
+ */
863
+ if (val >= 0x80) {
864
+ xmlChar *savedout = out;
865
+ int bits;
866
+ if (val < 0x800) { *out++= (val >> 6) | 0xC0; bits= 0; }
867
+ else if (val < 0x10000) { *out++= (val >> 12) | 0xE0; bits= 6;}
868
+ else if (val < 0x110000) { *out++= (val >> 18) | 0xF0; bits= 12; }
869
+ else {
870
+ xmlErrEncodingInt(NULL, XML_ERR_INVALID_CHAR,
871
+ "Internal error, xmlCopyCharMultiByte 0x%X out of bound\n",
872
+ val);
873
+ return(0);
874
+ }
875
+ for ( ; bits >= 0; bits-= 6)
876
+ *out++= ((val >> bits) & 0x3F) | 0x80 ;
877
+ return (out - savedout);
878
+ }
879
+ *out = (xmlChar) val;
880
+ return 1;
881
+ }
882
+
883
+ /**
884
+ * xmlCopyChar:
885
+ * @len: Ignored, compatibility
886
+ * @out: pointer to an array of xmlChar
887
+ * @val: the char value
888
+ *
889
+ * append the char value in the array
890
+ *
891
+ * Returns the number of xmlChar written
892
+ */
893
+
894
+ int
895
+ xmlCopyChar(int len ATTRIBUTE_UNUSED, xmlChar *out, int val) {
896
+ if (out == NULL) return(0);
897
+ /* the len parameter is ignored */
898
+ if (val >= 0x80) {
899
+ return(xmlCopyCharMultiByte (out, val));
900
+ }
901
+ *out = (xmlChar) val;
902
+ return 1;
903
+ }
904
+
905
+ /************************************************************************
906
+ * *
907
+ * Commodity functions to switch encodings *
908
+ * *
909
+ ************************************************************************/
910
+
911
+ static int
912
+ xmlSwitchToEncodingInt(xmlParserCtxtPtr ctxt,
913
+ xmlCharEncodingHandlerPtr handler, int len);
914
+ static int
915
+ xmlSwitchInputEncodingInt(xmlParserCtxtPtr ctxt, xmlParserInputPtr input,
916
+ xmlCharEncodingHandlerPtr handler, int len);
917
+ /**
918
+ * xmlSwitchEncoding:
919
+ * @ctxt: the parser context
920
+ * @enc: the encoding value (number)
921
+ *
922
+ * change the input functions when discovering the character encoding
923
+ * of a given entity.
924
+ *
925
+ * Returns 0 in case of success, -1 otherwise
926
+ */
927
+ int
928
+ xmlSwitchEncoding(xmlParserCtxtPtr ctxt, xmlCharEncoding enc)
929
+ {
930
+ xmlCharEncodingHandlerPtr handler;
931
+ int len = -1;
932
+ int ret;
933
+
934
+ if (ctxt == NULL) return(-1);
935
+ switch (enc) {
936
+ case XML_CHAR_ENCODING_ERROR:
937
+ __xmlErrEncoding(ctxt, XML_ERR_UNKNOWN_ENCODING,
938
+ "encoding unknown\n", NULL, NULL);
939
+ return(-1);
940
+ case XML_CHAR_ENCODING_NONE:
941
+ /* let's assume it's UTF-8 without the XML decl */
942
+ ctxt->charset = XML_CHAR_ENCODING_UTF8;
943
+ return(0);
944
+ case XML_CHAR_ENCODING_UTF8:
945
+ /* default encoding, no conversion should be needed */
946
+ ctxt->charset = XML_CHAR_ENCODING_UTF8;
947
+
948
+ /*
949
+ * Errata on XML-1.0 June 20 2001
950
+ * Specific handling of the Byte Order Mark for
951
+ * UTF-8
952
+ */
953
+ if ((ctxt->input != NULL) &&
954
+ (ctxt->input->cur[0] == 0xEF) &&
955
+ (ctxt->input->cur[1] == 0xBB) &&
956
+ (ctxt->input->cur[2] == 0xBF)) {
957
+ ctxt->input->cur += 3;
958
+ }
959
+ return(0);
960
+ case XML_CHAR_ENCODING_UTF16LE:
961
+ case XML_CHAR_ENCODING_UTF16BE:
962
+ /*The raw input characters are encoded
963
+ *in UTF-16. As we expect this function
964
+ *to be called after xmlCharEncInFunc, we expect
965
+ *ctxt->input->cur to contain UTF-8 encoded characters.
966
+ *So the raw UTF16 Byte Order Mark
967
+ *has also been converted into
968
+ *an UTF-8 BOM. Let's skip that BOM.
969
+ */
970
+ if ((ctxt->input != NULL) && (ctxt->input->cur != NULL) &&
971
+ (ctxt->input->cur[0] == 0xEF) &&
972
+ (ctxt->input->cur[1] == 0xBB) &&
973
+ (ctxt->input->cur[2] == 0xBF)) {
974
+ ctxt->input->cur += 3;
975
+ }
976
+ len = 90;
977
+ break;
978
+ case XML_CHAR_ENCODING_UCS2:
979
+ len = 90;
980
+ break;
981
+ case XML_CHAR_ENCODING_UCS4BE:
982
+ case XML_CHAR_ENCODING_UCS4LE:
983
+ case XML_CHAR_ENCODING_UCS4_2143:
984
+ case XML_CHAR_ENCODING_UCS4_3412:
985
+ len = 180;
986
+ break;
987
+ case XML_CHAR_ENCODING_EBCDIC:
988
+ case XML_CHAR_ENCODING_8859_1:
989
+ case XML_CHAR_ENCODING_8859_2:
990
+ case XML_CHAR_ENCODING_8859_3:
991
+ case XML_CHAR_ENCODING_8859_4:
992
+ case XML_CHAR_ENCODING_8859_5:
993
+ case XML_CHAR_ENCODING_8859_6:
994
+ case XML_CHAR_ENCODING_8859_7:
995
+ case XML_CHAR_ENCODING_8859_8:
996
+ case XML_CHAR_ENCODING_8859_9:
997
+ case XML_CHAR_ENCODING_ASCII:
998
+ case XML_CHAR_ENCODING_2022_JP:
999
+ case XML_CHAR_ENCODING_SHIFT_JIS:
1000
+ case XML_CHAR_ENCODING_EUC_JP:
1001
+ len = 45;
1002
+ break;
1003
+ }
1004
+ handler = xmlGetCharEncodingHandler(enc);
1005
+ if (handler == NULL) {
1006
+ /*
1007
+ * Default handlers.
1008
+ */
1009
+ switch (enc) {
1010
+ case XML_CHAR_ENCODING_ASCII:
1011
+ /* default encoding, no conversion should be needed */
1012
+ ctxt->charset = XML_CHAR_ENCODING_UTF8;
1013
+ return(0);
1014
+ case XML_CHAR_ENCODING_UTF16LE:
1015
+ break;
1016
+ case XML_CHAR_ENCODING_UTF16BE:
1017
+ break;
1018
+ case XML_CHAR_ENCODING_UCS4LE:
1019
+ __xmlErrEncoding(ctxt, XML_ERR_UNSUPPORTED_ENCODING,
1020
+ "encoding not supported %s\n",
1021
+ BAD_CAST "USC4 little endian", NULL);
1022
+ break;
1023
+ case XML_CHAR_ENCODING_UCS4BE:
1024
+ __xmlErrEncoding(ctxt, XML_ERR_UNSUPPORTED_ENCODING,
1025
+ "encoding not supported %s\n",
1026
+ BAD_CAST "USC4 big endian", NULL);
1027
+ break;
1028
+ case XML_CHAR_ENCODING_EBCDIC:
1029
+ __xmlErrEncoding(ctxt, XML_ERR_UNSUPPORTED_ENCODING,
1030
+ "encoding not supported %s\n",
1031
+ BAD_CAST "EBCDIC", NULL);
1032
+ break;
1033
+ case XML_CHAR_ENCODING_UCS4_2143:
1034
+ __xmlErrEncoding(ctxt, XML_ERR_UNSUPPORTED_ENCODING,
1035
+ "encoding not supported %s\n",
1036
+ BAD_CAST "UCS4 2143", NULL);
1037
+ break;
1038
+ case XML_CHAR_ENCODING_UCS4_3412:
1039
+ __xmlErrEncoding(ctxt, XML_ERR_UNSUPPORTED_ENCODING,
1040
+ "encoding not supported %s\n",
1041
+ BAD_CAST "UCS4 3412", NULL);
1042
+ break;
1043
+ case XML_CHAR_ENCODING_UCS2:
1044
+ __xmlErrEncoding(ctxt, XML_ERR_UNSUPPORTED_ENCODING,
1045
+ "encoding not supported %s\n",
1046
+ BAD_CAST "UCS2", NULL);
1047
+ break;
1048
+ case XML_CHAR_ENCODING_8859_1:
1049
+ case XML_CHAR_ENCODING_8859_2:
1050
+ case XML_CHAR_ENCODING_8859_3:
1051
+ case XML_CHAR_ENCODING_8859_4:
1052
+ case XML_CHAR_ENCODING_8859_5:
1053
+ case XML_CHAR_ENCODING_8859_6:
1054
+ case XML_CHAR_ENCODING_8859_7:
1055
+ case XML_CHAR_ENCODING_8859_8:
1056
+ case XML_CHAR_ENCODING_8859_9:
1057
+ /*
1058
+ * We used to keep the internal content in the
1059
+ * document encoding however this turns being unmaintainable
1060
+ * So xmlGetCharEncodingHandler() will return non-null
1061
+ * values for this now.
1062
+ */
1063
+ if ((ctxt->inputNr == 1) &&
1064
+ (ctxt->encoding == NULL) &&
1065
+ (ctxt->input != NULL) &&
1066
+ (ctxt->input->encoding != NULL)) {
1067
+ ctxt->encoding = xmlStrdup(ctxt->input->encoding);
1068
+ }
1069
+ ctxt->charset = enc;
1070
+ return(0);
1071
+ case XML_CHAR_ENCODING_2022_JP:
1072
+ __xmlErrEncoding(ctxt, XML_ERR_UNSUPPORTED_ENCODING,
1073
+ "encoding not supported %s\n",
1074
+ BAD_CAST "ISO-2022-JP", NULL);
1075
+ break;
1076
+ case XML_CHAR_ENCODING_SHIFT_JIS:
1077
+ __xmlErrEncoding(ctxt, XML_ERR_UNSUPPORTED_ENCODING,
1078
+ "encoding not supported %s\n",
1079
+ BAD_CAST "Shift_JIS", NULL);
1080
+ break;
1081
+ case XML_CHAR_ENCODING_EUC_JP:
1082
+ __xmlErrEncoding(ctxt, XML_ERR_UNSUPPORTED_ENCODING,
1083
+ "encoding not supported %s\n",
1084
+ BAD_CAST "EUC-JP", NULL);
1085
+ break;
1086
+ default:
1087
+ break;
1088
+ }
1089
+ }
1090
+ /*
1091
+ * TODO: We could recover from errors in external entities if we
1092
+ * didn't stop the parser. But most callers of this function don't
1093
+ * check the return value.
1094
+ */
1095
+ if (handler == NULL) {
1096
+ xmlStopParser(ctxt);
1097
+ return(-1);
1098
+ }
1099
+ ctxt->charset = XML_CHAR_ENCODING_UTF8;
1100
+ ret = xmlSwitchToEncodingInt(ctxt, handler, len);
1101
+ if ((ret < 0) || (ctxt->errNo == XML_I18N_CONV_FAILED)) {
1102
+ /*
1103
+ * on encoding conversion errors, stop the parser
1104
+ */
1105
+ xmlStopParser(ctxt);
1106
+ ctxt->errNo = XML_I18N_CONV_FAILED;
1107
+ }
1108
+ return(ret);
1109
+ }
1110
+
1111
+ /**
1112
+ * xmlSwitchInputEncoding:
1113
+ * @ctxt: the parser context
1114
+ * @input: the input stream
1115
+ * @handler: the encoding handler
1116
+ * @len: the number of bytes to convert for the first line or -1
1117
+ *
1118
+ * change the input functions when discovering the character encoding
1119
+ * of a given entity.
1120
+ *
1121
+ * Returns 0 in case of success, -1 otherwise
1122
+ */
1123
+ static int
1124
+ xmlSwitchInputEncodingInt(xmlParserCtxtPtr ctxt, xmlParserInputPtr input,
1125
+ xmlCharEncodingHandlerPtr handler, int len)
1126
+ {
1127
+ int nbchars;
1128
+
1129
+ if (handler == NULL)
1130
+ return (-1);
1131
+ if (input == NULL)
1132
+ return (-1);
1133
+ if (input->buf != NULL) {
1134
+ if (input->buf->encoder != NULL) {
1135
+ /*
1136
+ * Check in case the auto encoding detection triggered
1137
+ * in already.
1138
+ */
1139
+ if (input->buf->encoder == handler)
1140
+ return (0);
1141
+
1142
+ /*
1143
+ * "UTF-16" can be used for both LE and BE
1144
+ if ((!xmlStrncmp(BAD_CAST input->buf->encoder->name,
1145
+ BAD_CAST "UTF-16", 6)) &&
1146
+ (!xmlStrncmp(BAD_CAST handler->name,
1147
+ BAD_CAST "UTF-16", 6))) {
1148
+ return(0);
1149
+ }
1150
+ */
1151
+
1152
+ /*
1153
+ * Note: this is a bit dangerous, but that's what it
1154
+ * takes to use nearly compatible signature for different
1155
+ * encodings.
1156
+ *
1157
+ * FIXME: Encoders might buffer partial byte sequences, so
1158
+ * this probably can't work. We should return an error and
1159
+ * make sure that callers never try to switch the encoding
1160
+ * twice.
1161
+ */
1162
+ xmlCharEncCloseFunc(input->buf->encoder);
1163
+ input->buf->encoder = handler;
1164
+ return (0);
1165
+ }
1166
+ input->buf->encoder = handler;
1167
+
1168
+ /*
1169
+ * Is there already some content down the pipe to convert ?
1170
+ */
1171
+ if (xmlBufIsEmpty(input->buf->buffer) == 0) {
1172
+ int processed;
1173
+ unsigned int use;
1174
+
1175
+ /*
1176
+ * Specific handling of the Byte Order Mark for
1177
+ * UTF-16
1178
+ */
1179
+ if ((handler->name != NULL) &&
1180
+ (!strcmp(handler->name, "UTF-16LE") ||
1181
+ !strcmp(handler->name, "UTF-16")) &&
1182
+ (input->cur[0] == 0xFF) && (input->cur[1] == 0xFE)) {
1183
+ input->cur += 2;
1184
+ }
1185
+ if ((handler->name != NULL) &&
1186
+ (!strcmp(handler->name, "UTF-16BE")) &&
1187
+ (input->cur[0] == 0xFE) && (input->cur[1] == 0xFF)) {
1188
+ input->cur += 2;
1189
+ }
1190
+ /*
1191
+ * Errata on XML-1.0 June 20 2001
1192
+ * Specific handling of the Byte Order Mark for
1193
+ * UTF-8
1194
+ */
1195
+ if ((handler->name != NULL) &&
1196
+ (!strcmp(handler->name, "UTF-8")) &&
1197
+ (input->cur[0] == 0xEF) &&
1198
+ (input->cur[1] == 0xBB) && (input->cur[2] == 0xBF)) {
1199
+ input->cur += 3;
1200
+ }
1201
+
1202
+ /*
1203
+ * Shrink the current input buffer.
1204
+ * Move it as the raw buffer and create a new input buffer
1205
+ */
1206
+ processed = input->cur - input->base;
1207
+ xmlBufShrink(input->buf->buffer, processed);
1208
+ input->buf->raw = input->buf->buffer;
1209
+ input->buf->buffer = xmlBufCreate();
1210
+ input->buf->rawconsumed = processed;
1211
+ use = xmlBufUse(input->buf->raw);
1212
+
1213
+ if (ctxt->html) {
1214
+ /*
1215
+ * convert as much as possible of the buffer
1216
+ */
1217
+ nbchars = xmlCharEncInput(input->buf, 1);
1218
+ } else {
1219
+ /*
1220
+ * convert just enough to get
1221
+ * '<?xml version="1.0" encoding="xxx"?>'
1222
+ * parsed with the autodetected encoding
1223
+ * into the parser reading buffer.
1224
+ */
1225
+ nbchars = xmlCharEncFirstLineInput(input->buf, len);
1226
+ }
1227
+ xmlBufResetInput(input->buf->buffer, input);
1228
+ if (nbchars < 0) {
1229
+ xmlErrInternal(ctxt,
1230
+ "switching encoding: encoder error\n",
1231
+ NULL);
1232
+ return (-1);
1233
+ }
1234
+ input->buf->rawconsumed += use - xmlBufUse(input->buf->raw);
1235
+ }
1236
+ return (0);
1237
+ } else if (input->length == 0) {
1238
+ /*
1239
+ * When parsing a static memory array one must know the
1240
+ * size to be able to convert the buffer.
1241
+ */
1242
+ xmlErrInternal(ctxt, "switching encoding : no input\n", NULL);
1243
+ /*
1244
+ * Callers assume that the input buffer takes ownership of the
1245
+ * encoding handler. xmlCharEncCloseFunc frees unregistered
1246
+ * handlers and avoids a memory leak.
1247
+ */
1248
+ xmlCharEncCloseFunc(handler);
1249
+ return (-1);
1250
+ }
1251
+ /*
1252
+ * We should actually raise an error here, see issue #34.
1253
+ */
1254
+ xmlCharEncCloseFunc(handler);
1255
+ return (0);
1256
+ }
1257
+
1258
+ /**
1259
+ * xmlSwitchInputEncoding:
1260
+ * @ctxt: the parser context
1261
+ * @input: the input stream
1262
+ * @handler: the encoding handler
1263
+ *
1264
+ * change the input functions when discovering the character encoding
1265
+ * of a given entity.
1266
+ *
1267
+ * Returns 0 in case of success, -1 otherwise
1268
+ */
1269
+ int
1270
+ xmlSwitchInputEncoding(xmlParserCtxtPtr ctxt, xmlParserInputPtr input,
1271
+ xmlCharEncodingHandlerPtr handler) {
1272
+ return(xmlSwitchInputEncodingInt(ctxt, input, handler, -1));
1273
+ }
1274
+
1275
+ /**
1276
+ * xmlSwitchToEncodingInt:
1277
+ * @ctxt: the parser context
1278
+ * @handler: the encoding handler
1279
+ * @len: the length to convert or -1
1280
+ *
1281
+ * change the input functions when discovering the character encoding
1282
+ * of a given entity, and convert only @len bytes of the output, this
1283
+ * is needed on auto detect to allows any declared encoding later to
1284
+ * convert the actual content after the xmlDecl
1285
+ *
1286
+ * Returns 0 in case of success, -1 otherwise
1287
+ */
1288
+ static int
1289
+ xmlSwitchToEncodingInt(xmlParserCtxtPtr ctxt,
1290
+ xmlCharEncodingHandlerPtr handler, int len) {
1291
+ int ret = 0;
1292
+
1293
+ if (handler != NULL) {
1294
+ if (ctxt->input != NULL) {
1295
+ ret = xmlSwitchInputEncodingInt(ctxt, ctxt->input, handler, len);
1296
+ } else {
1297
+ xmlErrInternal(ctxt, "xmlSwitchToEncoding : no input\n",
1298
+ NULL);
1299
+ return(-1);
1300
+ }
1301
+ /*
1302
+ * The parsing is now done in UTF8 natively
1303
+ */
1304
+ ctxt->charset = XML_CHAR_ENCODING_UTF8;
1305
+ } else
1306
+ return(-1);
1307
+ return(ret);
1308
+ }
1309
+
1310
+ /**
1311
+ * xmlSwitchToEncoding:
1312
+ * @ctxt: the parser context
1313
+ * @handler: the encoding handler
1314
+ *
1315
+ * change the input functions when discovering the character encoding
1316
+ * of a given entity.
1317
+ *
1318
+ * Returns 0 in case of success, -1 otherwise
1319
+ */
1320
+ int
1321
+ xmlSwitchToEncoding(xmlParserCtxtPtr ctxt, xmlCharEncodingHandlerPtr handler)
1322
+ {
1323
+ return (xmlSwitchToEncodingInt(ctxt, handler, -1));
1324
+ }
1325
+
1326
+ /************************************************************************
1327
+ * *
1328
+ * Commodity functions to handle entities processing *
1329
+ * *
1330
+ ************************************************************************/
1331
+
1332
+ /**
1333
+ * xmlFreeInputStream:
1334
+ * @input: an xmlParserInputPtr
1335
+ *
1336
+ * Free up an input stream.
1337
+ */
1338
+ void
1339
+ xmlFreeInputStream(xmlParserInputPtr input) {
1340
+ if (input == NULL) return;
1341
+
1342
+ if (input->filename != NULL) xmlFree((char *) input->filename);
1343
+ if (input->directory != NULL) xmlFree((char *) input->directory);
1344
+ if (input->encoding != NULL) xmlFree((char *) input->encoding);
1345
+ if (input->version != NULL) xmlFree((char *) input->version);
1346
+ if ((input->free != NULL) && (input->base != NULL))
1347
+ input->free((xmlChar *) input->base);
1348
+ if (input->buf != NULL)
1349
+ xmlFreeParserInputBuffer(input->buf);
1350
+ xmlFree(input);
1351
+ }
1352
+
1353
+ /**
1354
+ * xmlNewInputStream:
1355
+ * @ctxt: an XML parser context
1356
+ *
1357
+ * Create a new input stream structure.
1358
+ *
1359
+ * Returns the new input stream or NULL
1360
+ */
1361
+ xmlParserInputPtr
1362
+ xmlNewInputStream(xmlParserCtxtPtr ctxt) {
1363
+ xmlParserInputPtr input;
1364
+
1365
+ input = (xmlParserInputPtr) xmlMalloc(sizeof(xmlParserInput));
1366
+ if (input == NULL) {
1367
+ xmlErrMemory(ctxt, "couldn't allocate a new input stream\n");
1368
+ return(NULL);
1369
+ }
1370
+ memset(input, 0, sizeof(xmlParserInput));
1371
+ input->line = 1;
1372
+ input->col = 1;
1373
+ input->standalone = -1;
1374
+
1375
+ /*
1376
+ * If the context is NULL the id cannot be initialized, but that
1377
+ * should not happen while parsing which is the situation where
1378
+ * the id is actually needed.
1379
+ */
1380
+ if (ctxt != NULL)
1381
+ input->id = ctxt->input_id++;
1382
+
1383
+ return(input);
1384
+ }
1385
+
1386
+ /**
1387
+ * xmlNewIOInputStream:
1388
+ * @ctxt: an XML parser context
1389
+ * @input: an I/O Input
1390
+ * @enc: the charset encoding if known
1391
+ *
1392
+ * Create a new input stream structure encapsulating the @input into
1393
+ * a stream suitable for the parser.
1394
+ *
1395
+ * Returns the new input stream or NULL
1396
+ */
1397
+ xmlParserInputPtr
1398
+ xmlNewIOInputStream(xmlParserCtxtPtr ctxt, xmlParserInputBufferPtr input,
1399
+ xmlCharEncoding enc) {
1400
+ xmlParserInputPtr inputStream;
1401
+
1402
+ if (input == NULL) return(NULL);
1403
+ if (xmlParserDebugEntities)
1404
+ xmlGenericError(xmlGenericErrorContext, "new input from I/O\n");
1405
+ inputStream = xmlNewInputStream(ctxt);
1406
+ if (inputStream == NULL) {
1407
+ return(NULL);
1408
+ }
1409
+ inputStream->filename = NULL;
1410
+ inputStream->buf = input;
1411
+ xmlBufResetInput(inputStream->buf->buffer, inputStream);
1412
+
1413
+ if (enc != XML_CHAR_ENCODING_NONE) {
1414
+ xmlSwitchEncoding(ctxt, enc);
1415
+ }
1416
+
1417
+ return(inputStream);
1418
+ }
1419
+
1420
+ /**
1421
+ * xmlNewEntityInputStream:
1422
+ * @ctxt: an XML parser context
1423
+ * @entity: an Entity pointer
1424
+ *
1425
+ * Create a new input stream based on an xmlEntityPtr
1426
+ *
1427
+ * Returns the new input stream or NULL
1428
+ */
1429
+ xmlParserInputPtr
1430
+ xmlNewEntityInputStream(xmlParserCtxtPtr ctxt, xmlEntityPtr entity) {
1431
+ xmlParserInputPtr input;
1432
+
1433
+ if (entity == NULL) {
1434
+ xmlErrInternal(ctxt, "xmlNewEntityInputStream entity = NULL\n",
1435
+ NULL);
1436
+ return(NULL);
1437
+ }
1438
+ if (xmlParserDebugEntities)
1439
+ xmlGenericError(xmlGenericErrorContext,
1440
+ "new input from entity: %s\n", entity->name);
1441
+ if (entity->content == NULL) {
1442
+ switch (entity->etype) {
1443
+ case XML_EXTERNAL_GENERAL_UNPARSED_ENTITY:
1444
+ xmlErrInternal(ctxt, "Cannot parse entity %s\n",
1445
+ entity->name);
1446
+ break;
1447
+ case XML_EXTERNAL_GENERAL_PARSED_ENTITY:
1448
+ case XML_EXTERNAL_PARAMETER_ENTITY:
1449
+ return(xmlLoadExternalEntity((char *) entity->URI,
1450
+ (char *) entity->ExternalID, ctxt));
1451
+ case XML_INTERNAL_GENERAL_ENTITY:
1452
+ xmlErrInternal(ctxt,
1453
+ "Internal entity %s without content !\n",
1454
+ entity->name);
1455
+ break;
1456
+ case XML_INTERNAL_PARAMETER_ENTITY:
1457
+ xmlErrInternal(ctxt,
1458
+ "Internal parameter entity %s without content !\n",
1459
+ entity->name);
1460
+ break;
1461
+ case XML_INTERNAL_PREDEFINED_ENTITY:
1462
+ xmlErrInternal(ctxt,
1463
+ "Predefined entity %s without content !\n",
1464
+ entity->name);
1465
+ break;
1466
+ }
1467
+ return(NULL);
1468
+ }
1469
+ input = xmlNewInputStream(ctxt);
1470
+ if (input == NULL) {
1471
+ return(NULL);
1472
+ }
1473
+ if (entity->URI != NULL)
1474
+ input->filename = (char *) xmlStrdup((xmlChar *) entity->URI);
1475
+ input->base = entity->content;
1476
+ if (entity->length == 0)
1477
+ entity->length = xmlStrlen(entity->content);
1478
+ input->cur = entity->content;
1479
+ input->length = entity->length;
1480
+ input->end = &entity->content[input->length];
1481
+ return(input);
1482
+ }
1483
+
1484
+ /**
1485
+ * xmlNewStringInputStream:
1486
+ * @ctxt: an XML parser context
1487
+ * @buffer: an memory buffer
1488
+ *
1489
+ * Create a new input stream based on a memory buffer.
1490
+ * Returns the new input stream
1491
+ */
1492
+ xmlParserInputPtr
1493
+ xmlNewStringInputStream(xmlParserCtxtPtr ctxt, const xmlChar *buffer) {
1494
+ xmlParserInputPtr input;
1495
+
1496
+ if (buffer == NULL) {
1497
+ xmlErrInternal(ctxt, "xmlNewStringInputStream string = NULL\n",
1498
+ NULL);
1499
+ return(NULL);
1500
+ }
1501
+ if (xmlParserDebugEntities)
1502
+ xmlGenericError(xmlGenericErrorContext,
1503
+ "new fixed input: %.30s\n", buffer);
1504
+ input = xmlNewInputStream(ctxt);
1505
+ if (input == NULL) {
1506
+ xmlErrMemory(ctxt, "couldn't allocate a new input stream\n");
1507
+ return(NULL);
1508
+ }
1509
+ input->base = buffer;
1510
+ input->cur = buffer;
1511
+ input->length = xmlStrlen(buffer);
1512
+ input->end = &buffer[input->length];
1513
+ return(input);
1514
+ }
1515
+
1516
+ /**
1517
+ * xmlNewInputFromFile:
1518
+ * @ctxt: an XML parser context
1519
+ * @filename: the filename to use as entity
1520
+ *
1521
+ * Create a new input stream based on a file or an URL.
1522
+ *
1523
+ * Returns the new input stream or NULL in case of error
1524
+ */
1525
+ xmlParserInputPtr
1526
+ xmlNewInputFromFile(xmlParserCtxtPtr ctxt, const char *filename) {
1527
+ xmlParserInputBufferPtr buf;
1528
+ xmlParserInputPtr inputStream;
1529
+ char *directory = NULL;
1530
+ xmlChar *URI = NULL;
1531
+
1532
+ if (xmlParserDebugEntities)
1533
+ xmlGenericError(xmlGenericErrorContext,
1534
+ "new input from file: %s\n", filename);
1535
+ if (ctxt == NULL) return(NULL);
1536
+ buf = xmlParserInputBufferCreateFilename(filename, XML_CHAR_ENCODING_NONE);
1537
+ if (buf == NULL) {
1538
+ if (filename == NULL)
1539
+ __xmlLoaderErr(ctxt,
1540
+ "failed to load external entity: NULL filename \n",
1541
+ NULL);
1542
+ else
1543
+ __xmlLoaderErr(ctxt, "failed to load external entity \"%s\"\n",
1544
+ (const char *) filename);
1545
+ return(NULL);
1546
+ }
1547
+
1548
+ inputStream = xmlNewInputStream(ctxt);
1549
+ if (inputStream == NULL)
1550
+ return(NULL);
1551
+
1552
+ inputStream->buf = buf;
1553
+ inputStream = xmlCheckHTTPInput(ctxt, inputStream);
1554
+ if (inputStream == NULL)
1555
+ return(NULL);
1556
+
1557
+ if (inputStream->filename == NULL)
1558
+ URI = xmlStrdup((xmlChar *) filename);
1559
+ else
1560
+ URI = xmlStrdup((xmlChar *) inputStream->filename);
1561
+ directory = xmlParserGetDirectory((const char *) URI);
1562
+ if (inputStream->filename != NULL) xmlFree((char *)inputStream->filename);
1563
+ inputStream->filename = (char *) xmlCanonicPath((const xmlChar *) URI);
1564
+ if (URI != NULL) xmlFree((char *) URI);
1565
+ inputStream->directory = directory;
1566
+
1567
+ xmlBufResetInput(inputStream->buf->buffer, inputStream);
1568
+ if ((ctxt->directory == NULL) && (directory != NULL))
1569
+ ctxt->directory = (char *) xmlStrdup((const xmlChar *) directory);
1570
+ return(inputStream);
1571
+ }
1572
+
1573
+ /************************************************************************
1574
+ * *
1575
+ * Commodity functions to handle parser contexts *
1576
+ * *
1577
+ ************************************************************************/
1578
+
1579
+ /**
1580
+ * xmlInitParserCtxt:
1581
+ * @ctxt: an XML parser context
1582
+ *
1583
+ * Initialize a parser context
1584
+ *
1585
+ * Returns 0 in case of success and -1 in case of error
1586
+ */
1587
+
1588
+ int
1589
+ xmlInitParserCtxt(xmlParserCtxtPtr ctxt)
1590
+ {
1591
+ xmlParserInputPtr input;
1592
+
1593
+ if(ctxt==NULL) {
1594
+ xmlErrInternal(NULL, "Got NULL parser context\n", NULL);
1595
+ return(-1);
1596
+ }
1597
+
1598
+ xmlDefaultSAXHandlerInit();
1599
+
1600
+ if (ctxt->dict == NULL)
1601
+ ctxt->dict = xmlDictCreate();
1602
+ if (ctxt->dict == NULL) {
1603
+ xmlErrMemory(NULL, "cannot initialize parser context\n");
1604
+ return(-1);
1605
+ }
1606
+ xmlDictSetLimit(ctxt->dict, XML_MAX_DICTIONARY_LIMIT);
1607
+
1608
+ if (ctxt->sax == NULL)
1609
+ ctxt->sax = (xmlSAXHandler *) xmlMalloc(sizeof(xmlSAXHandler));
1610
+ if (ctxt->sax == NULL) {
1611
+ xmlErrMemory(NULL, "cannot initialize parser context\n");
1612
+ return(-1);
1613
+ }
1614
+ else
1615
+ xmlSAXVersion(ctxt->sax, 2);
1616
+
1617
+ ctxt->maxatts = 0;
1618
+ ctxt->atts = NULL;
1619
+ /* Allocate the Input stack */
1620
+ if (ctxt->inputTab == NULL) {
1621
+ ctxt->inputTab = (xmlParserInputPtr *)
1622
+ xmlMalloc(5 * sizeof(xmlParserInputPtr));
1623
+ ctxt->inputMax = 5;
1624
+ }
1625
+ if (ctxt->inputTab == NULL) {
1626
+ xmlErrMemory(NULL, "cannot initialize parser context\n");
1627
+ ctxt->inputNr = 0;
1628
+ ctxt->inputMax = 0;
1629
+ ctxt->input = NULL;
1630
+ return(-1);
1631
+ }
1632
+ while ((input = inputPop(ctxt)) != NULL) { /* Non consuming */
1633
+ xmlFreeInputStream(input);
1634
+ }
1635
+ ctxt->inputNr = 0;
1636
+ ctxt->input = NULL;
1637
+
1638
+ ctxt->version = NULL;
1639
+ ctxt->encoding = NULL;
1640
+ ctxt->standalone = -1;
1641
+ ctxt->hasExternalSubset = 0;
1642
+ ctxt->hasPErefs = 0;
1643
+ ctxt->html = 0;
1644
+ ctxt->external = 0;
1645
+ ctxt->instate = XML_PARSER_START;
1646
+ ctxt->token = 0;
1647
+ ctxt->directory = NULL;
1648
+
1649
+ /* Allocate the Node stack */
1650
+ if (ctxt->nodeTab == NULL) {
1651
+ ctxt->nodeTab = (xmlNodePtr *) xmlMalloc(10 * sizeof(xmlNodePtr));
1652
+ ctxt->nodeMax = 10;
1653
+ }
1654
+ if (ctxt->nodeTab == NULL) {
1655
+ xmlErrMemory(NULL, "cannot initialize parser context\n");
1656
+ ctxt->nodeNr = 0;
1657
+ ctxt->nodeMax = 0;
1658
+ ctxt->node = NULL;
1659
+ ctxt->inputNr = 0;
1660
+ ctxt->inputMax = 0;
1661
+ ctxt->input = NULL;
1662
+ return(-1);
1663
+ }
1664
+ ctxt->nodeNr = 0;
1665
+ ctxt->node = NULL;
1666
+
1667
+ /* Allocate the Name stack */
1668
+ if (ctxt->nameTab == NULL) {
1669
+ ctxt->nameTab = (const xmlChar **) xmlMalloc(10 * sizeof(xmlChar *));
1670
+ ctxt->nameMax = 10;
1671
+ }
1672
+ if (ctxt->nameTab == NULL) {
1673
+ xmlErrMemory(NULL, "cannot initialize parser context\n");
1674
+ ctxt->nodeNr = 0;
1675
+ ctxt->nodeMax = 0;
1676
+ ctxt->node = NULL;
1677
+ ctxt->inputNr = 0;
1678
+ ctxt->inputMax = 0;
1679
+ ctxt->input = NULL;
1680
+ ctxt->nameNr = 0;
1681
+ ctxt->nameMax = 0;
1682
+ ctxt->name = NULL;
1683
+ return(-1);
1684
+ }
1685
+ ctxt->nameNr = 0;
1686
+ ctxt->name = NULL;
1687
+
1688
+ /* Allocate the space stack */
1689
+ if (ctxt->spaceTab == NULL) {
1690
+ ctxt->spaceTab = (int *) xmlMalloc(10 * sizeof(int));
1691
+ ctxt->spaceMax = 10;
1692
+ }
1693
+ if (ctxt->spaceTab == NULL) {
1694
+ xmlErrMemory(NULL, "cannot initialize parser context\n");
1695
+ ctxt->nodeNr = 0;
1696
+ ctxt->nodeMax = 0;
1697
+ ctxt->node = NULL;
1698
+ ctxt->inputNr = 0;
1699
+ ctxt->inputMax = 0;
1700
+ ctxt->input = NULL;
1701
+ ctxt->nameNr = 0;
1702
+ ctxt->nameMax = 0;
1703
+ ctxt->name = NULL;
1704
+ ctxt->spaceNr = 0;
1705
+ ctxt->spaceMax = 0;
1706
+ ctxt->space = NULL;
1707
+ return(-1);
1708
+ }
1709
+ ctxt->spaceNr = 1;
1710
+ ctxt->spaceMax = 10;
1711
+ ctxt->spaceTab[0] = -1;
1712
+ ctxt->space = &ctxt->spaceTab[0];
1713
+ ctxt->userData = ctxt;
1714
+ ctxt->myDoc = NULL;
1715
+ ctxt->wellFormed = 1;
1716
+ ctxt->nsWellFormed = 1;
1717
+ ctxt->valid = 1;
1718
+ ctxt->loadsubset = xmlLoadExtDtdDefaultValue;
1719
+ if (ctxt->loadsubset) {
1720
+ ctxt->options |= XML_PARSE_DTDLOAD;
1721
+ }
1722
+ ctxt->validate = xmlDoValidityCheckingDefaultValue;
1723
+ ctxt->pedantic = xmlPedanticParserDefaultValue;
1724
+ if (ctxt->pedantic) {
1725
+ ctxt->options |= XML_PARSE_PEDANTIC;
1726
+ }
1727
+ ctxt->linenumbers = xmlLineNumbersDefaultValue;
1728
+ ctxt->keepBlanks = xmlKeepBlanksDefaultValue;
1729
+ if (ctxt->keepBlanks == 0) {
1730
+ ctxt->sax->ignorableWhitespace = xmlSAX2IgnorableWhitespace;
1731
+ ctxt->options |= XML_PARSE_NOBLANKS;
1732
+ }
1733
+
1734
+ ctxt->vctxt.finishDtd = XML_CTXT_FINISH_DTD_0;
1735
+ ctxt->vctxt.userData = ctxt;
1736
+ ctxt->vctxt.error = xmlParserValidityError;
1737
+ ctxt->vctxt.warning = xmlParserValidityWarning;
1738
+ if (ctxt->validate) {
1739
+ if (xmlGetWarningsDefaultValue == 0)
1740
+ ctxt->vctxt.warning = NULL;
1741
+ else
1742
+ ctxt->vctxt.warning = xmlParserValidityWarning;
1743
+ ctxt->vctxt.nodeMax = 0;
1744
+ ctxt->options |= XML_PARSE_DTDVALID;
1745
+ }
1746
+ ctxt->replaceEntities = xmlSubstituteEntitiesDefaultValue;
1747
+ if (ctxt->replaceEntities) {
1748
+ ctxt->options |= XML_PARSE_NOENT;
1749
+ }
1750
+ ctxt->record_info = 0;
1751
+ ctxt->checkIndex = 0;
1752
+ ctxt->inSubset = 0;
1753
+ ctxt->errNo = XML_ERR_OK;
1754
+ ctxt->depth = 0;
1755
+ ctxt->charset = XML_CHAR_ENCODING_UTF8;
1756
+ ctxt->catalogs = NULL;
1757
+ ctxt->nbentities = 0;
1758
+ ctxt->sizeentities = 0;
1759
+ ctxt->sizeentcopy = 0;
1760
+ ctxt->input_id = 1;
1761
+ xmlInitNodeInfoSeq(&ctxt->node_seq);
1762
+ return(0);
1763
+ }
1764
+
1765
+ /**
1766
+ * xmlFreeParserCtxt:
1767
+ * @ctxt: an XML parser context
1768
+ *
1769
+ * Free all the memory used by a parser context. However the parsed
1770
+ * document in ctxt->myDoc is not freed.
1771
+ */
1772
+
1773
+ void
1774
+ xmlFreeParserCtxt(xmlParserCtxtPtr ctxt)
1775
+ {
1776
+ xmlParserInputPtr input;
1777
+
1778
+ if (ctxt == NULL) return;
1779
+
1780
+ while ((input = inputPop(ctxt)) != NULL) { /* Non consuming */
1781
+ xmlFreeInputStream(input);
1782
+ }
1783
+ if (ctxt->spaceTab != NULL) xmlFree(ctxt->spaceTab);
1784
+ if (ctxt->nameTab != NULL) xmlFree((xmlChar * *)ctxt->nameTab);
1785
+ if (ctxt->nodeTab != NULL) xmlFree(ctxt->nodeTab);
1786
+ if (ctxt->nodeInfoTab != NULL) xmlFree(ctxt->nodeInfoTab);
1787
+ if (ctxt->inputTab != NULL) xmlFree(ctxt->inputTab);
1788
+ if (ctxt->version != NULL) xmlFree((char *) ctxt->version);
1789
+ if (ctxt->encoding != NULL) xmlFree((char *) ctxt->encoding);
1790
+ if (ctxt->extSubURI != NULL) xmlFree((char *) ctxt->extSubURI);
1791
+ if (ctxt->extSubSystem != NULL) xmlFree((char *) ctxt->extSubSystem);
1792
+ #ifdef LIBXML_SAX1_ENABLED
1793
+ if ((ctxt->sax != NULL) &&
1794
+ (ctxt->sax != (xmlSAXHandlerPtr) &xmlDefaultSAXHandler))
1795
+ #else
1796
+ if (ctxt->sax != NULL)
1797
+ #endif /* LIBXML_SAX1_ENABLED */
1798
+ xmlFree(ctxt->sax);
1799
+ if (ctxt->directory != NULL) xmlFree((char *) ctxt->directory);
1800
+ if (ctxt->vctxt.nodeTab != NULL) xmlFree(ctxt->vctxt.nodeTab);
1801
+ if (ctxt->atts != NULL) xmlFree((xmlChar * *)ctxt->atts);
1802
+ if (ctxt->dict != NULL) xmlDictFree(ctxt->dict);
1803
+ if (ctxt->nsTab != NULL) xmlFree((char *) ctxt->nsTab);
1804
+ if (ctxt->pushTab != NULL) xmlFree(ctxt->pushTab);
1805
+ if (ctxt->attallocs != NULL) xmlFree(ctxt->attallocs);
1806
+ if (ctxt->attsDefault != NULL)
1807
+ xmlHashFree(ctxt->attsDefault, xmlHashDefaultDeallocator);
1808
+ if (ctxt->attsSpecial != NULL)
1809
+ xmlHashFree(ctxt->attsSpecial, NULL);
1810
+ if (ctxt->freeElems != NULL) {
1811
+ xmlNodePtr cur, next;
1812
+
1813
+ cur = ctxt->freeElems;
1814
+ while (cur != NULL) {
1815
+ next = cur->next;
1816
+ xmlFree(cur);
1817
+ cur = next;
1818
+ }
1819
+ }
1820
+ if (ctxt->freeAttrs != NULL) {
1821
+ xmlAttrPtr cur, next;
1822
+
1823
+ cur = ctxt->freeAttrs;
1824
+ while (cur != NULL) {
1825
+ next = cur->next;
1826
+ xmlFree(cur);
1827
+ cur = next;
1828
+ }
1829
+ }
1830
+ /*
1831
+ * cleanup the error strings
1832
+ */
1833
+ if (ctxt->lastError.message != NULL)
1834
+ xmlFree(ctxt->lastError.message);
1835
+ if (ctxt->lastError.file != NULL)
1836
+ xmlFree(ctxt->lastError.file);
1837
+ if (ctxt->lastError.str1 != NULL)
1838
+ xmlFree(ctxt->lastError.str1);
1839
+ if (ctxt->lastError.str2 != NULL)
1840
+ xmlFree(ctxt->lastError.str2);
1841
+ if (ctxt->lastError.str3 != NULL)
1842
+ xmlFree(ctxt->lastError.str3);
1843
+
1844
+ #ifdef LIBXML_CATALOG_ENABLED
1845
+ if (ctxt->catalogs != NULL)
1846
+ xmlCatalogFreeLocal(ctxt->catalogs);
1847
+ #endif
1848
+ xmlFree(ctxt);
1849
+ }
1850
+
1851
+ /**
1852
+ * xmlNewParserCtxt:
1853
+ *
1854
+ * Allocate and initialize a new parser context.
1855
+ *
1856
+ * Returns the xmlParserCtxtPtr or NULL
1857
+ */
1858
+
1859
+ xmlParserCtxtPtr
1860
+ xmlNewParserCtxt(void)
1861
+ {
1862
+ xmlParserCtxtPtr ctxt;
1863
+
1864
+ ctxt = (xmlParserCtxtPtr) xmlMalloc(sizeof(xmlParserCtxt));
1865
+ if (ctxt == NULL) {
1866
+ xmlErrMemory(NULL, "cannot allocate parser context\n");
1867
+ return(NULL);
1868
+ }
1869
+ memset(ctxt, 0, sizeof(xmlParserCtxt));
1870
+ if (xmlInitParserCtxt(ctxt) < 0) {
1871
+ xmlFreeParserCtxt(ctxt);
1872
+ return(NULL);
1873
+ }
1874
+ return(ctxt);
1875
+ }
1876
+
1877
+ /************************************************************************
1878
+ * *
1879
+ * Handling of node information *
1880
+ * *
1881
+ ************************************************************************/
1882
+
1883
+ /**
1884
+ * xmlClearParserCtxt:
1885
+ * @ctxt: an XML parser context
1886
+ *
1887
+ * Clear (release owned resources) and reinitialize a parser context
1888
+ */
1889
+
1890
+ void
1891
+ xmlClearParserCtxt(xmlParserCtxtPtr ctxt)
1892
+ {
1893
+ if (ctxt==NULL)
1894
+ return;
1895
+ xmlClearNodeInfoSeq(&ctxt->node_seq);
1896
+ xmlCtxtReset(ctxt);
1897
+ }
1898
+
1899
+
1900
+ /**
1901
+ * xmlParserFindNodeInfo:
1902
+ * @ctx: an XML parser context
1903
+ * @node: an XML node within the tree
1904
+ *
1905
+ * Find the parser node info struct for a given node
1906
+ *
1907
+ * Returns an xmlParserNodeInfo block pointer or NULL
1908
+ */
1909
+ const xmlParserNodeInfo *
1910
+ xmlParserFindNodeInfo(const xmlParserCtxtPtr ctx, const xmlNodePtr node)
1911
+ {
1912
+ unsigned long pos;
1913
+
1914
+ if ((ctx == NULL) || (node == NULL))
1915
+ return (NULL);
1916
+ /* Find position where node should be at */
1917
+ pos = xmlParserFindNodeInfoIndex(&ctx->node_seq, node);
1918
+ if (pos < ctx->node_seq.length
1919
+ && ctx->node_seq.buffer[pos].node == node)
1920
+ return &ctx->node_seq.buffer[pos];
1921
+ else
1922
+ return NULL;
1923
+ }
1924
+
1925
+
1926
+ /**
1927
+ * xmlInitNodeInfoSeq:
1928
+ * @seq: a node info sequence pointer
1929
+ *
1930
+ * -- Initialize (set to initial state) node info sequence
1931
+ */
1932
+ void
1933
+ xmlInitNodeInfoSeq(xmlParserNodeInfoSeqPtr seq)
1934
+ {
1935
+ if (seq == NULL)
1936
+ return;
1937
+ seq->length = 0;
1938
+ seq->maximum = 0;
1939
+ seq->buffer = NULL;
1940
+ }
1941
+
1942
+ /**
1943
+ * xmlClearNodeInfoSeq:
1944
+ * @seq: a node info sequence pointer
1945
+ *
1946
+ * -- Clear (release memory and reinitialize) node
1947
+ * info sequence
1948
+ */
1949
+ void
1950
+ xmlClearNodeInfoSeq(xmlParserNodeInfoSeqPtr seq)
1951
+ {
1952
+ if (seq == NULL)
1953
+ return;
1954
+ if (seq->buffer != NULL)
1955
+ xmlFree(seq->buffer);
1956
+ xmlInitNodeInfoSeq(seq);
1957
+ }
1958
+
1959
+ /**
1960
+ * xmlParserFindNodeInfoIndex:
1961
+ * @seq: a node info sequence pointer
1962
+ * @node: an XML node pointer
1963
+ *
1964
+ *
1965
+ * xmlParserFindNodeInfoIndex : Find the index that the info record for
1966
+ * the given node is or should be at in a sorted sequence
1967
+ *
1968
+ * Returns a long indicating the position of the record
1969
+ */
1970
+ unsigned long
1971
+ xmlParserFindNodeInfoIndex(const xmlParserNodeInfoSeqPtr seq,
1972
+ const xmlNodePtr node)
1973
+ {
1974
+ unsigned long upper, lower, middle;
1975
+ int found = 0;
1976
+
1977
+ if ((seq == NULL) || (node == NULL))
1978
+ return ((unsigned long) -1);
1979
+
1980
+ /* Do a binary search for the key */
1981
+ lower = 1;
1982
+ upper = seq->length;
1983
+ middle = 0;
1984
+ while (lower <= upper && !found) {
1985
+ middle = lower + (upper - lower) / 2;
1986
+ if (node == seq->buffer[middle - 1].node)
1987
+ found = 1;
1988
+ else if (node < seq->buffer[middle - 1].node)
1989
+ upper = middle - 1;
1990
+ else
1991
+ lower = middle + 1;
1992
+ }
1993
+
1994
+ /* Return position */
1995
+ if (middle == 0 || seq->buffer[middle - 1].node < node)
1996
+ return middle;
1997
+ else
1998
+ return middle - 1;
1999
+ }
2000
+
2001
+
2002
+ /**
2003
+ * xmlParserAddNodeInfo:
2004
+ * @ctxt: an XML parser context
2005
+ * @info: a node info sequence pointer
2006
+ *
2007
+ * Insert node info record into the sorted sequence
2008
+ */
2009
+ void
2010
+ xmlParserAddNodeInfo(xmlParserCtxtPtr ctxt,
2011
+ const xmlParserNodeInfoPtr info)
2012
+ {
2013
+ unsigned long pos;
2014
+
2015
+ if ((ctxt == NULL) || (info == NULL)) return;
2016
+
2017
+ /* Find pos and check to see if node is already in the sequence */
2018
+ pos = xmlParserFindNodeInfoIndex(&ctxt->node_seq, (xmlNodePtr)
2019
+ info->node);
2020
+
2021
+ if ((pos < ctxt->node_seq.length) &&
2022
+ (ctxt->node_seq.buffer != NULL) &&
2023
+ (ctxt->node_seq.buffer[pos].node == info->node)) {
2024
+ ctxt->node_seq.buffer[pos] = *info;
2025
+ }
2026
+
2027
+ /* Otherwise, we need to add new node to buffer */
2028
+ else {
2029
+ if ((ctxt->node_seq.length + 1 > ctxt->node_seq.maximum) ||
2030
+ (ctxt->node_seq.buffer == NULL)) {
2031
+ xmlParserNodeInfo *tmp_buffer;
2032
+ unsigned int byte_size;
2033
+
2034
+ if (ctxt->node_seq.maximum == 0)
2035
+ ctxt->node_seq.maximum = 2;
2036
+ byte_size = (sizeof(*ctxt->node_seq.buffer) *
2037
+ (2 * ctxt->node_seq.maximum));
2038
+
2039
+ if (ctxt->node_seq.buffer == NULL)
2040
+ tmp_buffer = (xmlParserNodeInfo *) xmlMalloc(byte_size);
2041
+ else
2042
+ tmp_buffer =
2043
+ (xmlParserNodeInfo *) xmlRealloc(ctxt->node_seq.buffer,
2044
+ byte_size);
2045
+
2046
+ if (tmp_buffer == NULL) {
2047
+ xmlErrMemory(ctxt, "failed to allocate buffer\n");
2048
+ return;
2049
+ }
2050
+ ctxt->node_seq.buffer = tmp_buffer;
2051
+ ctxt->node_seq.maximum *= 2;
2052
+ }
2053
+
2054
+ /* If position is not at end, move elements out of the way */
2055
+ if (pos != ctxt->node_seq.length) {
2056
+ unsigned long i;
2057
+
2058
+ for (i = ctxt->node_seq.length; i > pos; i--)
2059
+ ctxt->node_seq.buffer[i] = ctxt->node_seq.buffer[i - 1];
2060
+ }
2061
+
2062
+ /* Copy element and increase length */
2063
+ ctxt->node_seq.buffer[pos] = *info;
2064
+ ctxt->node_seq.length++;
2065
+ }
2066
+ }
2067
+
2068
+ /************************************************************************
2069
+ * *
2070
+ * Defaults settings *
2071
+ * *
2072
+ ************************************************************************/
2073
+ /**
2074
+ * xmlPedanticParserDefault:
2075
+ * @val: int 0 or 1
2076
+ *
2077
+ * Set and return the previous value for enabling pedantic warnings.
2078
+ *
2079
+ * Returns the last value for 0 for no substitution, 1 for substitution.
2080
+ */
2081
+
2082
+ int
2083
+ xmlPedanticParserDefault(int val) {
2084
+ int old = xmlPedanticParserDefaultValue;
2085
+
2086
+ xmlPedanticParserDefaultValue = val;
2087
+ return(old);
2088
+ }
2089
+
2090
+ /**
2091
+ * xmlLineNumbersDefault:
2092
+ * @val: int 0 or 1
2093
+ *
2094
+ * Set and return the previous value for enabling line numbers in elements
2095
+ * contents. This may break on old application and is turned off by default.
2096
+ *
2097
+ * Returns the last value for 0 for no substitution, 1 for substitution.
2098
+ */
2099
+
2100
+ int
2101
+ xmlLineNumbersDefault(int val) {
2102
+ int old = xmlLineNumbersDefaultValue;
2103
+
2104
+ xmlLineNumbersDefaultValue = val;
2105
+ return(old);
2106
+ }
2107
+
2108
+ /**
2109
+ * xmlSubstituteEntitiesDefault:
2110
+ * @val: int 0 or 1
2111
+ *
2112
+ * Set and return the previous value for default entity support.
2113
+ * Initially the parser always keep entity references instead of substituting
2114
+ * entity values in the output. This function has to be used to change the
2115
+ * default parser behavior
2116
+ * SAX::substituteEntities() has to be used for changing that on a file by
2117
+ * file basis.
2118
+ *
2119
+ * Returns the last value for 0 for no substitution, 1 for substitution.
2120
+ */
2121
+
2122
+ int
2123
+ xmlSubstituteEntitiesDefault(int val) {
2124
+ int old = xmlSubstituteEntitiesDefaultValue;
2125
+
2126
+ xmlSubstituteEntitiesDefaultValue = val;
2127
+ return(old);
2128
+ }
2129
+
2130
+ /**
2131
+ * xmlKeepBlanksDefault:
2132
+ * @val: int 0 or 1
2133
+ *
2134
+ * Set and return the previous value for default blanks text nodes support.
2135
+ * The 1.x version of the parser used an heuristic to try to detect
2136
+ * ignorable white spaces. As a result the SAX callback was generating
2137
+ * xmlSAX2IgnorableWhitespace() callbacks instead of characters() one, and when
2138
+ * using the DOM output text nodes containing those blanks were not generated.
2139
+ * The 2.x and later version will switch to the XML standard way and
2140
+ * ignorableWhitespace() are only generated when running the parser in
2141
+ * validating mode and when the current element doesn't allow CDATA or
2142
+ * mixed content.
2143
+ * This function is provided as a way to force the standard behavior
2144
+ * on 1.X libs and to switch back to the old mode for compatibility when
2145
+ * running 1.X client code on 2.X . Upgrade of 1.X code should be done
2146
+ * by using xmlIsBlankNode() commodity function to detect the "empty"
2147
+ * nodes generated.
2148
+ * This value also affect autogeneration of indentation when saving code
2149
+ * if blanks sections are kept, indentation is not generated.
2150
+ *
2151
+ * Returns the last value for 0 for no substitution, 1 for substitution.
2152
+ */
2153
+
2154
+ int
2155
+ xmlKeepBlanksDefault(int val) {
2156
+ int old = xmlKeepBlanksDefaultValue;
2157
+
2158
+ xmlKeepBlanksDefaultValue = val;
2159
+ if (!val) xmlIndentTreeOutput = 1;
2160
+ return(old);
2161
+ }
2162
+
2163
+ #define bottom_parserInternals
2164
+ #include "elfgcchack.h"