summaryrefslogtreecommitdiff
path: root/src/treebuilder
diff options
context:
space:
mode:
authorAndrew Sidwell <andy@entai.co.uk>2008-08-11 04:13:22 +0000
committerAndrew Sidwell <andy@entai.co.uk>2008-08-11 04:13:22 +0000
commit7a388e8066a94775e3e744188e51ed86ed289c50 (patch)
tree90afc17c825b6f4546129f08d0d82b475ecd9bf0 /src/treebuilder
parentbea1f361c83927831aa19cc136dca478cfb33f64 (diff)
downloadlibhubbub-7a388e8066a94775e3e744188e51ed86ed289c50.tar.gz
libhubbub-7a388e8066a94775e3e744188e51ed86ed289c50.tar.bz2
- Add N_ELEMENTS() macro globally rather than using sizeof(x) / sizeof(x[0]) everywhere
- In anticipation of interning tag names, make the big map of name->type store them in lowercase - Take advantage of the previous change to optimise away many calls to strlen svn path=/trunk/hubbub/; revision=5010
Diffstat (limited to 'src/treebuilder')
-rw-r--r--src/treebuilder/in_foreign_content.c2
-rw-r--r--src/treebuilder/treebuilder.c118
2 files changed, 60 insertions, 60 deletions
diff --git a/src/treebuilder/in_foreign_content.c b/src/treebuilder/in_foreign_content.c
index 2603b77..d5c3574 100644
--- a/src/treebuilder/in_foreign_content.c
+++ b/src/treebuilder/in_foreign_content.c
@@ -132,8 +132,6 @@ static const case_changes svg_tagnames[] = {
#undef S
-#define N_ELEMENTS(x) (sizeof(x) / sizeof((x)[0]))
-
/**
* Adjust SVG attributes.
diff --git a/src/treebuilder/treebuilder.c b/src/treebuilder/treebuilder.c
index dc60d42..4624510 100644
--- a/src/treebuilder/treebuilder.c
+++ b/src/treebuilder/treebuilder.c
@@ -16,63 +16,67 @@
#include "utils/utils.h"
#include "utils/string.h"
+
+#define S(x) x, SLEN(x)
+
static const struct {
const char *name;
+ size_t len;
element_type type;
} name_type_map[] = {
- { "ADDRESS", ADDRESS }, { "AREA", AREA },
- { "BASE", BASE }, { "BASEFONT", BASEFONT },
- { "BGSOUND", BGSOUND }, { "BLOCKQUOTE", BLOCKQUOTE },
- { "BODY", BODY }, { "BR", BR },
- { "CENTER", CENTER }, { "COL", COL },
- { "COLGROUP", COLGROUP }, { "DD", DD },
- { "DIR", DIR }, { "DIV", DIV },
- { "DL", DL }, { "DT", DT },
- { "EMBED", EMBED }, { "FIELDSET", FIELDSET },
- { "FORM", FORM }, { "FRAME", FRAME },
- { "FRAMESET", FRAMESET }, { "H1", H1 },
- { "H2", H2 }, { "H3", H3 },
- { "H4", H4 }, { "H5", H5 },
- { "H6", H6 }, { "HEAD", HEAD },
- { "HR", HR }, { "IFRAME", IFRAME },
- { "IMAGE", IMAGE }, { "IMG", IMG },
- { "INPUT", INPUT }, { "ISINDEX", ISINDEX },
- { "LI", LI }, { "LINK", LINK },
- { "LISTING", LISTING },
- { "MENU", MENU },
- { "META", META }, { "NOEMBED", NOEMBED },
- { "NOFRAMES", NOFRAMES }, { "NOSCRIPT", NOSCRIPT },
- { "OL", OL }, { "OPTGROUP", OPTGROUP },
- { "OPTION", OPTION }, { "P", P },
- { "PARAM", PARAM }, { "PLAINTEXT", PLAINTEXT },
- { "PRE", PRE }, { "SCRIPT", SCRIPT },
- { "SELECT", SELECT }, { "SPACER", SPACER },
- { "STYLE", STYLE }, { "TBODY", TBODY },
- { "TEXTAREA", TEXTAREA }, { "TFOOT", TFOOT },
- { "THEAD", THEAD }, { "TITLE", TITLE },
- { "TR", TR }, { "UL", UL },
- { "WBR", WBR },
- { "APPLET", APPLET }, { "BUTTON", BUTTON },
- { "CAPTION", CAPTION }, { "HTML", HTML },
- { "MARQUEE", MARQUEE }, { "OBJECT", OBJECT },
- { "TABLE", TABLE }, { "TD", TD },
- { "TH", TH },
- { "A", A }, { "B", B },
- { "BIG", BIG }, { "EM", EM },
- { "FONT", FONT }, { "I", I },
- { "NOBR", NOBR }, { "S", S },
- { "SMALL", SMALL }, { "STRIKE", STRIKE },
- { "STRONG", STRONG }, { "TT", TT },
- { "U", U }, { "XMP", XMP },
-
- { "MATH", MATH }, { "MGLYPH", MGLYPH },
- { "MALIGNMARK", MALIGNMARK },
- { "MI", MI }, { "MO", MO },
- { "MN", MN }, { "MS", MS },
- { "MTEXT", MTEXT }, { "ANNOTATION-XML", ANNOTATION_XML },
-
- { "SVG", SVG }, { "DESC", DESC },
- { "FOREIGNOBJECT", FOREIGNOBJECT },
+ { S("address"), ADDRESS }, { S("area"), AREA },
+ { S("base"), BASE }, { S("basefont"), BASEFONT },
+ { S("bgsound"), BGSOUND }, { S("blockquote"), BLOCKQUOTE },
+ { S("body"), BODY }, { S("br"), BR },
+ { S("center"), CENTER }, { S("col"), COL },
+ { S("colgroup"), COLGROUP }, { S("dd"), DD },
+ { S("dir"), DIR }, { S("div"), DIV },
+ { S("dl"), DL }, { S("dt"), DT },
+ { S("embed"), EMBED }, { S("fieldset"), FIELDSET },
+ { S("form"), FORM }, { S("frame"), FRAME },
+ { S("frameset"), FRAMESET }, { S("h1"), H1 },
+ { S("h2"), H2 }, { S("h3"), H3 },
+ { S("h4"), H4 }, { S("h5"), H5 },
+ { S("h6"), H6 }, { S("head"), HEAD },
+ { S("hr"), HR }, { S("iframe"), IFRAME },
+ { S("image"), IMAGE }, { S("img"), IMG },
+ { S("input"), INPUT }, { S("isindex"), ISINDEX },
+ { S("li"), LI }, { S("link"), LINK },
+ { S("listing"), LISTING },
+ { S("menu"), MENU },
+ { S("meta"), META }, { S("noembed"), NOEMBED },
+ { S("noframes"), NOFRAMES }, { S("noscript"), NOSCRIPT },
+ { S("ol"), OL }, { S("optgroup"), OPTGROUP },
+ { S("option"), OPTION }, { S("p"), P },
+ { S("param"), PARAM }, { S("plaintext"), PLAINTEXT },
+ { S("pre"), PRE }, { S("script"), SCRIPT },
+ { S("select"), SELECT }, { S("spacer"), SPACER },
+ { S("style"), STYLE }, { S("tbody"), TBODY },
+ { S("textarea"), TEXTAREA }, { S("tfoot"), TFOOT },
+ { S("thead"), THEAD }, { S("title"), TITLE },
+ { S("tr"), TR }, { S("ul"), UL },
+ { S("wbr"), WBR },
+ { S("applet"), APPLET }, { S("button"), BUTTON },
+ { S("caption"), CAPTION }, { S("html"), HTML },
+ { S("marquee"), MARQUEE }, { S("object"), OBJECT },
+ { S("table"), TABLE }, { S("td"), TD },
+ { S("th"), TH },
+ { S("a"), A }, { S("b"), B },
+ { S("big"), BIG }, { S("em"), EM },
+ { S("font"), FONT }, { S("i"), I },
+ { S("nobr"), NOBR }, { S("s"), S },
+ { S("small"), SMALL }, { S("strike"), STRIKE },
+ { S("strong"), STRONG }, { S("tt"), TT },
+ { S("u"), U }, { S("xmp"), XMP },
+
+ { S("math"), MATH }, { S("mglyph"), MGLYPH },
+ { S("malignmark"), MALIGNMARK },
+ { S("mi"), MI }, { S("mo"), MO },
+ { S("mn"), MN }, { S("ms"), MS },
+ { S("mtext"), MTEXT }, { S("annotation-xml"), ANNOTATION_XML },
+
+ { S("svg"), SVG }, { S("desc"), DESC },
+ { S("foreignobject"), FOREIGNOBJECT },
};
@@ -962,13 +966,11 @@ element_type element_type_from_name(hubbub_treebuilder *treebuilder,
/** \todo optimise this */
- for (uint32_t i = 0;
- i < sizeof(name_type_map) / sizeof(name_type_map[0]);
- i++) {
- if (strlen(name_type_map[i].name) != len)
+ for (uint32_t i = 0; i < N_ELEMENTS(name_type_map); i++) {
+ if (name_type_map[i].len != len)
continue;
- if (strncasecmp(name_type_map[i].name,
+ if (strncasecmp(name_type_map[i].name,
(const char *) name, len) == 0)
return name_type_map[i].type;
}