Blame testReader.c

Packit 423ecb
/*
Packit 423ecb
 * testSAX.c : a small tester program for parsing using the SAX API.
Packit 423ecb
 *
Packit 423ecb
 * See Copyright for the status of this software.
Packit 423ecb
 *
Packit 423ecb
 * daniel@veillard.com
Packit 423ecb
 */
Packit 423ecb
Packit 423ecb
#include "libxml.h"
Packit 423ecb
Packit 423ecb
#ifdef LIBXML_READER_ENABLED
Packit 423ecb
#include <string.h>
Packit 423ecb
#include <stdarg.h>
Packit 423ecb
Packit 423ecb
#ifdef HAVE_SYS_TYPES_H
Packit 423ecb
#include <sys/types.h>
Packit 423ecb
#endif
Packit 423ecb
#ifdef HAVE_SYS_STAT_H
Packit 423ecb
#include <sys/stat.h>
Packit 423ecb
#endif
Packit 423ecb
#ifdef HAVE_FCNTL_H
Packit 423ecb
#include <fcntl.h>
Packit 423ecb
#endif
Packit 423ecb
#ifdef HAVE_UNISTD_H
Packit 423ecb
#include <unistd.h>
Packit 423ecb
#endif
Packit 423ecb
#ifdef HAVE_STDLIB_H
Packit 423ecb
#include <stdlib.h>
Packit 423ecb
#endif
Packit 423ecb
#ifdef HAVE_STRING_H
Packit 423ecb
#include <string.h>
Packit 423ecb
#endif
Packit 423ecb
Packit 423ecb
Packit 423ecb
#include <libxml/xmlreader.h>
Packit 423ecb
Packit 423ecb
static int debug = 0;
Packit 423ecb
static int dump = 0;
Packit 423ecb
static int noent = 0;
Packit 423ecb
static int count = 0;
Packit 423ecb
static int valid = 0;
Packit 423ecb
static int consumed = 0;
Packit 423ecb
Packit 423ecb
static void usage(const char *progname) {
Packit 423ecb
    printf("Usage : %s [options] XMLfiles ...\n", progname);
Packit 423ecb
    printf("\tParse the XML files using the xmlTextReader API\n");
Packit 423ecb
    printf("\t --count: count the number of attribute and elements\n");
Packit 423ecb
    printf("\t --valid: validate the document\n");
Packit 423ecb
    printf("\t --consumed: count the number of bytes consumed\n");
Packit 423ecb
    exit(1);
Packit 423ecb
}
Packit 423ecb
static int elem, attrs;
Packit 423ecb
Packit 423ecb
static void processNode(xmlTextReaderPtr reader) {
Packit 423ecb
    int type;
Packit 423ecb
Packit 423ecb
    type = xmlTextReaderNodeType(reader);
Packit 423ecb
    if (count) {
Packit 423ecb
	if (type == 1) {
Packit 423ecb
	    elem++;
Packit 423ecb
	    attrs += xmlTextReaderAttributeCount(reader);
Packit 423ecb
	}
Packit 423ecb
    }
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
static void handleFile(const char *filename) {
Packit 423ecb
    xmlTextReaderPtr reader;
Packit 423ecb
    int ret;
Packit 423ecb
Packit 423ecb
    if (count) {
Packit 423ecb
	elem = 0;
Packit 423ecb
	attrs = 0;
Packit 423ecb
    }
Packit 423ecb
Packit 423ecb
    reader = xmlNewTextReaderFilename(filename);
Packit 423ecb
    if (reader != NULL) {
Packit 423ecb
	if (valid)
Packit 423ecb
	    xmlTextReaderSetParserProp(reader, XML_PARSER_VALIDATE, 1);
Packit 423ecb
Packit 423ecb
	/*
Packit 423ecb
	 * Process all nodes in sequence
Packit 423ecb
	 */
Packit 423ecb
	ret = xmlTextReaderRead(reader);
Packit 423ecb
	while (ret == 1) {
Packit 423ecb
	    processNode(reader);
Packit 423ecb
	    ret = xmlTextReaderRead(reader);
Packit 423ecb
	}
Packit 423ecb
Packit 423ecb
	/*
Packit 423ecb
	 * Done, cleanup and status
Packit 423ecb
	 */
Packit 423ecb
	if (consumed)
Packit 423ecb
		printf("%ld bytes consumed by parser\n", xmlTextReaderByteConsumed(reader));
Packit 423ecb
	xmlFreeTextReader(reader);
Packit 423ecb
	if (ret != 0) {
Packit 423ecb
	    printf("%s : failed to parse\n", filename);
Packit 423ecb
	} else if (count)
Packit 423ecb
	    printf("%s : %d elements, %d attributes\n", filename, elem, attrs);
Packit 423ecb
    } else {
Packit 423ecb
	fprintf(stderr, "Unable to open %s\n", filename);
Packit 423ecb
    }
Packit 423ecb
}
Packit 423ecb
Packit 423ecb
int main(int argc, char **argv) {
Packit 423ecb
    int i;
Packit 423ecb
    int files = 0;
Packit 423ecb
Packit 423ecb
    if (argc <= 1) {
Packit 423ecb
	usage(argv[0]);
Packit 423ecb
	return(1);
Packit 423ecb
    }
Packit 423ecb
    LIBXML_TEST_VERSION
Packit 423ecb
    for (i = 1; i < argc ; i++) {
Packit 423ecb
	if ((!strcmp(argv[i], "-debug")) || (!strcmp(argv[i], "--debug")))
Packit 423ecb
	    debug++;
Packit 423ecb
	else if ((!strcmp(argv[i], "-dump")) || (!strcmp(argv[i], "--dump")))
Packit 423ecb
	    dump++;
Packit 423ecb
	else if ((!strcmp(argv[i], "-count")) || (!strcmp(argv[i], "--count")))
Packit 423ecb
	    count++;
Packit 423ecb
	else if ((!strcmp(argv[i], "-consumed")) || (!strcmp(argv[i], "--consumed")))
Packit 423ecb
	    consumed++;
Packit 423ecb
	else if ((!strcmp(argv[i], "-valid")) || (!strcmp(argv[i], "--valid")))
Packit 423ecb
	    valid++;
Packit 423ecb
	else if ((!strcmp(argv[i], "-noent")) ||
Packit 423ecb
	         (!strcmp(argv[i], "--noent")))
Packit 423ecb
	    noent++;
Packit 423ecb
    }
Packit 423ecb
    if (noent != 0) xmlSubstituteEntitiesDefault(1);
Packit 423ecb
    for (i = 1; i < argc ; i++) {
Packit 423ecb
	if (argv[i][0] != '-') {
Packit 423ecb
	    handleFile(argv[i]);
Packit 423ecb
	    files ++;
Packit 423ecb
	}
Packit 423ecb
    }
Packit 423ecb
    xmlCleanupParser();
Packit 423ecb
    xmlMemoryDump();
Packit 423ecb
Packit 423ecb
    return(0);
Packit 423ecb
}
Packit 423ecb
#else
Packit 423ecb
int main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) {
Packit 423ecb
    printf("%s : xmlReader parser support not compiled in\n", argv[0]);
Packit 423ecb
    return(0);
Packit 423ecb
}
Packit 423ecb
#endif /* LIBXML_READER_ENABLED */