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