nokogumbo 1.5.0 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+ }