From c34dc685f70193728ead525f59d56cdbf116f574 Mon Sep 17 00:00:00 2001 From: John Mark Bell Date: Sun, 4 Nov 2007 03:40:09 +0000 Subject: Make TestObject support both HTML and XML documents and auto-detect which parser to use. Make binding testcase attempt to load an HTML document. Hubbub parser binding constructor takes Aliases file path as a parameter. Hubbub parser binding's token handler now spews debug at stdout. svn path=/trunk/dom/; revision=3648 --- test/lib/testobject.c | 145 ++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 123 insertions(+), 22 deletions(-) (limited to 'test/lib') diff --git a/test/lib/testobject.c b/test/lib/testobject.c index 5a20770..a0ab835 100644 --- a/test/lib/testobject.c +++ b/test/lib/testobject.c @@ -5,11 +5,15 @@ * Copyright 2007 John-Mark Bell */ +#include #include #include +#include #include +#include "bindings/hubbub/parser.h" + #include "bindings/xml/xmlbinding.h" #include "bindings/xml/xmlparser.h" @@ -17,10 +21,14 @@ #include "testobject.h" #include "utils.h" -static bool xml_parser_initialised; +static bool parser_initialised; struct TestObject { - dom_xml_parser *parser; + enum { OBJECT_XML, OBJECT_HTML } type; + union { + dom_xml_parser *xml; + dom_hubbub_parser *html; + } parser; struct dom_document *doc; }; @@ -33,6 +41,7 @@ TestObject *test_object_create(int argc, char **argv, #define CHUNK_SIZE 4096 uint8_t buf[CHUNK_SIZE]; FILE *fp; + char *dot; size_t len; TestObject *ret; @@ -43,15 +52,18 @@ TestObject *test_object_create(int argc, char **argv, exit(EXIT_FAILURE); } - if (xml_parser_initialised == false) { + if (parser_initialised == false) { assert(dom_initialise(myrealloc, NULL) == DOM_NO_ERR); assert(dom_xml_binding_initialise(myrealloc, NULL) == DOM_XML_OK); +// assert(dom_hubbub_binding_initialise(myrealloc, NULL) == +// DOM_HUBBUB_OK); + atexit(test_object_cleanup); - xml_parser_initialised = true; + parser_initialised = true; } snprintf(fnbuf, sizeof fnbuf, "%s/%s", argv[1], uri); @@ -60,16 +72,67 @@ TestObject *test_object_create(int argc, char **argv, if (ret == NULL) return NULL; - ret->parser = dom_xml_parser_create(NULL, "UTF-8", myrealloc, NULL, - mymsg, NULL); - if (ret->parser == NULL) { - free(ret); - return NULL; + /* Detect the parser type (this is mildly hacky) */ + dot = strrchr(uri, '.'); + len = strlen(uri); + + if (dot == NULL) { + printf("No file extension, assuming XML\n"); + + ret->type = OBJECT_XML; + } else if (len - ((dot + 1) - uri) == 3) { + if (tolower(dot[1]) == 'x' && tolower(dot[2]) == 'm' + && tolower(dot[3]) == 'l') { + ret->type = OBJECT_XML; + } else if (tolower(dot[1]) == 'h' && tolower(dot[2]) == 't' && + tolower(dot[3]) == 'm') { + ret->type = OBJECT_HTML; + } + } else if (len - ((dot + 1) - uri) == 4) { + if (tolower(dot[1]) == 'h' && tolower(dot[2]) == 't' && + tolower(dot[3]) == 'm' && + tolower(dot[4]) == 'l') { + ret->type = OBJECT_HTML; + } + } else { + /* Assume XML */ + ret->type = OBJECT_XML; + } + + switch (ret->type) { + case OBJECT_XML: + ret->parser.xml = dom_xml_parser_create(NULL, "UTF-8", + myrealloc, NULL, mymsg, NULL); + if (ret->parser.xml == NULL) { + free(ret); + return NULL; + } + break; + case OBJECT_HTML: + { + char abuf[1024]; + snprintf(abuf, sizeof abuf, "%s/Aliases", argv[1]); + + ret->parser.html = dom_hubbub_parser_create(abuf, + NULL, "UTF-8", myrealloc, NULL, mymsg, NULL); + if (ret->parser.html == NULL) { + free(ret); + return NULL; + } + break; + } } fp = fopen(fnbuf, "r"); if (fp == NULL) { - dom_xml_parser_destroy(ret->parser); + switch (ret->type) { + case OBJECT_XML: + dom_xml_parser_destroy(ret->parser.xml); + break; + case OBJECT_HTML: + dom_hubbub_parser_destroy(ret->parser.html); + break; + } free(ret); return NULL; } @@ -81,8 +144,16 @@ TestObject *test_object_create(int argc, char **argv, while (len > CHUNK_SIZE) { fread(buf, 1, CHUNK_SIZE, fp); - assert(dom_xml_parser_parse_chunk(ret->parser, buf, - CHUNK_SIZE) == DOM_XML_OK); + switch (ret->type) { + case OBJECT_XML: + assert(dom_xml_parser_parse_chunk(ret->parser.xml, + buf, CHUNK_SIZE) == DOM_XML_OK); + break; + case OBJECT_HTML: + assert(dom_hubbub_parser_parse_chunk(ret->parser.html, + buf, CHUNK_SIZE) == DOM_HUBBUB_OK); + break; + } len -= CHUNK_SIZE; } @@ -90,20 +161,51 @@ TestObject *test_object_create(int argc, char **argv, if (len > 0) { fread(buf, 1, len, fp); - assert(dom_xml_parser_parse_chunk(ret->parser, buf, - len) == DOM_XML_OK); + switch (ret->type) { + case OBJECT_XML: + assert(dom_xml_parser_parse_chunk(ret->parser.xml, + buf, len) == DOM_XML_OK); + break; + case OBJECT_HTML: + assert(dom_hubbub_parser_parse_chunk(ret->parser.html, + buf, len) == DOM_HUBBUB_OK); + break; + } len = 0; } - assert(dom_xml_parser_completed(ret->parser) == DOM_XML_OK); + switch (ret->type) { + case OBJECT_XML: + assert(dom_xml_parser_completed(ret->parser.xml) == DOM_XML_OK); + break; + case OBJECT_HTML: + assert(dom_hubbub_parser_completed(ret->parser.html) == + DOM_HUBBUB_OK); + break; + } fclose(fp); - ret->doc = dom_xml_parser_get_document(ret->parser); + switch (ret->type) { + case OBJECT_XML: + ret->doc = dom_xml_parser_get_document(ret->parser.xml); + break; + case OBJECT_HTML: + ret->doc = dom_hubbub_parser_get_document(ret->parser.html); + break; + } - dom_xml_parser_destroy(ret->parser); - ret->parser = NULL; + switch (ret->type) { + case OBJECT_XML: + dom_xml_parser_destroy(ret->parser.xml); + ret->parser.xml = NULL; + break; + case OBJECT_HTML: + dom_hubbub_parser_destroy(ret->parser.html); + ret->parser.html = NULL; + break; + } return ret; @@ -117,14 +219,13 @@ struct dom_document *test_object_get_doc(TestObject *obj) const char *test_object_get_mimetype(TestObject *obj) { - UNUSED(obj); - - return "text/xml"; + return (obj->type == OBJECT_XML ? "text/xml" : "text/html"); } void test_object_cleanup(void) { - if (xml_parser_initialised) { + if (parser_initialised) { +// dom_hubbub_binding_finalise(); dom_xml_binding_finalise(); dom_finalise(); } -- cgit v1.2.3