]>
Commit | Line | Data |
---|---|---|
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 | } |