nokogumbo 1.5.0 → 2.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +237 -26
  3. data/ext/nokogumbo/extconf.rb +121 -0
  4. data/ext/nokogumbo/nokogumbo.c +793 -0
  5. data/gumbo-parser/src/ascii.c +75 -0
  6. data/gumbo-parser/src/ascii.h +115 -0
  7. data/gumbo-parser/src/attribute.c +26 -28
  8. data/gumbo-parser/src/attribute.h +3 -23
  9. data/gumbo-parser/src/char_ref.c +5972 -6816
  10. data/gumbo-parser/src/char_ref.h +14 -45
  11. data/gumbo-parser/src/error.c +510 -163
  12. data/gumbo-parser/src/error.h +70 -147
  13. data/gumbo-parser/src/foreign_attrs.c +104 -0
  14. data/gumbo-parser/src/gumbo.h +577 -305
  15. data/gumbo-parser/src/insertion_mode.h +4 -28
  16. data/gumbo-parser/src/macros.h +91 -0
  17. data/gumbo-parser/src/parser.c +2922 -2228
  18. data/gumbo-parser/src/parser.h +6 -22
  19. data/gumbo-parser/src/replacement.h +33 -0
  20. data/gumbo-parser/src/string_buffer.c +43 -50
  21. data/gumbo-parser/src/string_buffer.h +24 -40
  22. data/gumbo-parser/src/string_piece.c +39 -39
  23. data/gumbo-parser/src/svg_attrs.c +174 -0
  24. data/gumbo-parser/src/svg_tags.c +137 -0
  25. data/gumbo-parser/src/tag.c +186 -59
  26. data/gumbo-parser/src/tag_lookup.c +382 -0
  27. data/gumbo-parser/src/tag_lookup.h +13 -0
  28. data/gumbo-parser/src/token_buffer.c +79 -0
  29. data/gumbo-parser/src/token_buffer.h +71 -0
  30. data/gumbo-parser/src/token_type.h +1 -25
  31. data/gumbo-parser/src/tokenizer.c +2127 -1561
  32. data/gumbo-parser/src/tokenizer.h +41 -52
  33. data/gumbo-parser/src/tokenizer_states.h +281 -45
  34. data/gumbo-parser/src/utf8.c +98 -123
  35. data/gumbo-parser/src/utf8.h +84 -52
  36. data/gumbo-parser/src/util.c +48 -38
  37. data/gumbo-parser/src/util.h +10 -40
  38. data/gumbo-parser/src/vector.c +45 -57
  39. data/gumbo-parser/src/vector.h +17 -39
  40. data/lib/nokogumbo.rb +11 -173
  41. data/lib/nokogumbo/html5.rb +252 -0
  42. data/lib/nokogumbo/html5/document.rb +53 -0
  43. data/lib/nokogumbo/html5/document_fragment.rb +62 -0
  44. data/lib/nokogumbo/html5/node.rb +72 -0
  45. data/lib/nokogumbo/version.rb +3 -0
  46. metadata +43 -24
  47. data/ext/nokogumboc/extconf.rb +0 -60
  48. data/ext/nokogumboc/nokogumbo.c +0 -295
  49. data/gumbo-parser/src/char_ref.rl +0 -2554
  50. data/gumbo-parser/src/string_piece.h +0 -38
  51. data/gumbo-parser/src/tag.in +0 -150
  52. data/gumbo-parser/src/tag_enum.h +0 -153
  53. data/gumbo-parser/src/tag_gperf.h +0 -105
  54. data/gumbo-parser/src/tag_sizes.h +0 -4
  55. data/gumbo-parser/src/tag_strings.h +0 -153
  56. data/gumbo-parser/visualc/include/strings.h +0 -4
  57. data/test-nokogumbo.rb +0 -190
@@ -0,0 +1,137 @@
1
+ /* ANSI-C code produced by gperf version 3.1 */
2
+ /* Command-line: gperf -m100 lib/svg_tags.gperf */
3
+ /* Computed positions: -k'3,7' */
4
+ /* Filtered by: mk/gperf-filter.sed */
5
+
6
+ #include "replacement.h"
7
+ #include "macros.h"
8
+ #include "ascii.h"
9
+ #include <string.h>
10
+
11
+ #define TOTAL_KEYWORDS 36
12
+ #define MIN_WORD_LENGTH 6
13
+ #define MAX_WORD_LENGTH 19
14
+ #define MIN_HASH_VALUE 6
15
+ #define MAX_HASH_VALUE 42
16
+ /* maximum key range = 37, duplicates = 0 */
17
+
18
+
19
+
20
+ static inline unsigned int
21
+ hash (register const char *str, register size_t len)
22
+ {
23
+ static const unsigned char asso_values[] =
24
+ {
25
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
26
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
27
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
28
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
29
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
30
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
31
+ 43, 43, 43, 43, 43, 43, 12, 2, 10, 22,
32
+ 1, 28, 15, 1, 43, 43, 43, 0, 9, 26,
33
+ 3, 17, 1, 11, 0, 22, 5, 43, 3, 2,
34
+ 43, 43, 43, 43, 43, 43, 43, 43, 12, 2,
35
+ 10, 22, 1, 28, 15, 1, 43, 43, 43, 0,
36
+ 9, 26, 3, 17, 1, 11, 0, 22, 5, 43,
37
+ 3, 2, 43, 43, 43, 43, 43, 43, 43, 43,
38
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
39
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
40
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
41
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
42
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
43
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
44
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
45
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
46
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
47
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
48
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
49
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
50
+ 43, 43, 43, 43, 43, 43, 43
51
+ };
52
+ register unsigned int hval = len;
53
+
54
+ switch (hval)
55
+ {
56
+ default:
57
+ hval += asso_values[(unsigned char)str[6]+1];
58
+ /*FALLTHROUGH*/
59
+ case 6:
60
+ case 5:
61
+ case 4:
62
+ case 3:
63
+ hval += asso_values[(unsigned char)str[2]];
64
+ break;
65
+ }
66
+ return hval;
67
+ }
68
+
69
+ const StringReplacement *
70
+ gumbo_get_svg_tag_replacement (register const char *str, register size_t len)
71
+ {
72
+ static const unsigned char lengthtable[] =
73
+ {
74
+ 0, 0, 0, 0, 0, 0, 6, 0, 7, 7, 7, 8, 11, 12,
75
+ 12, 13, 11, 12, 16, 7, 7, 16, 11, 7, 19, 8, 13, 17,
76
+ 11, 12, 7, 8, 17, 8, 18, 8, 14, 12, 14, 14, 13, 7,
77
+ 14
78
+ };
79
+ static const StringReplacement wordlist[] =
80
+ {
81
+ {(char*)0,(char*)0}, {(char*)0,(char*)0},
82
+ {(char*)0,(char*)0}, {(char*)0,(char*)0},
83
+ {(char*)0,(char*)0}, {(char*)0,(char*)0},
84
+ {"fetile", "feTile"},
85
+ {(char*)0,(char*)0},
86
+ {"femerge", "feMerge"},
87
+ {"feimage", "feImage"},
88
+ {"fefuncb", "feFuncB"},
89
+ {"glyphref", "glyphRef"},
90
+ {"femergenode", "feMergeNode"},
91
+ {"femorphology", "feMorphology"},
92
+ {"animatecolor", "animateColor"},
93
+ {"animatemotion", "animateMotion"},
94
+ {"fecomposite", "feComposite"},
95
+ {"feturbulence", "feTurbulence"},
96
+ {"animatetransform", "animateTransform"},
97
+ {"fefuncr", "feFuncR"},
98
+ {"fefunca", "feFuncA"},
99
+ {"feconvolvematrix", "feConvolveMatrix"},
100
+ {"fespotlight", "feSpotLight"},
101
+ {"fefuncg", "feFuncG"},
102
+ {"fecomponenttransfer", "feComponentTransfer"},
103
+ {"altglyph", "altGlyph"},
104
+ {"fecolormatrix", "feColorMatrix"},
105
+ {"fedisplacementmap", "feDisplacementMap"},
106
+ {"altglyphdef", "altGlyphDef"},
107
+ {"altglyphitem", "altGlyphItem"},
108
+ {"feflood", "feFlood"},
109
+ {"clippath", "clipPath"},
110
+ {"fediffuselighting", "feDiffuseLighting"},
111
+ {"textpath", "textPath"},
112
+ {"fespecularlighting", "feSpecularLighting"},
113
+ {"feoffset", "feOffset"},
114
+ {"fedistantlight", "feDistantLight"},
115
+ {"fepointlight", "fePointLight"},
116
+ {"lineargradient", "linearGradient"},
117
+ {"radialgradient", "radialGradient"},
118
+ {"foreignobject", "foreignObject"},
119
+ {"feblend", "feBlend"},
120
+ {"fegaussianblur", "feGaussianBlur"}
121
+ };
122
+
123
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
124
+ {
125
+ register unsigned int key = hash (str, len);
126
+
127
+ if (key <= MAX_HASH_VALUE)
128
+ if (len == lengthtable[key])
129
+ {
130
+ register const char *s = wordlist[key].from;
131
+
132
+ if (s && (((unsigned char)*str ^ (unsigned char)*s) & ~32) == 0 && !gumbo_ascii_strncasecmp(str, s, len))
133
+ return &wordlist[key];
134
+ }
135
+ }
136
+ return 0;
137
+ }
@@ -1,40 +1,187 @@
1
- // Copyright 2011 Google Inc. All Rights Reserved.
2
- //
3
- // Licensed under the Apache License, Version 2.0 (the "License");
4
- // you may not use this file except in compliance with the License.
5
- // You may obtain a copy of the License at
6
- //
7
- // http://www.apache.org/licenses/LICENSE-2.0
8
- //
9
- // Unless required by applicable law or agreed to in writing, software
10
- // distributed under the License is distributed on an "AS IS" BASIS,
11
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- // See the License for the specific language governing permissions and
13
- // limitations under the License.
14
- //
15
- // Author: jdtang@google.com (Jonathan Tang)
1
+ /*
2
+ Copyright 2011 Google Inc.
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ https://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ */
16
16
 
17
17
  #include "gumbo.h"
18
+ #include "util.h"
19
+ #include "tag_lookup.h"
18
20
 
19
21
  #include <assert.h>
20
- #include <ctype.h>
21
22
  #include <string.h>
22
23
 
23
- const char* kGumboTagNames[] = {
24
- #include "tag_strings.h"
25
- "", // TAG_UNKNOWN
26
- "", // TAG_LAST
27
- };
24
+ static const char kGumboTagNames[GUMBO_TAG_LAST+1][15] = {
25
+ [GUMBO_TAG_HTML] = "html",
26
+ [GUMBO_TAG_HEAD] = "head",
27
+ [GUMBO_TAG_TITLE] = "title",
28
+ [GUMBO_TAG_BASE] = "base",
29
+ [GUMBO_TAG_LINK] = "link",
30
+ [GUMBO_TAG_META] = "meta",
31
+ [GUMBO_TAG_STYLE] = "style",
32
+ [GUMBO_TAG_SCRIPT] = "script",
33
+ [GUMBO_TAG_NOSCRIPT] = "noscript",
34
+ [GUMBO_TAG_TEMPLATE] = "template",
35
+ [GUMBO_TAG_BODY] = "body",
36
+ [GUMBO_TAG_ARTICLE] = "article",
37
+ [GUMBO_TAG_SECTION] = "section",
38
+ [GUMBO_TAG_NAV] = "nav",
39
+ [GUMBO_TAG_ASIDE] = "aside",
40
+ [GUMBO_TAG_H1] = "h1",
41
+ [GUMBO_TAG_H2] = "h2",
42
+ [GUMBO_TAG_H3] = "h3",
43
+ [GUMBO_TAG_H4] = "h4",
44
+ [GUMBO_TAG_H5] = "h5",
45
+ [GUMBO_TAG_H6] = "h6",
46
+ [GUMBO_TAG_HGROUP] = "hgroup",
47
+ [GUMBO_TAG_HEADER] = "header",
48
+ [GUMBO_TAG_FOOTER] = "footer",
49
+ [GUMBO_TAG_ADDRESS] = "address",
50
+ [GUMBO_TAG_P] = "p",
51
+ [GUMBO_TAG_HR] = "hr",
52
+ [GUMBO_TAG_PRE] = "pre",
53
+ [GUMBO_TAG_BLOCKQUOTE] = "blockquote",
54
+ [GUMBO_TAG_OL] = "ol",
55
+ [GUMBO_TAG_UL] = "ul",
56
+ [GUMBO_TAG_LI] = "li",
57
+ [GUMBO_TAG_DL] = "dl",
58
+ [GUMBO_TAG_DT] = "dt",
59
+ [GUMBO_TAG_DD] = "dd",
60
+ [GUMBO_TAG_FIGURE] = "figure",
61
+ [GUMBO_TAG_FIGCAPTION] = "figcaption",
62
+ [GUMBO_TAG_MAIN] = "main",
63
+ [GUMBO_TAG_DIV] = "div",
64
+ [GUMBO_TAG_A] = "a",
65
+ [GUMBO_TAG_EM] = "em",
66
+ [GUMBO_TAG_STRONG] = "strong",
67
+ [GUMBO_TAG_SMALL] = "small",
68
+ [GUMBO_TAG_S] = "s",
69
+ [GUMBO_TAG_CITE] = "cite",
70
+ [GUMBO_TAG_Q] = "q",
71
+ [GUMBO_TAG_DFN] = "dfn",
72
+ [GUMBO_TAG_ABBR] = "abbr",
73
+ [GUMBO_TAG_DATA] = "data",
74
+ [GUMBO_TAG_TIME] = "time",
75
+ [GUMBO_TAG_CODE] = "code",
76
+ [GUMBO_TAG_VAR] = "var",
77
+ [GUMBO_TAG_SAMP] = "samp",
78
+ [GUMBO_TAG_KBD] = "kbd",
79
+ [GUMBO_TAG_SUB] = "sub",
80
+ [GUMBO_TAG_SUP] = "sup",
81
+ [GUMBO_TAG_I] = "i",
82
+ [GUMBO_TAG_B] = "b",
83
+ [GUMBO_TAG_U] = "u",
84
+ [GUMBO_TAG_MARK] = "mark",
85
+ [GUMBO_TAG_RUBY] = "ruby",
86
+ [GUMBO_TAG_RT] = "rt",
87
+ [GUMBO_TAG_RP] = "rp",
88
+ [GUMBO_TAG_BDI] = "bdi",
89
+ [GUMBO_TAG_BDO] = "bdo",
90
+ [GUMBO_TAG_SPAN] = "span",
91
+ [GUMBO_TAG_BR] = "br",
92
+ [GUMBO_TAG_WBR] = "wbr",
93
+ [GUMBO_TAG_INS] = "ins",
94
+ [GUMBO_TAG_DEL] = "del",
95
+ [GUMBO_TAG_IMAGE] = "image",
96
+ [GUMBO_TAG_IMG] = "img",
97
+ [GUMBO_TAG_IFRAME] = "iframe",
98
+ [GUMBO_TAG_EMBED] = "embed",
99
+ [GUMBO_TAG_OBJECT] = "object",
100
+ [GUMBO_TAG_PARAM] = "param",
101
+ [GUMBO_TAG_VIDEO] = "video",
102
+ [GUMBO_TAG_AUDIO] = "audio",
103
+ [GUMBO_TAG_SOURCE] = "source",
104
+ [GUMBO_TAG_TRACK] = "track",
105
+ [GUMBO_TAG_CANVAS] = "canvas",
106
+ [GUMBO_TAG_MAP] = "map",
107
+ [GUMBO_TAG_AREA] = "area",
108
+ [GUMBO_TAG_MATH] = "math",
109
+ [GUMBO_TAG_MI] = "mi",
110
+ [GUMBO_TAG_MO] = "mo",
111
+ [GUMBO_TAG_MN] = "mn",
112
+ [GUMBO_TAG_MS] = "ms",
113
+ [GUMBO_TAG_MTEXT] = "mtext",
114
+ [GUMBO_TAG_MGLYPH] = "mglyph",
115
+ [GUMBO_TAG_MALIGNMARK] = "malignmark",
116
+ [GUMBO_TAG_ANNOTATION_XML] = "annotation-xml",
117
+ [GUMBO_TAG_SVG] = "svg",
118
+ [GUMBO_TAG_FOREIGNOBJECT] = "foreignobject",
119
+ [GUMBO_TAG_DESC] = "desc",
120
+ [GUMBO_TAG_TABLE] = "table",
121
+ [GUMBO_TAG_CAPTION] = "caption",
122
+ [GUMBO_TAG_COLGROUP] = "colgroup",
123
+ [GUMBO_TAG_COL] = "col",
124
+ [GUMBO_TAG_TBODY] = "tbody",
125
+ [GUMBO_TAG_THEAD] = "thead",
126
+ [GUMBO_TAG_TFOOT] = "tfoot",
127
+ [GUMBO_TAG_TR] = "tr",
128
+ [GUMBO_TAG_TD] = "td",
129
+ [GUMBO_TAG_TH] = "th",
130
+ [GUMBO_TAG_FORM] = "form",
131
+ [GUMBO_TAG_FIELDSET] = "fieldset",
132
+ [GUMBO_TAG_LEGEND] = "legend",
133
+ [GUMBO_TAG_LABEL] = "label",
134
+ [GUMBO_TAG_INPUT] = "input",
135
+ [GUMBO_TAG_BUTTON] = "button",
136
+ [GUMBO_TAG_SELECT] = "select",
137
+ [GUMBO_TAG_DATALIST] = "datalist",
138
+ [GUMBO_TAG_OPTGROUP] = "optgroup",
139
+ [GUMBO_TAG_OPTION] = "option",
140
+ [GUMBO_TAG_TEXTAREA] = "textarea",
141
+ [GUMBO_TAG_KEYGEN] = "keygen",
142
+ [GUMBO_TAG_OUTPUT] = "output",
143
+ [GUMBO_TAG_PROGRESS] = "progress",
144
+ [GUMBO_TAG_METER] = "meter",
145
+ [GUMBO_TAG_DETAILS] = "details",
146
+ [GUMBO_TAG_SUMMARY] = "summary",
147
+ [GUMBO_TAG_MENU] = "menu",
148
+ [GUMBO_TAG_MENUITEM] = "menuitem",
149
+ [GUMBO_TAG_APPLET] = "applet",
150
+ [GUMBO_TAG_ACRONYM] = "acronym",
151
+ [GUMBO_TAG_BGSOUND] = "bgsound",
152
+ [GUMBO_TAG_DIR] = "dir",
153
+ [GUMBO_TAG_FRAME] = "frame",
154
+ [GUMBO_TAG_FRAMESET] = "frameset",
155
+ [GUMBO_TAG_NOFRAMES] = "noframes",
156
+ [GUMBO_TAG_LISTING] = "listing",
157
+ [GUMBO_TAG_XMP] = "xmp",
158
+ [GUMBO_TAG_NEXTID] = "nextid",
159
+ [GUMBO_TAG_NOEMBED] = "noembed",
160
+ [GUMBO_TAG_PLAINTEXT] = "plaintext",
161
+ [GUMBO_TAG_RB] = "rb",
162
+ [GUMBO_TAG_STRIKE] = "strike",
163
+ [GUMBO_TAG_BASEFONT] = "basefont",
164
+ [GUMBO_TAG_BIG] = "big",
165
+ [GUMBO_TAG_BLINK] = "blink",
166
+ [GUMBO_TAG_CENTER] = "center",
167
+ [GUMBO_TAG_FONT] = "font",
168
+ [GUMBO_TAG_MARQUEE] = "marquee",
169
+ [GUMBO_TAG_MULTICOL] = "multicol",
170
+ [GUMBO_TAG_NOBR] = "nobr",
171
+ [GUMBO_TAG_SPACER] = "spacer",
172
+ [GUMBO_TAG_TT] = "tt",
173
+ [GUMBO_TAG_RTC] = "rtc",
174
+ [GUMBO_TAG_DIALOG] = "dialog",
28
175
 
29
- static const unsigned char kGumboTagSizes[] = {
30
- #include "tag_sizes.h"
31
- 0, // TAG_UNKNOWN
32
- 0, // TAG_LAST
176
+ [GUMBO_TAG_UNKNOWN] = "",
177
+ [GUMBO_TAG_LAST] = "",
33
178
  };
34
179
 
35
180
  const char* gumbo_normalized_tagname(GumboTag tag) {
36
181
  assert(tag <= GUMBO_TAG_LAST);
37
- return kGumboTagNames[tag];
182
+ const char *tagname = kGumboTagNames[tag];
183
+ assert(tagname);
184
+ return tagname;
38
185
  }
39
186
 
40
187
  void gumbo_tag_from_original_text(GumboStringPiece* text) {
@@ -45,51 +192,31 @@ void gumbo_tag_from_original_text(GumboStringPiece* text) {
45
192
  assert(text->length >= 2);
46
193
  assert(text->data[0] == '<');
47
194
  assert(text->data[text->length - 1] == '>');
195
+
48
196
  if (text->data[1] == '/') {
49
- // End tag.
197
+ // End tag
50
198
  assert(text->length >= 3);
51
199
  text->data += 2; // Move past </
52
200
  text->length -= 3;
53
201
  } else {
54
- // Start tag.
202
+ // Start tag
55
203
  text->data += 1; // Move past <
56
204
  text->length -= 2;
57
- // strnchr is apparently not a standard C library function, so I loop
58
- // explicitly looking for whitespace or other illegal tag characters.
59
205
  for (const char* c = text->data; c != text->data + text->length; ++c) {
60
- if (isspace(*c) || *c == '/') {
206
+ switch (*c) {
207
+ case '\t':
208
+ case '\n':
209
+ case '\f':
210
+ case ' ':
211
+ case '/':
61
212
  text->length = c - text->data;
62
- break;
213
+ return;
63
214
  }
64
215
  }
65
216
  }
66
217
  }
67
218
 
68
- static int case_memcmp(const char* s1, const char* s2, unsigned int n) {
69
- while (n--) {
70
- unsigned char c1 = tolower(*s1++);
71
- unsigned char c2 = tolower(*s2++);
72
- if (c1 != c2) return (int) c1 - (int) c2;
73
- }
74
- return 0;
75
- }
76
-
77
- #include "tag_gperf.h"
78
- #define TAG_MAP_SIZE (sizeof(kGumboTagMap) / sizeof(kGumboTagMap[0]))
79
-
80
- GumboTag gumbo_tagn_enum(const char* tagname, unsigned int length) {
81
- if (length) {
82
- unsigned int key = tag_hash(tagname, length);
83
- if (key < TAG_MAP_SIZE) {
84
- GumboTag tag = kGumboTagMap[key];
85
- if (length == kGumboTagSizes[(int) tag] &&
86
- !case_memcmp(tagname, kGumboTagNames[(int) tag], length))
87
- return tag;
88
- }
89
- }
90
- return GUMBO_TAG_UNKNOWN;
91
- }
92
-
93
- GumboTag gumbo_tag_enum(const char* tagname) {
94
- return gumbo_tagn_enum(tagname, strlen(tagname));
219
+ GumboTag gumbo_tagn_enum(const char *tagname, size_t tagname_length) {
220
+ const TagHashSlot *slot = gumbo_tag_lookup(tagname, tagname_length);
221
+ return slot ? slot->tag : GUMBO_TAG_UNKNOWN;
95
222
  }
@@ -0,0 +1,382 @@
1
+ /* ANSI-C code produced by gperf version 3.1 */
2
+ /* Command-line: gperf -m100 lib/tag_lookup.gperf */
3
+ /* Computed positions: -k'1-2,$' */
4
+ /* Filtered by: mk/gperf-filter.sed */
5
+
6
+ #include "tag_lookup.h"
7
+ #include "macros.h"
8
+ #include "ascii.h"
9
+ #include <string.h>
10
+
11
+ #define TOTAL_KEYWORDS 150
12
+ #define MIN_WORD_LENGTH 1
13
+ #define MAX_WORD_LENGTH 14
14
+ #define MIN_HASH_VALUE 9
15
+ #define MAX_HASH_VALUE 271
16
+ /* maximum key range = 263, duplicates = 0 */
17
+
18
+
19
+
20
+ static inline unsigned int
21
+ hash (register const char *str, register size_t len)
22
+ {
23
+ static const unsigned short asso_values[] =
24
+ {
25
+ 272, 272, 272, 272, 272, 272, 272, 272, 272, 272,
26
+ 272, 272, 272, 272, 272, 272, 272, 272, 272, 272,
27
+ 272, 272, 272, 272, 272, 272, 272, 272, 272, 272,
28
+ 272, 272, 272, 272, 272, 272, 272, 272, 272, 272,
29
+ 272, 272, 272, 272, 272, 272, 272, 272, 272, 9,
30
+ 7, 6, 4, 4, 3, 4, 3, 3, 272, 272,
31
+ 272, 272, 272, 272, 272, 70, 83, 152, 7, 16,
32
+ 61, 98, 5, 76, 102, 126, 12, 19, 54, 54,
33
+ 31, 97, 3, 4, 9, 33, 136, 113, 86, 15,
34
+ 272, 272, 272, 272, 272, 272, 272, 70, 83, 152,
35
+ 7, 16, 61, 98, 5, 76, 102, 126, 12, 19,
36
+ 54, 54, 31, 97, 3, 4, 9, 33, 136, 113,
37
+ 86, 15, 272, 272, 272, 272, 272, 272, 272, 272,
38
+ 272, 272, 272, 272, 272, 272, 272, 272, 272, 272,
39
+ 272, 272, 272, 272, 272, 272, 272, 272, 272, 272,
40
+ 272, 272, 272, 272, 272, 272, 272, 272, 272, 272,
41
+ 272, 272, 272, 272, 272, 272, 272, 272, 272, 272,
42
+ 272, 272, 272, 272, 272, 272, 272, 272, 272, 272,
43
+ 272, 272, 272, 272, 272, 272, 272, 272, 272, 272,
44
+ 272, 272, 272, 272, 272, 272, 272, 272, 272, 272,
45
+ 272, 272, 272, 272, 272, 272, 272, 272, 272, 272,
46
+ 272, 272, 272, 272, 272, 272, 272, 272, 272, 272,
47
+ 272, 272, 272, 272, 272, 272, 272, 272, 272, 272,
48
+ 272, 272, 272, 272, 272, 272, 272, 272, 272, 272,
49
+ 272, 272, 272, 272, 272, 272, 272, 272, 272, 272,
50
+ 272, 272, 272, 272, 272, 272, 272, 272, 272
51
+ };
52
+ register unsigned int hval = len;
53
+
54
+ switch (hval)
55
+ {
56
+ default:
57
+ hval += asso_values[(unsigned char)str[1]+3];
58
+ /*FALLTHROUGH*/
59
+ case 1:
60
+ hval += asso_values[(unsigned char)str[0]];
61
+ break;
62
+ }
63
+ return hval + asso_values[(unsigned char)str[len - 1]];
64
+ }
65
+
66
+ const TagHashSlot *
67
+ gumbo_tag_lookup (register const char *str, register size_t len)
68
+ {
69
+ static const unsigned char lengthtable[] =
70
+ {
71
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2,
72
+ 2, 2, 2, 6, 2, 6, 2, 4, 0, 7, 6, 3, 0, 3,
73
+ 0, 6, 6, 8, 5, 0, 0, 4, 5, 5, 8, 0, 2, 4,
74
+ 5, 2, 0, 5, 4, 2, 0, 7, 0, 8, 5, 0, 0, 0,
75
+ 0, 0, 0, 5, 3, 4, 5, 1, 4, 0, 4, 1, 2, 8,
76
+ 7, 7, 6, 6, 8, 2, 8, 4, 2, 0, 6, 0, 0, 3,
77
+ 4, 6, 13, 4, 4, 6, 8, 0, 8, 4, 0, 6, 0, 8,
78
+ 4, 5, 0, 2, 2, 9, 2, 4, 0, 8, 4, 2, 4, 8,
79
+ 7, 0, 2, 5, 2, 0, 6, 0, 3, 2, 2, 6, 3, 8,
80
+ 7, 2, 5, 7, 0, 2, 6, 2, 4, 3, 0, 10, 5, 6,
81
+ 3, 1, 2, 0, 6, 0, 5, 5, 0, 3, 0, 3, 3, 1,
82
+ 4, 6, 4, 7, 3, 0, 0, 2, 10, 10, 0, 0, 6, 1,
83
+ 4, 6, 3, 0, 2, 5, 6, 4, 3, 4, 0, 7, 3, 0,
84
+ 0, 0, 4, 0, 0, 5, 0, 0, 0, 6, 0, 14, 8, 1,
85
+ 3, 0, 0, 7, 3, 0, 0, 0, 0, 0, 0, 5, 3, 0,
86
+ 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 7, 6, 0, 0,
87
+ 0, 0, 0, 5, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0,
88
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
89
+ 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0,
90
+ 0, 0, 5, 0, 0, 3
91
+ };
92
+ static const TagHashSlot wordlist[] =
93
+ {
94
+ {(char*)0,GUMBO_TAG_UNKNOWN},
95
+ {(char*)0,GUMBO_TAG_UNKNOWN},
96
+ {(char*)0,GUMBO_TAG_UNKNOWN},
97
+ {(char*)0,GUMBO_TAG_UNKNOWN},
98
+ {(char*)0,GUMBO_TAG_UNKNOWN},
99
+ {(char*)0,GUMBO_TAG_UNKNOWN},
100
+ {(char*)0,GUMBO_TAG_UNKNOWN},
101
+ {(char*)0,GUMBO_TAG_UNKNOWN},
102
+ {(char*)0,GUMBO_TAG_UNKNOWN},
103
+ {"s", GUMBO_TAG_S},
104
+ {(char*)0,GUMBO_TAG_UNKNOWN},
105
+ {(char*)0,GUMBO_TAG_UNKNOWN},
106
+ {(char*)0,GUMBO_TAG_UNKNOWN},
107
+ {"h6", GUMBO_TAG_H6},
108
+ {"h5", GUMBO_TAG_H5},
109
+ {"h4", GUMBO_TAG_H4},
110
+ {"h3", GUMBO_TAG_H3},
111
+ {"spacer", GUMBO_TAG_SPACER},
112
+ {"h2", GUMBO_TAG_H2},
113
+ {"header", GUMBO_TAG_HEADER},
114
+ {"h1", GUMBO_TAG_H1},
115
+ {"head", GUMBO_TAG_HEAD},
116
+ {(char*)0,GUMBO_TAG_UNKNOWN},
117
+ {"details", GUMBO_TAG_DETAILS},
118
+ {"select", GUMBO_TAG_SELECT},
119
+ {"dir", GUMBO_TAG_DIR},
120
+ {(char*)0,GUMBO_TAG_UNKNOWN},
121
+ {"del", GUMBO_TAG_DEL},
122
+ {(char*)0,GUMBO_TAG_UNKNOWN},
123
+ {"source", GUMBO_TAG_SOURCE},
124
+ {"legend", GUMBO_TAG_LEGEND},
125
+ {"datalist", GUMBO_TAG_DATALIST},
126
+ {"meter", GUMBO_TAG_METER},
127
+ {(char*)0,GUMBO_TAG_UNKNOWN},
128
+ {(char*)0,GUMBO_TAG_UNKNOWN},
129
+ {"math", GUMBO_TAG_MATH},
130
+ {"label", GUMBO_TAG_LABEL},
131
+ {"table", GUMBO_TAG_TABLE},
132
+ {"template", GUMBO_TAG_TEMPLATE},
133
+ {(char*)0,GUMBO_TAG_UNKNOWN},
134
+ {"rp", GUMBO_TAG_RP},
135
+ {"time", GUMBO_TAG_TIME},
136
+ {"title", GUMBO_TAG_TITLE},
137
+ {"hr", GUMBO_TAG_HR},
138
+ {(char*)0,GUMBO_TAG_UNKNOWN},
139
+ {"tbody", GUMBO_TAG_TBODY},
140
+ {"samp", GUMBO_TAG_SAMP},
141
+ {"tr", GUMBO_TAG_TR},
142
+ {(char*)0,GUMBO_TAG_UNKNOWN},
143
+ {"marquee", GUMBO_TAG_MARQUEE},
144
+ {(char*)0,GUMBO_TAG_UNKNOWN},
145
+ {"menuitem", GUMBO_TAG_MENUITEM},
146
+ {"small", GUMBO_TAG_SMALL},
147
+ {(char*)0,GUMBO_TAG_UNKNOWN},
148
+ {(char*)0,GUMBO_TAG_UNKNOWN},
149
+ {(char*)0,GUMBO_TAG_UNKNOWN},
150
+ {(char*)0,GUMBO_TAG_UNKNOWN},
151
+ {(char*)0,GUMBO_TAG_UNKNOWN},
152
+ {(char*)0,GUMBO_TAG_UNKNOWN},
153
+ {"embed", GUMBO_TAG_EMBED},
154
+ {"map", GUMBO_TAG_MAP},
155
+ {"menu", GUMBO_TAG_MENU},
156
+ {"param", GUMBO_TAG_PARAM},
157
+ {"p", GUMBO_TAG_P},
158
+ {"nobr", GUMBO_TAG_NOBR},
159
+ {(char*)0,GUMBO_TAG_UNKNOWN},
160
+ {"span", GUMBO_TAG_SPAN},
161
+ {"u", GUMBO_TAG_U},
162
+ {"em", GUMBO_TAG_EM},
163
+ {"noframes", GUMBO_TAG_NOFRAMES},
164
+ {"section", GUMBO_TAG_SECTION},
165
+ {"noembed", GUMBO_TAG_NOEMBED},
166
+ {"nextid", GUMBO_TAG_NEXTID},
167
+ {"footer", GUMBO_TAG_FOOTER},
168
+ {"noscript", GUMBO_TAG_NOSCRIPT},
169
+ {"dl", GUMBO_TAG_DL},
170
+ {"progress", GUMBO_TAG_PROGRESS},
171
+ {"font", GUMBO_TAG_FONT},
172
+ {"mo", GUMBO_TAG_MO},
173
+ {(char*)0,GUMBO_TAG_UNKNOWN},
174
+ {"script", GUMBO_TAG_SCRIPT},
175
+ {(char*)0,GUMBO_TAG_UNKNOWN},
176
+ {(char*)0,GUMBO_TAG_UNKNOWN},
177
+ {"pre", GUMBO_TAG_PRE},
178
+ {"main", GUMBO_TAG_MAIN},
179
+ {"object", GUMBO_TAG_OBJECT},
180
+ {"foreignobject", GUMBO_TAG_FOREIGNOBJECT},
181
+ {"form", GUMBO_TAG_FORM},
182
+ {"data", GUMBO_TAG_DATA},
183
+ {"applet", GUMBO_TAG_APPLET},
184
+ {"fieldset", GUMBO_TAG_FIELDSET},
185
+ {(char*)0,GUMBO_TAG_UNKNOWN},
186
+ {"textarea", GUMBO_TAG_TEXTAREA},
187
+ {"abbr", GUMBO_TAG_ABBR},
188
+ {(char*)0,GUMBO_TAG_UNKNOWN},
189
+ {"figure", GUMBO_TAG_FIGURE},
190
+ {(char*)0,GUMBO_TAG_UNKNOWN},
191
+ {"optgroup", GUMBO_TAG_OPTGROUP},
192
+ {"meta", GUMBO_TAG_META},
193
+ {"tfoot", GUMBO_TAG_TFOOT},
194
+ {(char*)0,GUMBO_TAG_UNKNOWN},
195
+ {"ul", GUMBO_TAG_UL},
196
+ {"li", GUMBO_TAG_LI},
197
+ {"plaintext", GUMBO_TAG_PLAINTEXT},
198
+ {"rb", GUMBO_TAG_RB},
199
+ {"body", GUMBO_TAG_BODY},
200
+ {(char*)0,GUMBO_TAG_UNKNOWN},
201
+ {"basefont", GUMBO_TAG_BASEFONT},
202
+ {"ruby", GUMBO_TAG_RUBY},
203
+ {"mi", GUMBO_TAG_MI},
204
+ {"base", GUMBO_TAG_BASE},
205
+ {"frameset", GUMBO_TAG_FRAMESET},
206
+ {"summary", GUMBO_TAG_SUMMARY},
207
+ {(char*)0,GUMBO_TAG_UNKNOWN},
208
+ {"dd", GUMBO_TAG_DD},
209
+ {"frame", GUMBO_TAG_FRAME},
210
+ {"td", GUMBO_TAG_TD},
211
+ {(char*)0,GUMBO_TAG_UNKNOWN},
212
+ {"option", GUMBO_TAG_OPTION},
213
+ {(char*)0,GUMBO_TAG_UNKNOWN},
214
+ {"svg", GUMBO_TAG_SVG},
215
+ {"br", GUMBO_TAG_BR},
216
+ {"ol", GUMBO_TAG_OL},
217
+ {"dialog", GUMBO_TAG_DIALOG},
218
+ {"sup", GUMBO_TAG_SUP},
219
+ {"multicol", GUMBO_TAG_MULTICOL},
220
+ {"article", GUMBO_TAG_ARTICLE},
221
+ {"rt", GUMBO_TAG_RT},
222
+ {"image", GUMBO_TAG_IMAGE},
223
+ {"listing", GUMBO_TAG_LISTING},
224
+ {(char*)0,GUMBO_TAG_UNKNOWN},
225
+ {"dt", GUMBO_TAG_DT},
226
+ {"mglyph", GUMBO_TAG_MGLYPH},
227
+ {"tt", GUMBO_TAG_TT},
228
+ {"html", GUMBO_TAG_HTML},
229
+ {"wbr", GUMBO_TAG_WBR},
230
+ {(char*)0,GUMBO_TAG_UNKNOWN},
231
+ {"figcaption", GUMBO_TAG_FIGCAPTION},
232
+ {"style", GUMBO_TAG_STYLE},
233
+ {"strike", GUMBO_TAG_STRIKE},
234
+ {"dfn", GUMBO_TAG_DFN},
235
+ {"a", GUMBO_TAG_A},
236
+ {"th", GUMBO_TAG_TH},
237
+ {(char*)0,GUMBO_TAG_UNKNOWN},
238
+ {"hgroup", GUMBO_TAG_HGROUP},
239
+ {(char*)0,GUMBO_TAG_UNKNOWN},
240
+ {"mtext", GUMBO_TAG_MTEXT},
241
+ {"thead", GUMBO_TAG_THEAD},
242
+ {(char*)0,GUMBO_TAG_UNKNOWN},
243
+ {"var", GUMBO_TAG_VAR},
244
+ {(char*)0,GUMBO_TAG_UNKNOWN},
245
+ {"xmp", GUMBO_TAG_XMP},
246
+ {"kbd", GUMBO_TAG_KBD},
247
+ {"i", GUMBO_TAG_I},
248
+ {"link", GUMBO_TAG_LINK},
249
+ {"output", GUMBO_TAG_OUTPUT},
250
+ {"mark", GUMBO_TAG_MARK},
251
+ {"acronym", GUMBO_TAG_ACRONYM},
252
+ {"div", GUMBO_TAG_DIV},
253
+ {(char*)0,GUMBO_TAG_UNKNOWN},
254
+ {(char*)0,GUMBO_TAG_UNKNOWN},
255
+ {"ms", GUMBO_TAG_MS},
256
+ {"malignmark", GUMBO_TAG_MALIGNMARK},
257
+ {"blockquote", GUMBO_TAG_BLOCKQUOTE},
258
+ {(char*)0,GUMBO_TAG_UNKNOWN},
259
+ {(char*)0,GUMBO_TAG_UNKNOWN},
260
+ {"center", GUMBO_TAG_CENTER},
261
+ {"b", GUMBO_TAG_B},
262
+ {"desc", GUMBO_TAG_DESC},
263
+ {"canvas", GUMBO_TAG_CANVAS},
264
+ {"col", GUMBO_TAG_COL},
265
+ {(char*)0,GUMBO_TAG_UNKNOWN},
266
+ {"mn", GUMBO_TAG_MN},
267
+ {"track", GUMBO_TAG_TRACK},
268
+ {"iframe", GUMBO_TAG_IFRAME},
269
+ {"code", GUMBO_TAG_CODE},
270
+ {"sub", GUMBO_TAG_SUB},
271
+ {"area", GUMBO_TAG_AREA},
272
+ {(char*)0,GUMBO_TAG_UNKNOWN},
273
+ {"address", GUMBO_TAG_ADDRESS},
274
+ {"ins", GUMBO_TAG_INS},
275
+ {(char*)0,GUMBO_TAG_UNKNOWN},
276
+ {(char*)0,GUMBO_TAG_UNKNOWN},
277
+ {(char*)0,GUMBO_TAG_UNKNOWN},
278
+ {"cite", GUMBO_TAG_CITE},
279
+ {(char*)0,GUMBO_TAG_UNKNOWN},
280
+ {(char*)0,GUMBO_TAG_UNKNOWN},
281
+ {"input", GUMBO_TAG_INPUT},
282
+ {(char*)0,GUMBO_TAG_UNKNOWN},
283
+ {(char*)0,GUMBO_TAG_UNKNOWN},
284
+ {(char*)0,GUMBO_TAG_UNKNOWN},
285
+ {"keygen", GUMBO_TAG_KEYGEN},
286
+ {(char*)0,GUMBO_TAG_UNKNOWN},
287
+ {"annotation-xml", GUMBO_TAG_ANNOTATION_XML},
288
+ {"colgroup", GUMBO_TAG_COLGROUP},
289
+ {"q", GUMBO_TAG_Q},
290
+ {"big", GUMBO_TAG_BIG},
291
+ {(char*)0,GUMBO_TAG_UNKNOWN},
292
+ {(char*)0,GUMBO_TAG_UNKNOWN},
293
+ {"bgsound", GUMBO_TAG_BGSOUND},
294
+ {"nav", GUMBO_TAG_NAV},
295
+ {(char*)0,GUMBO_TAG_UNKNOWN},
296
+ {(char*)0,GUMBO_TAG_UNKNOWN},
297
+ {(char*)0,GUMBO_TAG_UNKNOWN},
298
+ {(char*)0,GUMBO_TAG_UNKNOWN},
299
+ {(char*)0,GUMBO_TAG_UNKNOWN},
300
+ {(char*)0,GUMBO_TAG_UNKNOWN},
301
+ {"video", GUMBO_TAG_VIDEO},
302
+ {"img", GUMBO_TAG_IMG},
303
+ {(char*)0,GUMBO_TAG_UNKNOWN},
304
+ {(char*)0,GUMBO_TAG_UNKNOWN},
305
+ {(char*)0,GUMBO_TAG_UNKNOWN},
306
+ {(char*)0,GUMBO_TAG_UNKNOWN},
307
+ {(char*)0,GUMBO_TAG_UNKNOWN},
308
+ {(char*)0,GUMBO_TAG_UNKNOWN},
309
+ {"audio", GUMBO_TAG_AUDIO},
310
+ {(char*)0,GUMBO_TAG_UNKNOWN},
311
+ {(char*)0,GUMBO_TAG_UNKNOWN},
312
+ {(char*)0,GUMBO_TAG_UNKNOWN},
313
+ {(char*)0,GUMBO_TAG_UNKNOWN},
314
+ {"caption", GUMBO_TAG_CAPTION},
315
+ {"strong", GUMBO_TAG_STRONG},
316
+ {(char*)0,GUMBO_TAG_UNKNOWN},
317
+ {(char*)0,GUMBO_TAG_UNKNOWN},
318
+ {(char*)0,GUMBO_TAG_UNKNOWN},
319
+ {(char*)0,GUMBO_TAG_UNKNOWN},
320
+ {(char*)0,GUMBO_TAG_UNKNOWN},
321
+ {"aside", GUMBO_TAG_ASIDE},
322
+ {(char*)0,GUMBO_TAG_UNKNOWN},
323
+ {"button", GUMBO_TAG_BUTTON},
324
+ {(char*)0,GUMBO_TAG_UNKNOWN},
325
+ {(char*)0,GUMBO_TAG_UNKNOWN},
326
+ {(char*)0,GUMBO_TAG_UNKNOWN},
327
+ {(char*)0,GUMBO_TAG_UNKNOWN},
328
+ {(char*)0,GUMBO_TAG_UNKNOWN},
329
+ {(char*)0,GUMBO_TAG_UNKNOWN},
330
+ {(char*)0,GUMBO_TAG_UNKNOWN},
331
+ {(char*)0,GUMBO_TAG_UNKNOWN},
332
+ {"bdo", GUMBO_TAG_BDO},
333
+ {(char*)0,GUMBO_TAG_UNKNOWN},
334
+ {(char*)0,GUMBO_TAG_UNKNOWN},
335
+ {(char*)0,GUMBO_TAG_UNKNOWN},
336
+ {(char*)0,GUMBO_TAG_UNKNOWN},
337
+ {(char*)0,GUMBO_TAG_UNKNOWN},
338
+ {(char*)0,GUMBO_TAG_UNKNOWN},
339
+ {(char*)0,GUMBO_TAG_UNKNOWN},
340
+ {(char*)0,GUMBO_TAG_UNKNOWN},
341
+ {(char*)0,GUMBO_TAG_UNKNOWN},
342
+ {(char*)0,GUMBO_TAG_UNKNOWN},
343
+ {(char*)0,GUMBO_TAG_UNKNOWN},
344
+ {(char*)0,GUMBO_TAG_UNKNOWN},
345
+ {(char*)0,GUMBO_TAG_UNKNOWN},
346
+ {(char*)0,GUMBO_TAG_UNKNOWN},
347
+ {(char*)0,GUMBO_TAG_UNKNOWN},
348
+ {(char*)0,GUMBO_TAG_UNKNOWN},
349
+ {(char*)0,GUMBO_TAG_UNKNOWN},
350
+ {(char*)0,GUMBO_TAG_UNKNOWN},
351
+ {(char*)0,GUMBO_TAG_UNKNOWN},
352
+ {(char*)0,GUMBO_TAG_UNKNOWN},
353
+ {(char*)0,GUMBO_TAG_UNKNOWN},
354
+ {"bdi", GUMBO_TAG_BDI},
355
+ {(char*)0,GUMBO_TAG_UNKNOWN},
356
+ {(char*)0,GUMBO_TAG_UNKNOWN},
357
+ {(char*)0,GUMBO_TAG_UNKNOWN},
358
+ {(char*)0,GUMBO_TAG_UNKNOWN},
359
+ {(char*)0,GUMBO_TAG_UNKNOWN},
360
+ {(char*)0,GUMBO_TAG_UNKNOWN},
361
+ {(char*)0,GUMBO_TAG_UNKNOWN},
362
+ {"blink", GUMBO_TAG_BLINK},
363
+ {(char*)0,GUMBO_TAG_UNKNOWN},
364
+ {(char*)0,GUMBO_TAG_UNKNOWN},
365
+ {"rtc", GUMBO_TAG_RTC}
366
+ };
367
+
368
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
369
+ {
370
+ register unsigned int key = hash (str, len);
371
+
372
+ if (key <= MAX_HASH_VALUE)
373
+ if (len == lengthtable[key])
374
+ {
375
+ register const char *s = wordlist[key].key;
376
+
377
+ if (s && (((unsigned char)*str ^ (unsigned char)*s) & ~32) == 0 && !gumbo_ascii_strncasecmp(str, s, len))
378
+ return &wordlist[key];
379
+ }
380
+ }
381
+ return 0;
382
+ }