1414c30c6e33753654fabc68473a534f249f2d84
[musl] / src / ctype / iswpunct.c
1 #include <wctype.h>
2 #include <inttypes.h>
3
4 /* The below data is derived from classes (P.|Sm) plus Pattern_Syntax */
5
6 #define R(a,b) { (b), (b)-(a) }
7
8 static const struct range {
9         uint32_t base:20;
10         uint32_t len:12;
11 } ranges[] = {
12 R(0x21, 0x2f),
13 R(0x3a, 0x40),
14 R(0x5b, 0x60),
15 R(0x7b, 0x7e),
16 R(0xa1, 0xa7),
17 R(0xa9, 0xa9),
18 R(0xab, 0xac),
19 R(0xae, 0xae),
20 R(0xb0, 0xb1),
21 R(0xb6, 0xb7),
22 R(0xbb, 0xbb),
23 R(0xbf, 0xbf),
24 R(0xd7, 0xd7),
25 R(0xf7, 0xf7),
26 R(0x37e, 0x37e),
27 R(0x387, 0x387),
28 R(0x3f6, 0x3f6),
29 R(0x55a, 0x55f),
30 R(0x589, 0x58a),
31 R(0x5be, 0x5be),
32 R(0x5c0, 0x5c0),
33 R(0x5c3, 0x5c3),
34 R(0x5c6, 0x5c6),
35 R(0x5f3, 0x5f4),
36 R(0x606, 0x60a),
37 R(0x60c, 0x60d),
38 R(0x61b, 0x61b),
39 R(0x61e, 0x61f),
40 R(0x66a, 0x66d),
41 R(0x6d4, 0x6d4),
42 R(0x700, 0x70d),
43 R(0x7f7, 0x7f9),
44 R(0x964, 0x965),
45 R(0x970, 0x970),
46 R(0xdf4, 0xdf4),
47 R(0xe4f, 0xe4f),
48 R(0xe5a, 0xe5b),
49 R(0xf04, 0xf12),
50 R(0xf3a, 0xf3d),
51 R(0xf85, 0xf85),
52 R(0xfd0, 0xfd4),
53 R(0x104a, 0x104f),
54 R(0x10fb, 0x10fb),
55 R(0x1361, 0x1368),
56 R(0x166d, 0x166e),
57 R(0x1680, 0x1680),
58 R(0x169b, 0x169c),
59 R(0x16eb, 0x16ed),
60 R(0x1735, 0x1736),
61 R(0x17d4, 0x17d6),
62 R(0x17d8, 0x17da),
63 R(0x1800, 0x180a),
64 R(0x180e, 0x180e),
65 R(0x1944, 0x1945),
66 R(0x19de, 0x19df),
67 R(0x1a1e, 0x1a1f),
68 R(0x1b5a, 0x1b60),
69 R(0x1c3b, 0x1c3f),
70 R(0x1c7e, 0x1c7f),
71 R(0x2010, 0x2027),
72 R(0x2030, 0x205e),
73 R(0x207a, 0x207e),
74 R(0x208a, 0x208e),
75 R(0x2140, 0x2144),
76 R(0x214b, 0x214b),
77 R(0x2190, 0x245f),
78 R(0x2500, 0x2775),
79 R(0x2794, 0x2bff),
80 R(0x2cf9, 0x2cfc),
81 R(0x2cfe, 0x2cff),
82 R(0x2e00, 0x2e7f),
83 R(0x3001, 0x3003),
84 R(0x3008, 0x3020),
85 R(0x3030, 0x3030),
86 R(0x303d, 0x303d),
87 R(0x30a0, 0x30a0),
88 R(0x30fb, 0x30fb),
89 R(0xa60d, 0xa60f),
90 R(0xa874, 0xa877),
91 R(0xa8ce, 0xa8cf),
92 R(0xa92e, 0xa92f),
93 R(0xa95f, 0xa95f),
94 R(0xfb29, 0xfb29),
95 R(0xfd3e, 0xfd3f),
96 R(0xfe10, 0xfe19),
97 R(0xfe30, 0xfe52),
98 R(0xfe54, 0xfe66),
99 R(0xfe68, 0xfe68),
100 R(0xfe6a, 0xfe6b),
101 R(0xff01, 0xff03),
102 R(0xff05, 0xff0f),
103 R(0xff1a, 0xff20),
104 R(0xff3b, 0xff3d),
105 R(0xff3f, 0xff3f),
106 R(0xff5b, 0xff65),
107 R(0xffe2, 0xffe2),
108 R(0xffe9, 0xffec),
109 R(0x10100, 0x10101),
110 R(0x1039f, 0x1039f),
111 R(0x103d0, 0x103d0),
112 R(0x1091f, 0x1091f),
113 R(0x1093f, 0x1093f),
114 R(0x10a50, 0x10a58),
115 R(0x12470, 0x12473),
116 R(0x1d6c1, 0x1d6c1),
117 R(0x1d6db, 0x1d6db),
118 R(0x1d6fb, 0x1d6fb),
119 R(0x1d715, 0x1d715),
120 R(0x1d735, 0x1d735),
121 R(0x1d74f, 0x1d74f),
122 R(0x1d76f, 0x1d76f),
123 R(0x1d789, 0x1d789),
124 R(0x1d7a9, 0x1d7a9),
125 R(0x1d7c3, 0x1d7c3),
126 };
127
128 int iswpunct(wint_t wc)
129 {
130         unsigned c = wc;
131         int a = 0;
132         int n = sizeof ranges / sizeof ranges[0];
133         do {
134                 n >>= 1;
135                 a += n+1 & (signed)(ranges[a+n].base-c)>>31;
136         } while (n);
137         return ranges[a].base-c <= ranges[a].len;
138 }