|
43 | 43 |
|
44 | 44 | #include "private/buf.h" |
45 | 45 | #include "private/error.h" |
| 46 | +#include "private/io.h" |
46 | 47 | #include "private/memory.h" |
47 | 48 | #include "private/parser.h" |
48 | 49 | #include "private/tree.h" |
@@ -188,6 +189,21 @@ static int xmlTextReaderNextTree(xmlTextReaderPtr reader); |
188 | 189 | static void xmlTextReaderFreeNode(xmlTextReaderPtr reader, xmlNodePtr cur); |
189 | 190 | static void xmlTextReaderFreeNodeList(xmlTextReaderPtr reader, xmlNodePtr cur); |
190 | 191 |
|
| 192 | +static void |
| 193 | +xmlTextReaderErr(xmlParserErrors code, const char *msg, ...) { |
| 194 | + va_list ap; |
| 195 | + int res; |
| 196 | + |
| 197 | + va_start(ap, msg); |
| 198 | + res = xmlVRaiseError(NULL, NULL, NULL, NULL, NULL, |
| 199 | + XML_FROM_PARSER, code, XML_ERR_FATAL, |
| 200 | + NULL, 0, NULL, NULL, NULL, 0, 0, |
| 201 | + msg, ap); |
| 202 | + va_end(ap); |
| 203 | + if (res < 0) |
| 204 | + xmlRaiseMemoryError(NULL, NULL, NULL, XML_FROM_PARSER, NULL); |
| 205 | +} |
| 206 | + |
191 | 207 | static void |
192 | 208 | xmlTextReaderErrMemory(xmlTextReaderPtr reader) { |
193 | 209 | if (reader->ctxt != NULL) |
@@ -2114,11 +2130,30 @@ xmlNewTextReaderFilename(const char *URI) { |
2114 | 2130 | xmlParserInputBufferPtr input; |
2115 | 2131 | xmlTextReaderPtr ret; |
2116 | 2132 |
|
2117 | | - input = xmlParserInputBufferCreateFilename(URI, XML_CHAR_ENCODING_NONE); |
2118 | | - if (input == NULL) |
2119 | | - return(NULL); |
| 2133 | + if (xmlParserInputBufferCreateFilenameValue != NULL) { |
| 2134 | + input = xmlParserInputBufferCreateFilenameValue(URI, |
| 2135 | + XML_CHAR_ENCODING_NONE); |
| 2136 | + if (input == NULL) { |
| 2137 | + xmlTextReaderErr(XML_IO_ENOENT, "filaed to open %s", URI); |
| 2138 | + return(NULL); |
| 2139 | + } |
| 2140 | + } else { |
| 2141 | + xmlParserErrors code; |
| 2142 | + |
| 2143 | + /* |
| 2144 | + * TODO: Remove XML_INPUT_UNZIP |
| 2145 | + */ |
| 2146 | + code = xmlParserInputBufferCreateUrl(URI, XML_CHAR_ENCODING_NONE, |
| 2147 | + XML_INPUT_UNZIP, &input); |
| 2148 | + if (code != XML_ERR_OK) { |
| 2149 | + xmlTextReaderErr(code, "failed to open %s", URI); |
| 2150 | + return(NULL); |
| 2151 | + } |
| 2152 | + } |
| 2153 | + |
2120 | 2154 | ret = xmlNewTextReader(input, URI); |
2121 | 2155 | if (ret == NULL) { |
| 2156 | + xmlTextReaderErrMemory(NULL); |
2122 | 2157 | xmlFreeParserInputBuffer(input); |
2123 | 2158 | return(NULL); |
2124 | 2159 | } |
@@ -5226,23 +5261,39 @@ xmlReaderForFd(int fd, const char *URL, const char *encoding, int options) |
5226 | 5261 | { |
5227 | 5262 | xmlTextReaderPtr reader; |
5228 | 5263 | xmlParserInputBufferPtr input; |
| 5264 | + xmlParserErrors code; |
5229 | 5265 |
|
5230 | | - if (fd < 0) |
5231 | | - return (NULL); |
| 5266 | + if (fd < 0) { |
| 5267 | + xmlTextReaderErr(XML_ERR_ARGUMENT, "invalid argument"); |
| 5268 | + return(NULL); |
| 5269 | + } |
5232 | 5270 |
|
5233 | | - input = xmlParserInputBufferCreateFd(fd, XML_CHAR_ENCODING_NONE); |
5234 | | - if (input == NULL) |
5235 | | - return (NULL); |
| 5271 | + input = xmlAllocParserInputBuffer(XML_CHAR_ENCODING_NONE); |
| 5272 | + if (input == NULL) { |
| 5273 | + xmlTextReaderErrMemory(NULL); |
| 5274 | + return(NULL); |
| 5275 | + } |
| 5276 | + /* |
| 5277 | + * TODO: Remove XML_INPUT_UNZIP |
| 5278 | + */ |
| 5279 | + code = xmlInputFromFd(input, fd, XML_INPUT_UNZIP); |
| 5280 | + if (code != XML_ERR_OK) { |
| 5281 | + xmlTextReaderErr(code, "failed to open fd"); |
| 5282 | + return(NULL); |
| 5283 | + } |
5236 | 5284 | input->closecallback = NULL; |
| 5285 | + |
5237 | 5286 | reader = xmlNewTextReader(input, URL); |
5238 | 5287 | if (reader == NULL) { |
| 5288 | + xmlTextReaderErrMemory(NULL); |
5239 | 5289 | xmlFreeParserInputBuffer(input); |
5240 | | - return (NULL); |
| 5290 | + return(NULL); |
5241 | 5291 | } |
5242 | 5292 | reader->allocs |= XML_TEXTREADER_INPUT; |
5243 | 5293 | if (xmlTextReaderSetup(reader, NULL, URL, encoding, options) < 0) { |
| 5294 | + xmlTextReaderErrMemory(NULL); |
5244 | 5295 | xmlFreeTextReader(reader); |
5245 | | - return (NULL); |
| 5296 | + return(NULL); |
5246 | 5297 | } |
5247 | 5298 | return (reader); |
5248 | 5299 | } |
@@ -5386,17 +5437,42 @@ xmlReaderNewFile(xmlTextReaderPtr reader, const char *filename, |
5386 | 5437 | { |
5387 | 5438 | xmlParserInputBufferPtr input; |
5388 | 5439 |
|
5389 | | - if (filename == NULL) |
5390 | | - return (-1); |
5391 | | - if (reader == NULL) |
5392 | | - return (-1); |
| 5440 | + if ((filename == NULL) || (reader == NULL)) { |
| 5441 | + xmlTextReaderErr(XML_ERR_ARGUMENT, "invalid argument"); |
| 5442 | + return(-1); |
| 5443 | + } |
5393 | 5444 |
|
5394 | | - input = |
5395 | | - xmlParserInputBufferCreateFilename(filename, |
5396 | | - XML_CHAR_ENCODING_NONE); |
5397 | | - if (input == NULL) |
5398 | | - return (-1); |
5399 | | - return (xmlTextReaderSetup(reader, input, filename, encoding, options)); |
| 5445 | + if (xmlParserInputBufferCreateFilenameValue != NULL) { |
| 5446 | + input = xmlParserInputBufferCreateFilenameValue(filename, |
| 5447 | + XML_CHAR_ENCODING_NONE); |
| 5448 | + if (input == NULL) { |
| 5449 | + xmlTextReaderErr(XML_IO_ENOENT, "failed to open %s", filename); |
| 5450 | + return(-1); |
| 5451 | + } |
| 5452 | + } else { |
| 5453 | + /* |
| 5454 | + * TODO: Remove XML_INPUT_UNZIP |
| 5455 | + */ |
| 5456 | + xmlParserInputFlags flags = XML_INPUT_UNZIP; |
| 5457 | + xmlParserErrors code; |
| 5458 | + |
| 5459 | + if ((options & XML_PARSE_NONET) == 0) |
| 5460 | + flags |= XML_INPUT_NETWORK; |
| 5461 | + |
| 5462 | + code = xmlParserInputBufferCreateUrl(filename, XML_CHAR_ENCODING_NONE, |
| 5463 | + flags, &input); |
| 5464 | + if (code != XML_ERR_OK) { |
| 5465 | + xmlTextReaderErr(code, "failed to open %s", filename); |
| 5466 | + return(-1); |
| 5467 | + } |
| 5468 | + } |
| 5469 | + |
| 5470 | + if (xmlTextReaderSetup(reader, input, filename, encoding, options) < 0) { |
| 5471 | + xmlTextReaderErrMemory(NULL); |
| 5472 | + return(-1); |
| 5473 | + } |
| 5474 | + |
| 5475 | + return(0); |
5400 | 5476 | } |
5401 | 5477 |
|
5402 | 5478 | /** |
@@ -5454,17 +5530,34 @@ xmlReaderNewFd(xmlTextReaderPtr reader, int fd, |
5454 | 5530 | const char *URL, const char *encoding, int options) |
5455 | 5531 | { |
5456 | 5532 | xmlParserInputBufferPtr input; |
| 5533 | + xmlParserErrors code; |
5457 | 5534 |
|
5458 | | - if (fd < 0) |
5459 | | - return (-1); |
5460 | | - if (reader == NULL) |
5461 | | - return (-1); |
| 5535 | + if ((fd < 0) || (reader == NULL)) { |
| 5536 | + xmlTextReaderErr(XML_ERR_ARGUMENT, "invalid argument"); |
| 5537 | + return(-1); |
| 5538 | + } |
5462 | 5539 |
|
5463 | | - input = xmlParserInputBufferCreateFd(fd, XML_CHAR_ENCODING_NONE); |
5464 | | - if (input == NULL) |
5465 | | - return (-1); |
| 5540 | + input = xmlAllocParserInputBuffer(XML_CHAR_ENCODING_NONE); |
| 5541 | + if (input == NULL) { |
| 5542 | + xmlTextReaderErrMemory(NULL); |
| 5543 | + return(-1); |
| 5544 | + } |
| 5545 | + /* |
| 5546 | + * TODO: Remove XML_INPUT_UNZIP |
| 5547 | + */ |
| 5548 | + code = xmlInputFromFd(input, fd, XML_INPUT_UNZIP); |
| 5549 | + if (code != XML_ERR_OK) { |
| 5550 | + xmlTextReaderErr(code, "failed to open fd"); |
| 5551 | + return(-1); |
| 5552 | + } |
5466 | 5553 | input->closecallback = NULL; |
5467 | | - return (xmlTextReaderSetup(reader, input, URL, encoding, options)); |
| 5554 | + |
| 5555 | + if (xmlTextReaderSetup(reader, input, URL, encoding, options) < 0) { |
| 5556 | + xmlTextReaderErrMemory(NULL); |
| 5557 | + return(-1); |
| 5558 | + } |
| 5559 | + |
| 5560 | + return(0); |
5468 | 5561 | } |
5469 | 5562 |
|
5470 | 5563 | /** |
|
0 commit comments