1fn check(x: u16, singletonuppers: &[(u8, u8)], singletonlowers: &[u8], normal: &[u8]) -> bool {
5 let xupper = (x >> 8) as u8;
6 let mut lowerstart = 0;
7 for &(upper, lowercount) in singletonuppers {
8 let lowerend = lowerstart + lowercount as usize;
9 if xupper == upper {
10 for &lower in &singletonlowers[lowerstart..lowerend] {
11 if lower == x as u8 {
12 return false;
13 }
14 }
15 } else if xupper < upper {
16 break;
17 }
18 lowerstart = lowerend;
19 }
20
21 let mut x = x as i32;
22 let mut normal = normal.iter().cloned();
23 let mut current = true;
24 while let Some(v) = normal.next() {
25 let len = if v & 0x80 != 0 {
26 ((v & 0x7f) as i32) << 8 | normal.next().unwrap() as i32
27 } else {
28 v as i32
29 };
30 x -= len;
31 if x < 0 {
32 break;
33 }
34 current = !current;
35 }
36 current
37}
38
39pub(crate) fn is_printable(x: char) -> bool {
40 let x = x as u32;
41 let lower = x as u16;
42
43 if x < 32 {
44 false
46 } else if x < 127 {
47 true
49 } else if x < 0x10000 {
50 check(lower, SINGLETONS0U, SINGLETONS0L, NORMAL0)
51 } else if x < 0x20000 {
52 check(lower, SINGLETONS1U, SINGLETONS1L, NORMAL1)
53 } else {
54 if 0x2a6e0 <= x && x < 0x2a700 {
55 return false;
56 }
57 if 0x2b81e <= x && x < 0x2b820 {
58 return false;
59 }
60 if 0x2ceae <= x && x < 0x2ceb0 {
61 return false;
62 }
63 if 0x2ebe1 <= x && x < 0x2ebf0 {
64 return false;
65 }
66 if 0x2ee5e <= x && x < 0x2f800 {
67 return false;
68 }
69 if 0x2fa1e <= x && x < 0x30000 {
70 return false;
71 }
72 if 0x3134b <= x && x < 0x31350 {
73 return false;
74 }
75 if 0x3347a <= x && x < 0xe0100 {
76 return false;
77 }
78 if 0xe01f0 <= x && x < 0x110000 {
79 return false;
80 }
81 true
82 }
83}
84
85#[rustfmt::skip]
86const SINGLETONS0U: &[(u8, u8)] = &[
87 (0x00, 1),
88 (0x03, 5),
89 (0x05, 6),
90 (0x06, 2),
91 (0x07, 6),
92 (0x08, 7),
93 (0x09, 17),
94 (0x0a, 28),
95 (0x0b, 25),
96 (0x0c, 25),
97 (0x0d, 16),
98 (0x0e, 12),
99 (0x0f, 4),
100 (0x10, 3),
101 (0x12, 18),
102 (0x13, 9),
103 (0x16, 1),
104 (0x17, 4),
105 (0x18, 1),
106 (0x19, 3),
107 (0x1a, 9),
108 (0x1b, 1),
109 (0x1c, 2),
110 (0x1f, 22),
111 (0x20, 3),
112 (0x2b, 2),
113 (0x2d, 11),
114 (0x2e, 1),
115 (0x30, 4),
116 (0x31, 2),
117 (0x32, 1),
118 (0xa9, 2),
119 (0xaa, 4),
120 (0xab, 8),
121 (0xfa, 2),
122 (0xfb, 5),
123 (0xfe, 3),
124 (0xff, 9),
125];
126#[rustfmt::skip]
127const SINGLETONS0L: &[u8] = &[
128 0xad, 0x78, 0x79, 0x8b, 0x8d, 0xa2, 0x30, 0x57,
129 0x58, 0x8b, 0x8c, 0x90, 0x1c, 0xdd, 0x0e, 0x0f,
130 0x4b, 0x4c, 0xfb, 0xfc, 0x2e, 0x2f, 0x3f, 0x5c,
131 0x5d, 0x5f, 0xe2, 0x84, 0x8d, 0x8e, 0x91, 0x92,
132 0xa9, 0xb1, 0xba, 0xbb, 0xc5, 0xc6, 0xc9, 0xca,
133 0xde, 0xe4, 0xe5, 0xff, 0x00, 0x04, 0x11, 0x12,
134 0x29, 0x31, 0x34, 0x37, 0x3a, 0x3b, 0x3d, 0x49,
135 0x4a, 0x5d, 0x84, 0x8e, 0x92, 0xa9, 0xb1, 0xb4,
136 0xba, 0xbb, 0xc6, 0xca, 0xce, 0xcf, 0xe4, 0xe5,
137 0x00, 0x04, 0x0d, 0x0e, 0x11, 0x12, 0x29, 0x31,
138 0x34, 0x3a, 0x3b, 0x45, 0x46, 0x49, 0x4a, 0x5e,
139 0x64, 0x65, 0x84, 0x91, 0x9b, 0x9d, 0xc9, 0xce,
140 0xcf, 0x0d, 0x11, 0x29, 0x3a, 0x3b, 0x45, 0x49,
141 0x57, 0x5b, 0x5e, 0x5f, 0x64, 0x65, 0x8d, 0x91,
142 0xa9, 0xb4, 0xba, 0xbb, 0xc5, 0xc9, 0xdf, 0xe4,
143 0xe5, 0xf0, 0x0d, 0x11, 0x45, 0x49, 0x64, 0x65,
144 0x80, 0x84, 0xb2, 0xbc, 0xbe, 0xbf, 0xd5, 0xd7,
145 0xf0, 0xf1, 0x83, 0x85, 0x8b, 0xa4, 0xa6, 0xbe,
146 0xbf, 0xc5, 0xc7, 0xcf, 0xda, 0xdb, 0x48, 0x98,
147 0xbd, 0xcd, 0xc6, 0xce, 0xcf, 0x49, 0x4e, 0x4f,
148 0x57, 0x59, 0x5e, 0x5f, 0x89, 0x8e, 0x8f, 0xb1,
149 0xb6, 0xb7, 0xbf, 0xc1, 0xc6, 0xc7, 0xd7, 0x11,
150 0x16, 0x17, 0x5b, 0x5c, 0xf6, 0xf7, 0xfe, 0xff,
151 0x80, 0x6d, 0x71, 0xde, 0xdf, 0x0e, 0x1f, 0x6e,
152 0x6f, 0x1c, 0x1d, 0x5f, 0x7d, 0x7e, 0xae, 0xaf,
153 0xde, 0xdf, 0x4d, 0xbb, 0xbc, 0x16, 0x17, 0x1e,
154 0x1f, 0x46, 0x47, 0x4e, 0x4f, 0x58, 0x5a, 0x5c,
155 0x5e, 0x7e, 0x7f, 0xb5, 0xc5, 0xd4, 0xd5, 0xdc,
156 0xf0, 0xf1, 0xf5, 0x72, 0x73, 0x8f, 0x74, 0x75,
157 0x26, 0x2e, 0x2f, 0xa7, 0xaf, 0xb7, 0xbf, 0xc7,
158 0xcf, 0xd7, 0xdf, 0x9a, 0x00, 0x40, 0x97, 0x98,
159 0x30, 0x8f, 0x1f, 0xce, 0xff, 0x4e, 0x4f, 0x5a,
160 0x5b, 0x07, 0x08, 0x0f, 0x10, 0x27, 0x2f, 0xee,
161 0xef, 0x6e, 0x6f, 0x37, 0x3d, 0x3f, 0x42, 0x45,
162 0x53, 0x67, 0x75, 0xc8, 0xc9, 0xd0, 0xd1, 0xd8,
163 0xd9, 0xe7, 0xfe, 0xff,
164];
165#[rustfmt::skip]
166const SINGLETONS1U: &[(u8, u8)] = &[
167 (0x00, 6),
168 (0x01, 1),
169 (0x03, 1),
170 (0x04, 2),
171 (0x05, 7),
172 (0x07, 2),
173 (0x08, 8),
174 (0x09, 2),
175 (0x0a, 5),
176 (0x0b, 2),
177 (0x0e, 4),
178 (0x10, 1),
179 (0x11, 2),
180 (0x12, 5),
181 (0x13, 28),
182 (0x14, 1),
183 (0x15, 2),
184 (0x17, 2),
185 (0x19, 13),
186 (0x1c, 5),
187 (0x1d, 8),
188 (0x1f, 1),
189 (0x24, 1),
190 (0x6a, 4),
191 (0x6b, 2),
192 (0x6e, 2),
193 (0xaf, 3),
194 (0xb1, 2),
195 (0xbc, 2),
196 (0xcf, 2),
197 (0xd1, 2),
198 (0xd4, 12),
199 (0xd5, 9),
200 (0xd6, 2),
201 (0xd7, 2),
202 (0xda, 1),
203 (0xe0, 5),
204 (0xe1, 2),
205 (0xe6, 1),
206 (0xe7, 4),
207 (0xe8, 2),
208 (0xee, 32),
209 (0xf0, 4),
210 (0xf8, 2),
211 (0xfa, 5),
212 (0xfb, 1),
213];
214#[rustfmt::skip]
215const SINGLETONS1L: &[u8] = &[
216 0x0c, 0x27, 0x3b, 0x3e, 0x4e, 0x4f, 0x8f, 0x9e,
217 0x9e, 0x9f, 0x7b, 0x8b, 0x93, 0x96, 0xa2, 0xb2,
218 0xba, 0x86, 0xb1, 0x06, 0x07, 0x09, 0x36, 0x3d,
219 0x3e, 0x56, 0xf3, 0xd0, 0xd1, 0x04, 0x14, 0x18,
220 0x36, 0x37, 0x56, 0x57, 0x7f, 0xaa, 0xae, 0xaf,
221 0xbd, 0x35, 0xe0, 0x12, 0x87, 0x89, 0x8e, 0x9e,
222 0x04, 0x0d, 0x0e, 0x11, 0x12, 0x29, 0x31, 0x34,
223 0x3a, 0x45, 0x46, 0x49, 0x4a, 0x4e, 0x4f, 0x64,
224 0x65, 0x8a, 0x8c, 0x8d, 0x8f, 0xb6, 0xc1, 0xc3,
225 0xc4, 0xc6, 0xcb, 0xd6, 0x5c, 0xb6, 0xb7, 0x1b,
226 0x1c, 0x07, 0x08, 0x0a, 0x0b, 0x14, 0x17, 0x36,
227 0x39, 0x3a, 0xa8, 0xa9, 0xd8, 0xd9, 0x09, 0x37,
228 0x90, 0x91, 0xa8, 0x07, 0x0a, 0x3b, 0x3e, 0x66,
229 0x69, 0x8f, 0x92, 0x11, 0x6f, 0x5f, 0xbf, 0xee,
230 0xef, 0x5a, 0x62, 0xb9, 0xba, 0xf4, 0xfc, 0xff,
231 0x53, 0x54, 0x9a, 0x9b, 0x2e, 0x2f, 0x27, 0x28,
232 0x55, 0x9d, 0xa0, 0xa1, 0xa3, 0xa4, 0xa7, 0xa8,
233 0xad, 0xba, 0xbc, 0xc4, 0x06, 0x0b, 0x0c, 0x15,
234 0x1d, 0x3a, 0x3f, 0x45, 0x51, 0xa6, 0xa7, 0xcc,
235 0xcd, 0xa0, 0x07, 0x19, 0x1a, 0x22, 0x25, 0x3e,
236 0x3f, 0xdf, 0xe7, 0xec, 0xef, 0xff, 0xc5, 0xc6,
237 0x04, 0x20, 0x23, 0x25, 0x26, 0x28, 0x33, 0x38,
238 0x3a, 0x48, 0x4a, 0x4c, 0x50, 0x53, 0x55, 0x56,
239 0x58, 0x5a, 0x5c, 0x5e, 0x60, 0x63, 0x65, 0x66,
240 0x6b, 0x73, 0x78, 0x7d, 0x7f, 0x8a, 0xa4, 0xaa,
241 0xaf, 0xb0, 0xc0, 0xd0, 0xae, 0xaf, 0x6e, 0x6f,
242 0xc7, 0xdd, 0xde, 0x93,
243];
244#[rustfmt::skip]
245const NORMAL0: &[u8] = &[
246 0x00, 0x20,
247 0x5f, 0x22,
248 0x82, 0xdf, 0x04,
249 0x82, 0x44, 0x08,
250 0x1b, 0x04,
251 0x06, 0x11,
252 0x81, 0xac, 0x0e,
253 0x80, 0xab, 0x05,
254 0x20, 0x07,
255 0x81, 0x1c, 0x03,
256 0x19, 0x08,
257 0x01, 0x04,
258 0x2f, 0x04,
259 0x34, 0x04,
260 0x07, 0x03,
261 0x01, 0x07,
262 0x06, 0x07,
263 0x11, 0x0a,
264 0x50, 0x0f,
265 0x12, 0x07,
266 0x55, 0x07,
267 0x03, 0x04,
268 0x1c, 0x0a,
269 0x09, 0x03,
270 0x08, 0x03,
271 0x07, 0x03,
272 0x02, 0x03,
273 0x03, 0x03,
274 0x0c, 0x04,
275 0x05, 0x03,
276 0x0b, 0x06,
277 0x01, 0x0e,
278 0x15, 0x05,
279 0x4e, 0x07,
280 0x1b, 0x07,
281 0x57, 0x07,
282 0x02, 0x05,
283 0x18, 0x0c,
284 0x50, 0x04,
285 0x43, 0x03,
286 0x2d, 0x03,
287 0x01, 0x04,
288 0x11, 0x06,
289 0x0f, 0x0c,
290 0x3a, 0x04,
291 0x1d, 0x25,
292 0x5f, 0x20,
293 0x6d, 0x04,
294 0x6a, 0x25,
295 0x80, 0xc8, 0x05,
296 0x82, 0xb0, 0x03,
297 0x1a, 0x06,
298 0x82, 0xfd, 0x03,
299 0x59, 0x07,
300 0x16, 0x09,
301 0x18, 0x09,
302 0x14, 0x0c,
303 0x14, 0x0c,
304 0x6a, 0x06,
305 0x0a, 0x06,
306 0x1a, 0x06,
307 0x59, 0x07,
308 0x2b, 0x05,
309 0x46, 0x0a,
310 0x2c, 0x04,
311 0x0c, 0x04,
312 0x01, 0x03,
313 0x31, 0x0b,
314 0x2c, 0x04,
315 0x1a, 0x06,
316 0x0b, 0x03,
317 0x80, 0xac, 0x06,
318 0x0a, 0x06,
319 0x4c, 0x14,
320 0x80, 0xf4, 0x08,
321 0x3c, 0x03,
322 0x0f, 0x03,
323 0x3e, 0x05,
324 0x38, 0x08,
325 0x2b, 0x05,
326 0x82, 0xff, 0x11,
327 0x18, 0x08,
328 0x2f, 0x11,
329 0x2d, 0x03,
330 0x22, 0x0e,
331 0x21, 0x0f,
332 0x80, 0x8c, 0x04,
333 0x82, 0x9a, 0x16,
334 0x0b, 0x15,
335 0x88, 0x94, 0x05,
336 0x2f, 0x05,
337 0x3b, 0x07,
338 0x02, 0x0e,
339 0x18, 0x09,
340 0x80, 0xbe, 0x22,
341 0x74, 0x0c,
342 0x80, 0xd6, 0x1a,
343 0x81, 0x10, 0x05,
344 0x80, 0xe1, 0x09,
345 0xf2, 0x9e, 0x03,
346 0x37, 0x09,
347 0x81, 0x5c, 0x14,
348 0x80, 0xb8, 0x08,
349 0x80, 0xdd, 0x14,
350 0x3c, 0x03,
351 0x0a, 0x06,
352 0x38, 0x08,
353 0x46, 0x08,
354 0x0c, 0x06,
355 0x74, 0x0b,
356 0x1e, 0x03,
357 0x5a, 0x04,
358 0x59, 0x09,
359 0x80, 0x83, 0x18,
360 0x1c, 0x0a,
361 0x16, 0x09,
362 0x4c, 0x04,
363 0x80, 0x8a, 0x06,
364 0xab, 0xa4, 0x0c,
365 0x17, 0x04,
366 0x31, 0xa1, 0x04,
367 0x81, 0xda, 0x26,
368 0x07, 0x0c,
369 0x05, 0x05,
370 0x82, 0xb3, 0x20,
371 0x2a, 0x06,
372 0x4c, 0x04,
373 0x80, 0x8d, 0x04,
374 0x80, 0xbe, 0x03,
375 0x1b, 0x03,
376 0x0f, 0x0d,
377];
378#[rustfmt::skip]
379const NORMAL1: &[u8] = &[
380 0x5e, 0x22,
381 0x7b, 0x05,
382 0x03, 0x04,
383 0x2d, 0x03,
384 0x66, 0x03,
385 0x01, 0x2f,
386 0x2e, 0x80, 0x82,
387 0x1d, 0x03,
388 0x31, 0x0f,
389 0x1c, 0x04,
390 0x24, 0x09,
391 0x1e, 0x05,
392 0x2b, 0x05,
393 0x44, 0x04,
394 0x0e, 0x2a,
395 0x80, 0xaa, 0x06,
396 0x24, 0x04,
397 0x24, 0x04,
398 0x28, 0x08,
399 0x34, 0x0b,
400 0x4e, 0x03,
401 0x34, 0x0c,
402 0x81, 0x37, 0x09,
403 0x16, 0x0a,
404 0x08, 0x18,
405 0x3b, 0x45,
406 0x39, 0x03,
407 0x63, 0x08,
408 0x09, 0x30,
409 0x16, 0x05,
410 0x21, 0x03,
411 0x1b, 0x05,
412 0x1b, 0x26,
413 0x38, 0x04,
414 0x4b, 0x05,
415 0x2f, 0x04,
416 0x0a, 0x07,
417 0x09, 0x07,
418 0x40, 0x20,
419 0x27, 0x04,
420 0x0c, 0x09,
421 0x36, 0x03,
422 0x3a, 0x05,
423 0x1a, 0x07,
424 0x04, 0x0c,
425 0x07, 0x50,
426 0x49, 0x37,
427 0x33, 0x0d,
428 0x33, 0x07,
429 0x2e, 0x08,
430 0x0a, 0x06,
431 0x26, 0x03,
432 0x1d, 0x08,
433 0x02, 0x80, 0xd0,
434 0x52, 0x10,
435 0x06, 0x08,
436 0x09, 0x21,
437 0x2e, 0x08,
438 0x2a, 0x16,
439 0x1a, 0x26,
440 0x1c, 0x14,
441 0x17, 0x09,
442 0x4e, 0x04,
443 0x24, 0x09,
444 0x44, 0x0d,
445 0x19, 0x07,
446 0x0a, 0x06,
447 0x48, 0x08,
448 0x27, 0x09,
449 0x75, 0x0b,
450 0x42, 0x3e,
451 0x2a, 0x06,
452 0x3b, 0x05,
453 0x0a, 0x06,
454 0x51, 0x06,
455 0x01, 0x05,
456 0x10, 0x03,
457 0x05, 0x0b,
458 0x59, 0x08,
459 0x02, 0x1d,
460 0x62, 0x1e,
461 0x48, 0x08,
462 0x0a, 0x80, 0xa6,
463 0x5e, 0x22,
464 0x45, 0x0b,
465 0x0a, 0x06,
466 0x0d, 0x13,
467 0x3a, 0x06,
468 0x0a, 0x06,
469 0x14, 0x1c,
470 0x2c, 0x04,
471 0x17, 0x80, 0xb9,
472 0x3c, 0x64,
473 0x53, 0x0c,
474 0x48, 0x09,
475 0x0a, 0x46,
476 0x45, 0x1b,
477 0x48, 0x08,
478 0x53, 0x0d,
479 0x49, 0x07,
480 0x0a, 0x56,
481 0x08, 0x58,
482 0x22, 0x0e,
483 0x0a, 0x06,
484 0x46, 0x0a,
485 0x1d, 0x03,
486 0x47, 0x49,
487 0x37, 0x03,
488 0x0e, 0x08,
489 0x0a, 0x06,
490 0x39, 0x07,
491 0x0a, 0x06,
492 0x2c, 0x04,
493 0x0a, 0x80, 0xf6,
494 0x19, 0x07,
495 0x3b, 0x03,
496 0x1d, 0x55,
497 0x01, 0x0f,
498 0x32, 0x0d,
499 0x83, 0x9b, 0x66,
500 0x75, 0x0b,
501 0x80, 0xc4, 0x8a, 0x4c,
502 0x63, 0x0d,
503 0x84, 0x30, 0x10,
504 0x16, 0x0a,
505 0x8f, 0x9b, 0x05,
506 0x82, 0x47, 0x9a, 0xb9,
507 0x3a, 0x86, 0xc6,
508 0x82, 0x39, 0x07,
509 0x2a, 0x04,
510 0x5c, 0x06,
511 0x26, 0x0a,
512 0x46, 0x0a,
513 0x28, 0x05,
514 0x13, 0x81, 0xb0,
515 0x3a, 0x80, 0xc6,
516 0x5b, 0x05,
517 0x34, 0x2c,
518 0x4b, 0x04,
519 0x39, 0x07,
520 0x11, 0x40,
521 0x05, 0x0b,
522 0x07, 0x09,
523 0x9c, 0xd6, 0x29,
524 0x20, 0x61,
525 0x73, 0xa1, 0xfd,
526 0x81, 0x33, 0x0f,
527 0x01, 0x1d,
528 0x06, 0x0e,
529 0x04, 0x08,
530 0x81, 0x8c, 0x89, 0x04,
531 0x6b, 0x05,
532 0x0d, 0x03,
533 0x09, 0x07,
534 0x10, 0x8f, 0x60,
535 0x80, 0xfd, 0x03,
536 0x81, 0xb4, 0x06,
537 0x17, 0x0f,
538 0x11, 0x0f,
539 0x47, 0x09,
540 0x74, 0x3c,
541 0x80, 0xf6, 0x0a,
542 0x73, 0x08,
543 0x70, 0x15,
544 0x46, 0x7a,
545 0x14, 0x0c,
546 0x14, 0x0c,
547 0x57, 0x09,
548 0x19, 0x80, 0x87,
549 0x81, 0x47, 0x03,
550 0x85, 0x42, 0x0f,
551 0x15, 0x84, 0x50,
552 0x1f, 0x06,
553 0x06, 0x80, 0xd5,
554 0x2b, 0x05,
555 0x3e, 0x21,
556 0x01, 0x70,
557 0x2d, 0x03,
558 0x1a, 0x04,
559 0x02, 0x81, 0x40,
560 0x1f, 0x11,
561 0x3a, 0x05,
562 0x01, 0x81, 0xd0,
563 0x2a, 0x80, 0xd6,
564 0x2b, 0x04,
565 0x01, 0x80, 0xc0,
566 0x36, 0x08,
567 0x02, 0x80, 0xe0,
568 0x80, 0xf7, 0x29,
569 0x4c, 0x04,
570 0x0a, 0x04,
571 0x02, 0x83, 0x11,
572 0x44, 0x4c,
573 0x3d, 0x80, 0xc2,
574 0x3c, 0x06,
575 0x01, 0x04,
576 0x55, 0x05,
577 0x1b, 0x34,
578 0x02, 0x81, 0x0e,
579 0x2c, 0x04,
580 0x64, 0x0c,
581 0x56, 0x0a,
582 0x80, 0xae, 0x38,
583 0x1d, 0x0d,
584 0x2c, 0x04,
585 0x09, 0x07,
586 0x02, 0x0e,
587 0x06, 0x80, 0x9a,
588 0x83, 0xd9, 0x03,
589 0x11, 0x03,
590 0x0d, 0x03,
591 0x80, 0xda, 0x06,
592 0x0c, 0x04,
593 0x01, 0x0f,
594 0x0c, 0x04,
595 0x38, 0x08,
596 0x0a, 0x06,
597 0x28, 0x08,
598 0x2c, 0x04,
599 0x02, 0x0e,
600 0x09, 0x27,
601 0x81, 0x58, 0x08,
602 0x1d, 0x03,
603 0x0b, 0x03,
604 0x3b, 0x04,
605 0x1e, 0x04,
606 0x0a, 0x07,
607 0x80, 0xfb, 0x84, 0x05,
608];