1 #include <sys/stat.h> |
|
2 #include <stdlib.h> |
|
3 #include <stdio.h> |
|
4 #include <time.h> |
|
5 #include "expat.h" |
|
6 |
|
7 #if defined(__amigaos__) && defined(__USE_INLINE__) |
|
8 #include <proto/expat.h> |
|
9 #endif |
|
10 |
|
11 #ifdef XML_LARGE_SIZE |
|
12 #define XML_FMT_INT_MOD "ll" |
|
13 #else |
|
14 #define XML_FMT_INT_MOD "l" |
|
15 #endif |
|
16 |
|
17 static void |
|
18 usage(const char *prog, int rc) |
|
19 { |
|
20 fprintf(stderr, |
|
21 "usage: %s [-n] filename bufferSize nr_of_loops\n", prog); |
|
22 exit(rc); |
|
23 } |
|
24 |
|
25 int main (int argc, char *argv[]) |
|
26 { |
|
27 XML_Parser parser; |
|
28 char *XMLBuf, *XMLBufEnd, *XMLBufPtr; |
|
29 FILE *fd; |
|
30 struct stat fileAttr; |
|
31 int nrOfLoops, bufferSize, fileSize, i, isFinal; |
|
32 int j = 0, ns = 0; |
|
33 clock_t tstart, tend; |
|
34 double cpuTime = 0.0; |
|
35 |
|
36 if (argc > 1) { |
|
37 if (argv[1][0] == '-') { |
|
38 if (argv[1][1] == 'n' && argv[1][2] == '\0') { |
|
39 ns = 1; |
|
40 j = 1; |
|
41 } |
|
42 else |
|
43 usage(argv[0], 1); |
|
44 } |
|
45 } |
|
46 |
|
47 if (argc != j + 4) |
|
48 usage(argv[0], 1); |
|
49 |
|
50 if (stat (argv[j + 1], &fileAttr) != 0) { |
|
51 fprintf (stderr, "could not access file '%s'\n", argv[j + 1]); |
|
52 return 2; |
|
53 } |
|
54 |
|
55 fd = fopen (argv[j + 1], "r"); |
|
56 if (!fd) { |
|
57 fprintf (stderr, "could not open file '%s'\n", argv[j + 1]); |
|
58 exit(2); |
|
59 } |
|
60 |
|
61 bufferSize = atoi (argv[j + 2]); |
|
62 nrOfLoops = atoi (argv[j + 3]); |
|
63 if (bufferSize <= 0 || nrOfLoops <= 0) { |
|
64 fprintf (stderr, |
|
65 "buffer size and nr of loops must be greater than zero.\n"); |
|
66 exit(3); |
|
67 } |
|
68 |
|
69 XMLBuf = malloc (fileAttr.st_size); |
|
70 fileSize = fread (XMLBuf, sizeof (char), fileAttr.st_size, fd); |
|
71 fclose (fd); |
|
72 |
|
73 if (ns) |
|
74 parser = XML_ParserCreateNS(NULL, '!'); |
|
75 else |
|
76 parser = XML_ParserCreate(NULL); |
|
77 |
|
78 i = 0; |
|
79 XMLBufEnd = XMLBuf + fileSize; |
|
80 while (i < nrOfLoops) { |
|
81 XMLBufPtr = XMLBuf; |
|
82 isFinal = 0; |
|
83 tstart = clock(); |
|
84 do { |
|
85 int parseBufferSize = XMLBufEnd - XMLBufPtr; |
|
86 if (parseBufferSize <= bufferSize) |
|
87 isFinal = 1; |
|
88 else |
|
89 parseBufferSize = bufferSize; |
|
90 if (!XML_Parse (parser, XMLBufPtr, parseBufferSize, isFinal)) { |
|
91 fprintf (stderr, "error '%s' at line %" XML_FMT_INT_MOD \ |
|
92 "u character %" XML_FMT_INT_MOD "u\n", |
|
93 XML_ErrorString (XML_GetErrorCode (parser)), |
|
94 XML_GetCurrentLineNumber (parser), |
|
95 XML_GetCurrentColumnNumber (parser)); |
|
96 free (XMLBuf); |
|
97 XML_ParserFree (parser); |
|
98 exit (4); |
|
99 } |
|
100 XMLBufPtr += bufferSize; |
|
101 } while (!isFinal); |
|
102 tend = clock(); |
|
103 cpuTime += ((double) (tend - tstart)) / CLOCKS_PER_SEC; |
|
104 XML_ParserReset(parser, NULL); |
|
105 i++; |
|
106 } |
|
107 |
|
108 XML_ParserFree (parser); |
|
109 free (XMLBuf); |
|
110 |
|
111 printf ("%d loops, with buffer size %d. Average time per loop: %f\n", |
|
112 nrOfLoops, bufferSize, cpuTime / (double) nrOfLoops); |
|
113 return 0; |
|
114 } |
|