summaryrefslogtreecommitdiff
path: root/utils
diff options
context:
space:
mode:
Diffstat (limited to 'utils')
-rw-r--r--utils/libdom.c82
-rw-r--r--utils/libdom.h14
2 files changed, 89 insertions, 7 deletions
diff --git a/utils/libdom.c b/utils/libdom.c
index 3b6cd15b1..ebb90eeb4 100644
--- a/utils/libdom.c
+++ b/utils/libdom.c
@@ -22,7 +22,6 @@
#include <assert.h>
#include <dom/dom.h>
-#include <dom/bindings/hubbub/parser.h>
#include "utils/config.h"
#include "utils/log.h"
@@ -254,6 +253,70 @@ void libdom_iterate_child_elements(dom_node *parent,
dom_nodelist_unref(children);
}
+/* exported interface documented in libdom.h */
+nserror libdom_hubbub_error_to_nserror(dom_hubbub_error error)
+{
+ switch (error) {
+
+ /* HUBBUB_REPROCESS is not handled here because it can
+ * never occur outside the hubbub treebuilder
+ */
+
+ case DOM_HUBBUB_OK:
+ /* parsed ok */
+ return NSERROR_OK;
+
+ case (DOM_HUBBUB_HUBBUB_ERR | HUBBUB_PAUSED):
+ /* hubbub input paused */
+ return NSERROR_OK;
+
+ case DOM_HUBBUB_NOMEM:
+ /* out of memory error from DOM */
+ return NSERROR_NOMEM;
+
+ case DOM_HUBBUB_BADPARM:
+ /* Bad parameter passed to creation */
+ return NSERROR_BAD_PARAMETER;
+
+ case DOM_HUBBUB_DOM:
+ /* DOM call returned error */
+ return NSERROR_DOM;
+
+ case (DOM_HUBBUB_HUBBUB_ERR | HUBBUB_ENCODINGCHANGE):
+ /* encoding changed */
+ return NSERROR_ENCODING_CHANGE;
+
+ case (DOM_HUBBUB_HUBBUB_ERR | HUBBUB_NOMEM):
+ /* out of memory error from parser */
+ return NSERROR_NOMEM;
+
+ case (DOM_HUBBUB_HUBBUB_ERR | HUBBUB_BADPARM):
+ return NSERROR_BAD_PARAMETER;
+
+ case (DOM_HUBBUB_HUBBUB_ERR | HUBBUB_INVALID):
+ return NSERROR_INVALID;
+
+ case (DOM_HUBBUB_HUBBUB_ERR | HUBBUB_FILENOTFOUND):
+ return NSERROR_NOT_FOUND;
+
+ case (DOM_HUBBUB_HUBBUB_ERR | HUBBUB_NEEDDATA):
+ return NSERROR_NEED_DATA;
+
+ case (DOM_HUBBUB_HUBBUB_ERR | HUBBUB_BADENCODING):
+ return NSERROR_BAD_ENCODING;
+
+ case (DOM_HUBBUB_HUBBUB_ERR | HUBBUB_UNKNOWN):
+ /* currently only generated by the libdom hubbub binding */
+ return NSERROR_DOM;
+ default:
+ /* unknown error */
+ /** @todo better error handling and reporting */
+ return NSERROR_UNKNOWN;
+ }
+ return NSERROR_UNKNOWN;
+}
+
+
static void ignore_dom_msg(uint32_t severity, void *ctx, const char *msg, ...)
{
}
@@ -261,6 +324,7 @@ static void ignore_dom_msg(uint32_t severity, void *ctx, const char *msg, ...)
/* exported interface documented in libdom.h */
nserror libdom_parse_file(const char *filename, const char *encoding, dom_document **doc)
{
+ dom_hubbub_parser_params parse_params;
dom_hubbub_error error;
dom_hubbub_parser *parser;
dom_document *document;
@@ -273,11 +337,17 @@ nserror libdom_parse_file(const char *filename, const char *encoding, dom_docume
return NSERROR_NOT_FOUND;
}
- parser = dom_hubbub_parser_create(encoding, false, false,
- ignore_dom_msg, NULL, NULL, &document);
- if (parser == NULL) {
+ parse_params.enc = encoding;
+ parse_params.fix_enc = false;
+ parse_params.enable_script = false;
+ parse_params.msg = ignore_dom_msg;
+ parse_params.script = NULL;
+ parse_params.ctx = NULL;
+
+ error = dom_hubbub_parser_create(&parse_params, &parser, &document);
+ if (error != DOM_HUBBUB_OK) {
fclose(fp);
- return NSERROR_DOM;
+ return libdom_hubbub_error_to_nserror(error);
}
while (feof(fp) == 0) {
@@ -297,7 +367,7 @@ nserror libdom_parse_file(const char *filename, const char *encoding, dom_docume
dom_node_unref(document);
dom_hubbub_parser_destroy(parser);
fclose(fp);
- return NSERROR_DOM;
+ return libdom_hubbub_error_to_nserror(error);
}
dom_hubbub_parser_destroy(parser);
diff --git a/utils/libdom.h b/utils/libdom.h
index d79c92d81..36caf01bf 100644
--- a/utils/libdom.h
+++ b/utils/libdom.h
@@ -28,7 +28,11 @@
#include <dom/dom.h>
-/* depth-first walk the dom calling callback for each element
+#include <dom/bindings/hubbub/parser.h>
+#include <dom/bindings/hubbub/errors.h>
+
+/**
+ * depth-first walk the dom calling callback for each element
*
* \param root the dom node to use as the root of the tree walk
* \return true if all nodes were examined, false if the callback terminated
@@ -65,4 +69,12 @@ void libdom_iterate_child_elements(dom_node *parent,
nserror libdom_parse_file(const char *filename, const char *encoding,
dom_document **doc);
+/**
+ * Convert libdom hubbub binding errors to nserrors.
+ *
+ * \param error The hubbub binding error to convert
+ * \return The appropriate nserror
+ */
+nserror libdom_hubbub_error_to_nserror(dom_hubbub_error error);
+
#endif