Path: blob/master/thirdparty/miniupnpc/src/minixmlvalid.c
9904 views
/* $Id: minixmlvalid.c,v 1.7 2015/07/15 12:41:15 nanard Exp $ */1/* MiniUPnP Project2* http://miniupnp.tuxfamily.org/ or http://miniupnp.free.fr/3* minixmlvalid.c :4* validation program for the minixml parser5*6* (c) 2006-2011 Thomas Bernard */78#include <stdlib.h>9#include <stdio.h>10#include <string.h>11#include "minixml.h"1213/* xml event structure */14struct event {15enum { ELTSTART, ELTEND, ATT, CHARDATA } type;16const char * data;17int len;18};1920struct eventlist {21int n;22struct event * events;23};2425/* compare 2 xml event lists26* return 0 if the two lists are equals */27int evtlistcmp(struct eventlist * a, struct eventlist * b)28{29int i;30struct event * ae, * be;31if(a->n != b->n)32{33printf("event number not matching : %d != %d\n", a->n, b->n);34/*return 1;*/35}36for(i=0; i<a->n; i++)37{38ae = a->events + i;39be = b->events + i;40if( (ae->type != be->type)41||(ae->len != be->len)42||memcmp(ae->data, be->data, ae->len))43{44printf("Found a difference : %d '%.*s' != %d '%.*s'\n",45ae->type, ae->len, ae->data,46be->type, be->len, be->data);47return 1;48}49}50return 0;51}5253/* Test data */54static const char xmldata[] =55"<xmlroot>\n"56" <elt1 att1=\"attvalue1\" att2=\"attvalue2\">"57"character data"58"</elt1> \n \t"59"<elt1b/>"60"<elt1>\n<![CDATA[ <html>stuff !\n ]]> \n</elt1>\n"61"<elt2a> \t<elt2b>chardata1</elt2b><elt2b> chardata2 </elt2b></elt2a>"62"</xmlroot>";6364static const struct event evtref[] =65{66{ELTSTART, "xmlroot", 7},67{ELTSTART, "elt1", 4},68/* attributes */69{CHARDATA, "character data", 14},70{ELTEND, "elt1", 4},71{ELTSTART, "elt1b", 5},72{ELTSTART, "elt1", 4},73{CHARDATA, " <html>stuff !\n ", 16},74{ELTEND, "elt1", 4},75{ELTSTART, "elt2a", 5},76{ELTSTART, "elt2b", 5},77{CHARDATA, "chardata1", 9},78{ELTEND, "elt2b", 5},79{ELTSTART, "elt2b", 5},80{CHARDATA, " chardata2 ", 11},81{ELTEND, "elt2b", 5},82{ELTEND, "elt2a", 5},83{ELTEND, "xmlroot", 7}84};8586void startelt(void * data, const char * p, int l)87{88struct eventlist * evtlist = data;89struct event * evt;90evt = evtlist->events + evtlist->n;91/*printf("startelt : %.*s\n", l, p);*/92evt->type = ELTSTART;93evt->data = p;94evt->len = l;95evtlist->n++;96}9798void endelt(void * data, const char * p, int l)99{100struct eventlist * evtlist = data;101struct event * evt;102evt = evtlist->events + evtlist->n;103/*printf("endelt : %.*s\n", l, p);*/104evt->type = ELTEND;105evt->data = p;106evt->len = l;107evtlist->n++;108}109110void chardata(void * data, const char * p, int l)111{112struct eventlist * evtlist = data;113struct event * evt;114evt = evtlist->events + evtlist->n;115/*printf("chardata : '%.*s'\n", l, p);*/116evt->type = CHARDATA;117evt->data = p;118evt->len = l;119evtlist->n++;120}121122int testxmlparser(const char * xml, int size)123{124int r;125struct eventlist evtlist;126struct eventlist evtlistref;127struct xmlparser parser;128evtlist.n = 0;129evtlist.events = malloc(sizeof(struct event)*100);130if(evtlist.events == NULL)131{132fprintf(stderr, "Memory allocation error.\n");133return -1;134}135memset(&parser, 0, sizeof(parser));136parser.xmlstart = xml;137parser.xmlsize = size;138parser.data = &evtlist;139parser.starteltfunc = startelt;140parser.endeltfunc = endelt;141parser.datafunc = chardata;142parsexml(&parser);143printf("%d events\n", evtlist.n);144/* compare */145evtlistref.n = sizeof(evtref)/sizeof(struct event);146evtlistref.events = (struct event *)evtref;147r = evtlistcmp(&evtlistref, &evtlist);148free(evtlist.events);149return r;150}151152int main(int argc, char * * argv)153{154int r;155(void)argc; (void)argv;156157r = testxmlparser(xmldata, sizeof(xmldata)-1);158if(r)159printf("minixml validation test failed\n");160return r;161}162163164165