diff --git a/testrecurse.c b/testrecurse.c index b37ddbeb..6694eedd 100644 --- a/testrecurse.c +++ b/testrecurse.c @@ -153,27 +153,41 @@ static void globfree(glob_t *pglob) { #include +typedef struct { + const char *URL; + const char *start; + const char *segment; + const char *finish; +} xmlHugeDocParts; -static const char *start = " \ - \ - \ - \ - \ - \ - \ - \ - \ -]> \ -"; +static const xmlHugeDocParts hugeDocTable[] = { + { + "test/recurse/huge.xml", -static const char *segment = - " &a; &b; &c; &e; &f; &d;\n" - " _123456789_123456789_123456789_123456789\n" - " _123456789_123456789_123456789_123456789\n" - " _123456789_123456789_123456789_123456789\n"; -static const char *finish = ""; + " " + " " + " " + " " + " " + " " + " " + " " + " " + "]> " + "", + " &a; &b; &c; &e; &f; &d;\n" + " _123456789_123456789_123456789_123456789\n" + " _123456789_123456789_123456789_123456789\n" + " _123456789_123456789_123456789_123456789\n", + + "" + }, + { NULL, NULL, NULL, NULL } +}; + +static const xmlHugeDocParts *hugeDocParts; static int curseg = 0; static const char *current; static int rlen; @@ -182,14 +196,22 @@ static int rlen; * hugeMatch: * @URI: an URI to test * - * Check for an huge.xml query + * Check for a huge query * * Returns 1 if yes and 0 if another Input module should be used */ static int hugeMatch(const char * URI) { - if ((URI != NULL) && (!strcmp(URI, "huge.xml"))) - return(1); + int i; + + if (URI == NULL) + return(0); + + for (i = 0; hugeDocTable[i].URL; i++) { + if (strcmp(URI, hugeDocTable[i].URL) == 0) + return(1); + } + return(0); } @@ -197,26 +219,36 @@ hugeMatch(const char * URI) { * hugeOpen: * @URI: an URI to test * - * Return a pointer to the huge.xml query handler, in this example simply + * Return a pointer to the huge query handler, in this example simply * the current pointer... * * Returns an Input context or NULL in case or error */ static void * hugeOpen(const char * URI) { - if ((URI == NULL) || (strcmp(URI, "huge.xml"))) + int i; + + if (URI == NULL) return(NULL); - curseg = 0; - rlen = strlen(start); - current = start; - return((void *) current); + + for (i = 0; hugeDocTable[i].URL; i++) { + if (strcmp(URI, hugeDocTable[i].URL) == 0) { + hugeDocParts = hugeDocTable + i; + curseg = 0; + current = hugeDocParts->start; + rlen = strlen(current); + return((void *) current); + } + } + + return(NULL); } /** * hugeClose: * @context: the read context * - * Close the huge.xml query handler + * Close the huge query handler * * Returns 0 or -1 in case of error */ @@ -234,7 +266,7 @@ hugeClose(void * context) { * @buffer: where to store data * @len: number of bytes to read * - * Implement an huge.xml query read. + * Implement an huge query read. * * Returns the number of bytes read or -1 in case of error */ @@ -254,12 +286,11 @@ hugeRead(void *context, char *buffer, int len) memcpy(buffer, current, len); curseg ++; if (curseg == MAX_NODES) { - rlen = strlen(finish); - current = finish; + current = hugeDocParts->finish; } else { - rlen = strlen(segment); - current = segment; + current = hugeDocParts->segment; } + rlen = strlen(current); } else { memcpy(buffer, current, len); rlen -= len; @@ -794,9 +825,9 @@ notRecursiveHugeTest(const char *filename ATTRIBUTE_UNUSED, initSAX(ctxt); if ((options & OPT_NO_SUBST) == 0) parserOptions |= XML_PARSE_NOENT; - doc = xmlCtxtReadFile(ctxt, "huge.xml", NULL, parserOptions); + doc = xmlCtxtReadFile(ctxt, "test/recurse/huge.xml", NULL, parserOptions); if (doc == NULL) { - fprintf(stderr, "Failed to parse huge.xml with entities\n"); + fprintf(stderr, "Failed to parse huge.xml\n"); res = 1; } else { xmlEntityPtr ent;