| OLD | NEW |
| 1 /* | 1 /* |
| 2 * xmlreader.c: implements the xmlTextReader streaming node API | 2 * xmlreader.c: implements the xmlTextReader streaming node API |
| 3 * | 3 * |
| 4 * NOTE: | 4 * NOTE: |
| 5 * XmlTextReader.Normalization Property won't be supported, since | 5 * XmlTextReader.Normalization Property won't be supported, since |
| 6 * it makes the parser non compliant to the XML recommendation | 6 * it makes the parser non compliant to the XML recommendation |
| 7 * | 7 * |
| 8 * See Copyright for the status of this software. | 8 * See Copyright for the status of this software. |
| 9 * | 9 * |
| 10 * daniel@veillard.com | 10 * daniel@veillard.com |
| (...skipping 26 matching lines...) Expand all Loading... |
| 37 #include <libxml/xmlschemas.h> | 37 #include <libxml/xmlschemas.h> |
| 38 #endif | 38 #endif |
| 39 #include <libxml/uri.h> | 39 #include <libxml/uri.h> |
| 40 #ifdef LIBXML_XINCLUDE_ENABLED | 40 #ifdef LIBXML_XINCLUDE_ENABLED |
| 41 #include <libxml/xinclude.h> | 41 #include <libxml/xinclude.h> |
| 42 #endif | 42 #endif |
| 43 #ifdef LIBXML_PATTERN_ENABLED | 43 #ifdef LIBXML_PATTERN_ENABLED |
| 44 #include <libxml/pattern.h> | 44 #include <libxml/pattern.h> |
| 45 #endif | 45 #endif |
| 46 | 46 |
| 47 #include "buf.h" |
| 48 |
| 47 #define MAX_ERR_MSG_SIZE 64000 | 49 #define MAX_ERR_MSG_SIZE 64000 |
| 48 | 50 |
| 49 /* | 51 /* |
| 50 * The following VA_COPY was coded following an example in | 52 * The following VA_COPY was coded following an example in |
| 51 * the Samba project. It may not be sufficient for some | 53 * the Samba project. It may not be sufficient for some |
| 52 * esoteric implementations of va_list (i.e. it may need | 54 * esoteric implementations of va_list but (hopefully) will |
| 53 * something involving a memcpy) but (hopefully) will be | 55 * be sufficient for libxml2. |
| 54 * sufficient for libxml2. | |
| 55 */ | 56 */ |
| 56 #ifndef VA_COPY | 57 #ifndef VA_COPY |
| 57 #ifdef HAVE_VA_COPY | 58 #ifdef HAVE_VA_COPY |
| 58 #define VA_COPY(dest, src) va_copy(dest, src) | 59 #define VA_COPY(dest, src) va_copy(dest, src) |
| 59 #else | 60 #else |
| 60 #ifdef HAVE___VA_COPY | 61 #ifdef HAVE___VA_COPY |
| 61 #define VA_COPY(dest,src) __va_copy(dest, src) | 62 #define VA_COPY(dest,src) __va_copy(dest, src) |
| 62 #else | 63 #else |
| 63 #define VA_COPY(dest,src) (dest) = (src) | 64 #ifndef VA_LIST_IS_ARRAY |
| 65 #define VA_COPY(dest,src) (dest) = (src) |
| 66 #else |
| 67 #include <string.h> |
| 68 #define VA_COPY(dest,src) memcpy((char *)(dest),(char *)(src),sizeof(va_
list)) |
| 69 #endif |
| 64 #endif | 70 #endif |
| 65 #endif | 71 #endif |
| 66 #endif | 72 #endif |
| 67 | 73 |
| 68 /* #define DEBUG_CALLBACKS */ | 74 /* #define DEBUG_CALLBACKS */ |
| 69 /* #define DEBUG_READER */ | 75 /* #define DEBUG_READER */ |
| 70 | 76 |
| 71 /** | 77 /** |
| 72 * TODO: | 78 * TODO: |
| 73 * | 79 * |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 128 endElementNsSAX2Func endElementNs; /* idem */ | 134 endElementNsSAX2Func endElementNs; /* idem */ |
| 129 charactersSAXFunc characters; | 135 charactersSAXFunc characters; |
| 130 cdataBlockSAXFunc cdataBlock; | 136 cdataBlockSAXFunc cdataBlock; |
| 131 unsigned int base; /* base of the segment in the input */ | 137 unsigned int base; /* base of the segment in the input */ |
| 132 unsigned int cur; /* current position in the input */ | 138 unsigned int cur; /* current position in the input */ |
| 133 xmlNodePtr node; /* current node */ | 139 xmlNodePtr node; /* current node */ |
| 134 xmlNodePtr curnode;/* current attribute node */ | 140 xmlNodePtr curnode;/* current attribute node */ |
| 135 int depth; /* depth of the current node */ | 141 int depth; /* depth of the current node */ |
| 136 xmlNodePtr faketext;/* fake xmlNs chld */ | 142 xmlNodePtr faketext;/* fake xmlNs chld */ |
| 137 int preserve;/* preserve the resulting document */ | 143 int preserve;/* preserve the resulting document */ |
| 138 xmlBufferPtr» » buffer; /* used to return const xmlChar * */ | 144 xmlBufPtr» » buffer; /* used to return const xmlChar * */ |
| 139 xmlDictPtr dict; /* the context dictionnary */ | 145 xmlDictPtr dict; /* the context dictionnary */ |
| 140 | 146 |
| 141 /* entity stack when traversing entities content */ | 147 /* entity stack when traversing entities content */ |
| 142 xmlNodePtr ent; /* Current Entity Ref Node */ | 148 xmlNodePtr ent; /* Current Entity Ref Node */ |
| 143 int entNr; /* Depth of the entities stack */ | 149 int entNr; /* Depth of the entities stack */ |
| 144 int entMax; /* Max depth of the entities stack */ | 150 int entMax; /* Max depth of the entities stack */ |
| 145 xmlNodePtr *entTab; /* array of entities */ | 151 xmlNodePtr *entTab; /* array of entities */ |
| 146 | 152 |
| 147 /* error handling */ | 153 /* error handling */ |
| 148 xmlTextReaderErrorFunc errorFunc; /* callback function */ | 154 xmlTextReaderErrorFunc errorFunc; /* callback function */ |
| 149 void *errorFuncArg; /* callback function user argument */ | 155 void *errorFuncArg; /* callback function user argument */ |
| 150 | 156 |
| 151 #ifdef LIBXML_SCHEMAS_ENABLED | 157 #ifdef LIBXML_SCHEMAS_ENABLED |
| 152 /* Handling of RelaxNG validation */ | 158 /* Handling of RelaxNG validation */ |
| 153 xmlRelaxNGPtr rngSchemas; /* The Relax NG schemas */ | 159 xmlRelaxNGPtr rngSchemas; /* The Relax NG schemas */ |
| 154 xmlRelaxNGValidCtxtPtr rngValidCtxt;/* The Relax NG validation context */ | 160 xmlRelaxNGValidCtxtPtr rngValidCtxt;/* The Relax NG validation context */ |
| 161 int rngPreserveCtxt; /* 1 if the context was provided by
the user */ |
| 155 int rngValidErrors;/* The number of errors detected */ | 162 int rngValidErrors;/* The number of errors detected */ |
| 156 xmlNodePtr rngFullNode; /* the node if RNG not progressive */ | 163 xmlNodePtr rngFullNode; /* the node if RNG not progressive */ |
| 157 /* Handling of Schemas validation */ | 164 /* Handling of Schemas validation */ |
| 158 xmlSchemaPtr xsdSchemas; /* The Schemas schemas */ | 165 xmlSchemaPtr xsdSchemas; /* The Schemas schemas */ |
| 159 xmlSchemaValidCtxtPtr xsdValidCtxt;/* The Schemas validation context */ | 166 xmlSchemaValidCtxtPtr xsdValidCtxt;/* The Schemas validation context */ |
| 160 int xsdPreserveCtxt; /* 1 if the context was provided by t
he user */ | 167 int xsdPreserveCtxt; /* 1 if the context was provided by t
he user */ |
| 161 int xsdValidErrors;/* The number of errors detected */ | 168 int xsdValidErrors;/* The number of errors detected */ |
| 162 xmlSchemaSAXPlugPtr xsdPlug; /* the schemas plug in SAX pipeline */ | 169 xmlSchemaSAXPlugPtr xsdPlug; /* the schemas plug in SAX pipeline */ |
| 163 #endif | 170 #endif |
| 164 #ifdef LIBXML_XINCLUDE_ENABLED | 171 #ifdef LIBXML_XINCLUDE_ENABLED |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 272 * xmlTextReaderFreeProp: | 279 * xmlTextReaderFreeProp: |
| 273 * @reader: the xmlTextReaderPtr used | 280 * @reader: the xmlTextReaderPtr used |
| 274 * @cur: the node | 281 * @cur: the node |
| 275 * | 282 * |
| 276 * Free a node. | 283 * Free a node. |
| 277 */ | 284 */ |
| 278 static void | 285 static void |
| 279 xmlTextReaderFreeProp(xmlTextReaderPtr reader, xmlAttrPtr cur) { | 286 xmlTextReaderFreeProp(xmlTextReaderPtr reader, xmlAttrPtr cur) { |
| 280 xmlDictPtr dict; | 287 xmlDictPtr dict; |
| 281 | 288 |
| 282 dict = reader->ctxt->dict; | 289 if ((reader != NULL) && (reader->ctxt != NULL)) |
| 290 » dict = reader->ctxt->dict; |
| 291 else |
| 292 dict = NULL; |
| 283 if (cur == NULL) return; | 293 if (cur == NULL) return; |
| 284 | 294 |
| 285 if ((__xmlRegisterCallbacks) && (xmlDeregisterNodeDefaultValue)) | 295 if ((__xmlRegisterCallbacks) && (xmlDeregisterNodeDefaultValue)) |
| 286 xmlDeregisterNodeDefaultValue((xmlNodePtr) cur); | 296 xmlDeregisterNodeDefaultValue((xmlNodePtr) cur); |
| 287 | 297 |
| 288 /* Check for ID removal -> leading to invalid references ! */ | 298 /* Check for ID removal -> leading to invalid references ! */ |
| 289 if ((cur->parent != NULL) && (cur->parent->doc != NULL) && | 299 if ((cur->parent != NULL) && (cur->parent->doc != NULL) && |
| 290 ((cur->parent->doc->intSubset != NULL) || | 300 ((cur->parent->doc->intSubset != NULL) || |
| 291 (cur->parent->doc->extSubset != NULL))) { | 301 (cur->parent->doc->extSubset != NULL))) { |
| 292 if (xmlIsID(cur->parent->doc, cur->parent, cur)) | 302 if (xmlIsID(cur->parent->doc, cur->parent, cur)) |
| (...skipping 16 matching lines...) Expand all Loading... |
| 309 /** | 319 /** |
| 310 * xmlTextReaderFreePropList: | 320 * xmlTextReaderFreePropList: |
| 311 * @reader: the xmlTextReaderPtr used | 321 * @reader: the xmlTextReaderPtr used |
| 312 * @cur: the first property in the list | 322 * @cur: the first property in the list |
| 313 * | 323 * |
| 314 * Free a property and all its siblings, all the children are freed too. | 324 * Free a property and all its siblings, all the children are freed too. |
| 315 */ | 325 */ |
| 316 static void | 326 static void |
| 317 xmlTextReaderFreePropList(xmlTextReaderPtr reader, xmlAttrPtr cur) { | 327 xmlTextReaderFreePropList(xmlTextReaderPtr reader, xmlAttrPtr cur) { |
| 318 xmlAttrPtr next; | 328 xmlAttrPtr next; |
| 319 if (cur == NULL) return; | 329 |
| 320 while (cur != NULL) { | 330 while (cur != NULL) { |
| 321 next = cur->next; | 331 next = cur->next; |
| 322 xmlTextReaderFreeProp(reader, cur); | 332 xmlTextReaderFreeProp(reader, cur); |
| 323 cur = next; | 333 cur = next; |
| 324 } | 334 } |
| 325 } | 335 } |
| 326 | 336 |
| 327 /** | 337 /** |
| 328 * xmlTextReaderFreeNodeList: | 338 * xmlTextReaderFreeNodeList: |
| 329 * @reader: the xmlTextReaderPtr used | 339 * @reader: the xmlTextReaderPtr used |
| 330 * @cur: the first node in the list | 340 * @cur: the first node in the list |
| 331 * | 341 * |
| 332 * Free a node and all its siblings, this is a recursive behaviour, all | 342 * Free a node and all its siblings, this is a recursive behaviour, all |
| 333 * the children are freed too. | 343 * the children are freed too. |
| 334 */ | 344 */ |
| 335 static void | 345 static void |
| 336 xmlTextReaderFreeNodeList(xmlTextReaderPtr reader, xmlNodePtr cur) { | 346 xmlTextReaderFreeNodeList(xmlTextReaderPtr reader, xmlNodePtr cur) { |
| 337 xmlNodePtr next; | 347 xmlNodePtr next; |
| 338 xmlDictPtr dict; | 348 xmlDictPtr dict; |
| 339 | 349 |
| 340 dict = reader->ctxt->dict; | 350 if ((reader != NULL) && (reader->ctxt != NULL)) |
| 351 » dict = reader->ctxt->dict; |
| 352 else |
| 353 dict = NULL; |
| 341 if (cur == NULL) return; | 354 if (cur == NULL) return; |
| 342 if (cur->type == XML_NAMESPACE_DECL) { | 355 if (cur->type == XML_NAMESPACE_DECL) { |
| 343 xmlFreeNsList((xmlNsPtr) cur); | 356 xmlFreeNsList((xmlNsPtr) cur); |
| 344 return; | 357 return; |
| 345 } | 358 } |
| 346 if ((cur->type == XML_DOCUMENT_NODE) || | 359 if ((cur->type == XML_DOCUMENT_NODE) || |
| 347 (cur->type == XML_HTML_DOCUMENT_NODE)) { | 360 (cur->type == XML_HTML_DOCUMENT_NODE)) { |
| 348 xmlFreeDoc((xmlDocPtr) cur); | 361 xmlFreeDoc((xmlDocPtr) cur); |
| 349 return; | 362 return; |
| 350 } | 363 } |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 407 * @reader: the xmlTextReaderPtr used | 420 * @reader: the xmlTextReaderPtr used |
| 408 * @cur: the node | 421 * @cur: the node |
| 409 * | 422 * |
| 410 * Free a node, this is a recursive behaviour, all the children are freed too. | 423 * Free a node, this is a recursive behaviour, all the children are freed too. |
| 411 * This doesn't unlink the child from the list, use xmlUnlinkNode() first. | 424 * This doesn't unlink the child from the list, use xmlUnlinkNode() first. |
| 412 */ | 425 */ |
| 413 static void | 426 static void |
| 414 xmlTextReaderFreeNode(xmlTextReaderPtr reader, xmlNodePtr cur) { | 427 xmlTextReaderFreeNode(xmlTextReaderPtr reader, xmlNodePtr cur) { |
| 415 xmlDictPtr dict; | 428 xmlDictPtr dict; |
| 416 | 429 |
| 417 dict = reader->ctxt->dict; | 430 if ((reader != NULL) && (reader->ctxt != NULL)) |
| 431 » dict = reader->ctxt->dict; |
| 432 else |
| 433 dict = NULL; |
| 418 if (cur->type == XML_DTD_NODE) { | 434 if (cur->type == XML_DTD_NODE) { |
| 419 xmlFreeDtd((xmlDtdPtr) cur); | 435 xmlFreeDtd((xmlDtdPtr) cur); |
| 420 return; | 436 return; |
| 421 } | 437 } |
| 422 if (cur->type == XML_NAMESPACE_DECL) { | 438 if (cur->type == XML_NAMESPACE_DECL) { |
| 423 xmlFreeNs((xmlNsPtr) cur); | 439 xmlFreeNs((xmlNsPtr) cur); |
| 424 return; | 440 return; |
| 425 } | 441 } |
| 426 if (cur->type == XML_ATTRIBUTE_NODE) { | 442 if (cur->type == XML_ATTRIBUTE_NODE) { |
| 427 xmlTextReaderFreeProp(reader, (xmlAttrPtr) cur); | 443 xmlTextReaderFreeProp(reader, (xmlAttrPtr) cur); |
| (...skipping 371 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 799 * xmlTextReaderPushData: | 815 * xmlTextReaderPushData: |
| 800 * @reader: the xmlTextReaderPtr used | 816 * @reader: the xmlTextReaderPtr used |
| 801 * | 817 * |
| 802 * Push data down the progressive parser until a significant callback | 818 * Push data down the progressive parser until a significant callback |
| 803 * got raised. | 819 * got raised. |
| 804 * | 820 * |
| 805 * Returns -1 in case of failure, 0 otherwise | 821 * Returns -1 in case of failure, 0 otherwise |
| 806 */ | 822 */ |
| 807 static int | 823 static int |
| 808 xmlTextReaderPushData(xmlTextReaderPtr reader) { | 824 xmlTextReaderPushData(xmlTextReaderPtr reader) { |
| 809 xmlBufferPtr inbuf; | 825 xmlBufPtr inbuf; |
| 810 int val, s; | 826 int val, s; |
| 811 xmlTextReaderState oldstate; | 827 xmlTextReaderState oldstate; |
| 828 int alloc; |
| 812 | 829 |
| 813 if ((reader->input == NULL) || (reader->input->buffer == NULL)) | 830 if ((reader->input == NULL) || (reader->input->buffer == NULL)) |
| 814 return(-1); | 831 return(-1); |
| 815 | 832 |
| 816 oldstate = reader->state; | 833 oldstate = reader->state; |
| 817 reader->state = XML_TEXTREADER_NONE; | 834 reader->state = XML_TEXTREADER_NONE; |
| 818 inbuf = reader->input->buffer; | 835 inbuf = reader->input->buffer; |
| 836 alloc = xmlBufGetAllocationScheme(inbuf); |
| 819 | 837 |
| 820 while (reader->state == XML_TEXTREADER_NONE) { | 838 while (reader->state == XML_TEXTREADER_NONE) { |
| 821 » if (inbuf->use < reader->cur + CHUNK_SIZE) { | 839 » if (xmlBufUse(inbuf) < reader->cur + CHUNK_SIZE) { |
| 822 /* | 840 /* |
| 823 * Refill the buffer unless we are at the end of the stream | 841 * Refill the buffer unless we are at the end of the stream |
| 824 */ | 842 */ |
| 825 if (reader->mode != XML_TEXTREADER_MODE_EOF) { | 843 if (reader->mode != XML_TEXTREADER_MODE_EOF) { |
| 826 val = xmlParserInputBufferRead(reader->input, 4096); | 844 val = xmlParserInputBufferRead(reader->input, 4096); |
| 827 if ((val == 0) && | 845 if ((val == 0) && |
| 828 » » (inbuf->alloc == XML_BUFFER_ALLOC_IMMUTABLE)) { | 846 » » (alloc == XML_BUFFER_ALLOC_IMMUTABLE)) { |
| 829 » » if (inbuf->use == reader->cur) { | 847 » » if (xmlBufUse(inbuf) == reader->cur) { |
| 830 reader->mode = XML_TEXTREADER_MODE_EOF; | 848 reader->mode = XML_TEXTREADER_MODE_EOF; |
| 831 reader->state = oldstate; | 849 reader->state = oldstate; |
| 832 } | 850 } |
| 833 } else if (val < 0) { | 851 } else if (val < 0) { |
| 834 reader->mode = XML_TEXTREADER_MODE_EOF; | 852 reader->mode = XML_TEXTREADER_MODE_EOF; |
| 835 reader->state = oldstate; | 853 reader->state = oldstate; |
| 836 if ((oldstate != XML_TEXTREADER_START) || | 854 if ((oldstate != XML_TEXTREADER_START) || |
| 837 (reader->ctxt->myDoc != NULL)) | 855 (reader->ctxt->myDoc != NULL)) |
| 838 return(val); | 856 return(val); |
| 839 } else if (val == 0) { | 857 } else if (val == 0) { |
| 840 /* mark the end of the stream and process the remains */ | 858 /* mark the end of the stream and process the remains */ |
| 841 reader->mode = XML_TEXTREADER_MODE_EOF; | 859 reader->mode = XML_TEXTREADER_MODE_EOF; |
| 842 break; | 860 break; |
| 843 } | 861 } |
| 844 | 862 |
| 845 } else | 863 } else |
| 846 break; | 864 break; |
| 847 } | 865 } |
| 848 /* | 866 /* |
| 849 * parse by block of CHUNK_SIZE bytes, various tests show that | 867 * parse by block of CHUNK_SIZE bytes, various tests show that |
| 850 * it's the best tradeoff at least on a 1.2GH Duron | 868 * it's the best tradeoff at least on a 1.2GH Duron |
| 851 */ | 869 */ |
| 852 » if (inbuf->use >= reader->cur + CHUNK_SIZE) { | 870 » if (xmlBufUse(inbuf) >= reader->cur + CHUNK_SIZE) { |
| 853 val = xmlParseChunk(reader->ctxt, | 871 val = xmlParseChunk(reader->ctxt, |
| 854 » » (const char *) &inbuf->content[reader->cur], | 872 (const char *) xmlBufContent(inbuf) + reader->cur, |
| 855 » » » CHUNK_SIZE, 0); | 873 CHUNK_SIZE, 0); |
| 856 reader->cur += CHUNK_SIZE; | 874 reader->cur += CHUNK_SIZE; |
| 857 » if ((val != 0) || (reader->ctxt->wellFormed == 0)) | 875 » if (val != 0) |
| 858 » » return(-1); | 876 » » reader->ctxt->wellFormed = 0; |
| 877 » if (reader->ctxt->wellFormed == 0) |
| 878 » » break; |
| 859 } else { | 879 } else { |
| 860 » s = inbuf->use - reader->cur; | 880 » s = xmlBufUse(inbuf) - reader->cur; |
| 861 val = xmlParseChunk(reader->ctxt, | 881 val = xmlParseChunk(reader->ctxt, |
| 862 » » (const char *) &inbuf->content[reader->cur], | 882 » » (const char *) xmlBufContent(inbuf) + reader->cur, |
| 863 » » » s, 0); | 883 » » » s, 0); |
| 864 reader->cur += s; | 884 reader->cur += s; |
| 865 » if ((val != 0) || (reader->ctxt->wellFormed == 0)) | 885 » if (val != 0) |
| 866 » » return(-1); | 886 » » reader->ctxt->wellFormed = 0; |
| 867 break; | 887 break; |
| 868 } | 888 } |
| 869 } | 889 } |
| 870 | 890 |
| 871 /* | 891 /* |
| 872 * Discard the consumed input when needed and possible | 892 * Discard the consumed input when needed and possible |
| 873 */ | 893 */ |
| 874 if (reader->mode == XML_TEXTREADER_MODE_INTERACTIVE) { | 894 if (reader->mode == XML_TEXTREADER_MODE_INTERACTIVE) { |
| 875 if (inbuf->alloc != XML_BUFFER_ALLOC_IMMUTABLE) { | 895 if (alloc != XML_BUFFER_ALLOC_IMMUTABLE) { |
| 876 if ((reader->cur >= 4096) && | 896 if ((reader->cur >= 4096) && |
| 877 » » (inbuf->use - reader->cur <= CHUNK_SIZE)) { | 897 » » (xmlBufUse(inbuf) - reader->cur <= CHUNK_SIZE)) { |
| 878 » » val = xmlBufferShrink(inbuf, reader->cur); | 898 » » val = xmlBufShrink(inbuf, reader->cur); |
| 879 if (val >= 0) { | 899 if (val >= 0) { |
| 880 reader->cur -= val; | 900 reader->cur -= val; |
| 881 } | 901 } |
| 882 } | 902 } |
| 883 } | 903 } |
| 884 } | 904 } |
| 885 | 905 |
| 886 /* | 906 /* |
| 887 * At the end of the stream signal that the work is done to the Push | 907 * At the end of the stream signal that the work is done to the Push |
| 888 * parser. | 908 * parser. |
| 889 */ | 909 */ |
| 890 else if (reader->mode == XML_TEXTREADER_MODE_EOF) { | 910 else if (reader->mode == XML_TEXTREADER_MODE_EOF) { |
| 891 if (reader->state != XML_TEXTREADER_DONE) { | 911 if (reader->state != XML_TEXTREADER_DONE) { |
| 892 » s = inbuf->use - reader->cur; | 912 » s = xmlBufUse(inbuf) - reader->cur; |
| 893 val = xmlParseChunk(reader->ctxt, | 913 val = xmlParseChunk(reader->ctxt, |
| 894 » » (const char *) &inbuf->content[reader->cur], | 914 » » (const char *) xmlBufContent(inbuf) + reader->cur, |
| 895 » » s, 1); | 915 » » » s, 1); |
| 896 » reader->cur = inbuf->use; | 916 » reader->cur = xmlBufUse(inbuf); |
| 897 reader->state = XML_TEXTREADER_DONE; | 917 reader->state = XML_TEXTREADER_DONE; |
| 898 » if ((val != 0) || (reader->ctxt->wellFormed == 0)) | 918 » if (val != 0) { |
| 899 » return(-1); | 919 » if (reader->ctxt->wellFormed) |
| 920 » » reader->ctxt->wellFormed = 0; |
| 921 » » else |
| 922 » » return(-1); |
| 923 » } |
| 900 } | 924 } |
| 901 } | 925 } |
| 902 reader->state = oldstate; | 926 reader->state = oldstate; |
| 927 if (reader->ctxt->wellFormed == 0) { |
| 928 reader->mode = XML_TEXTREADER_MODE_EOF; |
| 929 return(-1); |
| 930 } |
| 931 |
| 903 return(0); | 932 return(0); |
| 904 } | 933 } |
| 905 | 934 |
| 906 #ifdef LIBXML_REGEXP_ENABLED | 935 #ifdef LIBXML_REGEXP_ENABLED |
| 907 /** | 936 /** |
| 908 * xmlTextReaderValidatePush: | 937 * xmlTextReaderValidatePush: |
| 909 * @reader: the xmlTextReaderPtr used | 938 * @reader: the xmlTextReaderPtr used |
| 910 * | 939 * |
| 911 * Push the current node for validation | 940 * Push the current node for validation |
| 912 */ | 941 */ |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 961 if (ret != 1) | 990 if (ret != 1) |
| 962 reader->rngValidErrors++; | 991 reader->rngValidErrors++; |
| 963 } | 992 } |
| 964 #endif | 993 #endif |
| 965 } | 994 } |
| 966 | 995 |
| 967 /** | 996 /** |
| 968 * xmlTextReaderValidateCData: | 997 * xmlTextReaderValidateCData: |
| 969 * @reader: the xmlTextReaderPtr used | 998 * @reader: the xmlTextReaderPtr used |
| 970 * @data: pointer to the CData | 999 * @data: pointer to the CData |
| 971 * @len: lenght of the CData block in bytes. | 1000 * @len: length of the CData block in bytes. |
| 972 * | 1001 * |
| 973 * Push some CData for validation | 1002 * Push some CData for validation |
| 974 */ | 1003 */ |
| 975 static void | 1004 static void |
| 976 xmlTextReaderValidateCData(xmlTextReaderPtr reader, | 1005 xmlTextReaderValidateCData(xmlTextReaderPtr reader, |
| 977 const xmlChar *data, int len) { | 1006 const xmlChar *data, int len) { |
| 978 #ifdef LIBXML_VALID_ENABLED | 1007 #ifdef LIBXML_VALID_ENABLED |
| 979 if ((reader->validate == XML_TEXTREADER_VALIDATE_DTD) && | 1008 if ((reader->validate == XML_TEXTREADER_VALIDATE_DTD) && |
| 980 (reader->ctxt != NULL) && (reader->ctxt->validate == 1)) { | 1009 (reader->ctxt != NULL) && (reader->ctxt->validate == 1)) { |
| 981 reader->ctxt->valid &= xmlValidatePushCData(&reader->ctxt->vctxt, | 1010 reader->ctxt->valid &= xmlValidatePushCData(&reader->ctxt->vctxt, |
| (...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1205 * to xmlTextReaderReadString. | 1234 * to xmlTextReaderReadString. |
| 1206 * | 1235 * |
| 1207 * Returns a string containing the content, or NULL in case of error. | 1236 * Returns a string containing the content, or NULL in case of error. |
| 1208 */ | 1237 */ |
| 1209 static xmlChar * | 1238 static xmlChar * |
| 1210 xmlTextReaderCollectSiblings(xmlNodePtr node) | 1239 xmlTextReaderCollectSiblings(xmlNodePtr node) |
| 1211 { | 1240 { |
| 1212 xmlBufferPtr buffer; | 1241 xmlBufferPtr buffer; |
| 1213 xmlChar *ret; | 1242 xmlChar *ret; |
| 1214 | 1243 |
| 1244 if ((node == NULL) || (node->type == XML_NAMESPACE_DECL)) |
| 1245 return(NULL); |
| 1246 |
| 1215 buffer = xmlBufferCreate(); | 1247 buffer = xmlBufferCreate(); |
| 1216 if (buffer == NULL) | 1248 if (buffer == NULL) |
| 1217 return NULL; | 1249 return NULL; |
| 1218 | 1250 |
| 1219 for ( ; node != NULL; node = node->next) { | 1251 for ( ; node != NULL; node = node->next) { |
| 1220 switch (node->type) { | 1252 switch (node->type) { |
| 1221 case XML_TEXT_NODE: | 1253 case XML_TEXT_NODE: |
| 1222 case XML_CDATA_SECTION_NODE: | 1254 case XML_CDATA_SECTION_NODE: |
| 1223 xmlBufferCat(buffer, node->content); | 1255 xmlBufferCat(buffer, node->content); |
| 1224 break; | 1256 break; |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1257 xmlNodePtr oldnode = NULL; | 1289 xmlNodePtr oldnode = NULL; |
| 1258 | 1290 |
| 1259 | 1291 |
| 1260 if (reader == NULL) | 1292 if (reader == NULL) |
| 1261 return(-1); | 1293 return(-1); |
| 1262 reader->curnode = NULL; | 1294 reader->curnode = NULL; |
| 1263 if (reader->doc != NULL) | 1295 if (reader->doc != NULL) |
| 1264 return(xmlTextReaderReadTree(reader)); | 1296 return(xmlTextReaderReadTree(reader)); |
| 1265 if (reader->ctxt == NULL) | 1297 if (reader->ctxt == NULL) |
| 1266 return(-1); | 1298 return(-1); |
| 1267 if (reader->ctxt->wellFormed != 1) | |
| 1268 return(-1); | |
| 1269 | 1299 |
| 1270 #ifdef DEBUG_READER | 1300 #ifdef DEBUG_READER |
| 1271 fprintf(stderr, "\nREAD "); | 1301 fprintf(stderr, "\nREAD "); |
| 1272 DUMP_READER | 1302 DUMP_READER |
| 1273 #endif | 1303 #endif |
| 1274 if (reader->mode == XML_TEXTREADER_MODE_INITIAL) { | 1304 if (reader->mode == XML_TEXTREADER_MODE_INITIAL) { |
| 1275 reader->mode = XML_TEXTREADER_MODE_INTERACTIVE; | 1305 reader->mode = XML_TEXTREADER_MODE_INTERACTIVE; |
| 1276 /* | 1306 /* |
| 1277 * Initial state | 1307 * Initial state |
| 1278 */ | 1308 */ |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1385 | 1415 |
| 1386 /* | 1416 /* |
| 1387 * Cleanup of the old node | 1417 * Cleanup of the old node |
| 1388 */ | 1418 */ |
| 1389 if ((reader->preserves == 0) && | 1419 if ((reader->preserves == 0) && |
| 1390 #ifdef LIBXML_XINCLUDE_ENABLED | 1420 #ifdef LIBXML_XINCLUDE_ENABLED |
| 1391 (reader->in_xinclude == 0) && | 1421 (reader->in_xinclude == 0) && |
| 1392 #endif | 1422 #endif |
| 1393 (reader->entNr == 0) && | 1423 (reader->entNr == 0) && |
| 1394 (reader->node->prev != NULL) && | 1424 (reader->node->prev != NULL) && |
| 1395 » (reader->node->prev->type != XML_DTD_NODE)) { | 1425 (reader->node->prev->type != XML_DTD_NODE)) { |
| 1396 xmlNodePtr tmp = reader->node->prev; | 1426 xmlNodePtr tmp = reader->node->prev; |
| 1397 if ((tmp->extra & NODE_IS_PRESERVED) == 0) { | 1427 if ((tmp->extra & NODE_IS_PRESERVED) == 0) { |
| 1398 xmlUnlinkNode(tmp); | 1428 xmlUnlinkNode(tmp); |
| 1399 xmlTextReaderFreeNode(reader, tmp); | 1429 xmlTextReaderFreeNode(reader, tmp); |
| 1400 } | 1430 } |
| 1401 } | 1431 } |
| 1402 | 1432 |
| 1403 goto node_found; | 1433 goto node_found; |
| 1404 } | 1434 } |
| 1405 if ((oldstate == XML_TEXTREADER_ELEMENT) && | 1435 if ((oldstate == XML_TEXTREADER_ELEMENT) && |
| 1406 (reader->node->type == XML_ELEMENT_NODE) && | 1436 (reader->node->type == XML_ELEMENT_NODE) && |
| 1407 (reader->node->children == NULL) && | 1437 (reader->node->children == NULL) && |
| 1408 ((reader->node->extra & NODE_IS_EMPTY) == 0)) {; | 1438 ((reader->node->extra & NODE_IS_EMPTY) == 0)) {; |
| 1409 reader->state = XML_TEXTREADER_END; | 1439 reader->state = XML_TEXTREADER_END; |
| 1410 goto node_found; | 1440 goto node_found; |
| 1411 } | 1441 } |
| 1412 #ifdef LIBXML_REGEXP_ENABLED | 1442 #ifdef LIBXML_REGEXP_ENABLED |
| 1413 if ((reader->validate) && (reader->node->type == XML_ELEMENT_NODE)) | 1443 if ((reader->validate != XML_TEXTREADER_NOT_VALIDATE) && (reader->node->type
== XML_ELEMENT_NODE)) |
| 1414 xmlTextReaderValidatePop(reader); | 1444 xmlTextReaderValidatePop(reader); |
| 1415 #endif /* LIBXML_REGEXP_ENABLED */ | 1445 #endif /* LIBXML_REGEXP_ENABLED */ |
| 1416 if ((reader->preserves > 0) && | 1446 if ((reader->preserves > 0) && |
| 1417 (reader->node->extra & NODE_IS_SPRESERVED)) | 1447 (reader->node->extra & NODE_IS_SPRESERVED)) |
| 1418 reader->preserves--; | 1448 reader->preserves--; |
| 1419 reader->node = reader->node->parent; | 1449 reader->node = reader->node->parent; |
| 1420 if ((reader->node == NULL) || | 1450 if ((reader->node == NULL) || |
| 1421 (reader->node->type == XML_DOCUMENT_NODE) || | 1451 (reader->node->type == XML_DOCUMENT_NODE) || |
| 1422 #ifdef LIBXML_DOCB_ENABLED | 1452 #ifdef LIBXML_DOCB_ENABLED |
| 1423 (reader->node->type == XML_DOCB_DOCUMENT_NODE) || | 1453 (reader->node->type == XML_DOCB_DOCUMENT_NODE) || |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1536 #endif /* LIBXML_REGEXP_ENABLED */ | 1566 #endif /* LIBXML_REGEXP_ENABLED */ |
| 1537 } | 1567 } |
| 1538 if ((reader->node != NULL) && | 1568 if ((reader->node != NULL) && |
| 1539 (reader->node->type == XML_ENTITY_DECL) && | 1569 (reader->node->type == XML_ENTITY_DECL) && |
| 1540 (reader->ent != NULL) && (reader->ent->children == reader->node)) { | 1570 (reader->ent != NULL) && (reader->ent->children == reader->node)) { |
| 1541 reader->node = xmlTextReaderEntPop(reader); | 1571 reader->node = xmlTextReaderEntPop(reader); |
| 1542 reader->depth++; | 1572 reader->depth++; |
| 1543 goto get_next_node; | 1573 goto get_next_node; |
| 1544 } | 1574 } |
| 1545 #ifdef LIBXML_REGEXP_ENABLED | 1575 #ifdef LIBXML_REGEXP_ENABLED |
| 1546 if ((reader->validate) && (reader->node != NULL)) { | 1576 if ((reader->validate != XML_TEXTREADER_NOT_VALIDATE) && (reader->node != NU
LL)) { |
| 1547 xmlNodePtr node = reader->node; | 1577 xmlNodePtr node = reader->node; |
| 1548 | 1578 |
| 1549 if ((node->type == XML_ELEMENT_NODE) && | 1579 if ((node->type == XML_ELEMENT_NODE) && |
| 1550 ((reader->state != XML_TEXTREADER_END) && | 1580 ((reader->state != XML_TEXTREADER_END) && |
| 1551 (reader->state != XML_TEXTREADER_BACKTRACK))) { | 1581 (reader->state != XML_TEXTREADER_BACKTRACK))) { |
| 1552 xmlTextReaderValidatePush(reader); | 1582 xmlTextReaderValidatePush(reader); |
| 1553 } else if ((node->type == XML_TEXT_NODE) || | 1583 } else if ((node->type == XML_TEXT_NODE) || |
| 1554 (node->type == XML_CDATA_SECTION_NODE)) { | 1584 (node->type == XML_CDATA_SECTION_NODE)) { |
| 1555 xmlTextReaderValidateCData(reader, node->content, | 1585 xmlTextReaderValidateCData(reader, node->content, |
| 1556 xmlStrlen(node->content)); | 1586 xmlStrlen(node->content)); |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1700 } | 1730 } |
| 1701 #endif | 1731 #endif |
| 1702 | 1732 |
| 1703 #ifdef LIBXML_WRITER_ENABLED | 1733 #ifdef LIBXML_WRITER_ENABLED |
| 1704 /** | 1734 /** |
| 1705 * xmlTextReaderReadOuterXml: | 1735 * xmlTextReaderReadOuterXml: |
| 1706 * @reader: the xmlTextReaderPtr used | 1736 * @reader: the xmlTextReaderPtr used |
| 1707 * | 1737 * |
| 1708 * Reads the contents of the current node, including child nodes and markup. | 1738 * Reads the contents of the current node, including child nodes and markup. |
| 1709 * | 1739 * |
| 1710 * Returns a string containing the XML content, or NULL if the current node | 1740 * Returns a string containing the node and any XML content, or NULL if the |
| 1711 * is neither an element nor attribute, or has no child nodes. The | 1741 * current node cannot be serialized. The string must be deallocated |
| 1712 * string must be deallocated by the caller. | 1742 * by the caller. |
| 1713 */ | 1743 */ |
| 1714 xmlChar * | 1744 xmlChar * |
| 1715 xmlTextReaderReadOuterXml(xmlTextReaderPtr reader ATTRIBUTE_UNUSED) | 1745 xmlTextReaderReadOuterXml(xmlTextReaderPtr reader ATTRIBUTE_UNUSED) |
| 1716 { | 1746 { |
| 1717 xmlChar *resbuf; | 1747 xmlChar *resbuf; |
| 1718 xmlNodePtr node; | 1748 xmlNodePtr node; |
| 1719 xmlBufferPtr buff; | 1749 xmlBufferPtr buff; |
| 1720 xmlDocPtr doc; | 1750 xmlDocPtr doc; |
| 1721 | 1751 |
| 1722 node = reader->node; | 1752 node = reader->node; |
| 1723 doc = reader->doc; | 1753 doc = reader->doc; |
| 1724 if (xmlTextReaderExpand(reader) == NULL) { | 1754 if (xmlTextReaderExpand(reader) == NULL) { |
| 1725 return NULL; | 1755 return NULL; |
| 1726 } | 1756 } |
| 1727 node = xmlDocCopyNode(node, doc, 1); | 1757 » if (node->type == XML_DTD_NODE) { |
| 1758 » » node = (xmlNodePtr) xmlCopyDtd((xmlDtdPtr) node); |
| 1759 » } else { |
| 1760 » » node = xmlDocCopyNode(node, doc, 1); |
| 1761 » } |
| 1728 buff = xmlBufferCreate(); | 1762 buff = xmlBufferCreate(); |
| 1729 if (xmlNodeDump(buff, doc, node, 0, 0) == -1) { | 1763 if (xmlNodeDump(buff, doc, node, 0, 0) == -1) { |
| 1730 xmlFreeNode(node); | 1764 xmlFreeNode(node); |
| 1731 xmlBufferFree(buff); | 1765 xmlBufferFree(buff); |
| 1732 return NULL; | 1766 return NULL; |
| 1733 } | 1767 } |
| 1734 | 1768 |
| 1735 resbuf = buff->content; | 1769 resbuf = buff->content; |
| 1736 buff->content = NULL; | 1770 buff->content = NULL; |
| 1737 | 1771 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1762 node = (reader->curnode != NULL) ? reader->curnode : reader->node; | 1796 node = (reader->curnode != NULL) ? reader->curnode : reader->node; |
| 1763 switch (node->type) { | 1797 switch (node->type) { |
| 1764 case XML_TEXT_NODE: | 1798 case XML_TEXT_NODE: |
| 1765 if (node->content != NULL) | 1799 if (node->content != NULL) |
| 1766 return(xmlStrdup(node->content)); | 1800 return(xmlStrdup(node->content)); |
| 1767 break; | 1801 break; |
| 1768 case XML_ELEMENT_NODE: | 1802 case XML_ELEMENT_NODE: |
| 1769 if (xmlTextReaderDoExpand(reader) != -1) { | 1803 if (xmlTextReaderDoExpand(reader) != -1) { |
| 1770 return xmlTextReaderCollectSiblings(node->children); | 1804 return xmlTextReaderCollectSiblings(node->children); |
| 1771 } | 1805 } |
| 1806 break; |
| 1772 case XML_ATTRIBUTE_NODE: | 1807 case XML_ATTRIBUTE_NODE: |
| 1773 TODO | 1808 TODO |
| 1774 break; | 1809 break; |
| 1775 default: | 1810 default: |
| 1776 break; | 1811 break; |
| 1777 } | 1812 } |
| 1778 return(NULL); | 1813 return(NULL); |
| 1779 } | 1814 } |
| 1780 | 1815 |
| 1781 #if 0 | 1816 #if 0 |
| (...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2042 xmlGenericError(xmlGenericErrorContext, | 2077 xmlGenericError(xmlGenericErrorContext, |
| 2043 "xmlNewTextReader : malloc failed\n"); | 2078 "xmlNewTextReader : malloc failed\n"); |
| 2044 return(NULL); | 2079 return(NULL); |
| 2045 } | 2080 } |
| 2046 memset(ret, 0, sizeof(xmlTextReader)); | 2081 memset(ret, 0, sizeof(xmlTextReader)); |
| 2047 ret->doc = NULL; | 2082 ret->doc = NULL; |
| 2048 ret->entTab = NULL; | 2083 ret->entTab = NULL; |
| 2049 ret->entMax = 0; | 2084 ret->entMax = 0; |
| 2050 ret->entNr = 0; | 2085 ret->entNr = 0; |
| 2051 ret->input = input; | 2086 ret->input = input; |
| 2052 ret->buffer = xmlBufferCreateSize(100); | 2087 ret->buffer = xmlBufCreateSize(100); |
| 2053 if (ret->buffer == NULL) { | 2088 if (ret->buffer == NULL) { |
| 2054 xmlFree(ret); | 2089 xmlFree(ret); |
| 2055 xmlGenericError(xmlGenericErrorContext, | 2090 xmlGenericError(xmlGenericErrorContext, |
| 2056 "xmlNewTextReader : malloc failed\n"); | 2091 "xmlNewTextReader : malloc failed\n"); |
| 2057 return(NULL); | 2092 return(NULL); |
| 2058 } | 2093 } |
| 2059 ret->sax = (xmlSAXHandler *) xmlMalloc(sizeof(xmlSAXHandler)); | 2094 ret->sax = (xmlSAXHandler *) xmlMalloc(sizeof(xmlSAXHandler)); |
| 2060 if (ret->sax == NULL) { | 2095 if (ret->sax == NULL) { |
| 2061 » xmlBufferFree(ret->buffer); | 2096 » xmlBufFree(ret->buffer); |
| 2062 xmlFree(ret); | 2097 xmlFree(ret); |
| 2063 xmlGenericError(xmlGenericErrorContext, | 2098 xmlGenericError(xmlGenericErrorContext, |
| 2064 "xmlNewTextReader : malloc failed\n"); | 2099 "xmlNewTextReader : malloc failed\n"); |
| 2065 return(NULL); | 2100 return(NULL); |
| 2066 } | 2101 } |
| 2067 xmlSAXVersion(ret->sax, 2); | 2102 xmlSAXVersion(ret->sax, 2); |
| 2068 ret->startElement = ret->sax->startElement; | 2103 ret->startElement = ret->sax->startElement; |
| 2069 ret->sax->startElement = xmlTextReaderStartElement; | 2104 ret->sax->startElement = xmlTextReaderStartElement; |
| 2070 ret->endElement = ret->sax->endElement; | 2105 ret->endElement = ret->sax->endElement; |
| 2071 ret->sax->endElement = xmlTextReaderEndElement; | 2106 ret->sax->endElement = xmlTextReaderEndElement; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 2084 #endif /* LIBXML_SAX1_ENABLED */ | 2119 #endif /* LIBXML_SAX1_ENABLED */ |
| 2085 ret->characters = ret->sax->characters; | 2120 ret->characters = ret->sax->characters; |
| 2086 ret->sax->characters = xmlTextReaderCharacters; | 2121 ret->sax->characters = xmlTextReaderCharacters; |
| 2087 ret->sax->ignorableWhitespace = xmlTextReaderCharacters; | 2122 ret->sax->ignorableWhitespace = xmlTextReaderCharacters; |
| 2088 ret->cdataBlock = ret->sax->cdataBlock; | 2123 ret->cdataBlock = ret->sax->cdataBlock; |
| 2089 ret->sax->cdataBlock = xmlTextReaderCDataBlock; | 2124 ret->sax->cdataBlock = xmlTextReaderCDataBlock; |
| 2090 | 2125 |
| 2091 ret->mode = XML_TEXTREADER_MODE_INITIAL; | 2126 ret->mode = XML_TEXTREADER_MODE_INITIAL; |
| 2092 ret->node = NULL; | 2127 ret->node = NULL; |
| 2093 ret->curnode = NULL; | 2128 ret->curnode = NULL; |
| 2094 if (ret->input->buffer->use < 4) { | 2129 if (xmlBufUse(ret->input->buffer) < 4) { |
| 2095 xmlParserInputBufferRead(input, 4); | 2130 xmlParserInputBufferRead(input, 4); |
| 2096 } | 2131 } |
| 2097 if (ret->input->buffer->use >= 4) { | 2132 if (xmlBufUse(ret->input->buffer) >= 4) { |
| 2098 ret->ctxt = xmlCreatePushParserCtxt(ret->sax, NULL, | 2133 ret->ctxt = xmlCreatePushParserCtxt(ret->sax, NULL, |
| 2099 » » » (const char *) ret->input->buffer->content, 4, URI); | 2134 » » » (const char *) xmlBufContent(ret->input->buffer), |
| 2135 4, URI); |
| 2100 ret->base = 0; | 2136 ret->base = 0; |
| 2101 ret->cur = 4; | 2137 ret->cur = 4; |
| 2102 } else { | 2138 } else { |
| 2103 ret->ctxt = xmlCreatePushParserCtxt(ret->sax, NULL, NULL, 0, URI); | 2139 ret->ctxt = xmlCreatePushParserCtxt(ret->sax, NULL, NULL, 0, URI); |
| 2104 ret->base = 0; | 2140 ret->base = 0; |
| 2105 ret->cur = 0; | 2141 ret->cur = 0; |
| 2106 } | 2142 } |
| 2107 | 2143 |
| 2108 if (ret->ctxt == NULL) { | 2144 if (ret->ctxt == NULL) { |
| 2109 xmlGenericError(xmlGenericErrorContext, | 2145 xmlGenericError(xmlGenericErrorContext, |
| 2110 "xmlNewTextReader : malloc failed\n"); | 2146 "xmlNewTextReader : malloc failed\n"); |
| 2111 » xmlBufferFree(ret->buffer); | 2147 » xmlBufFree(ret->buffer); |
| 2112 xmlFree(ret->sax); | 2148 xmlFree(ret->sax); |
| 2113 xmlFree(ret); | 2149 xmlFree(ret); |
| 2114 return(NULL); | 2150 return(NULL); |
| 2115 } | 2151 } |
| 2116 ret->ctxt->parseMode = XML_PARSE_READER; | 2152 ret->ctxt->parseMode = XML_PARSE_READER; |
| 2117 ret->ctxt->_private = ret; | 2153 ret->ctxt->_private = ret; |
| 2118 ret->ctxt->linenumbers = 1; | 2154 ret->ctxt->linenumbers = 1; |
| 2119 ret->ctxt->dictNames = 1; | 2155 ret->ctxt->dictNames = 1; |
| 2120 ret->allocs = XML_TEXTREADER_CTXT; | 2156 ret->allocs = XML_TEXTREADER_CTXT; |
| 2121 /* | 2157 /* |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2174 void | 2210 void |
| 2175 xmlFreeTextReader(xmlTextReaderPtr reader) { | 2211 xmlFreeTextReader(xmlTextReaderPtr reader) { |
| 2176 if (reader == NULL) | 2212 if (reader == NULL) |
| 2177 return; | 2213 return; |
| 2178 #ifdef LIBXML_SCHEMAS_ENABLED | 2214 #ifdef LIBXML_SCHEMAS_ENABLED |
| 2179 if (reader->rngSchemas != NULL) { | 2215 if (reader->rngSchemas != NULL) { |
| 2180 xmlRelaxNGFree(reader->rngSchemas); | 2216 xmlRelaxNGFree(reader->rngSchemas); |
| 2181 reader->rngSchemas = NULL; | 2217 reader->rngSchemas = NULL; |
| 2182 } | 2218 } |
| 2183 if (reader->rngValidCtxt != NULL) { | 2219 if (reader->rngValidCtxt != NULL) { |
| 2184 » xmlRelaxNGFreeValidCtxt(reader->rngValidCtxt); | 2220 » if (! reader->rngPreserveCtxt) |
| 2221 » xmlRelaxNGFreeValidCtxt(reader->rngValidCtxt); |
| 2185 reader->rngValidCtxt = NULL; | 2222 reader->rngValidCtxt = NULL; |
| 2186 } | 2223 } |
| 2187 if (reader->xsdPlug != NULL) { | 2224 if (reader->xsdPlug != NULL) { |
| 2188 xmlSchemaSAXUnplug(reader->xsdPlug); | 2225 xmlSchemaSAXUnplug(reader->xsdPlug); |
| 2189 reader->xsdPlug = NULL; | 2226 reader->xsdPlug = NULL; |
| 2190 } | 2227 } |
| 2191 if (reader->xsdValidCtxt != NULL) { | 2228 if (reader->xsdValidCtxt != NULL) { |
| 2192 if (! reader->xsdPreserveCtxt) | 2229 if (! reader->xsdPreserveCtxt) |
| 2193 xmlSchemaFreeValidCtxt(reader->xsdValidCtxt); | 2230 xmlSchemaFreeValidCtxt(reader->xsdValidCtxt); |
| 2194 reader->xsdValidCtxt = NULL; | 2231 reader->xsdValidCtxt = NULL; |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2230 reader->ctxt->vctxt.vstateMax = 0; | 2267 reader->ctxt->vctxt.vstateMax = 0; |
| 2231 } | 2268 } |
| 2232 if (reader->allocs & XML_TEXTREADER_CTXT) | 2269 if (reader->allocs & XML_TEXTREADER_CTXT) |
| 2233 xmlFreeParserCtxt(reader->ctxt); | 2270 xmlFreeParserCtxt(reader->ctxt); |
| 2234 } | 2271 } |
| 2235 if (reader->sax != NULL) | 2272 if (reader->sax != NULL) |
| 2236 xmlFree(reader->sax); | 2273 xmlFree(reader->sax); |
| 2237 if ((reader->input != NULL) && (reader->allocs & XML_TEXTREADER_INPUT)) | 2274 if ((reader->input != NULL) && (reader->allocs & XML_TEXTREADER_INPUT)) |
| 2238 xmlFreeParserInputBuffer(reader->input); | 2275 xmlFreeParserInputBuffer(reader->input); |
| 2239 if (reader->buffer != NULL) | 2276 if (reader->buffer != NULL) |
| 2240 xmlBufferFree(reader->buffer); | 2277 xmlBufFree(reader->buffer); |
| 2241 if (reader->entTab != NULL) | 2278 if (reader->entTab != NULL) |
| 2242 xmlFree(reader->entTab); | 2279 xmlFree(reader->entTab); |
| 2243 if (reader->dict != NULL) | 2280 if (reader->dict != NULL) |
| 2244 xmlDictFree(reader->dict); | 2281 xmlDictFree(reader->dict); |
| 2245 xmlFree(reader); | 2282 xmlFree(reader); |
| 2246 } | 2283 } |
| 2247 | 2284 |
| 2248 /************************************************************************ | 2285 /************************************************************************ |
| 2249 * * | 2286 * * |
| 2250 * Methods for XmlTextReader * | 2287 * Methods for XmlTextReader * |
| (...skipping 1327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3578 case XML_NAMESPACE_DECL: | 3615 case XML_NAMESPACE_DECL: |
| 3579 return(((xmlNsPtr) node)->href); | 3616 return(((xmlNsPtr) node)->href); |
| 3580 case XML_ATTRIBUTE_NODE:{ | 3617 case XML_ATTRIBUTE_NODE:{ |
| 3581 xmlAttrPtr attr = (xmlAttrPtr) node; | 3618 xmlAttrPtr attr = (xmlAttrPtr) node; |
| 3582 | 3619 |
| 3583 if ((attr->children != NULL) && | 3620 if ((attr->children != NULL) && |
| 3584 (attr->children->type == XML_TEXT_NODE) && | 3621 (attr->children->type == XML_TEXT_NODE) && |
| 3585 (attr->children->next == NULL)) | 3622 (attr->children->next == NULL)) |
| 3586 return(attr->children->content); | 3623 return(attr->children->content); |
| 3587 else { | 3624 else { |
| 3588 if (reader->buffer == NULL) | |
| 3589 reader->buffer = xmlBufferCreateSize(100); | |
| 3590 if (reader->buffer == NULL) { | 3625 if (reader->buffer == NULL) { |
| 3591 » » xmlGenericError(xmlGenericErrorContext, | 3626 » » reader->buffer = xmlBufCreateSize(100); |
| 3592 » » » » "xmlTextReaderSetup : malloc failed\n"); | 3627 if (reader->buffer == NULL) { |
| 3593 » » return (NULL); | 3628 xmlGenericError(xmlGenericErrorContext, |
| 3594 » » } | 3629 "xmlTextReaderSetup : malloc failed\n"); |
| 3595 » reader->buffer->use = 0; | 3630 return (NULL); |
| 3596 » xmlNodeBufGetContent(reader->buffer, node); | 3631 } |
| 3597 » » return(reader->buffer->content); | 3632 } else |
| 3633 xmlBufEmpty(reader->buffer); |
| 3634 » xmlBufGetNodeContent(reader->buffer, node); |
| 3635 » » return(xmlBufContent(reader->buffer)); |
| 3598 } | 3636 } |
| 3599 break; | 3637 break; |
| 3600 } | 3638 } |
| 3601 case XML_TEXT_NODE: | 3639 case XML_TEXT_NODE: |
| 3602 case XML_CDATA_SECTION_NODE: | 3640 case XML_CDATA_SECTION_NODE: |
| 3603 case XML_PI_NODE: | 3641 case XML_PI_NODE: |
| 3604 case XML_COMMENT_NODE: | 3642 case XML_COMMENT_NODE: |
| 3605 return(node->content); | 3643 return(node->content); |
| 3606 default: | 3644 default: |
| 3607 break; | 3645 break; |
| (...skipping 474 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4082 int | 4120 int |
| 4083 xmlTextReaderRelaxNGSetSchema(xmlTextReaderPtr reader, xmlRelaxNGPtr schema) { | 4121 xmlTextReaderRelaxNGSetSchema(xmlTextReaderPtr reader, xmlRelaxNGPtr schema) { |
| 4084 if (reader == NULL) | 4122 if (reader == NULL) |
| 4085 return(-1); | 4123 return(-1); |
| 4086 if (schema == NULL) { | 4124 if (schema == NULL) { |
| 4087 if (reader->rngSchemas != NULL) { | 4125 if (reader->rngSchemas != NULL) { |
| 4088 xmlRelaxNGFree(reader->rngSchemas); | 4126 xmlRelaxNGFree(reader->rngSchemas); |
| 4089 reader->rngSchemas = NULL; | 4127 reader->rngSchemas = NULL; |
| 4090 } | 4128 } |
| 4091 if (reader->rngValidCtxt != NULL) { | 4129 if (reader->rngValidCtxt != NULL) { |
| 4092 » xmlRelaxNGFreeValidCtxt(reader->rngValidCtxt); | 4130 » if (! reader->rngPreserveCtxt) |
| 4131 » » xmlRelaxNGFreeValidCtxt(reader->rngValidCtxt); |
| 4093 reader->rngValidCtxt = NULL; | 4132 reader->rngValidCtxt = NULL; |
| 4094 } | 4133 } |
| 4134 reader->rngPreserveCtxt = 0; |
| 4095 return(0); | 4135 return(0); |
| 4096 } | 4136 } |
| 4097 if (reader->mode != XML_TEXTREADER_MODE_INITIAL) | 4137 if (reader->mode != XML_TEXTREADER_MODE_INITIAL) |
| 4098 return(-1); | 4138 return(-1); |
| 4099 if (reader->rngSchemas != NULL) { | 4139 if (reader->rngSchemas != NULL) { |
| 4100 xmlRelaxNGFree(reader->rngSchemas); | 4140 xmlRelaxNGFree(reader->rngSchemas); |
| 4101 reader->rngSchemas = NULL; | 4141 reader->rngSchemas = NULL; |
| 4102 } | 4142 } |
| 4103 if (reader->rngValidCtxt != NULL) { | 4143 if (reader->rngValidCtxt != NULL) { |
| 4104 » xmlRelaxNGFreeValidCtxt(reader->rngValidCtxt); | 4144 » if (! reader->rngPreserveCtxt) |
| 4145 » xmlRelaxNGFreeValidCtxt(reader->rngValidCtxt); |
| 4105 reader->rngValidCtxt = NULL; | 4146 reader->rngValidCtxt = NULL; |
| 4106 } | 4147 } |
| 4148 reader->rngPreserveCtxt = 0; |
| 4107 reader->rngValidCtxt = xmlRelaxNGNewValidCtxt(schema); | 4149 reader->rngValidCtxt = xmlRelaxNGNewValidCtxt(schema); |
| 4108 if (reader->rngValidCtxt == NULL) | 4150 if (reader->rngValidCtxt == NULL) |
| 4109 return(-1); | 4151 return(-1); |
| 4110 if (reader->errorFunc != NULL) { | 4152 if (reader->errorFunc != NULL) { |
| 4111 xmlRelaxNGSetValidErrors(reader->rngValidCtxt, | 4153 xmlRelaxNGSetValidErrors(reader->rngValidCtxt, |
| 4112 xmlTextReaderValidityErrorRelay, | 4154 xmlTextReaderValidityErrorRelay, |
| 4113 xmlTextReaderValidityWarningRelay, | 4155 xmlTextReaderValidityWarningRelay, |
| 4114 reader); | 4156 reader); |
| 4115 } | 4157 } |
| 4116 if (reader->sErrorFunc != NULL) { | 4158 if (reader->sErrorFunc != NULL) { |
| 4117 xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt, | 4159 xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt, |
| 4118 xmlTextReaderValidityStructuredRelay, | 4160 xmlTextReaderValidityStructuredRelay, |
| 4119 reader); | 4161 reader); |
| 4120 } | 4162 } |
| 4121 reader->rngValidErrors = 0; | 4163 reader->rngValidErrors = 0; |
| 4122 reader->rngFullNode = NULL; | 4164 reader->rngFullNode = NULL; |
| 4123 reader->validate = XML_TEXTREADER_VALIDATE_RNG; | 4165 reader->validate = XML_TEXTREADER_VALIDATE_RNG; |
| 4124 return(0); | 4166 return(0); |
| 4125 } | 4167 } |
| 4126 | 4168 |
| 4127 /** | 4169 /** |
| 4170 * xmlTextReaderLocator: |
| 4171 * @ctx: the xmlTextReaderPtr used |
| 4172 * @file: returned file information |
| 4173 * @line: returned line information |
| 4174 * |
| 4175 * Internal locator function for the readers |
| 4176 * |
| 4177 * Returns 0 in case the Schema validation could be (des)activated and |
| 4178 * -1 in case of error. |
| 4179 */ |
| 4180 static int |
| 4181 xmlTextReaderLocator(void *ctx, const char **file, unsigned long *line) { |
| 4182 xmlTextReaderPtr reader; |
| 4183 |
| 4184 if ((ctx == NULL) || ((file == NULL) && (line == NULL))) |
| 4185 return(-1); |
| 4186 |
| 4187 if (file != NULL) |
| 4188 *file = NULL; |
| 4189 if (line != NULL) |
| 4190 *line = 0; |
| 4191 |
| 4192 reader = (xmlTextReaderPtr) ctx; |
| 4193 if ((reader->ctxt != NULL) && (reader->ctxt->input != NULL)) { |
| 4194 if (file != NULL) |
| 4195 *file = reader->ctxt->input->filename; |
| 4196 if (line != NULL) |
| 4197 *line = reader->ctxt->input->line; |
| 4198 return(0); |
| 4199 } |
| 4200 if (reader->node != NULL) { |
| 4201 long res; |
| 4202 int ret = 0; |
| 4203 |
| 4204 if (line != NULL) { |
| 4205 res = xmlGetLineNo(reader->node); |
| 4206 if (res > 0) |
| 4207 *line = (unsigned long) res; |
| 4208 else |
| 4209 ret = -1; |
| 4210 } |
| 4211 if (file != NULL) { |
| 4212 xmlDocPtr doc = reader->node->doc; |
| 4213 if ((doc != NULL) && (doc->URL != NULL)) |
| 4214 *file = (const char *) doc->URL; |
| 4215 else |
| 4216 ret = -1; |
| 4217 } |
| 4218 return(ret); |
| 4219 } |
| 4220 return(-1); |
| 4221 } |
| 4222 |
| 4223 /** |
| 4128 * xmlTextReaderSetSchema: | 4224 * xmlTextReaderSetSchema: |
| 4129 * @reader: the xmlTextReaderPtr used | 4225 * @reader: the xmlTextReaderPtr used |
| 4130 * @schema: a precompiled Schema schema | 4226 * @schema: a precompiled Schema schema |
| 4131 * | 4227 * |
| 4132 * Use XSD Schema to validate the document as it is processed. | 4228 * Use XSD Schema to validate the document as it is processed. |
| 4133 * Activation is only possible before the first Read(). | 4229 * Activation is only possible before the first Read(). |
| 4134 * if @schema is NULL, then Schema validation is desactivated. | 4230 * if @schema is NULL, then Schema validation is desactivated. |
| 4135 @ The @schema should not be freed until the reader is deallocated | 4231 @ The @schema should not be freed until the reader is deallocated |
| 4136 * or its use has been deactivated. | 4232 * or its use has been deactivated. |
| 4137 * | 4233 * |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4184 reader->xsdPlug = xmlSchemaSAXPlug(reader->xsdValidCtxt, | 4280 reader->xsdPlug = xmlSchemaSAXPlug(reader->xsdValidCtxt, |
| 4185 &(reader->ctxt->sax), | 4281 &(reader->ctxt->sax), |
| 4186 &(reader->ctxt->userData)); | 4282 &(reader->ctxt->userData)); |
| 4187 if (reader->xsdPlug == NULL) { | 4283 if (reader->xsdPlug == NULL) { |
| 4188 xmlSchemaFree(reader->xsdSchemas); | 4284 xmlSchemaFree(reader->xsdSchemas); |
| 4189 reader->xsdSchemas = NULL; | 4285 reader->xsdSchemas = NULL; |
| 4190 xmlSchemaFreeValidCtxt(reader->xsdValidCtxt); | 4286 xmlSchemaFreeValidCtxt(reader->xsdValidCtxt); |
| 4191 reader->xsdValidCtxt = NULL; | 4287 reader->xsdValidCtxt = NULL; |
| 4192 return(-1); | 4288 return(-1); |
| 4193 } | 4289 } |
| 4290 xmlSchemaValidateSetLocator(reader->xsdValidCtxt, |
| 4291 xmlTextReaderLocator, |
| 4292 (void *) reader); |
| 4293 |
| 4194 if (reader->errorFunc != NULL) { | 4294 if (reader->errorFunc != NULL) { |
| 4195 xmlSchemaSetValidErrors(reader->xsdValidCtxt, | 4295 xmlSchemaSetValidErrors(reader->xsdValidCtxt, |
| 4196 xmlTextReaderValidityErrorRelay, | 4296 xmlTextReaderValidityErrorRelay, |
| 4197 xmlTextReaderValidityWarningRelay, | 4297 xmlTextReaderValidityWarningRelay, |
| 4198 reader); | 4298 reader); |
| 4199 } | 4299 } |
| 4200 if (reader->sErrorFunc != NULL) { | 4300 if (reader->sErrorFunc != NULL) { |
| 4201 xmlSchemaSetValidStructuredErrors(reader->xsdValidCtxt, | 4301 xmlSchemaSetValidStructuredErrors(reader->xsdValidCtxt, |
| 4202 xmlTextReaderValidityStructuredRelay, | 4302 xmlTextReaderValidityStructuredRelay, |
| 4203 reader); | 4303 reader); |
| 4204 } | 4304 } |
| 4205 reader->xsdValidErrors = 0; | 4305 reader->xsdValidErrors = 0; |
| 4206 reader->validate = XML_TEXTREADER_VALIDATE_XSD; | 4306 reader->validate = XML_TEXTREADER_VALIDATE_XSD; |
| 4207 return(0); | 4307 return(0); |
| 4208 } | 4308 } |
| 4209 | 4309 |
| 4210 /** | 4310 /** |
| 4211 * xmlTextReaderRelaxNGValidate: | 4311 * xmlTextReaderRelaxNGValidateInternal: |
| 4212 * @reader: the xmlTextReaderPtr used | 4312 * @reader: the xmlTextReaderPtr used |
| 4213 * @rng: the path to a RelaxNG schema or NULL | 4313 * @rng: the path to a RelaxNG schema or NULL |
| 4314 * @ctxt: the RelaxNG schema validation context or NULL |
| 4315 * @options: options (not yet used) |
| 4214 * | 4316 * |
| 4215 * Use RelaxNG to validate the document as it is processed. | 4317 * Use RelaxNG to validate the document as it is processed. |
| 4216 * Activation is only possible before the first Read(). | 4318 * Activation is only possible before the first Read(). |
| 4217 * if @rng is NULL, then RelaxNG validation is deactivated. | 4319 * If both @rng and @ctxt are NULL, then RelaxNG validation is deactivated. |
| 4218 * | 4320 * |
| 4219 * Returns 0 in case the RelaxNG validation could be (de)activated and | 4321 * Returns 0 in case the RelaxNG validation could be (de)activated and |
| 4220 * -1 in case of error. | 4322 *» -1 in case of error. |
| 4221 */ | 4323 */ |
| 4222 int | 4324 static int |
| 4223 xmlTextReaderRelaxNGValidate(xmlTextReaderPtr reader, const char *rng) { | 4325 xmlTextReaderRelaxNGValidateInternal(xmlTextReaderPtr reader, |
| 4224 xmlRelaxNGParserCtxtPtr ctxt; | 4326 » » » » const char *rng, |
| 4327 » » » » xmlRelaxNGValidCtxtPtr ctxt, |
| 4328 » » » » int options ATTRIBUTE_UNUSED) |
| 4329 { |
| 4330 if (reader == NULL) |
| 4331 » return(-1); |
| 4225 | 4332 |
| 4226 if (reader == NULL) | 4333 if ((rng != NULL) && (ctxt != NULL)) |
| 4227 return(-1); | 4334 » return (-1); |
| 4228 | 4335 |
| 4229 if (rng == NULL) { | 4336 if (((rng != NULL) || (ctxt != NULL)) && |
| 4230 if (reader->rngValidCtxt != NULL) { | 4337 » ((reader->mode != XML_TEXTREADER_MODE_INITIAL) || |
| 4338 » (reader->ctxt == NULL))) |
| 4339 » return(-1); |
| 4340 |
| 4341 /* Cleanup previous validation stuff. */ |
| 4342 if (reader->rngValidCtxt != NULL) { |
| 4343 » if ( !reader->rngPreserveCtxt) |
| 4231 xmlRelaxNGFreeValidCtxt(reader->rngValidCtxt); | 4344 xmlRelaxNGFreeValidCtxt(reader->rngValidCtxt); |
| 4232 » reader->rngValidCtxt = NULL; | 4345 » reader->rngValidCtxt = NULL; |
| 4233 } | |
| 4234 if (reader->rngSchemas != NULL) { | |
| 4235 » xmlRelaxNGFree(reader->rngSchemas); | |
| 4236 » reader->rngSchemas = NULL; | |
| 4237 » } | |
| 4238 » return(0); | |
| 4239 } | 4346 } |
| 4240 if (reader->mode != XML_TEXTREADER_MODE_INITIAL) | 4347 reader->rngPreserveCtxt = 0; |
| 4241 » return(-1); | |
| 4242 if (reader->rngSchemas != NULL) { | 4348 if (reader->rngSchemas != NULL) { |
| 4243 xmlRelaxNGFree(reader->rngSchemas); | 4349 xmlRelaxNGFree(reader->rngSchemas); |
| 4244 reader->rngSchemas = NULL; | 4350 reader->rngSchemas = NULL; |
| 4245 } | 4351 } |
| 4246 if (reader->rngValidCtxt != NULL) { | 4352 |
| 4247 » xmlRelaxNGFreeValidCtxt(reader->rngValidCtxt); | 4353 if ((rng == NULL) && (ctxt == NULL)) { |
| 4248 » reader->rngValidCtxt = NULL; | 4354 » /* We just want to deactivate the validation, so get out. */ |
| 4355 » return(0); |
| 4249 } | 4356 } |
| 4250 ctxt = xmlRelaxNGNewParserCtxt(rng); | 4357 |
| 4251 if (reader->errorFunc != NULL) { | 4358 |
| 4252 » xmlRelaxNGSetParserErrors(ctxt, | 4359 if (rng != NULL) { |
| 4253 » » » xmlTextReaderValidityErrorRelay, | 4360 » xmlRelaxNGParserCtxtPtr pctxt; |
| 4254 » » » xmlTextReaderValidityWarningRelay, | 4361 » /* Parse the schema and create validation environment. */ |
| 4255 » » » reader); | 4362 |
| 4363 » pctxt = xmlRelaxNGNewParserCtxt(rng); |
| 4364 » if (reader->errorFunc != NULL) { |
| 4365 » xmlRelaxNGSetParserErrors(pctxt, |
| 4366 » » xmlTextReaderValidityErrorRelay, |
| 4367 » » xmlTextReaderValidityWarningRelay, |
| 4368 » » reader); |
| 4369 » } |
| 4370 » if (reader->sErrorFunc != NULL) { |
| 4371 » xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt, |
| 4372 » » xmlTextReaderValidityStructuredRelay, |
| 4373 » » reader); |
| 4374 » } |
| 4375 » reader->rngSchemas = xmlRelaxNGParse(pctxt); |
| 4376 » xmlRelaxNGFreeParserCtxt(pctxt); |
| 4377 » if (reader->rngSchemas == NULL) |
| 4378 » return(-1); |
| 4379 » reader->rngValidCtxt = xmlRelaxNGNewValidCtxt(reader->rngSchemas); |
| 4380 » if (reader->rngValidCtxt == NULL) { |
| 4381 » xmlRelaxNGFree(reader->rngSchemas); |
| 4382 » reader->rngSchemas = NULL; |
| 4383 » return(-1); |
| 4384 » } |
| 4385 } else { |
| 4386 » /* Use the given validation context. */ |
| 4387 » reader->rngValidCtxt = ctxt; |
| 4388 » reader->rngPreserveCtxt = 1; |
| 4256 } | 4389 } |
| 4257 if (reader->sErrorFunc != NULL) { | 4390 /* |
| 4258 » xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt, | 4391 * Redirect the validation context's error channels to use |
| 4259 » » » xmlTextReaderValidityStructuredRelay, | 4392 * the reader channels. |
| 4260 » » » reader); | 4393 * TODO: In case the user provides the validation context we |
| 4261 } | 4394 *» could make this redirection optional. |
| 4262 reader->rngSchemas = xmlRelaxNGParse(ctxt); | 4395 */ |
| 4263 xmlRelaxNGFreeParserCtxt(ctxt); | |
| 4264 if (reader->rngSchemas == NULL) | |
| 4265 return(-1); | |
| 4266 reader->rngValidCtxt = xmlRelaxNGNewValidCtxt(reader->rngSchemas); | |
| 4267 if (reader->rngValidCtxt == NULL) { | |
| 4268 » xmlRelaxNGFree(reader->rngSchemas); | |
| 4269 » reader->rngSchemas = NULL; | |
| 4270 return(-1); | |
| 4271 } | |
| 4272 if (reader->errorFunc != NULL) { | 4396 if (reader->errorFunc != NULL) { |
| 4273 xmlRelaxNGSetValidErrors(reader->rngValidCtxt, | 4397 xmlRelaxNGSetValidErrors(reader->rngValidCtxt, |
| 4274 xmlTextReaderValidityErrorRelay, | 4398 xmlTextReaderValidityErrorRelay, |
| 4275 xmlTextReaderValidityWarningRelay, | 4399 xmlTextReaderValidityWarningRelay, |
| 4276 reader); | 4400 reader); |
| 4277 } | 4401 } |
| 4278 if (reader->sErrorFunc != NULL) { | 4402 if (reader->sErrorFunc != NULL) { |
| 4279 xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt, | 4403 xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt, |
| 4280 xmlTextReaderValidityStructuredRelay, | 4404 xmlTextReaderValidityStructuredRelay, |
| 4281 reader); | 4405 reader); |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4374 reader->xsdPreserveCtxt = 1; | 4498 reader->xsdPreserveCtxt = 1; |
| 4375 reader->xsdPlug = xmlSchemaSAXPlug(reader->xsdValidCtxt, | 4499 reader->xsdPlug = xmlSchemaSAXPlug(reader->xsdValidCtxt, |
| 4376 &(reader->ctxt->sax), | 4500 &(reader->ctxt->sax), |
| 4377 &(reader->ctxt->userData)); | 4501 &(reader->ctxt->userData)); |
| 4378 if (reader->xsdPlug == NULL) { | 4502 if (reader->xsdPlug == NULL) { |
| 4379 reader->xsdValidCtxt = NULL; | 4503 reader->xsdValidCtxt = NULL; |
| 4380 reader->xsdPreserveCtxt = 0; | 4504 reader->xsdPreserveCtxt = 0; |
| 4381 return(-1); | 4505 return(-1); |
| 4382 } | 4506 } |
| 4383 } | 4507 } |
| 4508 xmlSchemaValidateSetLocator(reader->xsdValidCtxt, |
| 4509 xmlTextReaderLocator, |
| 4510 (void *) reader); |
| 4384 /* | 4511 /* |
| 4385 * Redirect the validation context's error channels to use | 4512 * Redirect the validation context's error channels to use |
| 4386 * the reader channels. | 4513 * the reader channels. |
| 4387 * TODO: In case the user provides the validation context we | 4514 * TODO: In case the user provides the validation context we |
| 4388 * could make this redirection optional. | 4515 * could make this redirection optional. |
| 4389 */ | 4516 */ |
| 4390 if (reader->errorFunc != NULL) { | 4517 if (reader->errorFunc != NULL) { |
| 4391 xmlSchemaSetValidErrors(reader->xsdValidCtxt, | 4518 xmlSchemaSetValidErrors(reader->xsdValidCtxt, |
| 4392 xmlTextReaderValidityErrorRelay, | 4519 xmlTextReaderValidityErrorRelay, |
| 4393 xmlTextReaderValidityWarningRelay, | 4520 xmlTextReaderValidityWarningRelay, |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4434 * If @xsd is NULL, then XML Schema validation is deactivated. | 4561 * If @xsd is NULL, then XML Schema validation is deactivated. |
| 4435 * | 4562 * |
| 4436 * Returns 0 in case the schemas validation could be (de)activated and | 4563 * Returns 0 in case the schemas validation could be (de)activated and |
| 4437 * -1 in case of error. | 4564 * -1 in case of error. |
| 4438 */ | 4565 */ |
| 4439 int | 4566 int |
| 4440 xmlTextReaderSchemaValidate(xmlTextReaderPtr reader, const char *xsd) | 4567 xmlTextReaderSchemaValidate(xmlTextReaderPtr reader, const char *xsd) |
| 4441 { | 4568 { |
| 4442 return(xmlTextReaderSchemaValidateInternal(reader, xsd, NULL, 0)); | 4569 return(xmlTextReaderSchemaValidateInternal(reader, xsd, NULL, 0)); |
| 4443 } | 4570 } |
| 4571 |
| 4572 /** |
| 4573 * xmlTextReaderRelaxNGValidateCtxt: |
| 4574 * @reader: the xmlTextReaderPtr used |
| 4575 * @ctxt: the RelaxNG schema validation context or NULL |
| 4576 * @options: options (not used yet) |
| 4577 * |
| 4578 * Use RelaxNG schema context to validate the document as it is processed. |
| 4579 * Activation is only possible before the first Read(). |
| 4580 * If @ctxt is NULL, then RelaxNG schema validation is deactivated. |
| 4581 * |
| 4582 * Returns 0 in case the schemas validation could be (de)activated and |
| 4583 * -1 in case of error. |
| 4584 */ |
| 4585 int |
| 4586 xmlTextReaderRelaxNGValidateCtxt(xmlTextReaderPtr reader, |
| 4587 xmlRelaxNGValidCtxtPtr ctxt, |
| 4588 int options) |
| 4589 { |
| 4590 return(xmlTextReaderRelaxNGValidateInternal(reader, NULL, ctxt, options)); |
| 4591 } |
| 4592 |
| 4593 /** |
| 4594 * xmlTextReaderRelaxNGValidate: |
| 4595 * @reader: the xmlTextReaderPtr used |
| 4596 * @rng: the path to a RelaxNG schema or NULL |
| 4597 * |
| 4598 * Use RelaxNG schema to validate the document as it is processed. |
| 4599 * Activation is only possible before the first Read(). |
| 4600 * If @rng is NULL, then RelaxNG schema validation is deactivated. |
| 4601 * |
| 4602 * Returns 0 in case the schemas validation could be (de)activated and |
| 4603 * -1 in case of error. |
| 4604 */ |
| 4605 int |
| 4606 xmlTextReaderRelaxNGValidate(xmlTextReaderPtr reader, const char *rng) |
| 4607 { |
| 4608 return(xmlTextReaderRelaxNGValidateInternal(reader, rng, NULL, 0)); |
| 4609 } |
| 4610 |
| 4444 #endif | 4611 #endif |
| 4445 | 4612 |
| 4446 /** | 4613 /** |
| 4447 * xmlTextReaderIsNamespaceDecl: | 4614 * xmlTextReaderIsNamespaceDecl: |
| 4448 * @reader: the xmlTextReaderPtr used | 4615 * @reader: the xmlTextReaderPtr used |
| 4449 * | 4616 * |
| 4450 * Determine whether the current node is a namespace declaration | 4617 * Determine whether the current node is a namespace declaration |
| 4451 * rather than a regular attribute. | 4618 * rather than a regular attribute. |
| 4452 * | 4619 * |
| 4453 * Returns 1 if the current node is a namespace declaration, 0 if it | 4620 * Returns 1 if the current node is a namespace declaration, 0 if it |
| (...skipping 497 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4951 (reader->allocs & XML_TEXTREADER_INPUT)) { | 5118 (reader->allocs & XML_TEXTREADER_INPUT)) { |
| 4952 xmlFreeParserInputBuffer(reader->input); | 5119 xmlFreeParserInputBuffer(reader->input); |
| 4953 reader->input = NULL; | 5120 reader->input = NULL; |
| 4954 reader->allocs -= XML_TEXTREADER_INPUT; | 5121 reader->allocs -= XML_TEXTREADER_INPUT; |
| 4955 } | 5122 } |
| 4956 if (input != NULL) { | 5123 if (input != NULL) { |
| 4957 reader->input = input; | 5124 reader->input = input; |
| 4958 reader->allocs |= XML_TEXTREADER_INPUT; | 5125 reader->allocs |= XML_TEXTREADER_INPUT; |
| 4959 } | 5126 } |
| 4960 if (reader->buffer == NULL) | 5127 if (reader->buffer == NULL) |
| 4961 reader->buffer = xmlBufferCreateSize(100); | 5128 reader->buffer = xmlBufCreateSize(100); |
| 4962 if (reader->buffer == NULL) { | 5129 if (reader->buffer == NULL) { |
| 4963 xmlGenericError(xmlGenericErrorContext, | 5130 xmlGenericError(xmlGenericErrorContext, |
| 4964 "xmlTextReaderSetup : malloc failed\n"); | 5131 "xmlTextReaderSetup : malloc failed\n"); |
| 4965 return (-1); | 5132 return (-1); |
| 4966 } | 5133 } |
| 4967 if (reader->sax == NULL) | 5134 if (reader->sax == NULL) |
| 4968 reader->sax = (xmlSAXHandler *) xmlMalloc(sizeof(xmlSAXHandler)); | 5135 reader->sax = (xmlSAXHandler *) xmlMalloc(sizeof(xmlSAXHandler)); |
| 4969 if (reader->sax == NULL) { | 5136 if (reader->sax == NULL) { |
| 4970 xmlGenericError(xmlGenericErrorContext, | 5137 xmlGenericError(xmlGenericErrorContext, |
| 4971 "xmlTextReaderSetup : malloc failed\n"); | 5138 "xmlTextReaderSetup : malloc failed\n"); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 4992 reader->characters = reader->sax->characters; | 5159 reader->characters = reader->sax->characters; |
| 4993 reader->sax->characters = xmlTextReaderCharacters; | 5160 reader->sax->characters = xmlTextReaderCharacters; |
| 4994 reader->sax->ignorableWhitespace = xmlTextReaderCharacters; | 5161 reader->sax->ignorableWhitespace = xmlTextReaderCharacters; |
| 4995 reader->cdataBlock = reader->sax->cdataBlock; | 5162 reader->cdataBlock = reader->sax->cdataBlock; |
| 4996 reader->sax->cdataBlock = xmlTextReaderCDataBlock; | 5163 reader->sax->cdataBlock = xmlTextReaderCDataBlock; |
| 4997 | 5164 |
| 4998 reader->mode = XML_TEXTREADER_MODE_INITIAL; | 5165 reader->mode = XML_TEXTREADER_MODE_INITIAL; |
| 4999 reader->node = NULL; | 5166 reader->node = NULL; |
| 5000 reader->curnode = NULL; | 5167 reader->curnode = NULL; |
| 5001 if (input != NULL) { | 5168 if (input != NULL) { |
| 5002 if (reader->input->buffer->use < 4) { | 5169 if (xmlBufUse(reader->input->buffer) < 4) { |
| 5003 xmlParserInputBufferRead(input, 4); | 5170 xmlParserInputBufferRead(input, 4); |
| 5004 } | 5171 } |
| 5005 if (reader->ctxt == NULL) { | 5172 if (reader->ctxt == NULL) { |
| 5006 if (reader->input->buffer->use >= 4) { | 5173 if (xmlBufUse(reader->input->buffer) >= 4) { |
| 5007 reader->ctxt = xmlCreatePushParserCtxt(reader->sax, NULL, | 5174 reader->ctxt = xmlCreatePushParserCtxt(reader->sax, NULL, |
| 5008 » » (const char *) reader->input->buffer->content, 4, URL); | 5175 » » (const char *) xmlBufContent(reader->input->buffer), |
| 5176 4, URL); |
| 5009 reader->base = 0; | 5177 reader->base = 0; |
| 5010 reader->cur = 4; | 5178 reader->cur = 4; |
| 5011 } else { | 5179 } else { |
| 5012 reader->ctxt = | 5180 reader->ctxt = |
| 5013 xmlCreatePushParserCtxt(reader->sax, NULL, NULL, 0, URL); | 5181 xmlCreatePushParserCtxt(reader->sax, NULL, NULL, 0, URL); |
| 5014 reader->base = 0; | 5182 reader->base = 0; |
| 5015 reader->cur = 0; | 5183 reader->cur = 0; |
| 5016 } | 5184 } |
| 5017 } else { | 5185 } else { |
| 5018 xmlParserInputPtr inputStream; | 5186 xmlParserInputPtr inputStream; |
| 5019 xmlParserInputBufferPtr buf; | 5187 xmlParserInputBufferPtr buf; |
| 5020 xmlCharEncoding enc = XML_CHAR_ENCODING_NONE; | 5188 xmlCharEncoding enc = XML_CHAR_ENCODING_NONE; |
| 5021 | 5189 |
| 5022 xmlCtxtReset(reader->ctxt); | 5190 xmlCtxtReset(reader->ctxt); |
| 5023 buf = xmlAllocParserInputBuffer(enc); | 5191 buf = xmlAllocParserInputBuffer(enc); |
| 5024 if (buf == NULL) return(-1); | 5192 if (buf == NULL) return(-1); |
| 5025 inputStream = xmlNewInputStream(reader->ctxt); | 5193 inputStream = xmlNewInputStream(reader->ctxt); |
| 5026 if (inputStream == NULL) { | 5194 if (inputStream == NULL) { |
| 5027 xmlFreeParserInputBuffer(buf); | 5195 xmlFreeParserInputBuffer(buf); |
| 5028 return(-1); | 5196 return(-1); |
| 5029 } | 5197 } |
| 5030 | 5198 |
| 5031 if (URL == NULL) | 5199 if (URL == NULL) |
| 5032 inputStream->filename = NULL; | 5200 inputStream->filename = NULL; |
| 5033 else | 5201 else |
| 5034 inputStream->filename = (char *) | 5202 inputStream->filename = (char *) |
| 5035 xmlCanonicPath((const xmlChar *) URL); | 5203 xmlCanonicPath((const xmlChar *) URL); |
| 5036 inputStream->buf = buf; | 5204 inputStream->buf = buf; |
| 5037 » inputStream->base = inputStream->buf->buffer->content; | 5205 xmlBufResetInput(buf->buffer, inputStream); |
| 5038 » inputStream->cur = inputStream->buf->buffer->content; | |
| 5039 » inputStream->end = | |
| 5040 &inputStream->buf->buffer->content[inputStream->buf->buffer->use]; | |
| 5041 | 5206 |
| 5042 inputPush(reader->ctxt, inputStream); | 5207 inputPush(reader->ctxt, inputStream); |
| 5043 reader->cur = 0; | 5208 reader->cur = 0; |
| 5044 } | 5209 } |
| 5045 if (reader->ctxt == NULL) { | 5210 if (reader->ctxt == NULL) { |
| 5046 xmlGenericError(xmlGenericErrorContext, | 5211 xmlGenericError(xmlGenericErrorContext, |
| 5047 "xmlTextReaderSetup : malloc failed\n"); | 5212 "xmlTextReaderSetup : malloc failed\n"); |
| 5048 return (-1); | 5213 return (-1); |
| 5049 } | 5214 } |
| 5050 } | 5215 } |
| (...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5318 int options) | 5483 int options) |
| 5319 { | 5484 { |
| 5320 xmlTextReaderPtr reader; | 5485 xmlTextReaderPtr reader; |
| 5321 xmlParserInputBufferPtr input; | 5486 xmlParserInputBufferPtr input; |
| 5322 | 5487 |
| 5323 if (ioread == NULL) | 5488 if (ioread == NULL) |
| 5324 return (NULL); | 5489 return (NULL); |
| 5325 | 5490 |
| 5326 input = xmlParserInputBufferCreateIO(ioread, ioclose, ioctx, | 5491 input = xmlParserInputBufferCreateIO(ioread, ioclose, ioctx, |
| 5327 XML_CHAR_ENCODING_NONE); | 5492 XML_CHAR_ENCODING_NONE); |
| 5328 if (input == NULL) | 5493 if (input == NULL) { |
| 5494 if (ioclose != NULL) |
| 5495 ioclose(ioctx); |
| 5329 return (NULL); | 5496 return (NULL); |
| 5497 } |
| 5330 reader = xmlNewTextReader(input, URL); | 5498 reader = xmlNewTextReader(input, URL); |
| 5331 if (reader == NULL) { | 5499 if (reader == NULL) { |
| 5332 xmlFreeParserInputBuffer(input); | 5500 xmlFreeParserInputBuffer(input); |
| 5333 return (NULL); | 5501 return (NULL); |
| 5334 } | 5502 } |
| 5335 reader->allocs |= XML_TEXTREADER_INPUT; | 5503 reader->allocs |= XML_TEXTREADER_INPUT; |
| 5336 xmlTextReaderSetup(reader, NULL, URL, encoding, options); | 5504 xmlTextReaderSetup(reader, NULL, URL, encoding, options); |
| 5337 return (reader); | 5505 return (reader); |
| 5338 } | 5506 } |
| 5339 | 5507 |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5536 { | 5704 { |
| 5537 xmlParserInputBufferPtr input; | 5705 xmlParserInputBufferPtr input; |
| 5538 | 5706 |
| 5539 if (ioread == NULL) | 5707 if (ioread == NULL) |
| 5540 return (-1); | 5708 return (-1); |
| 5541 if (reader == NULL) | 5709 if (reader == NULL) |
| 5542 return (-1); | 5710 return (-1); |
| 5543 | 5711 |
| 5544 input = xmlParserInputBufferCreateIO(ioread, ioclose, ioctx, | 5712 input = xmlParserInputBufferCreateIO(ioread, ioclose, ioctx, |
| 5545 XML_CHAR_ENCODING_NONE); | 5713 XML_CHAR_ENCODING_NONE); |
| 5546 if (input == NULL) | 5714 if (input == NULL) { |
| 5715 if (ioclose != NULL) |
| 5716 ioclose(ioctx); |
| 5547 return (-1); | 5717 return (-1); |
| 5718 } |
| 5548 return (xmlTextReaderSetup(reader, input, URL, encoding, options)); | 5719 return (xmlTextReaderSetup(reader, input, URL, encoding, options)); |
| 5549 } | 5720 } |
| 5721 |
| 5550 /************************************************************************ | 5722 /************************************************************************ |
| 5551 * * | 5723 * * |
| 5552 * Utilities * | 5724 * Utilities * |
| 5553 * * | 5725 * * |
| 5554 ************************************************************************/ | 5726 ************************************************************************/ |
| 5555 #ifdef NOT_USED_YET | 5727 #ifdef NOT_USED_YET |
| 5556 | 5728 |
| 5557 /** | 5729 /** |
| 5558 * xmlBase64Decode: | 5730 * xmlBase64Decode: |
| 5559 * @in: the input buffer | 5731 * @in: the input buffer |
| (...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5751 printf("ret: %d, cons: %ld , prod: %ld, output: '%s'\n", ret, cons, | 5923 printf("ret: %d, cons: %ld , prod: %ld, output: '%s'\n", ret, cons, |
| 5752 prod, output3); | 5924 prod, output3); |
| 5753 return (0); | 5925 return (0); |
| 5754 | 5926 |
| 5755 } | 5927 } |
| 5756 #endif | 5928 #endif |
| 5757 #endif /* NOT_USED_YET */ | 5929 #endif /* NOT_USED_YET */ |
| 5758 #define bottom_xmlreader | 5930 #define bottom_xmlreader |
| 5759 #include "elfgcchack.h" | 5931 #include "elfgcchack.h" |
| 5760 #endif /* LIBXML_READER_ENABLED */ | 5932 #endif /* LIBXML_READER_ENABLED */ |
| OLD | NEW |