#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[] =
{
1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151,
1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151,
1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151,
1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151,
1151, 1151, 1151, 1151, 1151, 5, 1151, 1151, 1151, 1151,
1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151,
1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151,
1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151,
1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151,
1151, 1151, 1151, 1151, 1151, 1151, 1151, 45, 65, 10,
50, 0, 160, 80, 85, 175, 0, 115, 0, 0,
0, 0, 0, 5, 25, 5, 0, 30, 130, 205,
30, 240, 25, 1151, 1151, 1151, 1151, 1151, 1151, 1151,
1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151,
1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151,
1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151,
1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151,
1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151,
1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151,
1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151,
1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151,
1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151,
1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151,
1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151,
1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151,
1151, 1151, 1151, 1151, 1151, 1151
};
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 = 154,
MIN_WORD_LENGTH = 2,
MAX_WORD_LENGTH = 15,
MIN_HASH_VALUE = 3,
MAX_HASH_VALUE = 1150
};
static const struct attrs wordlist_attr[] =
{
{"top", ATTR_TOP},
{"loop", ATTR_LOOP},
{"content", ATTR_CONTENT},
{"cols", ATTR_COLS},
{"scope", ATTR_SCOPE},
{"onselect", ATTR_ONSELECT},
{"rel", ATTR_REL},
{"prompt", ATTR_PROMPT},
{"text", ATTR_TEXT},
{"onreset", ATTR_ONRESET},
{"color", ATTR_COLOR},
{"src", ATTR_SRC},
{"alt", ATTR_ALT},
{"name", ATTR_NAME},
{"span", ATTR_SPAN},
{"code", ATTR_CODE},
{"rules", ATTR_RULES},
{"colspan", ATTR_COLSPAN},
{"class", ATTR_CLASS},
{"accept", ATTR_ACCEPT},
{"compact", ATTR_COMPACT},
{"selected", ATTR_SELECTED},
{"onmouseup", ATTR_ONMOUSEUP},
{"onmouseout", ATTR_ONMOUSEOUT},
{"start", ATTR_START},
{"object", ATTR_OBJECT},
{"onerror", ATTR_ONERROR},
{"oncontextmenu", ATTR_ONCONTEXTMENU},
{"clear", ATTR_CLEAR},
{"usemap", ATTR_USEMAP},
{"html", ATTR_HTML},
{"coords", ATTR_COORDS},
{"autocomplete", ATTR_AUTOCOMPLETE},
{"onload", ATTR_ONLOAD},
{"scheme", ATTR_SCHEME},
{"label", ATTR_LABEL},
{"truespeed", ATTR_TRUESPEED},
{"onblur", ATTR_ONBLUR},
{"scrollamount", ATTR_SCROLLAMOUNT},
{"lang", ATTR_LANG},
{"onunload", ATTR_ONUNLOAD},
{"declare", ATTR_DECLARE},
{"shape", ATTR_SHAPE},
{"method", ATTR_METHOD},
{"onabort", ATTR_ONABORT},
{"data", ATTR_DATA},
{"hspace", ATTR_HSPACE},
{"longdesc", ATTR_LONGDESC},
{"target", ATTR_TARGET},
{"rev", ATTR_REV},
{"pagex", ATTR_PAGEX},
{"left", ATTR_LEFT},
{"char", ATTR_CHAR},
{"border", ATTR_BORDER},
{"onmousemove", ATTR_ONMOUSEMOVE},
{"charset", ATTR_CHARSET},
{"title", ATTR_TITLE},
{"codebase", ATTR_CODEBASE},
{"nosave", ATTR_NOSAVE},
{"bgcolor", ATTR_BGCOLOR},
{"for", ATTR_FOR},
{"cite", ATTR_CITE},
{"noshade", ATTR_NOSHADE},
{"vspace", ATTR_VSPACE},
{"onmouseover", ATTR_ONMOUSEOVER},
{"oversrc", ATTR_OVERSRC},
{"abbr", ATTR_ABBR},
{"size", ATTR_SIZE},
{"value", ATTR_VALUE},
{"bordercolor", ATTR_BORDERCOLOR},
{"onfocus", ATTR_ONFOCUS},
{"multiple", ATTR_MULTIPLE},
{"headers", ATTR_HEADERS},
{"face", ATTR_FACE},
{"plain", ATTR_PLAIN},
{"id", ATTR_ID},
{"onchange", ATTR_ONCHANGE},
{"challenge", ATTR_CHALLENGE},
{"ismap", ATTR_ISMAP},
{"frame", ATTR_FRAME},
{"action", ATTR_ACTION},
{"noresize", ATTR_NORESIZE},
{"onresize", ATTR_ONRESIZE},
{"rows", ATTR_ROWS},
{"defer", ATTR_DEFER},
{"type", ATTR_TYPE},
{"maxlength", ATTR_MAXLENGTH},
{"style", ATTR_STYLE},
{"dir", ATTR_DIR},
{"accept-charset", ATTR_ACCEPT_CHARSET},
{"enctype", ATTR_ENCTYPE},
{"axis", ATTR_AXIS},
{"href", ATTR_HREF},
{"media", ATTR_MEDIA},
{"nohref", ATTR_NOHREF},
{"checked", ATTR_CHECKED},
{"datetime", ATTR_DATETIME},
{"wrap", ATTR_WRAP},
{"nowrap", ATTR_NOWRAP},
{"onsubmit", ATTR_ONSUBMIT},
{"rowspan", ATTR_ROWSPAN},
{"language", ATTR_LANGUAGE},
{"z-index", ATTR_Z_INDEX},
{"link", ATTR_LINK},
{"classid", ATTR_CLASSID},
{"onmousedown", ATTR_ONMOUSEDOWN},
{"scrolling", ATTR_SCROLLING},
{"align", ATTR_ALIGN},
{"codetype", ATTR_CODETYPE},
{"onclick", ATTR_ONCLICK},
{"topmargin", ATTR_TOPMARGIN},
{"cellspacing", ATTR_CELLSPACING},
{"alink", ATTR_ALINK},
{"version", ATTR_VERSION},
{"pluginurl", ATTR_PLUGINURL},
{"summary", ATTR_SUMMARY},
{"unknown", ATTR_UNKNOWN},
{"contenteditable", ATTR_CONTENTEDITABLE},
{"hidden", ATTR_HIDDEN},
{"profile", ATTR_PROFILE},
{"readonly", ATTR_READONLY},
{"pagey", ATTR_PAGEY},
{"tabindex", ATTR_TABINDEX},
{"scrolldelay", ATTR_SCROLLDELAY},
{"bgproperties", ATTR_BGPROPERTIES},
{"onkeyup", ATTR_ONKEYUP},
{"disabled", ATTR_DISABLED},
{"onkeypress", ATTR_ONKEYPRESS},
{"hreflang", ATTR_HREFLANG},
{"frameborder", ATTR_FRAMEBORDER},
{"standby", ATTR_STANDBY},
{"pluginpage", ATTR_PLUGINPAGE},
{"cellpadding", ATTR_CELLPADDING},
{"vlink", ATTR_VLINK},
{"pluginspage", ATTR_PLUGINSPAGE},
{"background", ATTR_BACKGROUND},
{"height", ATTR_HEIGHT},
{"ondblclick", ATTR_ONDBLCLICK},
{"valign", ATTR_VALIGN},
{"accesskey", ATTR_ACCESSKEY},
{"http-equiv", ATTR_HTTP_EQUIV},
{"direction", ATTR_DIRECTION},
{"valuetype", ATTR_VALUETYPE},
{"archive", ATTR_ARCHIVE},
{"charoff", ATTR_CHAROFF},
{"leftmargin", ATTR_LEFTMARGIN},
{"mayscript", ATTR_MAYSCRIPT},
{"width", ATTR_WIDTH},
{"behavior", ATTR_BEHAVIOR},
{"keytype", ATTR_KEYTYPE},
{"onkeydown", ATTR_ONKEYDOWN},
{"marginheight", ATTR_MARGINHEIGHT},
{"marginwidth", ATTR_MARGINWIDTH},
{"visibility", ATTR_VISIBILITY}
};
static const short lookup[] =
{
-1, -1, -1, 0, 1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, 2, -1, 3, 4, -1, -1, 5,
-1, -1, -1, -1, 6, -1, -1, 7,
-1, -1, 8, -1, -1, 9, -1, -1,
10, -1, -1, 11, -1, -1, -1, -1,
12, 13, -1, -1, -1, -1, 14, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
15, 16, -1, 17, -1, -1, 18, 19,
20, 21, 22, 23, -1, -1, -1, -1,
24, 25, 26, 27, -1, 28, 29, -1,
-1, 30, -1, -1, -1, -1, -1, -1,
31, 32, -1, -1, -1, 33, -1, -1,
-1, -1, 34, -1, -1, -1, -1, -1,
-1, -1, -1, 35, -1, -1, -1, 36,
-1, -1, -1, -1, -1, -1, 37, 38,
-1, 39, -1, -1, -1, 40, -1, -1,
-1, 41, -1, -1, 42, 43, 44, -1,
45, -1, -1, -1, -1, -1, -1, 46,
-1, 47, -1, -1, 48, -1, 49, -1,
50, -1, -1, -1, 51, -1, -1, -1,
-1, 52, -1, 53, -1, -1, -1, -1,
54, 55, -1, -1, 56, -1, -1, 57,
-1, -1, 58, 59, 60, 61, -1, -1,
62, -1, -1, -1, 63, -1, -1, -1,
-1, 64, 65, -1, 66, -1, -1, -1,
-1, 67, 68, 69, 70, 71, -1, -1,
-1, 72, -1, 73, -1, -1, -1, -1,
-1, 74, -1, 75, 76, 77, 78, -1,
-1, -1, -1, 79, 80, -1, -396, 83,
84, -73, -2, -1, 85, -1, -1, -1,
-1, 86, 87, -1, -1, 88, 89, -1,
-1, 90, -1, 91, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, 92, 93, 94, 95, 96, 97,
-1, 98, -1, 99, -1, -1, -1, 100,
101, -1, -1, -1, 102, -1, 103, -1,
-1, 104, -1, -1, -1, 105, -1, -1,
106, 107, -1, -1, 108, -1, -1, -1,
-1, -1, -1, -1, -1, 109, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, 110, -1,
111, -1, -1, -1, 112, -1, 113, -1,
-1, -1, -1, -1, -1, 114, -1, -1,
115, -1, -1, -1, -1, 116, -1, -1,
117, -1, -1, -1, -1, -1, 118, 119,
120, -1, 121, -1, -1, 122, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, 123, 124, -1, -1, -1, -1,
125, -1, -1, -1, -1, -1, 126, -1,
127, -1, -1, 128, -1, -1, 129, -1,
-1, -1, -1, -1, 130, -1, -1, -1,
-1, -1, -1, -1, 131, 132, -1, -1,
-1, 133, 134, -1, -1, -1, 135, 136,
-1, -1, -1, 137, 138, -1, -1, 139,
140, -1, -1, -1, 141, -1, -1, -1,
-1, -1, -1, -1, -1, -1, 142, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, 143, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, 144, -1, -1, 145,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, 146, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
147, -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, 149, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, 150, -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, -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, -1, -1,
-1, -1, 151, -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,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, 152, -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, -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, -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, -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,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, 153
};
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",
"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];
};