Browse code

introduce hashset_* functions use a faster hash function use hashset to load mdb signatures regenerate files due to hash function change enable hash function profiling during generation

git-svn: trunk@3589

Török Edvin authored on 2008/02/07 03:53:23
Showing 10 changed files
... ...
@@ -1,3 +1,12 @@
1
+Wed Feb  6 20:36:05 EET 2008 (edwin)
2
+------------------------------------
3
+  * contrib/entitynorm/, libclamav/hashtab.[ch], readdb.c, matcher.h, entitylist.h, encoding_aliases.h:
4
+	* introduce hashset_* functions
5
+	* use a faster hash function
6
+	* use hashset to load mdb signatures to optimize DB load time
7
+  	* regenerate files due to hash function change
8
+	* enable hash function profiling during generation
9
+
1 10
 Wed Feb  6 13:12:24 CET 2008 (tk)
2 11
 ---------------------------------
3 12
   * libclamav/matcher-ac.[ch]: add support for matching single bytes anchored
... ...
@@ -7,10 +7,10 @@ entities_parsed: entities entities/* entity_decl_parse.pl
7 7
 	$(PERL) entity_decl_parse.pl $</* | sort -u >$@
8 8
 
9 9
 generate_entitylist: generate_entitylist.c ../../libclamav/hashtab.h ../../libclamav/hashtab.c ../../libclamav/others.c
10
-	$(CC) -I. -DHAVE_CONFIG_H -DCLI_MEMFUNSONLY $< ../../libclamav/hashtab.c ../../libclamav/others.c -o $@
10
+	$(CC) -I. -DHAVE_CONFIG_H -DCLI_MEMFUNSONLY -DPROFILE_HASHTABLE $< ../../libclamav/hashtab.c ../../libclamav/others.c -o $@
11 11
 
12 12
 generate_encoding_aliases: generate_encoding_aliases.c ../../libclamav/hashtab.c ../../libclamav/others.c ../../libclamav/htmlnorm.h ../../libclamav/entconv.h ../../libclamav/cltypes.h ../../libclamav/hashtab.h ../../libclamav/hashtab.h
13
-	$(CC) -I. -DHAVE_CONFIG_H -DCLI_MEMFUNSONLY $< ../../libclamav/hashtab.c ../../libclamav/others.c -o $@
13
+	$(CC) -I. -DHAVE_CONFIG_H -DCLI_MEMFUNSONLY -DPROFILE_HASHTABLE $< ../../libclamav/hashtab.c ../../libclamav/others.c -o $@
14 14
 
15 15
 entitylist.h: generate_entitylist entities_parsed
16 16
 	./$< <entities_parsed >$@
... ...
@@ -58,13 +58,15 @@ static const struct {
58 58
 };
59 59
 
60 60
 static const size_t aliases_cnt = sizeof(aliases)/sizeof(aliases[0]);
61
+extern short cli_debug_flag;
61 62
 
62 63
 int main(int argc, char* argv[])
63 64
 {
64 65
 	struct hashtable ht;
65 66
 	size_t i;
66 67
 
67
-	hashtab_init(&ht,aliases_cnt*5/4);
68
+	cli_debug_flag=1;
69
+	hashtab_init(&ht,aliases_cnt);
68 70
 
69 71
 	for(i=0;i < aliases_cnt;i++) {
70 72
 		hashtab_insert(&ht,(const unsigned char*)aliases[i].alias,strlen(aliases[i].alias),aliases[i].encoding);
... ...
@@ -62,12 +62,14 @@ static void loadEntities(struct hashtable* s)
62 62
 		hashtab_insert(s,name,strlen(name), converted);
63 63
 	}
64 64
 }
65
+extern short cli_debug_flag;
65 66
 
66 67
 int main(int argc, char* argv[])
67 68
 {
68 69
 	struct hashtable ht;
69 70
 	int i;
70
-	hashtab_init(&ht,512);
71
+	cli_debug_flag=1;
72
+	hashtab_init(&ht,2048);
71 73
 
72 74
 	loadEntities(&ht);
73 75
 	hashtab_generate_c(&ht,"entities_htable");
... ...
@@ -24,48 +24,59 @@ static struct element aliases_htable_elements[] = {
24 24
 	{NULL,0,0},
25 25
 	{NULL,0,0},
26 26
 	{NULL,0,0},
27
-	{"UTF8", 8, 4},
28
-	{"ISO-10646/UTF-8", 8, 15},
29 27
 	{NULL,0,0},
30
-	{"UTF-16", 1, 6},
31
-	{"UTF16LE", 7, 7},
28
+	{"UTF32BE", 3, 7},
32 29
 	{NULL,0,0},
33
-	{"UTF-32", 0, 6},
34
-	{"10646-1:1993/UCS4", 0, 17},
35 30
 	{NULL,0,0},
36 31
 	{"UTF-16LE", 7, 8},
37 32
 	{NULL,0,0},
38 33
 	{NULL,0,0},
34
+	{"UCS-4BE", 3, 7},
35
+	{"UTF32LE", 2, 7},
36
+	{NULL,0,0},
37
+	{"ISO-10646/UTF8", 8, 14},
39 38
 	{NULL,0,0},
40
-	{"UCS-4LE", 2, 7},
41
-	{"UCS-4", 0, 5},
42
-	{"UCS2", 1, 4},
43 39
 	{"UTF-16BE", 6, 8},
40
+	{"UTF-32BE", 3, 8},
44 41
 	{NULL,0,0},
45
-	{"UTF-32LE", 2, 8},
46 42
 	{NULL,0,0},
43
+	{"UCS2", 1, 4},
47 44
 	{"UTF16BE", 6, 7},
48
-	{"UTF32", 0, 5},
49
-	{"UTF-32BE", 3, 8},
50
-	{"UTF32LE", 2, 7},
51 45
 	{NULL,0,0},
46
+	{"UTF32", 0, 5},
47
+	{"UCS-4", 0, 5},
48
+	{"UTF-16", 1, 6},
52 49
 	{NULL,0,0},
53 50
 	{NULL,0,0},
54 51
 	{NULL,0,0},
55 52
 	{NULL,0,0},
56 53
 	{NULL,0,0},
57
-	{"UCS-4BE", 3, 7},
58 54
 	{"ISO-10646/UCS2", 1, 14},
59 55
 	{NULL,0,0},
60
-	{"10646-1:1993", 0, 12},
61
-	{"ISO-10646/UCS4", 0, 14},
62
-	{"ISO-10646", 0, 9},
56
+	{NULL,0,0},
63 57
 	{"UTF-8", 8, 5},
64
-	{"UTF32BE", 3, 7},
65
-	{"ISO-10646/UTF8", 8, 14},
58
+	{"ISO-10646/UTF-8", 8, 15},
59
+	{"UCS4", 0, 4},
60
+	{"10646-1:1993/UCS4", 0, 17},
61
+	{NULL,0,0},
62
+	{NULL,0,0},
63
+	{"UTF16LE", 7, 7},
64
+	{"UCS-4LE", 2, 7},
65
+	{"ISO-10646", 0, 9},
66
+	{"UTF-32LE", 2, 8},
67
+	{"UTF8", 8, 4},
68
+	{"ISO-10646/UCS4", 0, 14},
69
+	{NULL,0,0},
70
+	{NULL,0,0},
71
+	{NULL,0,0},
72
+	{NULL,0,0},
73
+	{"10646-1:1993", 0, 12},
74
+	{"UTF-32", 0, 6},
75
+	{NULL,0,0},
76
+	{NULL,0,0},
77
+	{NULL,0,0},
66 78
 	{NULL,0,0},
67 79
 	{NULL,0,0},
68
-	{"UCS4", 0, 4},
69 80
 	{NULL,0,0},
70 81
 	{NULL,0,0},
71 82
 	{NULL,0,0},
... ...
@@ -76,5 +87,5 @@ static struct element aliases_htable_elements[] = {
76 76
 	{NULL,0,0},
77 77
 };
78 78
 const struct hashtable aliases_htable = {
79
-	aliases_htable_elements, 53, 25, 42
79
+	aliases_htable_elements, 64, 25, 51
80 80
 };
... ...
@@ -1,375 +1,528 @@
1 1
 /* TODO: include GPL headers */
2 2
 #include <hashtab.h>
3 3
 static struct element entities_htable_elements[] = {
4
-	{"ssmile", 8995, 6},
4
+	{"rsaquo", 8250, 6},
5 5
 	{NULL,0,0},
6 6
 	{NULL,0,0},
7
+	{"Kcy", 1050, 3},
7 8
 	{NULL,0,0},
8 9
 	{NULL,0,0},
9
-	{"phi", 966, 3},
10 10
 	{NULL,0,0},
11
-	{"cire", 8791, 4},
12 11
 	{NULL,0,0},
13 12
 	{NULL,0,0},
14 13
 	{NULL,0,0},
14
+	{"emsp13", 8196, 6},
15 15
 	{NULL,0,0},
16 16
 	{NULL,0,0},
17
+	{"clubs", 9827, 5},
17 18
 	{NULL,0,0},
18 19
 	{NULL,0,0},
19 20
 	{NULL,0,0},
20 21
 	{NULL,0,0},
21 22
 	{NULL,0,0},
23
+	{"Tau", 932, 3},
24
+	{"bcong", 8780, 5},
22 25
 	{NULL,0,0},
26
+	{"ocirc", 244, 5},
23 27
 	{NULL,0,0},
24 28
 	{NULL,0,0},
25 29
 	{NULL,0,0},
30
+	{"Upsilon", 933, 7},
26 31
 	{NULL,0,0},
32
+	{"ape", 8778, 3},
27 33
 	{NULL,0,0},
34
+	{"dashv", 8867, 5},
28 35
 	{NULL,0,0},
36
+	{"hairsp", 8202, 6},
29 37
 	{NULL,0,0},
30 38
 	{NULL,0,0},
31 39
 	{NULL,0,0},
40
+	{"piv", 982, 3},
32 41
 	{NULL,0,0},
42
+	{"plus", 43, 4},
43
+	{"psi", 968, 3},
44
+	{"frac13", 8531, 6},
45
+	{"sube", 8838, 4},
33 46
 	{NULL,0,0},
47
+	{"aacgr", 940, 5},
48
+	{"vDash", 8872, 5},
49
+	{"Eta", 919, 3},
34 50
 	{NULL,0,0},
35
-	{"lang", 9001, 4},
36
-	{"sbsol", 65128, 5},
37
-	{"tshcy", 1115, 5},
38 51
 	{NULL,0,0},
39
-	{"ast", 42, 3},
40
-	{"dzcy", 1119, 4},
41
-	{"rang", 9002, 4},
42
-	{"boxhu", 9524, 5},
43
-	{"zwnj", 8204, 4},
44 52
 	{NULL,0,0},
45 53
 	{NULL,0,0},
46 54
 	{NULL,0,0},
47 55
 	{NULL,0,0},
48
-	{"boxUR", 9562, 5},
49 56
 	{NULL,0,0},
50 57
 	{NULL,0,0},
58
+	{"boxUr", 9561, 5},
51 59
 	{NULL,0,0},
52 60
 	{NULL,0,0},
61
+	{"euro", 8364, 4},
62
+	{"dblac", 733, 5},
63
+	{"spades", 9824, 6},
64
+	{"gel", 8923, 3},
53 65
 	{NULL,0,0},
54 66
 	{NULL,0,0},
55
-	{"block", 9608, 5},
56
-	{"Ccedil", 199, 6},
57 67
 	{NULL,0,0},
68
+	{"frac15", 8533, 6},
58 69
 	{NULL,0,0},
59 70
 	{NULL,0,0},
60
-	{"chcy", 1095, 4},
61 71
 	{NULL,0,0},
62 72
 	{NULL,0,0},
73
+	{"Eacgr", 904, 5},
74
+	{"rArr", 8658, 4},
75
+	{"dollar", 36, 6},
63 76
 	{NULL,0,0},
64
-	{"DJcy", 1026, 4},
65 77
 	{NULL,0,0},
78
+	{"Acirc", 194, 5},
79
+	{"ang90", 8735, 5},
80
+	{"scaron", 353, 6},
66 81
 	{NULL,0,0},
67
-	{"spades", 9824, 6},
68
-	{"GJcy", 1027, 4},
69
-	{"khcy", 1093, 4},
70
-	{"ang", 8736, 3},
71
-	{"KJcy", 1036, 4},
72
-	{"LJcy", 1033, 4},
73
-	{"ETH", 208, 3},
74
-	{"NJcy", 1034, 4},
75
-	{"tilde", 732, 5},
76
-	{"bsol", 92, 4},
77
-	{"shcy", 1096, 4},
78 82
 	{NULL,0,0},
79
-	{"frac58", 8541, 6},
80 83
 	{NULL,0,0},
81 84
 	{NULL,0,0},
82
-	{"micro", 181, 5},
83
-	{"num", 35, 3},
84
-	{"zhcy", 1078, 4},
85 85
 	{NULL,0,0},
86
+	{"djcy", 1106, 4},
87
+	{"lcy", 1083, 3},
88
+	{NULL,0,0},
89
+	{"Dot", 168, 3},
90
+	{"sol", 47, 3},
86 91
 	{NULL,0,0},
92
+	{"blk34", 9619, 5},
93
+	{NULL,0,0},
94
+	{"numero", 8470, 6},
87 95
 	{NULL,0,0},
88
-	{"ccedil", 231, 6},
89 96
 	{"osol", 8856, 4},
90 97
 	{NULL,0,0},
91
-	{"sum", 8721, 3},
98
+	{"nbsp", 160, 4},
99
+	{"supe", 8839, 4},
100
+	{"NJcy", 1034, 4},
92 101
 	{NULL,0,0},
93 102
 	{NULL,0,0},
94 103
 	{NULL,0,0},
95 104
 	{NULL,0,0},
96
-	{"emsp13", 8196, 6},
97
-	{"divonx", 8903, 6},
105
+	{"sharp", 9839, 5},
106
+	{NULL,0,0},
107
+	{"gcy", 1075, 3},
108
+	{NULL,0,0},
109
+	{"mid", 8739, 3},
110
+	{NULL,0,0},
111
+	{NULL,0,0},
112
+	{NULL,0,0},
113
+	{"drcrop", 8972, 6},
114
+	{NULL,0,0},
115
+	{NULL,0,0},
116
+	{"shchcy", 1097, 6},
98 117
 	{NULL,0,0},
99
-	{"supe", 8839, 4},
100 118
 	{NULL,0,0},
101 119
 	{NULL,0,0},
102 120
 	{"sim", 8764, 3},
103
-	{"minus", 8722, 5},
104
-	{"Agr", 913, 3},
105
-	{"Bgr", 914, 3},
121
+	{"puncsp", 8200, 6},
106 122
 	{NULL,0,0},
107
-	{"Dgr", 916, 3},
108
-	{"Egr", 917, 3},
109 123
 	{NULL,0,0},
110
-	{"Ggr", 915, 3},
111 124
 	{NULL,0,0},
112
-	{"Igr", 921, 3},
113
-	{"comma", 44, 5},
114
-	{"Kgr", 922, 3},
115
-	{"Lgr", 923, 3},
116
-	{"Mgr", 924, 3},
117
-	{"Ngr", 925, 3},
118
-	{"Ogr", 927, 3},
119
-	{"Pgr", 928, 3},
120 125
 	{NULL,0,0},
121
-	{"Rgr", 929, 3},
122
-	{"Sgr", 931, 3},
123
-	{"pound", 163, 5},
124
-	{"Tgr", 932, 3},
125
-	{"macr", 175, 4},
126
-	{"ell", 8467, 3},
127
-	{"Ugr", 933, 3},
126
+	{NULL,0,0},
127
+	{"tau", 964, 3},
128
+	{NULL,0,0},
129
+	{NULL,0,0},
130
+	{NULL,0,0},
128 131
 	{"boxDR", 9556, 5},
129
-	{"Zgr", 918, 3},
130
-	{"boxhD", 9573, 5},
132
+	{"agrave", 224, 6},
131 133
 	{NULL,0,0},
132 134
 	{NULL,0,0},
133
-	{"xdtri", 9661, 5},
134 135
 	{NULL,0,0},
135
-	{"eeacgr", 942, 6},
136
-	{"agr", 945, 3},
137
-	{"ffllig", 64260, 6},
138
-	{"Agrave", 192, 6},
136
+	{NULL,0,0},
137
+	{"boxVr", 9567, 5},
138
+	{"Aring", 197, 5},
139
+	{NULL,0,0},
140
+	{NULL,0,0},
141
+	{NULL,0,0},
142
+	{NULL,0,0},
143
+	{NULL,0,0},
144
+	{NULL,0,0},
145
+	{"boxDr", 9555, 5},
146
+	{NULL,0,0},
139 147
 	{"dgr", 948, 3},
140
-	{"bgr", 946, 3},
141
-	{"Egrave", 200, 6},
142
-	{"ggr", 947, 3},
143
-	{"egr", 949, 3},
144
-	{"igr", 953, 3},
145
-	{"Igrave", 204, 6},
146
-	{"kgr", 954, 3},
147
-	{"lgr", 955, 3},
148
-	{"mgr", 956, 3},
149
-	{"ngr", 957, 3},
150
-	{"frac35", 8535, 6},
151
-	{"Ograve", 210, 6},
152
-	{"pgr", 960, 3},
153
-	{"rgr", 961, 3},
154
-	{"sgr", 963, 3},
155
-	{"rcub", 125, 4},
156
-	{"hamilt", 8459, 6},
157
-	{"epsi", 1013, 4},
158
-	{"par", 8741, 3},
159
-	{"ugr", 965, 3},
160
-	{"frac16", 8537, 6},
148
+	{NULL,0,0},
149
+	{NULL,0,0},
150
+	{NULL,0,0},
151
+	{NULL,0,0},
152
+	{"ssmile", 8995, 6},
153
+	{NULL,0,0},
154
+	{NULL,0,0},
155
+	{"ltrie", 8884, 5},
156
+	{"boxHU", 9577, 5},
157
+	{"ne", 8800, 2},
158
+	{NULL,0,0},
159
+	{"ang", 8736, 3},
160
+	{"pre", 10927, 3},
161
+	{NULL,0,0},
162
+	{NULL,0,0},
163
+	{NULL,0,0},
164
+	{NULL,0,0},
165
+	{NULL,0,0},
166
+	{"bump", 8782, 4},
167
+	{NULL,0,0},
168
+	{NULL,0,0},
169
+	{NULL,0,0},
170
+	{NULL,0,0},
171
+	{NULL,0,0},
172
+	{NULL,0,0},
173
+	{NULL,0,0},
174
+	{NULL,0,0},
175
+	{NULL,0,0},
176
+	{NULL,0,0},
177
+	{NULL,0,0},
178
+	{"there4", 8756, 6},
179
+	{NULL,0,0},
180
+	{NULL,0,0},
181
+	{NULL,0,0},
182
+	{NULL,0,0},
183
+	{"nu", 957, 2},
184
+	{NULL,0,0},
185
+	{NULL,0,0},
186
+	{NULL,0,0},
187
+	{NULL,0,0},
188
+	{"thetas", 952, 6},
189
+	{"Ocy", 1054, 3},
190
+	{NULL,0,0},
191
+	{NULL,0,0},
192
+	{"lceil", 8968, 5},
193
+	{NULL,0,0},
194
+	{NULL,0,0},
195
+	{NULL,0,0},
196
+	{NULL,0,0},
197
+	{"jnodot", 106, 6},
198
+	{NULL,0,0},
199
+	{NULL,0,0},
200
+	{"bumpe", 8783, 5},
201
+	{"dlcrop", 8973, 6},
202
+	{NULL,0,0},
203
+	{"leg", 8922, 3},
204
+	{"bsol", 92, 4},
205
+	{"idigr", 970, 5},
206
+	{NULL,0,0},
207
+	{NULL,0,0},
208
+	{NULL,0,0},
209
+	{NULL,0,0},
210
+	{"boxVh", 9579, 5},
161 211
 	{"sqcup", 8852, 5},
162
-	{"Upsi", 978, 4},
163
-	{"caron", 711, 5},
164
-	{"lcub", 123, 4},
165
-	{"ogr", 959, 3},
166 212
 	{NULL,0,0},
167
-	{"Ugrave", 217, 6},
213
+	{"gimel", 8503, 5},
214
+	{NULL,0,0},
215
+	{NULL,0,0},
216
+	{NULL,0,0},
217
+	{NULL,0,0},
218
+	{NULL,0,0},
219
+	{NULL,0,0},
220
+	{NULL,0,0},
221
+	{NULL,0,0},
222
+	{NULL,0,0},
223
+	{NULL,0,0},
224
+	{NULL,0,0},
225
+	{NULL,0,0},
226
+	{NULL,0,0},
227
+	{"Omega", 937, 5},
228
+	{NULL,0,0},
168 229
 	{NULL,0,0},
169
-	{"agrave", 224, 6},
170
-	{"tgr", 964, 3},
171
-	{"sup1", 185, 4},
172
-	{"Xgr", 926, 3},
173
-	{"egrave", 232, 6},
174 230
 	{"upsi", 965, 4},
175
-	{"real", 8476, 4},
176
-	{"zgr", 950, 3},
177
-	{"igrave", 236, 6},
178 231
 	{NULL,0,0},
179
-	{"thkap", 8776, 5},
180
-	{"lpargt", 10656, 6},
181 232
 	{NULL,0,0},
233
+	{"eta", 951, 3},
234
+	{"frac38", 8540, 6},
235
+	{"kgr", 954, 3},
236
+	{"Ocirc", 212, 5},
237
+	{"yacy", 1103, 4},
182 238
 	{NULL,0,0},
183
-	{"ograve", 242, 6},
184 239
 	{NULL,0,0},
185
-	{"boxV", 9553, 4},
186
-	{"rpargt", 10644, 6},
187
-	{"xgr", 958, 3},
188 240
 	{NULL,0,0},
189
-	{"ugrave", 249, 6},
190
-	{"Vvdash", 8874, 6},
241
+	{"horbar", 8213, 6},
242
+	{"Idigr", 938, 5},
191 243
 	{NULL,0,0},
244
+	{"bottom", 8869, 6},
192 245
 	{NULL,0,0},
246
+	{"rarr", 8594, 4},
247
+	{"reg", 174, 3},
193 248
 	{NULL,0,0},
194 249
 	{NULL,0,0},
250
+	{"xdtri", 9661, 5},
195 251
 	{NULL,0,0},
196
-	{"Cap", 8914, 3},
197 252
 	{NULL,0,0},
198 253
 	{NULL,0,0},
199 254
 	{NULL,0,0},
255
+	{"Igr", 921, 3},
256
+	{NULL,0,0},
257
+	{NULL,0,0},
258
+	{NULL,0,0},
259
+	{NULL,0,0},
260
+	{NULL,0,0},
261
+	{"Bcy", 1041, 3},
262
+	{"prod", 8719, 4},
263
+	{"cuesc", 8927, 5},
264
+	{"uArr", 8657, 4},
265
+	{"Mgr", 924, 3},
266
+	{NULL,0,0},
267
+	{NULL,0,0},
268
+	{NULL,0,0},
269
+	{NULL,0,0},
270
+	{NULL,0,0},
271
+	{"flat", 9837, 4},
200 272
 	{NULL,0,0},
201 273
 	{NULL,0,0},
202
-	{"Prime", 8243, 5},
203
-	{"boxHd", 9572, 5},
204 274
 	{NULL,0,0},
205 275
 	{NULL,0,0},
206
-	{"khgr", 967, 4},
207 276
 	{"acute", 180, 5},
277
+	{"sum", 8721, 3},
208 278
 	{NULL,0,0},
209 279
 	{NULL,0,0},
210
-	{"ohgr", 969, 4},
211
-	{"phgr", 966, 4},
212
-	{"amp", 38, 3},
213
-	{"Gg", 8921, 2},
214 280
 	{NULL,0,0},
215
-	{"coprod", 8720, 6},
216
-	{"thgr", 952, 4},
217 281
 	{NULL,0,0},
282
+	{"DJcy", 1026, 4},
218 283
 	{NULL,0,0},
219 284
 	{NULL,0,0},
220 285
 	{NULL,0,0},
221
-	{"Epsilon", 917, 7},
222 286
 	{NULL,0,0},
223 287
 	{NULL,0,0},
224
-	{"amalg", 10815, 5},
225
-	{"boxVR", 9568, 5},
226
-	{"euro", 8364, 4},
288
+	{"Eacute", 201, 6},
289
+	{"larr", 8592, 4},
290
+	{"Pgr", 928, 3},
227 291
 	{NULL,0,0},
228
-	{"cap", 8745, 3},
229 292
 	{NULL,0,0},
293
+	{"lArr", 8656, 4},
230 294
 	{NULL,0,0},
231
-	{"frac12", 189, 6},
232
-	{"gap", 10886, 3},
233 295
 	{NULL,0,0},
234
-	{"prime", 8242, 5},
296
+	{NULL,0,0},
297
+	{NULL,0,0},
298
+	{NULL,0,0},
299
+	{"natur", 9838, 5},
300
+	{NULL,0,0},
301
+	{"Euml", 203, 4},
302
+	{NULL,0,0},
303
+	{"Nu", 925, 2},
304
+	{NULL,0,0},
305
+	{"ecolon", 8789, 6},
306
+	{NULL,0,0},
307
+	{NULL,0,0},
308
+	{"cross", 10007, 5},
309
+	{"ljcy", 1113, 4},
310
+	{NULL,0,0},
311
+	{NULL,0,0},
312
+	{"alpha", 945, 5},
313
+	{"dscy", 1109, 4},
314
+	{"dagger", 8224, 6},
315
+	{NULL,0,0},
316
+	{NULL,0,0},
317
+	{"THgr", 920, 4},
318
+	{"conint", 8750, 6},
319
+	{"Xi", 926, 2},
320
+	{"Sigma", 931, 5},
235 321
 	{NULL,0,0},
236 322
 	{"angsph", 8738, 6},
237
-	{"lap", 10885, 3},
238
-	{"Upsilon", 933, 7},
239
-	{"HARDcy", 1066, 6},
240
-	{"caret", 8257, 5},
241 323
 	{NULL,0,0},
242
-	{"boxvH", 9578, 5},
324
+	{"boxvl", 9508, 5},
325
+	{"Auml", 196, 4},
326
+	{"lsquor", 8218, 6},
327
+	{"squf", 9642, 4},
328
+	{"ordm", 186, 4},
243 329
 	{NULL,0,0},
244 330
 	{NULL,0,0},
245 331
 	{NULL,0,0},
246 332
 	{NULL,0,0},
247
-	{"ang90", 8735, 5},
248 333
 	{NULL,0,0},
249
-	{"lg", 8822, 2},
334
+	{"Jukcy", 1028, 5},
335
+	{"THORN", 222, 5},
250 336
 	{NULL,0,0},
251 337
 	{NULL,0,0},
252 338
 	{NULL,0,0},
253
-	{"epsilon", 949, 7},
254 339
 	{NULL,0,0},
255 340
 	{NULL,0,0},
256 341
 	{NULL,0,0},
257 342
 	{NULL,0,0},
343
+	{"boxuL", 9563, 5},
344
+	{"prime", 8242, 5},
345
+	{"cedil", 184, 5},
346
+	{"kjcy", 1116, 4},
347
+	{"hearts", 9829, 6},
258 348
 	{NULL,0,0},
259 349
 	{NULL,0,0},
350
+	{"xutri", 9651, 5},
351
+	{"DScy", 1029, 4},
352
+	{"cir", 9675, 3},
353
+	{NULL,0,0},
354
+	{NULL,0,0},
355
+	{"Omicron", 927, 7},
356
+	{"colon", 58, 5},
357
+	{NULL,0,0},
260 358
 	{NULL,0,0},
261 359
 	{NULL,0,0},
262 360
 	{NULL,0,0},
263 361
 	{NULL,0,0},
264
-	{"eDot", 8785, 4},
265 362
 	{"darr", 8595, 4},
266
-	{"cent", 162, 4},
363
+	{"macr", 175, 4},
364
+	{"uplus", 8846, 5},
365
+	{"gl", 8823, 2},
267 366
 	{NULL,0,0},
268
-	{"szlig", 223, 5},
269
-	{"harr", 8596, 4},
270
-	{"upsilon", 965, 7},
271 367
 	{NULL,0,0},
272 368
 	{NULL,0,0},
273
-	{"larr", 8592, 4},
274 369
 	{NULL,0,0},
275
-	{"squ", 9633, 3},
370
+	{"ges", 10878, 3},
276 371
 	{NULL,0,0},
277
-	{"percnt", 37, 6},
278 372
 	{NULL,0,0},
279
-	{"rarr", 8594, 4},
373
+	{"Icirc", 206, 5},
280 374
 	{NULL,0,0},
375
+	{"telrec", 8981, 6},
281 376
 	{NULL,0,0},
282
-	{"uarr", 8593, 4},
283 377
 	{NULL,0,0},
284
-	{"Eta", 919, 3},
285
-	{"boxh", 9472, 4},
286
-	{"flat", 9837, 4},
287
-	{"bdquo", 8222, 5},
288 378
 	{NULL,0,0},
289 379
 	{NULL,0,0},
290
-	{"alefsym", 8501, 7},
380
+	{"bernou", 8492, 6},
291 381
 	{NULL,0,0},
292 382
 	{NULL,0,0},
293 383
 	{NULL,0,0},
294
-	{"gimel", 8503, 5},
295
-	{"ldquo", 8220, 5},
384
+	{"frac45", 8536, 6},
296 385
 	{NULL,0,0},
297 386
 	{NULL,0,0},
298 387
 	{NULL,0,0},
299
-	{"upsih", 978, 5},
300
-	{"rdquo", 8221, 5},
388
+	{"dot", 729, 3},
301 389
 	{NULL,0,0},
302 390
 	{NULL,0,0},
303
-	{"thksim", 8764, 6},
304 391
 	{NULL,0,0},
305
-	{"phis", 981, 4},
306
-	{"telrec", 8981, 6},
307
-	{"thetav", 977, 6},
308 392
 	{NULL,0,0},
309 393
 	{NULL,0,0},
310
-	{"int", 8747, 3},
311
-	{"boxVh", 9579, 5},
312 394
 	{NULL,0,0},
313
-	{"thorn", 254, 5},
314
-	{"excl", 33, 4},
315
-	{"iocy", 1105, 4},
316
-	{"eta", 951, 3},
395
+	{NULL,0,0},
396
+	{"bcy", 1073, 3},
397
+	{"ell", 8467, 3},
398
+	{"zwj", 8205, 3},
399
+	{NULL,0,0},
400
+	{NULL,0,0},
401
+	{"Oacute", 211, 6},
402
+	{NULL,0,0},
403
+	{"acy", 1072, 3},
404
+	{"zwnj", 8204, 4},
405
+	{NULL,0,0},
406
+	{NULL,0,0},
407
+	{NULL,0,0},
408
+	{"mdash", 8212, 5},
409
+	{"Vcy", 1042, 3},
410
+	{NULL,0,0},
411
+	{"nldr", 8229, 4},
412
+	{"rfloor", 8971, 6},
413
+	{NULL,0,0},
414
+	{"Epsilon", 917, 7},
415
+	{"Pi", 928, 2},
416
+	{"verbar", 124, 6},
417
+	{NULL,0,0},
418
+	{"ldot", 8918, 4},
419
+	{NULL,0,0},
420
+	{"top", 8868, 3},
421
+	{NULL,0,0},
422
+	{"part", 8706, 4},
423
+	{"lE", 8806, 2},
424
+	{NULL,0,0},
425
+	{NULL,0,0},
426
+	{NULL,0,0},
427
+	{"lpar", 40, 4},
428
+	{"eacgr", 941, 5},
429
+	{NULL,0,0},
430
+	{NULL,0,0},
431
+	{NULL,0,0},
432
+	{NULL,0,0},
433
+	{NULL,0,0},
434
+	{"die", 168, 3},
435
+	{NULL,0,0},
436
+	{NULL,0,0},
437
+	{NULL,0,0},
438
+	{NULL,0,0},
439
+	{NULL,0,0},
440
+	{"ogr", 959, 3},
441
+	{NULL,0,0},
442
+	{NULL,0,0},
443
+	{NULL,0,0},
444
+	{NULL,0,0},
445
+	{"bepsi", 1014, 5},
446
+	{"utrif", 9652, 5},
447
+	{NULL,0,0},
448
+	{NULL,0,0},
449
+	{NULL,0,0},
450
+	{NULL,0,0},
451
+	{NULL,0,0},
452
+	{NULL,0,0},
453
+	{NULL,0,0},
454
+	{"kcy", 1082, 3},
455
+	{"ocir", 8858, 4},
456
+	{"curren", 164, 6},
457
+	{"permil", 8240, 6},
458
+	{"omega", 969, 5},
459
+	{"efDot", 8786, 5},
460
+	{"le", 8804, 2},
461
+	{"block", 9608, 5},
462
+	{NULL,0,0},
463
+	{"odash", 8861, 5},
464
+	{"prsim", 8830, 5},
465
+	{NULL,0,0},
466
+	{NULL,0,0},
467
+	{NULL,0,0},
468
+	{NULL,0,0},
469
+	{NULL,0,0},
317 470
 	{NULL,0,0},
318 471
 	{NULL,0,0},
319 472
 	{NULL,0,0},
320
-	{"loz", 9674, 3},
321 473
 	{NULL,0,0},
322 474
 	{NULL,0,0},
323 475
 	{"smile", 8995, 5},
324
-	{"yucy", 1102, 4},
476
+	{"xcirc", 9711, 5},
325 477
 	{NULL,0,0},
326
-	{"epsis", 1013, 5},
327
-	{"natur", 9838, 5},
328
-	{"sup2", 178, 4},
478
+	{"els", 10901, 3},
479
+	{"Rgr", 929, 3},
329 480
 	{NULL,0,0},
481
+	{"sigmav", 962, 6},
330 482
 	{NULL,0,0},
483
+	{"Ggr", 915, 3},
484
+	{NULL,0,0},
485
+	{"Ugrave", 217, 6},
486
+	{"lowbar", 95, 6},
331 487
 	{NULL,0,0},
332
-	{"IEcy", 1045, 4},
333 488
 	{NULL,0,0},
334 489
 	{NULL,0,0},
335 490
 	{NULL,0,0},
491
+	{"bsim", 8765, 4},
336 492
 	{NULL,0,0},
337 493
 	{NULL,0,0},
338
-	{"yicy", 1111, 4},
339 494
 	{NULL,0,0},
495
+	{"Egrave", 200, 6},
496
+	{"ssetmn", 8726, 6},
340 497
 	{NULL,0,0},
341 498
 	{NULL,0,0},
342 499
 	{NULL,0,0},
343
-	{"bowtie", 8904, 6},
344
-	{"daleth", 8504, 6},
345 500
 	{NULL,0,0},
501
+	{NULL,0,0},
502
+	{NULL,0,0},
503
+	{"shy", 173, 3},
504
+	{NULL,0,0},
505
+	{"divonx", 8903, 6},
346 506
 	{"boxul", 9496, 5},
347
-	{"sqsube", 8849, 6},
348
-	{"bprime", 8245, 6},
349 507
 	{NULL,0,0},
350 508
 	{NULL,0,0},
351 509
 	{NULL,0,0},
352 510
 	{NULL,0,0},
353
-	{"Sigma", 931, 5},
354
-	{"para", 182, 4},
355
-	{"timesb", 8864, 6},
356 511
 	{NULL,0,0},
512
+	{"fflig", 64256, 5},
357 513
 	{NULL,0,0},
514
+	{"ouml", 246, 4},
358 515
 	{NULL,0,0},
359 516
 	{NULL,0,0},
360
-	{"ges", 10878, 3},
361 517
 	{NULL,0,0},
518
+	{"Otilde", 213, 6},
362 519
 	{NULL,0,0},
520
+	{"micro", 181, 5},
363 521
 	{NULL,0,0},
364 522
 	{NULL,0,0},
365
-	{"plusdo", 8724, 6},
366
-	{"les", 10877, 3},
367
-	{"tprime", 8244, 6},
368
-	{"vprime", 8242, 6},
369 523
 	{NULL,0,0},
370 524
 	{NULL,0,0},
371 525
 	{NULL,0,0},
372
-	{"scap", 10936, 4},
373 526
 	{NULL,0,0},
374 527
 	{NULL,0,0},
375 528
 	{NULL,0,0},
... ...
@@ -377,439 +530,634 @@ static struct element entities_htable_elements[] = {
377 377
 	{NULL,0,0},
378 378
 	{NULL,0,0},
379 379
 	{NULL,0,0},
380
-	{"ecir", 8790, 4},
381 380
 	{NULL,0,0},
382 381
 	{NULL,0,0},
383 382
 	{NULL,0,0},
384 383
 	{NULL,0,0},
385
-	{"sigma", 963, 5},
386
-	{"lEg", 10891, 3},
387
-	{"iff", 8660, 3},
388
-	{"frac23", 8532, 6},
389 384
 	{NULL,0,0},
390
-	{"ocir", 8858, 4},
391
-	{"trie", 8796, 4},
392 385
 	{NULL,0,0},
386
+	{"sdot", 8901, 4},
387
+	{"squ", 9633, 3},
393 388
 	{NULL,0,0},
394
-	{"Omega", 937, 5},
389
+	{"bgr", 946, 3},
390
+	{"Zeta", 918, 4},
391
+	{"ffilig", 64259, 6},
395 392
 	{NULL,0,0},
396
-	{"numsp", 8199, 5},
393
+	{"bull", 8226, 4},
397 394
 	{NULL,0,0},
398
-	{"uml", 168, 3},
399 395
 	{NULL,0,0},
400 396
 	{NULL,0,0},
401 397
 	{NULL,0,0},
402
-	{"lhblk", 9604, 5},
403 398
 	{NULL,0,0},
404
-	{"OHacgr", 911, 6},
399
+	{"boxhD", 9573, 5},
400
+	{"lg", 8822, 2},
401
+	{"sigmaf", 962, 6},
402
+	{"YIcy", 1031, 4},
403
+	{"oline", 8254, 5},
405 404
 	{NULL,0,0},
405
+	{"njcy", 1114, 4},
406
+	{"pgr", 960, 3},
407
+	{"middot", 183, 6},
408
+	{"omicron", 959, 7},
409
+	{"pcy", 1087, 3},
410
+	{"asymp", 8776, 5},
411
+	{"blk12", 9618, 5},
406 412
 	{NULL,0,0},
413
+	{"Oslash", 216, 6},
414
+	{"semi", 59, 4},
407 415
 	{NULL,0,0},
416
+	{"plusmn", 177, 6},
417
+	{"lowast", 8727, 6},
408 418
 	{NULL,0,0},
409 419
 	{NULL,0,0},
420
+	{"Sgr", 931, 3},
410 421
 	{NULL,0,0},
411
-	{"uhblk", 9600, 5},
412 422
 	{NULL,0,0},
413
-	{"lthree", 8907, 6},
414
-	{"blk14", 9617, 5},
423
+	{"divide", 247, 6},
415 424
 	{NULL,0,0},
416 425
 	{NULL,0,0},
417
-	{"oline", 8254, 5},
418 426
 	{NULL,0,0},
419
-	{"die", 168, 3},
420
-	{"boxdl", 9488, 5},
421
-	{"thetasym", 977, 8},
422
-	{"rthree", 8908, 6},
427
+	{"inodot", 305, 6},
428
+	{"mu", 956, 2},
423 429
 	{NULL,0,0},
430
+	{"pr", 8826, 2},
424 431
 	{NULL,0,0},
432
+	{"becaus", 8757, 6},
425 433
 	{NULL,0,0},
426
-	{"colone", 8788, 6},
427
-	{"omega", 969, 5},
428 434
 	{NULL,0,0},
435
+	{"lfloor", 8970, 6},
436
+	{"square", 9633, 6},
429 437
 	{NULL,0,0},
430 438
 	{NULL,0,0},
431 439
 	{NULL,0,0},
432
-	{"ltrie", 8884, 5},
433 440
 	{NULL,0,0},
434 441
 	{NULL,0,0},
435 442
 	{NULL,0,0},
436
-	{"breve", 728, 5},
437
-	{"oplus", 8853, 5},
438
-	{"rtrie", 8885, 5},
439
-	{"wreath", 8768, 6},
440 443
 	{NULL,0,0},
441
-	{"sce", 10928, 3},
442
-	{"uplus", 8846, 5},
443 444
 	{NULL,0,0},
444 445
 	{NULL,0,0},
445 446
 	{NULL,0,0},
447
+	{"les", 10877, 3},
446 448
 	{NULL,0,0},
449
+	{"mcy", 1084, 3},
450
+	{"gt", 62, 2},
447 451
 	{NULL,0,0},
452
+	{"lgr", 955, 3},
448 453
 	{NULL,0,0},
449
-	{"star", 9734, 4},
450
-	{"dtri", 9663, 4},
454
+	{"ograve", 242, 6},
455
+	{"Alpha", 913, 5},
451 456
 	{NULL,0,0},
452 457
 	{NULL,0,0},
453 458
 	{NULL,0,0},
454
-	{"Gt", 8811, 2},
455
-	{"hardcy", 1098, 6},
456 459
 	{NULL,0,0},
460
+	{NULL,0,0},
461
+	{"Verbar", 8214, 6},
462
+	{NULL,0,0},
463
+	{"or", 8744, 2},
464
+	{NULL,0,0},
465
+	{"Rho", 929, 3},
466
+	{"coprod", 8720, 6},
467
+	{"frac34", 190, 6},
468
+	{"rx", 8478, 2},
469
+	{"hyphen", 8208, 6},
470
+	{"sext", 10038, 4},
471
+	{"fcy", 1092, 3},
472
+	{NULL,0,0},
473
+	{NULL,0,0},
474
+	{NULL,0,0},
475
+	{NULL,0,0},
476
+	{NULL,0,0},
477
+	{"boxhu", 9524, 5},
478
+	{"loz", 9674, 3},
479
+	{NULL,0,0},
480
+	{"PSgr", 936, 4},
481
+	{NULL,0,0},
482
+	{NULL,0,0},
483
+	{"Uacgr", 910, 5},
484
+	{"Bgr", 914, 3},
485
+	{NULL,0,0},
486
+	{"dcy", 1076, 3},
487
+	{NULL,0,0},
488
+	{NULL,0,0},
489
+	{NULL,0,0},
490
+	{"iacute", 237, 6},
491
+	{"radic", 8730, 5},
492
+	{NULL,0,0},
493
+	{"Xgr", 926, 3},
494
+	{NULL,0,0},
495
+	{NULL,0,0},
496
+	{NULL,0,0},
497
+	{NULL,0,0},
498
+	{NULL,0,0},
499
+	{"male", 9794, 4},
500
+	{"drcorn", 8991, 6},
501
+	{NULL,0,0},
502
+	{"Iacute", 205, 6},
503
+	{NULL,0,0},
504
+	{"sfrown", 8994, 6},
505
+	{"Dagger", 8225, 6},
506
+	{NULL,0,0},
507
+	{"SOFTcy", 1068, 6},
508
+	{"cap", 8745, 3},
509
+	{NULL,0,0},
510
+	{"sup3", 179, 4},
511
+	{NULL,0,0},
512
+	{"eeacgr", 942, 6},
513
+	{NULL,0,0},
514
+	{"lsqb", 91, 4},
515
+	{"harr", 8596, 4},
516
+	{NULL,0,0},
517
+	{NULL,0,0},
518
+	{NULL,0,0},
519
+	{NULL,0,0},
520
+	{"Cap", 8914, 3},
521
+	{NULL,0,0},
522
+	{"rpar", 41, 4},
523
+	{NULL,0,0},
524
+	{"angst", 8491, 5},
525
+	{"image", 8465, 5},
526
+	{"Iuml", 207, 4},
527
+	{"boxUl", 9564, 5},
528
+	{"twixt", 8812, 5},
529
+	{"Prime", 8243, 5},
530
+	{NULL,0,0},
531
+	{"Yuml", 376, 4},
532
+	{"epsilon", 949, 7},
533
+	{NULL,0,0},
534
+	{NULL,0,0},
535
+	{NULL,0,0},
536
+	{NULL,0,0},
537
+	{NULL,0,0},
538
+	{NULL,0,0},
539
+	{"Zgr", 918, 3},
540
+	{NULL,0,0},
541
+	{NULL,0,0},
542
+	{NULL,0,0},
543
+	{"upsih", 978, 5},
544
+	{NULL,0,0},
545
+	{"beta", 946, 4},
457 546
 	{"ogon", 731, 4},
458
-	{"ltri", 9667, 4},
459
-	{"Lt", 8810, 2},
547
+	{"Pcy", 1055, 3},
460 548
 	{NULL,0,0},
549
+	{"Ll", 8920, 2},
461 550
 	{NULL,0,0},
462 551
 	{NULL,0,0},
552
+	{"ubrcy", 1118, 5},
553
+	{NULL,0,0},
554
+	{NULL,0,0},
555
+	{"ohm", 8486, 3},
556
+	{NULL,0,0},
557
+	{NULL,0,0},
558
+	{"half", 189, 4},
559
+	{NULL,0,0},
560
+	{NULL,0,0},
561
+	{"ycy", 1099, 3},
562
+	{"para", 182, 4},
563
+	{"bprime", 8245, 6},
564
+	{"esdot", 8784, 5},
565
+	{"Ubrcy", 1038, 5},
566
+	{NULL,0,0},
567
+	{"boxVR", 9568, 5},
568
+	{"boxVl", 9570, 5},
569
+	{NULL,0,0},
570
+	{NULL,0,0},
571
+	{NULL,0,0},
572
+	{"nsub", 8836, 4},
573
+	{NULL,0,0},
574
+	{"gammad", 989, 6},
575
+	{"incare", 8453, 6},
576
+	{NULL,0,0},
577
+	{"rdquo", 8221, 5},
578
+	{"oacute", 243, 6},
463 579
 	{NULL,0,0},
464
-	{"rtri", 9657, 4},
465
-	{"Lambda", 923, 6},
466 580
 	{"EEgr", 919, 4},
467
-	{"utri", 9653, 4},
468 581
 	{NULL,0,0},
469 582
 	{NULL,0,0},
583
+	{"idiagr", 912, 6},
584
+	{"tcy", 1090, 3},
470 585
 	{NULL,0,0},
471 586
 	{NULL,0,0},
472 587
 	{NULL,0,0},
473 588
 	{NULL,0,0},
474 589
 	{NULL,0,0},
475 590
 	{NULL,0,0},
476
-	{"bsime", 8909, 5},
477
-	{"boxhU", 9576, 5},
478
-	{"epsiv", 949, 5},
479
-	{"hearts", 9829, 6},
480
-	{"sharp", 9839, 5},
481 591
 	{NULL,0,0},
482
-	{"quot", 34, 4},
483 592
 	{NULL,0,0},
484 593
 	{NULL,0,0},
485 594
 	{NULL,0,0},
486
-	{"smid", 8739, 4},
487
-	{"gt", 62, 2},
488 595
 	{NULL,0,0},
489
-	{"frac38", 8540, 6},
596
+	{"wreath", 8768, 6},
490 597
 	{NULL,0,0},
491
-	{"lt", 60, 2},
492 598
 	{NULL,0,0},
493 599
 	{NULL,0,0},
600
+	{"boxhd", 9516, 5},
601
+	{"dtri", 9663, 4},
602
+	{"ffllig", 64260, 6},
494 603
 	{NULL,0,0},
495
-	{"exist", 8707, 5},
496
-	{"lambda", 955, 6},
497
-	{"piv", 982, 3},
604
+	{"nabla", 8711, 5},
498 605
 	{NULL,0,0},
499 606
 	{NULL,0,0},
500 607
 	{NULL,0,0},
501 608
 	{NULL,0,0},
502
-	{"bsim", 8765, 4},
609
+	{"yicy", 1111, 4},
610
+	{"caret", 8257, 5},
611
+	{"empty", 8709, 5},
612
+	{"gamma", 947, 5},
613
+	{"Ncy", 1053, 3},
614
+	{"psgr", 968, 4},
615
+	{"rho", 961, 3},
503 616
 	{NULL,0,0},
504
-	{"sup3", 179, 4},
617
+	{"iff", 8660, 3},
505 618
 	{NULL,0,0},
619
+	{"boxdR", 9554, 5},
620
+	{"rtri", 9657, 4},
621
+	{"Tcy", 1058, 3},
506 622
 	{NULL,0,0},
507
-	{"gsim", 8819, 4},
508 623
 	{NULL,0,0},
509 624
 	{NULL,0,0},
510 625
 	{NULL,0,0},
626
+	{"frac25", 8534, 6},
511 627
 	{NULL,0,0},
512
-	{"lsim", 8818, 4},
628
+	{"acirc", 226, 5},
513 629
 	{NULL,0,0},
514
-	{"sstarf", 8902, 6},
515
-	{"ominus", 8854, 6},
630
+	{NULL,0,0},
631
+	{"Ngr", 925, 3},
516 632
 	{NULL,0,0},
517 633
 	{NULL,0,0},
518 634
 	{NULL,0,0},
635
+	{"phgr", 966, 4},
636
+	{NULL,0,0},
637
+	{"sccue", 8829, 5},
638
+	{NULL,0,0},
639
+	{NULL,0,0},
640
+	{NULL,0,0},
641
+	{NULL,0,0},
642
+	{NULL,0,0},
643
+	{NULL,0,0},
644
+	{NULL,0,0},
645
+	{NULL,0,0},
646
+	{"star", 9734, 4},
647
+	{NULL,0,0},
648
+	{"aacute", 225, 6},
649
+	{NULL,0,0},
650
+	{"malt", 10016, 4},
651
+	{NULL,0,0},
652
+	{NULL,0,0},
653
+	{"Chi", 935, 3},
654
+	{NULL,0,0},
655
+	{NULL,0,0},
656
+	{"comma", 44, 5},
657
+	{NULL,0,0},
658
+	{NULL,0,0},
659
+	{NULL,0,0},
660
+	{NULL,0,0},
661
+	{NULL,0,0},
662
+	{NULL,0,0},
663
+	{"delta", 948, 5},
664
+	{"szlig", 223, 5},
665
+	{NULL,0,0},
666
+	{NULL,0,0},
667
+	{"blank", 9251, 5},
668
+	{"OHgr", 937, 4},
669
+	{NULL,0,0},
670
+	{NULL,0,0},
671
+	{NULL,0,0},
672
+	{NULL,0,0},
673
+	{NULL,0,0},
674
+	{"setmn", 8726, 5},
675
+	{NULL,0,0},
676
+	{NULL,0,0},
519 677
 	{NULL,0,0},
520
-	{"boxvl", 9508, 5},
521 678
 	{"trade", 8482, 5},
522 679
 	{NULL,0,0},
523
-	{"vprop", 8733, 5},
524
-	{"bcong", 8780, 5},
525
-	{"hybull", 8259, 6},
526 680
 	{NULL,0,0},
527
-	{"cong", 8773, 4},
528 681
 	{NULL,0,0},
529
-	{"Dot", 168, 3},
530 682
 	{NULL,0,0},
683
+	{"dlcorn", 8990, 6},
684
+	{"rlm", 8207, 3},
531 685
 	{NULL,0,0},
532
-	{"filig", 64257, 5},
533
-	{"sung", 9834, 4},
534
-	{"THORN", 222, 5},
535 686
 	{NULL,0,0},
687
+	{"lt", 60, 2},
536 688
 	{NULL,0,0},
537
-	{"AElig", 198, 5},
538 689
 	{NULL,0,0},
690
+	{"boxdL", 9557, 5},
539 691
 	{NULL,0,0},
540 692
 	{NULL,0,0},
541
-	{"copy", 169, 4},
542
-	{"sqsupe", 8850, 6},
543
-	{"prop", 8733, 4},
544 693
 	{NULL,0,0},
545
-	{"prsim", 8830, 5},
546
-	{"apos", 39, 4},
547
-	{"ring", 730, 4},
694
+	{"kappav", 1008, 6},
695
+	{"ltimes", 8905, 6},
696
+	{"Ucirc", 219, 5},
697
+	{NULL,0,0},
698
+	{NULL,0,0},
699
+	{NULL,0,0},
700
+	{"sgr", 963, 3},
701
+	{"perp", 8869, 4},
548 702
 	{NULL,0,0},
703
+	{NULL,0,0},
704
+	{NULL,0,0},
705
+	{NULL,0,0},
706
+	{"shcy", 1096, 4},
707
+	{NULL,0,0},
708
+	{NULL,0,0},
709
+	{NULL,0,0},
710
+	{"boxh", 9472, 4},
711
+	{NULL,0,0},
712
+	{NULL,0,0},
713
+	{NULL,0,0},
714
+	{"notin", 8713, 5},
715
+	{NULL,0,0},
716
+	{"trie", 8796, 4},
717
+	{"urcrop", 8974, 6},
718
+	{NULL,0,0},
719
+	{NULL,0,0},
720
+	{NULL,0,0},
721
+	{NULL,0,0},
722
+	{NULL,0,0},
723
+	{NULL,0,0},
724
+	{"AElig", 198, 5},
549 725
 	{"boxHu", 9575, 5},
726
+	{"boxVL", 9571, 5},
727
+	{"frac16", 8537, 6},
728
+	{"hArr", 8660, 4},
729
+	{"Ecy", 1069, 3},
550 730
 	{NULL,0,0},
551
-	{"frac34", 190, 6},
552
-	{"OElig", 338, 5},
553 731
 	{NULL,0,0},
554 732
 	{NULL,0,0},
555 733
 	{NULL,0,0},
734
+	{"aleph", 8501, 5},
735
+	{"sbquo", 8218, 5},
556 736
 	{NULL,0,0},
557
-	{"drcrop", 8972, 6},
558
-	{"erDot", 8787, 5},
559 737
 	{NULL,0,0},
560 738
 	{NULL,0,0},
561
-	{"dot", 729, 3},
562
-	{"frac15", 8533, 6},
563 739
 	{NULL,0,0},
564
-	{"dlcrop", 8973, 6},
565 740
 	{NULL,0,0},
566 741
 	{NULL,0,0},
567 742
 	{NULL,0,0},
568 743
 	{NULL,0,0},
569 744
 	{NULL,0,0},
745
+	{"Jcy", 1049, 3},
746
+	{"Iukcy", 1030, 5},
570 747
 	{NULL,0,0},
571
-	{"Oslash", 216, 6},
572
-	{"efDot", 8786, 5},
573
-	{"djcy", 1106, 4},
574
-	{"not", 172, 3},
575
-	{"urcrop", 8974, 6},
576
-	{"gjcy", 1107, 4},
577
-	{"sdotb", 8865, 5},
578 748
 	{NULL,0,0},
749
+	{"icirc", 238, 5},
750
+	{"intcal", 8890, 6},
751
+	{"dzcy", 1119, 4},
579 752
 	{NULL,0,0},
580
-	{"kjcy", 1116, 4},
581
-	{"ljcy", 1113, 4},
582
-	{"ulcrop", 8975, 6},
583
-	{"njcy", 1114, 4},
753
+	{"Ntilde", 209, 6},
754
+	{"Ugr", 933, 3},
584 755
 	{NULL,0,0},
585
-	{"mldr", 8230, 4},
586
-	{"nldr", 8229, 4},
756
+	{"amp", 38, 3},
587 757
 	{NULL,0,0},
588 758
 	{NULL,0,0},
589
-	{"rhov", 1009, 4},
759
+	{"egr", 949, 3},
590 760
 	{NULL,0,0},
591
-	{"ecolon", 8789, 6},
761
+	{"equiv", 8801, 5},
762
+	{"agr", 945, 3},
592 763
 	{NULL,0,0},
593 764
 	{NULL,0,0},
594 765
 	{NULL,0,0},
595 766
 	{NULL,0,0},
596 767
 	{NULL,0,0},
597 768
 	{NULL,0,0},
598
-	{"hyphen", 8208, 6},
599 769
 	{NULL,0,0},
600 770
 	{NULL,0,0},
601 771
 	{NULL,0,0},
602 772
 	{NULL,0,0},
603
-	{"oslash", 248, 6},
773
+	{NULL,0,0},
774
+	{NULL,0,0},
775
+	{"boxDL", 9559, 5},
776
+	{"iukcy", 1110, 5},
777
+	{NULL,0,0},
778
+	{"ominus", 8854, 6},
779
+	{NULL,0,0},
780
+	{NULL,0,0},
781
+	{NULL,0,0},
782
+	{NULL,0,0},
783
+	{NULL,0,0},
784
+	{"forall", 8704, 6},
785
+	{NULL,0,0},
786
+	{NULL,0,0},
787
+	{NULL,0,0},
604 788
 	{"supE", 10950, 4},
789
+	{"igr", 953, 3},
605 790
 	{NULL,0,0},
791
+	{"rpargt", 10644, 6},
792
+	{"sfgr", 962, 4},
606 793
 	{NULL,0,0},
607
-	{"grave", 96, 5},
608
-	{"els", 10901, 3},
794
+	{"Ecirc", 202, 5},
609 795
 	{NULL,0,0},
796
+	{"hardcy", 1098, 6},
610 797
 	{NULL,0,0},
611 798
 	{NULL,0,0},
612 799
 	{NULL,0,0},
613 800
 	{NULL,0,0},
614
-	{"vrtri", 8883, 5},
615 801
 	{NULL,0,0},
616
-	{"Alpha", 913, 5},
617 802
 	{NULL,0,0},
618 803
 	{NULL,0,0},
619 804
 	{NULL,0,0},
805
+	{"cuvee", 8910, 5},
620 806
 	{NULL,0,0},
621
-	{"period", 46, 6},
622
-	{"vltri", 8882, 5},
623 807
 	{NULL,0,0},
624 808
 	{NULL,0,0},
625 809
 	{NULL,0,0},
626 810
 	{NULL,0,0},
627 811
 	{NULL,0,0},
628
-	{"emsp", 8195, 4},
629 812
 	{NULL,0,0},
630 813
 	{NULL,0,0},
631
-	{"part", 8706, 4},
814
+	{"lozf", 10731, 4},
632 815
 	{NULL,0,0},
633 816
 	{NULL,0,0},
634 817
 	{NULL,0,0},
635 818
 	{NULL,0,0},
819
+	{"boxvr", 9500, 5},
636 820
 	{NULL,0,0},
821
+	{"boxdl", 9488, 5},
637 822
 	{NULL,0,0},
638
-	{"boxHD", 9574, 5},
639
-	{"Auml", 196, 4},
640 823
 	{NULL,0,0},
641 824
 	{NULL,0,0},
642
-	{"Euml", 203, 4},
825
+	{"models", 8871, 6},
826
+	{"IOcy", 1025, 4},
643 827
 	{NULL,0,0},
828
+	{"boxvh", 9532, 5},
829
+	{"frac56", 8538, 6},
644 830
 	{NULL,0,0},
645 831
 	{NULL,0,0},
646
-	{"Iuml", 207, 4},
647
-	{"boxur", 9492, 5},
648
-	{"alpha", 945, 5},
649 832
 	{NULL,0,0},
650
-	{"cir", 9675, 3},
651
-	{"equiv", 8801, 5},
652
-	{"Ouml", 214, 4},
653
-	{"plusb", 8862, 5},
654 833
 	{NULL,0,0},
655 834
 	{NULL,0,0},
656 835
 	{NULL,0,0},
657 836
 	{NULL,0,0},
658
-	{"frown", 8994, 5},
659
-	{"Uuml", 220, 4},
660 837
 	{NULL,0,0},
838
+	{"utri", 9653, 4},
661 839
 	{NULL,0,0},
662
-	{"Yuml", 376, 4},
663
-	{"Omicron", 927, 7},
840
+	{"Yacute", 221, 6},
664 841
 	{NULL,0,0},
665
-	{"ape", 8778, 3},
842
+	{"uarr", 8593, 4},
843
+	{"boxVH", 9580, 5},
844
+	{"colone", 8788, 6},
845
+	{NULL,0,0},
846
+	{"YUcy", 1070, 4},
847
+	{"rthree", 8908, 6},
848
+	{"crarr", 8629, 5},
666 849
 	{NULL,0,0},
850
+	{"uacgr", 973, 5},
851
+	{"amalg", 10815, 5},
667 852
 	{NULL,0,0},
668 853
 	{NULL,0,0},
669 854
 	{NULL,0,0},
670
-	{"auml", 228, 4},
671 855
 	{NULL,0,0},
672 856
 	{NULL,0,0},
673
-	{"Scaron", 352, 6},
674
-	{"euml", 235, 4},
857
+	{"Jsercy", 1032, 6},
675 858
 	{NULL,0,0},
676 859
 	{NULL,0,0},
677
-	{"nabla", 8711, 5},
678
-	{"iuml", 239, 4},
860
+	{"apos", 39, 4},
861
+	{"cupre", 8828, 5},
862
+	{"prap", 10935, 4},
679 863
 	{NULL,0,0},
680
-	{"sube", 8838, 4},
864
+	{"Rcy", 1056, 3},
865
+	{"thinsp", 8201, 6},
681 866
 	{NULL,0,0},
682 867
 	{NULL,0,0},
683 868
 	{NULL,0,0},
684
-	{"ouml", 246, 4},
869
+	{"oelig", 339, 5},
870
+	{"eegr", 951, 4},
685 871
 	{NULL,0,0},
686
-	{"isin", 8712, 4},
872
+	{NULL,0,0},
873
+	{NULL,0,0},
874
+	{"tdot", 8411, 4},
875
+	{NULL,0,0},
876
+	{"gap", 10886, 3},
877
+	{NULL,0,0},
878
+	{NULL,0,0},
879
+	{NULL,0,0},
880
+	{NULL,0,0},
881
+	{NULL,0,0},
882
+	{NULL,0,0},
883
+	{NULL,0,0},
884
+	{NULL,0,0},
885
+	{NULL,0,0},
886
+	{"Lcy", 1051, 3},
887
+	{NULL,0,0},
888
+	{NULL,0,0},
889
+	{NULL,0,0},
890
+	{NULL,0,0},
891
+	{"igrave", 236, 6},
892
+	{"DZcy", 1039, 4},
893
+	{NULL,0,0},
894
+	{"boxur", 9492, 5},
895
+	{NULL,0,0},
896
+	{NULL,0,0},
897
+	{NULL,0,0},
898
+	{"boxvR", 9566, 5},
899
+	{"circ", 710, 4},
900
+	{NULL,0,0},
901
+	{"fork", 8916, 4},
902
+	{"Gg", 8921, 2},
903
+	{"vcy", 1074, 3},
904
+	{NULL,0,0},
905
+	{NULL,0,0},
906
+	{"auml", 228, 4},
907
+	{"zeta", 950, 4},
908
+	{NULL,0,0},
909
+	{"caron", 711, 5},
687 910
 	{"Cup", 8915, 3},
688
-	{"phone", 9742, 5},
689 911
 	{NULL,0,0},
690
-	{"semi", 59, 4},
691
-	{"uuml", 252, 4},
692 912
 	{NULL,0,0},
693 913
 	{NULL,0,0},
694
-	{"yuml", 255, 4},
695
-	{"omicron", 959, 7},
696
-	{"bepsi", 1014, 5},
914
+	{"deg", 176, 3},
697 915
 	{NULL,0,0},
698 916
 	{NULL,0,0},
699 917
 	{NULL,0,0},
700 918
 	{NULL,0,0},
919
+	{"bsime", 8909, 5},
701 920
 	{NULL,0,0},
702 921
 	{NULL,0,0},
703
-	{"Sup", 8913, 3},
704 922
 	{NULL,0,0},
705
-	{"scaron", 353, 6},
923
+	{"oast", 8859, 4},
924
+	{"boxvL", 9569, 5},
706 925
 	{NULL,0,0},
926
+	{"thksim", 8764, 6},
707 927
 	{NULL,0,0},
708 928
 	{NULL,0,0},
709 929
 	{NULL,0,0},
710 930
 	{NULL,0,0},
711 931
 	{NULL,0,0},
712 932
 	{NULL,0,0},
933
+	{"jsercy", 1112, 6},
713 934
 	{NULL,0,0},
714
-	{"frac45", 8536, 6},
935
+	{"Ouml", 214, 4},
715 936
 	{NULL,0,0},
716
-	{"Mu", 924, 2},
717
-	{"Nu", 925, 2},
718 937
 	{NULL,0,0},
719
-	{"numero", 8470, 6},
720
-	{"cup", 8746, 3},
721 938
 	{NULL,0,0},
722 939
 	{NULL,0,0},
723 940
 	{NULL,0,0},
724
-	{"boxdr", 9484, 5},
725 941
 	{NULL,0,0},
942
+	{"rdquor", 8221, 6},
943
+	{"ugrave", 249, 6},
726 944
 	{NULL,0,0},
945
+	{"eth", 240, 3},
727 946
 	{NULL,0,0},
728 947
 	{NULL,0,0},
948
+	{"Lgr", 923, 3},
729 949
 	{NULL,0,0},
730
-	{"Iota", 921, 4},
731
-	{"Acirc", 194, 5},
732 950
 	{NULL,0,0},
733
-	{"Pi", 928, 2},
734 951
 	{NULL,0,0},
735
-	{"Ecirc", 202, 5},
736
-	{"sup", 8835, 3},
737 952
 	{NULL,0,0},
953
+	{"rgr", 961, 3},
738 954
 	{NULL,0,0},
739
-	{"Icirc", 206, 5},
740
-	{"idiagr", 912, 6},
741
-	{"horbar", 8213, 6},
742
-	{"Xi", 926, 2},
743
-	{"top", 8868, 3},
955
+	{"Acy", 1040, 3},
744 956
 	{NULL,0,0},
745
-	{"Ocirc", 212, 5},
746 957
 	{NULL,0,0},
747
-	{"boxVH", 9580, 5},
748
-	{"mu", 956, 2},
749
-	{"nu", 957, 2},
750 958
 	{NULL,0,0},
751
-	{"ldot", 8918, 4},
752
-	{"odot", 8857, 4},
959
+	{NULL,0,0},
960
+	{NULL,0,0},
961
+	{"ni", 8715, 2},
962
+	{NULL,0,0},
963
+	{NULL,0,0},
964
+	{NULL,0,0},
965
+	{"Iacgr", 906, 5},
966
+	{NULL,0,0},
967
+	{NULL,0,0},
968
+	{NULL,0,0},
969
+	{"khcy", 1093, 4},
970
+	{"thkap", 8776, 5},
971
+	{NULL,0,0},
972
+	{"chcy", 1095, 4},
973
+	{NULL,0,0},
753 974
 	{"udiagr", 944, 6},
754
-	{"Ucirc", 219, 5},
755
-	{"sdot", 8901, 4},
756
-	{"ldquor", 8222, 6},
757
-	{"tdot", 8411, 4},
758 975
 	{NULL,0,0},
759 976
 	{NULL,0,0},
760 977
 	{NULL,0,0},
761 978
 	{NULL,0,0},
762
-	{"iota", 953, 4},
763
-	{"ni", 8715, 2},
764
-	{"acirc", 226, 5},
765
-	{"pi", 960, 2},
766
-	{"setmn", 8726, 5},
767
-	{"ecirc", 234, 5},
768
-	{"dash", 8208, 4},
769
-	{"blk34", 9619, 5},
770
-	{"Kappa", 922, 5},
771
-	{"icirc", 238, 5},
772
-	{"rdquor", 8221, 6},
773
-	{"ssetmn", 8726, 6},
774
-	{"xi", 958, 2},
775
-	{"sc", 8827, 2},
776
-	{"iexcl", 161, 5},
777
-	{"ocirc", 244, 5},
778
-	{"Tau", 932, 3},
779
-	{"boxuL", 9563, 5},
780
-	{"wedgeq", 8793, 6},
781 979
 	{NULL,0,0},
782
-	{"sigmav", 962, 6},
783
-	{"ucirc", 251, 5},
784 980
 	{NULL,0,0},
785 981
 	{NULL,0,0},
786
-	{"xcirc", 9711, 5},
982
+	{"frac35", 8535, 6},
983
+	{"gsim", 8819, 4},
984
+	{"OElig", 338, 5},
985
+	{"raquo", 187, 5},
986
+	{"sung", 9834, 4},
987
+	{"rsqb", 93, 4},
988
+	{"frasl", 8260, 5},
787 989
 	{NULL,0,0},
990
+	{"tprime", 8244, 6},
788 991
 	{NULL,0,0},
789 992
 	{NULL,0,0},
790 993
 	{NULL,0,0},
994
+	{"atilde", 227, 6},
791 995
 	{NULL,0,0},
792 996
 	{NULL,0,0},
793
-	{"boxH", 9552, 4},
794 997
 	{NULL,0,0},
998
+	{"phi", 966, 3},
795 999
 	{NULL,0,0},
796 1000
 	{NULL,0,0},
797
-	{"eth", 240, 3},
798
-	{"gE", 8807, 2},
799 1001
 	{NULL,0,0},
800 1002
 	{NULL,0,0},
801
-	{"kappa", 954, 5},
802
-	{"ltimes", 8905, 6},
803
-	{"lE", 8806, 2},
804 1003
 	{NULL,0,0},
805
-	{"otimes", 8855, 6},
806 1004
 	{NULL,0,0},
1005
+	{"iocy", 1105, 4},
807 1006
 	{NULL,0,0},
808
-	{"rtimes", 8906, 6},
809
-	{"tau", 964, 3},
810 1007
 	{NULL,0,0},
811
-	{"vDash", 8872, 5},
812
-	{"cupre", 8828, 5},
813 1008
 	{NULL,0,0},
814 1009
 	{NULL,0,0},
815 1010
 	{NULL,0,0},
... ...
@@ -819,716 +1167,822 @@ static struct element entities_htable_elements[] = {
819 819
 	{NULL,0,0},
820 820
 	{NULL,0,0},
821 821
 	{NULL,0,0},
822
+	{"num", 35, 3},
823
+	{"lthree", 8907, 6},
822 824
 	{NULL,0,0},
825
+	{"Sub", 8912, 3},
823 826
 	{NULL,0,0},
824
-	{"Aacgr", 902, 5},
825
-	{"minusb", 8863, 6},
826
-	{"DScy", 1029, 4},
827
-	{"nexist", 8708, 6},
828
-	{"blk12", 9618, 5},
829
-	{"Eacgr", 904, 5},
830
-	{"sqsub", 8847, 5},
831
-	{"plus", 43, 4},
832
-	{"Iacgr", 906, 5},
833
-	{"bernou", 8492, 6},
834
-	{"boxvr", 9500, 5},
835 827
 	{NULL,0,0},
836
-	{"phiv", 966, 4},
837 828
 	{NULL,0,0},
838
-	{"Oacgr", 908, 5},
839
-	{"fnof", 402, 4},
840 829
 	{NULL,0,0},
841
-	{"iecy", 1077, 4},
842
-	{"TScy", 1062, 4},
843 830
 	{NULL,0,0},
844
-	{"Uacgr", 910, 5},
845 831
 	{NULL,0,0},
846 832
 	{NULL,0,0},
833
+	{"DotDot", 8412, 6},
847 834
 	{NULL,0,0},
848 835
 	{NULL,0,0},
849 836
 	{NULL,0,0},
850 837
 	{NULL,0,0},
851
-	{"boxUl", 9564, 5},
852 838
 	{NULL,0,0},
839
+	{"sstarf", 8902, 6},
853 840
 	{NULL,0,0},
854 841
 	{NULL,0,0},
855
-	{"deg", 176, 3},
856
-	{"boxdL", 9557, 5},
857
-	{"lrm", 8206, 3},
858
-	{"TSHcy", 1035, 5},
859
-	{"aacgr", 940, 5},
860
-	{"eacgr", 941, 5},
861 842
 	{NULL,0,0},
862
-	{"Aacute", 193, 6},
863
-	{"leg", 8922, 3},
864
-	{"iacgr", 943, 5},
865
-	{"thinsp", 8201, 6},
866
-	{"Eacute", 201, 6},
867
-	{"YAcy", 1071, 4},
868 843
 	{NULL,0,0},
869
-	{"rlm", 8207, 3},
870
-	{"Iacute", 205, 6},
871
-	{"oacgr", 972, 5},
872
-	{"reg", 174, 3},
844
+	{"frac12", 189, 6},
845
+	{"ulcrop", 8975, 6},
846
+	{NULL,0,0},
847
+	{NULL,0,0},
848
+	{NULL,0,0},
849
+	{"gjcy", 1107, 4},
850
+	{NULL,0,0},
851
+	{NULL,0,0},
852
+	{NULL,0,0},
853
+	{"Barwed", 8966, 6},
854
+	{NULL,0,0},
855
+	{"boxUR", 9562, 5},
856
+	{NULL,0,0},
857
+	{"boxhU", 9576, 5},
858
+	{"SHcy", 1064, 4},
859
+	{NULL,0,0},
860
+	{NULL,0,0},
861
+	{NULL,0,0},
862
+	{"Atilde", 195, 6},
873 863
 	{"egs", 10902, 3},
874
-	{"DotDot", 8412, 6},
875 864
 	{NULL,0,0},
876
-	{"Oacute", 211, 6},
877
-	{"frac56", 8538, 6},
878
-	{"malt", 10016, 4},
879
-	{"uacgr", 973, 5},
865
+	{"odot", 8857, 4},
880 866
 	{NULL,0,0},
881 867
 	{NULL,0,0},
882
-	{"Uacute", 218, 6},
868
+	{"thetasym", 977, 8},
883 869
 	{NULL,0,0},
884
-	{"ensp", 8194, 4},
870
+	{"Aacgr", 902, 5},
871
+	{"gE", 8807, 2},
872
+	{"tgr", 964, 3},
873
+	{"tshcy", 1115, 5},
885 874
 	{NULL,0,0},
886
-	{"Yacute", 221, 6},
887 875
 	{NULL,0,0},
888 876
 	{NULL,0,0},
889 877
 	{NULL,0,0},
890 878
 	{NULL,0,0},
891
-	{"samalg", 8720, 6},
892
-	{"shy", 173, 3},
893 879
 	{NULL,0,0},
894
-	{"aacute", 225, 6},
895
-	{"permil", 8240, 6},
880
+	{NULL,0,0},
881
+	{NULL,0,0},
882
+	{"KHgr", 935, 4},
883
+	{"sbsol", 65128, 5},
884
+	{NULL,0,0},
885
+	{"Mu", 924, 2},
886
+	{"jukcy", 1108, 5},
887
+	{"Scy", 1057, 3},
888
+	{"boxHd", 9572, 5},
896 889
 	{"mnplus", 8723, 6},
897
-	{"hellip", 8230, 6},
898
-	{"eacute", 233, 6},
899
-	{"frac18", 8539, 6},
900
-	{"sfrown", 8994, 6},
890
+	{"ucy", 1091, 3},
891
+	{"percnt", 37, 6},
892
+	{"uuml", 252, 4},
901 893
 	{NULL,0,0},
902
-	{"iacute", 237, 6},
894
+	{"yucy", 1102, 4},
903 895
 	{NULL,0,0},
904 896
 	{NULL,0,0},
905 897
 	{NULL,0,0},
898
+	{"target", 8982, 6},
906 899
 	{NULL,0,0},
907
-	{"nbsp", 160, 4},
908
-	{"sol", 47, 3},
909
-	{"oacute", 243, 6},
910
-	{"compfn", 8728, 6},
911
-	{"colon", 58, 5},
912 900
 	{NULL,0,0},
913
-	{"ohacgr", 974, 6},
914
-	{"uacute", 250, 6},
915 901
 	{NULL,0,0},
916 902
 	{NULL,0,0},
917 903
 	{NULL,0,0},
918
-	{"vellip", 8942, 6},
919
-	{"yacute", 253, 6},
904
+	{"ETH", 208, 3},
905
+	{NULL,0,0},
920 906
 	{NULL,0,0},
921 907
 	{NULL,0,0},
908
+	{"rhov", 1009, 4},
909
+	{NULL,0,0},
910
+	{"lambda", 955, 6},
911
+	{NULL,0,0},
922 912
 	{NULL,0,0},
923 913
 	{NULL,0,0},
914
+	{"thgr", 952, 4},
924 915
 	{NULL,0,0},
925 916
 	{NULL,0,0},
917
+	{"Mcy", 1052, 3},
926 918
 	{NULL,0,0},
919
+	{"boxdr", 9484, 5},
927 920
 	{NULL,0,0},
921
+	{"sup2", 178, 4},
928 922
 	{"boxDl", 9558, 5},
929 923
 	{NULL,0,0},
924
+	{"marker", 9646, 6},
925
+	{"rang", 9002, 4},
930 926
 	{NULL,0,0},
931 927
 	{NULL,0,0},
932 928
 	{NULL,0,0},
933 929
 	{NULL,0,0},
934
-	{"angmsd", 8737, 6},
935 930
 	{NULL,0,0},
931
+	{"breve", 728, 5},
932
+	{"ecirc", 234, 5},
936 933
 	{NULL,0,0},
937 934
 	{NULL,0,0},
935
+	{"pi", 960, 2},
938 936
 	{NULL,0,0},
939 937
 	{NULL,0,0},
938
+	{"dArr", 8659, 4},
939
+	{"frown", 8994, 5},
940 940
 	{NULL,0,0},
941 941
 	{NULL,0,0},
942
+	{"rceil", 8969, 5},
943
+	{"blk14", 9617, 5},
942 944
 	{NULL,0,0},
943 945
 	{NULL,0,0},
944
-	{"frasl", 8260, 5},
945
-	{"gEl", 10892, 3},
946 946
 	{NULL,0,0},
947
-	{"perp", 8869, 4},
948 947
 	{NULL,0,0},
949 948
 	{NULL,0,0},
950 949
 	{NULL,0,0},
950
+	{"sqsup", 8848, 5},
951 951
 	{NULL,0,0},
952 952
 	{NULL,0,0},
953 953
 	{NULL,0,0},
954 954
 	{NULL,0,0},
955 955
 	{NULL,0,0},
956
-	{"boxvL", 9569, 5},
957 956
 	{NULL,0,0},
958 957
 	{NULL,0,0},
959 958
 	{NULL,0,0},
959
+	{"aelig", 230, 5},
960 960
 	{NULL,0,0},
961
-	{"lpar", 40, 4},
961
+	{"xgr", 958, 3},
962 962
 	{NULL,0,0},
963
+	{"fllig", 64258, 5},
963 964
 	{NULL,0,0},
964
-	{"frac14", 188, 6},
965
+	{"yen", 165, 3},
965 966
 	{NULL,0,0},
966
-	{"conint", 8750, 6},
967
-	{"rpar", 41, 4},
968
-	{"spar", 8741, 4},
969
-	{"order", 8500, 5},
970
-	{"there4", 8756, 6},
971 967
 	{NULL,0,0},
972
-	{"and", 8743, 3},
973 968
 	{NULL,0,0},
974 969
 	{NULL,0,0},
975
-	{"PSgr", 936, 4},
976
-	{"eegr", 951, 4},
977
-	{"beth", 8502, 4},
970
+	{"cuepr", 8926, 5},
971
+	{"rsquo", 8217, 5},
978 972
 	{NULL,0,0},
973
+	{"Uuml", 220, 4},
974
+	{"Agr", 913, 3},
979 975
 	{NULL,0,0},
976
+	{"yacute", 253, 6},
980 977
 	{NULL,0,0},
981 978
 	{NULL,0,0},
982
-	{"drcorn", 8991, 6},
979
+	{"Icy", 1048, 3},
983 980
 	{NULL,0,0},
984 981
 	{NULL,0,0},
985
-	{"boxHU", 9577, 5},
982
+	{NULL,0,0},
983
+	{"ucirc", 251, 5},
984
+	{"rtrie", 8885, 5},
985
+	{"egrave", 232, 6},
986
+	{NULL,0,0},
987
+	{NULL,0,0},
988
+	{NULL,0,0},
989
+	{"copy", 169, 4},
986 990
 	{NULL,0,0},
987 991
 	{NULL,0,0},
992
+	{NULL,0,0},
993
+	{"cuwed", 8911, 5},
988 994
 	{"starf", 9733, 5},
989
-	{"dlcorn", 8990, 6},
990
-	{"check", 10003, 5},
991 995
 	{NULL,0,0},
992
-	{"SOFTcy", 1068, 6},
993 996
 	{NULL,0,0},
997
+	{"thetav", 977, 6},
998
+	{"Zcy", 1047, 3},
999
+	{"Lambda", 923, 6},
1000
+	{"ohgr", 969, 4},
1001
+	{NULL,0,0},
1002
+	{NULL,0,0},
1003
+	{"filig", 64257, 5},
1004
+	{"epsiv", 949, 5},
1005
+	{NULL,0,0},
1006
+	{NULL,0,0},
1007
+	{"iecy", 1077, 4},
1008
+	{"frac18", 8539, 6},
1009
+	{NULL,0,0},
1010
+	{"ldquor", 8222, 6},
1011
+	{NULL,0,0},
1012
+	{"phone", 9742, 5},
1013
+	{"lsaquo", 8249, 6},
1014
+	{NULL,0,0},
1015
+	{"LJcy", 1033, 4},
994 1016
 	{NULL,0,0},
995 1017
 	{"dtrif", 9662, 5},
996
-	{"iquest", 191, 6},
997
-	{"ltrif", 9666, 5},
1018
+	{"sqsube", 8849, 6},
998 1019
 	{NULL,0,0},
999
-	{"ap", 8776, 2},
1000
-	{"urcorn", 8989, 6},
1020
+	{"KHcy", 1061, 4},
1021
+	{"subE", 10949, 4},
1001 1022
 	{NULL,0,0},
1023
+	{"boxUL", 9565, 5},
1024
+	{"quot", 34, 4},
1002 1025
 	{NULL,0,0},
1003
-	{"rtrif", 9656, 5},
1026
+	{"phmmat", 8499, 6},
1027
+	{"uhblk", 9600, 5},
1004 1028
 	{NULL,0,0},
1005 1029
 	{NULL,0,0},
1006
-	{"sime", 8771, 4},
1007
-	{"ulcorn", 8988, 6},
1008
-	{"Barwed", 8966, 6},
1009
-	{"utrif", 9652, 5},
1010 1030
 	{NULL,0,0},
1031
+	{"ugr", 965, 3},
1032
+	{"sect", 167, 4},
1011 1033
 	{NULL,0,0},
1012 1034
 	{NULL,0,0},
1035
+	{"vellip", 8942, 6},
1013 1036
 	{NULL,0,0},
1014
-	{"marker", 9646, 6},
1015 1037
 	{NULL,0,0},
1016
-	{"Atilde", 195, 6},
1017 1038
 	{NULL,0,0},
1018 1039
 	{NULL,0,0},
1019 1040
 	{NULL,0,0},
1020 1041
 	{NULL,0,0},
1021 1042
 	{NULL,0,0},
1022
-	{"divide", 247, 6},
1023
-	{"weierp", 8472, 6},
1043
+	{"boxuR", 9560, 5},
1024 1044
 	{NULL,0,0},
1025
-	{"sqsup", 8848, 5},
1045
+	{"ast", 42, 3},
1026 1046
 	{NULL,0,0},
1027 1047
 	{NULL,0,0},
1028
-	{"boxVl", 9570, 5},
1029
-	{"esdot", 8784, 5},
1030
-	{"Ntilde", 209, 6},
1048
+	{NULL,0,0},
1049
+	{NULL,0,0},
1050
+	{NULL,0,0},
1051
+	{"period", 46, 6},
1052
+	{NULL,0,0},
1053
+	{NULL,0,0},
1054
+	{NULL,0,0},
1055
+	{NULL,0,0},
1056
+	{NULL,0,0},
1057
+	{"laquo", 171, 5},
1058
+	{NULL,0,0},
1059
+	{"planck", 8463, 6},
1060
+	{"samalg", 8720, 6},
1061
+	{NULL,0,0},
1062
+	{"smid", 8739, 4},
1063
+	{NULL,0,0},
1064
+	{NULL,0,0},
1065
+	{NULL,0,0},
1066
+	{"upsilon", 965, 7},
1067
+	{"prop", 8733, 4},
1068
+	{NULL,0,0},
1069
+	{NULL,0,0},
1070
+	{NULL,0,0},
1071
+	{NULL,0,0},
1072
+	{NULL,0,0},
1073
+	{NULL,0,0},
1074
+	{NULL,0,0},
1075
+	{"brvbar", 166, 6},
1076
+	{NULL,0,0},
1077
+	{"sqsupe", 8850, 6},
1078
+	{NULL,0,0},
1079
+	{NULL,0,0},
1080
+	{NULL,0,0},
1081
+	{NULL,0,0},
1082
+	{"spar", 8741, 4},
1083
+	{NULL,0,0},
1084
+	{NULL,0,0},
1085
+	{NULL,0,0},
1086
+	{NULL,0,0},
1087
+	{NULL,0,0},
1088
+	{NULL,0,0},
1089
+	{NULL,0,0},
1090
+	{"HARDcy", 1066, 6},
1091
+	{NULL,0,0},
1092
+	{NULL,0,0},
1093
+	{"par", 8741, 3},
1094
+	{"eDot", 8785, 4},
1095
+	{"sime", 8771, 4},
1096
+	{NULL,0,0},
1097
+	{NULL,0,0},
1098
+	{NULL,0,0},
1099
+	{"udigr", 971, 5},
1100
+	{"ggr", 947, 3},
1031 1101
 	{"gsdot", 8919, 5},
1032
-	{"becaus", 8757, 6},
1033
-	{"Otilde", 213, 6},
1034
-	{"ffilig", 64259, 6},
1035 1102
 	{NULL,0,0},
1103
+	{"Ogr", 927, 3},
1104
+	{"lcub", 123, 4},
1036 1105
 	{NULL,0,0},
1037 1106
 	{NULL,0,0},
1038 1107
 	{NULL,0,0},
1039 1108
 	{NULL,0,0},
1040
-	{"blank", 9251, 5},
1041
-	{"barwed", 8965, 6},
1042
-	{"sigmaf", 962, 6},
1109
+	{NULL,0,0},
1110
+	{"epsi", 1013, 4},
1111
+	{NULL,0,0},
1112
+	{NULL,0,0},
1113
+	{NULL,0,0},
1114
+	{NULL,0,0},
1115
+	{NULL,0,0},
1116
+	{NULL,0,0},
1117
+	{NULL,0,0},
1118
+	{NULL,0,0},
1119
+	{NULL,0,0},
1120
+	{NULL,0,0},
1121
+	{NULL,0,0},
1122
+	{NULL,0,0},
1123
+	{NULL,0,0},
1124
+	{NULL,0,0},
1125
+	{"YAcy", 1071, 4},
1126
+	{NULL,0,0},
1127
+	{NULL,0,0},
1128
+	{NULL,0,0},
1129
+	{NULL,0,0},
1130
+	{NULL,0,0},
1131
+	{NULL,0,0},
1132
+	{"scy", 1089, 3},
1133
+	{"Aacute", 193, 6},
1134
+	{NULL,0,0},
1135
+	{NULL,0,0},
1136
+	{"hybull", 8259, 6},
1137
+	{"urcorn", 8989, 6},
1138
+	{NULL,0,0},
1139
+	{NULL,0,0},
1140
+	{NULL,0,0},
1141
+	{"jcy", 1081, 3},
1142
+	{"uml", 168, 3},
1143
+	{"PHgr", 934, 4},
1144
+	{"uacute", 250, 6},
1145
+	{"lrm", 8206, 3},
1146
+	{NULL,0,0},
1147
+	{NULL,0,0},
1148
+	{"lagran", 8466, 6},
1149
+	{"mgr", 956, 3},
1150
+	{NULL,0,0},
1151
+	{NULL,0,0},
1152
+	{NULL,0,0},
1153
+	{NULL,0,0},
1154
+	{NULL,0,0},
1155
+	{NULL,0,0},
1156
+	{NULL,0,0},
1157
+	{"boxV", 9553, 4},
1158
+	{"ring", 730, 4},
1159
+	{NULL,0,0},
1160
+	{NULL,0,0},
1161
+	{NULL,0,0},
1162
+	{NULL,0,0},
1163
+	{"xi", 958, 2},
1164
+	{NULL,0,0},
1165
+	{"frac58", 8541, 6},
1166
+	{"Upsi", 978, 4},
1167
+	{NULL,0,0},
1168
+	{"rsquor", 8217, 6},
1169
+	{"emsp14", 8197, 6},
1170
+	{NULL,0,0},
1171
+	{NULL,0,0},
1172
+	{"times", 215, 5},
1173
+	{"sqcap", 8851, 5},
1174
+	{NULL,0,0},
1175
+	{NULL,0,0},
1176
+	{NULL,0,0},
1177
+	{NULL,0,0},
1178
+	{NULL,0,0},
1179
+	{NULL,0,0},
1180
+	{"zhcy", 1078, 4},
1181
+	{NULL,0,0},
1182
+	{NULL,0,0},
1043 1183
 	{NULL,0,0},
1044 1184
 	{NULL,0,0},
1045 1185
 	{NULL,0,0},
1046
-	{"aelig", 230, 5},
1047 1186
 	{NULL,0,0},
1048
-	{"atilde", 227, 6},
1049 1187
 	{"lsquo", 8216, 5},
1050 1188
 	{NULL,0,0},
1051
-	{"veebar", 8891, 6},
1052
-	{"target", 8982, 6},
1053 1189
 	{NULL,0,0},
1054
-	{"rsquo", 8217, 5},
1055 1190
 	{NULL,0,0},
1056 1191
 	{NULL,0,0},
1057 1192
 	{NULL,0,0},
1058
-	{"SHCHcy", 1065, 6},
1059 1193
 	{NULL,0,0},
1060
-	{"oelig", 339, 5},
1061
-	{"ntilde", 241, 6},
1194
+	{"dash", 8208, 4},
1195
+	{NULL,0,0},
1196
+	{NULL,0,0},
1197
+	{"rtimes", 8906, 6},
1198
+	{"lpargt", 10656, 6},
1199
+	{NULL,0,0},
1200
+	{NULL,0,0},
1201
+	{NULL,0,0},
1202
+	{NULL,0,0},
1203
+	{NULL,0,0},
1204
+	{"Udigr", 939, 5},
1205
+	{NULL,0,0},
1206
+	{NULL,0,0},
1207
+	{NULL,0,0},
1208
+	{"female", 9792, 6},
1209
+	{NULL,0,0},
1210
+	{NULL,0,0},
1211
+	{NULL,0,0},
1212
+	{NULL,0,0},
1213
+	{NULL,0,0},
1214
+	{"plusdo", 8724, 6},
1215
+	{NULL,0,0},
1062 1216
 	{"otilde", 245, 6},
1063 1217
 	{NULL,0,0},
1064
-	{"clubs", 9827, 5},
1065 1218
 	{NULL,0,0},
1219
+	{"rcub", 125, 4},
1220
+	{"ecir", 8790, 4},
1066 1221
 	{NULL,0,0},
1222
+	{"diam", 8900, 4},
1223
+	{"wedgeq", 8793, 6},
1224
+	{"isin", 8712, 4},
1067 1225
 	{NULL,0,0},
1068
-	{"crarr", 8629, 5},
1069
-	{"fork", 8916, 4},
1070
-	{"laquo", 171, 5},
1071
-	{"notin", 8713, 5},
1072 1226
 	{NULL,0,0},
1073 1227
 	{NULL,0,0},
1074
-	{"DZcy", 1039, 4},
1075
-	{"raquo", 187, 5},
1076
-	{"aleph", 8501, 5},
1228
+	{"order", 8500, 5},
1077 1229
 	{NULL,0,0},
1078
-	{"phmmat", 8499, 6},
1079
-	{"middot", 183, 6},
1080
-	{"gammad", 989, 6},
1081 1230
 	{NULL,0,0},
1082 1231
 	{NULL,0,0},
1083
-	{"boxuR", 9560, 5},
1084 1232
 	{NULL,0,0},
1085 1233
 	{NULL,0,0},
1086 1234
 	{NULL,0,0},
1087
-	{"cuesc", 8927, 5},
1088 1235
 	{NULL,0,0},
1089
-	{"dashv", 8867, 5},
1090 1236
 	{NULL,0,0},
1091 1237
 	{NULL,0,0},
1092 1238
 	{NULL,0,0},
1093 1239
 	{NULL,0,0},
1094
-	{"CHcy", 1063, 4},
1240
+	{"Fcy", 1060, 3},
1095 1241
 	{NULL,0,0},
1242
+	{"TSHcy", 1035, 5},
1243
+	{"yuml", 255, 4},
1244
+	{"fnof", 402, 4},
1245
+	{"excl", 33, 4},
1246
+	{"timesb", 8864, 6},
1096 1247
 	{NULL,0,0},
1097 1248
 	{NULL,0,0},
1098 1249
 	{NULL,0,0},
1099 1250
 	{NULL,0,0},
1100
-	{"angst", 8491, 5},
1251
+	{"Igrave", 204, 6},
1252
+	{NULL,0,0},
1253
+	{NULL,0,0},
1254
+	{NULL,0,0},
1255
+	{NULL,0,0},
1256
+	{"lhblk", 9604, 5},
1257
+	{"ulcorn", 8988, 6},
1258
+	{NULL,0,0},
1259
+	{"int", 8747, 3},
1260
+	{"ltrif", 9666, 5},
1261
+	{"Gt", 8811, 2},
1262
+	{"ldquo", 8220, 5},
1263
+	{"KJcy", 1036, 4},
1264
+	{NULL,0,0},
1265
+	{NULL,0,0},
1266
+	{NULL,0,0},
1267
+	{"sup", 8835, 3},
1268
+	{NULL,0,0},
1269
+	{NULL,0,0},
1270
+	{NULL,0,0},
1101 1271
 	{NULL,0,0},
1102
-	{"KHcy", 1061, 4},
1103
-	{"incare", 8453, 6},
1104
-	{"Acy", 1040, 3},
1105
-	{"Bcy", 1041, 3},
1106 1272
 	{NULL,0,0},
1107
-	{"Jsercy", 1032, 6},
1108
-	{"Dcy", 1044, 3},
1109
-	{"Ecy", 1069, 3},
1110
-	{"SHcy", 1064, 4},
1111 1273
 	{"Gcy", 1043, 3},
1112
-	{"Fcy", 1060, 3},
1113
-	{"Icy", 1048, 3},
1114
-	{"Kcy", 1050, 3},
1115
-	{"Lcy", 1051, 3},
1116
-	{"Jcy", 1049, 3},
1117
-	{"Delta", 916, 5},
1118
-	{"Ocy", 1054, 3},
1119
-	{"cedil", 184, 5},
1120
-	{"Pcy", 1055, 3},
1121
-	{"Rcy", 1056, 3},
1122
-	{"Mcy", 1052, 3},
1123
-	{"prap", 10935, 4},
1124
-	{"Tcy", 1058, 3},
1125
-	{"Scy", 1057, 3},
1126
-	{"inodot", 305, 6},
1127
-	{"jnodot", 106, 6},
1128
-	{"frac25", 8534, 6},
1129
-	{"Ycy", 1067, 3},
1130
-	{"Gamma", 915, 5},
1131
-	{"Vcy", 1042, 3},
1132
-	{"Ncy", 1053, 3},
1133 1274
 	{NULL,0,0},
1134
-	{"square", 9633, 6},
1135
-	{"Zcy", 1047, 3},
1136
-	{"acy", 1072, 3},
1137
-	{"bcy", 1073, 3},
1275
+	{NULL,0,0},
1276
+	{NULL,0,0},
1277
+	{NULL,0,0},
1278
+	{NULL,0,0},
1138 1279
 	{"ZHcy", 1046, 4},
1139
-	{"jsercy", 1112, 6},
1140
-	{"dcy", 1076, 3},
1141
-	{"fcy", 1092, 3},
1142
-	{"gcy", 1075, 3},
1143
-	{"ecy", 1101, 3},
1144
-	{"icy", 1080, 3},
1145
-	{"jcy", 1081, 3},
1146
-	{"kcy", 1082, 3},
1147
-	{"lcy", 1083, 3},
1148
-	{"mcy", 1084, 3},
1149
-	{"ncy", 1085, 3},
1150
-	{"ocy", 1086, 3},
1151
-	{"pcy", 1087, 3},
1152
-	{"Iukcy", 1030, 5},
1153
-	{"rcy", 1088, 3},
1154
-	{"scy", 1089, 3},
1155
-	{"nsub", 8836, 4},
1156
-	{"boxUr", 9561, 5},
1157
-	{"ucy", 1091, 3},
1158
-	{"sccue", 8829, 5},
1159
-	{"Jukcy", 1028, 5},
1160
-	{"boxdR", 9554, 5},
1161
-	{"tcy", 1090, 3},
1162
-	{"empty", 8709, 5},
1163
-	{"female", 9792, 6},
1164
-	{"delta", 948, 5},
1165
-	{"gamma", 947, 5},
1166
-	{"ycy", 1099, 3},
1167
-	{"twixt", 8812, 5},
1168 1280
 	{NULL,0,0},
1169
-	{"EEacgr", 905, 6},
1170 1281
 	{NULL,0,0},
1171
-	{"zcy", 1079, 3},
1172
-	{"copysr", 8471, 6},
1173 1282
 	{NULL,0,0},
1283
+	{"Theta", 920, 5},
1174 1284
 	{NULL,0,0},
1175 1285
 	{NULL,0,0},
1176
-	{"times", 215, 5},
1177 1286
 	{NULL,0,0},
1178
-	{"vcy", 1074, 3},
1179
-	{"Ucy", 1059, 3},
1180 1287
 	{NULL,0,0},
1181 1288
 	{NULL,0,0},
1182 1289
 	{NULL,0,0},
1183 1290
 	{NULL,0,0},
1184
-	{"iukcy", 1110, 5},
1185
-	{"subE", 10949, 4},
1186
-	{"jukcy", 1108, 5},
1187 1291
 	{NULL,0,0},
1188
-	{"lfloor", 8970, 6},
1292
+	{"comp", 8705, 4},
1293
+	{"sce", 10928, 3},
1189 1294
 	{NULL,0,0},
1295
+	{"chi", 967, 3},
1190 1296
 	{NULL,0,0},
1191
-	{"rfloor", 8971, 6},
1192
-	{"pre", 10927, 3},
1193 1297
 	{NULL,0,0},
1194 1298
 	{NULL,0,0},
1299
+	{"Kappa", 922, 5},
1195 1300
 	{NULL,0,0},
1301
+	{"Vvdash", 8874, 6},
1196 1302
 	{NULL,0,0},
1197
-	{"radic", 8730, 5},
1198
-	{"kappav", 1008, 6},
1199 1303
 	{NULL,0,0},
1200
-	{"circ", 710, 4},
1201 1304
 	{NULL,0,0},
1202 1305
 	{NULL,0,0},
1203
-	{"frac78", 8542, 6},
1204 1306
 	{NULL,0,0},
1307
+	{"boxv", 9474, 4},
1308
+	{"zcy", 1079, 3},
1205 1309
 	{NULL,0,0},
1310
+	{"and", 8743, 3},
1311
+	{"thorn", 254, 5},
1206 1312
 	{NULL,0,0},
1313
+	{"cire", 8791, 4},
1207 1314
 	{NULL,0,0},
1208
-	{"softcy", 1100, 6},
1209 1315
 	{NULL,0,0},
1210 1316
 	{NULL,0,0},
1211 1317
 	{NULL,0,0},
1212
-	{"dollar", 36, 6},
1213 1318
 	{NULL,0,0},
1214 1319
 	{NULL,0,0},
1215 1320
 	{NULL,0,0},
1321
+	{"equals", 61, 6},
1322
+	{"ecy", 1101, 3},
1216 1323
 	{NULL,0,0},
1217 1324
 	{NULL,0,0},
1218 1325
 	{NULL,0,0},
1326
+	{"tscy", 1094, 4},
1219 1327
 	{NULL,0,0},
1220
-	{"boxv", 9474, 4},
1221 1328
 	{NULL,0,0},
1329
+	{"boxH", 9552, 4},
1330
+	{"Ccedil", 199, 6},
1222 1331
 	{NULL,0,0},
1223
-	{"plusmn", 177, 6},
1224 1332
 	{NULL,0,0},
1225 1333
 	{NULL,0,0},
1226 1334
 	{NULL,0,0},
1227 1335
 	{NULL,0,0},
1336
+	{"Ycy", 1067, 3},
1228 1337
 	{NULL,0,0},
1229
-	{"cross", 10007, 5},
1338
+	{"Tgr", 932, 3},
1230 1339
 	{NULL,0,0},
1231 1340
 	{NULL,0,0},
1232
-	{"boxDr", 9555, 5},
1341
+	{"frac23", 8532, 6},
1342
+	{"sqsub", 8847, 5},
1343
+	{"sup1", 185, 4},
1233 1344
 	{NULL,0,0},
1234
-	{"dblac", 733, 5},
1235
-	{"sqcap", 8851, 5},
1236 1345
 	{NULL,0,0},
1237
-	{"boxhd", 9516, 5},
1238
-	{"ordm", 186, 4},
1239
-	{"lowast", 8727, 6},
1240
-	{"KHgr", 935, 4},
1241
-	{"mid", 8739, 3},
1242 1346
 	{NULL,0,0},
1243
-	{"emsp14", 8197, 6},
1244
-	{"OHgr", 937, 4},
1245
-	{"PHgr", 934, 4},
1246
-	{"sfgr", 962, 4},
1247 1347
 	{NULL,0,0},
1248
-	{"Verbar", 8214, 6},
1249
-	{"Beta", 914, 4},
1250
-	{"Psi", 936, 3},
1251 1348
 	{NULL,0,0},
1252
-	{"THgr", 920, 4},
1253 1349
 	{NULL,0,0},
1254 1350
 	{NULL,0,0},
1255 1351
 	{NULL,0,0},
1256
-	{"curren", 164, 6},
1257
-	{"puncsp", 8200, 6},
1258 1352
 	{NULL,0,0},
1259
-	{"Vdash", 8873, 5},
1260
-	{"boxvR", 9566, 5},
1261 1353
 	{NULL,0,0},
1262 1354
 	{NULL,0,0},
1355
+	{"angmsd", 8737, 6},
1263 1356
 	{NULL,0,0},
1264 1357
 	{NULL,0,0},
1265 1358
 	{NULL,0,0},
1266 1359
 	{NULL,0,0},
1360
+	{"CHcy", 1063, 4},
1267 1361
 	{NULL,0,0},
1268 1362
 	{NULL,0,0},
1269 1363
 	{NULL,0,0},
1270 1364
 	{NULL,0,0},
1271 1365
 	{NULL,0,0},
1272 1366
 	{NULL,0,0},
1273
-	{"Rho", 929, 3},
1274
-	{"shchcy", 1097, 6},
1367
+	{NULL,0,0},
1368
+	{"GJcy", 1027, 4},
1369
+	{NULL,0,0},
1370
+	{NULL,0,0},
1371
+	{NULL,0,0},
1372
+	{"Oacgr", 908, 5},
1373
+	{"OHacgr", 911, 6},
1374
+	{NULL,0,0},
1375
+	{"grave", 96, 5},
1376
+	{NULL,0,0},
1377
+	{NULL,0,0},
1378
+	{NULL,0,0},
1379
+	{"Uacute", 218, 6},
1380
+	{NULL,0,0},
1381
+	{NULL,0,0},
1382
+	{NULL,0,0},
1383
+	{NULL,0,0},
1384
+	{NULL,0,0},
1385
+	{"zgr", 950, 3},
1386
+	{NULL,0,0},
1275 1387
 	{"ge", 8805, 2},
1276
-	{"Zeta", 918, 4},
1277 1388
 	{NULL,0,0},
1278 1389
 	{NULL,0,0},
1279
-	{"mdash", 8212, 5},
1280
-	{"ndash", 8211, 5},
1281
-	{"odash", 8861, 5},
1282
-	{"beta", 946, 4},
1283
-	{"le", 8804, 2},
1284
-	{"Sub", 8912, 3},
1285
-	{"lagran", 8466, 6},
1286
-	{"verbar", 124, 6},
1287
-	{"boxUL", 9565, 5},
1288
-	{"ne", 8800, 2},
1289
-	{"vdash", 8866, 5},
1290 1390
 	{NULL,0,0},
1391
+	{"barwed", 8965, 6},
1392
+	{"emsp", 8195, 4},
1393
+	{"ohacgr", 974, 6},
1291 1394
 	{NULL,0,0},
1292
-	{"psi", 968, 3},
1293 1395
 	{NULL,0,0},
1396
+	{"Lt", 8810, 2},
1294 1397
 	{NULL,0,0},
1295 1398
 	{NULL,0,0},
1296 1399
 	{NULL,0,0},
1400
+	{"iuml", 239, 4},
1297 1401
 	{NULL,0,0},
1298 1402
 	{NULL,0,0},
1403
+	{"compfn", 8728, 6},
1299 1404
 	{NULL,0,0},
1300
-	{"fllig", 64258, 5},
1301 1405
 	{NULL,0,0},
1302 1406
 	{NULL,0,0},
1303
-	{"image", 8465, 5},
1304
-	{"oS", 9416, 2},
1305
-	{"rho", 961, 3},
1306
-	{"hairsp", 8202, 6},
1307
-	{"fflig", 64256, 5},
1308
-	{"lowbar", 95, 6},
1309
-	{"male", 9794, 4},
1310 1407
 	{NULL,0,0},
1311
-	{"zeta", 950, 4},
1408
+	{"phiv", 966, 4},
1312 1409
 	{NULL,0,0},
1410
+	{"rtrif", 9656, 5},
1313 1411
 	{NULL,0,0},
1314
-	{"commat", 64, 6},
1315 1412
 	{NULL,0,0},
1316
-	{"cuepr", 8926, 5},
1317
-	{"sub", 8834, 3},
1318 1413
 	{NULL,0,0},
1319
-	{"lsqb", 91, 4},
1414
+	{"bowtie", 8904, 6},
1320 1415
 	{NULL,0,0},
1321 1416
 	{NULL,0,0},
1322 1417
 	{NULL,0,0},
1323 1418
 	{NULL,0,0},
1324 1419
 	{NULL,0,0},
1325
-	{"rsqb", 93, 4},
1326 1420
 	{NULL,0,0},
1327 1421
 	{NULL,0,0},
1328 1422
 	{NULL,0,0},
1423
+	{"tilde", 732, 5},
1424
+	{"Beta", 914, 4},
1425
+	{"Scaron", 352, 6},
1426
+	{"ordf", 170, 4},
1329 1427
 	{NULL,0,0},
1330 1428
 	{NULL,0,0},
1331
-	{"dArr", 8659, 4},
1332
-	{"boxVr", 9567, 5},
1333
-	{"sbquo", 8218, 5},
1334
-	{"dscy", 1109, 4},
1335
-	{"hArr", 8660, 4},
1336
-	{"brvbar", 166, 6},
1337
-	{"scsim", 8831, 5},
1338 1429
 	{NULL,0,0},
1339
-	{"lArr", 8656, 4},
1340 1430
 	{NULL,0,0},
1341 1431
 	{NULL,0,0},
1342 1432
 	{NULL,0,0},
1343 1433
 	{NULL,0,0},
1344 1434
 	{NULL,0,0},
1345
-	{"rArr", 8658, 4},
1346
-	{"lceil", 8968, 5},
1347
-	{"boxvh", 9532, 5},
1348
-	{"cuvee", 8910, 5},
1349
-	{"IOcy", 1025, 4},
1350
-	{"tscy", 1094, 4},
1351
-	{"Idigr", 938, 5},
1352
-	{"rceil", 8969, 5},
1353
-	{"bumpe", 8783, 5},
1354
-	{"planck", 8463, 6},
1355 1435
 	{NULL,0,0},
1356
-	{"squf", 9642, 4},
1357
-	{"yen", 165, 3},
1358
-	{"uArr", 8657, 4},
1359
-	{"YUcy", 1070, 4},
1360
-	{"oast", 8859, 4},
1361
-	{"equals", 61, 6},
1362
-	{"diam", 8900, 4},
1363
-	{"Udigr", 939, 5},
1364
-	{"boxDL", 9559, 5},
1436
+	{"eacute", 233, 6},
1437
+	{"scsim", 8831, 5},
1438
+	{"vprop", 8733, 5},
1365 1439
 	{NULL,0,0},
1366
-	{"frac13", 8531, 6},
1367 1440
 	{NULL,0,0},
1368 1441
 	{NULL,0,0},
1369 1442
 	{NULL,0,0},
1370 1443
 	{NULL,0,0},
1371 1444
 	{NULL,0,0},
1372
-	{"YIcy", 1031, 4},
1445
+	{"otimes", 8855, 6},
1373 1446
 	{NULL,0,0},
1447
+	{"Dcy", 1044, 3},
1448
+	{"nexist", 8708, 6},
1374 1449
 	{NULL,0,0},
1375 1450
 	{NULL,0,0},
1376
-	{"yacy", 1103, 4},
1377 1451
 	{NULL,0,0},
1378 1452
 	{NULL,0,0},
1379
-	{"bump", 8782, 4},
1380 1453
 	{NULL,0,0},
1454
+	{"commat", 64, 6},
1381 1455
 	{NULL,0,0},
1382 1456
 	{NULL,0,0},
1383
-	{"idigr", 970, 5},
1384
-	{"xutri", 9651, 5},
1385
-	{"ohm", 8486, 3},
1386 1457
 	{NULL,0,0},
1387
-	{"comp", 8705, 4},
1458
+	{"euml", 235, 4},
1388 1459
 	{NULL,0,0},
1389 1460
 	{NULL,0,0},
1390
-	{"infin", 8734, 5},
1391 1461
 	{NULL,0,0},
1392 1462
 	{NULL,0,0},
1393 1463
 	{NULL,0,0},
1394 1464
 	{NULL,0,0},
1395
-	{"udigr", 971, 5},
1396 1465
 	{NULL,0,0},
1397
-	{"asymp", 8776, 5},
1398 1466
 	{NULL,0,0},
1399 1467
 	{NULL,0,0},
1468
+	{"Ograve", 210, 6},
1400 1469
 	{NULL,0,0},
1401
-	{"lozf", 10731, 4},
1402 1470
 	{NULL,0,0},
1403 1471
 	{NULL,0,0},
1404 1472
 	{NULL,0,0},
1473
+	{"diams", 9830, 5},
1474
+	{"beth", 8502, 4},
1475
+	{"scap", 10936, 4},
1476
+	{"frac14", 188, 6},
1477
+	{"Iota", 921, 4},
1405 1478
 	{NULL,0,0},
1406 1479
 	{NULL,0,0},
1407 1480
 	{NULL,0,0},
1408 1481
 	{NULL,0,0},
1409
-	{"sext", 10038, 4},
1410
-	{"Ubrcy", 1038, 5},
1411 1482
 	{NULL,0,0},
1412 1483
 	{NULL,0,0},
1413
-	{"bottom", 8869, 6},
1484
+	{"check", 10003, 5},
1414 1485
 	{NULL,0,0},
1486
+	{"minusb", 8863, 6},
1415 1487
 	{NULL,0,0},
1416 1488
 	{NULL,0,0},
1417 1489
 	{NULL,0,0},
1490
+	{"Agrave", 192, 6},
1418 1491
 	{NULL,0,0},
1492
+	{"erDot", 8787, 5},
1419 1493
 	{NULL,0,0},
1420
-	{"Theta", 920, 5},
1421 1494
 	{NULL,0,0},
1422
-	{"gel", 8923, 3},
1495
+	{"lap", 10885, 3},
1423 1496
 	{NULL,0,0},
1424 1497
 	{NULL,0,0},
1425 1498
 	{NULL,0,0},
1426 1499
 	{NULL,0,0},
1427 1500
 	{NULL,0,0},
1428 1501
 	{NULL,0,0},
1502
+	{"TScy", 1062, 4},
1503
+	{"vprime", 8242, 6},
1429 1504
 	{NULL,0,0},
1505
+	{"SHCHcy", 1065, 6},
1430 1506
 	{NULL,0,0},
1431 1507
 	{NULL,0,0},
1432 1508
 	{NULL,0,0},
1433
-	{"lsaquo", 8249, 6},
1434 1509
 	{NULL,0,0},
1435 1510
 	{NULL,0,0},
1436 1511
 	{NULL,0,0},
1437 1512
 	{NULL,0,0},
1438 1513
 	{NULL,0,0},
1439
-	{"rsaquo", 8250, 6},
1440 1514
 	{NULL,0,0},
1515
+	{"epsis", 1013, 5},
1441 1516
 	{NULL,0,0},
1442
-	{"ubrcy", 1118, 5},
1517
+	{"lang", 9001, 4},
1518
+	{"boxvH", 9578, 5},
1519
+	{"infin", 8734, 5},
1520
+	{"oplus", 8853, 5},
1521
+	{NULL,0,0},
1522
+	{"ngr", 957, 3},
1523
+	{"pound", 163, 5},
1443 1524
 	{NULL,0,0},
1444 1525
 	{NULL,0,0},
1445 1526
 	{NULL,0,0},
1527
+	{"frac78", 8542, 6},
1528
+	{"oacgr", 972, 5},
1446 1529
 	{NULL,0,0},
1447 1530
 	{NULL,0,0},
1448
-	{"intcal", 8890, 6},
1449 1531
 	{"quest", 63, 5},
1450 1532
 	{NULL,0,0},
1451 1533
 	{NULL,0,0},
1452
-	{"theta", 952, 5},
1534
+	{"phis", 981, 4},
1453 1535
 	{NULL,0,0},
1454 1536
 	{NULL,0,0},
1537
+	{"ncy", 1085, 3},
1455 1538
 	{NULL,0,0},
1456 1539
 	{NULL,0,0},
1457 1540
 	{NULL,0,0},
1541
+	{"ensp", 8194, 4},
1542
+	{"gEl", 10892, 3},
1458 1543
 	{NULL,0,0},
1459 1544
 	{NULL,0,0},
1460 1545
 	{NULL,0,0},
1461 1546
 	{NULL,0,0},
1462 1547
 	{NULL,0,0},
1463 1548
 	{NULL,0,0},
1464
-	{"boxVL", 9571, 5},
1549
+	{"cong", 8773, 4},
1465 1550
 	{NULL,0,0},
1466 1551
 	{NULL,0,0},
1552
+	{"Vdash", 8873, 5},
1553
+	{"vltri", 8882, 5},
1467 1554
 	{NULL,0,0},
1468 1555
 	{NULL,0,0},
1469 1556
 	{NULL,0,0},
1557
+	{"iota", 953, 4},
1558
+	{"EEacgr", 905, 6},
1559
+	{"iquest", 191, 6},
1560
+	{"Sup", 8913, 3},
1470 1561
 	{NULL,0,0},
1471 1562
 	{NULL,0,0},
1472 1563
 	{NULL,0,0},
1473
-	{"forall", 8704, 6},
1564
+	{"hamilt", 8459, 6},
1474 1565
 	{NULL,0,0},
1475 1566
 	{NULL,0,0},
1476 1567
 	{NULL,0,0},
1477 1568
 	{NULL,0,0},
1478 1569
 	{NULL,0,0},
1479 1570
 	{NULL,0,0},
1480
-	{"half", 189, 4},
1571
+	{"oS", 9416, 2},
1481 1572
 	{NULL,0,0},
1482 1573
 	{NULL,0,0},
1483 1574
 	{NULL,0,0},
1484
-	{"bull", 8226, 4},
1485
-	{"psgr", 968, 4},
1575
+	{"ocy", 1086, 3},
1486 1576
 	{NULL,0,0},
1487 1577
 	{NULL,0,0},
1578
+	{"Delta", 916, 5},
1488 1579
 	{NULL,0,0},
1489 1580
 	{NULL,0,0},
1490 1581
 	{NULL,0,0},
1491 1582
 	{NULL,0,0},
1583
+	{"Dgr", 916, 3},
1492 1584
 	{NULL,0,0},
1493
-	{"Dagger", 8225, 6},
1494
-	{"Aring", 197, 5},
1495 1585
 	{NULL,0,0},
1586
+	{"not", 172, 3},
1587
+	{"ndash", 8211, 5},
1588
+	{"sub", 8834, 3},
1589
+	{"softcy", 1100, 6},
1590
+	{"mldr", 8230, 4},
1496 1591
 	{NULL,0,0},
1497
-	{"Ll", 8920, 2},
1498
-	{"models", 8871, 6},
1499 1592
 	{NULL,0,0},
1500 1593
 	{NULL,0,0},
1501 1594
 	{NULL,0,0},
1595
+	{"copysr", 8471, 6},
1502 1596
 	{NULL,0,0},
1503
-	{"zwj", 8205, 3},
1504
-	{"prod", 8719, 4},
1505 1597
 	{NULL,0,0},
1506 1598
 	{NULL,0,0},
1507
-	{"Chi", 935, 3},
1508
-	{"rect", 9645, 4},
1509
-	{"sect", 167, 4},
1510
-	{"lsquor", 8218, 6},
1599
+	{"iacgr", 943, 5},
1600
+	{"rcy", 1088, 3},
1511 1601
 	{NULL,0,0},
1512
-	{"thetas", 952, 6},
1513
-	{"cuwed", 8911, 5},
1602
+	{"vdash", 8866, 5},
1514 1603
 	{NULL,0,0},
1604
+	{"sc", 8827, 2},
1515 1605
 	{NULL,0,0},
1516
-	{"rsquor", 8217, 6},
1517 1606
 	{NULL,0,0},
1518 1607
 	{NULL,0,0},
1519 1608
 	{NULL,0,0},
1520
-	{"Phi", 934, 3},
1521
-	{"rx", 8478, 2},
1522 1609
 	{NULL,0,0},
1610
+	{"Egr", 917, 3},
1611
+	{NULL,0,0},
1612
+	{NULL,0,0},
1613
+	{NULL,0,0},
1614
+	{"alefsym", 8501, 7},
1615
+	{NULL,0,0},
1616
+	{"ntilde", 241, 6},
1617
+	{"cent", 162, 4},
1618
+	{NULL,0,0},
1619
+	{"sdotb", 8865, 5},
1620
+	{NULL,0,0},
1621
+	{NULL,0,0},
1622
+	{"ap", 8776, 2},
1623
+	{"lsim", 8818, 4},
1624
+	{NULL,0,0},
1625
+	{NULL,0,0},
1626
+	{NULL,0,0},
1627
+	{"daleth", 8504, 6},
1628
+	{"veebar", 8891, 6},
1629
+	{NULL,0,0},
1630
+	{"rect", 9645, 4},
1523 1631
 	{NULL,0,0},
1524
-	{"gl", 8823, 2},
1525
-	{"or", 8744, 2},
1526
-	{"pr", 8826, 2},
1527 1632
 	{"aring", 229, 5},
1528
-	{"dagger", 8224, 6},
1633
+	{"Ucy", 1059, 3},
1529 1634
 	{NULL,0,0},
1530 1635
 	{NULL,0,0},
1531
-	{"diams", 9830, 5},
1636
+	{"minus", 8722, 5},
1637
+	{"hellip", 8230, 6},
1532 1638
 	{NULL,0,0},
1533 1639
 	{NULL,0,0},
1534 1640
 	{NULL,0,0},
... ...
@@ -1536,15 +1990,66 @@ static struct element entities_htable_elements[] = {
1536 1536
 	{NULL,0,0},
1537 1537
 	{NULL,0,0},
1538 1538
 	{NULL,0,0},
1539
-	{"chi", 967, 3},
1540 1539
 	{NULL,0,0},
1541 1540
 	{NULL,0,0},
1542
-	{"ordf", 170, 4},
1541
+	{"lEg", 10891, 3},
1542
+	{"iexcl", 161, 5},
1543
+	{NULL,0,0},
1544
+	{NULL,0,0},
1545
+	{"numsp", 8199, 5},
1546
+	{"oslash", 248, 6},
1547
+	{NULL,0,0},
1548
+	{NULL,0,0},
1549
+	{NULL,0,0},
1550
+	{NULL,0,0},
1551
+	{"real", 8476, 4},
1552
+	{"Kgr", 922, 3},
1553
+	{NULL,0,0},
1554
+	{"weierp", 8472, 6},
1555
+	{NULL,0,0},
1556
+	{NULL,0,0},
1557
+	{NULL,0,0},
1558
+	{NULL,0,0},
1559
+	{NULL,0,0},
1560
+	{NULL,0,0},
1561
+	{NULL,0,0},
1562
+	{"vrtri", 8883, 5},
1563
+	{"bdquo", 8222, 5},
1564
+	{"Psi", 936, 3},
1565
+	{NULL,0,0},
1566
+	{NULL,0,0},
1567
+	{NULL,0,0},
1568
+	{NULL,0,0},
1569
+	{NULL,0,0},
1570
+	{"exist", 8707, 5},
1571
+	{"ccedil", 231, 6},
1572
+	{"icy", 1080, 3},
1573
+	{"kappa", 954, 5},
1574
+	{"cup", 8746, 3},
1575
+	{"ltri", 9667, 4},
1576
+	{NULL,0,0},
1577
+	{"IEcy", 1045, 4},
1578
+	{"Phi", 934, 3},
1543 1579
 	{NULL,0,0},
1544 1580
 	{NULL,0,0},
1545 1581
 	{NULL,0,0},
1546 1582
 	{NULL,0,0},
1583
+	{"boxHD", 9574, 5},
1584
+	{"khgr", 967, 4},
1585
+	{NULL,0,0},
1586
+	{NULL,0,0},
1587
+	{NULL,0,0},
1588
+	{NULL,0,0},
1589
+	{"sigma", 963, 5},
1590
+	{NULL,0,0},
1591
+	{NULL,0,0},
1592
+	{"Gamma", 915, 5},
1593
+	{"theta", 952, 5},
1594
+	{NULL,0,0},
1595
+	{"plusb", 8862, 5},
1596
+	{NULL,0,0},
1597
+	{NULL,0,0},
1547 1598
 };
1548 1599
 const struct hashtable entities_htable = {
1549
-	entities_htable_elements, 1543, 743, 1234
1600
+	entities_htable_elements, 2048, 743, 1638
1550 1601
 };
... ...
@@ -29,31 +29,21 @@
29 29
 #include "others.h"
30 30
 #include "hashtab.h"
31 31
 
32
-
33
-static const size_t prime_list[] =
34
-{
35
-     53ul,         97ul,         193ul,       389ul,       769ul,
36
-     1543ul,       3079ul,       6151ul,      12289ul,     24593ul,
37
-     49157ul,      98317ul,      196613ul,    393241ul,    786433ul,
38
-     1572869ul,    3145739ul,    6291469ul,   12582917ul,  25165843ul,
39
-     50331653ul,   100663319ul,  201326611ul, 402653189ul, 805306457ul,
40
-     1610612741ul, 3221225473ul
41
-};
42
-
43
-
44
-static const size_t prime_n = sizeof(prime_list)/sizeof(prime_list[0]);
32
+#define MODULE_NAME "hashtab: "
45 33
 
46 34
 static const char DELETED_KEY[] = "";
47 35
 
48
-static size_t get_nearest_capacity(const size_t capacity)
36
+static unsigned long nearest_power(unsigned long num)
49 37
 {
50
-	size_t i;
51
-	for(i=0 ;i < prime_n; i++) {
52
-		if (prime_list[i] > capacity)
53
-			return prime_list[i];
38
+	unsigned long n = 64;
39
+
40
+	while (n < num) {
41
+		n <<= 1;
42
+		if (n == 0) {
43
+			return num;
44
+		}
54 45
 	}
55
-	cli_errmsg("Requested hashtable size is too big!");
56
-	return prime_list[prime_n-1];
46
+	return n;
57 47
 }
58 48
 
59 49
 #ifdef PROFILE_HASHTABLE
... ...
@@ -184,7 +174,7 @@ int hashtab_init(struct hashtable *s,size_t capacity)
184 184
 
185 185
 	PROFILE_INIT(s);
186 186
 
187
-	capacity = get_nearest_capacity(capacity);
187
+	capacity = nearest_power(capacity);
188 188
 	s->htable = cli_calloc(capacity,sizeof(*s->htable));
189 189
 	if(!s->htable)
190 190
 		return CL_EMEM;
... ...
@@ -194,13 +184,31 @@ int hashtab_init(struct hashtable *s,size_t capacity)
194 194
 	return 0;
195 195
 }
196 196
 
197
-static size_t hash(const unsigned char* k,const size_t len,const size_t SIZE)
197
+static inline uint32_t hash32shift(uint32_t key)
198
+{
199
+ /* Thomas Wang's 32-bit integer hash function.
200
+  * http://www.cris.com/~Ttwang/tech/inthash.htm */
201
+  key = ~key + (key << 15);
202
+  key = key ^ (key >> 12);
203
+  key = key + (key << 2);
204
+  key = key ^ (key >> 4);
205
+  key = (key + (key << 3)) + (key << 11);
206
+  key = key ^ (key >> 16);
207
+  return key;
208
+}
209
+
210
+static inline size_t hash(const unsigned char* k,const size_t len,const size_t SIZE)
198 211
 {
199
-	size_t Hash = 0;	
212
+	size_t Hash = 1;
200 213
 	size_t i;
201
-	for(i=len;i>0;i--)
202
-		Hash = ((Hash << 8) + k[i-1]) % SIZE;
203
-	return Hash;
214
+	for(i=0;i<len;i++) {
215
+		/* a simple add is good, because we use the mixing function below */
216
+		Hash +=  k[i];
217
+		/* mixing function */
218
+		Hash = hash32shift(Hash);
219
+	}
220
+	/* SIZE is power of 2 */
221
+	return Hash & (SIZE - 1);
204 222
 }
205 223
 
206 224
 /* if returned element has key==NULL, then key was not found in table */
... ...
@@ -236,7 +244,7 @@ struct element* hashtab_find(const struct hashtable *s,const char* key,const siz
236 236
 
237 237
 static int hashtab_grow(struct hashtable *s)
238 238
 {
239
-	const size_t new_capacity = get_nearest_capacity(s->capacity);
239
+	const size_t new_capacity = nearest_power(s->capacity);
240 240
 	struct element* htable = cli_calloc(new_capacity, sizeof(*s->htable));
241 241
 	size_t i,idx, used = 0;
242 242
 	if(new_capacity == s->capacity || !htable)
... ...
@@ -411,3 +419,142 @@ int hashtab_load(FILE* in, struct hashtable *s)
411 411
 	return CL_SUCCESS;
412 412
 }
413 413
 
414
+/* Initialize hashset. @initial_capacity is rounded to nearest power of 2.
415
+ * Load factor is between 50 and 99. When capacity*load_factor/100 is reached, the hashset is growed */
416
+int hashset_init(struct hashset* hs, size_t initial_capacity, uint8_t load_factor)
417
+{
418
+	if(load_factor < 50 || load_factor > 99) {
419
+		cli_dbgmsg(MODULE_NAME "Invalid load factor: %u, using default of 80%%\n", load_factor);
420
+		load_factor = 80;
421
+	}
422
+	initial_capacity = nearest_power(initial_capacity);
423
+	hs->load_factor = load_factor;
424
+	hs->limit = initial_capacity * load_factor / 100;
425
+	hs->capacity = initial_capacity;
426
+	hs->mask = initial_capacity - 1;
427
+	hs->count=0;
428
+	hs->keys = cli_malloc(initial_capacity * sizeof(*hs->keys));
429
+	if(!hs->keys) {
430
+		return CL_EMEM;
431
+	}
432
+	hs->bitmap = cli_calloc(initial_capacity / 8, sizeof(*hs->bitmap));
433
+	if(!hs->bitmap) {
434
+		free(hs->keys);
435
+		return CL_EMEM;
436
+	}
437
+	return 0;
438
+}
439
+
440
+void hashset_destroy(struct hashset* hs)
441
+{
442
+	cli_dbgmsg(MODULE_NAME "Freeing hashset, elements: %lu, capacity: %lu\n", hs->count, hs->capacity);
443
+	free(hs->keys);
444
+	free(hs->bitmap);
445
+	hs->keys = hs->bitmap = NULL;
446
+	hs->capacity = 0;
447
+}
448
+
449
+#define BITMAP_CONTAINS(bmap, val) ((bmap)[(val) >> 5] & (1 << ((val) & 0x1f)))
450
+#define BITMAP_INSERT(bmap, val) ((bmap)[(val) >> 5] |= (1 << ((val) & 0x1f)))
451
+
452
+/*
453
+ * searches the hashset for the @key.
454
+ * Returns the position the key is at, or a candidate position where it could be inserted.
455
+ */
456
+static inline size_t hashset_search(const struct hashset* hs, const uint32_t key)
457
+{
458
+	/* calculate hash value for this key, and map it to our table */
459
+	size_t idx = hash32shift(key) & (hs->mask);
460
+	size_t tries = 1;
461
+
462
+	/* check wether the entry is used, and if the key matches */
463
+	while(BITMAP_CONTAINS(hs->bitmap, idx) && (hs->keys[idx] != key)) {
464
+		/* entry used, key different -> collision */
465
+		idx = (idx + tries++)&(hs->mask);
466
+		/* quadratic probing, with c1 = c2 = 1/2, guaranteed to walk the entire table
467
+		 * for table sizes power of 2.*/
468
+	}
469
+	/* we have either found the key, or a candidate insertion position */
470
+	return idx;
471
+}
472
+
473
+
474
+static void hashset_addkey_internal(struct hashset* hs, const uint32_t key)
475
+{
476
+	const size_t idx = hashset_search(hs, key);
477
+	/* we know hashtable is not full, when this method is called */
478
+
479
+	if(!BITMAP_CONTAINS(hs->bitmap, idx)) {
480
+		/* add new key */
481
+		BITMAP_INSERT(hs->bitmap, idx);
482
+		hs->keys[idx] = key;
483
+		hs->count++;
484
+	}
485
+}
486
+
487
+static int hashset_grow(struct hashset *hs)
488
+{
489
+	struct hashset new_hs;
490
+	size_t i;
491
+	int rc;
492
+
493
+	/* in-place growing is not possible, since the new keys
494
+	 * will hash to different locations. */
495
+	cli_dbgmsg(MODULE_NAME "Growing hashset, used: %lu, capacity: %lu\n", hs->count, hs->capacity);
496
+	/* create a bigger hashset */
497
+	if((rc = hashset_init(&new_hs, hs->capacity << 1, hs->load_factor)) < 0) {
498
+		return rc;
499
+	}
500
+	/* and copy keys */
501
+	for(i=0;i < hs->capacity;i++) {
502
+		if(BITMAP_CONTAINS(hs->bitmap, i)) {
503
+			const size_t key = hs->keys[i];
504
+			hashset_addkey_internal(&new_hs, key);
505
+		}
506
+	}
507
+	hashset_destroy(hs);
508
+	/* replace old hashset with new one */
509
+	*hs = new_hs;
510
+	return 0;
511
+}
512
+
513
+int hashset_addkey(struct hashset* hs, const uint32_t key)
514
+{
515
+	/* check that we didn't reach the load factor.
516
+	 * Even if we don't know yet whether we'd add this key */
517
+	if(hs->count + 1 > hs->limit) {
518
+		int rc = hashset_grow(hs);
519
+		if(rc) {
520
+			return rc;
521
+		}
522
+	}
523
+	hashset_addkey_internal(hs, key);
524
+	return 0;
525
+}
526
+
527
+int hashset_contains(const struct hashset* hs, const uint32_t key)
528
+{
529
+	const size_t idx =  hashset_search(hs, key);
530
+	return BITMAP_CONTAINS(hs->bitmap, idx);
531
+}
532
+
533
+ssize_t hashset_toarray(const struct hashset* hs, uint32_t** array)
534
+{
535
+	size_t i, j;
536
+	uint32_t* arr;
537
+
538
+	if(!array) {
539
+		return CL_ENULLARG;
540
+	}
541
+	*array = arr = cli_malloc(hs->count * sizeof(*arr));
542
+	if(!arr) {
543
+		return CL_EMEM;
544
+	}
545
+
546
+	for(i=0,j=0 ; i < hs->capacity && j < hs->count;i++) {
547
+		if(BITMAP_CONTAINS(hs->bitmap, i)) {
548
+			arr[j++] = hs->keys[i];
549
+		}
550
+	}
551
+	return j;
552
+}
... ...
@@ -85,5 +85,24 @@ void hashtab_clear(struct hashtable *s);
85 85
 int hashtab_load(FILE* in, struct hashtable *s);
86 86
 int hashtab_store(const struct hashtable *s,FILE* out);
87 87
 
88
+/* A set of unique keys. */
89
+struct hashset {
90
+	uint32_t* keys;
91
+	uint32_t* bitmap;
92
+	size_t capacity;
93
+	size_t mask;
94
+	size_t count;
95
+	size_t limit;
96
+	uint8_t load_factor;
97
+};
98
+
99
+int hashset_init(struct hashset* hs, size_t initial_capacity, uint8_t load_factor);
100
+int hashset_addkey(struct hashset* hs, const uint32_t key);
101
+int hashset_removekey(struct hashset* hs, const uint32_t key);
102
+int hashset_contains(const struct hashset* hs, const uint32_t key);
103
+int hashset_clear(struct hashset* hs);
104
+void hashset_destroy(struct hashset* hs);
105
+ssize_t hashset_toarray(const struct hashset* hs, uint32_t** array);
106
+
88 107
 #endif
89 108
 
... ...
@@ -33,6 +33,7 @@
33 33
 
34 34
 #include "matcher-ac.h"
35 35
 #include "matcher-bm.h"
36
+#include "hashtab.h"
36 37
 
37 38
 #define CLI_MATCH_WILDCARD	0xff00
38 39
 #define CLI_MATCH_CHAR		0x0000
... ...
@@ -45,6 +46,7 @@ struct cli_matcher {
45 45
     /* Extended Boyer-Moore */
46 46
     uint8_t *bm_shift;
47 47
     struct cli_bm_patt **bm_suffix;
48
+    struct hashset md5_sizes_hs;
48 49
     uint32_t *soff, soff_len; /* for PE section sigs */
49 50
     uint32_t bm_patterns;
50 51
 
... ...
@@ -64,6 +64,7 @@
64 64
 #include "phish_whitelist.h"
65 65
 #include "phish_domaincheck_db.h"
66 66
 #include "regex_list.h"
67
+#include "hashtab.h"
67 68
 
68 69
 #if defined(HAVE_READDIR_R_3) || defined(HAVE_READDIR_R_2)
69 70
 #include <limits.h>
... ...
@@ -760,12 +761,11 @@ static int cli_loadmd5(FILE *fs, struct cl_engine **engine, unsigned int *signo,
760 760
 {
761 761
 	char buffer[FILEBUFF], *pt;
762 762
 	int ret = CL_SUCCESS;
763
-	unsigned int size_field = 1, md5_field = 0, found, line = 0, i;
763
+	unsigned int size_field = 1, md5_field = 0, line = 0;
764 764
 	uint32_t size;
765 765
 	struct cli_bm_patt *new;
766 766
 	struct cli_matcher *db = NULL;
767 767
 
768
-
769 768
     if((ret = cli_initengine(engine, options))) {
770 769
 	cl_free(*engine);
771 770
 	return ret;
... ...
@@ -837,23 +837,10 @@ static int cli_loadmd5(FILE *fs, struct cl_engine **engine, unsigned int *signo,
837 837
 	}
838 838
 
839 839
 	if(mode == MD5_MDB) { /* section MD5 */
840
-	    found = 0;
841
-	    for(i = 0; i < db->soff_len; i++) {
842
-		if(db->soff[i] == size) {
843
-		    found = 1;
844
-		    break;
845
-		}
846
-	    }
847
-	    if(!found) {
848
-		db->soff_len++;
849
-		db->soff = (uint32_t *) cli_realloc2(db->soff, db->soff_len * sizeof(uint32_t));
850
-		if(!db->soff) {
851
-		    cli_errmsg("cli_loadmd5: Can't realloc db->soff\n");
852
-		    ret = CL_EMEM;
853
-		    break;
854
-		}
855
-		db->soff[db->soff_len - 1] = size;
840
+	    if(!db->md5_sizes_hs.capacity) {
841
+		    hashset_init(&db->md5_sizes_hs, 32768, 80);
856 842
 	    }
843
+	    hashset_addkey(&db->md5_sizes_hs, size);
857 844
 	}
858 845
     }
859 846
 
... ...
@@ -872,9 +859,6 @@ static int cli_loadmd5(FILE *fs, struct cl_engine **engine, unsigned int *signo,
872 872
     if(signo)
873 873
 	*signo += line;
874 874
 
875
-    if(db && mode == MD5_MDB)
876
-	qsort(db->soff, db->soff_len, sizeof(uint32_t), scomp);
877
-
878 875
     return CL_SUCCESS;
879 876
 }
880 877
 
... ...
@@ -1529,6 +1513,9 @@ void cl_free(struct cl_engine *engine)
1529 1529
     if((root = engine->md5_mdb)) {
1530 1530
 	cli_bm_free(root);
1531 1531
 	free(root->soff);
1532
+	if(root->md5_sizes_hs.capacity) {
1533
+		hashset_destroy(&root->md5_sizes_hs);
1534
+	}
1532 1535
 	free(root);
1533 1536
     }
1534 1537
 
... ...
@@ -1567,6 +1554,18 @@ void cl_free(struct cl_engine *engine)
1567 1567
     free(engine);
1568 1568
 }
1569 1569
 
1570
+static void cli_md5db_build(struct cli_matcher* root)
1571
+{
1572
+	if(root && root->md5_sizes_hs.capacity) {
1573
+		/* TODO: use hashset directly, instead of the array when matching*/
1574
+		cli_dbgmsg("Converting hashset to array: %lu entries\n", root->md5_sizes_hs.count);
1575
+		root->soff_len = hashset_toarray(&root->md5_sizes_hs, &root->soff);
1576
+		hashset_destroy(&root->md5_sizes_hs);
1577
+		qsort(root->soff, root->soff_len, sizeof(uint32_t), scomp);
1578
+	}
1579
+}
1580
+
1581
+
1570 1582
 int cl_build(struct cl_engine *engine)
1571 1583
 {
1572 1584
 	unsigned int i;
... ...
@@ -1589,6 +1588,8 @@ int cl_build(struct cl_engine *engine)
1589 1589
 	}
1590 1590
     }
1591 1591
 
1592
+    cli_md5db_build(engine->md5_mdb);
1593
+
1592 1594
     cli_dconf_print(engine->dconf);
1593 1595
 
1594 1596
     return CL_SUCCESS;