/ libxml2 / testReader.c
testReader.c
  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@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 */