XML-TinyXML
view release on metacpan or search on metacpan
p++;
state = XML_ELEMENT_END;
err = XmlEndHandler(xml, end);
free(end);
if(err != XML_NOERR)
goto _parser_err;
}
} else if(strncmp(p, "!ENTITY", 8) == 0) { // XXX - IGNORING !ENTITY NODES
p += 8;
mark = p;
p = strstr(mark, ">");
if(!p) {
fprintf(stderr, "Can't find where the !ENTITY element ends\n");
err = XML_PARSER_GENERIC_ERR;
goto _parser_err;
}
p++;
} else if(strncmp(p, "!NOTATION", 9) == 0) { // XXX - IGNORING !NOTATION NODES
p += 9;
mark = p;
p = strstr(mark, ">");
if(!p) {
fprintf(stderr, "Can't find where the !NOTATION element ends\n");
err = XML_PARSER_GENERIC_ERR;
goto _parser_err;
}
p++;
} else if(strncmp(p, "!ATTLIST", 8) == 0) { // XXX - IGNORING !ATTLIST NODES
p += 8;
mark = p;
p = strstr(mark, ">");
if(!p) {
fprintf(stderr, "Can't find where the !NOTATION element ends\n");
err = XML_PARSER_GENERIC_ERR;
goto _parser_err;
}
p++;
} else if(strncmp(p, "!--", 3) == 0) { /* comment */
char *comment = NULL;
p += 3; /* skip !-- */
mark = p;
p = strstr(mark, "-->");
if(!p) {
/* XXX - TODO - This error condition must be handled asap */
}
comment = (char *)calloc(1, p-mark+1);
if(!comment) {
err = XML_MEMORY_ERR;
goto _parser_err;
}
strncpy(comment, mark, p-mark);
err = XmlExtraNodeHandler(xml, comment, XML_NODETYPE_COMMENT);
free(comment);
p+=3;
} else if(strncmp(p, "![", 2) == 0) {
mark = p;
p += 2; /* skip ![ */
SKIP_WHITESPACES(p);
//mark = p;
if(strncmp(p, "CDATA", 5) == 0) {
char *cdata = NULL;
p+=5;
SKIP_WHITESPACES(p);
if(*p != '[') {
fprintf(stderr, "Unsupported entity type at \"... -->%15s\"", mark);
err = XML_PARSER_GENERIC_ERR;
goto _parser_err;
}
mark = ++p;
p = strstr(mark, "]]>");
if(!p) {
/* XXX - TODO - This error condition must be handled asap */
}
cdata = (char *)calloc(1, p-mark+1);
if(!cdata) {
err = XML_MEMORY_ERR;
goto _parser_err;
}
strncpy(cdata, mark, p-mark);
err = XmlExtraNodeHandler(xml, cdata, XML_NODETYPE_CDATA);
free(cdata);
p+=3;
} else {
fprintf(stderr, "Unsupported entity type at \"... -->%15s\"", mark);
err = XML_PARSER_GENERIC_ERR;
goto _parser_err;
}
} else if(*p =='?') { /* head */
char *encoding = NULL;
p++;
mark = p;
p = strstr(mark, "?>");
if(xml->head) // we are going to overwrite existing head (if any)
free(xml->head); /* XXX - should notify this behaviour? */
xml->head = (char *)calloc(1, p-mark+1);
strncpy(xml->head, mark, p-mark);
encoding = strstr(xml->head, "encoding=");
if (encoding) {
encoding += 9;
if (*encoding == '"' || *encoding == '\'') {
int encoding_length = 0;
quote = *encoding;
encoding++;
end = (char *)strchr(encoding, quote);
if (!end) {
fprintf(stderr, "Unquoted encoding string in the <?xml> section");
err = XML_PARSER_GENERIC_ERR;
goto _parser_err;
}
encoding_length = end - encoding;
if (encoding_length < sizeof(xml->documentEncoding)) {
strncpy(xml->documentEncoding, encoding, encoding_length);
// ensure to terminate it, if we are reusing a context we
// could have still the old encoding there possibly with a
// longer name (so poisoning the buffer)
xml->documentEncoding[encoding_length] = 0;
}
}
} else {
}
p+=2;
} else { /* start tag */
attrs = NULL;
values = NULL;
nAttrs = 0;
state = XML_ELEMENT_START;
SKIP_WHITESPACES(p);
mark = p;
ADVANCE_ELEMENT(p);
start = (char *)malloc(p-mark+2);
if(start == NULL)
return XML_MEMORY_ERR;
strncpy(start, mark, p-mark);
if(*p == '>' && *(p-1) == '/') {
start[p-mark-1] = 0;
state = XML_ELEMENT_UNIQUE;
} else {
start[p-mark] = 0;
}
( run in 1.661 second using v1.01-cache-2.11-cpan-39bf76dae61 )