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