Home | History | Annotate | Download | only in libxml2
      1 /*
      2  * testSAX.c : a small tester program for parsing using the SAX API.
      3  *
      4  * See Copyright for the status of this software.
      5  *
      6  * daniel (at) veillard.com
      7  */
      8 
      9 #include "libxml.h"
     10 
     11 #ifdef LIBXML_READER_ENABLED
     12 #include <string.h>
     13 #include <stdarg.h>
     14 
     15 #ifdef HAVE_SYS_TYPES_H
     16 #include <sys/types.h>
     17 #endif
     18 #ifdef HAVE_SYS_STAT_H
     19 #include <sys/stat.h>
     20 #endif
     21 #ifdef HAVE_FCNTL_H
     22 #include <fcntl.h>
     23 #endif
     24 #ifdef HAVE_UNISTD_H
     25 #include <unistd.h>
     26 #endif
     27 #ifdef HAVE_STDLIB_H
     28 #include <stdlib.h>
     29 #endif
     30 #ifdef HAVE_STRING_H
     31 #include <string.h>
     32 #endif
     33 
     34 
     35 #include <libxml/xmlreader.h>
     36 
     37 static int debug = 0;
     38 static int dump = 0;
     39 static int noent = 0;
     40 static int count = 0;
     41 static int valid = 0;
     42 static int consumed = 0;
     43 
     44 static void usage(const char *progname) {
     45     printf("Usage : %s [options] XMLfiles ...\n", progname);
     46     printf("\tParse the XML files using the xmlTextReader API\n");
     47     printf("\t --count: count the number of attribute and elements\n");
     48     printf("\t --valid: validate the document\n");
     49     printf("\t --consumed: count the number of bytes consumed\n");
     50     exit(1);
     51 }
     52 static int elem, attrs;
     53 
     54 static void processNode(xmlTextReaderPtr reader) {
     55     int type;
     56 
     57     type = xmlTextReaderNodeType(reader);
     58     if (count) {
     59 	if (type == 1) {
     60 	    elem++;
     61 	    attrs += xmlTextReaderAttributeCount(reader);
     62 	}
     63     }
     64 }
     65 
     66 static void handleFile(const char *filename) {
     67     xmlTextReaderPtr reader;
     68     int ret;
     69 
     70     if (count) {
     71 	elem = 0;
     72 	attrs = 0;
     73     }
     74 
     75     reader = xmlNewTextReaderFilename(filename);
     76     if (reader != NULL) {
     77 	if (valid)
     78 	    xmlTextReaderSetParserProp(reader, XML_PARSER_VALIDATE, 1);
     79 
     80 	/*
     81 	 * Process all nodes in sequence
     82 	 */
     83 	ret = xmlTextReaderRead(reader);
     84 	while (ret == 1) {
     85 	    processNode(reader);
     86 	    ret = xmlTextReaderRead(reader);
     87 	}
     88 
     89 	/*
     90 	 * Done, cleanup and status
     91 	 */
     92 	if (consumed)
     93 		printf("%ld bytes consumed by parser\n", xmlTextReaderByteConsumed(reader));
     94 	xmlFreeTextReader(reader);
     95 	if (ret != 0) {
     96 	    printf("%s : failed to parse\n", filename);
     97 	} else if (count)
     98 	    printf("%s : %d elements, %d attributes\n", filename, elem, attrs);
     99     } else {
    100 	fprintf(stderr, "Unable to open %s\n", filename);
    101     }
    102 }
    103 
    104 int main(int argc, char **argv) {
    105     int i;
    106     int files = 0;
    107 
    108     if (argc <= 1) {
    109 	usage(argv[0]);
    110 	return(1);
    111     }
    112     LIBXML_TEST_VERSION
    113     for (i = 1; i < argc ; i++) {
    114 	if ((!strcmp(argv[i], "-debug")) || (!strcmp(argv[i], "--debug")))
    115 	    debug++;
    116 	else if ((!strcmp(argv[i], "-dump")) || (!strcmp(argv[i], "--dump")))
    117 	    dump++;
    118 	else if ((!strcmp(argv[i], "-count")) || (!strcmp(argv[i], "--count")))
    119 	    count++;
    120 	else if ((!strcmp(argv[i], "-consumed")) || (!strcmp(argv[i], "--consumed")))
    121 	    consumed++;
    122 	else if ((!strcmp(argv[i], "-valid")) || (!strcmp(argv[i], "--valid")))
    123 	    valid++;
    124 	else if ((!strcmp(argv[i], "-noent")) ||
    125 	         (!strcmp(argv[i], "--noent")))
    126 	    noent++;
    127     }
    128     if (noent != 0) xmlSubstituteEntitiesDefault(1);
    129     for (i = 1; i < argc ; i++) {
    130 	if (argv[i][0] != '-') {
    131 	    handleFile(argv[i]);
    132 	    files ++;
    133 	}
    134     }
    135     xmlCleanupParser();
    136     xmlMemoryDump();
    137 
    138     return(0);
    139 }
    140 #else
    141 int main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) {
    142     printf("%s : xmlReader parser support not compiled in\n", argv[0]);
    143     return(0);
    144 }
    145 #endif /* LIBXML_READER_ENABLED */
    146