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