support __cxa_atexit, and registering atexit functions from atexit handlers
[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 }