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 */