summaryrefslogtreecommitdiff
path: root/src/html/html_document.c
diff options
context:
space:
mode:
authorMichael Drake <michael.drake@codethink.co.uk>2016-01-27 17:58:27 +0000
committerMichael Drake <michael.drake@codethink.co.uk>2016-01-27 17:58:27 +0000
commit9def0a44e12c1469e0e4af2881242f5f1df9b3a0 (patch)
tree1cc1a2e934354e75e609357d7627e16371a0e50c /src/html/html_document.c
parent410274173d434e34a5eb085d13228d68cd44d509 (diff)
parent5b6c1914915e4c6c1b69e4c56cd60705e40daff3 (diff)
downloadlibdom-9def0a44e12c1469e0e4af2881242f5f1df9b3a0.tar.gz
libdom-9def0a44e12c1469e0e4af2881242f5f1df9b3a0.tar.bz2
Merge branch 'tlsa/html-element-type'
Diffstat (limited to 'src/html/html_document.c')
-rw-r--r--src/html/html_document.c573
1 files changed, 464 insertions, 109 deletions
diff --git a/src/html/html_document.c b/src/html/html_document.c
index 096c84e..3d2a7f3 100644
--- a/src/html/html_document.c
+++ b/src/html/html_document.c
@@ -8,12 +8,16 @@
#include <assert.h>
#include <stdlib.h>
+#include <dom/html/html_elements.h>
+
#include "html/html_document.h"
#include "html/html_element.h"
#include "html/html_collection.h"
#include "html/html_html_element.h"
#include "html/html_head_element.h"
#include "html/html_body_element.h"
+#include "html/html_base_element.h"
+#include "html/html_div_element.h"
#include "html/html_link_element.h"
#include "html/html_title_element.h"
#include "html/html_meta_element.h"
@@ -134,10 +138,16 @@ dom_exception _dom_html_document_initialise(dom_html_document *doc,
error = DOM_NO_MEM_ERR;
goto out;
}
+ doc->elements = calloc(sizeof(dom_string *),
+ DOM_HTML_ELEMENT_TYPE__COUNT);
+ if (doc->elements == NULL) {
+ error = DOM_NO_MEM_ERR;
+ goto out;
+ }
-#define HTML_DOCUMENT_STRINGS_ACTION(attr,str) \
+#define HTML_DOCUMENT_STRINGS_ACTION(attr,str) \
error = dom_string_create_interned((const uint8_t *) #str, \
- SLEN(#str), &doc->memoised[hds_##attr]); \
+ SLEN(#str), &doc->memoised[hds_##attr]); \
if (error != DOM_NO_ERR) { \
goto out; \
}
@@ -145,15 +155,38 @@ dom_exception _dom_html_document_initialise(dom_html_document *doc,
#include "html_document_strings.h"
#undef HTML_DOCUMENT_STRINGS_ACTION
+#define DOM_HTML_ELEMENT_STRINGS_ENTRY(tag) \
+ error = dom_string_create_interned((const uint8_t *) #tag, \
+ SLEN(#tag), \
+ &doc->elements[DOM_HTML_ELEMENT_TYPE_##tag]); \
+ if (error != DOM_NO_ERR) { \
+ goto out; \
+ }
+
+#include <dom/html/html_elements.h>
+#undef DOM_HTML_ELEMENT_STRINGS_ENTRY
+
out:
- if (doc->memoised != NULL && error != DOM_NO_ERR) {
- for(sidx = 0; sidx < hds_COUNT; ++sidx) {
- if (doc->memoised[sidx] != NULL) {
- dom_string_unref(doc->memoised[sidx]);
+ if (error != DOM_NO_ERR) {
+ if (doc->memoised != NULL) {
+ for(sidx = 0; sidx < hds_COUNT; ++sidx) {
+ if (doc->memoised[sidx] != NULL) {
+ dom_string_unref(doc->memoised[sidx]);
+ }
}
+ free(doc->memoised);
+ doc->memoised = NULL;
+ }
+ if (doc->elements != NULL) {
+ for(sidx = 0; sidx < DOM_HTML_ELEMENT_TYPE__COUNT;
+ ++sidx) {
+ if (doc->elements[sidx] != NULL) {
+ dom_string_unref(doc->elements[sidx]);
+ }
+ }
+ free(doc->elements);
+ doc->elements = NULL;
}
- free(doc->memoised);
- doc->memoised = NULL;
}
return error;
}
@@ -184,6 +217,16 @@ bool _dom_html_document_finalise(dom_html_document *doc)
doc->memoised = NULL;
}
+ if (doc->elements != NULL) {
+ for(sidx = 0; sidx < DOM_HTML_ELEMENT_TYPE__COUNT; ++sidx) {
+ if (doc->elements[sidx] != NULL) {
+ dom_string_unref(doc->elements[sidx]);
+ }
+ }
+ free(doc->elements);
+ doc->elements = NULL;
+ }
+
return _dom_document_finalise(&doc->base);
}
@@ -205,186 +248,493 @@ dom_exception _dom_html_document_copy(dom_node_internal *old,
return DOM_NOT_SUPPORTED_ERR;
}
+/**
+ * Get html element type from an uppercased tag name string
+ *
+ * \param html The html document that the html element belongs to
+ * \param tag_name_upper Upper cased string containing tag name
+ */
+static inline dom_html_element_type _dom_html_document_get_element_type(
+ dom_html_document *html, dom_string *tag_name_upper)
+{
+ size_t len = dom_string_byte_length(tag_name_upper);
+
+ switch (len) {
+ case 1:
+ if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_P])) {
+ return DOM_HTML_ELEMENT_TYPE_P;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_A])) {
+ return DOM_HTML_ELEMENT_TYPE_A;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_Q])) {
+ return DOM_HTML_ELEMENT_TYPE_Q;
+ }
+ break;
+ case 2:
+ if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_H1])) {
+ return DOM_HTML_ELEMENT_TYPE_H1;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_H2])) {
+ return DOM_HTML_ELEMENT_TYPE_H2;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_H3])) {
+ return DOM_HTML_ELEMENT_TYPE_H3;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_H4])) {
+ return DOM_HTML_ELEMENT_TYPE_H4;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_H5])) {
+ return DOM_HTML_ELEMENT_TYPE_H5;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_H6])) {
+ return DOM_HTML_ELEMENT_TYPE_H6;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_HR])) {
+ return DOM_HTML_ELEMENT_TYPE_HR;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_DL])) {
+ return DOM_HTML_ELEMENT_TYPE_DL;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_UL])) {
+ return DOM_HTML_ELEMENT_TYPE_UL;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_OL])) {
+ return DOM_HTML_ELEMENT_TYPE_OL;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_LI])) {
+ return DOM_HTML_ELEMENT_TYPE_LI;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_TD])) {
+ return DOM_HTML_ELEMENT_TYPE_TD;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_TH])) {
+ return DOM_HTML_ELEMENT_TYPE_TH;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_TR])) {
+ return DOM_HTML_ELEMENT_TYPE_TR;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_BR])) {
+ return DOM_HTML_ELEMENT_TYPE_BR;
+ }
+ break;
+ case 3:
+ if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_DIV])) {
+ return DOM_HTML_ELEMENT_TYPE_DIV;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_PRE])) {
+ return DOM_HTML_ELEMENT_TYPE_PRE;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_DEL])) {
+ return DOM_HTML_ELEMENT_TYPE_DEL;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_INS])) {
+ return DOM_HTML_ELEMENT_TYPE_INS;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_IMG])) {
+ return DOM_HTML_ELEMENT_TYPE_IMG;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_COL])) {
+ return DOM_HTML_ELEMENT_TYPE_COL;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_MAP])) {
+ return DOM_HTML_ELEMENT_TYPE_MAP;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_DIR])) {
+ return DOM_HTML_ELEMENT_TYPE_DIR;
+ }
+ break;
+ case 4:
+ if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_HTML])) {
+ return DOM_HTML_ELEMENT_TYPE_HTML;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_HEAD])) {
+ return DOM_HTML_ELEMENT_TYPE_HEAD;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_META])) {
+ return DOM_HTML_ELEMENT_TYPE_META;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_BASE])) {
+ return DOM_HTML_ELEMENT_TYPE_BASE;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_BODY])) {
+ return DOM_HTML_ELEMENT_TYPE_BODY;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_FORM])) {
+ return DOM_HTML_ELEMENT_TYPE_FORM;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_LINK])) {
+ return DOM_HTML_ELEMENT_TYPE_LINK;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_MENU])) {
+ return DOM_HTML_ELEMENT_TYPE_MENU;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_FONT])) {
+ return DOM_HTML_ELEMENT_TYPE_FONT;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_AREA])) {
+ return DOM_HTML_ELEMENT_TYPE_AREA;
+ }
+ break;
+ case 5:
+ if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_TITLE])) {
+ return DOM_HTML_ELEMENT_TYPE_TITLE;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_INPUT])) {
+ return DOM_HTML_ELEMENT_TYPE_INPUT;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_FRAME])) {
+ return DOM_HTML_ELEMENT_TYPE_FRAME;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_THEAD])) {
+ return DOM_HTML_ELEMENT_TYPE_THEAD;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_TBODY])) {
+ return DOM_HTML_ELEMENT_TYPE_TBODY;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_TFOOT])) {
+ return DOM_HTML_ELEMENT_TYPE_TFOOT;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_TABLE])) {
+ return DOM_HTML_ELEMENT_TYPE_TABLE;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_STYLE])) {
+ return DOM_HTML_ELEMENT_TYPE_STYLE;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_LABEL])) {
+ return DOM_HTML_ELEMENT_TYPE_LABEL;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_PARAM])) {
+ return DOM_HTML_ELEMENT_TYPE_PARAM;
+ }
+ break;
+ case 6:
+ if (dom_string_isequal(tag_name_upper,html->elements[
+ DOM_HTML_ELEMENT_TYPE_BUTTON])) {
+ return DOM_HTML_ELEMENT_TYPE_BUTTON;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_OPTION])) {
+ return DOM_HTML_ELEMENT_TYPE_OPTION;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_SCRIPT])) {
+ return DOM_HTML_ELEMENT_TYPE_SCRIPT;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_IFRAME])) {
+ return DOM_HTML_ELEMENT_TYPE_IFRAME;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_LEGEND])) {
+ return DOM_HTML_ELEMENT_TYPE_LEGEND;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_SELECT])) {
+ return DOM_HTML_ELEMENT_TYPE_SELECT;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_OBJECT])) {
+ return DOM_HTML_ELEMENT_TYPE_OBJECT;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_APPLET])) {
+ return DOM_HTML_ELEMENT_TYPE_APPLET;
+ }
+ break;
+ case 7:
+ if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_CAPTION])) {
+ return DOM_HTML_ELEMENT_TYPE_CAPTION;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_ISINDEX])) {
+ return DOM_HTML_ELEMENT_TYPE_ISINDEX;
+ }
+ break;
+ case 8:
+ if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_TEXTAREA])) {
+ return DOM_HTML_ELEMENT_TYPE_TEXTAREA;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_OPTGROUP])) {
+ return DOM_HTML_ELEMENT_TYPE_OPTGROUP;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_BASEFONT])) {
+ return DOM_HTML_ELEMENT_TYPE_BASEFONT;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_FIELDSET])) {
+ return DOM_HTML_ELEMENT_TYPE_FIELDSET;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_COLGROUP])) {
+ return DOM_HTML_ELEMENT_TYPE_COLGROUP;
+ } else if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_FRAMESET])) {
+ return DOM_HTML_ELEMENT_TYPE_FRAMESET;
+ }
+ break;
+ case 10:
+ if (dom_string_isequal(tag_name_upper, html->elements[
+ DOM_HTML_ELEMENT_TYPE_BLOCKQUOTE])) {
+ return DOM_HTML_ELEMENT_TYPE_BLOCKQUOTE;
+ }
+ break;
+ }
+
+ return DOM_HTML_ELEMENT_TYPE__UNKNOWN;
+}
+
/* Overloaded methods inherited from super class */
/** Internal method to support both kinds of create method */
static dom_exception
-_dom_html_document_create_element_internal(dom_html_document *html,
- dom_string *in_tag_name,
- dom_string *namespace,
- dom_string *prefix,
- dom_html_element **result)
+_dom_html_document_create_element_internal(
+ dom_html_document *html,
+ dom_string *in_tag_name,
+ dom_string *namespace,
+ dom_string *prefix,
+ dom_html_element **result)
{
dom_exception exc;
dom_string *tag_name;
+ dom_html_element_type type;
exc = dom_string_toupper(in_tag_name, true, &tag_name);
if (exc != DOM_NO_ERR)
return exc;
- if (dom_string_caseless_isequal(tag_name, html->memoised[hds_HTML])) {
+ type = _dom_html_document_get_element_type(html, tag_name);
+
+ switch(type) {
+ case DOM_HTML_ELEMENT_TYPE__COUNT:
+ assert(type != DOM_HTML_ELEMENT_TYPE__COUNT);
+ break;
+ case DOM_HTML_ELEMENT_TYPE_HTML:
exc = _dom_html_html_element_create(html, namespace, prefix,
(dom_html_html_element **) result);
- } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_HEAD])) {
+ break;
+ case DOM_HTML_ELEMENT_TYPE_HEAD:
exc = _dom_html_head_element_create(html, namespace, prefix,
(dom_html_head_element **) result);
- } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_TITLE])) {
+ break;
+ case DOM_HTML_ELEMENT_TYPE_META:
+ exc = _dom_html_meta_element_create(html, namespace, prefix,
+ (dom_html_meta_element **) result);
+ break;
+ case DOM_HTML_ELEMENT_TYPE_BASE:
+ exc = _dom_html_base_element_create(html, namespace, prefix,
+ (dom_html_base_element **) result);
+ break;
+ case DOM_HTML_ELEMENT_TYPE_TITLE:
exc = _dom_html_title_element_create(html, namespace, prefix,
(dom_html_title_element **) result);
- } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_BODY])) {
+ break;
+ case DOM_HTML_ELEMENT_TYPE_BODY:
exc = _dom_html_body_element_create(html, namespace, prefix,
(dom_html_body_element **) result);
- } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_FORM])) {
+ break;
+ case DOM_HTML_ELEMENT_TYPE_DIV:
+ exc = _dom_html_div_element_create(html, namespace, prefix,
+ (dom_html_div_element **) result);
+ break;
+ case DOM_HTML_ELEMENT_TYPE_FORM:
exc = _dom_html_form_element_create(html, namespace, prefix,
(dom_html_form_element **) result);
- } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_LINK])) {
+ break;
+ case DOM_HTML_ELEMENT_TYPE_LINK:
exc = _dom_html_link_element_create(html, namespace, prefix,
(dom_html_link_element **) result);
- } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_BUTTON])) {
+ break;
+ case DOM_HTML_ELEMENT_TYPE_BUTTON:
exc = _dom_html_button_element_create(html, namespace, prefix,
(dom_html_button_element **) result);
- } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_INPUT])) {
+ break;
+ case DOM_HTML_ELEMENT_TYPE_INPUT:
exc = _dom_html_input_element_create(html, namespace, prefix,
(dom_html_input_element **) result);
- } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_TEXTAREA])) {
- exc = _dom_html_text_area_element_create(html, namespace, prefix,
- (dom_html_text_area_element **) result);
- } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_OPTGROUP])) {
- exc = _dom_html_opt_group_element_create(html, namespace, prefix,
- (dom_html_opt_group_element **) result);
- } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_OPTION])) {
+ break;
+ case DOM_HTML_ELEMENT_TYPE_TEXTAREA:
+ exc = _dom_html_text_area_element_create(html, namespace,
+ prefix, (dom_html_text_area_element **) result);
+ break;
+ case DOM_HTML_ELEMENT_TYPE_OPTGROUP:
+ exc = _dom_html_opt_group_element_create(html, namespace,
+ prefix, (dom_html_opt_group_element **) result);
+ break;
+ case DOM_HTML_ELEMENT_TYPE_OPTION:
exc = _dom_html_option_element_create(html, namespace, prefix,
(dom_html_option_element **) result);
- } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_SELECT])) {
+ break;
+ case DOM_HTML_ELEMENT_TYPE_SELECT:
exc = _dom_html_select_element_create(html, namespace, prefix,
(dom_html_select_element **) result);
- } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_HR])) {
+ break;
+ case DOM_HTML_ELEMENT_TYPE_HR:
exc = _dom_html_hr_element_create(html, namespace, prefix,
(dom_html_hr_element **) result);
- } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_DL])) {
+ break;
+ case DOM_HTML_ELEMENT_TYPE_DL:
exc = _dom_html_dlist_element_create(html, namespace, prefix,
(dom_html_dlist_element **) result);
- } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_DIRECTORY])) {
- exc = _dom_html_directory_element_create(html, namespace, prefix,
- (dom_html_directory_element **) result);
- } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_MENU])) {
+ break;
+ case DOM_HTML_ELEMENT_TYPE_DIR:
+ exc = _dom_html_directory_element_create(html, namespace,
+ prefix, (dom_html_directory_element **) result);
+ break;
+ case DOM_HTML_ELEMENT_TYPE_MENU:
exc = _dom_html_menu_element_create(html, namespace, prefix,
(dom_html_menu_element **) result);
- } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_FIELDSET])) {
- exc = _dom_html_field_set_element_create(html, namespace, prefix,
- (dom_html_field_set_element **) result);
- } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_LEGEND])) {
+ break;
+ case DOM_HTML_ELEMENT_TYPE_FIELDSET:
+ exc = _dom_html_field_set_element_create(html, namespace,
+ prefix, (dom_html_field_set_element **) result);
+ break;
+ case DOM_HTML_ELEMENT_TYPE_LEGEND:
exc = _dom_html_legend_element_create(html, namespace, prefix,
(dom_html_legend_element **) result);
- } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_P])) {
- exc = _dom_html_paragraph_element_create(html, namespace, prefix,
- (dom_html_paragraph_element **) result);
- } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_H1]) ||
- dom_string_caseless_isequal(tag_name, html->memoised[hds_H2]) ||
- dom_string_caseless_isequal(tag_name, html->memoised[hds_H3]) ||
- dom_string_caseless_isequal(tag_name, html->memoised[hds_H4]) ||
- dom_string_caseless_isequal(tag_name, html->memoised[hds_H5]) ||
- dom_string_caseless_isequal(tag_name, html->memoised[hds_H6])
- ) {
- exc = _dom_html_heading_element_create(html, tag_name, namespace, prefix,
+ break;
+ case DOM_HTML_ELEMENT_TYPE_P:
+ exc = _dom_html_paragraph_element_create(html, namespace,
+ prefix, (dom_html_paragraph_element **) result);
+ break;
+ case DOM_HTML_ELEMENT_TYPE_H1:
+ case DOM_HTML_ELEMENT_TYPE_H2:
+ case DOM_HTML_ELEMENT_TYPE_H3:
+ case DOM_HTML_ELEMENT_TYPE_H4:
+ case DOM_HTML_ELEMENT_TYPE_H5:
+ case DOM_HTML_ELEMENT_TYPE_H6:
+ exc = _dom_html_heading_element_create(html, tag_name,
+ namespace, prefix,
(dom_html_heading_element **) result);
- } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_Q])) {
+ break;
+ case DOM_HTML_ELEMENT_TYPE_BLOCKQUOTE:
+ case DOM_HTML_ELEMENT_TYPE_Q:
exc = _dom_html_quote_element_create(html, namespace, prefix,
(dom_html_quote_element **) result);
- } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_PRE])) {
+ break;
+ case DOM_HTML_ELEMENT_TYPE_PRE:
exc = _dom_html_pre_element_create(html, namespace, prefix,
(dom_html_pre_element **) result);
- } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_BR])) {
+ break;
+ case DOM_HTML_ELEMENT_TYPE_BR:
exc = _dom_html_br_element_create(html, namespace, prefix,
(dom_html_br_element **) result);
- } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_LABEL])) {
+ break;
+ case DOM_HTML_ELEMENT_TYPE_LABEL:
exc = _dom_html_label_element_create(html, namespace, prefix,
(dom_html_label_element **) result);
- } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_UL])) {
+ break;
+ case DOM_HTML_ELEMENT_TYPE_UL:
exc = _dom_html_u_list_element_create(html, namespace, prefix,
(dom_html_u_list_element **) result);
- } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_OL])) {
+ break;
+ case DOM_HTML_ELEMENT_TYPE_OL:
exc = _dom_html_olist_element_create(html, namespace, prefix,
(dom_html_olist_element **) result);
- } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_LI])) {
+ break;
+ case DOM_HTML_ELEMENT_TYPE_LI:
exc = _dom_html_li_element_create(html, namespace, prefix,
(dom_html_li_element **) result);
- } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_FONT])) {
+ break;
+ case DOM_HTML_ELEMENT_TYPE_FONT:
exc = _dom_html_font_element_create(html, namespace, prefix,
(dom_html_font_element **) result);
- } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_DEL]) ||
- dom_string_caseless_isequal(tag_name, html->memoised[hds_INS])) {
+ break;
+ case DOM_HTML_ELEMENT_TYPE_DEL:
+ case DOM_HTML_ELEMENT_TYPE_INS:
exc = _dom_html_mod_element_create(html, tag_name, namespace,
prefix, (dom_html_mod_element **) result);
- } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_A])) {
+ break;
+ case DOM_HTML_ELEMENT_TYPE_A:
exc = _dom_html_anchor_element_create(html, namespace, prefix,
(dom_html_anchor_element **) result);
- } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_BASEFONT])) {
- exc = _dom_html_base_font_element_create(html, namespace, prefix,
+ break;
+ case DOM_HTML_ELEMENT_TYPE_BASEFONT:
+ exc = _dom_html_base_font_element_create(html,
+ namespace, prefix,
(dom_html_base_font_element **) result);
- } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_IMG])) {
+ break;
+ case DOM_HTML_ELEMENT_TYPE_IMG:
exc = _dom_html_image_element_create(html, namespace, prefix,
(dom_html_image_element **) result);
- } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_OBJECT])) {
+ break;
+ case DOM_HTML_ELEMENT_TYPE_OBJECT:
exc = _dom_html_object_element_create(html, namespace, prefix,
(dom_html_object_element **) result);
- } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_PARAM])) {
+ break;
+ case DOM_HTML_ELEMENT_TYPE_PARAM:
exc = _dom_html_param_element_create(html, namespace, prefix,
(dom_html_param_element **) result);
- } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_APPLET])) {
+ break;
+ case DOM_HTML_ELEMENT_TYPE_APPLET:
exc = _dom_html_applet_element_create(html, namespace, prefix,
(dom_html_applet_element **) result);
- } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_MAP])) {
+ break;
+ case DOM_HTML_ELEMENT_TYPE_MAP:
exc = _dom_html_map_element_create(html, namespace, prefix,
(dom_html_map_element **) result);
- } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_AREA])) {
+ break;
+ case DOM_HTML_ELEMENT_TYPE_AREA:
exc = _dom_html_area_element_create(html, namespace, prefix,
(dom_html_area_element **) result);
- } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_SCRIPT])) {
+ break;
+ case DOM_HTML_ELEMENT_TYPE_SCRIPT:
exc = _dom_html_script_element_create(html, namespace, prefix,
(dom_html_script_element **) result);
- } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_CAPTION])) {
- exc = _dom_html_table_caption_element_create(html, namespace, prefix,
+ break;
+ case DOM_HTML_ELEMENT_TYPE_CAPTION:
+ exc = _dom_html_table_caption_element_create(html,
+ namespace, prefix,
(dom_html_table_caption_element **) result);
- } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_TD]) ||
- dom_string_caseless_isequal(tag_name, html->memoised[hds_TH])
- ) {
- exc = _dom_html_table_cell_element_create(html, tag_name, namespace, prefix,
+ break;
+ case DOM_HTML_ELEMENT_TYPE_TD:
+ case DOM_HTML_ELEMENT_TYPE_TH:
+ exc = _dom_html_table_cell_element_create(html, tag_name,
+ namespace, prefix,
(dom_html_table_cell_element **) result);
- } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_COL])||
- dom_string_caseless_isequal(tag_name, html->memoised[hds_COLGROUP])
- ) {
- exc = _dom_html_table_col_element_create(html, tag_name, namespace, prefix,
+ break;
+ case DOM_HTML_ELEMENT_TYPE_COL:
+ case DOM_HTML_ELEMENT_TYPE_COLGROUP:
+ exc = _dom_html_table_col_element_create(html, tag_name,
+ namespace, prefix,
(dom_html_table_col_element **) result);
- } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_THEAD])||
- dom_string_caseless_isequal(tag_name, html->memoised[hds_TBODY])||
- dom_string_caseless_isequal(tag_name, html->memoised[hds_TFOOT])) {
- exc = _dom_html_table_section_element_create(html, tag_name, namespace, prefix,
+ break;
+ case DOM_HTML_ELEMENT_TYPE_THEAD:
+ case DOM_HTML_ELEMENT_TYPE_TBODY:
+ case DOM_HTML_ELEMENT_TYPE_TFOOT:
+ exc = _dom_html_table_section_element_create(html, tag_name,
+ namespace, prefix,
(dom_html_table_section_element **) result);
- } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_TABLE])) {
+ break;
+ case DOM_HTML_ELEMENT_TYPE_TABLE:
exc = _dom_html_table_element_create(html, namespace, prefix,
(dom_html_table_element **) result);
- } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_TD])) {
- exc = _dom_html_table_row_element_create(html, namespace, prefix,
- (dom_html_table_row_element **) result);
- } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_STYLE])) {
+ break;
+ case DOM_HTML_ELEMENT_TYPE_TR:
+ exc = _dom_html_table_row_element_create(html, namespace,
+ prefix, (dom_html_table_row_element **) result);
+ break;
+ case DOM_HTML_ELEMENT_TYPE_STYLE:
exc = _dom_html_style_element_create(html,
(dom_html_style_element **) result);
- } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_FRAMESET])) {
- exc = _dom_html_frame_set_element_create(html, namespace, prefix,
- (dom_html_frame_set_element **) result);
- } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_FRAME])) {
+ break;
+ case DOM_HTML_ELEMENT_TYPE_FRAMESET:
+ exc = _dom_html_frame_set_element_create(html, namespace,
+ prefix, (dom_html_frame_set_element **) result);
+ break;
+ case DOM_HTML_ELEMENT_TYPE_FRAME:
exc = _dom_html_frame_element_create(html, namespace, prefix,
(dom_html_frame_element **) result);
- } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_IFRAME])) {
+ break;
+ case DOM_HTML_ELEMENT_TYPE_IFRAME:
exc = _dom_html_iframe_element_create(html, namespace, prefix,
(dom_html_iframe_element **) result);
- } else if (dom_string_caseless_isequal(tag_name, html->memoised[hds_ISINDEX])) {
+ break;
+ case DOM_HTML_ELEMENT_TYPE_ISINDEX:
exc = _dom_html_isindex_element_create(html, namespace, prefix,
(dom_html_isindex_element **) result);
- } else {
+ break;
+ case DOM_HTML_ELEMENT_TYPE__UNKNOWN:
exc = _dom_html_element_create(html, tag_name, namespace,
prefix, result);
+ break;
}
dom_string_unref(tag_name);
@@ -576,8 +926,8 @@ dom_exception _dom_html_document_get_title(dom_html_document *doc,
uint32_t len;
exc = dom_document_get_elements_by_tag_name(doc,
- doc->memoised[hds_TITLE],
- &nodes);
+ doc->elements[DOM_HTML_ELEMENT_TYPE_TITLE],
+ &nodes);
if (exc != DOM_NO_ERR) {
return exc;
}
@@ -654,7 +1004,7 @@ dom_exception _dom_html_document_get_body(dom_html_document *doc,
uint32_t len;
exc = dom_document_get_elements_by_tag_name(doc,
- doc->memoised[hds_BODY],
+ doc->elements[DOM_HTML_ELEMENT_TYPE_BODY],
&nodes);
if (exc != DOM_NO_ERR) {
return exc;
@@ -668,7 +1018,7 @@ dom_exception _dom_html_document_get_body(dom_html_document *doc,
if (len == 0) {
exc = dom_document_get_elements_by_tag_name(doc,
- doc->memoised[hds_FRAMESET],
+ doc->elements[DOM_HTML_ELEMENT_TYPE_FRAMESET],
&nodes);
if (exc != DOM_NO_ERR) {
return exc;
@@ -713,9 +1063,10 @@ dom_exception _dom_html_document_set_body(dom_html_document *doc,
*/
bool images_callback(struct dom_node_internal *node, void *ctx)
{
+ dom_html_document *doc = ctx;
if(node->type == DOM_ELEMENT_NODE &&
dom_string_caseless_isequal(node->name,
- ((dom_html_document *)ctx)->memoised[hds_IMG])) {
+ doc->elements[DOM_HTML_ELEMENT_TYPE_IMG])) {
return true;
}
return false;
@@ -736,9 +1087,10 @@ dom_exception _dom_html_document_get_images(dom_html_document *doc,
bool applet_callback(struct dom_node_internal * node, void *ctx)
{
+ dom_html_document *doc = ctx;
if(node->type == DOM_ELEMENT_NODE &&
dom_string_caseless_isequal(node->name,
- ((dom_html_document *)ctx)->memoised[hds_APPLET])) {
+ doc->elements[DOM_HTML_ELEMENT_TYPE_APPLET])) {
return true;
}
return false;
@@ -752,9 +1104,10 @@ bool applet_callback(struct dom_node_internal * node, void *ctx)
*/
bool applets_callback(struct dom_node_internal *node, void *ctx)
{
+ dom_html_document *doc = ctx;
if(node->type == DOM_ELEMENT_NODE &&
dom_string_caseless_isequal(node->name,
- ((dom_html_document *)ctx)->memoised[hds_OBJECT])) {
+ doc->elements[DOM_HTML_ELEMENT_TYPE_OBJECT])) {
uint32_t len = 0;
dom_html_collection *applets;
if (_dom_html_collection_create(ctx, node,
@@ -790,17 +1143,18 @@ dom_exception _dom_html_document_get_applets(dom_html_document *doc,
*/
bool links_callback(struct dom_node_internal *node, void *ctx)
{
+ dom_html_document *doc = ctx;
if(node->type == DOM_ELEMENT_NODE &&
(dom_string_caseless_isequal(node->name,
- ((dom_html_document *)ctx)->memoised[hds_A]) ||
+ doc->elements[DOM_HTML_ELEMENT_TYPE_A]) ||
dom_string_caseless_isequal(node->name,
- ((dom_html_document *)ctx)->memoised[hds_AREA]))
+ doc->elements[DOM_HTML_ELEMENT_TYPE_AREA]))
) {
bool has_value = false;
dom_exception err;
err = dom_element_has_attribute(node,
- ((dom_html_document *)ctx)->memoised[hds_href], &has_value);
+ doc->memoised[hds_href], &has_value);
if(err !=DOM_NO_ERR)
return err;
@@ -831,7 +1185,7 @@ static bool __dom_html_document_node_is_form(dom_node_internal *node,
UNUSED(ctx);
return dom_string_caseless_isequal(node->name,
- doc->memoised[hds_FORM]);
+ doc->elements[DOM_HTML_ELEMENT_TYPE_FORM]);
}
dom_exception _dom_html_document_get_forms(dom_html_document *doc,
@@ -868,14 +1222,15 @@ dom_exception _dom_html_document_get_forms(dom_html_document *doc,
*/
bool anchors_callback(struct dom_node_internal *node, void *ctx)
{
+ dom_html_document *doc = ctx;
if(node->type == DOM_ELEMENT_NODE &&
dom_string_caseless_isequal(node->name,
- ((dom_html_document *)ctx)->memoised[hds_A])) {
+ doc->elements[DOM_HTML_ELEMENT_TYPE_A])) {
bool has_value = false;
dom_exception err;
err = dom_element_has_attribute(node,
- ((dom_html_document *)ctx)->memoised[hds_name], &has_value);
+ doc->memoised[hds_name], &has_value);
if(err !=DOM_NO_ERR)
return err;