xml: improve CDATA parsing
thanks Svyatoslav Mishyn for the feedback!
This commit is contained in:
parent
875d1b0305
commit
07785ee64d
47
xml.c
47
xml.c
|
@ -151,36 +151,39 @@ xml_parsecomment(XMLParser *x)
|
|||
static void
|
||||
xml_parsecdata(XMLParser *x)
|
||||
{
|
||||
static const char *end = "]]>";
|
||||
size_t datalen = 0, i = 0;
|
||||
char tmp[4];
|
||||
int c;
|
||||
|
||||
if (x->xmlcdatastart)
|
||||
x->xmlcdatastart(x);
|
||||
while ((c = x->getnext()) != EOF) {
|
||||
if (c == end[i]) {
|
||||
if (end[++i] == '\0') { /* end */
|
||||
x->data[datalen] = '\0';
|
||||
if (x->xmlcdata)
|
||||
x->xmlcdata(x, x->data, datalen);
|
||||
if (x->xmlcdataend)
|
||||
x->xmlcdataend(x);
|
||||
return;
|
||||
}
|
||||
} else if (i) {
|
||||
x->data[datalen] = '\0';
|
||||
if (c == ']' || c == '>') {
|
||||
if (x->xmlcdata) {
|
||||
if (datalen)
|
||||
x->xmlcdata(x, x->data, datalen);
|
||||
memcpy(tmp, end, i);
|
||||
tmp[i] = '\0';
|
||||
x->xmlcdata(x, tmp, i);
|
||||
x->data[datalen] = '\0';
|
||||
x->xmlcdata(x, x->data, datalen);
|
||||
datalen = 0;
|
||||
}
|
||||
i = 0;
|
||||
x->data[0] = c;
|
||||
datalen = 1;
|
||||
} else if (datalen < sizeof(x->data) - 1) {
|
||||
}
|
||||
|
||||
if (c == ']') {
|
||||
if (++i > 2) {
|
||||
if (x->xmlcdata)
|
||||
for (; i > 2; i--)
|
||||
x->xmlcdata(x, "]", 1);
|
||||
i = 2;
|
||||
}
|
||||
continue;
|
||||
} else if (c == '>' && i == 2) {
|
||||
if (x->xmlcdataend)
|
||||
x->xmlcdataend(x);
|
||||
return;
|
||||
} else if (i) {
|
||||
if (x->xmlcdata)
|
||||
for (; i > 0; i--)
|
||||
x->xmlcdata(x, "]", 1);
|
||||
}
|
||||
|
||||
if (datalen < sizeof(x->data) - 1) {
|
||||
x->data[datalen++] = c;
|
||||
} else {
|
||||
x->data[datalen] = '\0';
|
||||
|
|
Loading…
Reference in New Issue