minixmlvalid.c 3.6 KB

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