summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--render/hubbub_binding.c163
1 files changed, 85 insertions, 78 deletions
diff --git a/render/hubbub_binding.c b/render/hubbub_binding.c
index be90ef522..3bab8f260 100644
--- a/render/hubbub_binding.c
+++ b/render/hubbub_binding.c
@@ -73,26 +73,32 @@ static struct {
static inline char *c_string_from_hubbub_string(hubbub_ctx *ctx,
const hubbub_string *str);
static void create_namespaces(hubbub_ctx *ctx, xmlNode *root);
-static int create_comment(void *ctx, const hubbub_string *data, void **result);
-static int create_doctype(void *ctx, const hubbub_doctype *doctype,
+static hubbub_error create_comment(void *ctx, const hubbub_string *data,
void **result);
-static int create_element(void *ctx, const hubbub_tag *tag, void **result);
-static int create_text(void *ctx, const hubbub_string *data, void **result);
-static int ref_node(void *ctx, void *node);
-static int unref_node(void *ctx, void *node);
-static int append_child(void *ctx, void *parent, void *child, void **result);
-static int insert_before(void *ctx, void *parent, void *child, void *ref_child,
+static hubbub_error create_doctype(void *ctx, const hubbub_doctype *doctype,
void **result);
-static int remove_child(void *ctx, void *parent, void *child, void **result);
-static int clone_node(void *ctx, void *node, bool deep, void **result);
-static int reparent_children(void *ctx, void *node, void *new_parent);
-static int get_parent(void *ctx, void *node, bool element_only, void **result);
-static int has_children(void *ctx, void *node, bool *result);
-static int form_associate(void *ctx, void *form, void *node);
-static int add_attributes(void *ctx, void *node,
+static hubbub_error create_element(void *ctx, const hubbub_tag *tag,
+ void **result);
+static hubbub_error create_text(void *ctx, const hubbub_string *data,
+ void **result);
+static hubbub_error ref_node(void *ctx, void *node);
+static hubbub_error unref_node(void *ctx, void *node);
+static hubbub_error append_child(void *ctx, void *parent, void *child,
+ void **result);
+static hubbub_error insert_before(void *ctx, void *parent, void *child,
+ void *ref_child, void **result);
+static hubbub_error remove_child(void *ctx, void *parent, void *child,
+ void **result);
+static hubbub_error clone_node(void *ctx, void *node, bool deep, void **result);
+static hubbub_error reparent_children(void *ctx, void *node, void *new_parent);
+static hubbub_error get_parent(void *ctx, void *node, bool element_only,
+ void **result);
+static hubbub_error has_children(void *ctx, void *node, bool *result);
+static hubbub_error form_associate(void *ctx, void *form, void *node);
+static hubbub_error add_attributes(void *ctx, void *node,
const hubbub_attribute *attributes, uint32_t n_attributes);
-static int set_quirks_mode(void *ctx, hubbub_quirks_mode mode);
-static int change_encoding(void *ctx, const char *charset);
+static hubbub_error set_quirks_mode(void *ctx, hubbub_quirks_mode mode);
+static hubbub_error change_encoding(void *ctx, const char *charset);
static struct form *parse_form_element(xmlNode *node, const char *docenc);
static struct form_control *parse_input_element(xmlNode *node);
@@ -304,7 +310,7 @@ void create_namespaces(hubbub_ctx *ctx, xmlNode *root)
}
}
-int create_comment(void *ctx, const hubbub_string *data, void **result)
+hubbub_error create_comment(void *ctx, const hubbub_string *data, void **result)
{
hubbub_ctx *c = (hubbub_ctx *) ctx;
char *content;
@@ -312,12 +318,12 @@ int create_comment(void *ctx, const hubbub_string *data, void **result)
content = c_string_from_hubbub_string(c, data);
if (content == NULL)
- return 1;
+ return HUBBUB_NOMEM;
n = xmlNewDocComment(c->document, BAD_CAST content);
if (n == NULL) {
free(content);
- return 1;
+ return HUBBUB_NOMEM;
}
n->_private = (void *) (uintptr_t) 1;
@@ -325,10 +331,11 @@ int create_comment(void *ctx, const hubbub_string *data, void **result)
*result = (void *) n;
- return 0;
+ return HUBBUB_OK;
}
-int create_doctype(void *ctx, const hubbub_doctype *doctype, void **result)
+hubbub_error create_doctype(void *ctx, const hubbub_doctype *doctype,
+ void **result)
{
hubbub_ctx *c = (hubbub_ctx *) ctx;
char *name, *public = NULL, *system = NULL;
@@ -336,13 +343,13 @@ int create_doctype(void *ctx, const hubbub_doctype *doctype, void **result)
name = c_string_from_hubbub_string(c, &doctype->name);
if (name == NULL)
- return 1;
+ return HUBBUB_NOMEM;
if (!doctype->public_missing) {
public = c_string_from_hubbub_string(c, &doctype->public_id);
if (public == NULL) {
free(name);
- return 1;
+ return HUBBUB_NOMEM;
}
}
@@ -351,7 +358,7 @@ int create_doctype(void *ctx, const hubbub_doctype *doctype, void **result)
if (system == NULL) {
free(public);
free(name);
- return 1;
+ return HUBBUB_NOMEM;
}
}
@@ -362,7 +369,7 @@ int create_doctype(void *ctx, const hubbub_doctype *doctype, void **result)
free(system);
free(public);
free(name);
- return 1;
+ return HUBBUB_NOMEM;
}
n->_private = (void *) (uintptr_t) 1;
@@ -372,10 +379,10 @@ int create_doctype(void *ctx, const hubbub_doctype *doctype, void **result)
free(public);
free(name);
- return 0;
+ return HUBBUB_OK;
}
-int create_element(void *ctx, const hubbub_tag *tag, void **result)
+hubbub_error create_element(void *ctx, const hubbub_tag *tag, void **result)
{
hubbub_ctx *c = (hubbub_ctx *) ctx;
char *name;
@@ -383,7 +390,7 @@ int create_element(void *ctx, const hubbub_tag *tag, void **result)
name = c_string_from_hubbub_string(c, &tag->name);
if (name == NULL)
- return 1;
+ return HUBBUB_NOMEM;
if (c->namespaces[0] != NULL) {
n = xmlNewDocNode(c->document, c->namespaces[tag->ns - 1],
@@ -401,15 +408,15 @@ int create_element(void *ctx, const hubbub_tag *tag, void **result)
}
if (n == NULL) {
free(name);
- return 1;
+ return HUBBUB_NOMEM;
}
n->_private = (void *) (uintptr_t) 1;
if (tag->n_attributes > 0 && add_attributes(ctx, (void *) n,
- tag->attributes, tag->n_attributes) != 0) {
+ tag->attributes, tag->n_attributes) != HUBBUB_OK) {
xmlFreeNode(n);
free(name);
- return 1;
+ return HUBBUB_NOMEM;
}
if (strcasecmp(name, "form") == 0) {
@@ -419,7 +426,7 @@ int create_element(void *ctx, const hubbub_tag *tag, void **result)
if (form == NULL) {
xmlFreeNode(n);
free(name);
- return 1;
+ return HUBBUB_NOMEM;
}
/* Insert into list */
@@ -431,26 +438,26 @@ int create_element(void *ctx, const hubbub_tag *tag, void **result)
free(name);
- return 0;
+ return HUBBUB_OK;
}
-int create_text(void *ctx, const hubbub_string *data, void **result)
+hubbub_error create_text(void *ctx, const hubbub_string *data, void **result)
{
hubbub_ctx *c = (hubbub_ctx *) ctx;
xmlNodePtr n;
n = xmlNewDocTextLen(c->document, BAD_CAST data->ptr, (int) data->len);
if (n == NULL) {
- return 1;
+ return HUBBUB_NOMEM;
}
n->_private = (void *) (uintptr_t) 1;
*result = (void *) n;
- return 0;
+ return HUBBUB_OK;
}
-int ref_node(void *ctx, void *node)
+hubbub_error ref_node(void *ctx, void *node)
{
hubbub_ctx *c = (hubbub_ctx *) ctx;
@@ -466,10 +473,10 @@ int ref_node(void *ctx, void *node)
n->_private = (void *) ++count;
}
- return 0;
+ return HUBBUB_OK;
}
-int unref_node(void *ctx, void *node)
+hubbub_error unref_node(void *ctx, void *node)
{
hubbub_ctx *c = (hubbub_ctx *) ctx;
@@ -493,10 +500,10 @@ int unref_node(void *ctx, void *node)
}
}
- return 0;
+ return HUBBUB_OK;
}
-int append_child(void *ctx, void *parent, void *child, void **result)
+hubbub_error append_child(void *ctx, void *parent, void *child, void **result)
{
xmlNode *chld = (xmlNode *) child;
xmlNode *p = (xmlNode *) parent;
@@ -514,7 +521,7 @@ int append_child(void *ctx, void *parent, void *child, void **result)
* merges the content with a pre-existing text node. */
chld = xmlCopyNode(chld, 0);
if (chld == NULL)
- return 1;
+ return HUBBUB_NOMEM;
*result = xmlAddChild(p, chld);
@@ -524,15 +531,15 @@ int append_child(void *ctx, void *parent, void *child, void **result)
}
if (*result == NULL)
- return 1;
+ return HUBBUB_NOMEM;
ref_node(ctx, *result);
- return 0;
+ return HUBBUB_OK;
}
-int insert_before(void *ctx, void *parent, void *child, void *ref_child,
- void **result)
+hubbub_error insert_before(void *ctx, void *parent, void *child,
+ void *ref_child, void **result)
{
xmlNode *chld = (xmlNode *) child;
xmlNode *ref = (xmlNode *) ref_child;
@@ -542,7 +549,7 @@ int insert_before(void *ctx, void *parent, void *child, void *ref_child,
/* Clone text node, as it'll be freed by libxml */
chld = xmlCopyNode(chld, 0);
if (chld == NULL)
- return 1;
+ return HUBBUB_NOMEM;
*result = xmlAddNextSibling(ref->prev, chld);
@@ -552,14 +559,14 @@ int insert_before(void *ctx, void *parent, void *child, void *ref_child,
}
if (*result == NULL)
- return 1;
+ return HUBBUB_NOMEM;
ref_node(ctx, *result);
- return 0;
+ return HUBBUB_OK;
}
-int remove_child(void *ctx, void *parent, void *child, void **result)
+hubbub_error remove_child(void *ctx, void *parent, void *child, void **result)
{
xmlNode *chld = (xmlNode *) child;
@@ -569,24 +576,24 @@ int remove_child(void *ctx, void *parent, void *child, void **result)
ref_node(ctx, *result);
- return 0;
+ return HUBBUB_OK;
}
-int clone_node(void *ctx, void *node, bool deep, void **result)
+hubbub_error clone_node(void *ctx, void *node, bool deep, void **result)
{
xmlNode *n = (xmlNode *) node;
*result = xmlCopyNode(n, deep ? 1 : 2);
if (*result == NULL)
- return 1;
+ return HUBBUB_NOMEM;
((xmlNode *)(*result))->_private = (void *) (uintptr_t) 1;
- return 0;
+ return HUBBUB_OK;
}
-int reparent_children(void *ctx, void *node, void *new_parent)
+hubbub_error reparent_children(void *ctx, void *node, void *new_parent)
{
xmlNode *n = (xmlNode *) node;
xmlNode *p = (xmlNode *) new_parent;
@@ -598,15 +605,15 @@ int reparent_children(void *ctx, void *node, void *new_parent)
xmlUnlinkNode(child);
if (xmlAddChild(p, child) == NULL)
- return 1;
+ return HUBBUB_NOMEM;
child = next;
}
- return 0;
+ return HUBBUB_OK;
}
-int get_parent(void *ctx, void *node, bool element_only, void **result)
+hubbub_error get_parent(void *ctx, void *node, bool element_only, void **result)
{
xmlNode *n = (xmlNode *) node;
@@ -620,19 +627,19 @@ int get_parent(void *ctx, void *node, bool element_only, void **result)
if (*result != NULL)
ref_node(ctx, *result);
- return 0;
+ return HUBBUB_OK;
}
-int has_children(void *ctx, void *node, bool *result)
+hubbub_error has_children(void *ctx, void *node, bool *result)
{
xmlNode *n = (xmlNode *) node;
*result = n->children != NULL;
- return 0;
+ return HUBBUB_OK;
}
-int form_associate(void *ctx, void *form, void *node)
+hubbub_error form_associate(void *ctx, void *form, void *node)
{
hubbub_ctx *c = (hubbub_ctx *) ctx;
xmlNode *n = (xmlNode *) node;
@@ -667,7 +674,7 @@ int form_associate(void *ctx, void *form, void *node)
/* None found -- give up */
if (f == NULL)
- return 0;
+ return HUBBUB_OK;
/* Will be one of: button, fieldset, input, label,
* output, select, textarea.
@@ -683,19 +690,19 @@ int form_associate(void *ctx, void *form, void *node)
} else if (strcasecmp((const char *) n->name, "textarea") == 0) {
control = parse_textarea_element(n);
} else
- return 0;
+ return HUBBUB_OK;
/* Memory exhaustion */
if (control == NULL)
- return 1;
+ return HUBBUB_NOMEM;
/* Add the control to the form */
form_add_control(f, control);
- return 0;
+ return HUBBUB_OK;
}
-int add_attributes(void *ctx, void *node,
+hubbub_error add_attributes(void *ctx, void *node,
const hubbub_attribute *attributes, uint32_t n_attributes)
{
hubbub_ctx *c = (hubbub_ctx *) ctx;
@@ -708,12 +715,12 @@ int add_attributes(void *ctx, void *node,
name = c_string_from_hubbub_string(c, &attributes[attr].name);
if (name == NULL)
- return 1;
+ return HUBBUB_NOMEM;
value = c_string_from_hubbub_string(c, &attributes[attr].value);
if (value == NULL) {
free(name);
- return 1;
+ return HUBBUB_NOMEM;
}
if (attributes[attr].ns != HUBBUB_NS_NULL &&
@@ -727,22 +734,22 @@ int add_attributes(void *ctx, void *node,
if (prop == NULL) {
free(value);
free(name);
- return 1;
+ return HUBBUB_NOMEM;
}
free(value);
free(name);
}
- return 0;
+ return HUBBUB_OK;
}
-int set_quirks_mode(void *ctx, hubbub_quirks_mode mode)
+hubbub_error set_quirks_mode(void *ctx, hubbub_quirks_mode mode)
{
- return 0;
+ return HUBBUB_OK;
}
-int change_encoding(void *ctx, const char *charset)
+hubbub_error change_encoding(void *ctx, const char *charset)
{
hubbub_ctx *c = (hubbub_ctx *) ctx;
uint32_t source;
@@ -750,7 +757,7 @@ int change_encoding(void *ctx, const char *charset)
/* If we have an encoding here, it means we are *certain* */
if (c->encoding != NULL) {
- return 0;
+ return HUBBUB_OK;
}
/* Find the confidence otherwise (can only be from a BOM) */
@@ -759,7 +766,7 @@ int change_encoding(void *ctx, const char *charset)
if (source == HUBBUB_CHARSET_CONFIDENT) {
c->encoding_source = ENCODING_SOURCE_DETECTED;
c->encoding = (char *) charset;
- return 0;
+ return HUBBUB_OK;
}
/* So here we have something of confidence tentative... */
@@ -776,7 +783,7 @@ int change_encoding(void *ctx, const char *charset)
c->encoding_source = ENCODING_SOURCE_META;
/* Equal encodings will have the same string pointers */
- return (charset == name) ? 0 : 1;
+ return (charset == name) ? HUBBUB_OK : HUBBUB_ENCODINGCHANGE;
}
struct form *parse_form_element(xmlNode *node, const char *docenc)