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