123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- /* $Id: minixmlvalid.c,v 1.2 2006/11/30 11:31:55 nanard Exp $ */
- /* MiniUPnP Project
- * http://miniupnp.tuxfamily.org/ or http://miniupnp.free.fr/
- * minixmlvalid.c :
- * validation program for the minixml parser
- *
- * (c) 2006 Thomas Bernard */
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- #include "minixml.h"
- /* xml event structure */
- struct event {
- enum { ELTSTART, ELTEND, ATT, CHARDATA } type;
- const char * data;
- int len;
- };
- struct eventlist {
- int n;
- struct event * events;
- };
- /* compare 2 xml event lists
- * return 0 if the two lists are equals */
- int evtlistcmp(struct eventlist * a, struct eventlist * b)
- {
- int i;
- struct event * ae, * be;
- if(a->n != b->n)
- return 1;
- for(i=0; i<a->n; i++)
- {
- ae = a->events + i;
- be = b->events + i;
- if( (ae->type != be->type)
- ||(ae->len != be->len)
- ||memcmp(ae->data, be->data, ae->len))
- {
- printf("Found a difference : %d '%.*s' != %d '%.*s'\n",
- ae->type, ae->len, ae->data,
- be->type, be->len, be->data);
- return 1;
- }
- }
- return 0;
- }
- /* Test data */
- static const char xmldata[] =
- "<xmlroot>\n"
- " <elt1 att1=\"attvalue1\" att2=\"attvalue2\">"
- "character data"
- "</elt1> \n \t"
- "<elt1b/>"
- "<elt2a> \t<elt2b>chardata1</elt2b><elt2b>chardata2</elt2b></elt2a>"
- "</xmlroot>";
- static const struct event evtref[] =
- {
- {ELTSTART, "xmlroot", 7},
- {ELTSTART, "elt1", 4},
- /* attributes */
- {CHARDATA, "character data", 14},
- {ELTEND, "elt1", 4},
- {ELTSTART, "elt1b", 5},
- {ELTSTART, "elt2a", 5},
- {ELTSTART, "elt2b", 5},
- {CHARDATA, "chardata1", 9},
- {ELTEND, "elt2b", 5},
- {ELTSTART, "elt2b", 5},
- {CHARDATA, "chardata2", 9},
- {ELTEND, "elt2b", 5},
- {ELTEND, "elt2a", 5},
- {ELTEND, "xmlroot", 7}
- };
- void startelt(void * data, const char * p, int l)
- {
- struct eventlist * evtlist = data;
- struct event * evt;
- evt = evtlist->events + evtlist->n;
- /*printf("startelt : %.*s\n", l, p);*/
- evt->type = ELTSTART;
- evt->data = p;
- evt->len = l;
- evtlist->n++;
- }
- void endelt(void * data, const char * p, int l)
- {
- struct eventlist * evtlist = data;
- struct event * evt;
- evt = evtlist->events + evtlist->n;
- /*printf("endelt : %.*s\n", l, p);*/
- evt->type = ELTEND;
- evt->data = p;
- evt->len = l;
- evtlist->n++;
- }
- void chardata(void * data, const char * p, int l)
- {
- struct eventlist * evtlist = data;
- struct event * evt;
- evt = evtlist->events + evtlist->n;
- /*printf("chardata : '%.*s'\n", l, p);*/
- evt->type = CHARDATA;
- evt->data = p;
- evt->len = l;
- evtlist->n++;
- }
- int testxmlparser(const char * xml, int size)
- {
- int r;
- struct eventlist evtlist;
- struct eventlist evtlistref;
- struct xmlparser parser;
- evtlist.n = 0;
- evtlist.events = malloc(sizeof(struct event)*100);
- memset(&parser, 0, sizeof(parser));
- parser.xmlstart = xml;
- parser.xmlsize = size;
- parser.data = &evtlist;
- parser.starteltfunc = startelt;
- parser.endeltfunc = endelt;
- parser.datafunc = chardata;
- parsexml(&parser);
- printf("%d events\n", evtlist.n);
- /* compare */
- evtlistref.n = sizeof(evtref)/sizeof(struct event);
- evtlistref.events = (struct event *)evtref;
- r = evtlistcmp(&evtlistref, &evtlist);
- free(evtlist.events);
- return r;
- }
- int main(int argc, char * * argv)
- {
- int r;
- r = testxmlparser(xmldata, sizeof(xmldata)-1);
- if(r)
- printf("minixml validation test failed\n");
- return r;
- }
|