ixml.c - xml2tsv - a simple xml-to-tsv converter, based on xmlparser Err bitreich.org 70 1Log /scm/xml2tsv/log.gph bitreich.org 70 1Files /scm/xml2tsv/files.gph bitreich.org 70 1Refs /scm/xml2tsv/refs.gph bitreich.org 70 1Tags /scm/xml2tsv/tag bitreich.org 70 1README /scm/xml2tsv/file/README.md.gph bitreich.org 70 1LICENSE /scm/xml2tsv/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 ixml.c (10070B) Err bitreich.org 70 i--- Err bitreich.org 70 i 1 #include Err bitreich.org 70 i 2 #include Err bitreich.org 70 i 3 #include Err bitreich.org 70 i 4 #include Err bitreich.org 70 i 5 #include Err bitreich.org 70 i 6 Err bitreich.org 70 i 7 #include "xml.h" Err bitreich.org 70 i 8 Err bitreich.org 70 i 9 static void Err bitreich.org 70 i 10 xml_parseattrs(XMLParser *x) Err bitreich.org 70 i 11 { Err bitreich.org 70 i 12 size_t namelen = 0, valuelen; Err bitreich.org 70 i 13 int c, endsep, endname = 0, valuestart = 0; Err bitreich.org 70 i 14 Err bitreich.org 70 i 15 while ((c = GETNEXT()) != EOF) { Err bitreich.org 70 i 16 if (isspace(c)) { Err bitreich.org 70 i 17 if (namelen) Err bitreich.org 70 i 18 endname = 1; Err bitreich.org 70 i 19 continue; Err bitreich.org 70 i 20 } else if (c == '?') Err bitreich.org 70 i 21 ; /* ignore */ Err bitreich.org 70 i 22 else if (c == '=') { Err bitreich.org 70 i 23 x->name[namelen] = '\0'; Err bitreich.org 70 i 24 valuestart = 1; Err bitreich.org 70 i 25 endname = 1; Err bitreich.org 70 i 26 } else if (namelen && ((endname && !valuestart && isalpha(c)) || (c == '>' || c == '/'))) { Err bitreich.org 70 i 27 /* attribute without value */ Err bitreich.org 70 i 28 x->name[namelen] = '\0'; Err bitreich.org 70 i 29 if (x->xmlattrstart) Err bitreich.org 70 i 30 x->xmlattrstart(x, x->tag, x->taglen, x->name, namelen); Err bitreich.org 70 i 31 if (x->xmlattr) Err bitreich.org 70 i 32 x->xmlattr(x, x->tag, x->taglen, x->name, namelen, "", 0); Err bitreich.org 70 i 33 if (x->xmlattrend) Err bitreich.org 70 i 34 x->xmlattrend(x, x->tag, x->taglen, x->name, namelen); Err bitreich.org 70 i 35 endname = 0; Err bitreich.org 70 i 36 x->name[0] = c; Err bitreich.org 70 i 37 namelen = 1; Err bitreich.org 70 i 38 } else if (namelen && valuestart) { Err bitreich.org 70 i 39 /* attribute with value */ Err bitreich.org 70 i 40 if (x->xmlattrstart) Err bitreich.org 70 i 41 x->xmlattrstart(x, x->tag, x->taglen, x->name, namelen); Err bitreich.org 70 i 42 Err bitreich.org 70 i 43 valuelen = 0; Err bitreich.org 70 i 44 if (c == '\'' || c == '"') { Err bitreich.org 70 i 45 endsep = c; Err bitreich.org 70 i 46 } else { Err bitreich.org 70 i 47 endsep = ' '; /* isspace() */ Err bitreich.org 70 i 48 goto startvalue; Err bitreich.org 70 i 49 } Err bitreich.org 70 i 50 Err bitreich.org 70 i 51 while ((c = GETNEXT()) != EOF) { Err bitreich.org 70 i 52 startvalue: Err bitreich.org 70 i 53 if (c == '&') { /* entities */ Err bitreich.org 70 i 54 x->data[valuelen] = '\0'; Err bitreich.org 70 i 55 /* call data function with data before entity if there is data */ Err bitreich.org 70 i 56 if (valuelen && x->xmlattr) Err bitreich.org 70 i 57 x->xmlattr(x, x->tag, x->taglen, x->name, namelen, x->data, valuelen); Err bitreich.org 70 i 58 x->data[0] = c; Err bitreich.org 70 i 59 valuelen = 1; Err bitreich.org 70 i 60 while ((c = GETNEXT()) != EOF) { Err bitreich.org 70 i 61 if (c == endsep || (endsep == ' ' && (c == '>' || isspace(c)))) Err bitreich.org 70 i 62 break; Err bitreich.org 70 i 63 if (valuelen < sizeof(x->data) - 1) Err bitreich.org 70 i 64 x->data[valuelen++] = c; Err bitreich.org 70 i 65 else { Err bitreich.org 70 i 66 /* entity too long for buffer, handle as normal data */ Err bitreich.org 70 i 67 x->data[valuelen] = '\0'; Err bitreich.org 70 i 68 if (x->xmlattr) Err bitreich.org 70 i 69 x->xmlattr(x, x->tag, x->taglen, x->name, namelen, x->data, valuelen); Err bitreich.org 70 i 70 x->data[0] = c; Err bitreich.org 70 i 71 valuelen = 1; Err bitreich.org 70 i 72 break; Err bitreich.org 70 i 73 } Err bitreich.org 70 i 74 if (c == ';') { Err bitreich.org 70 i 75 x->data[valuelen] = '\0'; Err bitreich.org 70 i 76 if (x->xmlattrentity) Err bitreich.org 70 i 77 x->xmlattrentity(x, x->tag, x->taglen, x->name, namelen, x->data, valuelen); Err bitreich.org 70 i 78 valuelen = 0; Err bitreich.org 70 i 79 break; Err bitreich.org 70 i 80 } Err bitreich.org 70 i 81 } Err bitreich.org 70 i 82 } else if (c != endsep && !(endsep == ' ' && (c == '>' || isspace(c)))) { Err bitreich.org 70 i 83 if (valuelen < sizeof(x->data) - 1) { Err bitreich.org 70 i 84 x->data[valuelen++] = c; Err bitreich.org 70 i 85 } else { Err bitreich.org 70 i 86 x->data[valuelen] = '\0'; Err bitreich.org 70 i 87 if (x->xmlattr) Err bitreich.org 70 i 88 x->xmlattr(x, x->tag, x->taglen, x->name, namelen, x->data, valuelen); Err bitreich.org 70 i 89 x->data[0] = c; Err bitreich.org 70 i 90 valuelen = 1; Err bitreich.org 70 i 91 } Err bitreich.org 70 i 92 } Err bitreich.org 70 i 93 if (c == endsep || (endsep == ' ' && (c == '>' || isspace(c)))) { Err bitreich.org 70 i 94 x->data[valuelen] = '\0'; Err bitreich.org 70 i 95 if (x->xmlattr) Err bitreich.org 70 i 96 x->xmlattr(x, x->tag, x->taglen, x->name, namelen, x->data, valuelen); Err bitreich.org 70 i 97 if (x->xmlattrend) Err bitreich.org 70 i 98 x->xmlattrend(x, x->tag, x->taglen, x->name, namelen); Err bitreich.org 70 i 99 break; Err bitreich.org 70 i 100 } Err bitreich.org 70 i 101 } Err bitreich.org 70 i 102 namelen = endname = valuestart = 0; Err bitreich.org 70 i 103 } else if (namelen < sizeof(x->name) - 1) { Err bitreich.org 70 i 104 x->name[namelen++] = c; Err bitreich.org 70 i 105 } Err bitreich.org 70 i 106 if (c == '>') { Err bitreich.org 70 i 107 break; Err bitreich.org 70 i 108 } else if (c == '/') { Err bitreich.org 70 i 109 x->isshorttag = 1; Err bitreich.org 70 i 110 x->name[0] = '\0'; Err bitreich.org 70 i 111 namelen = 0; Err bitreich.org 70 i 112 } Err bitreich.org 70 i 113 } Err bitreich.org 70 i 114 } Err bitreich.org 70 i 115 Err bitreich.org 70 i 116 static void Err bitreich.org 70 i 117 xml_parsecomment(XMLParser *x) Err bitreich.org 70 i 118 { Err bitreich.org 70 i 119 size_t i = 0; Err bitreich.org 70 i 120 int c; Err bitreich.org 70 i 121 Err bitreich.org 70 i 122 while ((c = GETNEXT()) != EOF) { Err bitreich.org 70 i 123 if (c == '-') { Err bitreich.org 70 i 124 if (++i > 2) Err bitreich.org 70 i 125 i = 2; Err bitreich.org 70 i 126 continue; Err bitreich.org 70 i 127 } else if (c == '>' && i == 2) { Err bitreich.org 70 i 128 return; Err bitreich.org 70 i 129 } else if (i) { Err bitreich.org 70 i 130 i = 0; Err bitreich.org 70 i 131 } Err bitreich.org 70 i 132 } Err bitreich.org 70 i 133 } Err bitreich.org 70 i 134 Err bitreich.org 70 i 135 static void Err bitreich.org 70 i 136 xml_parsecdata(XMLParser *x) Err bitreich.org 70 i 137 { Err bitreich.org 70 i 138 size_t datalen = 0, i = 0; Err bitreich.org 70 i 139 int c; Err bitreich.org 70 i 140 Err bitreich.org 70 i 141 if (x->xmlcdatastart) Err bitreich.org 70 i 142 x->xmlcdatastart(x); Err bitreich.org 70 i 143 while ((c = GETNEXT()) != EOF) { Err bitreich.org 70 i 144 if (c == ']' || c == '>') { Err bitreich.org 70 i 145 if (x->xmlcdata && datalen) { Err bitreich.org 70 i 146 x->data[datalen] = '\0'; Err bitreich.org 70 i 147 x->xmlcdata(x, x->data, datalen); Err bitreich.org 70 i 148 datalen = 0; Err bitreich.org 70 i 149 } Err bitreich.org 70 i 150 } Err bitreich.org 70 i 151 Err bitreich.org 70 i 152 if (c == ']') { Err bitreich.org 70 i 153 if (++i > 2) { Err bitreich.org 70 i 154 if (x->xmlcdata) Err bitreich.org 70 i 155 for (; i > 2; i--) Err bitreich.org 70 i 156 x->xmlcdata(x, "]", 1); Err bitreich.org 70 i 157 i = 2; Err bitreich.org 70 i 158 } Err bitreich.org 70 i 159 continue; Err bitreich.org 70 i 160 } else if (c == '>' && i == 2) { Err bitreich.org 70 i 161 if (x->xmlcdataend) Err bitreich.org 70 i 162 x->xmlcdataend(x); Err bitreich.org 70 i 163 return; Err bitreich.org 70 i 164 } else if (i) { Err bitreich.org 70 i 165 if (x->xmlcdata) Err bitreich.org 70 i 166 for (; i > 0; i--) Err bitreich.org 70 i 167 x->xmlcdata(x, "]", 1); Err bitreich.org 70 i 168 i = 0; Err bitreich.org 70 i 169 } Err bitreich.org 70 i 170 Err bitreich.org 70 i 171 if (datalen < sizeof(x->data) - 1) { Err bitreich.org 70 i 172 x->data[datalen++] = c; Err bitreich.org 70 i 173 } else { Err bitreich.org 70 i 174 x->data[datalen] = '\0'; Err bitreich.org 70 i 175 if (x->xmlcdata) Err bitreich.org 70 i 176 x->xmlcdata(x, x->data, datalen); Err bitreich.org 70 i 177 x->data[0] = c; Err bitreich.org 70 i 178 datalen = 1; Err bitreich.org 70 i 179 } Err bitreich.org 70 i 180 } Err bitreich.org 70 i 181 } Err bitreich.org 70 i 182 Err bitreich.org 70 i 183 static int Err bitreich.org 70 i 184 codepointtoutf8(long r, char *s) Err bitreich.org 70 i 185 { Err bitreich.org 70 i 186 if (r == 0) { Err bitreich.org 70 i 187 return 0; /* NUL byte */ Err bitreich.org 70 i 188 } else if (r <= 0x7F) { Err bitreich.org 70 i 189 /* 1 byte: 0aaaaaaa */ Err bitreich.org 70 i 190 s[0] = r; Err bitreich.org 70 i 191 return 1; Err bitreich.org 70 i 192 } else if (r <= 0x07FF) { Err bitreich.org 70 i 193 /* 2 bytes: 00000aaa aabbbbbb */ Err bitreich.org 70 i 194 s[0] = 0xC0 | ((r & 0x0007C0) >> 6); /* 110aaaaa */ Err bitreich.org 70 i 195 s[1] = 0x80 | (r & 0x00003F); /* 10bbbbbb */ Err bitreich.org 70 i 196 return 2; Err bitreich.org 70 i 197 } else if (r <= 0xFFFF) { Err bitreich.org 70 i 198 /* 3 bytes: aaaabbbb bbcccccc */ Err bitreich.org 70 i 199 s[0] = 0xE0 | ((r & 0x00F000) >> 12); /* 1110aaaa */ Err bitreich.org 70 i 200 s[1] = 0x80 | ((r & 0x000FC0) >> 6); /* 10bbbbbb */ Err bitreich.org 70 i 201 s[2] = 0x80 | (r & 0x00003F); /* 10cccccc */ Err bitreich.org 70 i 202 return 3; Err bitreich.org 70 i 203 } else { Err bitreich.org 70 i 204 /* 4 bytes: 000aaabb bbbbcccc ccdddddd */ Err bitreich.org 70 i 205 s[0] = 0xF0 | ((r & 0x1C0000) >> 18); /* 11110aaa */ Err bitreich.org 70 i 206 s[1] = 0x80 | ((r & 0x03F000) >> 12); /* 10bbbbbb */ Err bitreich.org 70 i 207 s[2] = 0x80 | ((r & 0x000FC0) >> 6); /* 10cccccc */ Err bitreich.org 70 i 208 s[3] = 0x80 | (r & 0x00003F); /* 10dddddd */ Err bitreich.org 70 i 209 return 4; Err bitreich.org 70 i 210 } Err bitreich.org 70 i 211 } Err bitreich.org 70 i 212 Err bitreich.org 70 i 213 static int Err bitreich.org 70 i 214 namedentitytostr(const char *e, char *buf, size_t bufsiz) Err bitreich.org 70 i 215 { Err bitreich.org 70 i 216 static const struct { Err bitreich.org 70 i 217 const char *entity; Err bitreich.org 70 i 218 int c; Err bitreich.org 70 i 219 } entities[] = { Err bitreich.org 70 i 220 { "amp;", '&' }, Err bitreich.org 70 i 221 { "lt;", '<' }, Err bitreich.org 70 i 222 { "gt;", '>' }, Err bitreich.org 70 i 223 { "apos;", '\'' }, Err bitreich.org 70 i 224 { "quot;", '"' }, Err bitreich.org 70 i 225 }; Err bitreich.org 70 i 226 size_t i; Err bitreich.org 70 i 227 Err bitreich.org 70 i 228 /* buffer is too small */ Err bitreich.org 70 i 229 if (bufsiz < 2) Err bitreich.org 70 i 230 return -1; Err bitreich.org 70 i 231 Err bitreich.org 70 i 232 for (i = 0; i < sizeof(entities) / sizeof(*entities); i++) { Err bitreich.org 70 i 233 if (!strcmp(e, entities[i].entity)) { Err bitreich.org 70 i 234 buf[0] = entities[i].c; Err bitreich.org 70 i 235 buf[1] = '\0'; Err bitreich.org 70 i 236 return 1; Err bitreich.org 70 i 237 } Err bitreich.org 70 i 238 } Err bitreich.org 70 i 239 return -1; Err bitreich.org 70 i 240 } Err bitreich.org 70 i 241 Err bitreich.org 70 i 242 static int Err bitreich.org 70 i 243 numericentitytostr(const char *e, char *buf, size_t bufsiz) Err bitreich.org 70 i 244 { Err bitreich.org 70 i 245 long l; Err bitreich.org 70 i 246 int len; Err bitreich.org 70 i 247 char *end; Err bitreich.org 70 i 248 Err bitreich.org 70 i 249 /* buffer is too small */ Err bitreich.org 70 i 250 if (bufsiz < 5) Err bitreich.org 70 i 251 return -1; Err bitreich.org 70 i 252 Err bitreich.org 70 i 253 errno = 0; Err bitreich.org 70 i 254 /* hex (16) or decimal (10) */ Err bitreich.org 70 i 255 if (*e == 'x') Err bitreich.org 70 i 256 l = strtol(++e, &end, 16); Err bitreich.org 70 i 257 else Err bitreich.org 70 i 258 l = strtol(e, &end, 10); Err bitreich.org 70 i 259 /* invalid value or not a well-formed entity or invalid code point */ Err bitreich.org 70 i 260 if (errno || e == end || *end != ';' || l < 0 || l > 0x10ffff) Err bitreich.org 70 i 261 return -1; Err bitreich.org 70 i 262 len = codepointtoutf8(l, buf); Err bitreich.org 70 i 263 buf[len] = '\0'; Err bitreich.org 70 i 264 Err bitreich.org 70 i 265 return len; Err bitreich.org 70 i 266 } Err bitreich.org 70 i 267 Err bitreich.org 70 i 268 /* convert named- or numeric entity string to buffer string Err bitreich.org 70 i 269 * returns byte-length of string or -1 on failure. */ Err bitreich.org 70 i 270 int Err bitreich.org 70 i 271 xml_entitytostr(const char *e, char *buf, size_t bufsiz) Err bitreich.org 70 i 272 { Err bitreich.org 70 i 273 /* doesn't start with & */ Err bitreich.org 70 i 274 if (e[0] != '&') Err bitreich.org 70 i 275 return -1; Err bitreich.org 70 i 276 /* numeric entity */ Err bitreich.org 70 i 277 if (e[1] == '#') Err bitreich.org 70 i 278 return numericentitytostr(e + 2, buf, bufsiz); Err bitreich.org 70 i 279 else /* named entity */ Err bitreich.org 70 i 280 return namedentitytostr(e + 1, buf, bufsiz); Err bitreich.org 70 i 281 } Err bitreich.org 70 i 282 Err bitreich.org 70 i 283 void Err bitreich.org 70 i 284 xml_parse(XMLParser *x) Err bitreich.org 70 i 285 { Err bitreich.org 70 i 286 size_t datalen, tagdatalen; Err bitreich.org 70 i 287 int c, isend; Err bitreich.org 70 i 288 Err bitreich.org 70 i 289 while ((c = GETNEXT()) != EOF && c != '<') Err bitreich.org 70 i 290 ; /* skip until < */ Err bitreich.org 70 i 291 Err bitreich.org 70 i 292 while (c != EOF) { Err bitreich.org 70 i 293 if (c == '<') { /* parse tag */ Err bitreich.org 70 i 294 if ((c = GETNEXT()) == EOF) Err bitreich.org 70 i 295 return; Err bitreich.org 70 i 296 Err bitreich.org 70 i 297 if (c == '!') { /* cdata and comments */ Err bitreich.org 70 i 298 for (tagdatalen = 0; (c = GETNEXT()) != EOF;) { Err bitreich.org 70 i 299 /* NOTE: sizeof(x->data) must be atleast sizeof("[CDATA[") */ Err bitreich.org 70 i 300 if (tagdatalen <= sizeof("[CDATA[") - 1) Err bitreich.org 70 i 301 x->data[tagdatalen++] = c; Err bitreich.org 70 i 302 if (c == '>') Err bitreich.org 70 i 303 break; Err bitreich.org 70 i 304 else if (c == '-' && tagdatalen == sizeof("--") - 1 && Err bitreich.org 70 i 305 (x->data[0] == '-')) { Err bitreich.org 70 i 306 xml_parsecomment(x); Err bitreich.org 70 i 307 break; Err bitreich.org 70 i 308 } else if (c == '[') { Err bitreich.org 70 i 309 if (tagdatalen == sizeof("[CDATA[") - 1 && Err bitreich.org 70 i 310 !strncmp(x->data, "[CDATA[", tagdatalen)) { Err bitreich.org 70 i 311 xml_parsecdata(x); Err bitreich.org 70 i 312 break; Err bitreich.org 70 i 313 } Err bitreich.org 70 i 314 } Err bitreich.org 70 i 315 } Err bitreich.org 70 i 316 } else { Err bitreich.org 70 i 317 /* normal tag (open, short open, close), processing instruction. */ Err bitreich.org 70 i 318 x->tag[0] = c; Err bitreich.org 70 i 319 x->taglen = 1; Err bitreich.org 70 i 320 x->isshorttag = isend = 0; Err bitreich.org 70 i 321 Err bitreich.org 70 i 322 /* treat processing instruction as shorttag, don't strip "?" prefix. */ Err bitreich.org 70 i 323 if (c == '?') { Err bitreich.org 70 i 324 x->isshorttag = 1; Err bitreich.org 70 i 325 } else if (c == '/') { Err bitreich.org 70 i 326 if ((c = GETNEXT()) == EOF) Err bitreich.org 70 i 327 return; Err bitreich.org 70 i 328 x->tag[0] = c; Err bitreich.org 70 i 329 isend = 1; Err bitreich.org 70 i 330 } Err bitreich.org 70 i 331 Err bitreich.org 70 i 332 while ((c = GETNEXT()) != EOF) { Err bitreich.org 70 i 333 if (c == '/') Err bitreich.org 70 i 334 x->isshorttag = 1; /* short tag */ Err bitreich.org 70 i 335 else if (c == '>' || isspace(c)) { Err bitreich.org 70 i 336 x->tag[x->taglen] = '\0'; Err bitreich.org 70 i 337 if (isend) { /* end tag, starts with xmltagend) Err bitreich.org 70 i 339 x->xmltagend(x, x->tag, x->taglen, x->isshorttag); Err bitreich.org 70 i 340 x->tag[0] = '\0'; Err bitreich.org 70 i 341 x->taglen = 0; Err bitreich.org 70 i 342 } else { Err bitreich.org 70 i 343 /* start tag */ Err bitreich.org 70 i 344 if (x->xmltagstart) Err bitreich.org 70 i 345 x->xmltagstart(x, x->tag, x->taglen); Err bitreich.org 70 i 346 if (isspace(c)) Err bitreich.org 70 i 347 xml_parseattrs(x); Err bitreich.org 70 i 348 if (x->xmltagstartparsed) Err bitreich.org 70 i 349 x->xmltagstartparsed(x, x->tag, x->taglen, x->isshorttag); Err bitreich.org 70 i 350 } Err bitreich.org 70 i 351 /* call tagend for shortform or processing instruction */ Err bitreich.org 70 i 352 if (x->isshorttag) { Err bitreich.org 70 i 353 if (x->xmltagend) Err bitreich.org 70 i 354 x->xmltagend(x, x->tag, x->taglen, x->isshorttag); Err bitreich.org 70 i 355 x->tag[0] = '\0'; Err bitreich.org 70 i 356 x->taglen = 0; Err bitreich.org 70 i 357 } Err bitreich.org 70 i 358 break; Err bitreich.org 70 i 359 } else if (x->taglen < sizeof(x->tag) - 1) Err bitreich.org 70 i 360 x->tag[x->taglen++] = c; /* NOTE: tag name truncation */ Err bitreich.org 70 i 361 } Err bitreich.org 70 i 362 } Err bitreich.org 70 i 363 } else { Err bitreich.org 70 i 364 /* parse tag data */ Err bitreich.org 70 i 365 datalen = 0; Err bitreich.org 70 i 366 if (x->xmldatastart) Err bitreich.org 70 i 367 x->xmldatastart(x); Err bitreich.org 70 i 368 while ((c = GETNEXT()) != EOF) { Err bitreich.org 70 i 369 if (c == '&') { Err bitreich.org 70 i 370 if (datalen) { Err bitreich.org 70 i 371 x->data[datalen] = '\0'; Err bitreich.org 70 i 372 if (x->xmldata) Err bitreich.org 70 i 373 x->xmldata(x, x->data, datalen); Err bitreich.org 70 i 374 } Err bitreich.org 70 i 375 x->data[0] = c; Err bitreich.org 70 i 376 datalen = 1; Err bitreich.org 70 i 377 while ((c = GETNEXT()) != EOF) { Err bitreich.org 70 i 378 if (c == '<') Err bitreich.org 70 i 379 break; Err bitreich.org 70 i 380 if (datalen < sizeof(x->data) - 1) Err bitreich.org 70 i 381 x->data[datalen++] = c; Err bitreich.org 70 i 382 else { Err bitreich.org 70 i 383 /* entity too long for buffer, handle as normal data */ Err bitreich.org 70 i 384 x->data[datalen] = '\0'; Err bitreich.org 70 i 385 if (x->xmldata) Err bitreich.org 70 i 386 x->xmldata(x, x->data, datalen); Err bitreich.org 70 i 387 x->data[0] = c; Err bitreich.org 70 i 388 datalen = 1; Err bitreich.org 70 i 389 break; Err bitreich.org 70 i 390 } Err bitreich.org 70 i 391 if (c == ';') { Err bitreich.org 70 i 392 x->data[datalen] = '\0'; Err bitreich.org 70 i 393 if (x->xmldataentity) Err bitreich.org 70 i 394 x->xmldataentity(x, x->data, datalen); Err bitreich.org 70 i 395 datalen = 0; Err bitreich.org 70 i 396 break; Err bitreich.org 70 i 397 } Err bitreich.org 70 i 398 } Err bitreich.org 70 i 399 } else if (c != '<') { Err bitreich.org 70 i 400 if (datalen < sizeof(x->data) - 1) { Err bitreich.org 70 i 401 x->data[datalen++] = c; Err bitreich.org 70 i 402 } else { Err bitreich.org 70 i 403 x->data[datalen] = '\0'; Err bitreich.org 70 i 404 if (x->xmldata) Err bitreich.org 70 i 405 x->xmldata(x, x->data, datalen); Err bitreich.org 70 i 406 x->data[0] = c; Err bitreich.org 70 i 407 datalen = 1; Err bitreich.org 70 i 408 } Err bitreich.org 70 i 409 } Err bitreich.org 70 i 410 if (c == '<') { Err bitreich.org 70 i 411 x->data[datalen] = '\0'; Err bitreich.org 70 i 412 if (x->xmldata && datalen) Err bitreich.org 70 i 413 x->xmldata(x, x->data, datalen); Err bitreich.org 70 i 414 if (x->xmldataend) Err bitreich.org 70 i 415 x->xmldataend(x); Err bitreich.org 70 i 416 break; Err bitreich.org 70 i 417 } Err bitreich.org 70 i 418 } Err bitreich.org 70 i 419 } Err bitreich.org 70 i 420 } Err bitreich.org 70 i 421 } Err bitreich.org 70 .