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 |
11 */ | 11 */ |
12 | 12 |
13 /* | 13 /* |
14 * TODOs: | 14 * TODOs: |
(...skipping 22 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 #define MAX_ERR_MSG_SIZE 64000 |
| 48 |
| 49 /* |
| 50 * The following VA_COPY was coded following an example in |
| 51 * the Samba project. It may not be sufficient for some |
| 52 * esoteric implementations of va_list (i.e. it may need |
| 53 * something involving a memcpy) but (hopefully) will be |
| 54 * sufficient for libxml2. |
| 55 */ |
| 56 #ifndef VA_COPY |
| 57 #ifdef HAVE_VA_COPY |
| 58 #define VA_COPY(dest, src) va_copy(dest, src) |
| 59 #else |
| 60 #ifdef HAVE___VA_COPY |
| 61 #define VA_COPY(dest,src) __va_copy(dest, src) |
| 62 #else |
| 63 #define VA_COPY(dest,src) (dest) = (src) |
| 64 #endif |
| 65 #endif |
| 66 #endif |
| 67 |
47 /* #define DEBUG_CALLBACKS */ | 68 /* #define DEBUG_CALLBACKS */ |
48 /* #define DEBUG_READER */ | 69 /* #define DEBUG_READER */ |
49 | 70 |
50 /** | 71 /** |
51 * TODO: | 72 * TODO: |
52 * | 73 * |
53 * macro to flag unimplemented blocks | 74 * macro to flag unimplemented blocks |
54 */ | 75 */ |
55 #define TODO » » » » » » » » \ | 76 #define TODO» » » » » » » » \ |
56 xmlGenericError(xmlGenericErrorContext, \ | 77 xmlGenericError(xmlGenericErrorContext, \ |
57 "Unimplemented block at %s:%d\n", \ | 78 "Unimplemented block at %s:%d\n", \ |
58 __FILE__, __LINE__); | 79 __FILE__, __LINE__); |
59 | 80 |
60 #ifdef DEBUG_READER | 81 #ifdef DEBUG_READER |
61 #define DUMP_READER xmlTextReaderDebug(reader); | 82 #define DUMP_READER xmlTextReaderDebug(reader); |
62 #else | 83 #else |
63 #define DUMP_READER | 84 #define DUMP_READER |
64 #endif | 85 #endif |
65 | 86 |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
100 xmlTextReaderState state; | 121 xmlTextReaderState state; |
101 xmlParserCtxtPtr ctxt; /* the parser context */ | 122 xmlParserCtxtPtr ctxt; /* the parser context */ |
102 xmlSAXHandlerPtr sax; /* the parser SAX callbacks */ | 123 xmlSAXHandlerPtr sax; /* the parser SAX callbacks */ |
103 xmlParserInputBufferPtr input; /* the input */ | 124 xmlParserInputBufferPtr input; /* the input */ |
104 startElementSAXFunc startElement;/* initial SAX callbacks */ | 125 startElementSAXFunc startElement;/* initial SAX callbacks */ |
105 endElementSAXFunc endElement; /* idem */ | 126 endElementSAXFunc endElement; /* idem */ |
106 startElementNsSAX2Func startElementNs;/* idem */ | 127 startElementNsSAX2Func startElementNs;/* idem */ |
107 endElementNsSAX2Func endElementNs; /* idem */ | 128 endElementNsSAX2Func endElementNs; /* idem */ |
108 charactersSAXFunc characters; | 129 charactersSAXFunc characters; |
109 cdataBlockSAXFunc cdataBlock; | 130 cdataBlockSAXFunc cdataBlock; |
110 unsigned int » » base;» /* base of the segment in the input */ | 131 unsigned int» » base;» /* base of the segment in the input */ |
111 unsigned int » » cur;» /* current position in the input */ | 132 unsigned int» » cur;» /* current position in the input */ |
112 xmlNodePtr node; /* current node */ | 133 xmlNodePtr node; /* current node */ |
113 xmlNodePtr curnode;/* current attribute node */ | 134 xmlNodePtr curnode;/* current attribute node */ |
114 int depth; /* depth of the current node */ | 135 int depth; /* depth of the current node */ |
115 xmlNodePtr faketext;/* fake xmlNs chld */ | 136 xmlNodePtr faketext;/* fake xmlNs chld */ |
116 int preserve;/* preserve the resulting document */ | 137 int preserve;/* preserve the resulting document */ |
117 xmlBufferPtr buffer; /* used to return const xmlChar * */ | 138 xmlBufferPtr buffer; /* used to return const xmlChar * */ |
118 xmlDictPtr dict; /* the context dictionnary */ | 139 xmlDictPtr dict; /* the context dictionnary */ |
119 | 140 |
120 /* entity stack when traversing entities content */ | 141 /* entity stack when traversing entities content */ |
121 xmlNodePtr ent; /* Current Entity Ref Node */ | 142 xmlNodePtr ent; /* Current Entity Ref Node */ |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
179 * * | 200 * * |
180 ************************************************************************/ | 201 ************************************************************************/ |
181 /** | 202 /** |
182 * DICT_FREE: | 203 * DICT_FREE: |
183 * @str: a string | 204 * @str: a string |
184 * | 205 * |
185 * Free a string if it is not owned by the "dict" dictionnary in the | 206 * Free a string if it is not owned by the "dict" dictionnary in the |
186 * current scope | 207 * current scope |
187 */ | 208 */ |
188 #define DICT_FREE(str) \ | 209 #define DICT_FREE(str) \ |
189 » if ((str) && ((!dict) || » » » » \ | 210 » if ((str) && ((!dict) ||» » » » \ |
190 (xmlDictOwns(dict, (const xmlChar *)(str)) == 0))) \ | 211 (xmlDictOwns(dict, (const xmlChar *)(str)) == 0))) \ |
191 xmlFree((char *)(str)); | 212 xmlFree((char *)(str)); |
192 | 213 |
193 static void xmlTextReaderFreeNode(xmlTextReaderPtr reader, xmlNodePtr cur); | 214 static void xmlTextReaderFreeNode(xmlTextReaderPtr reader, xmlNodePtr cur); |
194 static void xmlTextReaderFreeNodeList(xmlTextReaderPtr reader, xmlNodePtr cur); | 215 static void xmlTextReaderFreeNodeList(xmlTextReaderPtr reader, xmlNodePtr cur); |
195 | 216 |
196 /** | 217 /** |
197 * xmlFreeID: | 218 * xmlFreeID: |
198 * @not: A id | 219 * @not: A id |
199 * | 220 * |
(...skipping 24 matching lines...) Expand all Loading... |
224 */ | 245 */ |
225 static int | 246 static int |
226 xmlTextReaderRemoveID(xmlDocPtr doc, xmlAttrPtr attr) { | 247 xmlTextReaderRemoveID(xmlDocPtr doc, xmlAttrPtr attr) { |
227 xmlIDTablePtr table; | 248 xmlIDTablePtr table; |
228 xmlIDPtr id; | 249 xmlIDPtr id; |
229 xmlChar *ID; | 250 xmlChar *ID; |
230 | 251 |
231 if (doc == NULL) return(-1); | 252 if (doc == NULL) return(-1); |
232 if (attr == NULL) return(-1); | 253 if (attr == NULL) return(-1); |
233 table = (xmlIDTablePtr) doc->ids; | 254 table = (xmlIDTablePtr) doc->ids; |
234 if (table == NULL) | 255 if (table == NULL) |
235 return(-1); | 256 return(-1); |
236 | 257 |
237 ID = xmlNodeListGetString(doc, attr->children, 1); | 258 ID = xmlNodeListGetString(doc, attr->children, 1); |
238 if (ID == NULL) | 259 if (ID == NULL) |
239 return(-1); | 260 return(-1); |
240 id = xmlHashLookup(table, ID); | 261 id = xmlHashLookup(table, ID); |
241 xmlFree(ID); | 262 xmlFree(ID); |
242 if (id == NULL || id->attr != attr) { | 263 if (id == NULL || id->attr != attr) { |
243 return(-1); | 264 return(-1); |
244 } | 265 } |
(...skipping 569 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
814 reader->state = oldstate; | 835 reader->state = oldstate; |
815 if ((oldstate != XML_TEXTREADER_START) || | 836 if ((oldstate != XML_TEXTREADER_START) || |
816 (reader->ctxt->myDoc != NULL)) | 837 (reader->ctxt->myDoc != NULL)) |
817 return(val); | 838 return(val); |
818 } else if (val == 0) { | 839 } else if (val == 0) { |
819 /* mark the end of the stream and process the remains */ | 840 /* mark the end of the stream and process the remains */ |
820 reader->mode = XML_TEXTREADER_MODE_EOF; | 841 reader->mode = XML_TEXTREADER_MODE_EOF; |
821 break; | 842 break; |
822 } | 843 } |
823 | 844 |
824 » } else | 845 » } else |
825 break; | 846 break; |
826 } | 847 } |
827 /* | 848 /* |
828 * parse by block of CHUNK_SIZE bytes, various tests show that | 849 * parse by block of CHUNK_SIZE bytes, various tests show that |
829 * it's the best tradeoff at least on a 1.2GH Duron | 850 * it's the best tradeoff at least on a 1.2GH Duron |
830 */ | 851 */ |
831 if (inbuf->use >= reader->cur + CHUNK_SIZE) { | 852 if (inbuf->use >= reader->cur + CHUNK_SIZE) { |
832 val = xmlParseChunk(reader->ctxt, | 853 val = xmlParseChunk(reader->ctxt, |
833 (const char *) &inbuf->content[reader->cur], | 854 (const char *) &inbuf->content[reader->cur], |
834 CHUNK_SIZE, 0); | 855 CHUNK_SIZE, 0); |
(...skipping 28 matching lines...) Expand all Loading... |
863 } | 884 } |
864 | 885 |
865 /* | 886 /* |
866 * At the end of the stream signal that the work is done to the Push | 887 * At the end of the stream signal that the work is done to the Push |
867 * parser. | 888 * parser. |
868 */ | 889 */ |
869 else if (reader->mode == XML_TEXTREADER_MODE_EOF) { | 890 else if (reader->mode == XML_TEXTREADER_MODE_EOF) { |
870 if (reader->state != XML_TEXTREADER_DONE) { | 891 if (reader->state != XML_TEXTREADER_DONE) { |
871 s = inbuf->use - reader->cur; | 892 s = inbuf->use - reader->cur; |
872 val = xmlParseChunk(reader->ctxt, | 893 val = xmlParseChunk(reader->ctxt, |
873 » » (const char *) &inbuf->content[reader->cur], | 894 » » (const char *) &inbuf->content[reader->cur], |
874 s, 1); | 895 s, 1); |
875 reader->cur = inbuf->use; | 896 reader->cur = inbuf->use; |
876 reader->state = XML_TEXTREADER_DONE; | 897 reader->state = XML_TEXTREADER_DONE; |
877 if ((val != 0) || (reader->ctxt->wellFormed == 0)) | 898 if ((val != 0) || (reader->ctxt->wellFormed == 0)) |
878 return(-1); | 899 return(-1); |
879 } | 900 } |
880 } | 901 } |
881 reader->state = oldstate; | 902 reader->state = oldstate; |
882 return(0); | 903 return(0); |
883 } | 904 } |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1003 xmlFree(qname); | 1024 xmlFree(qname); |
1004 } | 1025 } |
1005 } | 1026 } |
1006 #endif /* LIBXML_VALID_ENABLED */ | 1027 #endif /* LIBXML_VALID_ENABLED */ |
1007 #ifdef LIBXML_SCHEMAS_ENABLED | 1028 #ifdef LIBXML_SCHEMAS_ENABLED |
1008 if ((reader->validate == XML_TEXTREADER_VALIDATE_RNG) && | 1029 if ((reader->validate == XML_TEXTREADER_VALIDATE_RNG) && |
1009 (reader->rngValidCtxt != NULL)) { | 1030 (reader->rngValidCtxt != NULL)) { |
1010 int ret; | 1031 int ret; |
1011 | 1032 |
1012 if (reader->rngFullNode != NULL) { | 1033 if (reader->rngFullNode != NULL) { |
1013 » if (node == reader->rngFullNode) | 1034 » if (node == reader->rngFullNode) |
1014 reader->rngFullNode = NULL; | 1035 reader->rngFullNode = NULL; |
1015 return; | 1036 return; |
1016 } | 1037 } |
1017 ret = xmlRelaxNGValidatePopElement(reader->rngValidCtxt, | 1038 ret = xmlRelaxNGValidatePopElement(reader->rngValidCtxt, |
1018 reader->ctxt->myDoc, | 1039 reader->ctxt->myDoc, |
1019 node); | 1040 node); |
1020 if (ret != 1) | 1041 if (ret != 1) |
1021 reader->rngValidErrors++; | 1042 reader->rngValidErrors++; |
1022 } | 1043 } |
1023 #endif | 1044 #endif |
(...skipping 14 matching lines...) Expand all Loading... |
1038 xmlParserCtxtPtr ctxt = reader->ctxt; | 1059 xmlParserCtxtPtr ctxt = reader->ctxt; |
1039 | 1060 |
1040 do { | 1061 do { |
1041 if (node->type == XML_ENTITY_REF_NODE) { | 1062 if (node->type == XML_ENTITY_REF_NODE) { |
1042 /* | 1063 /* |
1043 * Case where the underlying tree is not availble, lookup the entity | 1064 * Case where the underlying tree is not availble, lookup the entity |
1044 * and walk it. | 1065 * and walk it. |
1045 */ | 1066 */ |
1046 if ((node->children == NULL) && (ctxt->sax != NULL) && | 1067 if ((node->children == NULL) && (ctxt->sax != NULL) && |
1047 (ctxt->sax->getEntity != NULL)) { | 1068 (ctxt->sax->getEntity != NULL)) { |
1048 » » node->children = (xmlNodePtr) | 1069 » » node->children = (xmlNodePtr) |
1049 ctxt->sax->getEntity(ctxt, node->name); | 1070 ctxt->sax->getEntity(ctxt, node->name); |
1050 } | 1071 } |
1051 | 1072 |
1052 if ((node->children != NULL) && | 1073 if ((node->children != NULL) && |
1053 (node->children->type == XML_ENTITY_DECL) && | 1074 (node->children->type == XML_ENTITY_DECL) && |
1054 (node->children->children != NULL)) { | 1075 (node->children->children != NULL)) { |
1055 xmlTextReaderEntPush(reader, node); | 1076 xmlTextReaderEntPush(reader, node); |
1056 node = node->children->children; | 1077 node = node->children->children; |
1057 continue; | 1078 continue; |
1058 } else { | 1079 } else { |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1228 * | 1249 * |
1229 * Returns 1 if the node was read successfully, 0 if there is no more | 1250 * Returns 1 if the node was read successfully, 0 if there is no more |
1230 * nodes to read, or -1 in case of error | 1251 * nodes to read, or -1 in case of error |
1231 */ | 1252 */ |
1232 int | 1253 int |
1233 xmlTextReaderRead(xmlTextReaderPtr reader) { | 1254 xmlTextReaderRead(xmlTextReaderPtr reader) { |
1234 int val, olddepth = 0; | 1255 int val, olddepth = 0; |
1235 xmlTextReaderState oldstate = XML_TEXTREADER_START; | 1256 xmlTextReaderState oldstate = XML_TEXTREADER_START; |
1236 xmlNodePtr oldnode = NULL; | 1257 xmlNodePtr oldnode = NULL; |
1237 | 1258 |
1238 | 1259 |
1239 if (reader == NULL) | 1260 if (reader == NULL) |
1240 return(-1); | 1261 return(-1); |
1241 reader->curnode = NULL; | 1262 reader->curnode = NULL; |
1242 if (reader->doc != NULL) | 1263 if (reader->doc != NULL) |
1243 return(xmlTextReaderReadTree(reader)); | 1264 return(xmlTextReaderReadTree(reader)); |
1244 if (reader->ctxt == NULL) | 1265 if (reader->ctxt == NULL) |
1245 return(-1); | 1266 return(-1); |
1246 if (reader->ctxt->wellFormed != 1) | 1267 if (reader->ctxt->wellFormed != 1) |
1247 return(-1); | 1268 return(-1); |
1248 | 1269 |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1408 reader->state = XML_TEXTREADER_DONE; | 1429 reader->state = XML_TEXTREADER_DONE; |
1409 if (val != 0) | 1430 if (val != 0) |
1410 return(-1); | 1431 return(-1); |
1411 } | 1432 } |
1412 reader->node = NULL; | 1433 reader->node = NULL; |
1413 reader->depth = -1; | 1434 reader->depth = -1; |
1414 | 1435 |
1415 /* | 1436 /* |
1416 * Cleanup of the old node | 1437 * Cleanup of the old node |
1417 */ | 1438 */ |
1418 » if ((reader->preserves == 0) && | 1439 » if ((oldnode != NULL) && (reader->preserves == 0) && |
1419 #ifdef LIBXML_XINCLUDE_ENABLED | 1440 #ifdef LIBXML_XINCLUDE_ENABLED |
1420 (reader->in_xinclude == 0) && | 1441 (reader->in_xinclude == 0) && |
1421 #endif | 1442 #endif |
1422 (reader->entNr == 0) && | 1443 (reader->entNr == 0) && |
1423 (oldnode->type != XML_DTD_NODE) && | 1444 (oldnode->type != XML_DTD_NODE) && |
1424 ((oldnode->extra & NODE_IS_PRESERVED) == 0) && | 1445 ((oldnode->extra & NODE_IS_PRESERVED) == 0) && |
1425 (reader->entNr == 0)) { | 1446 (reader->entNr == 0)) { |
1426 xmlUnlinkNode(oldnode); | 1447 xmlUnlinkNode(oldnode); |
1427 xmlTextReaderFreeNode(reader, oldnode); | 1448 xmlTextReaderFreeNode(reader, oldnode); |
1428 } | 1449 } |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1461 /* | 1482 /* |
1462 * Handle XInclude if asked for | 1483 * Handle XInclude if asked for |
1463 */ | 1484 */ |
1464 if ((reader->xinclude) && (reader->node != NULL) && | 1485 if ((reader->xinclude) && (reader->node != NULL) && |
1465 (reader->node->type == XML_ELEMENT_NODE) && | 1486 (reader->node->type == XML_ELEMENT_NODE) && |
1466 (reader->node->ns != NULL) && | 1487 (reader->node->ns != NULL) && |
1467 ((xmlStrEqual(reader->node->ns->href, XINCLUDE_NS)) || | 1488 ((xmlStrEqual(reader->node->ns->href, XINCLUDE_NS)) || |
1468 (xmlStrEqual(reader->node->ns->href, XINCLUDE_OLD_NS)))) { | 1489 (xmlStrEqual(reader->node->ns->href, XINCLUDE_OLD_NS)))) { |
1469 if (reader->xincctxt == NULL) { | 1490 if (reader->xincctxt == NULL) { |
1470 reader->xincctxt = xmlXIncludeNewContext(reader->ctxt->myDoc); | 1491 reader->xincctxt = xmlXIncludeNewContext(reader->ctxt->myDoc); |
1471 » xmlXIncludeSetFlags(reader->xincctxt, | 1492 » xmlXIncludeSetFlags(reader->xincctxt, |
1472 reader->parserFlags & (~XML_PARSE_NOXINCNODE)); | 1493 reader->parserFlags & (~XML_PARSE_NOXINCNODE)); |
1473 } | 1494 } |
1474 /* | 1495 /* |
1475 * expand that node and process it | 1496 * expand that node and process it |
1476 */ | 1497 */ |
1477 if (xmlTextReaderExpand(reader) == NULL) | 1498 if (xmlTextReaderExpand(reader) == NULL) |
1478 return -1; | 1499 return -1; |
1479 xmlXIncludeProcessNode(reader->xincctxt, reader->node); | 1500 xmlXIncludeProcessNode(reader->xincctxt, reader->node); |
1480 } | 1501 } |
1481 if ((reader->node != NULL) && (reader->node->type == XML_XINCLUDE_START)) { | 1502 if ((reader->node != NULL) && (reader->node->type == XML_XINCLUDE_START)) { |
1482 reader->in_xinclude++; | 1503 reader->in_xinclude++; |
1483 goto get_next_node; | 1504 goto get_next_node; |
1484 } | 1505 } |
1485 if ((reader->node != NULL) && (reader->node->type == XML_XINCLUDE_END)) { | 1506 if ((reader->node != NULL) && (reader->node->type == XML_XINCLUDE_END)) { |
1486 reader->in_xinclude--; | 1507 reader->in_xinclude--; |
1487 goto get_next_node; | 1508 goto get_next_node; |
1488 } | 1509 } |
1489 #endif | 1510 #endif |
1490 /* | 1511 /* |
1491 * Handle entities enter and exit when in entity replacement mode | 1512 * Handle entities enter and exit when in entity replacement mode |
1492 */ | 1513 */ |
1493 if ((reader->node != NULL) && | 1514 if ((reader->node != NULL) && |
1494 (reader->node->type == XML_ENTITY_REF_NODE) && | 1515 (reader->node->type == XML_ENTITY_REF_NODE) && |
1495 (reader->ctxt != NULL) && (reader->ctxt->replaceEntities == 1)) { | 1516 (reader->ctxt != NULL) && (reader->ctxt->replaceEntities == 1)) { |
1496 /* | 1517 /* |
1497 * Case where the underlying tree is not availble, lookup the entity | 1518 * Case where the underlying tree is not availble, lookup the entity |
1498 * and walk it. | 1519 * and walk it. |
1499 */ | 1520 */ |
1500 if ((reader->node->children == NULL) && (reader->ctxt->sax != NULL) && | 1521 if ((reader->node->children == NULL) && (reader->ctxt->sax != NULL) && |
1501 (reader->ctxt->sax->getEntity != NULL)) { | 1522 (reader->ctxt->sax->getEntity != NULL)) { |
1502 » reader->node->children = (xmlNodePtr) | 1523 » reader->node->children = (xmlNodePtr) |
1503 reader->ctxt->sax->getEntity(reader->ctxt, reader->node->name); | 1524 reader->ctxt->sax->getEntity(reader->ctxt, reader->node->name); |
1504 } | 1525 } |
1505 | 1526 |
1506 if ((reader->node->children != NULL) && | 1527 if ((reader->node->children != NULL) && |
1507 (reader->node->children->type == XML_ENTITY_DECL) && | 1528 (reader->node->children->type == XML_ENTITY_DECL) && |
1508 (reader->node->children->children != NULL)) { | 1529 (reader->node->children->children != NULL)) { |
1509 xmlTextReaderEntPush(reader, reader->node); | 1530 xmlTextReaderEntPush(reader, reader->node); |
1510 reader->node = reader->node->children->children; | 1531 reader->node = reader->node->children->children; |
1511 } | 1532 } |
1512 #ifdef LIBXML_REGEXP_ENABLED | 1533 #ifdef LIBXML_REGEXP_ENABLED |
1513 } else if ((reader->node != NULL) && | 1534 } else if ((reader->node != NULL) && |
1514 (reader->node->type == XML_ENTITY_REF_NODE) && | 1535 (reader->node->type == XML_ENTITY_REF_NODE) && |
1515 (reader->ctxt != NULL) && (reader->validate)) { | 1536 (reader->ctxt != NULL) && (reader->validate)) { |
1516 xmlTextReaderValidateEntity(reader); | 1537 xmlTextReaderValidateEntity(reader); |
1517 #endif /* LIBXML_REGEXP_ENABLED */ | 1538 #endif /* LIBXML_REGEXP_ENABLED */ |
1518 } | 1539 } |
1519 if ((reader->node != NULL) && | 1540 if ((reader->node != NULL) && |
1520 (reader->node->type == XML_ENTITY_DECL) && | 1541 (reader->node->type == XML_ENTITY_DECL) && |
1521 (reader->ent != NULL) && (reader->ent->children == reader->node)) { | 1542 (reader->ent != NULL) && (reader->ent->children == reader->node)) { |
1522 reader->node = xmlTextReaderEntPop(reader); | 1543 reader->node = xmlTextReaderEntPop(reader); |
1523 reader->depth++; | 1544 reader->depth++; |
1524 goto get_next_node; | 1545 goto get_next_node; |
1525 } | 1546 } |
1526 #ifdef LIBXML_REGEXP_ENABLED | 1547 #ifdef LIBXML_REGEXP_ENABLED |
1527 if ((reader->validate) && (reader->node != NULL)) { | 1548 if ((reader->validate) && (reader->node != NULL)) { |
1528 xmlNodePtr node = reader->node; | 1549 xmlNodePtr node = reader->node; |
1529 | 1550 |
1530 » if ((node->type == XML_ELEMENT_NODE) && | 1551 » if ((node->type == XML_ELEMENT_NODE) && |
1531 ((reader->state != XML_TEXTREADER_END) && | 1552 ((reader->state != XML_TEXTREADER_END) && |
1532 (reader->state != XML_TEXTREADER_BACKTRACK))) { | 1553 (reader->state != XML_TEXTREADER_BACKTRACK))) { |
1533 xmlTextReaderValidatePush(reader); | 1554 xmlTextReaderValidatePush(reader); |
1534 } else if ((node->type == XML_TEXT_NODE) || | 1555 } else if ((node->type == XML_TEXT_NODE) || |
1535 (node->type == XML_CDATA_SECTION_NODE)) { | 1556 (node->type == XML_CDATA_SECTION_NODE)) { |
1536 xmlTextReaderValidateCData(reader, node->content, | 1557 xmlTextReaderValidateCData(reader, node->content, |
1537 xmlStrlen(node->content)); | 1558 xmlStrlen(node->content)); |
1538 } | 1559 } |
1539 } | 1560 } |
1540 #endif /* LIBXML_REGEXP_ENABLED */ | 1561 #endif /* LIBXML_REGEXP_ENABLED */ |
1541 #ifdef LIBXML_PATTERN_ENABLED | 1562 #ifdef LIBXML_PATTERN_ENABLED |
1542 if ((reader->patternNr > 0) && (reader->state != XML_TEXTREADER_END) && | 1563 if ((reader->patternNr > 0) && (reader->state != XML_TEXTREADER_END) && |
1543 (reader->state != XML_TEXTREADER_BACKTRACK)) { | 1564 (reader->state != XML_TEXTREADER_BACKTRACK)) { |
1544 int i; | 1565 int i; |
1545 for (i = 0;i < reader->patternNr;i++) { | 1566 for (i = 0;i < reader->patternNr;i++) { |
1546 if (xmlPatternMatch(reader->patternTab[i], reader->node) == 1) { | 1567 if (xmlPatternMatch(reader->patternTab[i], reader->node) == 1) { |
1547 xmlTextReaderPreserve(reader); | 1568 xmlTextReaderPreserve(reader); |
1548 break; | 1569 break; |
1549 } | 1570 } |
1550 } | 1571 } |
1551 } | 1572 } |
1552 #endif /* LIBXML_PATTERN_ENABLED */ | 1573 #endif /* LIBXML_PATTERN_ENABLED */ |
1553 #ifdef LIBXML_SCHEMAS_ENABLED | 1574 #ifdef LIBXML_SCHEMAS_ENABLED |
1554 if ((reader->validate == XML_TEXTREADER_VALIDATE_XSD) && | 1575 if ((reader->validate == XML_TEXTREADER_VALIDATE_XSD) && |
1555 (reader->xsdValidErrors == 0) && | 1576 (reader->xsdValidErrors == 0) && |
1556 (reader->xsdValidCtxt != NULL)) { | 1577 (reader->xsdValidCtxt != NULL)) { |
1557 reader->xsdValidErrors = !xmlSchemaIsValid(reader->xsdValidCtxt); | 1578 reader->xsdValidErrors = !xmlSchemaIsValid(reader->xsdValidCtxt); |
1558 } | 1579 } |
1559 #endif /* LIBXML_PATTERN_ENABLED */ | 1580 #endif /* LIBXML_PATTERN_ENABLED */ |
1560 return(1); | 1581 return(1); |
1561 node_end: | 1582 node_end: |
1562 reader->state = XML_TEXTREADER_DONE; | 1583 reader->state = XML_TEXTREADER_DONE; |
1563 return(0); | 1584 return(0); |
1564 } | 1585 } |
1565 | 1586 |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1636 } | 1657 } |
1637 | 1658 |
1638 #ifdef LIBXML_WRITER_ENABLED | 1659 #ifdef LIBXML_WRITER_ENABLED |
1639 /** | 1660 /** |
1640 * xmlTextReaderReadInnerXml: | 1661 * xmlTextReaderReadInnerXml: |
1641 * @reader: the xmlTextReaderPtr used | 1662 * @reader: the xmlTextReaderPtr used |
1642 * | 1663 * |
1643 * Reads the contents of the current node, including child nodes and markup. | 1664 * Reads the contents of the current node, including child nodes and markup. |
1644 * | 1665 * |
1645 * Returns a string containing the XML content, or NULL if the current node | 1666 * Returns a string containing the XML content, or NULL if the current node |
1646 * is neither an element nor attribute, or has no child nodes. The | 1667 * is neither an element nor attribute, or has no child nodes. The |
1647 * string must be deallocated by the caller. | 1668 * string must be deallocated by the caller. |
1648 */ | 1669 */ |
1649 xmlChar * | 1670 xmlChar * |
1650 xmlTextReaderReadInnerXml(xmlTextReaderPtr reader ATTRIBUTE_UNUSED) | 1671 xmlTextReaderReadInnerXml(xmlTextReaderPtr reader ATTRIBUTE_UNUSED) |
1651 { | 1672 { |
1652 xmlChar *resbuf; | 1673 xmlChar *resbuf; |
1653 xmlNodePtr node, cur_node; | 1674 xmlNodePtr node, cur_node; |
1654 xmlBufferPtr buff, buff2; | 1675 xmlBufferPtr buff, buff2; |
1655 xmlDocPtr doc; | 1676 xmlDocPtr doc; |
1656 | 1677 |
(...skipping 25 matching lines...) Expand all Loading... |
1682 #endif | 1703 #endif |
1683 | 1704 |
1684 #ifdef LIBXML_WRITER_ENABLED | 1705 #ifdef LIBXML_WRITER_ENABLED |
1685 /** | 1706 /** |
1686 * xmlTextReaderReadOuterXml: | 1707 * xmlTextReaderReadOuterXml: |
1687 * @reader: the xmlTextReaderPtr used | 1708 * @reader: the xmlTextReaderPtr used |
1688 * | 1709 * |
1689 * Reads the contents of the current node, including child nodes and markup. | 1710 * Reads the contents of the current node, including child nodes and markup. |
1690 * | 1711 * |
1691 * Returns a string containing the XML content, or NULL if the current node | 1712 * Returns a string containing the XML content, or NULL if the current node |
1692 * is neither an element nor attribute, or has no child nodes. The | 1713 * is neither an element nor attribute, or has no child nodes. The |
1693 * string must be deallocated by the caller. | 1714 * string must be deallocated by the caller. |
1694 */ | 1715 */ |
1695 xmlChar * | 1716 xmlChar * |
1696 xmlTextReaderReadOuterXml(xmlTextReaderPtr reader ATTRIBUTE_UNUSED) | 1717 xmlTextReaderReadOuterXml(xmlTextReaderPtr reader ATTRIBUTE_UNUSED) |
1697 { | 1718 { |
1698 xmlChar *resbuf; | 1719 xmlChar *resbuf; |
1699 xmlNodePtr node; | 1720 xmlNodePtr node; |
1700 xmlBufferPtr buff; | 1721 xmlBufferPtr buff; |
1701 xmlDocPtr doc; | 1722 xmlDocPtr doc; |
1702 | 1723 |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1840 reader->state = XML_TEXTREADER_END; | 1861 reader->state = XML_TEXTREADER_END; |
1841 return(0); | 1862 return(0); |
1842 } | 1863 } |
1843 | 1864 |
1844 reader->node = reader->doc->children; | 1865 reader->node = reader->doc->children; |
1845 reader->state = XML_TEXTREADER_START; | 1866 reader->state = XML_TEXTREADER_START; |
1846 return(1); | 1867 return(1); |
1847 } | 1868 } |
1848 | 1869 |
1849 if (reader->state != XML_TEXTREADER_BACKTRACK) { | 1870 if (reader->state != XML_TEXTREADER_BACKTRACK) { |
1850 if (reader->node->children != 0) { | 1871 » /* Here removed traversal to child, because we want to skip the subtree, |
1851 reader->node = reader->node->children; | 1872 » replace with traversal to sibling to skip subtree */ |
1852 reader->depth++; | 1873 if (reader->node->next != 0) { |
| 1874 » /* Move to sibling if present,skipping sub-tree */ |
| 1875 reader->node = reader->node->next; |
1853 reader->state = XML_TEXTREADER_START; | 1876 reader->state = XML_TEXTREADER_START; |
1854 return(1); | 1877 return(1); |
1855 } | 1878 } |
1856 | 1879 |
| 1880 /* if reader->node->next is NULL mean no subtree for current node, |
| 1881 so need to move to sibling of parent node if present */ |
1857 if ((reader->node->type == XML_ELEMENT_NODE) || | 1882 if ((reader->node->type == XML_ELEMENT_NODE) || |
1858 (reader->node->type == XML_ATTRIBUTE_NODE)) { | 1883 (reader->node->type == XML_ATTRIBUTE_NODE)) { |
1859 reader->state = XML_TEXTREADER_BACKTRACK; | 1884 reader->state = XML_TEXTREADER_BACKTRACK; |
1860 return(1); | 1885 » /* This will move to parent if present */ |
| 1886 xmlTextReaderRead(reader); |
1861 } | 1887 } |
1862 } | 1888 } |
1863 | 1889 |
1864 if (reader->node->next != 0) { | 1890 if (reader->node->next != 0) { |
1865 reader->node = reader->node->next; | 1891 reader->node = reader->node->next; |
1866 reader->state = XML_TEXTREADER_START; | 1892 reader->state = XML_TEXTREADER_START; |
1867 return(1); | 1893 return(1); |
1868 } | 1894 } |
1869 | 1895 |
1870 if (reader->node->parent != 0) { | 1896 if (reader->node->parent != 0) { |
1871 if (reader->node->parent->type == XML_DOCUMENT_NODE) { | 1897 if (reader->node->parent->type == XML_DOCUMENT_NODE) { |
1872 reader->state = XML_TEXTREADER_END; | 1898 reader->state = XML_TEXTREADER_END; |
1873 return(0); | 1899 return(0); |
1874 } | 1900 } |
1875 | 1901 |
1876 reader->node = reader->node->parent; | 1902 reader->node = reader->node->parent; |
1877 reader->depth--; | 1903 reader->depth--; |
1878 reader->state = XML_TEXTREADER_BACKTRACK; | 1904 reader->state = XML_TEXTREADER_BACKTRACK; |
1879 return(1); | 1905 » /* Repeat process to move to sibling of parent node if present */ |
| 1906 xmlTextReaderNextTree(reader); |
1880 } | 1907 } |
1881 | 1908 |
1882 reader->state = XML_TEXTREADER_END; | 1909 reader->state = XML_TEXTREADER_END; |
1883 | 1910 |
1884 return(1); | 1911 return(1); |
1885 } | 1912 } |
1886 | 1913 |
1887 /** | 1914 /** |
1888 * xmlTextReaderReadTree: | 1915 * xmlTextReaderReadTree: |
1889 * @reader: the xmlTextReaderPtr used | 1916 * @reader: the xmlTextReaderPtr used |
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2072 if (ret->input->buffer->use >= 4) { | 2099 if (ret->input->buffer->use >= 4) { |
2073 ret->ctxt = xmlCreatePushParserCtxt(ret->sax, NULL, | 2100 ret->ctxt = xmlCreatePushParserCtxt(ret->sax, NULL, |
2074 (const char *) ret->input->buffer->content, 4, URI); | 2101 (const char *) ret->input->buffer->content, 4, URI); |
2075 ret->base = 0; | 2102 ret->base = 0; |
2076 ret->cur = 4; | 2103 ret->cur = 4; |
2077 } else { | 2104 } else { |
2078 ret->ctxt = xmlCreatePushParserCtxt(ret->sax, NULL, NULL, 0, URI); | 2105 ret->ctxt = xmlCreatePushParserCtxt(ret->sax, NULL, NULL, 0, URI); |
2079 ret->base = 0; | 2106 ret->base = 0; |
2080 ret->cur = 0; | 2107 ret->cur = 0; |
2081 } | 2108 } |
2082 | 2109 |
2083 if (ret->ctxt == NULL) { | 2110 if (ret->ctxt == NULL) { |
2084 xmlGenericError(xmlGenericErrorContext, | 2111 xmlGenericError(xmlGenericErrorContext, |
2085 "xmlNewTextReader : malloc failed\n"); | 2112 "xmlNewTextReader : malloc failed\n"); |
2086 xmlBufferFree(ret->buffer); | 2113 xmlBufferFree(ret->buffer); |
2087 xmlFree(ret->sax); | 2114 xmlFree(ret->sax); |
2088 xmlFree(ret); | 2115 xmlFree(ret); |
2089 return(NULL); | 2116 return(NULL); |
2090 } | 2117 } |
2091 ret->ctxt->parseMode = XML_PARSE_READER; | 2118 ret->ctxt->parseMode = XML_PARSE_READER; |
2092 ret->ctxt->_private = ret; | 2119 ret->ctxt->_private = ret; |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2180 #ifdef LIBXML_PATTERN_ENABLED | 2207 #ifdef LIBXML_PATTERN_ENABLED |
2181 if (reader->patternTab != NULL) { | 2208 if (reader->patternTab != NULL) { |
2182 int i; | 2209 int i; |
2183 for (i = 0;i < reader->patternNr;i++) { | 2210 for (i = 0;i < reader->patternNr;i++) { |
2184 if (reader->patternTab[i] != NULL) | 2211 if (reader->patternTab[i] != NULL) |
2185 xmlFreePattern(reader->patternTab[i]); | 2212 xmlFreePattern(reader->patternTab[i]); |
2186 } | 2213 } |
2187 xmlFree(reader->patternTab); | 2214 xmlFree(reader->patternTab); |
2188 } | 2215 } |
2189 #endif | 2216 #endif |
| 2217 if (reader->faketext != NULL) { |
| 2218 xmlFreeNode(reader->faketext); |
| 2219 } |
2190 if (reader->ctxt != NULL) { | 2220 if (reader->ctxt != NULL) { |
2191 if (reader->dict == reader->ctxt->dict) | 2221 if (reader->dict == reader->ctxt->dict) |
2192 reader->dict = NULL; | 2222 reader->dict = NULL; |
2193 if (reader->ctxt->myDoc != NULL) { | 2223 if (reader->ctxt->myDoc != NULL) { |
2194 if (reader->preserve == 0) | 2224 if (reader->preserve == 0) |
2195 xmlTextReaderFreeDoc(reader, reader->ctxt->myDoc); | 2225 xmlTextReaderFreeDoc(reader, reader->ctxt->myDoc); |
2196 reader->ctxt->myDoc = NULL; | 2226 reader->ctxt->myDoc = NULL; |
2197 } | 2227 } |
2198 if ((reader->ctxt->vctxt.vstateTab != NULL) && | 2228 if ((reader->ctxt->vctxt.vstateTab != NULL) && |
2199 (reader->ctxt->vctxt.vstateMax > 0)){ | 2229 (reader->ctxt->vctxt.vstateMax > 0)){ |
2200 xmlFree(reader->ctxt->vctxt.vstateTab); | 2230 xmlFree(reader->ctxt->vctxt.vstateTab); |
2201 reader->ctxt->vctxt.vstateTab = NULL; | 2231 reader->ctxt->vctxt.vstateTab = NULL; |
2202 reader->ctxt->vctxt.vstateMax = 0; | 2232 reader->ctxt->vctxt.vstateMax = 0; |
2203 } | 2233 } |
2204 if (reader->allocs & XML_TEXTREADER_CTXT) | 2234 if (reader->allocs & XML_TEXTREADER_CTXT) |
2205 xmlFreeParserCtxt(reader->ctxt); | 2235 xmlFreeParserCtxt(reader->ctxt); |
2206 } | 2236 } |
2207 if (reader->sax != NULL) | 2237 if (reader->sax != NULL) |
2208 xmlFree(reader->sax); | 2238 xmlFree(reader->sax); |
2209 if ((reader->input != NULL) && (reader->allocs & XML_TEXTREADER_INPUT)) | 2239 if ((reader->input != NULL) && (reader->allocs & XML_TEXTREADER_INPUT)) |
2210 xmlFreeParserInputBuffer(reader->input); | 2240 xmlFreeParserInputBuffer(reader->input); |
2211 if (reader->faketext != NULL) { | |
2212 xmlFreeNode(reader->faketext); | |
2213 } | |
2214 if (reader->buffer != NULL) | 2241 if (reader->buffer != NULL) |
2215 xmlBufferFree(reader->buffer); | 2242 xmlBufferFree(reader->buffer); |
2216 if (reader->entTab != NULL) | 2243 if (reader->entTab != NULL) |
2217 xmlFree(reader->entTab); | 2244 xmlFree(reader->entTab); |
2218 if (reader->dict != NULL) | 2245 if (reader->dict != NULL) |
2219 xmlDictFree(reader->dict); | 2246 xmlDictFree(reader->dict); |
2220 xmlFree(reader); | 2247 xmlFree(reader); |
2221 } | 2248 } |
2222 | 2249 |
2223 /************************************************************************ | 2250 /************************************************************************ |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2274 xmlAttrPtr cur; | 2301 xmlAttrPtr cur; |
2275 xmlNsPtr ns; | 2302 xmlNsPtr ns; |
2276 | 2303 |
2277 if (reader == NULL) | 2304 if (reader == NULL) |
2278 return(NULL); | 2305 return(NULL); |
2279 if (reader->node == NULL) | 2306 if (reader->node == NULL) |
2280 return(NULL); | 2307 return(NULL); |
2281 if (reader->curnode != NULL) | 2308 if (reader->curnode != NULL) |
2282 return(NULL); | 2309 return(NULL); |
2283 /* TODO: handle the xmlDecl */ | 2310 /* TODO: handle the xmlDecl */ |
2284 if (reader->node->type != XML_ELEMENT_NODE) | 2311 if (reader->node->type != XML_ELEMENT_NODE) |
2285 return(NULL); | 2312 return(NULL); |
2286 | 2313 |
2287 ns = reader->node->nsDef; | 2314 ns = reader->node->nsDef; |
2288 for (i = 0;(i < no) && (ns != NULL);i++) { | 2315 for (i = 0;(i < no) && (ns != NULL);i++) { |
2289 ns = ns->next; | 2316 ns = ns->next; |
2290 } | 2317 } |
2291 if (ns != NULL) | 2318 if (ns != NULL) |
2292 return(xmlStrdup(ns->href)); | 2319 return(xmlStrdup(ns->href)); |
2293 | 2320 |
2294 cur = reader->node->properties; | 2321 cur = reader->node->properties; |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2404 /* TODO: handle the xmlDecl */ | 2431 /* TODO: handle the xmlDecl */ |
2405 if (reader->node->type != XML_ELEMENT_NODE) | 2432 if (reader->node->type != XML_ELEMENT_NODE) |
2406 return(NULL); | 2433 return(NULL); |
2407 | 2434 |
2408 if (xmlStrEqual(namespaceURI, BAD_CAST "http://www.w3.org/2000/xmlns/")) { | 2435 if (xmlStrEqual(namespaceURI, BAD_CAST "http://www.w3.org/2000/xmlns/")) { |
2409 if (! xmlStrEqual(localName, BAD_CAST "xmlns")) { | 2436 if (! xmlStrEqual(localName, BAD_CAST "xmlns")) { |
2410 prefix = BAD_CAST localName; | 2437 prefix = BAD_CAST localName; |
2411 } | 2438 } |
2412 ns = reader->node->nsDef; | 2439 ns = reader->node->nsDef; |
2413 while (ns != NULL) { | 2440 while (ns != NULL) { |
2414 » » » if ((prefix == NULL && ns->prefix == NULL) || | 2441 » » » if ((prefix == NULL && ns->prefix == NULL) || |
2415 ((ns->prefix != NULL) && (xmlStrEqual(ns->prefix
, localName)))) { | 2442 ((ns->prefix != NULL) && (xmlStrEqual(ns->prefix
, localName)))) { |
2416 return xmlStrdup(ns->href); | 2443 return xmlStrdup(ns->href); |
2417 } | 2444 } |
2418 ns = ns->next; | 2445 ns = ns->next; |
2419 } | 2446 } |
2420 return NULL; | 2447 return NULL; |
2421 } | 2448 } |
2422 | 2449 |
2423 return(xmlGetNsProp(reader->node, localName, namespaceURI)); | 2450 return(xmlGetNsProp(reader->node, localName, namespaceURI)); |
2424 } | 2451 } |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2516 xmlTextReaderMoveToAttributeNo(xmlTextReaderPtr reader, int no) { | 2543 xmlTextReaderMoveToAttributeNo(xmlTextReaderPtr reader, int no) { |
2517 int i; | 2544 int i; |
2518 xmlAttrPtr cur; | 2545 xmlAttrPtr cur; |
2519 xmlNsPtr ns; | 2546 xmlNsPtr ns; |
2520 | 2547 |
2521 if (reader == NULL) | 2548 if (reader == NULL) |
2522 return(-1); | 2549 return(-1); |
2523 if (reader->node == NULL) | 2550 if (reader->node == NULL) |
2524 return(-1); | 2551 return(-1); |
2525 /* TODO: handle the xmlDecl */ | 2552 /* TODO: handle the xmlDecl */ |
2526 if (reader->node->type != XML_ELEMENT_NODE) | 2553 if (reader->node->type != XML_ELEMENT_NODE) |
2527 return(-1); | 2554 return(-1); |
2528 | 2555 |
2529 reader->curnode = NULL; | 2556 reader->curnode = NULL; |
2530 | 2557 |
2531 ns = reader->node->nsDef; | 2558 ns = reader->node->nsDef; |
2532 for (i = 0;(i < no) && (ns != NULL);i++) { | 2559 for (i = 0;(i < no) && (ns != NULL);i++) { |
2533 ns = ns->next; | 2560 ns = ns->next; |
2534 } | 2561 } |
2535 if (ns != NULL) { | 2562 if (ns != NULL) { |
2536 reader->curnode = (xmlNodePtr) ns; | 2563 reader->curnode = (xmlNodePtr) ns; |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2603 */ | 2630 */ |
2604 if ((xmlStrEqual(prop->name, name)) && | 2631 if ((xmlStrEqual(prop->name, name)) && |
2605 ((prop->ns == NULL) || (prop->ns->prefix == NULL))) { | 2632 ((prop->ns == NULL) || (prop->ns->prefix == NULL))) { |
2606 reader->curnode = (xmlNodePtr) prop; | 2633 reader->curnode = (xmlNodePtr) prop; |
2607 return(1); | 2634 return(1); |
2608 } | 2635 } |
2609 prop = prop->next; | 2636 prop = prop->next; |
2610 } | 2637 } |
2611 return(0); | 2638 return(0); |
2612 } | 2639 } |
2613 | 2640 |
2614 /* | 2641 /* |
2615 * Namespace default decl | 2642 * Namespace default decl |
2616 */ | 2643 */ |
2617 if (xmlStrEqual(prefix, BAD_CAST "xmlns")) { | 2644 if (xmlStrEqual(prefix, BAD_CAST "xmlns")) { |
2618 ns = reader->node->nsDef; | 2645 ns = reader->node->nsDef; |
2619 while (ns != NULL) { | 2646 while (ns != NULL) { |
2620 if ((ns->prefix != NULL) && (xmlStrEqual(ns->prefix, localname))) { | 2647 if ((ns->prefix != NULL) && (xmlStrEqual(ns->prefix, localname))) { |
2621 reader->curnode = (xmlNodePtr) ns; | 2648 reader->curnode = (xmlNodePtr) ns; |
2622 goto found; | 2649 goto found; |
2623 } | 2650 } |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2680 if (reader->node->type != XML_ELEMENT_NODE) | 2707 if (reader->node->type != XML_ELEMENT_NODE) |
2681 return(0); | 2708 return(0); |
2682 node = reader->node; | 2709 node = reader->node; |
2683 | 2710 |
2684 if (xmlStrEqual(namespaceURI, BAD_CAST "http://www.w3.org/2000/xmlns/")) { | 2711 if (xmlStrEqual(namespaceURI, BAD_CAST "http://www.w3.org/2000/xmlns/")) { |
2685 if (! xmlStrEqual(localName, BAD_CAST "xmlns")) { | 2712 if (! xmlStrEqual(localName, BAD_CAST "xmlns")) { |
2686 prefix = BAD_CAST localName; | 2713 prefix = BAD_CAST localName; |
2687 } | 2714 } |
2688 ns = reader->node->nsDef; | 2715 ns = reader->node->nsDef; |
2689 while (ns != NULL) { | 2716 while (ns != NULL) { |
2690 » » » if ((prefix == NULL && ns->prefix == NULL) || | 2717 » » » if ((prefix == NULL && ns->prefix == NULL) || |
2691 ((ns->prefix != NULL) && (xmlStrEqual(ns->prefix
, localName)))) { | 2718 ((ns->prefix != NULL) && (xmlStrEqual(ns->prefix
, localName)))) { |
2692 reader->curnode = (xmlNodePtr) ns; | 2719 reader->curnode = (xmlNodePtr) ns; |
2693 return(1); | 2720 return(1); |
2694 } | 2721 } |
2695 ns = ns->next; | 2722 ns = ns->next; |
2696 } | 2723 } |
2697 return(0); | 2724 return(0); |
2698 } | 2725 } |
2699 | 2726 |
2700 prop = node->properties; | 2727 prop = node->properties; |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2826 if (reader->curnode == NULL) | 2853 if (reader->curnode == NULL) |
2827 return(0); | 2854 return(0); |
2828 if (reader->curnode->type == XML_ATTRIBUTE_NODE) { | 2855 if (reader->curnode->type == XML_ATTRIBUTE_NODE) { |
2829 if (reader->curnode->children == NULL) | 2856 if (reader->curnode->children == NULL) |
2830 return(0); | 2857 return(0); |
2831 reader->curnode = reader->curnode->children; | 2858 reader->curnode = reader->curnode->children; |
2832 } else if (reader->curnode->type == XML_NAMESPACE_DECL) { | 2859 } else if (reader->curnode->type == XML_NAMESPACE_DECL) { |
2833 xmlNsPtr ns = (xmlNsPtr) reader->curnode; | 2860 xmlNsPtr ns = (xmlNsPtr) reader->curnode; |
2834 | 2861 |
2835 if (reader->faketext == NULL) { | 2862 if (reader->faketext == NULL) { |
2836 » reader->faketext = xmlNewDocText(reader->node->doc, | 2863 » reader->faketext = xmlNewDocText(reader->node->doc, |
2837 ns->href); | 2864 ns->href); |
2838 } else { | 2865 } else { |
2839 if ((reader->faketext->content != NULL) && | 2866 if ((reader->faketext->content != NULL) && |
2840 (reader->faketext->content != | 2867 (reader->faketext->content != |
2841 (xmlChar *) &(reader->faketext->properties))) | 2868 (xmlChar *) &(reader->faketext->properties))) |
2842 xmlFree(reader->faketext->content); | 2869 xmlFree(reader->faketext->content); |
2843 reader->faketext->content = xmlStrdup(ns->href); | 2870 reader->faketext->content = xmlStrdup(ns->href); |
2844 } | 2871 } |
2845 reader->curnode = reader->faketext; | 2872 reader->curnode = reader->faketext; |
2846 } else { | 2873 } else { |
(...skipping 17 matching lines...) Expand all Loading... |
2864 xmlTextReaderConstEncoding(xmlTextReaderPtr reader) { | 2891 xmlTextReaderConstEncoding(xmlTextReaderPtr reader) { |
2865 xmlDocPtr doc = NULL; | 2892 xmlDocPtr doc = NULL; |
2866 if (reader == NULL) | 2893 if (reader == NULL) |
2867 return(NULL); | 2894 return(NULL); |
2868 if (reader->doc != NULL) | 2895 if (reader->doc != NULL) |
2869 doc = reader->doc; | 2896 doc = reader->doc; |
2870 else if (reader->ctxt != NULL) | 2897 else if (reader->ctxt != NULL) |
2871 doc = reader->ctxt->myDoc; | 2898 doc = reader->ctxt->myDoc; |
2872 if (doc == NULL) | 2899 if (doc == NULL) |
2873 return(NULL); | 2900 return(NULL); |
2874 | 2901 |
2875 if (doc->encoding == NULL) | 2902 if (doc->encoding == NULL) |
2876 return(NULL); | 2903 return(NULL); |
2877 else | 2904 else |
2878 return(CONSTSTR(doc->encoding)); | 2905 return(CONSTSTR(doc->encoding)); |
2879 } | 2906 } |
2880 | 2907 |
2881 | 2908 |
2882 /************************************************************************ | 2909 /************************************************************************ |
2883 * * | 2910 * * |
2884 * Acces API to the current node * | 2911 * Acces API to the current node * |
(...skipping 11 matching lines...) Expand all Loading... |
2896 xmlTextReaderAttributeCount(xmlTextReaderPtr reader) { | 2923 xmlTextReaderAttributeCount(xmlTextReaderPtr reader) { |
2897 int ret; | 2924 int ret; |
2898 xmlAttrPtr attr; | 2925 xmlAttrPtr attr; |
2899 xmlNsPtr ns; | 2926 xmlNsPtr ns; |
2900 xmlNodePtr node; | 2927 xmlNodePtr node; |
2901 | 2928 |
2902 if (reader == NULL) | 2929 if (reader == NULL) |
2903 return(-1); | 2930 return(-1); |
2904 if (reader->node == NULL) | 2931 if (reader->node == NULL) |
2905 return(0); | 2932 return(0); |
2906 | 2933 |
2907 if (reader->curnode != NULL) | 2934 if (reader->curnode != NULL) |
2908 node = reader->curnode; | 2935 node = reader->curnode; |
2909 else | 2936 else |
2910 node = reader->node; | 2937 node = reader->node; |
2911 | 2938 |
2912 if (node->type != XML_ELEMENT_NODE) | 2939 if (node->type != XML_ELEMENT_NODE) |
2913 return(0); | 2940 return(0); |
2914 if ((reader->state == XML_TEXTREADER_END) || | 2941 if ((reader->state == XML_TEXTREADER_END) || |
2915 (reader->state == XML_TEXTREADER_BACKTRACK)) | 2942 (reader->state == XML_TEXTREADER_BACKTRACK)) |
2916 return(0); | 2943 return(0); |
(...skipping 17 matching lines...) Expand all Loading... |
2934 * | 2961 * |
2935 * Get the node type of the current node | 2962 * Get the node type of the current node |
2936 * Reference: | 2963 * Reference: |
2937 * http://www.gnu.org/software/dotgnu/pnetlib-doc/System/Xml/XmlNodeType.html | 2964 * http://www.gnu.org/software/dotgnu/pnetlib-doc/System/Xml/XmlNodeType.html |
2938 * | 2965 * |
2939 * Returns the xmlNodeType of the current node or -1 in case of error | 2966 * Returns the xmlNodeType of the current node or -1 in case of error |
2940 */ | 2967 */ |
2941 int | 2968 int |
2942 xmlTextReaderNodeType(xmlTextReaderPtr reader) { | 2969 xmlTextReaderNodeType(xmlTextReaderPtr reader) { |
2943 xmlNodePtr node; | 2970 xmlNodePtr node; |
2944 | 2971 |
2945 if (reader == NULL) | 2972 if (reader == NULL) |
2946 return(-1); | 2973 return(-1); |
2947 if (reader->node == NULL) | 2974 if (reader->node == NULL) |
2948 return(XML_READER_TYPE_NONE); | 2975 return(XML_READER_TYPE_NONE); |
2949 if (reader->curnode != NULL) | 2976 if (reader->curnode != NULL) |
2950 node = reader->curnode; | 2977 node = reader->curnode; |
2951 else | 2978 else |
2952 node = reader->node; | 2979 node = reader->node; |
2953 switch (node->type) { | 2980 switch (node->type) { |
2954 case XML_ELEMENT_NODE: | 2981 case XML_ELEMENT_NODE: |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3030 #endif | 3057 #endif |
3031 return((reader->node->extra & NODE_IS_EMPTY) != 0); | 3058 return((reader->node->extra & NODE_IS_EMPTY) != 0); |
3032 } | 3059 } |
3033 | 3060 |
3034 /** | 3061 /** |
3035 * xmlTextReaderLocalName: | 3062 * xmlTextReaderLocalName: |
3036 * @reader: the xmlTextReaderPtr used | 3063 * @reader: the xmlTextReaderPtr used |
3037 * | 3064 * |
3038 * The local name of the node. | 3065 * The local name of the node. |
3039 * | 3066 * |
3040 * Returns the local name or NULL if not available | 3067 * Returns the local name or NULL if not available, |
| 3068 * if non NULL it need to be freed by the caller. |
3041 */ | 3069 */ |
3042 xmlChar * | 3070 xmlChar * |
3043 xmlTextReaderLocalName(xmlTextReaderPtr reader) { | 3071 xmlTextReaderLocalName(xmlTextReaderPtr reader) { |
3044 xmlNodePtr node; | 3072 xmlNodePtr node; |
3045 if ((reader == NULL) || (reader->node == NULL)) | 3073 if ((reader == NULL) || (reader->node == NULL)) |
3046 return(NULL); | 3074 return(NULL); |
3047 if (reader->curnode != NULL) | 3075 if (reader->curnode != NULL) |
3048 node = reader->curnode; | 3076 node = reader->curnode; |
3049 else | 3077 else |
3050 node = reader->node; | 3078 node = reader->node; |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3091 return(xmlTextReaderConstName(reader)); | 3119 return(xmlTextReaderConstName(reader)); |
3092 return(node->name); | 3120 return(node->name); |
3093 } | 3121 } |
3094 | 3122 |
3095 /** | 3123 /** |
3096 * xmlTextReaderName: | 3124 * xmlTextReaderName: |
3097 * @reader: the xmlTextReaderPtr used | 3125 * @reader: the xmlTextReaderPtr used |
3098 * | 3126 * |
3099 * The qualified name of the node, equal to Prefix :LocalName. | 3127 * The qualified name of the node, equal to Prefix :LocalName. |
3100 * | 3128 * |
3101 * Returns the local name or NULL if not available | 3129 * Returns the local name or NULL if not available, |
| 3130 * if non NULL it need to be freed by the caller. |
3102 */ | 3131 */ |
3103 xmlChar * | 3132 xmlChar * |
3104 xmlTextReaderName(xmlTextReaderPtr reader) { | 3133 xmlTextReaderName(xmlTextReaderPtr reader) { |
3105 xmlNodePtr node; | 3134 xmlNodePtr node; |
3106 xmlChar *ret; | 3135 xmlChar *ret; |
3107 | 3136 |
3108 if ((reader == NULL) || (reader->node == NULL)) | 3137 if ((reader == NULL) || (reader->node == NULL)) |
3109 return(NULL); | 3138 return(NULL); |
3110 if (reader->curnode != NULL) | 3139 if (reader->curnode != NULL) |
3111 node = reader->curnode; | 3140 node = reader->curnode; |
3112 else | 3141 else |
3113 node = reader->node; | 3142 node = reader->node; |
3114 switch (node->type) { | 3143 switch (node->type) { |
3115 case XML_ELEMENT_NODE: | 3144 case XML_ELEMENT_NODE: |
3116 case XML_ATTRIBUTE_NODE: | 3145 case XML_ATTRIBUTE_NODE: |
3117 if ((node->ns == NULL) || | 3146 if ((node->ns == NULL) || |
3118 (node->ns->prefix == NULL)) | 3147 (node->ns->prefix == NULL)) |
3119 return(xmlStrdup(node->name)); | 3148 return(xmlStrdup(node->name)); |
3120 » | 3149 |
3121 ret = xmlStrdup(node->ns->prefix); | 3150 ret = xmlStrdup(node->ns->prefix); |
3122 ret = xmlStrcat(ret, BAD_CAST ":"); | 3151 ret = xmlStrcat(ret, BAD_CAST ":"); |
3123 ret = xmlStrcat(ret, node->name); | 3152 ret = xmlStrcat(ret, node->name); |
3124 return(ret); | 3153 return(ret); |
3125 case XML_TEXT_NODE: | 3154 case XML_TEXT_NODE: |
3126 return(xmlStrdup(BAD_CAST "#text")); | 3155 return(xmlStrdup(BAD_CAST "#text")); |
3127 case XML_CDATA_SECTION_NODE: | 3156 case XML_CDATA_SECTION_NODE: |
3128 return(xmlStrdup(BAD_CAST "#cdata-section")); | 3157 return(xmlStrdup(BAD_CAST "#cdata-section")); |
3129 case XML_ENTITY_NODE: | 3158 case XML_ENTITY_NODE: |
3130 case XML_ENTITY_REF_NODE: | 3159 case XML_ENTITY_REF_NODE: |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3234 } | 3263 } |
3235 return(NULL); | 3264 return(NULL); |
3236 } | 3265 } |
3237 | 3266 |
3238 /** | 3267 /** |
3239 * xmlTextReaderPrefix: | 3268 * xmlTextReaderPrefix: |
3240 * @reader: the xmlTextReaderPtr used | 3269 * @reader: the xmlTextReaderPtr used |
3241 * | 3270 * |
3242 * A shorthand reference to the namespace associated with the node. | 3271 * A shorthand reference to the namespace associated with the node. |
3243 * | 3272 * |
3244 * Returns the prefix or NULL if not available | 3273 * Returns the prefix or NULL if not available, |
| 3274 * if non NULL it need to be freed by the caller. |
3245 */ | 3275 */ |
3246 xmlChar * | 3276 xmlChar * |
3247 xmlTextReaderPrefix(xmlTextReaderPtr reader) { | 3277 xmlTextReaderPrefix(xmlTextReaderPtr reader) { |
3248 xmlNodePtr node; | 3278 xmlNodePtr node; |
3249 if ((reader == NULL) || (reader->node == NULL)) | 3279 if ((reader == NULL) || (reader->node == NULL)) |
3250 return(NULL); | 3280 return(NULL); |
3251 if (reader->curnode != NULL) | 3281 if (reader->curnode != NULL) |
3252 node = reader->curnode; | 3282 node = reader->curnode; |
3253 else | 3283 else |
3254 node = reader->node; | 3284 node = reader->node; |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3297 return(CONSTSTR(node->ns->prefix)); | 3327 return(CONSTSTR(node->ns->prefix)); |
3298 return(NULL); | 3328 return(NULL); |
3299 } | 3329 } |
3300 | 3330 |
3301 /** | 3331 /** |
3302 * xmlTextReaderNamespaceUri: | 3332 * xmlTextReaderNamespaceUri: |
3303 * @reader: the xmlTextReaderPtr used | 3333 * @reader: the xmlTextReaderPtr used |
3304 * | 3334 * |
3305 * The URI defining the namespace associated with the node. | 3335 * The URI defining the namespace associated with the node. |
3306 * | 3336 * |
3307 * Returns the namespace URI or NULL if not available | 3337 * Returns the namespace URI or NULL if not available, |
| 3338 * if non NULL it need to be freed by the caller. |
3308 */ | 3339 */ |
3309 xmlChar * | 3340 xmlChar * |
3310 xmlTextReaderNamespaceUri(xmlTextReaderPtr reader) { | 3341 xmlTextReaderNamespaceUri(xmlTextReaderPtr reader) { |
3311 xmlNodePtr node; | 3342 xmlNodePtr node; |
3312 if ((reader == NULL) || (reader->node == NULL)) | 3343 if ((reader == NULL) || (reader->node == NULL)) |
3313 return(NULL); | 3344 return(NULL); |
3314 if (reader->curnode != NULL) | 3345 if (reader->curnode != NULL) |
3315 node = reader->curnode; | 3346 node = reader->curnode; |
3316 else | 3347 else |
3317 node = reader->node; | 3348 node = reader->node; |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3352 return(CONSTSTR(node->ns->href)); | 3383 return(CONSTSTR(node->ns->href)); |
3353 return(NULL); | 3384 return(NULL); |
3354 } | 3385 } |
3355 | 3386 |
3356 /** | 3387 /** |
3357 * xmlTextReaderBaseUri: | 3388 * xmlTextReaderBaseUri: |
3358 * @reader: the xmlTextReaderPtr used | 3389 * @reader: the xmlTextReaderPtr used |
3359 * | 3390 * |
3360 * The base URI of the node. | 3391 * The base URI of the node. |
3361 * | 3392 * |
3362 * Returns the base URI or NULL if not available | 3393 * Returns the base URI or NULL if not available, |
| 3394 * if non NULL it need to be freed by the caller. |
3363 */ | 3395 */ |
3364 xmlChar * | 3396 xmlChar * |
3365 xmlTextReaderBaseUri(xmlTextReaderPtr reader) { | 3397 xmlTextReaderBaseUri(xmlTextReaderPtr reader) { |
3366 if ((reader == NULL) || (reader->node == NULL)) | 3398 if ((reader == NULL) || (reader->node == NULL)) |
3367 return(NULL); | 3399 return(NULL); |
3368 return(xmlNodeGetBase(NULL, reader->node)); | 3400 return(xmlNodeGetBase(NULL, reader->node)); |
3369 } | 3401 } |
3370 | 3402 |
3371 /** | 3403 /** |
3372 * xmlTextReaderConstBaseUri: | 3404 * xmlTextReaderConstBaseUri: |
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3610 /* TODO maybe lookup the attribute value for " first */ | 3642 /* TODO maybe lookup the attribute value for " first */ |
3611 return((int) '"'); | 3643 return((int) '"'); |
3612 } | 3644 } |
3613 | 3645 |
3614 /** | 3646 /** |
3615 * xmlTextReaderXmlLang: | 3647 * xmlTextReaderXmlLang: |
3616 * @reader: the xmlTextReaderPtr used | 3648 * @reader: the xmlTextReaderPtr used |
3617 * | 3649 * |
3618 * The xml:lang scope within which the node resides. | 3650 * The xml:lang scope within which the node resides. |
3619 * | 3651 * |
3620 * Returns the xml:lang value or NULL if none exists. | 3652 * Returns the xml:lang value or NULL if none exists., |
| 3653 * if non NULL it need to be freed by the caller. |
3621 */ | 3654 */ |
3622 xmlChar * | 3655 xmlChar * |
3623 xmlTextReaderXmlLang(xmlTextReaderPtr reader) { | 3656 xmlTextReaderXmlLang(xmlTextReaderPtr reader) { |
3624 if (reader == NULL) | 3657 if (reader == NULL) |
3625 return(NULL); | 3658 return(NULL); |
3626 if (reader->node == NULL) | 3659 if (reader->node == NULL) |
3627 return(NULL); | 3660 return(NULL); |
3628 return(xmlNodeGetLang(reader->node)); | 3661 return(xmlNodeGetLang(reader->node)); |
3629 } | 3662 } |
3630 | 3663 |
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3835 * Hacking interface allowing to get the xmlNodePtr correponding to the | 3868 * Hacking interface allowing to get the xmlNodePtr correponding to the |
3836 * current node being accessed by the xmlTextReader. This is dangerous | 3869 * current node being accessed by the xmlTextReader. This is dangerous |
3837 * because the underlying node may be destroyed on the next Reads. | 3870 * because the underlying node may be destroyed on the next Reads. |
3838 * | 3871 * |
3839 * Returns the xmlNodePtr or NULL in case of error. | 3872 * Returns the xmlNodePtr or NULL in case of error. |
3840 */ | 3873 */ |
3841 xmlNodePtr | 3874 xmlNodePtr |
3842 xmlTextReaderCurrentNode(xmlTextReaderPtr reader) { | 3875 xmlTextReaderCurrentNode(xmlTextReaderPtr reader) { |
3843 if (reader == NULL) | 3876 if (reader == NULL) |
3844 return(NULL); | 3877 return(NULL); |
3845 | 3878 |
3846 if (reader->curnode != NULL) | 3879 if (reader->curnode != NULL) |
3847 return(reader->curnode); | 3880 return(reader->curnode); |
3848 return(reader->node); | 3881 return(reader->node); |
3849 } | 3882 } |
3850 | 3883 |
3851 /** | 3884 /** |
3852 * xmlTextReaderPreserve: | 3885 * xmlTextReaderPreserve: |
3853 * @reader: the xmlTextReaderPtr used | 3886 * @reader: the xmlTextReaderPtr used |
3854 * | 3887 * |
3855 * This tells the XML Reader to preserve the current node. | 3888 * This tells the XML Reader to preserve the current node. |
3856 * The caller must also use xmlTextReaderCurrentDoc() to | 3889 * The caller must also use xmlTextReaderCurrentDoc() to |
3857 * keep an handle on the resulting document once parsing has finished | 3890 * keep an handle on the resulting document once parsing has finished |
3858 * | 3891 * |
3859 * Returns the xmlNodePtr or NULL in case of error. | 3892 * Returns the xmlNodePtr or NULL in case of error. |
3860 */ | 3893 */ |
3861 xmlNodePtr | 3894 xmlNodePtr |
3862 xmlTextReaderPreserve(xmlTextReaderPtr reader) { | 3895 xmlTextReaderPreserve(xmlTextReaderPtr reader) { |
3863 xmlNodePtr cur, parent; | 3896 xmlNodePtr cur, parent; |
3864 | 3897 |
3865 if (reader == NULL) | 3898 if (reader == NULL) |
3866 return(NULL); | 3899 return(NULL); |
3867 | 3900 |
3868 if (reader->curnode != NULL) | 3901 if (reader->curnode != NULL) |
3869 cur = reader->curnode; | 3902 cur = reader->curnode; |
3870 else | 3903 else |
3871 cur = reader->node; | 3904 cur = reader->node; |
3872 if (cur == NULL) | 3905 if (cur == NULL) |
3873 return(NULL); | 3906 return(NULL); |
3874 | 3907 |
3875 if ((cur->type != XML_DOCUMENT_NODE) && (cur->type != XML_DTD_NODE)) { | 3908 if ((cur->type != XML_DOCUMENT_NODE) && (cur->type != XML_DTD_NODE)) { |
3876 cur->extra |= NODE_IS_PRESERVED; | 3909 cur->extra |= NODE_IS_PRESERVED; |
3877 cur->extra |= NODE_IS_SPRESERVED; | 3910 cur->extra |= NODE_IS_SPRESERVED; |
3878 } | 3911 } |
3879 reader->preserves++; | 3912 reader->preserves++; |
3880 | 3913 |
3881 parent = cur->parent;; | 3914 parent = cur->parent;; |
3882 while (parent != NULL) { | 3915 while (parent != NULL) { |
3883 if (parent->type == XML_ELEMENT_NODE) | 3916 if (parent->type == XML_ELEMENT_NODE) |
3884 parent->extra |= NODE_IS_PRESERVED; | 3917 parent->extra |= NODE_IS_PRESERVED; |
3885 parent = parent->parent; | 3918 parent = parent->parent; |
3886 } | 3919 } |
3887 return(cur); | 3920 return(cur); |
3888 } | 3921 } |
3889 | 3922 |
3890 #ifdef LIBXML_PATTERN_ENABLED | 3923 #ifdef LIBXML_PATTERN_ENABLED |
3891 /** | 3924 /** |
3892 * xmlTextReaderPreservePattern: | 3925 * xmlTextReaderPreservePattern: |
3893 * @reader: the xmlTextReaderPtr used | 3926 * @reader: the xmlTextReaderPtr used |
3894 * @pattern: an XPath subset pattern | 3927 * @pattern: an XPath subset pattern |
3895 * @namespaces: the prefix definitions, array of [URI, prefix] or NULL | 3928 * @namespaces: the prefix definitions, array of [URI, prefix] or NULL |
3896 * | 3929 * |
3897 * This tells the XML Reader to preserve all nodes matched by the | 3930 * This tells the XML Reader to preserve all nodes matched by the |
3898 * pattern. The caller must also use xmlTextReaderCurrentDoc() to | 3931 * pattern. The caller must also use xmlTextReaderCurrentDoc() to |
3899 * keep an handle on the resulting document once parsing has finished | 3932 * keep an handle on the resulting document once parsing has finished |
3900 * | 3933 * |
3901 * Returns a positive number in case of success and -1 in case of error | 3934 * Returns a positive number in case of success and -1 in case of error |
3902 */ | 3935 */ |
3903 int | 3936 int |
3904 xmlTextReaderPreservePattern(xmlTextReaderPtr reader, const xmlChar *pattern, | 3937 xmlTextReaderPreservePattern(xmlTextReaderPtr reader, const xmlChar *pattern, |
3905 const xmlChar **namespaces) | 3938 const xmlChar **namespaces) |
3906 { | 3939 { |
3907 xmlPatternPtr comp; | 3940 xmlPatternPtr comp; |
3908 | 3941 |
3909 if ((reader == NULL) || (pattern == NULL)) | 3942 if ((reader == NULL) || (pattern == NULL)) |
3910 return(-1); | 3943 return(-1); |
3911 | 3944 |
3912 comp = xmlPatterncompile(pattern, reader->dict, 0, namespaces); | 3945 comp = xmlPatterncompile(pattern, reader->dict, 0, namespaces); |
3913 if (comp == NULL) | 3946 if (comp == NULL) |
3914 return(-1); | 3947 return(-1); |
3915 | 3948 |
3916 if (reader->patternMax <= 0) { | 3949 if (reader->patternMax <= 0) { |
3917 reader->patternMax = 4; | 3950 reader->patternMax = 4; |
3918 reader->patternTab = (xmlPatternPtr *) xmlMalloc(reader->patternMax * | 3951 reader->patternTab = (xmlPatternPtr *) xmlMalloc(reader->patternMax * |
3919 sizeof(reader->patternTab[0])); | 3952 sizeof(reader->patternTab[0])); |
3920 if (reader->patternTab == NULL) { | 3953 if (reader->patternTab == NULL) { |
3921 xmlGenericError(xmlGenericErrorContext, "xmlMalloc failed !\n"); | 3954 xmlGenericError(xmlGenericErrorContext, "xmlMalloc failed !\n"); |
(...skipping 16 matching lines...) Expand all Loading... |
3938 reader->patternTab[reader->patternNr] = comp; | 3971 reader->patternTab[reader->patternNr] = comp; |
3939 return(reader->patternNr++); | 3972 return(reader->patternNr++); |
3940 } | 3973 } |
3941 #endif | 3974 #endif |
3942 | 3975 |
3943 /** | 3976 /** |
3944 * xmlTextReaderCurrentDoc: | 3977 * xmlTextReaderCurrentDoc: |
3945 * @reader: the xmlTextReaderPtr used | 3978 * @reader: the xmlTextReaderPtr used |
3946 * | 3979 * |
3947 * Hacking interface allowing to get the xmlDocPtr correponding to the | 3980 * Hacking interface allowing to get the xmlDocPtr correponding to the |
3948 * current document being accessed by the xmlTextReader. | 3981 * current document being accessed by the xmlTextReader. |
3949 * NOTE: as a result of this call, the reader will not destroy the | 3982 * NOTE: as a result of this call, the reader will not destroy the |
3950 * associated XML document and calling xmlFreeDoc() on the result | 3983 * associated XML document and calling xmlFreeDoc() on the result |
3951 * is needed once the reader parsing has finished. | 3984 * is needed once the reader parsing has finished. |
3952 * | 3985 * |
3953 * Returns the xmlDocPtr or NULL in case of error. | 3986 * Returns the xmlDocPtr or NULL in case of error. |
3954 */ | 3987 */ |
3955 xmlDocPtr | 3988 xmlDocPtr |
3956 xmlTextReaderCurrentDoc(xmlTextReaderPtr reader) { | 3989 xmlTextReaderCurrentDoc(xmlTextReaderPtr reader) { |
3957 if (reader == NULL) | 3990 if (reader == NULL) |
3958 return(NULL); | 3991 return(NULL); |
3959 if (reader->doc != NULL) | 3992 if (reader->doc != NULL) |
3960 return(reader->doc); | 3993 return(reader->doc); |
3961 if ((reader->ctxt == NULL) || (reader->ctxt->myDoc == NULL)) | 3994 if ((reader->ctxt == NULL) || (reader->ctxt->myDoc == NULL)) |
3962 return(NULL); | 3995 return(NULL); |
3963 | 3996 |
3964 reader->preserve = 1; | 3997 reader->preserve = 1; |
3965 return(reader->ctxt->myDoc); | 3998 return(reader->ctxt->myDoc); |
3966 } | 3999 } |
3967 | 4000 |
3968 #ifdef LIBXML_SCHEMAS_ENABLED | 4001 #ifdef LIBXML_SCHEMAS_ENABLED |
| 4002 static char *xmlTextReaderBuildMessage(const char *msg, va_list ap); |
3969 | 4003 |
3970 static char * | 4004 static void XMLCDECL |
3971 xmlTextReaderBuildMessage(const char *msg, va_list ap); | |
3972 | |
3973 static void XMLCDECL | |
3974 xmlTextReaderValidityError(void *ctxt, const char *msg, ...); | 4005 xmlTextReaderValidityError(void *ctxt, const char *msg, ...); |
3975 | 4006 |
3976 static void XMLCDECL | 4007 static void XMLCDECL |
3977 xmlTextReaderValidityWarning(void *ctxt, const char *msg, ...); | 4008 xmlTextReaderValidityWarning(void *ctxt, const char *msg, ...); |
3978 | 4009 |
3979 static void XMLCDECL xmlTextReaderValidityErrorRelay(void *ctx, const char *msg,
...) | 4010 static void XMLCDECL |
| 4011 xmlTextReaderValidityErrorRelay(void *ctx, const char *msg, ...) |
3980 { | 4012 { |
3981 » xmlTextReaderPtr reader = (xmlTextReaderPtr) ctx; | 4013 xmlTextReaderPtr reader = (xmlTextReaderPtr) ctx; |
3982 » char * str; | |
3983 » va_list ap; | |
3984 | 4014 |
3985 » va_start(ap,msg); | 4015 char *str; |
3986 » str = xmlTextReaderBuildMessage(msg,ap); | 4016 |
3987 » if (!reader->errorFunc) { | 4017 va_list ap; |
3988 » » xmlTextReaderValidityError(ctx, "%s", str); | 4018 |
3989 » } else { | 4019 va_start(ap, msg); |
3990 » » reader->errorFunc(reader->errorFuncArg, str, XML_PARSER_SEVERITY
_VALIDITY_ERROR, NULL /* locator */); | 4020 str = xmlTextReaderBuildMessage(msg, ap); |
3991 » } | 4021 if (!reader->errorFunc) { |
3992 » if (str != NULL) | 4022 xmlTextReaderValidityError(ctx, "%s", str); |
3993 » » xmlFree(str); | 4023 } else { |
3994 » va_end(ap); | 4024 reader->errorFunc(reader->errorFuncArg, str, |
| 4025 XML_PARSER_SEVERITY_VALIDITY_ERROR, |
| 4026 NULL /* locator */ ); |
| 4027 } |
| 4028 if (str != NULL) |
| 4029 xmlFree(str); |
| 4030 va_end(ap); |
3995 } | 4031 } |
3996 | 4032 |
3997 static void XMLCDECL xmlTextReaderValidityWarningRelay(void *ctx, const char *ms
g, ...) | 4033 static void XMLCDECL |
| 4034 xmlTextReaderValidityWarningRelay(void *ctx, const char *msg, ...) |
3998 { | 4035 { |
3999 » xmlTextReaderPtr reader = (xmlTextReaderPtr) ctx; | 4036 xmlTextReaderPtr reader = (xmlTextReaderPtr) ctx; |
4000 » char * str; | |
4001 » va_list ap; | |
4002 | 4037 |
4003 » va_start(ap,msg); | 4038 char *str; |
4004 » str = xmlTextReaderBuildMessage(msg,ap); | 4039 |
4005 » if (!reader->errorFunc) { | 4040 va_list ap; |
4006 » » xmlTextReaderValidityWarning(ctx, "%s", str); | 4041 |
4007 » } else { | 4042 va_start(ap, msg); |
4008 » » reader->errorFunc(reader->errorFuncArg, str, XML_PARSER_SEVERITY
_VALIDITY_WARNING, NULL /* locator */); | 4043 str = xmlTextReaderBuildMessage(msg, ap); |
4009 » } | 4044 if (!reader->errorFunc) { |
4010 » if (str != NULL) | 4045 xmlTextReaderValidityWarning(ctx, "%s", str); |
4011 » » xmlFree(str); | 4046 } else { |
4012 » va_end(ap); | 4047 reader->errorFunc(reader->errorFuncArg, str, |
| 4048 XML_PARSER_SEVERITY_VALIDITY_WARNING, |
| 4049 NULL /* locator */ ); |
| 4050 } |
| 4051 if (str != NULL) |
| 4052 xmlFree(str); |
| 4053 va_end(ap); |
4013 } | 4054 } |
4014 | 4055 |
4015 static void | 4056 static void |
4016 xmlTextReaderStructuredError(void *ctxt, xmlErrorPtr error); | 4057 xmlTextReaderStructuredError(void *ctxt, xmlErrorPtr error); |
4017 | 4058 |
4018 static void xmlTextReaderValidityStructuredRelay(void * userData, xmlErrorPtr er
ror) | 4059 static void |
| 4060 xmlTextReaderValidityStructuredRelay(void *userData, xmlErrorPtr error) |
4019 { | 4061 { |
4020 » xmlTextReaderPtr reader = (xmlTextReaderPtr) userData; | 4062 xmlTextReaderPtr reader = (xmlTextReaderPtr) userData; |
4021 | 4063 |
4022 » if (reader->sErrorFunc) { | 4064 if (reader->sErrorFunc) { |
4023 » » reader->sErrorFunc(reader->errorFuncArg, error); | 4065 reader->sErrorFunc(reader->errorFuncArg, error); |
4024 » } else { | 4066 } else { |
4025 » » xmlTextReaderStructuredError(reader, error); | 4067 xmlTextReaderStructuredError(reader, error); |
4026 » } | 4068 } |
4027 } | 4069 } |
4028 | |
4029 /** | 4070 /** |
4030 * xmlTextReaderRelaxNGSetSchema: | 4071 * xmlTextReaderRelaxNGSetSchema: |
4031 * @reader: the xmlTextReaderPtr used | 4072 * @reader: the xmlTextReaderPtr used |
4032 * @schema: a precompiled RelaxNG schema | 4073 * @schema: a precompiled RelaxNG schema |
4033 * | 4074 * |
4034 * Use RelaxNG to validate the document as it is processed. | 4075 * Use RelaxNG to validate the document as it is processed. |
4035 * Activation is only possible before the first Read(). | 4076 * Activation is only possible before the first Read(). |
4036 * if @schema is NULL, then RelaxNG validation is desactivated. | 4077 * if @schema is NULL, then RelaxNG validation is desactivated. |
4037 @ The @schema should not be freed until the reader is deallocated | 4078 @ The @schema should not be freed until the reader is deallocated |
4038 * or its use has been deactivated. | 4079 * or its use has been deactivated. |
(...skipping 29 matching lines...) Expand all Loading... |
4068 reader->rngValidCtxt = xmlRelaxNGNewValidCtxt(schema); | 4109 reader->rngValidCtxt = xmlRelaxNGNewValidCtxt(schema); |
4069 if (reader->rngValidCtxt == NULL) | 4110 if (reader->rngValidCtxt == NULL) |
4070 return(-1); | 4111 return(-1); |
4071 if (reader->errorFunc != NULL) { | 4112 if (reader->errorFunc != NULL) { |
4072 xmlRelaxNGSetValidErrors(reader->rngValidCtxt, | 4113 xmlRelaxNGSetValidErrors(reader->rngValidCtxt, |
4073 xmlTextReaderValidityErrorRelay, | 4114 xmlTextReaderValidityErrorRelay, |
4074 xmlTextReaderValidityWarningRelay, | 4115 xmlTextReaderValidityWarningRelay, |
4075 reader); | 4116 reader); |
4076 } | 4117 } |
4077 if (reader->sErrorFunc != NULL) { | 4118 if (reader->sErrorFunc != NULL) { |
4078 » » xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt, | 4119 » » xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt, |
4079 xmlTextReaderValidityStructuredRelay, | 4120 xmlTextReaderValidityStructuredRelay, |
4080 reader); | 4121 reader); |
4081 } | 4122 } |
4082 reader->rngValidErrors = 0; | 4123 reader->rngValidErrors = 0; |
4083 reader->rngFullNode = NULL; | 4124 reader->rngFullNode = NULL; |
4084 reader->validate = XML_TEXTREADER_VALIDATE_RNG; | 4125 reader->validate = XML_TEXTREADER_VALIDATE_RNG; |
4085 return(0); | 4126 return(0); |
4086 } | 4127 } |
4087 | 4128 |
4088 /** | 4129 /** |
(...skipping 15 matching lines...) Expand all Loading... |
4104 if (reader == NULL) | 4145 if (reader == NULL) |
4105 return(-1); | 4146 return(-1); |
4106 if (schema == NULL) { | 4147 if (schema == NULL) { |
4107 if (reader->xsdPlug != NULL) { | 4148 if (reader->xsdPlug != NULL) { |
4108 xmlSchemaSAXUnplug(reader->xsdPlug); | 4149 xmlSchemaSAXUnplug(reader->xsdPlug); |
4109 reader->xsdPlug = NULL; | 4150 reader->xsdPlug = NULL; |
4110 } | 4151 } |
4111 if (reader->xsdValidCtxt != NULL) { | 4152 if (reader->xsdValidCtxt != NULL) { |
4112 if (! reader->xsdPreserveCtxt) | 4153 if (! reader->xsdPreserveCtxt) |
4113 xmlSchemaFreeValidCtxt(reader->xsdValidCtxt); | 4154 xmlSchemaFreeValidCtxt(reader->xsdValidCtxt); |
4114 » reader->xsdValidCtxt = NULL;» | 4155 » reader->xsdValidCtxt = NULL; |
4115 } | 4156 } |
4116 reader->xsdPreserveCtxt = 0; | 4157 reader->xsdPreserveCtxt = 0; |
4117 if (reader->xsdSchemas != NULL) { | 4158 if (reader->xsdSchemas != NULL) { |
4118 xmlSchemaFree(reader->xsdSchemas); | 4159 xmlSchemaFree(reader->xsdSchemas); |
4119 reader->xsdSchemas = NULL; | 4160 reader->xsdSchemas = NULL; |
4120 » }» | 4161 » } |
4121 return(0); | 4162 return(0); |
4122 } | 4163 } |
4123 if (reader->mode != XML_TEXTREADER_MODE_INITIAL) | 4164 if (reader->mode != XML_TEXTREADER_MODE_INITIAL) |
4124 return(-1); | 4165 return(-1); |
4125 if (reader->xsdPlug != NULL) { | 4166 if (reader->xsdPlug != NULL) { |
4126 xmlSchemaSAXUnplug(reader->xsdPlug); | 4167 xmlSchemaSAXUnplug(reader->xsdPlug); |
4127 reader->xsdPlug = NULL; | 4168 reader->xsdPlug = NULL; |
4128 } | 4169 } |
4129 if (reader->xsdValidCtxt != NULL) { | 4170 if (reader->xsdValidCtxt != NULL) { |
4130 if (! reader->xsdPreserveCtxt) | 4171 if (! reader->xsdPreserveCtxt) |
4131 » xmlSchemaFreeValidCtxt(reader->xsdValidCtxt);» | 4172 » xmlSchemaFreeValidCtxt(reader->xsdValidCtxt); |
4132 reader->xsdValidCtxt = NULL; | 4173 reader->xsdValidCtxt = NULL; |
4133 } | 4174 } |
4134 reader->xsdPreserveCtxt = 0; | 4175 reader->xsdPreserveCtxt = 0; |
4135 if (reader->xsdSchemas != NULL) { | 4176 if (reader->xsdSchemas != NULL) { |
4136 xmlSchemaFree(reader->xsdSchemas); | 4177 xmlSchemaFree(reader->xsdSchemas); |
4137 reader->xsdSchemas = NULL; | 4178 reader->xsdSchemas = NULL; |
4138 } | 4179 } |
4139 reader->xsdValidCtxt = xmlSchemaNewValidCtxt(schema); | 4180 reader->xsdValidCtxt = xmlSchemaNewValidCtxt(schema); |
4140 if (reader->xsdValidCtxt == NULL) { | 4181 if (reader->xsdValidCtxt == NULL) { |
4141 xmlSchemaFree(reader->xsdSchemas); | 4182 xmlSchemaFree(reader->xsdSchemas); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4179 * | 4220 * |
4180 * Returns 0 in case the RelaxNG validation could be (de)activated and | 4221 * Returns 0 in case the RelaxNG validation could be (de)activated and |
4181 * -1 in case of error. | 4222 * -1 in case of error. |
4182 */ | 4223 */ |
4183 int | 4224 int |
4184 xmlTextReaderRelaxNGValidate(xmlTextReaderPtr reader, const char *rng) { | 4225 xmlTextReaderRelaxNGValidate(xmlTextReaderPtr reader, const char *rng) { |
4185 xmlRelaxNGParserCtxtPtr ctxt; | 4226 xmlRelaxNGParserCtxtPtr ctxt; |
4186 | 4227 |
4187 if (reader == NULL) | 4228 if (reader == NULL) |
4188 return(-1); | 4229 return(-1); |
4189 | 4230 |
4190 if (rng == NULL) { | 4231 if (rng == NULL) { |
4191 if (reader->rngValidCtxt != NULL) { | 4232 if (reader->rngValidCtxt != NULL) { |
4192 xmlRelaxNGFreeValidCtxt(reader->rngValidCtxt); | 4233 xmlRelaxNGFreeValidCtxt(reader->rngValidCtxt); |
4193 reader->rngValidCtxt = NULL; | 4234 reader->rngValidCtxt = NULL; |
4194 } | 4235 } |
4195 if (reader->rngSchemas != NULL) { | 4236 if (reader->rngSchemas != NULL) { |
4196 xmlRelaxNGFree(reader->rngSchemas); | 4237 xmlRelaxNGFree(reader->rngSchemas); |
4197 reader->rngSchemas = NULL; | 4238 reader->rngSchemas = NULL; |
4198 } | 4239 } |
4199 return(0); | 4240 return(0); |
4200 } | 4241 } |
4201 if (reader->mode != XML_TEXTREADER_MODE_INITIAL) | 4242 if (reader->mode != XML_TEXTREADER_MODE_INITIAL) |
4202 return(-1); | 4243 return(-1); |
4203 if (reader->rngSchemas != NULL) { | 4244 if (reader->rngSchemas != NULL) { |
4204 xmlRelaxNGFree(reader->rngSchemas); | 4245 xmlRelaxNGFree(reader->rngSchemas); |
4205 reader->rngSchemas = NULL; | 4246 reader->rngSchemas = NULL; |
4206 } | 4247 } |
4207 if (reader->rngValidCtxt != NULL) { | 4248 if (reader->rngValidCtxt != NULL) { |
4208 xmlRelaxNGFreeValidCtxt(reader->rngValidCtxt); | 4249 xmlRelaxNGFreeValidCtxt(reader->rngValidCtxt); |
4209 reader->rngValidCtxt = NULL; | 4250 reader->rngValidCtxt = NULL; |
4210 } | 4251 } |
4211 ctxt = xmlRelaxNGNewParserCtxt(rng); | 4252 ctxt = xmlRelaxNGNewParserCtxt(rng); |
4212 if (reader->errorFunc != NULL) { | 4253 if (reader->errorFunc != NULL) { |
4213 xmlRelaxNGSetParserErrors(ctxt, | 4254 xmlRelaxNGSetParserErrors(ctxt, |
4214 xmlTextReaderValidityErrorRelay, | 4255 xmlTextReaderValidityErrorRelay, |
4215 xmlTextReaderValidityWarningRelay, | 4256 xmlTextReaderValidityWarningRelay, |
4216 reader); | 4257 reader); |
4217 } | 4258 } |
4218 if (reader->sErrorFunc != NULL) { | 4259 if (reader->sErrorFunc != NULL) { |
4219 » xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt, | 4260 » xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt, |
4220 xmlTextReaderValidityStructuredRelay, | 4261 xmlTextReaderValidityStructuredRelay, |
4221 reader); | 4262 reader); |
4222 } | 4263 } |
4223 reader->rngSchemas = xmlRelaxNGParse(ctxt); | 4264 reader->rngSchemas = xmlRelaxNGParse(ctxt); |
4224 xmlRelaxNGFreeParserCtxt(ctxt); | 4265 xmlRelaxNGFreeParserCtxt(ctxt); |
4225 if (reader->rngSchemas == NULL) | 4266 if (reader->rngSchemas == NULL) |
4226 return(-1); | 4267 return(-1); |
4227 reader->rngValidCtxt = xmlRelaxNGNewValidCtxt(reader->rngSchemas); | 4268 reader->rngValidCtxt = xmlRelaxNGNewValidCtxt(reader->rngSchemas); |
4228 if (reader->rngValidCtxt == NULL) { | 4269 if (reader->rngValidCtxt == NULL) { |
4229 xmlRelaxNGFree(reader->rngSchemas); | 4270 xmlRelaxNGFree(reader->rngSchemas); |
4230 reader->rngSchemas = NULL; | 4271 reader->rngSchemas = NULL; |
4231 return(-1); | 4272 return(-1); |
4232 } | 4273 } |
4233 if (reader->errorFunc != NULL) { | 4274 if (reader->errorFunc != NULL) { |
4234 xmlRelaxNGSetValidErrors(reader->rngValidCtxt, | 4275 xmlRelaxNGSetValidErrors(reader->rngValidCtxt, |
4235 xmlTextReaderValidityErrorRelay, | 4276 xmlTextReaderValidityErrorRelay, |
4236 xmlTextReaderValidityWarningRelay, | 4277 xmlTextReaderValidityWarningRelay, |
4237 reader); | 4278 reader); |
4238 } | 4279 } |
4239 if (reader->sErrorFunc != NULL) { | 4280 if (reader->sErrorFunc != NULL) { |
4240 » » xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt, | 4281 » » xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt, |
4241 xmlTextReaderValidityStructuredRelay, | 4282 xmlTextReaderValidityStructuredRelay, |
4242 reader); | 4283 reader); |
4243 } | 4284 } |
4244 reader->rngValidErrors = 0; | 4285 reader->rngValidErrors = 0; |
4245 reader->rngFullNode = NULL; | 4286 reader->rngFullNode = NULL; |
4246 reader->validate = XML_TEXTREADER_VALIDATE_RNG; | 4287 reader->validate = XML_TEXTREADER_VALIDATE_RNG; |
4247 return(0); | 4288 return(0); |
4248 } | 4289 } |
4249 | 4290 |
4250 /** | 4291 /** |
4251 * xmlTextReaderSchemaValidateInternal: | 4292 * xmlTextReaderSchemaValidateInternal: |
4252 * @reader: the xmlTextReaderPtr used | 4293 * @reader: the xmlTextReaderPtr used |
4253 * @xsd: the path to a W3C XSD schema or NULL | 4294 * @xsd: the path to a W3C XSD schema or NULL |
4254 * @ctxt: the XML Schema validation context or NULL | 4295 * @ctxt: the XML Schema validation context or NULL |
4255 * @options: options (not used yet) | 4296 * @options: options (not used yet) |
4256 * | 4297 * |
4257 * Validate the document as it is processed using XML Schema. | 4298 * Validate the document as it is processed using XML Schema. |
4258 * Activation is only possible before the first Read(). | 4299 * Activation is only possible before the first Read(). |
4259 * If both @xsd and @ctxt are NULL then XML Schema validation is deactivated. | 4300 * If both @xsd and @ctxt are NULL then XML Schema validation is deactivated. |
4260 * | 4301 * |
4261 * Returns 0 in case the schemas validation could be (de)activated and | 4302 * Returns 0 in case the schemas validation could be (de)activated and |
4262 * -1 in case of error. | 4303 * -1 in case of error. |
4263 */ | 4304 */ |
4264 static int | 4305 static int |
4265 xmlTextReaderSchemaValidateInternal(xmlTextReaderPtr reader, | 4306 xmlTextReaderSchemaValidateInternal(xmlTextReaderPtr reader, |
4266 const char *xsd, | 4307 const char *xsd, |
4267 xmlSchemaValidCtxtPtr ctxt, | 4308 xmlSchemaValidCtxtPtr ctxt, |
4268 int options ATTRIBUTE_UNUSED) | 4309 int options ATTRIBUTE_UNUSED) |
4269 { | 4310 { |
4270 if (reader == NULL) | 4311 if (reader == NULL) |
4271 return(-1); | 4312 return(-1); |
4272 | 4313 |
4273 if ((xsd != NULL) && (ctxt != NULL)) | 4314 if ((xsd != NULL) && (ctxt != NULL)) |
4274 return(-1); | 4315 return(-1); |
4275 | 4316 |
4276 if (((xsd != NULL) || (ctxt != NULL)) && | 4317 if (((xsd != NULL) || (ctxt != NULL)) && |
4277 ((reader->mode != XML_TEXTREADER_MODE_INITIAL) || | 4318 ((reader->mode != XML_TEXTREADER_MODE_INITIAL) || |
4278 (reader->ctxt == NULL))) | 4319 (reader->ctxt == NULL))) |
4279 return(-1); | 4320 return(-1); |
4280 | 4321 |
4281 /* Cleanup previous validation stuff. */ | 4322 /* Cleanup previous validation stuff. */ |
4282 if (reader->xsdPlug != NULL) { | 4323 if (reader->xsdPlug != NULL) { |
4283 xmlSchemaSAXUnplug(reader->xsdPlug); | 4324 xmlSchemaSAXUnplug(reader->xsdPlug); |
4284 reader->xsdPlug = NULL; | 4325 reader->xsdPlug = NULL; |
4285 } | 4326 } |
4286 if (reader->xsdValidCtxt != NULL) { | 4327 if (reader->xsdValidCtxt != NULL) { |
4287 if (! reader->xsdPreserveCtxt) | 4328 if (! reader->xsdPreserveCtxt) |
4288 » xmlSchemaFreeValidCtxt(reader->xsdValidCtxt);» | 4329 » xmlSchemaFreeValidCtxt(reader->xsdValidCtxt); |
4289 reader->xsdValidCtxt = NULL; | 4330 reader->xsdValidCtxt = NULL; |
4290 } | 4331 } |
4291 reader->xsdPreserveCtxt = 0; | 4332 reader->xsdPreserveCtxt = 0; |
4292 if (reader->xsdSchemas != NULL) { | 4333 if (reader->xsdSchemas != NULL) { |
4293 xmlSchemaFree(reader->xsdSchemas); | 4334 xmlSchemaFree(reader->xsdSchemas); |
4294 reader->xsdSchemas = NULL; | 4335 reader->xsdSchemas = NULL; |
4295 } | 4336 } |
4296 | 4337 |
4297 if ((xsd == NULL) && (ctxt == NULL)) { | 4338 if ((xsd == NULL) && (ctxt == NULL)) { |
4298 /* We just want to deactivate the validation, so get out. */ | 4339 /* We just want to deactivate the validation, so get out. */ |
4299 return(0); | 4340 return(0); |
4300 } | 4341 } |
4301 | 4342 |
4302 if (xsd != NULL) { | 4343 if (xsd != NULL) { |
4303 xmlSchemaParserCtxtPtr pctxt; | 4344 xmlSchemaParserCtxtPtr pctxt; |
4304 /* Parse the schema and create validation environment. */ | 4345 /* Parse the schema and create validation environment. */ |
4305 pctxt = xmlSchemaNewParserCtxt(xsd); | 4346 pctxt = xmlSchemaNewParserCtxt(xsd); |
4306 if (reader->errorFunc != NULL) { | 4347 if (reader->errorFunc != NULL) { |
4307 xmlSchemaSetParserErrors(pctxt, | 4348 xmlSchemaSetParserErrors(pctxt, |
4308 xmlTextReaderValidityErrorRelay, | 4349 xmlTextReaderValidityErrorRelay, |
4309 xmlTextReaderValidityWarningRelay, | 4350 xmlTextReaderValidityWarningRelay, |
4310 reader); | 4351 reader); |
4311 } | 4352 } |
(...skipping 11 matching lines...) Expand all Loading... |
4323 &(reader->ctxt->sax), | 4364 &(reader->ctxt->sax), |
4324 &(reader->ctxt->userData)); | 4365 &(reader->ctxt->userData)); |
4325 if (reader->xsdPlug == NULL) { | 4366 if (reader->xsdPlug == NULL) { |
4326 xmlSchemaFree(reader->xsdSchemas); | 4367 xmlSchemaFree(reader->xsdSchemas); |
4327 reader->xsdSchemas = NULL; | 4368 reader->xsdSchemas = NULL; |
4328 xmlSchemaFreeValidCtxt(reader->xsdValidCtxt); | 4369 xmlSchemaFreeValidCtxt(reader->xsdValidCtxt); |
4329 reader->xsdValidCtxt = NULL; | 4370 reader->xsdValidCtxt = NULL; |
4330 return(-1); | 4371 return(-1); |
4331 } | 4372 } |
4332 } else { | 4373 } else { |
4333 » /* Use the given validation context. */» | 4374 » /* Use the given validation context. */ |
4334 reader->xsdValidCtxt = ctxt; | 4375 reader->xsdValidCtxt = ctxt; |
4335 reader->xsdPreserveCtxt = 1; | 4376 reader->xsdPreserveCtxt = 1; |
4336 reader->xsdPlug = xmlSchemaSAXPlug(reader->xsdValidCtxt, | 4377 reader->xsdPlug = xmlSchemaSAXPlug(reader->xsdValidCtxt, |
4337 &(reader->ctxt->sax), | 4378 &(reader->ctxt->sax), |
4338 &(reader->ctxt->userData)); | 4379 &(reader->ctxt->userData)); |
4339 » if (reader->xsdPlug == NULL) {» | 4380 » if (reader->xsdPlug == NULL) { |
4340 reader->xsdValidCtxt = NULL; | 4381 reader->xsdValidCtxt = NULL; |
4341 reader->xsdPreserveCtxt = 0; | 4382 reader->xsdPreserveCtxt = 0; |
4342 return(-1); | 4383 return(-1); |
4343 } | 4384 } |
4344 } | 4385 } |
4345 /* | 4386 /* |
4346 * Redirect the validation context's error channels to use | 4387 * Redirect the validation context's error channels to use |
4347 * the reader channels. | 4388 * the reader channels. |
4348 * TODO: In case the user provides the validation context we | 4389 * TODO: In case the user provides the validation context we |
4349 * could make this redirection optional. | 4390 * could make this redirection optional. |
4350 */ | 4391 */ |
4351 if (reader->errorFunc != NULL) { | 4392 if (reader->errorFunc != NULL) { |
4352 xmlSchemaSetValidErrors(reader->xsdValidCtxt, | 4393 xmlSchemaSetValidErrors(reader->xsdValidCtxt, |
4353 xmlTextReaderValidityErrorRelay, | 4394 xmlTextReaderValidityErrorRelay, |
4354 xmlTextReaderValidityWarningRelay, | 4395 xmlTextReaderValidityWarningRelay, |
4355 reader); | 4396 reader); |
4356 } | 4397 } |
4357 if (reader->sErrorFunc != NULL) { | 4398 if (reader->sErrorFunc != NULL) { |
4358 » » xmlSchemaSetValidStructuredErrors(reader->xsdValidCtxt, | 4399 » » xmlSchemaSetValidStructuredErrors(reader->xsdValidCtxt, |
4359 xmlTextReaderValidityStructuredRelay, | 4400 xmlTextReaderValidityStructuredRelay, |
4360 reader); | 4401 reader); |
4361 } | 4402 } |
4362 reader->xsdValidErrors = 0; | 4403 reader->xsdValidErrors = 0; |
4363 reader->validate = XML_TEXTREADER_VALIDATE_XSD; | 4404 reader->validate = XML_TEXTREADER_VALIDATE_XSD; |
4364 return(0); | 4405 return(0); |
4365 } | 4406 } |
4366 | 4407 |
4367 /** | 4408 /** |
4368 * xmlTextReaderSchemaValidateCtxt: | 4409 * xmlTextReaderSchemaValidateCtxt: |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4419 xmlTextReaderIsNamespaceDecl(xmlTextReaderPtr reader) { | 4460 xmlTextReaderIsNamespaceDecl(xmlTextReaderPtr reader) { |
4420 xmlNodePtr node; | 4461 xmlNodePtr node; |
4421 if (reader == NULL) | 4462 if (reader == NULL) |
4422 return(-1); | 4463 return(-1); |
4423 if (reader->node == NULL) | 4464 if (reader->node == NULL) |
4424 return(-1); | 4465 return(-1); |
4425 if (reader->curnode != NULL) | 4466 if (reader->curnode != NULL) |
4426 node = reader->curnode; | 4467 node = reader->curnode; |
4427 else | 4468 else |
4428 node = reader->node; | 4469 node = reader->node; |
4429 | 4470 |
4430 if (XML_NAMESPACE_DECL == node->type) | 4471 if (XML_NAMESPACE_DECL == node->type) |
4431 return(1); | 4472 return(1); |
4432 else | 4473 else |
4433 return(0); | 4474 return(0); |
4434 } | 4475 } |
4435 | 4476 |
4436 /** | 4477 /** |
4437 * xmlTextReaderConstXmlVersion: | 4478 * xmlTextReaderConstXmlVersion: |
4438 * @reader: the xmlTextReaderPtr used | 4479 * @reader: the xmlTextReaderPtr used |
4439 * | 4480 * |
4440 * Determine the XML version of the document being read. | 4481 * Determine the XML version of the document being read. |
4441 * | 4482 * |
4442 * Returns a string containing the XML version of the document or NULL | 4483 * Returns a string containing the XML version of the document or NULL |
4443 * in case of error. The string is deallocated with the reader. | 4484 * in case of error. The string is deallocated with the reader. |
4444 */ | 4485 */ |
4445 const xmlChar * | 4486 const xmlChar * |
4446 xmlTextReaderConstXmlVersion(xmlTextReaderPtr reader) { | 4487 xmlTextReaderConstXmlVersion(xmlTextReaderPtr reader) { |
4447 xmlDocPtr doc = NULL; | 4488 xmlDocPtr doc = NULL; |
4448 if (reader == NULL) | 4489 if (reader == NULL) |
4449 return(NULL); | 4490 return(NULL); |
4450 if (reader->doc != NULL) | 4491 if (reader->doc != NULL) |
4451 doc = reader->doc; | 4492 doc = reader->doc; |
4452 else if (reader->ctxt != NULL) | 4493 else if (reader->ctxt != NULL) |
4453 » doc = reader->ctxt->myDoc; | 4494 » doc = reader->ctxt->myDoc; |
4454 if (doc == NULL) | 4495 if (doc == NULL) |
4455 return(NULL); | 4496 return(NULL); |
4456 | 4497 |
4457 if (doc->version == NULL) | 4498 if (doc->version == NULL) |
4458 return(NULL); | 4499 return(NULL); |
4459 else | 4500 else |
4460 return(CONSTSTR(doc->version)); | 4501 return(CONSTSTR(doc->version)); |
4461 } | 4502 } |
4462 | 4503 |
4463 /** | 4504 /** |
4464 * xmlTextReaderStandalone: | 4505 * xmlTextReaderStandalone: |
4465 * @reader: the xmlTextReaderPtr used | 4506 * @reader: the xmlTextReaderPtr used |
4466 * | 4507 * |
(...skipping 20 matching lines...) Expand all Loading... |
4487 | 4528 |
4488 /************************************************************************ | 4529 /************************************************************************ |
4489 * * | 4530 * * |
4490 * Error Handling Extensions * | 4531 * Error Handling Extensions * |
4491 * * | 4532 * * |
4492 ************************************************************************/ | 4533 ************************************************************************/ |
4493 | 4534 |
4494 /* helper to build a xmlMalloc'ed string from a format and va_list */ | 4535 /* helper to build a xmlMalloc'ed string from a format and va_list */ |
4495 static char * | 4536 static char * |
4496 xmlTextReaderBuildMessage(const char *msg, va_list ap) { | 4537 xmlTextReaderBuildMessage(const char *msg, va_list ap) { |
4497 int size; | 4538 int size = 0; |
4498 int chars; | 4539 int chars; |
4499 char *larger; | 4540 char *larger; |
4500 char *str; | 4541 char *str = NULL; |
4501 | 4542 va_list aq; |
4502 str = (char *) xmlMallocAtomic(150); | |
4503 if (str == NULL) { | |
4504 » xmlGenericError(xmlGenericErrorContext, "xmlMalloc failed !\n"); | |
4505 return NULL; | |
4506 } | |
4507 | |
4508 size = 150; | |
4509 | 4543 |
4510 while (1) { | 4544 while (1) { |
4511 chars = vsnprintf(str, size, msg, ap); | 4545 VA_COPY(aq, ap); |
4512 if ((chars > -1) && (chars < size)) | 4546 chars = vsnprintf(str, size, msg, aq); |
| 4547 va_end(aq); |
| 4548 if (chars < 0) { |
| 4549 » xmlGenericError(xmlGenericErrorContext, "vsnprintf failed !\n"); |
| 4550 » if (str) |
| 4551 » » xmlFree(str); |
| 4552 » return NULL; |
| 4553 » } |
| 4554 » if ((chars < size) || (size == MAX_ERR_MSG_SIZE)) |
4513 break; | 4555 break; |
4514 if (chars > -1) | 4556 if (chars < MAX_ERR_MSG_SIZE) |
4515 size += chars + 1; | 4557 » size = chars + 1; |
4516 else | 4558 » else |
4517 size += 100; | 4559 » » size = MAX_ERR_MSG_SIZE; |
4518 if ((larger = (char *) xmlRealloc(str, size)) == NULL) { | 4560 if ((larger = (char *) xmlRealloc(str, size)) == NULL) { |
4519 xmlGenericError(xmlGenericErrorContext, "xmlRealloc failed !\n"); | 4561 xmlGenericError(xmlGenericErrorContext, "xmlRealloc failed !\n"); |
4520 xmlFree(str); | 4562 » if (str) |
| 4563 xmlFree(str); |
4521 return NULL; | 4564 return NULL; |
4522 } | 4565 } |
4523 str = larger; | 4566 str = larger; |
4524 } | 4567 } |
4525 | 4568 |
4526 return str; | 4569 return str; |
4527 } | 4570 } |
4528 | 4571 |
4529 /** | 4572 /** |
4530 * xmlTextReaderLocatorLineNumber: | 4573 * xmlTextReaderLocatorLineNumber: |
(...skipping 15 matching lines...) Expand all Loading... |
4546 ret = xmlGetLineNo(ctx->node); | 4589 ret = xmlGetLineNo(ctx->node); |
4547 } | 4590 } |
4548 else { | 4591 else { |
4549 /* inspired from error.c */ | 4592 /* inspired from error.c */ |
4550 xmlParserInputPtr input; | 4593 xmlParserInputPtr input; |
4551 input = ctx->input; | 4594 input = ctx->input; |
4552 if ((input->filename == NULL) && (ctx->inputNr > 1)) | 4595 if ((input->filename == NULL) && (ctx->inputNr > 1)) |
4553 input = ctx->inputTab[ctx->inputNr - 2]; | 4596 input = ctx->inputTab[ctx->inputNr - 2]; |
4554 if (input != NULL) { | 4597 if (input != NULL) { |
4555 ret = input->line; | 4598 ret = input->line; |
4556 » } | 4599 » } |
4557 else { | 4600 else { |
4558 ret = -1; | 4601 ret = -1; |
4559 } | 4602 } |
4560 } | 4603 } |
4561 | 4604 |
4562 return ret; | 4605 return ret; |
4563 } | 4606 } |
4564 | 4607 |
4565 /** | 4608 /** |
4566 * xmlTextReaderLocatorBaseURI: | 4609 * xmlTextReaderLocatorBaseURI: |
4567 * @locator: the xmlTextReaderLocatorPtr used | 4610 * @locator: the xmlTextReaderLocatorPtr used |
4568 * | 4611 * |
4569 * Obtain the base URI for the given locator. | 4612 * Obtain the base URI for the given locator. |
4570 * | 4613 * |
4571 * Returns the base URI or NULL in case of error. | 4614 * Returns the base URI or NULL in case of error, |
| 4615 * if non NULL it need to be freed by the caller. |
4572 */ | 4616 */ |
4573 xmlChar * | 4617 xmlChar * |
4574 xmlTextReaderLocatorBaseURI(xmlTextReaderLocatorPtr locator) { | 4618 xmlTextReaderLocatorBaseURI(xmlTextReaderLocatorPtr locator) { |
4575 /* we know that locator is a xmlParserCtxtPtr */ | 4619 /* we know that locator is a xmlParserCtxtPtr */ |
4576 xmlParserCtxtPtr ctx = (xmlParserCtxtPtr)locator; | 4620 xmlParserCtxtPtr ctx = (xmlParserCtxtPtr)locator; |
4577 xmlChar *ret = NULL; | 4621 xmlChar *ret = NULL; |
4578 | 4622 |
4579 if (locator == NULL) | 4623 if (locator == NULL) |
4580 return(NULL); | 4624 return(NULL); |
4581 if (ctx->node != NULL) { | 4625 if (ctx->node != NULL) { |
4582 ret = xmlNodeGetBase(NULL,ctx->node); | 4626 ret = xmlNodeGetBase(NULL,ctx->node); |
4583 } | 4627 } |
4584 else { | 4628 else { |
4585 /* inspired from error.c */ | 4629 /* inspired from error.c */ |
4586 xmlParserInputPtr input; | 4630 xmlParserInputPtr input; |
4587 input = ctx->input; | 4631 input = ctx->input; |
4588 if ((input->filename == NULL) && (ctx->inputNr > 1)) | 4632 if ((input->filename == NULL) && (ctx->inputNr > 1)) |
4589 input = ctx->inputTab[ctx->inputNr - 2]; | 4633 input = ctx->inputTab[ctx->inputNr - 2]; |
4590 if (input != NULL) { | 4634 if (input != NULL) { |
4591 ret = xmlStrdup(BAD_CAST input->filename); | 4635 ret = xmlStrdup(BAD_CAST input->filename); |
4592 » } | 4636 » } |
4593 else { | 4637 else { |
4594 ret = NULL; | 4638 ret = NULL; |
4595 } | 4639 } |
4596 } | 4640 } |
4597 | 4641 |
4598 return ret; | 4642 return ret; |
4599 } | 4643 } |
4600 | 4644 |
4601 static void | 4645 static void |
4602 xmlTextReaderGenericError(void *ctxt, xmlParserSeverities severity, char *str) { | 4646 xmlTextReaderGenericError(void *ctxt, xmlParserSeverities severity, |
4603 xmlParserCtxtPtr ctx = (xmlParserCtxtPtr)ctxt; | 4647 char *str) |
4604 xmlTextReaderPtr reader = (xmlTextReaderPtr)ctx->_private; | 4648 { |
| 4649 xmlParserCtxtPtr ctx = (xmlParserCtxtPtr) ctxt; |
| 4650 |
| 4651 xmlTextReaderPtr reader = (xmlTextReaderPtr) ctx->_private; |
4605 | 4652 |
4606 if (str != NULL) { | 4653 if (str != NULL) { |
4607 if (reader->errorFunc) | 4654 if (reader->errorFunc) |
4608 » reader->errorFunc(reader->errorFuncArg, | 4655 reader->errorFunc(reader->errorFuncArg, str, severity, |
4609 » » » str, | 4656 (xmlTextReaderLocatorPtr) ctx); |
4610 » » » severity, | 4657 xmlFree(str); |
4611 » » » (xmlTextReaderLocatorPtr)ctx); | |
4612 » xmlFree(str); | |
4613 } | 4658 } |
4614 } | 4659 } |
4615 | 4660 |
4616 static void | 4661 static void |
4617 xmlTextReaderStructuredError(void *ctxt, xmlErrorPtr error) { | 4662 xmlTextReaderStructuredError(void *ctxt, xmlErrorPtr error) |
4618 xmlParserCtxtPtr ctx = (xmlParserCtxtPtr) ctxt; | 4663 { |
4619 xmlTextReaderPtr reader = (xmlTextReaderPtr) ctx->_private; | 4664 xmlParserCtxtPtr ctx = (xmlParserCtxtPtr) ctxt; |
4620 | 4665 |
4621 if (error && reader->sErrorFunc) { | 4666 xmlTextReaderPtr reader = (xmlTextReaderPtr) ctx->_private; |
4622 » reader->sErrorFunc(reader->errorFuncArg, | 4667 |
4623 » » » (xmlErrorPtr) error); | 4668 if (error && reader->sErrorFunc) { |
4624 } | 4669 reader->sErrorFunc(reader->errorFuncArg, (xmlErrorPtr) error); |
| 4670 } |
4625 } | 4671 } |
4626 | 4672 |
4627 static void XMLCDECL | 4673 static void XMLCDECL |
4628 xmlTextReaderError(void *ctxt, const char *msg, ...) { | 4674 xmlTextReaderError(void *ctxt, const char *msg, ...) |
| 4675 { |
4629 va_list ap; | 4676 va_list ap; |
4630 | 4677 |
4631 va_start(ap,msg); | 4678 va_start(ap, msg); |
4632 xmlTextReaderGenericError(ctxt, | 4679 xmlTextReaderGenericError(ctxt, |
4633 XML_PARSER_SEVERITY_ERROR, | 4680 XML_PARSER_SEVERITY_ERROR, |
4634 » xmlTextReaderBuildMessage(msg,ap)); | 4681 xmlTextReaderBuildMessage(msg, ap)); |
4635 va_end(ap); | 4682 va_end(ap); |
4636 | 4683 |
4637 } | 4684 } |
4638 | 4685 |
4639 static void XMLCDECL | 4686 static void XMLCDECL |
4640 xmlTextReaderWarning(void *ctxt, const char *msg, ...) { | 4687 xmlTextReaderWarning(void *ctxt, const char *msg, ...) |
| 4688 { |
4641 va_list ap; | 4689 va_list ap; |
4642 | 4690 |
4643 va_start(ap,msg); | 4691 va_start(ap, msg); |
4644 xmlTextReaderGenericError(ctxt, | 4692 xmlTextReaderGenericError(ctxt, |
4645 XML_PARSER_SEVERITY_WARNING, | 4693 XML_PARSER_SEVERITY_WARNING, |
4646 » xmlTextReaderBuildMessage(msg,ap)); | 4694 xmlTextReaderBuildMessage(msg, ap)); |
4647 va_end(ap); | 4695 va_end(ap); |
4648 } | 4696 } |
4649 | 4697 |
4650 static void XMLCDECL | 4698 static void XMLCDECL |
4651 xmlTextReaderValidityError(void *ctxt, const char *msg, ...) { | 4699 xmlTextReaderValidityError(void *ctxt, const char *msg, ...) |
| 4700 { |
4652 va_list ap; | 4701 va_list ap; |
| 4702 |
4653 int len = xmlStrlen((const xmlChar *) msg); | 4703 int len = xmlStrlen((const xmlChar *) msg); |
4654 | 4704 |
4655 if ((len > 1) && (msg[len - 2] != ':')) { | 4705 if ((len > 1) && (msg[len - 2] != ':')) { |
4656 » /* | 4706 /* |
4657 » * some callbacks only report locator information: | 4707 * some callbacks only report locator information: |
4658 » * skip them (mimicking behaviour in error.c) | 4708 * skip them (mimicking behaviour in error.c) |
4659 » */ | 4709 */ |
4660 » va_start(ap,msg); | 4710 va_start(ap, msg); |
4661 » xmlTextReaderGenericError(ctxt, | 4711 xmlTextReaderGenericError(ctxt, |
4662 » » » » XML_PARSER_SEVERITY_VALIDITY_ERROR, | 4712 XML_PARSER_SEVERITY_VALIDITY_ERROR, |
4663 » » » » xmlTextReaderBuildMessage(msg,ap)); | 4713 xmlTextReaderBuildMessage(msg, ap)); |
4664 » va_end(ap); | 4714 va_end(ap); |
4665 } | 4715 } |
4666 } | 4716 } |
4667 | 4717 |
4668 static void XMLCDECL | 4718 static void XMLCDECL |
4669 xmlTextReaderValidityWarning(void *ctxt, const char *msg, ...) { | 4719 xmlTextReaderValidityWarning(void *ctxt, const char *msg, ...) |
| 4720 { |
4670 va_list ap; | 4721 va_list ap; |
| 4722 |
4671 int len = xmlStrlen((const xmlChar *) msg); | 4723 int len = xmlStrlen((const xmlChar *) msg); |
4672 | 4724 |
4673 if ((len != 0) && (msg[len - 1] != ':')) { | 4725 if ((len != 0) && (msg[len - 1] != ':')) { |
4674 » /* | 4726 /* |
4675 » * some callbacks only report locator information: | 4727 * some callbacks only report locator information: |
4676 » * skip them (mimicking behaviour in error.c) | 4728 * skip them (mimicking behaviour in error.c) |
4677 » */ | 4729 */ |
4678 » va_start(ap,msg); | 4730 va_start(ap, msg); |
4679 » xmlTextReaderGenericError(ctxt, | 4731 xmlTextReaderGenericError(ctxt, |
4680 » » » » XML_PARSER_SEVERITY_VALIDITY_WARNING, | 4732 XML_PARSER_SEVERITY_VALIDITY_WARNING, |
4681 » » » » xmlTextReaderBuildMessage(msg,ap)); | 4733 xmlTextReaderBuildMessage(msg, ap)); |
4682 » va_end(ap); | 4734 va_end(ap); |
4683 } | 4735 } |
4684 } | 4736 } |
4685 | 4737 |
4686 /** | 4738 /** |
4687 * xmlTextReaderSetErrorHandler: | 4739 * xmlTextReaderSetErrorHandler: |
4688 * @reader: the xmlTextReaderPtr used | 4740 * @reader: the xmlTextReaderPtr used |
4689 * @f: the callback function to call on error and warnings | 4741 * @f: the callback function to call on error and warnings |
4690 * @arg: a user argument to pass to the callback function | 4742 * @arg: a user argument to pass to the callback function |
4691 * | 4743 * |
4692 * Register a callback function that will be called on error and warnings. | 4744 * Register a callback function that will be called on error and warnings. |
4693 * | 4745 * |
4694 * If @f is NULL, the default error and warning handlers are restored. | 4746 * If @f is NULL, the default error and warning handlers are restored. |
4695 */ | 4747 */ |
4696 void | 4748 void |
4697 xmlTextReaderSetErrorHandler(xmlTextReaderPtr reader, | 4749 xmlTextReaderSetErrorHandler(xmlTextReaderPtr reader, |
4698 » » » xmlTextReaderErrorFunc f, | 4750 xmlTextReaderErrorFunc f, void *arg) |
4699 » » » void *arg) { | 4751 { |
4700 if (f != NULL) { | 4752 if (f != NULL) { |
4701 » reader->ctxt->sax->error = xmlTextReaderError; | 4753 reader->ctxt->sax->error = xmlTextReaderError; |
4702 » reader->ctxt->sax->serror = NULL; | 4754 reader->ctxt->sax->serror = NULL; |
4703 » reader->ctxt->vctxt.error = xmlTextReaderValidityError; | 4755 reader->ctxt->vctxt.error = xmlTextReaderValidityError; |
4704 » reader->ctxt->sax->warning = xmlTextReaderWarning; | 4756 reader->ctxt->sax->warning = xmlTextReaderWarning; |
4705 » reader->ctxt->vctxt.warning = xmlTextReaderValidityWarning; | 4757 reader->ctxt->vctxt.warning = xmlTextReaderValidityWarning; |
4706 » reader->errorFunc = f; | 4758 reader->errorFunc = f; |
4707 » reader->sErrorFunc = NULL; | 4759 reader->sErrorFunc = NULL; |
4708 » reader->errorFuncArg = arg; | 4760 reader->errorFuncArg = arg; |
4709 #ifdef LIBXML_SCHEMAS_ENABLED | 4761 #ifdef LIBXML_SCHEMAS_ENABLED |
4710 » » if (reader->rngValidCtxt) { | 4762 if (reader->rngValidCtxt) { |
4711 » » » xmlRelaxNGSetValidErrors(reader->rngValidCtxt, | 4763 xmlRelaxNGSetValidErrors(reader->rngValidCtxt, |
4712 » » » » xmlTextReaderValidityErrorRelay, | 4764 xmlTextReaderValidityErrorRelay, |
4713 » » » » xmlTextReaderValidityWarningRelay, | 4765 xmlTextReaderValidityWarningRelay, |
4714 » » » » reader); | 4766 reader); |
4715 » » » xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt,
NULL, reader); | 4767 xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt, NULL, |
4716 » » } | 4768 reader); |
4717 » » if (reader->xsdValidCtxt) { | 4769 } |
4718 » » » xmlSchemaSetValidErrors(reader->xsdValidCtxt, | 4770 if (reader->xsdValidCtxt) { |
4719 » » » » xmlTextReaderValidityErrorRelay, | 4771 xmlSchemaSetValidErrors(reader->xsdValidCtxt, |
4720 » » » » xmlTextReaderValidityWarningRelay, | 4772 xmlTextReaderValidityErrorRelay, |
4721 » » » » reader); | 4773 xmlTextReaderValidityWarningRelay, |
4722 » » » xmlSchemaSetValidStructuredErrors(reader->xsdValidCtxt,
NULL, reader); | 4774 reader); |
4723 » » } | 4775 xmlSchemaSetValidStructuredErrors(reader->xsdValidCtxt, NULL, |
| 4776 reader); |
| 4777 } |
4724 #endif | 4778 #endif |
4725 } | 4779 } else { |
4726 else { | 4780 /* restore defaults */ |
4727 » /* restore defaults */ | 4781 reader->ctxt->sax->error = xmlParserError; |
4728 » reader->ctxt->sax->error = xmlParserError; | 4782 reader->ctxt->vctxt.error = xmlParserValidityError; |
4729 » reader->ctxt->vctxt.error = xmlParserValidityError; | 4783 reader->ctxt->sax->warning = xmlParserWarning; |
4730 » reader->ctxt->sax->warning = xmlParserWarning; | 4784 reader->ctxt->vctxt.warning = xmlParserValidityWarning; |
4731 » reader->ctxt->vctxt.warning = xmlParserValidityWarning; | 4785 reader->errorFunc = NULL; |
4732 » reader->errorFunc = NULL; | 4786 reader->sErrorFunc = NULL; |
4733 » reader->sErrorFunc = NULL; | 4787 reader->errorFuncArg = NULL; |
4734 » reader->errorFuncArg = NULL; | |
4735 #ifdef LIBXML_SCHEMAS_ENABLED | 4788 #ifdef LIBXML_SCHEMAS_ENABLED |
4736 » » if (reader->rngValidCtxt) { | 4789 if (reader->rngValidCtxt) { |
4737 » » » xmlRelaxNGSetValidErrors(reader->rngValidCtxt, NULL, NUL
L, reader); | 4790 xmlRelaxNGSetValidErrors(reader->rngValidCtxt, NULL, NULL, |
4738 » » » xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt,
NULL, reader); | 4791 reader); |
4739 » » } | 4792 xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt, NULL, |
4740 » » if (reader->xsdValidCtxt) { | 4793 reader); |
4741 » » » xmlSchemaSetValidErrors(reader->xsdValidCtxt, NULL, NULL
, reader); | 4794 } |
4742 » » » xmlSchemaSetValidStructuredErrors(reader->xsdValidCtxt,
NULL, reader); | 4795 if (reader->xsdValidCtxt) { |
4743 » » } | 4796 xmlSchemaSetValidErrors(reader->xsdValidCtxt, NULL, NULL, |
| 4797 reader); |
| 4798 xmlSchemaSetValidStructuredErrors(reader->xsdValidCtxt, NULL, |
| 4799 reader); |
| 4800 } |
4744 #endif | 4801 #endif |
4745 } | 4802 } |
4746 } | 4803 } |
4747 | 4804 |
4748 /** | 4805 /** |
4749 * xmlTextReaderSetStructuredErrorHandler: | 4806 * xmlTextReaderSetStructuredErrorHandler: |
4750 * @reader: the xmlTextReaderPtr used | 4807 * @reader: the xmlTextReaderPtr used |
4751 * @f: the callback function to call on error and warnings | 4808 * @f: the callback function to call on error and warnings |
4752 * @arg: a user argument to pass to the callback function | 4809 * @arg: a user argument to pass to the callback function |
4753 * | 4810 * |
4754 * Register a callback function that will be called on error and warnings. | 4811 * Register a callback function that will be called on error and warnings. |
4755 * | 4812 * |
4756 * If @f is NULL, the default error and warning handlers are restored. | 4813 * If @f is NULL, the default error and warning handlers are restored. |
4757 */ | 4814 */ |
4758 void | 4815 void |
4759 xmlTextReaderSetStructuredErrorHandler(xmlTextReaderPtr reader, | 4816 xmlTextReaderSetStructuredErrorHandler(xmlTextReaderPtr reader, |
4760 » » » » » xmlStructuredErrorFunc f, | 4817 xmlStructuredErrorFunc f, void *arg) |
4761 » » » » » void *arg) { | 4818 { |
4762 if (f != NULL) { | 4819 if (f != NULL) { |
4763 » reader->ctxt->sax->error = NULL; | 4820 reader->ctxt->sax->error = NULL; |
4764 » reader->ctxt->sax->serror = xmlTextReaderStructuredError; | 4821 reader->ctxt->sax->serror = xmlTextReaderStructuredError; |
4765 » reader->ctxt->vctxt.error = xmlTextReaderValidityError; | 4822 reader->ctxt->vctxt.error = xmlTextReaderValidityError; |
4766 » reader->ctxt->sax->warning = xmlTextReaderWarning; | 4823 reader->ctxt->sax->warning = xmlTextReaderWarning; |
4767 » reader->ctxt->vctxt.warning = xmlTextReaderValidityWarning; | 4824 reader->ctxt->vctxt.warning = xmlTextReaderValidityWarning; |
4768 » reader->sErrorFunc = f; | 4825 reader->sErrorFunc = f; |
4769 » reader->errorFunc = NULL; | 4826 reader->errorFunc = NULL; |
4770 » reader->errorFuncArg = arg; | 4827 reader->errorFuncArg = arg; |
4771 #ifdef LIBXML_SCHEMAS_ENABLED | 4828 #ifdef LIBXML_SCHEMAS_ENABLED |
4772 » » if (reader->rngValidCtxt) { | 4829 if (reader->rngValidCtxt) { |
4773 » » » xmlRelaxNGSetValidErrors(reader->rngValidCtxt, NULL, NUL
L, reader); | 4830 xmlRelaxNGSetValidErrors(reader->rngValidCtxt, NULL, NULL, |
4774 » » » xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt, | 4831 reader); |
4775 » » » » xmlTextReaderValidityStructuredRelay, | 4832 xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt, |
4776 » » » » reader); | 4833 xmlTextReaderValidityStructuredRelay, |
4777 » » } | 4834 reader); |
4778 » » if (reader->xsdValidCtxt) { | 4835 } |
4779 » » » xmlSchemaSetValidErrors(reader->xsdValidCtxt, NULL, NULL
, reader); | 4836 if (reader->xsdValidCtxt) { |
4780 » » » xmlSchemaSetValidStructuredErrors(reader->xsdValidCtxt, | 4837 xmlSchemaSetValidErrors(reader->xsdValidCtxt, NULL, NULL, |
4781 » » » » xmlTextReaderValidityStructuredRelay, | 4838 reader); |
4782 » » » » reader); | 4839 xmlSchemaSetValidStructuredErrors(reader->xsdValidCtxt, |
4783 » » } | 4840 xmlTextReaderValidityStructuredRelay, |
| 4841 reader); |
| 4842 } |
4784 #endif | 4843 #endif |
4785 } | 4844 } else { |
4786 else { | 4845 /* restore defaults */ |
4787 » /* restore defaults */ | 4846 reader->ctxt->sax->error = xmlParserError; |
4788 » reader->ctxt->sax->error = xmlParserError; | 4847 reader->ctxt->sax->serror = NULL; |
4789 » reader->ctxt->sax->serror = NULL; | 4848 reader->ctxt->vctxt.error = xmlParserValidityError; |
4790 » reader->ctxt->vctxt.error = xmlParserValidityError; | 4849 reader->ctxt->sax->warning = xmlParserWarning; |
4791 » reader->ctxt->sax->warning = xmlParserWarning; | 4850 reader->ctxt->vctxt.warning = xmlParserValidityWarning; |
4792 » reader->ctxt->vctxt.warning = xmlParserValidityWarning; | 4851 reader->errorFunc = NULL; |
4793 » reader->errorFunc = NULL; | 4852 reader->sErrorFunc = NULL; |
4794 » reader->sErrorFunc = NULL; | 4853 reader->errorFuncArg = NULL; |
4795 » reader->errorFuncArg = NULL; | |
4796 #ifdef LIBXML_SCHEMAS_ENABLED | 4854 #ifdef LIBXML_SCHEMAS_ENABLED |
4797 » » if (reader->rngValidCtxt) { | 4855 if (reader->rngValidCtxt) { |
4798 » » » xmlRelaxNGSetValidErrors(reader->rngValidCtxt, NULL, NUL
L, reader); | 4856 xmlRelaxNGSetValidErrors(reader->rngValidCtxt, NULL, NULL, |
4799 » » » xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt,
NULL, reader); | 4857 reader); |
4800 » » } | 4858 xmlRelaxNGSetValidStructuredErrors(reader->rngValidCtxt, NULL, |
4801 » » if (reader->xsdValidCtxt) { | 4859 reader); |
4802 » » » xmlSchemaSetValidErrors(reader->xsdValidCtxt, NULL, NULL
, reader); | 4860 } |
4803 » » » xmlSchemaSetValidStructuredErrors(reader->xsdValidCtxt,
NULL, reader); | 4861 if (reader->xsdValidCtxt) { |
4804 » » } | 4862 xmlSchemaSetValidErrors(reader->xsdValidCtxt, NULL, NULL, |
| 4863 reader); |
| 4864 xmlSchemaSetValidStructuredErrors(reader->xsdValidCtxt, NULL, |
| 4865 reader); |
| 4866 } |
4805 #endif | 4867 #endif |
4806 } | 4868 } |
4807 } | 4869 } |
4808 | 4870 |
4809 /** | 4871 /** |
4810 * xmlTextReaderIsValid: | 4872 * xmlTextReaderIsValid: |
4811 * @reader: the xmlTextReaderPtr used | 4873 * @reader: the xmlTextReaderPtr used |
4812 * | 4874 * |
4813 * Retrieve the validity status from the parser context | 4875 * Retrieve the validity status from the parser context |
4814 * | 4876 * |
4815 * Returns the flag value 1 if valid, 0 if no, and -1 in case of error | 4877 * Returns the flag value 1 if valid, 0 if no, and -1 in case of error |
4816 */ | 4878 */ |
4817 int | 4879 int |
4818 xmlTextReaderIsValid(xmlTextReaderPtr reader) { | 4880 xmlTextReaderIsValid(xmlTextReaderPtr reader) |
4819 if (reader == NULL) return(-1); | 4881 { |
| 4882 if (reader == NULL) |
| 4883 return (-1); |
4820 #ifdef LIBXML_SCHEMAS_ENABLED | 4884 #ifdef LIBXML_SCHEMAS_ENABLED |
4821 if (reader->validate == XML_TEXTREADER_VALIDATE_RNG) | 4885 if (reader->validate == XML_TEXTREADER_VALIDATE_RNG) |
4822 return(reader->rngValidErrors == 0); | 4886 return (reader->rngValidErrors == 0); |
4823 if (reader->validate == XML_TEXTREADER_VALIDATE_XSD) | 4887 if (reader->validate == XML_TEXTREADER_VALIDATE_XSD) |
4824 return(reader->xsdValidErrors == 0); | 4888 return (reader->xsdValidErrors == 0); |
4825 #endif | 4889 #endif |
4826 if ((reader->ctxt != NULL) && (reader->ctxt->validate == 1)) | 4890 if ((reader->ctxt != NULL) && (reader->ctxt->validate == 1)) |
4827 » return(reader->ctxt->valid); | 4891 return (reader->ctxt->valid); |
4828 return(0); | 4892 return (0); |
4829 } | 4893 } |
4830 | 4894 |
4831 /** | 4895 /** |
4832 * xmlTextReaderGetErrorHandler: | 4896 * xmlTextReaderGetErrorHandler: |
4833 * @reader: the xmlTextReaderPtr used | 4897 * @reader: the xmlTextReaderPtr used |
4834 * @f: the callback function or NULL is no callback has been registered | 4898 * @f: the callback function or NULL is no callback has been registered |
4835 * @arg: a user argument | 4899 * @arg: a user argument |
4836 * | 4900 * |
4837 * Retrieve the error callback function and user argument. | 4901 * Retrieve the error callback function and user argument. |
4838 */ | 4902 */ |
4839 void | 4903 void |
4840 xmlTextReaderGetErrorHandler(xmlTextReaderPtr reader, | 4904 xmlTextReaderGetErrorHandler(xmlTextReaderPtr reader, |
4841 » » » xmlTextReaderErrorFunc *f, | 4905 xmlTextReaderErrorFunc * f, void **arg) |
4842 » » » void **arg) { | 4906 { |
4843 if (f != NULL) *f = reader->errorFunc; | 4907 if (f != NULL) |
4844 if (arg != NULL) *arg = reader->errorFuncArg; | 4908 *f = reader->errorFunc; |
| 4909 if (arg != NULL) |
| 4910 *arg = reader->errorFuncArg; |
4845 } | 4911 } |
4846 | |
4847 | |
4848 /************************************************************************ | 4912 /************************************************************************ |
4849 * * | 4913 * * |
4850 * New set (2.6.0) of simpler and more flexible APIs * | 4914 * New set (2.6.0) of simpler and more flexible APIs * |
4851 * * | 4915 * * |
4852 ************************************************************************/ | 4916 ************************************************************************/ |
4853 | 4917 |
4854 /** | 4918 /** |
4855 * xmlTextReaderSetup: | 4919 * xmlTextReaderSetup: |
4856 * @reader: an XML reader | 4920 * @reader: an XML reader |
4857 * @input: xmlParserInputBufferPtr used to feed the reader, will | 4921 * @input: xmlParserInputBufferPtr used to feed the reader, will |
4858 * be destroyed with it. | 4922 * be destroyed with it. |
4859 * @URL: the base URL to use for the document | 4923 * @URL: the base URL to use for the document |
4860 * @encoding: the document encoding, or NULL | 4924 * @encoding: the document encoding, or NULL |
4861 * @options: a combination of xmlParserOption | 4925 * @options: a combination of xmlParserOption |
4862 * | 4926 * |
4863 * Setup an XML reader with new options | 4927 * Setup an XML reader with new options |
4864 * | 4928 * |
4865 * Returns 0 in case of success and -1 in case of error. | 4929 * Returns 0 in case of success and -1 in case of error. |
4866 */ | 4930 */ |
4867 int | 4931 int |
4868 xmlTextReaderSetup(xmlTextReaderPtr reader, | 4932 xmlTextReaderSetup(xmlTextReaderPtr reader, |
4869 xmlParserInputBufferPtr input, const char *URL, | 4933 xmlParserInputBufferPtr input, const char *URL, |
4870 const char *encoding, int options) | 4934 const char *encoding, int options) |
4871 { | 4935 { |
4872 if (reader == NULL) { | 4936 if (reader == NULL) { |
4873 if (input != NULL) | 4937 if (input != NULL) |
4874 xmlFreeParserInputBuffer(input); | 4938 xmlFreeParserInputBuffer(input); |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4967 } | 5031 } |
4968 | 5032 |
4969 if (URL == NULL) | 5033 if (URL == NULL) |
4970 inputStream->filename = NULL; | 5034 inputStream->filename = NULL; |
4971 else | 5035 else |
4972 inputStream->filename = (char *) | 5036 inputStream->filename = (char *) |
4973 xmlCanonicPath((const xmlChar *) URL); | 5037 xmlCanonicPath((const xmlChar *) URL); |
4974 inputStream->buf = buf; | 5038 inputStream->buf = buf; |
4975 inputStream->base = inputStream->buf->buffer->content; | 5039 inputStream->base = inputStream->buf->buffer->content; |
4976 inputStream->cur = inputStream->buf->buffer->content; | 5040 inputStream->cur = inputStream->buf->buffer->content; |
4977 » inputStream->end = | 5041 » inputStream->end = |
4978 » » &inputStream->buf->buffer->content[inputStream->buf->buffer->use
]; | 5042 &inputStream->buf->buffer->content[inputStream->buf->buffer->use]; |
4979 | 5043 |
4980 inputPush(reader->ctxt, inputStream); | 5044 inputPush(reader->ctxt, inputStream); |
4981 reader->cur = 0; | 5045 reader->cur = 0; |
4982 } | 5046 } |
4983 if (reader->ctxt == NULL) { | 5047 if (reader->ctxt == NULL) { |
4984 xmlGenericError(xmlGenericErrorContext, | 5048 xmlGenericError(xmlGenericErrorContext, |
4985 "xmlTextReaderSetup : malloc failed\n"); | 5049 "xmlTextReaderSetup : malloc failed\n"); |
4986 return (-1); | 5050 return (-1); |
4987 } | 5051 } |
4988 } | 5052 } |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5069 * | 5133 * |
5070 * Returns the index in bytes from the beginning of the entity or -1 | 5134 * Returns the index in bytes from the beginning of the entity or -1 |
5071 * in case the index could not be computed. | 5135 * in case the index could not be computed. |
5072 */ | 5136 */ |
5073 long | 5137 long |
5074 xmlTextReaderByteConsumed(xmlTextReaderPtr reader) { | 5138 xmlTextReaderByteConsumed(xmlTextReaderPtr reader) { |
5075 if ((reader == NULL) || (reader->ctxt == NULL)) | 5139 if ((reader == NULL) || (reader->ctxt == NULL)) |
5076 return(-1); | 5140 return(-1); |
5077 return(xmlByteConsumed(reader->ctxt)); | 5141 return(xmlByteConsumed(reader->ctxt)); |
5078 } | 5142 } |
5079 | 5143 |
5080 | 5144 |
5081 /** | 5145 /** |
5082 * xmlReaderWalker: | 5146 * xmlReaderWalker: |
5083 * @doc: a preparsed document | 5147 * @doc: a preparsed document |
5084 * | 5148 * |
5085 * Create an xmltextReader for a preparsed document. | 5149 * Create an xmltextReader for a preparsed document. |
5086 * | 5150 * |
5087 * Returns the new reader or NULL in case of error. | 5151 * Returns the new reader or NULL in case of error. |
5088 */ | 5152 */ |
5089 xmlTextReaderPtr | 5153 xmlTextReaderPtr |
5090 xmlReaderWalker(xmlDocPtr doc) | 5154 xmlReaderWalker(xmlDocPtr doc) |
5091 { | 5155 { |
5092 xmlTextReaderPtr ret; | 5156 xmlTextReaderPtr ret; |
5093 | 5157 |
5094 if (doc == NULL) | 5158 if (doc == NULL) |
5095 return(NULL); | 5159 return(NULL); |
5096 | 5160 |
(...skipping 20 matching lines...) Expand all Loading... |
5117 | 5181 |
5118 /** | 5182 /** |
5119 * xmlReaderForDoc: | 5183 * xmlReaderForDoc: |
5120 * @cur: a pointer to a zero terminated string | 5184 * @cur: a pointer to a zero terminated string |
5121 * @URL: the base URL to use for the document | 5185 * @URL: the base URL to use for the document |
5122 * @encoding: the document encoding, or NULL | 5186 * @encoding: the document encoding, or NULL |
5123 * @options: a combination of xmlParserOption | 5187 * @options: a combination of xmlParserOption |
5124 * | 5188 * |
5125 * Create an xmltextReader for an XML in-memory document. | 5189 * Create an xmltextReader for an XML in-memory document. |
5126 * The parsing flags @options are a combination of xmlParserOption. | 5190 * The parsing flags @options are a combination of xmlParserOption. |
5127 * | 5191 * |
5128 * Returns the new reader or NULL in case of error. | 5192 * Returns the new reader or NULL in case of error. |
5129 */ | 5193 */ |
5130 xmlTextReaderPtr | 5194 xmlTextReaderPtr |
5131 xmlReaderForDoc(const xmlChar * cur, const char *URL, const char *encoding, | 5195 xmlReaderForDoc(const xmlChar * cur, const char *URL, const char *encoding, |
5132 int options) | 5196 int options) |
5133 { | 5197 { |
5134 int len; | 5198 int len; |
5135 | 5199 |
5136 if (cur == NULL) | 5200 if (cur == NULL) |
5137 return (NULL); | 5201 return (NULL); |
5138 len = xmlStrlen(cur); | 5202 len = xmlStrlen(cur); |
5139 | 5203 |
5140 return (xmlReaderForMemory | 5204 return (xmlReaderForMemory |
5141 ((const char *) cur, len, URL, encoding, options)); | 5205 ((const char *) cur, len, URL, encoding, options)); |
5142 } | 5206 } |
5143 | 5207 |
5144 /** | 5208 /** |
5145 * xmlReaderForFile: | 5209 * xmlReaderForFile: |
5146 * @filename: a file or URL | 5210 * @filename: a file or URL |
5147 * @encoding: the document encoding, or NULL | 5211 * @encoding: the document encoding, or NULL |
5148 * @options: a combination of xmlParserOption | 5212 * @options: a combination of xmlParserOption |
5149 * | 5213 * |
5150 * parse an XML file from the filesystem or the network. | 5214 * parse an XML file from the filesystem or the network. |
5151 * The parsing flags @options are a combination of xmlParserOption. | 5215 * The parsing flags @options are a combination of xmlParserOption. |
5152 * | 5216 * |
5153 * Returns the new reader or NULL in case of error. | 5217 * Returns the new reader or NULL in case of error. |
5154 */ | 5218 */ |
5155 xmlTextReaderPtr | 5219 xmlTextReaderPtr |
5156 xmlReaderForFile(const char *filename, const char *encoding, int options) | 5220 xmlReaderForFile(const char *filename, const char *encoding, int options) |
5157 { | 5221 { |
5158 xmlTextReaderPtr reader; | 5222 xmlTextReaderPtr reader; |
5159 | 5223 |
5160 reader = xmlNewTextReaderFilename(filename); | 5224 reader = xmlNewTextReaderFilename(filename); |
5161 if (reader == NULL) | 5225 if (reader == NULL) |
5162 return (NULL); | 5226 return (NULL); |
5163 xmlTextReaderSetup(reader, NULL, NULL, encoding, options); | 5227 xmlTextReaderSetup(reader, NULL, NULL, encoding, options); |
5164 return (reader); | 5228 return (reader); |
5165 } | 5229 } |
5166 | 5230 |
5167 /** | 5231 /** |
5168 * xmlReaderForMemory: | 5232 * xmlReaderForMemory: |
5169 * @buffer: a pointer to a char array | 5233 * @buffer: a pointer to a char array |
5170 * @size: the size of the array | 5234 * @size: the size of the array |
5171 * @URL: the base URL to use for the document | 5235 * @URL: the base URL to use for the document |
5172 * @encoding: the document encoding, or NULL | 5236 * @encoding: the document encoding, or NULL |
5173 * @options: a combination of xmlParserOption | 5237 * @options: a combination of xmlParserOption |
5174 * | 5238 * |
5175 * Create an xmltextReader for an XML in-memory document. | 5239 * Create an xmltextReader for an XML in-memory document. |
5176 * The parsing flags @options are a combination of xmlParserOption. | 5240 * The parsing flags @options are a combination of xmlParserOption. |
5177 * | 5241 * |
5178 * Returns the new reader or NULL in case of error. | 5242 * Returns the new reader or NULL in case of error. |
5179 */ | 5243 */ |
5180 xmlTextReaderPtr | 5244 xmlTextReaderPtr |
5181 xmlReaderForMemory(const char *buffer, int size, const char *URL, | 5245 xmlReaderForMemory(const char *buffer, int size, const char *URL, |
5182 const char *encoding, int options) | 5246 const char *encoding, int options) |
5183 { | 5247 { |
5184 xmlTextReaderPtr reader; | 5248 xmlTextReaderPtr reader; |
5185 xmlParserInputBufferPtr buf; | 5249 xmlParserInputBufferPtr buf; |
5186 | 5250 |
5187 buf = xmlParserInputBufferCreateStatic(buffer, size, | 5251 buf = xmlParserInputBufferCreateStatic(buffer, size, |
(...skipping 15 matching lines...) Expand all Loading... |
5203 * xmlReaderForFd: | 5267 * xmlReaderForFd: |
5204 * @fd: an open file descriptor | 5268 * @fd: an open file descriptor |
5205 * @URL: the base URL to use for the document | 5269 * @URL: the base URL to use for the document |
5206 * @encoding: the document encoding, or NULL | 5270 * @encoding: the document encoding, or NULL |
5207 * @options: a combination of xmlParserOption | 5271 * @options: a combination of xmlParserOption |
5208 * | 5272 * |
5209 * Create an xmltextReader for an XML from a file descriptor. | 5273 * Create an xmltextReader for an XML from a file descriptor. |
5210 * The parsing flags @options are a combination of xmlParserOption. | 5274 * The parsing flags @options are a combination of xmlParserOption. |
5211 * NOTE that the file descriptor will not be closed when the | 5275 * NOTE that the file descriptor will not be closed when the |
5212 * reader is closed or reset. | 5276 * reader is closed or reset. |
5213 * | 5277 * |
5214 * Returns the new reader or NULL in case of error. | 5278 * Returns the new reader or NULL in case of error. |
5215 */ | 5279 */ |
5216 xmlTextReaderPtr | 5280 xmlTextReaderPtr |
5217 xmlReaderForFd(int fd, const char *URL, const char *encoding, int options) | 5281 xmlReaderForFd(int fd, const char *URL, const char *encoding, int options) |
5218 { | 5282 { |
5219 xmlTextReaderPtr reader; | 5283 xmlTextReaderPtr reader; |
5220 xmlParserInputBufferPtr input; | 5284 xmlParserInputBufferPtr input; |
5221 | 5285 |
5222 if (fd < 0) | 5286 if (fd < 0) |
5223 return (NULL); | 5287 return (NULL); |
(...skipping 16 matching lines...) Expand all Loading... |
5240 * xmlReaderForIO: | 5304 * xmlReaderForIO: |
5241 * @ioread: an I/O read function | 5305 * @ioread: an I/O read function |
5242 * @ioclose: an I/O close function | 5306 * @ioclose: an I/O close function |
5243 * @ioctx: an I/O handler | 5307 * @ioctx: an I/O handler |
5244 * @URL: the base URL to use for the document | 5308 * @URL: the base URL to use for the document |
5245 * @encoding: the document encoding, or NULL | 5309 * @encoding: the document encoding, or NULL |
5246 * @options: a combination of xmlParserOption | 5310 * @options: a combination of xmlParserOption |
5247 * | 5311 * |
5248 * Create an xmltextReader for an XML document from I/O functions and source. | 5312 * Create an xmltextReader for an XML document from I/O functions and source. |
5249 * The parsing flags @options are a combination of xmlParserOption. | 5313 * The parsing flags @options are a combination of xmlParserOption. |
5250 * | 5314 * |
5251 * Returns the new reader or NULL in case of error. | 5315 * Returns the new reader or NULL in case of error. |
5252 */ | 5316 */ |
5253 xmlTextReaderPtr | 5317 xmlTextReaderPtr |
5254 xmlReaderForIO(xmlInputReadCallback ioread, xmlInputCloseCallback ioclose, | 5318 xmlReaderForIO(xmlInputReadCallback ioread, xmlInputCloseCallback ioclose, |
5255 void *ioctx, const char *URL, const char *encoding, | 5319 void *ioctx, const char *URL, const char *encoding, |
5256 int options) | 5320 int options) |
5257 { | 5321 { |
5258 xmlTextReaderPtr reader; | 5322 xmlTextReaderPtr reader; |
5259 xmlParserInputBufferPtr input; | 5323 xmlParserInputBufferPtr input; |
5260 | 5324 |
(...skipping 14 matching lines...) Expand all Loading... |
5275 return (reader); | 5339 return (reader); |
5276 } | 5340 } |
5277 | 5341 |
5278 /** | 5342 /** |
5279 * xmlReaderNewWalker: | 5343 * xmlReaderNewWalker: |
5280 * @reader: an XML reader | 5344 * @reader: an XML reader |
5281 * @doc: a preparsed document | 5345 * @doc: a preparsed document |
5282 * | 5346 * |
5283 * Setup an xmltextReader to parse a preparsed XML document. | 5347 * Setup an xmltextReader to parse a preparsed XML document. |
5284 * This reuses the existing @reader xmlTextReader. | 5348 * This reuses the existing @reader xmlTextReader. |
5285 * | 5349 * |
5286 * Returns 0 in case of success and -1 in case of error | 5350 * Returns 0 in case of success and -1 in case of error |
5287 */ | 5351 */ |
5288 int | 5352 int |
5289 xmlReaderNewWalker(xmlTextReaderPtr reader, xmlDocPtr doc) | 5353 xmlReaderNewWalker(xmlTextReaderPtr reader, xmlDocPtr doc) |
5290 { | 5354 { |
5291 if (doc == NULL) | 5355 if (doc == NULL) |
5292 return (-1); | 5356 return (-1); |
5293 if (reader == NULL) | 5357 if (reader == NULL) |
5294 return (-1); | 5358 return (-1); |
5295 | 5359 |
(...skipping 27 matching lines...) Expand all Loading... |
5323 * xmlReaderNewDoc: | 5387 * xmlReaderNewDoc: |
5324 * @reader: an XML reader | 5388 * @reader: an XML reader |
5325 * @cur: a pointer to a zero terminated string | 5389 * @cur: a pointer to a zero terminated string |
5326 * @URL: the base URL to use for the document | 5390 * @URL: the base URL to use for the document |
5327 * @encoding: the document encoding, or NULL | 5391 * @encoding: the document encoding, or NULL |
5328 * @options: a combination of xmlParserOption | 5392 * @options: a combination of xmlParserOption |
5329 * | 5393 * |
5330 * Setup an xmltextReader to parse an XML in-memory document. | 5394 * Setup an xmltextReader to parse an XML in-memory document. |
5331 * The parsing flags @options are a combination of xmlParserOption. | 5395 * The parsing flags @options are a combination of xmlParserOption. |
5332 * This reuses the existing @reader xmlTextReader. | 5396 * This reuses the existing @reader xmlTextReader. |
5333 * | 5397 * |
5334 * Returns 0 in case of success and -1 in case of error | 5398 * Returns 0 in case of success and -1 in case of error |
5335 */ | 5399 */ |
5336 int | 5400 int |
5337 xmlReaderNewDoc(xmlTextReaderPtr reader, const xmlChar * cur, | 5401 xmlReaderNewDoc(xmlTextReaderPtr reader, const xmlChar * cur, |
5338 const char *URL, const char *encoding, int options) | 5402 const char *URL, const char *encoding, int options) |
5339 { | 5403 { |
5340 | 5404 |
5341 int len; | 5405 int len; |
5342 | 5406 |
5343 if (cur == NULL) | 5407 if (cur == NULL) |
5344 return (-1); | 5408 return (-1); |
5345 if (reader == NULL) | 5409 if (reader == NULL) |
5346 return (-1); | 5410 return (-1); |
5347 | 5411 |
5348 len = xmlStrlen(cur); | 5412 len = xmlStrlen(cur); |
5349 return (xmlReaderNewMemory(reader, (const char *)cur, len, | 5413 return (xmlReaderNewMemory(reader, (const char *)cur, len, |
5350 URL, encoding, options)); | 5414 URL, encoding, options)); |
5351 } | 5415 } |
5352 | 5416 |
5353 /** | 5417 /** |
5354 * xmlReaderNewFile: | 5418 * xmlReaderNewFile: |
5355 * @reader: an XML reader | 5419 * @reader: an XML reader |
5356 * @filename: a file or URL | 5420 * @filename: a file or URL |
5357 * @encoding: the document encoding, or NULL | 5421 * @encoding: the document encoding, or NULL |
5358 * @options: a combination of xmlParserOption | 5422 * @options: a combination of xmlParserOption |
5359 * | 5423 * |
5360 * parse an XML file from the filesystem or the network. | 5424 * parse an XML file from the filesystem or the network. |
5361 * The parsing flags @options are a combination of xmlParserOption. | 5425 * The parsing flags @options are a combination of xmlParserOption. |
5362 * This reuses the existing @reader xmlTextReader. | 5426 * This reuses the existing @reader xmlTextReader. |
5363 * | 5427 * |
5364 * Returns 0 in case of success and -1 in case of error | 5428 * Returns 0 in case of success and -1 in case of error |
5365 */ | 5429 */ |
5366 int | 5430 int |
5367 xmlReaderNewFile(xmlTextReaderPtr reader, const char *filename, | 5431 xmlReaderNewFile(xmlTextReaderPtr reader, const char *filename, |
5368 const char *encoding, int options) | 5432 const char *encoding, int options) |
5369 { | 5433 { |
5370 xmlParserInputBufferPtr input; | 5434 xmlParserInputBufferPtr input; |
5371 | 5435 |
5372 if (filename == NULL) | 5436 if (filename == NULL) |
5373 return (-1); | 5437 return (-1); |
(...skipping 13 matching lines...) Expand all Loading... |
5387 * @reader: an XML reader | 5451 * @reader: an XML reader |
5388 * @buffer: a pointer to a char array | 5452 * @buffer: a pointer to a char array |
5389 * @size: the size of the array | 5453 * @size: the size of the array |
5390 * @URL: the base URL to use for the document | 5454 * @URL: the base URL to use for the document |
5391 * @encoding: the document encoding, or NULL | 5455 * @encoding: the document encoding, or NULL |
5392 * @options: a combination of xmlParserOption | 5456 * @options: a combination of xmlParserOption |
5393 * | 5457 * |
5394 * Setup an xmltextReader to parse an XML in-memory document. | 5458 * Setup an xmltextReader to parse an XML in-memory document. |
5395 * The parsing flags @options are a combination of xmlParserOption. | 5459 * The parsing flags @options are a combination of xmlParserOption. |
5396 * This reuses the existing @reader xmlTextReader. | 5460 * This reuses the existing @reader xmlTextReader. |
5397 * | 5461 * |
5398 * Returns 0 in case of success and -1 in case of error | 5462 * Returns 0 in case of success and -1 in case of error |
5399 */ | 5463 */ |
5400 int | 5464 int |
5401 xmlReaderNewMemory(xmlTextReaderPtr reader, const char *buffer, int size, | 5465 xmlReaderNewMemory(xmlTextReaderPtr reader, const char *buffer, int size, |
5402 const char *URL, const char *encoding, int options) | 5466 const char *URL, const char *encoding, int options) |
5403 { | 5467 { |
5404 xmlParserInputBufferPtr input; | 5468 xmlParserInputBufferPtr input; |
5405 | 5469 |
5406 if (reader == NULL) | 5470 if (reader == NULL) |
5407 return (-1); | 5471 return (-1); |
(...skipping 14 matching lines...) Expand all Loading... |
5422 * @fd: an open file descriptor | 5486 * @fd: an open file descriptor |
5423 * @URL: the base URL to use for the document | 5487 * @URL: the base URL to use for the document |
5424 * @encoding: the document encoding, or NULL | 5488 * @encoding: the document encoding, or NULL |
5425 * @options: a combination of xmlParserOption | 5489 * @options: a combination of xmlParserOption |
5426 * | 5490 * |
5427 * Setup an xmltextReader to parse an XML from a file descriptor. | 5491 * Setup an xmltextReader to parse an XML from a file descriptor. |
5428 * NOTE that the file descriptor will not be closed when the | 5492 * NOTE that the file descriptor will not be closed when the |
5429 * reader is closed or reset. | 5493 * reader is closed or reset. |
5430 * The parsing flags @options are a combination of xmlParserOption. | 5494 * The parsing flags @options are a combination of xmlParserOption. |
5431 * This reuses the existing @reader xmlTextReader. | 5495 * This reuses the existing @reader xmlTextReader. |
5432 * | 5496 * |
5433 * Returns 0 in case of success and -1 in case of error | 5497 * Returns 0 in case of success and -1 in case of error |
5434 */ | 5498 */ |
5435 int | 5499 int |
5436 xmlReaderNewFd(xmlTextReaderPtr reader, int fd, | 5500 xmlReaderNewFd(xmlTextReaderPtr reader, int fd, |
5437 const char *URL, const char *encoding, int options) | 5501 const char *URL, const char *encoding, int options) |
5438 { | 5502 { |
5439 xmlParserInputBufferPtr input; | 5503 xmlParserInputBufferPtr input; |
5440 | 5504 |
5441 if (fd < 0) | 5505 if (fd < 0) |
5442 return (-1); | 5506 return (-1); |
(...skipping 14 matching lines...) Expand all Loading... |
5457 * @ioclose: an I/O close function | 5521 * @ioclose: an I/O close function |
5458 * @ioctx: an I/O handler | 5522 * @ioctx: an I/O handler |
5459 * @URL: the base URL to use for the document | 5523 * @URL: the base URL to use for the document |
5460 * @encoding: the document encoding, or NULL | 5524 * @encoding: the document encoding, or NULL |
5461 * @options: a combination of xmlParserOption | 5525 * @options: a combination of xmlParserOption |
5462 * | 5526 * |
5463 * Setup an xmltextReader to parse an XML document from I/O functions | 5527 * Setup an xmltextReader to parse an XML document from I/O functions |
5464 * and source. | 5528 * and source. |
5465 * The parsing flags @options are a combination of xmlParserOption. | 5529 * The parsing flags @options are a combination of xmlParserOption. |
5466 * This reuses the existing @reader xmlTextReader. | 5530 * This reuses the existing @reader xmlTextReader. |
5467 * | 5531 * |
5468 * Returns 0 in case of success and -1 in case of error | 5532 * Returns 0 in case of success and -1 in case of error |
5469 */ | 5533 */ |
5470 int | 5534 int |
5471 xmlReaderNewIO(xmlTextReaderPtr reader, xmlInputReadCallback ioread, | 5535 xmlReaderNewIO(xmlTextReaderPtr reader, xmlInputReadCallback ioread, |
5472 xmlInputCloseCallback ioclose, void *ioctx, | 5536 xmlInputCloseCallback ioclose, void *ioctx, |
5473 const char *URL, const char *encoding, int options) | 5537 const char *URL, const char *encoding, int options) |
5474 { | 5538 { |
5475 xmlParserInputBufferPtr input; | 5539 xmlParserInputBufferPtr input; |
5476 | 5540 |
5477 if (ioread == NULL) | 5541 if (ioread == NULL) |
5478 return (-1); | 5542 return (-1); |
5479 if (reader == NULL) | 5543 if (reader == NULL) |
5480 return (-1); | 5544 return (-1); |
5481 | 5545 |
5482 input = xmlParserInputBufferCreateIO(ioread, ioclose, ioctx, | 5546 input = xmlParserInputBufferCreateIO(ioread, ioclose, ioctx, |
5483 XML_CHAR_ENCODING_NONE); | 5547 XML_CHAR_ENCODING_NONE); |
5484 if (input == NULL) | 5548 if (input == NULL) |
5485 return (-1); | 5549 return (-1); |
5486 return (xmlTextReaderSetup(reader, input, URL, encoding, options)); | 5550 return (xmlTextReaderSetup(reader, input, URL, encoding, options)); |
5487 } | 5551 } |
5488 /************************************************************************ | 5552 /************************************************************************ |
5489 * * | 5553 * * |
5490 * Utilities * | 5554 * Utilities * |
5491 * * | 5555 * * |
5492 ************************************************************************/ | 5556 ************************************************************************/ |
5493 #ifdef NOT_USED_YET | 5557 #ifdef NOT_USED_YET |
| 5558 |
5494 /** | 5559 /** |
5495 * xmlBase64Decode: | 5560 * xmlBase64Decode: |
5496 * @in: the input buffer | 5561 * @in: the input buffer |
5497 * @inlen: the size of the input (in), the size read from it (out) | 5562 * @inlen: the size of the input (in), the size read from it (out) |
5498 * @to: the output buffer | 5563 * @to: the output buffer |
5499 * @tolen: the size of the output (in), the size written to (out) | 5564 * @tolen: the size of the output (in), the size written to (out) |
5500 * | 5565 * |
5501 * Base64 decoder, reads from @in and save in @to | 5566 * Base64 decoder, reads from @in and save in @to |
5502 * TODO: tell jody when this is actually exported | 5567 * TODO: tell jody when this is actually exported |
5503 * | 5568 * |
5504 * Returns 0 if all the input was consumer, 1 if the Base64 end was reached, | 5569 * Returns 0 if all the input was consumer, 1 if the Base64 end was reached, |
5505 * 2 if there wasn't enough space on the output or -1 in case of error. | 5570 * 2 if there wasn't enough space on the output or -1 in case of error. |
5506 */ | 5571 */ |
5507 static int | 5572 static int |
5508 xmlBase64Decode(const unsigned char *in, unsigned long *inlen, | 5573 xmlBase64Decode(const unsigned char *in, unsigned long *inlen, |
5509 » unsigned char *to, unsigned long *tolen) { | 5574 unsigned char *to, unsigned long *tolen) |
5510 unsigned long incur;» » /* current index in in[] */ | 5575 { |
5511 unsigned long inblk;» » /* last block index in in[] */ | 5576 unsigned long incur; /* current index in in[] */ |
5512 unsigned long outcur;» » /* current index in out[] */ | 5577 |
5513 unsigned long inmax;» » /* size of in[] */ | 5578 unsigned long inblk; /* last block index in in[] */ |
5514 unsigned long outmax;» » /* size of out[] */ | 5579 |
5515 unsigned char cur;» » » /* the current value read from in[] */ | 5580 unsigned long outcur; /* current index in out[] */ |
5516 unsigned char intmp[4], outtmp[4];» /* temporary buffers for the convert */ | 5581 |
5517 int nbintmp;» » » /* number of byte in intmp[] */ | 5582 unsigned long inmax; /* size of in[] */ |
5518 int is_ignore;» » » /* cur should be ignored */ | 5583 |
5519 int is_end = 0;» » » /* the end of the base64 was found */ | 5584 unsigned long outmax; /* size of out[] */ |
| 5585 |
| 5586 unsigned char cur; /* the current value read from in[] */ |
| 5587 |
| 5588 unsigned char intmp[4], outtmp[4]; /* temporary buffers for the convert */ |
| 5589 |
| 5590 int nbintmp; /* number of byte in intmp[] */ |
| 5591 |
| 5592 int is_ignore; /* cur should be ignored */ |
| 5593 |
| 5594 int is_end = 0; /* the end of the base64 was found */ |
| 5595 |
5520 int retval = 1; | 5596 int retval = 1; |
| 5597 |
5521 int i; | 5598 int i; |
5522 | 5599 |
5523 if ((in == NULL) || (inlen == NULL) || (to == NULL) || (tolen == NULL)) | 5600 if ((in == NULL) || (inlen == NULL) || (to == NULL) || (tolen == NULL)) |
5524 » return(-1); | 5601 return (-1); |
5525 | 5602 |
5526 incur = 0; | 5603 incur = 0; |
5527 inblk = 0; | 5604 inblk = 0; |
5528 outcur = 0; | 5605 outcur = 0; |
5529 inmax = *inlen; | 5606 inmax = *inlen; |
5530 outmax = *tolen; | 5607 outmax = *tolen; |
5531 nbintmp = 0; | 5608 nbintmp = 0; |
5532 | 5609 |
5533 while (1) { | 5610 while (1) { |
5534 if (incur >= inmax) | 5611 if (incur >= inmax) |
5535 break; | 5612 break; |
5536 cur = in[incur++]; | 5613 cur = in[incur++]; |
5537 is_ignore = 0; | 5614 is_ignore = 0; |
5538 if ((cur >= 'A') && (cur <= 'Z')) | 5615 if ((cur >= 'A') && (cur <= 'Z')) |
5539 cur = cur - 'A'; | 5616 cur = cur - 'A'; |
5540 else if ((cur >= 'a') && (cur <= 'z')) | 5617 else if ((cur >= 'a') && (cur <= 'z')) |
5541 cur = cur - 'a' + 26; | 5618 cur = cur - 'a' + 26; |
5542 else if ((cur >= '0') && (cur <= '9')) | 5619 else if ((cur >= '0') && (cur <= '9')) |
5543 cur = cur - '0' + 52; | 5620 cur = cur - '0' + 52; |
5544 else if (cur == '+') | 5621 else if (cur == '+') |
5545 cur = 62; | 5622 cur = 62; |
5546 else if (cur == '/') | 5623 else if (cur == '/') |
5547 cur = 63; | 5624 cur = 63; |
5548 else if (cur == '.') | 5625 else if (cur == '.') |
5549 cur = 0; | 5626 cur = 0; |
5550 else if (cur == '=') /*no op , end of the base64 stream */ | 5627 else if (cur == '=') /*no op , end of the base64 stream */ |
5551 is_end = 1; | 5628 is_end = 1; |
5552 else { | 5629 else { |
5553 is_ignore = 1; | 5630 is_ignore = 1; |
5554 » if (nbintmp == 0) | 5631 if (nbintmp == 0) |
5555 » » inblk = incur; | 5632 inblk = incur; |
5556 » } | 5633 } |
5557 | 5634 |
5558 if (!is_ignore) { | 5635 if (!is_ignore) { |
5559 int nbouttmp = 3; | 5636 int nbouttmp = 3; |
| 5637 |
5560 int is_break = 0; | 5638 int is_break = 0; |
5561 | 5639 |
5562 if (is_end) { | 5640 if (is_end) { |
5563 if (nbintmp == 0) | 5641 if (nbintmp == 0) |
5564 break; | 5642 break; |
5565 if ((nbintmp == 1) || (nbintmp == 2)) | 5643 if ((nbintmp == 1) || (nbintmp == 2)) |
5566 nbouttmp = 1; | 5644 nbouttmp = 1; |
5567 else | 5645 else |
5568 nbouttmp = 2; | 5646 nbouttmp = 2; |
5569 nbintmp = 3; | 5647 nbintmp = 3; |
5570 is_break = 1; | 5648 is_break = 1; |
5571 } | 5649 } |
5572 intmp[nbintmp++] = cur; | 5650 intmp[nbintmp++] = cur; |
5573 » /* | 5651 /* |
5574 » * if intmp is full, push the 4byte sequence as a 3 byte | 5652 * if intmp is full, push the 4byte sequence as a 3 byte |
5575 » * sequence out | 5653 * sequence out |
5576 » */ | 5654 */ |
5577 if (nbintmp == 4) { | 5655 if (nbintmp == 4) { |
5578 nbintmp = 0; | 5656 nbintmp = 0; |
5579 outtmp[0] = (intmp[0] << 2) | ((intmp[1] & 0x30) >> 4); | 5657 outtmp[0] = (intmp[0] << 2) | ((intmp[1] & 0x30) >> 4); |
5580 outtmp[1] = | 5658 outtmp[1] = |
5581 ((intmp[1] & 0x0F) << 4) | ((intmp[2] & 0x3C) >> 2); | 5659 ((intmp[1] & 0x0F) << 4) | ((intmp[2] & 0x3C) >> 2); |
5582 outtmp[2] = ((intmp[2] & 0x03) << 6) | (intmp[3] & 0x3F); | 5660 outtmp[2] = ((intmp[2] & 0x03) << 6) | (intmp[3] & 0x3F); |
5583 » » if (outcur + 3 >= outmax) { | 5661 if (outcur + 3 >= outmax) { |
5584 » » retval = 2; | 5662 retval = 2; |
5585 » » break; | 5663 break; |
5586 » » } | 5664 } |
5587 | 5665 |
5588 for (i = 0; i < nbouttmp; i++) | 5666 for (i = 0; i < nbouttmp; i++) |
5589 » » to[outcur++] = outtmp[i]; | 5667 to[outcur++] = outtmp[i]; |
5590 » » inblk = incur; | 5668 inblk = incur; |
5591 } | 5669 } |
5592 | 5670 |
5593 if (is_break) { | 5671 if (is_break) { |
5594 » » retval = 0; | 5672 retval = 0; |
5595 break; | 5673 break; |
5596 » } | 5674 } |
5597 } | 5675 } |
5598 } | 5676 } |
5599 | 5677 |
5600 *tolen = outcur; | 5678 *tolen = outcur; |
5601 *inlen = inblk; | 5679 *inlen = inblk; |
5602 return (retval); | 5680 return (retval); |
5603 } | 5681 } |
5604 | 5682 |
5605 /* | 5683 /* |
5606 * Test routine for the xmlBase64Decode function | 5684 * Test routine for the xmlBase64Decode function |
5607 */ | 5685 */ |
5608 #if 0 | 5686 #if 0 |
5609 int main(int argc, char **argv) { | 5687 int |
| 5688 main(int argc, char **argv) |
| 5689 { |
5610 char *input = " VW4 gcGV0 \n aXQgdGVzdCAuCg== "; | 5690 char *input = " VW4 gcGV0 \n aXQgdGVzdCAuCg== "; |
| 5691 |
5611 char output[100]; | 5692 char output[100]; |
| 5693 |
5612 char output2[100]; | 5694 char output2[100]; |
| 5695 |
5613 char output3[100]; | 5696 char output3[100]; |
| 5697 |
5614 unsigned long inlen = strlen(input); | 5698 unsigned long inlen = strlen(input); |
| 5699 |
5615 unsigned long outlen = 100; | 5700 unsigned long outlen = 100; |
| 5701 |
5616 int ret; | 5702 int ret; |
| 5703 |
5617 unsigned long cons, tmp, tmp2, prod; | 5704 unsigned long cons, tmp, tmp2, prod; |
5618 | 5705 |
5619 /* | 5706 /* |
5620 * Direct | 5707 * Direct |
5621 */ | 5708 */ |
5622 ret = xmlBase64Decode(input, &inlen, output, &outlen); | 5709 ret = xmlBase64Decode(input, &inlen, output, &outlen); |
5623 | 5710 |
5624 output[outlen] = 0; | 5711 output[outlen] = 0; |
5625 printf("ret: %d, inlen: %ld , outlen: %ld, output: '%s'\n", ret, inlen, outl
en, output); | 5712 printf("ret: %d, inlen: %ld , outlen: %ld, output: '%s'\n", ret, inlen, |
5626 | 5713 outlen, output)indent: Standard input:179: Error:Unmatched #endif |
| 5714 ; |
| 5715 |
5627 /* | 5716 /* |
5628 * output chunking | 5717 * output chunking |
5629 */ | 5718 */ |
5630 cons = 0; | 5719 cons = 0; |
5631 prod = 0; | 5720 prod = 0; |
5632 while (cons < inlen) { | 5721 while (cons < inlen) { |
5633 » tmp = 5; | 5722 tmp = 5; |
5634 » tmp2 = inlen - cons; | 5723 tmp2 = inlen - cons; |
5635 | 5724 |
5636 » printf("%ld %ld\n", cons, prod); | 5725 printf("%ld %ld\n", cons, prod); |
5637 » ret = xmlBase64Decode(&input[cons], &tmp2, &output2[prod], &tmp); | 5726 ret = xmlBase64Decode(&input[cons], &tmp2, &output2[prod], &tmp); |
5638 » cons += tmp2; | 5727 cons += tmp2; |
5639 » prod += tmp; | 5728 prod += tmp; |
5640 » printf("%ld %ld\n", cons, prod); | 5729 printf("%ld %ld\n", cons, prod); |
5641 } | 5730 } |
5642 output2[outlen] = 0; | 5731 output2[outlen] = 0; |
5643 printf("ret: %d, cons: %ld , prod: %ld, output: '%s'\n", ret, cons, prod, ou
tput2); | 5732 printf("ret: %d, cons: %ld , prod: %ld, output: '%s'\n", ret, cons, |
| 5733 prod, output2); |
5644 | 5734 |
5645 /* | 5735 /* |
5646 * input chunking | 5736 * input chunking |
5647 */ | 5737 */ |
5648 cons = 0; | 5738 cons = 0; |
5649 prod = 0; | 5739 prod = 0; |
5650 while (cons < inlen) { | 5740 while (cons < inlen) { |
5651 » tmp = 100 - prod; | 5741 tmp = 100 - prod; |
5652 » tmp2 = inlen - cons; | 5742 tmp2 = inlen - cons; |
5653 » if (tmp2 > 5) | 5743 if (tmp2 > 5) |
5654 » tmp2 = 5; | 5744 tmp2 = 5; |
5655 | 5745 |
5656 » printf("%ld %ld\n", cons, prod); | 5746 printf("%ld %ld\n", cons, prod); |
5657 » ret = xmlBase64Decode(&input[cons], &tmp2, &output3[prod], &tmp); | 5747 ret = xmlBase64Decode(&input[cons], &tmp2, &output3[prod], &tmp); |
5658 » cons += tmp2; | 5748 cons += tmp2; |
5659 » prod += tmp; | 5749 prod += tmp; |
5660 » printf("%ld %ld\n", cons, prod); | 5750 printf("%ld %ld\n", cons, prod); |
5661 } | 5751 } |
5662 output3[outlen] = 0; | 5752 output3[outlen] = 0; |
5663 printf("ret: %d, cons: %ld , prod: %ld, output: '%s'\n", ret, cons, prod, ou
tput3); | 5753 printf("ret: %d, cons: %ld , prod: %ld, output: '%s'\n", ret, cons, |
5664 return(0); | 5754 prod, output3); |
| 5755 return (0); |
5665 | 5756 |
5666 } | 5757 } |
5667 #endif | 5758 #endif |
5668 #endif /* NOT_USED_YET */ | 5759 #endif /* NOT_USED_YET */ |
5669 #define bottom_xmlreader | 5760 #define bottom_xmlreader |
5670 #include "elfgcchack.h" | 5761 #include "elfgcchack.h" |
5671 #endif /* LIBXML_READER_ENABLED */ | 5762 #endif /* LIBXML_READER_ENABLED */ |
OLD | NEW |