From 7a388e8066a94775e3e744188e51ed86ed289c50 Mon Sep 17 00:00:00 2001 From: Andrew Sidwell Date: Mon, 11 Aug 2008 04:13:22 +0000 Subject: - 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 --- src/treebuilder/in_foreign_content.c | 2 - src/treebuilder/treebuilder.c | 118 ++++++++++++++++++----------------- src/utils/utils.h | 3 + 3 files changed, 63 insertions(+), 60 deletions(-) (limited to 'src') 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; } diff --git a/src/utils/utils.h b/src/utils/utils.h index a1e0230..d22a0eb 100644 --- a/src/utils/utils.h +++ b/src/utils/utils.h @@ -25,4 +25,7 @@ #define UNUSED(x) ((x)=(x)) #endif +/* Useful for iterating over arrays */ +#define N_ELEMENTS(x) sizeof((x)) / sizeof((x)[0]) + #endif -- cgit v1.2.3