blob: b89992df7f412d3542bbfd6bf5ccffa7252fadbf [file] [log] [blame]
Daniel Veillarde1ca5032002-12-09 14:13:43 +00001/*
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#include <string.h>
12#include <stdarg.h>
13
14#ifdef HAVE_SYS_TYPES_H
15#include <sys/types.h>
16#endif
17#ifdef HAVE_SYS_STAT_H
18#include <sys/stat.h>
19#endif
20#ifdef HAVE_FCNTL_H
21#include <fcntl.h>
22#endif
23#ifdef HAVE_UNISTD_H
24#include <unistd.h>
25#endif
26#ifdef HAVE_STDLIB_H
27#include <stdlib.h>
28#endif
29#ifdef HAVE_STRING_H
30#include <string.h>
31#endif
32
33
34#include <libxml/xmlreader.h>
35
36int debug = 0;
37int dump = 0;
38int noent = 0;
39int count = 0;
40
41static void usage(const char *progname) {
42 printf("Usage : %s [options] XMLfiles ...\n", progname);
43 printf("\tParse the XML files using the xmlTextReader API\n");
44 printf("\tand output the result of the parsing\n");
45 exit(1);
46}
47static int elem, attrs;
48
49static void processNode(xmlTextReaderPtr reader) {
50 int type;
51
52 type = xmlTextReaderNodeType(reader);
53 if (count) {
54 if (type == 1) {
55 elem++;
56 attrs += xmlTextReaderAttributeCount(reader);
57 }
58 } else {
59 xmlChar *name = xmlTextReaderName(reader);
60 if (name != NULL) {
61 printf("%s : %d", name, xmlTextReaderNodeType(reader));
62 xmlFree(name);
63 } else {
64 printf("NULL: %d", xmlTextReaderNodeType(reader));
65 }
66 if (xmlTextReaderIsEmptyElement(reader))
67 printf(" empty");
68 printf("\n");
69 }
70}
71
72static void handleFile(const char *filename) {
73 xmlTextReaderPtr reader;
74 int ret;
75
76 if (count) {
77 elem = 0;
78 attrs = 0;
79 }
80
81 reader = xmlNewTextReaderFilename(filename);
82 if (reader != NULL) {
83 /*
84 * Process all nodes in sequence
85 */
86 ret = xmlTextReaderRead(reader);
87 while (ret == 1) {
88 processNode(reader);
89 ret = xmlTextReaderRead(reader);
90 }
91
92 /*
93 * Done, cleanup and status
94 */
95 xmlFreeTextReader(reader);
96 if (ret != 0) {
97 printf("%s : failed to parse\n", filename);
98 } else if (count)
99 printf("%s : %d elements, %d attributes\n", filename, elem, attrs);
100 } else {
101 fprintf(stderr, "Unable to open %s\n", filename);
102 }
103}
104
105int main(int argc, char **argv) {
106 int i;
107 int files = 0;
108
109 if (argc <= 1) {
110 usage(argv[0]);
111 return(1);
112 }
113 LIBXML_TEST_VERSION
114 for (i = 1; i < argc ; i++) {
115 if ((!strcmp(argv[i], "-debug")) || (!strcmp(argv[i], "--debug")))
116 debug++;
117 else if ((!strcmp(argv[i], "-dump")) || (!strcmp(argv[i], "--dump")))
118 dump++;
119 else if ((!strcmp(argv[i], "-count")) || (!strcmp(argv[i], "--count")))
120 count++;
121 else if ((!strcmp(argv[i], "-noent")) ||
122 (!strcmp(argv[i], "--noent")))
123 noent++;
124 }
125 if (noent != 0) xmlSubstituteEntitiesDefault(1);
126 for (i = 1; i < argc ; i++) {
127 if (argv[i][0] != '-') {
128 handleFile(argv[i]);
129 files ++;
130 }
131 }
132 xmlCleanupParser();
133 xmlMemoryDump();
134
135 return(0);
136}