#include "htmlattrs.h"
struct attrs {
const char *name;
int id;
};
#ifdef __GNUC__
__inline
#else
#ifdef __cplusplus
inline
#endif
#endif
static unsigned int
hash_attr (register const char *str, register unsigned int len)
{
static const unsigned short asso_values[] =
{
801, 801, 801, 801, 801, 801, 801, 801, 801, 801,
801, 801, 801, 801, 801, 801, 801, 801, 801, 801,
801, 801, 801, 801, 801, 801, 801, 801, 801, 801,
801, 801, 801, 801, 801, 801, 801, 801, 801, 801,
801, 801, 801, 801, 801, 5, 801, 801, 801, 801,
801, 801, 801, 801, 801, 801, 801, 801, 801, 801,
801, 801, 801, 801, 801, 801, 801, 801, 801, 801,
801, 801, 801, 801, 801, 801, 801, 801, 801, 801,
801, 801, 801, 801, 801, 801, 801, 801, 801, 801,
801, 801, 801, 801, 801, 801, 801, 15, 130, 10,
260, 0, 45, 115, 25, 45, 0, 150, 0, 35,
0, 0, 0, 0, 30, 5, 90, 80, 300, 60,
10, 0, 10, 801, 801, 801, 801, 801, 801, 801,
801, 801, 801, 801, 801, 801, 801, 801, 801, 801,
801, 801, 801, 801, 801, 801, 801, 801, 801, 801,
801, 801, 801, 801, 801, 801, 801, 801, 801, 801,
801, 801, 801, 801, 801, 801, 801, 801, 801, 801,
801, 801, 801, 801, 801, 801, 801, 801, 801, 801,
801, 801, 801, 801, 801, 801, 801, 801, 801, 801,
801, 801, 801, 801, 801, 801, 801, 801, 801, 801,
801, 801, 801, 801, 801, 801, 801, 801, 801, 801,
801, 801, 801, 801, 801, 801, 801, 801, 801, 801,
801, 801, 801, 801, 801, 801, 801, 801, 801, 801,
801, 801, 801, 801, 801, 801, 801, 801, 801, 801,
801, 801, 801, 801, 801, 801, 801, 801, 801, 801,
801, 801, 801, 801, 801, 801
};
register int hval = len;
switch (hval)
{
default:
case 15:
hval += asso_values[(unsigned char)str[14]];
case 14:
hval += asso_values[(unsigned char)str[13]];
case 13:
hval += asso_values[(unsigned char)str[12]];
case 12:
hval += asso_values[(unsigned char)str[11]];
case 11:
hval += asso_values[(unsigned char)str[10]];
case 10:
hval += asso_values[(unsigned char)str[9]];
case 9:
hval += asso_values[(unsigned char)str[8]];
case 8:
hval += asso_values[(unsigned char)str[7]];
case 7:
hval += asso_values[(unsigned char)str[6]];
case 6:
hval += asso_values[(unsigned char)str[5]];
case 5:
hval += asso_values[(unsigned char)str[4]];
case 4:
hval += asso_values[(unsigned char)str[3]];
case 3:
hval += asso_values[(unsigned char)str[2]];
case 2:
hval += asso_values[(unsigned char)str[1]];
case 1:
hval += asso_values[(unsigned char)str[0]];
break;
}
return hval;
}
#ifdef __GNUC__
__inline
#endif
const struct attrs *
findAttr (register const char *str, register unsigned int len)
{
enum
{
TOTAL_KEYWORDS = 155,
MIN_WORD_LENGTH = 2,
MAX_WORD_LENGTH = 15,
MIN_HASH_VALUE = 4,
MAX_HASH_VALUE = 800
};
static const struct attrs wordlist_attr[] =
{
{"loop", ATTR_LOOP},
{"cols", ATTR_COLS},
{"scope", ATTR_SCOPE},
{"span", ATTR_SPAN},
{"rel", ATTR_REL},
{"colspan", ATTR_COLSPAN},
{"class", ATTR_CLASS},
{"color", ATTR_COLOR},
{"src", ATTR_SRC},
{"shape", ATTR_SHAPE},
{"onscroll", ATTR_ONSCROLL},
{"name", ATTR_NAME},
{"clear", ATTR_CLEAR},
{"hspace", ATTR_HSPACE},
{"size", ATTR_SIZE},
{"plain", ATTR_PLAIN},
{"face", ATTR_FACE},
{"for", ATTR_FOR},
{"axis", ATTR_AXIS},
{"scheme", ATTR_SCHEME},
{"char", ATTR_CHAR},
{"top", ATTR_TOP},
{"type", ATTR_TYPE},
{"onerror", ATTR_ONERROR},
{"noresize", ATTR_NORESIZE},
{"onresize", ATTR_ONRESIZE},
{"rows", ATTR_ROWS},
{"style", ATTR_STYLE},
{"href", ATTR_HREF},
{"ismap", ATTR_ISMAP},
{"nohref", ATTR_NOHREF},
{"enctype", ATTR_ENCTYPE},
{"alt", ATTR_ALT},
{"wrap", ATTR_WRAP},
{"nowrap", ATTR_NOWRAP},
{"onselect", ATTR_ONSELECT},
{"rowspan", ATTR_ROWSPAN},
{"rules", ATTR_RULES},
{"profile", ATTR_PROFILE},
{"frame", ATTR_FRAME},
{"accept", ATTR_ACCEPT},
{"onreset", ATTR_ONRESET},
{"lang", ATTR_LANG},
{"pagey", ATTR_PAGEY},
{"left", ATTR_LEFT},
{"usemap", ATTR_USEMAP},
{"pagex", ATTR_PAGEX},
{"onfocus", ATTR_ONFOCUS},
{"cite", ATTR_CITE},
{"label", ATTR_LABEL},
{"html", ATTR_HTML},
{"prompt", ATTR_PROMPT},
{"action", ATTR_ACTION},
{"compact", ATTR_COMPACT},
{"onchange", ATTR_ONCHANGE},
{"challenge", ATTR_CHALLENGE},
{"charoff", ATTR_CHAROFF},
{"align", ATTR_ALIGN},
{"charset", ATTR_CHARSET},
{"text", ATTR_TEXT},
{"content", ATTR_CONTENT},
{"link", ATTR_LINK},
{"onkeypress", ATTR_ONKEYPRESS},
{"accesskey", ATTR_ACCESSKEY},
{"summary", ATTR_SUMMARY},
{"onmouseup", ATTR_ONMOUSEUP},
{"cellspacing", ATTR_CELLSPACING},
{"scrolling", ATTR_SCROLLING},
{"alink", ATTR_ALINK},
{"onclick", ATTR_ONCLICK},
{"title", ATTR_TITLE},
{"start", ATTR_START},
{"object", ATTR_OBJECT},
{"onkeyup", ATTR_ONKEYUP},
{"hreflang", ATTR_HREFLANG},
{"mayscript", ATTR_MAYSCRIPT},
{"onblur", ATTR_ONBLUR},
{"keytype", ATTR_KEYTYPE},
{"multiple", ATTR_MULTIPLE},
{"onabort", ATTR_ONABORT},
{"code", ATTR_CODE},
{"scrollamount", ATTR_SCROLLAMOUNT},
{"onload", ATTR_ONLOAD},
{"bgcolor", ATTR_BGCOLOR},
{"unknown", ATTR_UNKNOWN},
{"maxlength", ATTR_MAXLENGTH},
{"onmouseout", ATTR_ONMOUSEOUT},
{"height", ATTR_HEIGHT},
{"id", ATTR_ID},
{"abbr", ATTR_ABBR},
{"coords", ATTR_COORDS},
{"noshade", ATTR_NOSHADE},
{"readonly", ATTR_READONLY},
{"accept-charset", ATTR_ACCEPT_CHARSET},
{"declare", ATTR_DECLARE},
{"nosave", ATTR_NOSAVE},
{"oncontextmenu", ATTR_ONCONTEXTMENU},
{"scrolldelay", ATTR_SCROLLDELAY},
{"autocomplete", ATTR_AUTOCOMPLETE},
{"rev", ATTR_REV},
{"vspace", ATTR_VSPACE},
{"z-index", ATTR_Z_INDEX},
{"dir", ATTR_DIR},
{"topmargin", ATTR_TOPMARGIN},
{"defer", ATTR_DEFER},
{"headers", ATTR_HEADERS},
{"target", ATTR_TARGET},
{"classid", ATTR_CLASSID},
{"language", ATTR_LANGUAGE},
{"pluginurl", ATTR_PLUGINURL},
{"media", ATTR_MEDIA},
{"onunload", ATTR_ONUNLOAD},
{"codetype", ATTR_CODETYPE},
{"selected", ATTR_SELECTED},
{"pluginpage", ATTR_PLUGINPAGE},
{"oversrc", ATTR_OVERSRC},
{"data", ATTR_DATA},
{"leftmargin", ATTR_LEFTMARGIN},
{"pluginspage", ATTR_PLUGINSPAGE},
{"version", ATTR_VERSION},
{"onsubmit", ATTR_ONSUBMIT},
{"longdesc", ATTR_LONGDESC},
{"value", ATTR_VALUE},
{"method", ATTR_METHOD},
{"codebase", ATTR_CODEBASE},
{"archive", ATTR_ARCHIVE},
{"onmousedown", ATTR_ONMOUSEDOWN},
{"border", ATTR_BORDER},
{"bgproperties", ATTR_BGPROPERTIES},
{"onmouseover", ATTR_ONMOUSEOVER},
{"checked", ATTR_CHECKED},
{"onmousemove", ATTR_ONMOUSEMOVE},
{"truespeed", ATTR_TRUESPEED},
{"onkeydown", ATTR_ONKEYDOWN},
{"valign", ATTR_VALIGN},
{"width", ATTR_WIDTH},
{"direction", ATTR_DIRECTION},
{"valuetype", ATTR_VALUETYPE},
{"vlink", ATTR_VLINK},
{"bordercolor", ATTR_BORDERCOLOR},
{"standby", ATTR_STANDBY},
{"datetime", ATTR_DATETIME},
{"marginheight", ATTR_MARGINHEIGHT},
{"behavior", ATTR_BEHAVIOR},
{"tabindex", ATTR_TABINDEX},
{"frameborder", ATTR_FRAMEBORDER},
{"hidden", ATTR_HIDDEN},
{"ondblclick", ATTR_ONDBLCLICK},
{"http-equiv", ATTR_HTTP_EQUIV},
{"visibility", ATTR_VISIBILITY},
{"cellpadding", ATTR_CELLPADDING},
{"disabled", ATTR_DISABLED},
{"marginwidth", ATTR_MARGINWIDTH},
{"contenteditable", ATTR_CONTENTEDITABLE},
{"background", ATTR_BACKGROUND}
};
static const short lookup[] =
{
-1, -1, -1, -1, 0, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, 1, 2, -1, -1, -1,
3, -1, -1, -1, -1, -1, -1, -1,
-1, 4, -1, -1, -1, 5, -1, -1,
6, -1, -1, -1, -1, 7, -1, -1,
8, -1, 9, -1, -1, 10, 11, -1,
-1, -1, -1, -1, 12, 13, -1, -1,
14, 15, -1, -1, -1, -1, -1, -1,
-1, -1, 16, -1, -1, -1, 17, 18,
-1, 19, -1, -1, 20, -1, -1, -1,
-1, -1, -1, -1, -1, 21, 22, -1,
-1, 23, -257, 26, 27, -131, -2, -1,
28, 29, 30, 31, 32, 33, -1, 34,
-1, 35, -1, -1, -1, 36, -1, -1,
37, -1, -1, -1, -1, -1, -1, 38,
-1, -1, 39, 40, 41, -1, 42, 43,
-1, -1, -1, 44, -1, 45, -1, -1,
-1, 46, -1, 47, -1, 48, 49, -1,
-1, -1, 50, -1, -1, -1, -1, -1,
-1, 51, -1, -1, -1, -1, 52, 53,
-1, -1, -1, -1, -1, 54, 55, -1,
-1, 56, -1, -1, 57, -1, 58, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, 59, -1, -1, 60, -1, 61,
62, -1, -1, -1, 63, -1, -1, 64,
-1, 65, -1, 66, -1, -1, 67, 68,
-1, -1, -1, -1, -1, -1, 69, -1,
-1, -1, -1, -1, -1, -1, 70, -1,
-1, -1, -1, 71, 72, 73, 74, 75,
-1, -1, -1, -1, -1, -1, 76, 77,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, 78, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
79, -1, 80, -1, -1, 81, -1, -1,
-1, 82, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, 83, -1, -1, -1,
-1, 84, -1, 85, 86, -1, -1, -1,
-1, -1, 87, 88, -1, 89, -1, 90,
91, 92, -1, -1, -1, -1, -1, 93,
-1, -1, 94, -1, -1, -1, 95, -1,
96, -1, -1, 97, 98, 99, -1, -1,
100, 101, 102, 103, 104, -1, 105, -1,
-1, -1, 106, 107, 108, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, 109,
110, -1, -1, 111, -1, -1, -1, -1,
112, -1, -1, -1, -1, 113, -1, -1,
-1, -1, -1, -1, 114, -1, 115, -1,
116, 117, 118, 119, -1, -1, -1, -1,
-1, 120, -1, -1, -1, -1, 121, -1,
122, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
123, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, 124, -1, -1, -1,
125, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, 126, -1, -1, -1, -1,
127, 128, -1, -1, -1, 129, 130, -1,
-1, -1, 131, -1, -1, -1, -1, -1,
-1, -1, 132, -1, -1, -1, -1, 133,
-1, 134, -1, -1, -1, 135, -1, -1,
-1, 136, -1, -1, -1, -1, 137, -1,
-1, -1, -1, -1, 138, 139, -1, -1,
-1, -1, -1, 140, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, 141,
-1, -1, -1, -1, -1, -1, -1, -1,
142, 143, -1, -1, -1, -1, 144, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, 145, -1, -1, -1, -1, -1,
-1, -1, -1, -1, 146, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, 147,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, 148, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, 149, 150, -1, -1, -1,
-1, -1, -1, 151, -1, -1, -1, -1,
-1, -1, -1, 152, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, 153, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
154
};
if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
{
register int key = hash_attr (str, len);
if (key <= MAX_HASH_VALUE && key >= 0)
{
register int index = lookup[key];
if (index >= 0)
{
register const char *s = wordlist_attr[index].name;
if (*str == *s && !strncmp (str + 1, s + 1, len - 1) && s[len] == '\0')
return &wordlist_attr[index];
}
else if (index < -TOTAL_KEYWORDS)
{
register int offset = - 1 - TOTAL_KEYWORDS - index;
register const struct attrs *wordptr = &wordlist_attr[TOTAL_KEYWORDS + lookup[offset]];
register const struct attrs *wordendptr = wordptr + -lookup[offset + 1];
while (wordptr < wordendptr)
{
register const char *s = wordptr->name;
if (*str == *s && !strncmp (str + 1, s + 1, len - 1) && s[len] == '\0')
return wordptr;
wordptr++;
}
}
}
}
return 0;
}
static const char * const attrList[] = {
"ABBR",
"ACCEPT-CHARSET",
"ACCEPT",
"ACCESSKEY",
"ACTION",
"ALIGN",
"ALINK",
"ALT",
"ARCHIVE",
"AUTOCOMPLETE",
"AXIS",
"BACKGROUND",
"BEHAVIOR",
"BGCOLOR",
"BGPROPERTIES",
"BORDER",
"BORDERCOLOR",
"CELLPADDING",
"CELLSPACING",
"CHAR",
"CHALLENGE",
"CHAROFF",
"CHARSET",
"CHECKED",
"CITE",
"CLASS",
"CLASSID",
"CLEAR",
"CODE",
"CODEBASE",
"CODETYPE",
"COLOR",
"COLS",
"COLSPAN",
"COMPACT",
"CONTENT",
"CONTENTEDITABLE",
"COORDS",
"DATA",
"DATETIME",
"DECLARE",
"DEFER",
"DIR",
"DIRECTION",
"DISABLED",
"ENCTYPE",
"FACE",
"FOR",
"FRAME",
"FRAMEBORDER",
"HEADERS",
"HEIGHT",
"HIDDEN",
"HREF",
"HREFLANG",
"HSPACE",
"HTML",
"HTTP-EQUIV",
"ID",
"ISMAP",
"KEYTYPE",
"LABEL",
"LANG",
"LANGUAGE",
"LEFT",
"LEFTMARGIN",
"LINK",
"LONGDESC",
"LOOP",
"MARGINHEIGHT",
"MARGINWIDTH",
"MAXLENGTH",
"MAYSCRIPT",
"MEDIA",
"METHOD",
"MULTIPLE",
"NAME",
"NOHREF",
"NORESIZE",
"NOSAVE",
"NOSHADE",
"NOWRAP",
"OBJECT",
"ONABORT",
"ONBLUR",
"ONCHANGE",
"ONCLICK",
"ONCONTEXTMENU",
"ONDBLCLICK",
"ONERROR",
"ONFOCUS",
"ONKEYDOWN",
"ONKEYPRESS",
"ONKEYUP",
"ONLOAD",
"ONMOUSEDOWN",
"ONMOUSEMOVE",
"ONMOUSEOUT",
"ONMOUSEOVER",
"ONMOUSEUP",
"ONRESET",
"ONRESIZE",
"ONSCROLL",
"ONSELECT",
"ONSUBMIT",
"ONUNLOAD",
"OVERSRC",
"PAGEX",
"PAGEY",
"PLAIN",
"PLUGINPAGE",
"PLUGINSPAGE",
"PLUGINURL",
"PROFILE",
"PROMPT",
"READONLY",
"REL",
"REV",
"ROWS",
"ROWSPAN",
"RULES",
"SCHEME",
"SCOPE",
"SCROLLAMOUNT",
"SCROLLDELAY",
"SCROLLING",
"SELECTED",
"SHAPE",
"SIZE",
"SPAN",
"SRC",
"STANDBY",
"START",
"STYLE",
"SUMMARY",
"TABINDEX",
"TARGET",
"TEXT",
"TITLE",
"TOP",
"TOPMARGIN",
"TRUESPEED",
"TYPE",
"UNKNOWN",
"USEMAP",
"VALIGN",
"VALUE",
"VALUETYPE",
"VERSION",
"VISIBILITY",
"VLINK",
"VSPACE",
"WIDTH",
"WRAP",
"Z-INDEX",
0
};
DOMString getAttrName(unsigned short id)
{
return attrList[id-1];
};