const_str/
printable.rs

1#![allow(clippy::comparison_chain)]
2#![allow(clippy::manual_range_contains)]
3
4// Edited from <https://github.com/rust-lang/rust/blob/3358a41acbcb82daf3cd71197b2a053152a9a376/library/core/src/unicode/printable.rs>
5
6const 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    // for &(upper, lowercount) in singletonuppers
16    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            // for &lower in &singletonlowers[lowerstart..lowerend]
23            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            // end for
34        } else if xupper < upper {
35            break;
36        }
37        lowerstart = lowerend;
38
39        i += 1;
40    }
41    // end for
42
43    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        // ASCII fast path
76        false
77    } else if x < 127 {
78        // ASCII fast path
79        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];