123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232 |
- #include <string.h>
- #include "minixml.h"
- static 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;
- }
- }
-
- if(p->attfunc)
- p->attfunc(p->data, attname, attnamelen, attvalue, attvaluelen);
- }
- p->xml++;
- }
- return -1;
- }
- static void parseelt(struct xmlparser * p)
- {
- int i;
- const char * elementname;
- while(p->xml < (p->xmlend - 1))
- {
- if((p->xml + 4) <= p->xmlend && (0 == memcmp(p->xml, "<!--", 4)))
- {
- p->xml += 3;
-
- do
- {
- p->xml++;
- if ((p->xml + 3) >= p->xmlend)
- return;
- }
- while(memcmp(p->xml, "-->", 3) != 0);
- p->xml += 3;
- }
- else 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;
-
- 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++;
- if (p->xml >= p->xmlend)
- return;
- }
-
- if((p->xmlend >= (p->xml + (9 + 3))) && (memcmp(p->xml, "<![CDATA[", 9) == 0))
- {
-
- p->xml += 9;
- data = p->xml;
- i = 0;
- while(memcmp(p->xml, "]]>", 3) != 0)
- {
- i++; p->xml++;
- if ((p->xml + 3) >= p->xmlend)
- return;
- }
- if(i>0 && p->datafunc)
- p->datafunc(p->data, data, i);
- while(*p->xml!='<')
- {
- p->xml++;
- if (p->xml >= p->xmlend)
- return;
- }
- }
- else
- {
- while(*p->xml!='<')
- {
- i++; p->xml++;
- if ((p->xml + 1) >= p->xmlend)
- return;
- }
- if(i>0 && p->datafunc && *(p->xml + 1) == '/')
- 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++;
- }
- }
- }
- void parsexml(struct xmlparser * parser)
- {
- parser->xml = parser->xmlstart;
- parser->xmlend = parser->xmlstart + parser->xmlsize;
- parseelt(parser);
- }
|