15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * testSAX.c : a small tester program for parsing using the SAX API. 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * See Copyright for the status of this software. 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * daniel@veillard.com 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "libxml.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_READER_ENABLED 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h> 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdarg.h> 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_SYS_TYPES_H 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/types.h> 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_SYS_STAT_H 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/stat.h> 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_FCNTL_H 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <fcntl.h> 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_UNISTD_H 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <unistd.h> 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_STDLIB_H 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdlib.h> 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_STRING_H 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h> 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlreader.h> 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int debug = 0; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int dump = 0; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int noent = 0; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int count = 0; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int valid = 0; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int consumed = 0; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void usage(const char *progname) { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("Usage : %s [options] XMLfiles ...\n", progname); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("\tParse the XML files using the xmlTextReader API\n"); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("\t --count: count the number of attribute and elements\n"); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("\t --valid: validate the document\n"); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("\t --consumed: count the number of bytes consumed\n"); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exit(1); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int elem, attrs; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void processNode(xmlTextReaderPtr reader) { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int type; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type = xmlTextReaderNodeType(reader); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (count) { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type == 1) { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elem++; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attrs += xmlTextReaderAttributeCount(reader); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void handleFile(const char *filename) { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderPtr reader; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (count) { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elem = 0; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attrs = 0; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader = xmlNewTextReaderFilename(filename); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reader != NULL) { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (valid) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlTextReaderSetParserProp(reader, XML_PARSER_VALIDATE, 1); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Process all nodes in sequence 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlTextReaderRead(reader); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (ret == 1) { 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) processNode(reader); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlTextReaderRead(reader); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Done, cleanup and status 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (consumed) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("%ld bytes consumed by parser\n", xmlTextReaderByteConsumed(reader)); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeTextReader(reader); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret != 0) { 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("%s : failed to parse\n", filename); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (count) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("%s : %d elements, %d attributes\n", filename, elem, attrs); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stderr, "Unable to open %s\n", filename); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int main(int argc, char **argv) { 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int files = 0; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (argc <= 1) { 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) usage(argv[0]); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(1); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LIBXML_TEST_VERSION 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 1; i < argc ; i++) { 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((!strcmp(argv[i], "-debug")) || (!strcmp(argv[i], "--debug"))) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) debug++; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if ((!strcmp(argv[i], "-dump")) || (!strcmp(argv[i], "--dump"))) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dump++; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if ((!strcmp(argv[i], "-count")) || (!strcmp(argv[i], "--count"))) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) count++; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if ((!strcmp(argv[i], "-consumed")) || (!strcmp(argv[i], "--consumed"))) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) consumed++; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if ((!strcmp(argv[i], "-valid")) || (!strcmp(argv[i], "--valid"))) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) valid++; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if ((!strcmp(argv[i], "-noent")) || 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (!strcmp(argv[i], "--noent"))) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) noent++; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (noent != 0) xmlSubstituteEntitiesDefault(1); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 1; i < argc ; i++) { 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (argv[i][0] != '-') { 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handleFile(argv[i]); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) files ++; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlCleanupParser(); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlMemoryDump(); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) { 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("%s : xmlReader parser support not compiled in\n", argv[0]); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBXML_READER_ENABLED */ 146