#include "minixml.h" | |
/* parseatt : used to parse the argument list | |
* return 0 (false) in case of success and -1 (true) if the end | |
* of the xmlbuffer is reached. */ | |
int parseatt(struct xmlparser * p) | |
{ | |
const char * attname; | |
int attnamelen; | |
const char * attvalue; | |
int attvaluelen; | |
while(p->xml < p->xmlend) | |
{ | |
if(*p->xml=='/' || *p->xml=='>') | |
return 0; | |
if( !IS_WHITE_SPACE(*p->xml) ) | |
{ | |
char sep; | |
attname = p->xml; | |
attnamelen = 0; | |
while(*p->xml!='=' && !IS_WHITE_SPACE(*p->xml) ) | |
{ | |
attnamelen++; p->xml++; | |
if(p->xml >= p->xmlend) | |
return -1; | |
} | |
while(*(p->xml++) != '=') | |
{ | |
if(p->xml >= p->xmlend) | |
return -1; | |
} | |
while(IS_WHITE_SPACE(*p->xml)) | |
{ | |
p->xml++; | |
if(p->xml >= p->xmlend) | |
return -1; | |
} | |
sep = *p->xml; | |
if(sep=='\'' || sep=='\"') | |
{ | |
p->xml++; | |
if(p->xml >= p->xmlend) | |
return -1; | |
attvalue = p->xml; | |
attvaluelen = 0; | |
while(*p->xml != sep) | |
{ | |
attvaluelen++; p->xml++; | |
if(p->xml >= p->xmlend) | |
return -1; | |
} | |
} | |
else | |
{ | |
attvalue = p->xml; | |
attvaluelen = 0; | |
while( !IS_WHITE_SPACE(*p->xml) | |
&& *p->xml != '>' && *p->xml != '/') | |
{ | |
attvaluelen++; p->xml++; | |
if(p->xml >= p->xmlend) | |
return -1; | |
} | |
} | |
/*printf("%.*s='%.*s'\n", | |
attnamelen, attname, attvaluelen, attvalue);*/ | |
if(p->attfunc) | |
p->attfunc(p->data, attname, attnamelen, attvalue, attvaluelen); | |
} | |
p->xml++; | |
} | |
return -1; | |
} | |
/* parseelt parse the xml stream and | |
* call the callback functions when needed... */ | |
void parseelt(struct xmlparser * p) | |
{ | |
int i; | |
const char * elementname; | |
while(p->xml < (p->xmlend - 1)) | |
{ | |
if((p->xml)[0]=='<' && (p->xml)[1]!='?') | |
{ | |
i = 0; elementname = ++p->xml; | |
while( !IS_WHITE_SPACE(*p->xml) | |
&& (*p->xml!='>') && (*p->xml!='/') | |
) | |
{ | |
i++; p->xml++; | |
if (p->xml >= p->xmlend) | |
return; | |
/* to ignore namespace : */ | |
if(*p->xml==':') | |
{ | |
i = 0; | |
elementname = ++p->xml; | |
} | |
} | |
if(i>0) | |
{ | |
if(p->starteltfunc) | |
p->starteltfunc(p->data, elementname, i); | |
if(parseatt(p)) | |
return; | |
if(*p->xml!='/') | |
{ | |
const char * data; | |
i = 0; data = ++p->xml; | |
if (p->xml >= p->xmlend) | |
return; | |
while( IS_WHITE_SPACE(*p->xml) ) | |
{ | |
i++; p->xml++; // support HNAP1 | |
if (p->xml >= p->xmlend) | |
return; | |
} | |
while(*p->xml!='<') | |
{ | |
i++; p->xml++; | |
if (p->xml >= p->xmlend) | |
return; | |
} | |
if(i>0 && p->datafunc) | |
p->datafunc(p->data, data, i); | |
} | |
} | |
else if(*p->xml == '/') | |
{ | |
i = 0; elementname = ++p->xml; | |
if (p->xml >= p->xmlend) | |
return; | |
while((*p->xml != '>')) | |
{ | |
i++; p->xml++; | |
if (p->xml >= p->xmlend) | |
return; | |
} | |
if(p->endeltfunc) | |
p->endeltfunc(p->data, elementname, i); | |
p->xml++; | |
} | |
} | |
else | |
{ | |
p->xml++; | |
} | |
} | |
} | |
/* the parser must be initialized before calling this function */ | |
void parsexml(struct xmlparser * parser) | |
{ | |
parser->xml = parser->xmlstart; | |
parser->xmlend = parser->xmlstart + parser->xmlsize; | |
parseelt(parser); | |
} | |