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