annotate libphobos/libdruntime/rt/aApplyR.d @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1 /**
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2 * This code handles decoding UTF strings for foreach_reverse loops. There are
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3 * 6 combinations of conversions between char, wchar, and dchar, and 2 of each
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4 * of those.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5 *
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6 * Copyright: Copyright Digital Mars 2004 - 2010.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7 * License: $(WEB www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8 * Authors: Walter Bright, Sean Kelly
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9 */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11 /* Copyright Digital Mars 2004 - 2010.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12 * Distributed under the Boost Software License, Version 1.0.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13 * (See accompanying file LICENSE or copy at
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14 * http://www.boost.org/LICENSE_1_0.txt)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15 */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16 module rt.aApplyR;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18 /* This code handles decoding UTF strings for foreach_reverse loops.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19 * There are 6 combinations of conversions between char, wchar,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20 * and dchar, and 2 of each of those.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21 */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23 private import rt.util.utf;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25 /**********************************************/
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26 /* 1 argument versions */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28 // dg is D, but _aApplyRcd() is C
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 extern (D) alias int delegate(void *) dg_t;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31 extern (C) int _aApplyRcd1(in char[] aa, dg_t dg)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32 { int result;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34 debug(apply) printf("_aApplyRcd1(), len = %d\n", aa.length);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35 for (size_t i = aa.length; i != 0; )
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36 { dchar d;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38 i--;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39 d = aa[i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40 if (d & 0x80)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41 { char c = cast(char)d;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42 uint j;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43 uint m = 0x3F;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44 d = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45 while ((c & 0xC0) != 0xC0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46 { if (i == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47 onUnicodeError("Invalid UTF-8 sequence", 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48 i--;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49 d |= (c & 0x3F) << j;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50 j += 6;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51 m >>= 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52 c = aa[i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
53 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
54 d |= (c & m) << j;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
55 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
56 result = dg(cast(void *)&d);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
57 if (result)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
58 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
59 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
60 return result;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
61 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
62
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
63 unittest
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
64 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
65 debug(apply) printf("_aApplyRcd1.unittest\n");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
66
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
67 auto s = "hello"c[];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
68 int i;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
69
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
70 foreach_reverse (dchar d; s)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
71 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
72 switch (i)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
73 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
74 case 0: assert(d == 'o'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
75 case 1: assert(d == 'l'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
76 case 2: assert(d == 'l'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
77 case 3: assert(d == 'e'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
78 case 4: assert(d == 'h'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
79 default: assert(0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
80 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
81 i++;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
82 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
83 assert(i == 5);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
84
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
85 s = "a\u1234\U000A0456b";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
86 i = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
87 foreach_reverse (dchar d; s)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
88 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
89 //printf("i = %d, d = %x\n", i, d);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
90 switch (i)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
91 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
92 case 0: assert(d == 'b'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
93 case 1: assert(d == '\U000A0456'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
94 case 2: assert(d == '\u1234'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
95 case 3: assert(d == 'a'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
96 default: assert(0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
97 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
98 i++;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
99 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
100 assert(i == 4);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
101 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
102
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
103 /*****************************/
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
104
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
105 extern (C) int _aApplyRwd1(in wchar[] aa, dg_t dg)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
106 { int result;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
107
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
108 debug(apply) printf("_aApplyRwd1(), len = %d\n", aa.length);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
109 for (size_t i = aa.length; i != 0; )
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
110 { dchar d;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
111
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
112 i--;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
113 d = aa[i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
114 if (d >= 0xDC00 && d <= 0xDFFF)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
115 { if (i == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
116 onUnicodeError("Invalid UTF-16 sequence", 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
117 i--;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
118 d = ((aa[i] - 0xD7C0) << 10) + (d - 0xDC00);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
119 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
120 result = dg(cast(void *)&d);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
121 if (result)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
122 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
123 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
124 return result;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
125 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
126
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
127 unittest
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
128 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
129 debug(apply) printf("_aApplyRwd1.unittest\n");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
130
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
131 auto s = "hello"w[];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
132 int i;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
133
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
134 foreach_reverse (dchar d; s)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
135 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
136 switch (i)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
137 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
138 case 0: assert(d == 'o'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
139 case 1: assert(d == 'l'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
140 case 2: assert(d == 'l'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
141 case 3: assert(d == 'e'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
142 case 4: assert(d == 'h'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
143 default: assert(0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
144 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
145 i++;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
146 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
147 assert(i == 5);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
148
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
149 s = "a\u1234\U000A0456b";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
150 i = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
151 foreach_reverse (dchar d; s)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
152 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
153 //printf("i = %d, d = %x\n", i, d);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
154 switch (i)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
155 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
156 case 0: assert(d == 'b'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
157 case 1: assert(d == '\U000A0456'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
158 case 2: assert(d == '\u1234'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
159 case 3: assert(d == 'a'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
160 default: assert(0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
161 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
162 i++;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
163 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
164 assert(i == 4);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
165 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
166
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
167 /*****************************/
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
168
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
169 extern (C) int _aApplyRcw1(in char[] aa, dg_t dg)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
170 { int result;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
171
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
172 debug(apply) printf("_aApplyRcw1(), len = %d\n", aa.length);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
173 for (size_t i = aa.length; i != 0; )
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
174 { dchar d;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
175 wchar w;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
176
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
177 i--;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
178 w = aa[i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
179 if (w & 0x80)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
180 { char c = cast(char)w;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
181 uint j;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
182 uint m = 0x3F;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
183 d = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
184 while ((c & 0xC0) != 0xC0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
185 { if (i == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
186 onUnicodeError("Invalid UTF-8 sequence", 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
187 i--;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
188 d |= (c & 0x3F) << j;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
189 j += 6;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
190 m >>= 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
191 c = aa[i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
192 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
193 d |= (c & m) << j;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
194
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
195 if (d <= 0xFFFF)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
196 w = cast(wchar) d;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
197 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
198 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
199 w = cast(wchar) ((((d - 0x10000) >> 10) & 0x3FF) + 0xD800);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
200 result = dg(cast(void *)&w);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
201 if (result)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
202 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
203 w = cast(wchar) (((d - 0x10000) & 0x3FF) + 0xDC00);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
204 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
205 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
206 result = dg(cast(void *)&w);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
207 if (result)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
208 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
209 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
210 return result;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
211 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
212
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
213 unittest
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
214 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
215 debug(apply) printf("_aApplyRcw1.unittest\n");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
216
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
217 auto s = "hello"c[];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
218 int i;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
219
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
220 foreach_reverse (wchar d; s)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
221 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
222 switch (i)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
223 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
224 case 0: assert(d == 'o'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
225 case 1: assert(d == 'l'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
226 case 2: assert(d == 'l'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
227 case 3: assert(d == 'e'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
228 case 4: assert(d == 'h'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
229 default: assert(0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
230 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
231 i++;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
232 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
233 assert(i == 5);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
234
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
235 s = "a\u1234\U000A0456b";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
236 i = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
237 foreach_reverse (wchar d; s)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
238 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
239 //printf("i = %d, d = %x\n", i, d);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
240 switch (i)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
241 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
242 case 0: assert(d == 'b'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
243 case 1: assert(d == 0xDA41); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
244 case 2: assert(d == 0xDC56); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
245 case 3: assert(d == 0x1234); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
246 case 4: assert(d == 'a'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
247 default: assert(0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
248 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
249 i++;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
250 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
251 assert(i == 5);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
252 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
253
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
254 /*****************************/
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
255
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
256 extern (C) int _aApplyRwc1(in wchar[] aa, dg_t dg)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
257 { int result;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
258
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
259 debug(apply) printf("_aApplyRwc1(), len = %d\n", aa.length);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
260 for (size_t i = aa.length; i != 0; )
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
261 { dchar d;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
262 char c;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
263
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
264 i--;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
265 d = aa[i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
266 if (d >= 0xDC00 && d <= 0xDFFF)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
267 { if (i == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
268 onUnicodeError("Invalid UTF-16 sequence", 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
269 i--;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
270 d = ((aa[i] - 0xD7C0) << 10) + (d - 0xDC00);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
271 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
272
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
273 if (d & ~0x7F)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
274 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
275 char[4] buf = void;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
276
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
277 auto b = toUTF8(buf, d);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
278 foreach (char c2; b)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
279 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
280 result = dg(cast(void *)&c2);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
281 if (result)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
282 return result;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
283 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
284 continue;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
285 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
286 c = cast(char)d;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
287 result = dg(cast(void *)&c);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
288 if (result)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
289 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
290 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
291 return result;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
292 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
293
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
294 unittest
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
295 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
296 debug(apply) printf("_aApplyRwc1.unittest\n");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
297
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
298 auto s = "hello"w[];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
299 int i;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
300
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
301 foreach_reverse (char d; s)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
302 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
303 switch (i)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
304 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
305 case 0: assert(d == 'o'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
306 case 1: assert(d == 'l'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
307 case 2: assert(d == 'l'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
308 case 3: assert(d == 'e'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
309 case 4: assert(d == 'h'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
310 default: assert(0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
311 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
312 i++;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
313 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
314 assert(i == 5);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
315
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
316 s = "a\u1234\U000A0456b";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
317 i = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
318 foreach_reverse (char d; s)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
319 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
320 //printf("i = %d, d = %x\n", i, d);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
321 switch (i)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
322 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
323 case 0: assert(d == 'b'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
324 case 1: assert(d == 0xF2); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
325 case 2: assert(d == 0xA0); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
326 case 3: assert(d == 0x91); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
327 case 4: assert(d == 0x96); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
328 case 5: assert(d == 0xE1); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
329 case 6: assert(d == 0x88); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
330 case 7: assert(d == 0xB4); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
331 case 8: assert(d == 'a'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
332 default: assert(0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
333 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
334 i++;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
335 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
336 assert(i == 9);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
337 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
338
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
339 /*****************************/
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
340
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
341 extern (C) int _aApplyRdc1(in dchar[] aa, dg_t dg)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
342 { int result;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
343
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
344 debug(apply) printf("_aApplyRdc1(), len = %d\n", aa.length);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
345 for (size_t i = aa.length; i != 0;)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
346 { dchar d = aa[--i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
347 char c;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
348
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
349 if (d & ~0x7F)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
350 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
351 char[4] buf = void;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
352
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
353 auto b = toUTF8(buf, d);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
354 foreach (char c2; b)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
355 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
356 result = dg(cast(void *)&c2);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
357 if (result)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
358 return result;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
359 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
360 continue;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
361 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
362 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
363 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
364 c = cast(char)d;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
365 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
366 result = dg(cast(void *)&c);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
367 if (result)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
368 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
369 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
370 return result;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
371 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
372
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
373 unittest
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
374 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
375 debug(apply) printf("_aApplyRdc1.unittest\n");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
376
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
377 auto s = "hello"d[];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
378 int i;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
379
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
380 foreach_reverse (char d; s)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
381 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
382 switch (i)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
383 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
384 case 0: assert(d == 'o'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
385 case 1: assert(d == 'l'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
386 case 2: assert(d == 'l'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
387 case 3: assert(d == 'e'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
388 case 4: assert(d == 'h'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
389 default: assert(0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
390 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
391 i++;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
392 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
393 assert(i == 5);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
394
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
395 s = "a\u1234\U000A0456b";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
396 i = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
397 foreach_reverse (char d; s)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
398 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
399 //printf("i = %d, d = %x\n", i, d);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
400 switch (i)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
401 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
402 case 0: assert(d == 'b'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
403 case 1: assert(d == 0xF2); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
404 case 2: assert(d == 0xA0); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
405 case 3: assert(d == 0x91); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
406 case 4: assert(d == 0x96); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
407 case 5: assert(d == 0xE1); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
408 case 6: assert(d == 0x88); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
409 case 7: assert(d == 0xB4); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
410 case 8: assert(d == 'a'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
411 default: assert(0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
412 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
413 i++;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
414 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
415 assert(i == 9);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
416 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
417
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
418 /*****************************/
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
419
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
420 extern (C) int _aApplyRdw1(in dchar[] aa, dg_t dg)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
421 { int result;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
422
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
423 debug(apply) printf("_aApplyRdw1(), len = %d\n", aa.length);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
424 for (size_t i = aa.length; i != 0; )
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
425 { dchar d = aa[--i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
426 wchar w;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
427
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
428 if (d <= 0xFFFF)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
429 w = cast(wchar) d;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
430 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
431 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
432 w = cast(wchar) ((((d - 0x10000) >> 10) & 0x3FF) + 0xD800);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
433 result = dg(cast(void *)&w);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
434 if (result)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
435 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
436 w = cast(wchar) (((d - 0x10000) & 0x3FF) + 0xDC00);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
437 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
438 result = dg(cast(void *)&w);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
439 if (result)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
440 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
441 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
442 return result;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
443 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
444
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
445 unittest
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
446 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
447 debug(apply) printf("_aApplyRdw1.unittest\n");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
448
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
449 auto s = "hello"d[];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
450 int i;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
451
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
452 foreach_reverse (wchar d; s)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
453 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
454 switch (i)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
455 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
456 case 0: assert(d == 'o'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
457 case 1: assert(d == 'l'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
458 case 2: assert(d == 'l'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
459 case 3: assert(d == 'e'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
460 case 4: assert(d == 'h'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
461 default: assert(0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
462 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
463 i++;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
464 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
465 assert(i == 5);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
466
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
467 s = "a\u1234\U000A0456b";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
468 i = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
469 foreach_reverse (wchar d; s)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
470 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
471 //printf("i = %d, d = %x\n", i, d);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
472 switch (i)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
473 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
474 case 0: assert(d == 'b'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
475 case 1: assert(d == 0xDA41); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
476 case 2: assert(d == 0xDC56); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
477 case 3: assert(d == 0x1234); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
478 case 4: assert(d == 'a'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
479 default: assert(0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
480 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
481 i++;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
482 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
483 assert(i == 5);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
484 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
485
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
486
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
487 /****************************************************************************/
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
488 /* 2 argument versions */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
489
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
490 // dg is D, but _aApplyRcd2() is C
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
491 extern (D) alias int delegate(void *, void *) dg2_t;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
492
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
493 extern (C) int _aApplyRcd2(in char[] aa, dg2_t dg)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
494 { int result;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
495 size_t i;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
496 size_t len = aa.length;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
497
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
498 debug(apply) printf("_aApplyRcd2(), len = %d\n", len);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
499 for (i = len; i != 0; )
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
500 { dchar d;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
501
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
502 i--;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
503 d = aa[i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
504 if (d & 0x80)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
505 { char c = cast(char)d;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
506 uint j;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
507 uint m = 0x3F;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
508 d = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
509 while ((c & 0xC0) != 0xC0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
510 { if (i == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
511 onUnicodeError("Invalid UTF-8 sequence", 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
512 i--;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
513 d |= (c & 0x3F) << j;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
514 j += 6;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
515 m >>= 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
516 c = aa[i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
517 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
518 d |= (c & m) << j;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
519 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
520 result = dg(&i, cast(void *)&d);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
521 if (result)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
522 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
523 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
524 return result;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
525 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
526
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
527 unittest
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
528 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
529 debug(apply) printf("_aApplyRcd2.unittest\n");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
530
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
531 auto s = "hello"c[];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
532 int i;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
533
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
534 foreach_reverse (k, dchar d; s)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
535 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
536 assert(k == 4 - i);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
537 switch (i)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
538 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
539 case 0: assert(d == 'o'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
540 case 1: assert(d == 'l'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
541 case 2: assert(d == 'l'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
542 case 3: assert(d == 'e'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
543 case 4: assert(d == 'h'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
544 default: assert(0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
545 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
546 i++;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
547 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
548 assert(i == 5);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
549
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
550 s = "a\u1234\U000A0456b";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
551 i = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
552 foreach_reverse (k, dchar d; s)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
553 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
554 //printf("i = %d, k = %d, d = %x\n", i, k, d);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
555 switch (i)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
556 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
557 case 0: assert(d == 'b'); assert(k == 8); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
558 case 1: assert(d == '\U000A0456'); assert(k == 4); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
559 case 2: assert(d == '\u1234'); assert(k == 1); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
560 case 3: assert(d == 'a'); assert(k == 0); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
561 default: assert(0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
562 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
563 i++;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
564 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
565 assert(i == 4);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
566 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
567
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
568 /*****************************/
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
569
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
570 extern (C) int _aApplyRwd2(in wchar[] aa, dg2_t dg)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
571 { int result;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
572
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
573 debug(apply) printf("_aApplyRwd2(), len = %d\n", aa.length);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
574 for (size_t i = aa.length; i != 0; )
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
575 { dchar d;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
576
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
577 i--;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
578 d = aa[i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
579 if (d >= 0xDC00 && d <= 0xDFFF)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
580 { if (i == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
581 onUnicodeError("Invalid UTF-16 sequence", 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
582 i--;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
583 d = ((aa[i] - 0xD7C0) << 10) + (d - 0xDC00);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
584 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
585 result = dg(&i, cast(void *)&d);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
586 if (result)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
587 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
588 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
589 return result;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
590 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
591
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
592 unittest
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
593 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
594 debug(apply) printf("_aApplyRwd2.unittest\n");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
595
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
596 auto s = "hello"w[];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
597 int i;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
598
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
599 foreach_reverse (k, dchar d; s)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
600 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
601 //printf("i = %d, k = %d, d = %x\n", i, k, d);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
602 assert(k == 4 - i);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
603 switch (i)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
604 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
605 case 0: assert(d == 'o'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
606 case 1: assert(d == 'l'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
607 case 2: assert(d == 'l'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
608 case 3: assert(d == 'e'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
609 case 4: assert(d == 'h'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
610 default: assert(0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
611 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
612 i++;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
613 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
614 assert(i == 5);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
615
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
616 s = "a\u1234\U000A0456b";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
617 i = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
618 foreach_reverse (k, dchar d; s)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
619 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
620 //printf("i = %d, k = %d, d = %x\n", i, k, d);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
621 switch (i)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
622 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
623 case 0: assert(k == 4); assert(d == 'b'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
624 case 1: assert(k == 2); assert(d == '\U000A0456'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
625 case 2: assert(k == 1); assert(d == '\u1234'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
626 case 3: assert(k == 0); assert(d == 'a'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
627 default: assert(0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
628 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
629 i++;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
630 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
631 assert(i == 4);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
632 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
633
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
634 /*****************************/
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
635
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
636 extern (C) int _aApplyRcw2(in char[] aa, dg2_t dg)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
637 { int result;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
638
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
639 debug(apply) printf("_aApplyRcw2(), len = %d\n", aa.length);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
640 for (size_t i = aa.length; i != 0; )
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
641 { dchar d;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
642 wchar w;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
643
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
644 i--;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
645 w = aa[i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
646 if (w & 0x80)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
647 { char c = cast(char)w;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
648 uint j;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
649 uint m = 0x3F;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
650 d = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
651 while ((c & 0xC0) != 0xC0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
652 { if (i == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
653 onUnicodeError("Invalid UTF-8 sequence", 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
654 i--;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
655 d |= (c & 0x3F) << j;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
656 j += 6;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
657 m >>= 1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
658 c = aa[i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
659 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
660 d |= (c & m) << j;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
661
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
662 if (d <= 0xFFFF)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
663 w = cast(wchar) d;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
664 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
665 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
666 w = cast(wchar) ((((d - 0x10000) >> 10) & 0x3FF) + 0xD800);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
667 result = dg(&i, cast(void *)&w);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
668 if (result)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
669 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
670 w = cast(wchar) (((d - 0x10000) & 0x3FF) + 0xDC00);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
671 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
672 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
673 result = dg(&i, cast(void *)&w);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
674 if (result)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
675 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
676 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
677 return result;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
678 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
679
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
680 unittest
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
681 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
682 debug(apply) printf("_aApplyRcw2.unittest\n");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
683
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
684 auto s = "hello"c[];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
685 int i;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
686
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
687 foreach_reverse (k, wchar d; s)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
688 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
689 //printf("i = %d, k = %d, d = %x\n", i, k, d);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
690 assert(k == 4 - i);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
691 switch (i)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
692 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
693 case 0: assert(d == 'o'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
694 case 1: assert(d == 'l'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
695 case 2: assert(d == 'l'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
696 case 3: assert(d == 'e'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
697 case 4: assert(d == 'h'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
698 default: assert(0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
699 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
700 i++;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
701 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
702 assert(i == 5);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
703
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
704 s = "a\u1234\U000A0456b";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
705 i = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
706 foreach_reverse (k, wchar d; s)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
707 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
708 //printf("i = %d, k = %d, d = %x\n", i, k, d);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
709 switch (i)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
710 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
711 case 0: assert(k == 8); assert(d == 'b'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
712 case 1: assert(k == 4); assert(d == 0xDA41); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
713 case 2: assert(k == 4); assert(d == 0xDC56); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
714 case 3: assert(k == 1); assert(d == 0x1234); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
715 case 4: assert(k == 0); assert(d == 'a'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
716 default: assert(0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
717 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
718 i++;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
719 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
720 assert(i == 5);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
721 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
722
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
723 /*****************************/
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
724
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
725 extern (C) int _aApplyRwc2(in wchar[] aa, dg2_t dg)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
726 { int result;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
727
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
728 debug(apply) printf("_aApplyRwc2(), len = %d\n", aa.length);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
729 for (size_t i = aa.length; i != 0; )
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
730 { dchar d;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
731 char c;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
732
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
733 i--;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
734 d = aa[i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
735 if (d >= 0xDC00 && d <= 0xDFFF)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
736 { if (i == 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
737 onUnicodeError("Invalid UTF-16 sequence", 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
738 i--;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
739 d = ((aa[i] - 0xD7C0) << 10) + (d - 0xDC00);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
740 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
741
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
742 if (d & ~0x7F)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
743 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
744 char[4] buf = void;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
745
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
746 auto b = toUTF8(buf, d);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
747 foreach (char c2; b)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
748 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
749 result = dg(&i, cast(void *)&c2);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
750 if (result)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
751 return result;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
752 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
753 continue;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
754 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
755 c = cast(char)d;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
756 result = dg(&i, cast(void *)&c);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
757 if (result)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
758 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
759 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
760 return result;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
761 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
762
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
763 unittest
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
764 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
765 debug(apply) printf("_aApplyRwc2.unittest\n");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
766
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
767 auto s = "hello"w[];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
768 int i;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
769
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
770 foreach_reverse (k, char d; s)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
771 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
772 //printf("i = %d, k = %d, d = %x\n", i, k, d);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
773 assert(k == 4 - i);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
774 switch (i)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
775 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
776 case 0: assert(d == 'o'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
777 case 1: assert(d == 'l'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
778 case 2: assert(d == 'l'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
779 case 3: assert(d == 'e'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
780 case 4: assert(d == 'h'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
781 default: assert(0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
782 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
783 i++;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
784 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
785 assert(i == 5);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
786
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
787 s = "a\u1234\U000A0456b";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
788 i = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
789 foreach_reverse (k, char d; s)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
790 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
791 //printf("i = %d, k = %d, d = %x\n", i, k, d);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
792 switch (i)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
793 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
794 case 0: assert(k == 4); assert(d == 'b'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
795 case 1: assert(k == 2); assert(d == 0xF2); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
796 case 2: assert(k == 2); assert(d == 0xA0); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
797 case 3: assert(k == 2); assert(d == 0x91); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
798 case 4: assert(k == 2); assert(d == 0x96); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
799 case 5: assert(k == 1); assert(d == 0xE1); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
800 case 6: assert(k == 1); assert(d == 0x88); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
801 case 7: assert(k == 1); assert(d == 0xB4); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
802 case 8: assert(k == 0); assert(d == 'a'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
803 default: assert(0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
804 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
805 i++;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
806 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
807 assert(i == 9);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
808 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
809
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
810 /*****************************/
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
811
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
812 extern (C) int _aApplyRdc2(in dchar[] aa, dg2_t dg)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
813 { int result;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
814
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
815 debug(apply) printf("_aApplyRdc2(), len = %d\n", aa.length);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
816 for (size_t i = aa.length; i != 0; )
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
817 { dchar d = aa[--i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
818 char c;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
819
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
820 if (d & ~0x7F)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
821 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
822 char[4] buf = void;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
823
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
824 auto b = toUTF8(buf, d);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
825 foreach (char c2; b)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
826 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
827 result = dg(&i, cast(void *)&c2);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
828 if (result)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
829 return result;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
830 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
831 continue;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
832 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
833 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
834 { c = cast(char)d;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
835 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
836 result = dg(&i, cast(void *)&c);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
837 if (result)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
838 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
839 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
840 return result;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
841 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
842
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
843 unittest
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
844 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
845 debug(apply) printf("_aApplyRdc2.unittest\n");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
846
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
847 auto s = "hello"d[];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
848 int i;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
849
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
850 foreach_reverse (k, char d; s)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
851 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
852 //printf("i = %d, k = %d, d = %x\n", i, k, d);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
853 assert(k == 4 - i);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
854 switch (i)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
855 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
856 case 0: assert(d == 'o'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
857 case 1: assert(d == 'l'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
858 case 2: assert(d == 'l'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
859 case 3: assert(d == 'e'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
860 case 4: assert(d == 'h'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
861 default: assert(0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
862 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
863 i++;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
864 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
865 assert(i == 5);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
866
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
867 s = "a\u1234\U000A0456b";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
868 i = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
869 foreach_reverse (k, char d; s)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
870 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
871 //printf("i = %d, k = %d, d = %x\n", i, k, d);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
872 switch (i)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
873 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
874 case 0: assert(k == 3); assert(d == 'b'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
875 case 1: assert(k == 2); assert(d == 0xF2); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
876 case 2: assert(k == 2); assert(d == 0xA0); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
877 case 3: assert(k == 2); assert(d == 0x91); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
878 case 4: assert(k == 2); assert(d == 0x96); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
879 case 5: assert(k == 1); assert(d == 0xE1); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
880 case 6: assert(k == 1); assert(d == 0x88); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
881 case 7: assert(k == 1); assert(d == 0xB4); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
882 case 8: assert(k == 0); assert(d == 'a'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
883 default: assert(0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
884 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
885 i++;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
886 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
887 assert(i == 9);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
888 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
889
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
890 /*****************************/
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
891
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
892 extern (C) int _aApplyRdw2(in dchar[] aa, dg2_t dg)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
893 { int result;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
894
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
895 debug(apply) printf("_aApplyRdw2(), len = %d\n", aa.length);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
896 for (size_t i = aa.length; i != 0; )
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
897 { dchar d = aa[--i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
898 wchar w;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
899
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
900 if (d <= 0xFFFF)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
901 w = cast(wchar) d;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
902 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
903 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
904 w = cast(wchar) ((((d - 0x10000) >> 10) & 0x3FF) + 0xD800);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
905 result = dg(&i, cast(void *)&w);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
906 if (result)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
907 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
908 w = cast(wchar) (((d - 0x10000) & 0x3FF) + 0xDC00);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
909 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
910 result = dg(&i, cast(void *)&w);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
911 if (result)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
912 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
913 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
914 return result;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
915 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
916
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
917 unittest
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
918 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
919 debug(apply) printf("_aApplyRdw2.unittest\n");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
920
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
921 auto s = "hello"d[];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
922 int i;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
923
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
924 foreach_reverse (k, wchar d; s)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
925 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
926 //printf("i = %d, k = %d, d = %x\n", i, k, d);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
927 assert(k == 4 - i);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
928 switch (i)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
929 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
930 case 0: assert(d == 'o'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
931 case 1: assert(d == 'l'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
932 case 2: assert(d == 'l'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
933 case 3: assert(d == 'e'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
934 case 4: assert(d == 'h'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
935 default: assert(0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
936 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
937 i++;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
938 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
939 assert(i == 5);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
940
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
941 s = "a\u1234\U000A0456b";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
942 i = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
943 foreach_reverse (k, wchar d; s)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
944 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
945 //printf("i = %d, k = %d, d = %x\n", i, k, d);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
946 switch (i)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
947 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
948 case 0: assert(k == 3); assert(d == 'b'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
949 case 1: assert(k == 2); assert(d == 0xDA41); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
950 case 2: assert(k == 2); assert(d == 0xDC56); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
951 case 3: assert(k == 1); assert(d == 0x1234); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
952 case 4: assert(k == 0); assert(d == 'a'); break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
953 default: assert(0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
954 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
955 i++;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
956 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
957 assert(i == 5);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
958 }