1
/* $Id: minixml.c,v 1.6 2007/05/15 18:14:08 nanard Exp $ */
2
/* minixml.c : the minimum size a xml parser can be ! */
4
* webpage: http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
5
* Author : Thomas Bernard
7
Copyright (c) 2005-2007, Thomas BERNARD
10
Redistribution and use in source and binary forms, with or without
11
modification, are permitted provided that the following conditions are met:
13
* Redistributions of source code must retain the above copyright notice,
14
this list of conditions and the following disclaimer.
15
* Redistributions in binary form must reproduce the above copyright notice,
16
this list of conditions and the following disclaimer in the documentation
17
and/or other materials provided with the distribution.
18
* The name of the author may not be used to endorse or promote products
19
derived from this software without specific prior written permission.
21
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
25
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31
POSSIBILITY OF SUCH DAMAGE.
35
/* parseatt : used to parse the argument list
36
* return 0 (false) in case of success and -1 (true) if the end
37
* of the xmlbuffer is reached. */
38
int parseatt(struct xmlparser * p)
42
const char * attvalue;
44
while(p->xml < p->xmlend)
46
if(*p->xml=='/' || *p->xml=='>')
48
if( !IS_WHITE_SPACE(*p->xml) )
53
while(*p->xml!='=' && !IS_WHITE_SPACE(*p->xml) )
55
attnamelen++; p->xml++;
56
if(p->xml >= p->xmlend)
59
while(*(p->xml++) != '=')
61
if(p->xml >= p->xmlend)
64
while(IS_WHITE_SPACE(*p->xml))
67
if(p->xml >= p->xmlend)
71
if(sep=='\'' || sep=='\"')
74
if(p->xml >= p->xmlend)
80
attvaluelen++; p->xml++;
81
if(p->xml >= p->xmlend)
89
while( !IS_WHITE_SPACE(*p->xml)
90
&& *p->xml != '>' && *p->xml != '/')
92
attvaluelen++; p->xml++;
93
if(p->xml >= p->xmlend)
97
/*printf("%.*s='%.*s'\n",
98
attnamelen, attname, attvaluelen, attvalue);*/
100
p->attfunc(p->data, attname, attnamelen, attvalue, attvaluelen);
107
/* parseelt parse the xml stream and
108
* call the callback functions when needed... */
109
void parseelt(struct xmlparser * p)
112
const char * elementname;
113
while(p->xml < (p->xmlend - 1))
115
if((p->xml)[0]=='<' && (p->xml)[1]!='?')
117
i = 0; elementname = ++p->xml;
118
while( !IS_WHITE_SPACE(*p->xml)
119
&& (*p->xml!='>') && (*p->xml!='/')
123
if (p->xml >= p->xmlend)
125
/* to ignore namespace : */
129
elementname = ++p->xml;
135
p->starteltfunc(p->data, elementname, i);
141
i = 0; data = ++p->xml;
142
if (p->xml >= p->xmlend)
144
while( IS_WHITE_SPACE(*p->xml) )
147
if (p->xml >= p->xmlend)
153
if (p->xml >= p->xmlend)
156
if(i>0 && p->datafunc)
157
p->datafunc(p->data, data, i);
160
else if(*p->xml == '/')
162
i = 0; elementname = ++p->xml;
163
if (p->xml >= p->xmlend)
165
while((*p->xml != '>'))
168
if (p->xml >= p->xmlend)
172
p->endeltfunc(p->data, elementname, i);
183
/* the parser must be initialized before calling this function */
184
void parsexml(struct xmlparser * parser)
186
parser->xml = parser->xmlstart;
187
parser->xmlend = parser->xmlstart + parser->xmlsize;