d: Merge upstream dmd 60bfa0ee7, druntime 94bd5bcb, phobos 3a1cd9a01.
[official-gcc.git] / libphobos / libdruntime / rt / aApplyR.d
blob7f19fa81528752710d9c623d3f268018f5da3a97
1 /**
2 * This code handles decoding UTF strings for foreach_reverse loops. There are
3 * 6 combinations of conversions between char, wchar, and dchar, and 2 of each
4 * of those.
6 * Copyright: Copyright Digital Mars 2004 - 2010.
7 * License: $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
8 * Authors: Walter Bright, Sean Kelly
9 * Source: $(DRUNTIMESRC rt/_aApplyR.d)
11 module rt.aApplyR;
13 import core.internal.utf;
15 /**********************************************/
16 /* 1 argument versions */
18 // dg is D, but _aApplyRcd() is C
19 extern (D) alias int delegate(void *) dg_t;
21 extern (C) int _aApplyRcd1(in char[] aa, dg_t dg)
22 { int result;
24 debug(apply) printf("_aApplyRcd1(), len = %d\n", aa.length);
25 for (size_t i = aa.length; i != 0; )
26 { dchar d;
28 i--;
29 d = aa[i];
30 if (d & 0x80)
31 { char c = cast(char)d;
32 uint j;
33 uint m = 0x3F;
34 d = 0;
35 while ((c & 0xC0) != 0xC0)
36 { if (i == 0)
37 onUnicodeError("Invalid UTF-8 sequence", 0);
38 i--;
39 d |= (c & 0x3F) << j;
40 j += 6;
41 m >>= 1;
42 c = aa[i];
44 d |= (c & m) << j;
46 result = dg(cast(void *)&d);
47 if (result)
48 break;
50 return result;
53 unittest
55 debug(apply) printf("_aApplyRcd1.unittest\n");
57 auto s = "hello"c[];
58 int i;
60 foreach_reverse (dchar d; s)
62 switch (i)
64 case 0: assert(d == 'o'); break;
65 case 1: assert(d == 'l'); break;
66 case 2: assert(d == 'l'); break;
67 case 3: assert(d == 'e'); break;
68 case 4: assert(d == 'h'); break;
69 default: assert(0);
71 i++;
73 assert(i == 5);
75 s = "a\u1234\U000A0456b";
76 i = 0;
77 foreach_reverse (dchar d; s)
79 //printf("i = %d, d = %x\n", i, d);
80 switch (i)
82 case 0: assert(d == 'b'); break;
83 case 1: assert(d == '\U000A0456'); break;
84 case 2: assert(d == '\u1234'); break;
85 case 3: assert(d == 'a'); break;
86 default: assert(0);
88 i++;
90 assert(i == 4);
93 /*****************************/
95 extern (C) int _aApplyRwd1(in wchar[] aa, dg_t dg)
96 { int result;
98 debug(apply) printf("_aApplyRwd1(), len = %d\n", aa.length);
99 for (size_t i = aa.length; i != 0; )
100 { dchar d;
102 i--;
103 d = aa[i];
104 if (d >= 0xDC00 && d <= 0xDFFF)
105 { if (i == 0)
106 onUnicodeError("Invalid UTF-16 sequence", 0);
107 i--;
108 d = ((aa[i] - 0xD7C0) << 10) + (d - 0xDC00);
110 result = dg(cast(void *)&d);
111 if (result)
112 break;
114 return result;
117 unittest
119 debug(apply) printf("_aApplyRwd1.unittest\n");
121 auto s = "hello"w[];
122 int i;
124 foreach_reverse (dchar d; s)
126 switch (i)
128 case 0: assert(d == 'o'); break;
129 case 1: assert(d == 'l'); break;
130 case 2: assert(d == 'l'); break;
131 case 3: assert(d == 'e'); break;
132 case 4: assert(d == 'h'); break;
133 default: assert(0);
135 i++;
137 assert(i == 5);
139 s = "a\u1234\U000A0456b";
140 i = 0;
141 foreach_reverse (dchar d; s)
143 //printf("i = %d, d = %x\n", i, d);
144 switch (i)
146 case 0: assert(d == 'b'); break;
147 case 1: assert(d == '\U000A0456'); break;
148 case 2: assert(d == '\u1234'); break;
149 case 3: assert(d == 'a'); break;
150 default: assert(0);
152 i++;
154 assert(i == 4);
157 /*****************************/
159 extern (C) int _aApplyRcw1(in char[] aa, dg_t dg)
160 { int result;
162 debug(apply) printf("_aApplyRcw1(), len = %d\n", aa.length);
163 for (size_t i = aa.length; i != 0; )
164 { dchar d;
165 wchar w;
167 i--;
168 w = aa[i];
169 if (w & 0x80)
170 { char c = cast(char)w;
171 uint j;
172 uint m = 0x3F;
173 d = 0;
174 while ((c & 0xC0) != 0xC0)
175 { if (i == 0)
176 onUnicodeError("Invalid UTF-8 sequence", 0);
177 i--;
178 d |= (c & 0x3F) << j;
179 j += 6;
180 m >>= 1;
181 c = aa[i];
183 d |= (c & m) << j;
185 if (d <= 0xFFFF)
186 w = cast(wchar) d;
187 else
189 w = cast(wchar) ((((d - 0x10000) >> 10) & 0x3FF) + 0xD800);
190 result = dg(cast(void *)&w);
191 if (result)
192 break;
193 w = cast(wchar) (((d - 0x10000) & 0x3FF) + 0xDC00);
196 result = dg(cast(void *)&w);
197 if (result)
198 break;
200 return result;
203 unittest
205 debug(apply) printf("_aApplyRcw1.unittest\n");
207 auto s = "hello"c[];
208 int i;
210 foreach_reverse (wchar d; s)
212 switch (i)
214 case 0: assert(d == 'o'); break;
215 case 1: assert(d == 'l'); break;
216 case 2: assert(d == 'l'); break;
217 case 3: assert(d == 'e'); break;
218 case 4: assert(d == 'h'); break;
219 default: assert(0);
221 i++;
223 assert(i == 5);
225 s = "a\u1234\U000A0456b";
226 i = 0;
227 foreach_reverse (wchar d; s)
229 //printf("i = %d, d = %x\n", i, d);
230 switch (i)
232 case 0: assert(d == 'b'); break;
233 case 1: assert(d == 0xDA41); break;
234 case 2: assert(d == 0xDC56); break;
235 case 3: assert(d == 0x1234); break;
236 case 4: assert(d == 'a'); break;
237 default: assert(0);
239 i++;
241 assert(i == 5);
244 /*****************************/
246 extern (C) int _aApplyRwc1(in wchar[] aa, dg_t dg)
247 { int result;
249 debug(apply) printf("_aApplyRwc1(), len = %d\n", aa.length);
250 for (size_t i = aa.length; i != 0; )
251 { dchar d;
252 char c;
254 i--;
255 d = aa[i];
256 if (d >= 0xDC00 && d <= 0xDFFF)
257 { if (i == 0)
258 onUnicodeError("Invalid UTF-16 sequence", 0);
259 i--;
260 d = ((aa[i] - 0xD7C0) << 10) + (d - 0xDC00);
263 if (d & ~0x7F)
265 char[4] buf = void;
267 auto b = toUTF8(buf, d);
268 foreach (char c2; b)
270 result = dg(cast(void *)&c2);
271 if (result)
272 return result;
274 continue;
276 c = cast(char)d;
277 result = dg(cast(void *)&c);
278 if (result)
279 break;
281 return result;
284 unittest
286 debug(apply) printf("_aApplyRwc1.unittest\n");
288 auto s = "hello"w[];
289 int i;
291 foreach_reverse (char d; s)
293 switch (i)
295 case 0: assert(d == 'o'); break;
296 case 1: assert(d == 'l'); break;
297 case 2: assert(d == 'l'); break;
298 case 3: assert(d == 'e'); break;
299 case 4: assert(d == 'h'); break;
300 default: assert(0);
302 i++;
304 assert(i == 5);
306 s = "a\u1234\U000A0456b";
307 i = 0;
308 foreach_reverse (char d; s)
310 //printf("i = %d, d = %x\n", i, d);
311 switch (i)
313 case 0: assert(d == 'b'); break;
314 case 1: assert(d == 0xF2); break;
315 case 2: assert(d == 0xA0); break;
316 case 3: assert(d == 0x91); break;
317 case 4: assert(d == 0x96); break;
318 case 5: assert(d == 0xE1); break;
319 case 6: assert(d == 0x88); break;
320 case 7: assert(d == 0xB4); break;
321 case 8: assert(d == 'a'); break;
322 default: assert(0);
324 i++;
326 assert(i == 9);
329 /*****************************/
331 extern (C) int _aApplyRdc1(in dchar[] aa, dg_t dg)
332 { int result;
334 debug(apply) printf("_aApplyRdc1(), len = %d\n", aa.length);
335 for (size_t i = aa.length; i != 0;)
336 { dchar d = aa[--i];
337 char c;
339 if (d & ~0x7F)
341 char[4] buf = void;
343 auto b = toUTF8(buf, d);
344 foreach (char c2; b)
346 result = dg(cast(void *)&c2);
347 if (result)
348 return result;
350 continue;
352 else
354 c = cast(char)d;
356 result = dg(cast(void *)&c);
357 if (result)
358 break;
360 return result;
363 unittest
365 debug(apply) printf("_aApplyRdc1.unittest\n");
367 auto s = "hello"d[];
368 int i;
370 foreach_reverse (char d; s)
372 switch (i)
374 case 0: assert(d == 'o'); break;
375 case 1: assert(d == 'l'); break;
376 case 2: assert(d == 'l'); break;
377 case 3: assert(d == 'e'); break;
378 case 4: assert(d == 'h'); break;
379 default: assert(0);
381 i++;
383 assert(i == 5);
385 s = "a\u1234\U000A0456b";
386 i = 0;
387 foreach_reverse (char d; s)
389 //printf("i = %d, d = %x\n", i, d);
390 switch (i)
392 case 0: assert(d == 'b'); break;
393 case 1: assert(d == 0xF2); break;
394 case 2: assert(d == 0xA0); break;
395 case 3: assert(d == 0x91); break;
396 case 4: assert(d == 0x96); break;
397 case 5: assert(d == 0xE1); break;
398 case 6: assert(d == 0x88); break;
399 case 7: assert(d == 0xB4); break;
400 case 8: assert(d == 'a'); break;
401 default: assert(0);
403 i++;
405 assert(i == 9);
408 /*****************************/
410 extern (C) int _aApplyRdw1(in dchar[] aa, dg_t dg)
411 { int result;
413 debug(apply) printf("_aApplyRdw1(), len = %d\n", aa.length);
414 for (size_t i = aa.length; i != 0; )
415 { dchar d = aa[--i];
416 wchar w;
418 if (d <= 0xFFFF)
419 w = cast(wchar) d;
420 else
422 w = cast(wchar) ((((d - 0x10000) >> 10) & 0x3FF) + 0xD800);
423 result = dg(cast(void *)&w);
424 if (result)
425 break;
426 w = cast(wchar) (((d - 0x10000) & 0x3FF) + 0xDC00);
428 result = dg(cast(void *)&w);
429 if (result)
430 break;
432 return result;
435 unittest
437 debug(apply) printf("_aApplyRdw1.unittest\n");
439 auto s = "hello"d[];
440 int i;
442 foreach_reverse (wchar d; s)
444 switch (i)
446 case 0: assert(d == 'o'); break;
447 case 1: assert(d == 'l'); break;
448 case 2: assert(d == 'l'); break;
449 case 3: assert(d == 'e'); break;
450 case 4: assert(d == 'h'); break;
451 default: assert(0);
453 i++;
455 assert(i == 5);
457 s = "a\u1234\U000A0456b";
458 i = 0;
459 foreach_reverse (wchar d; s)
461 //printf("i = %d, d = %x\n", i, d);
462 switch (i)
464 case 0: assert(d == 'b'); break;
465 case 1: assert(d == 0xDA41); break;
466 case 2: assert(d == 0xDC56); break;
467 case 3: assert(d == 0x1234); break;
468 case 4: assert(d == 'a'); break;
469 default: assert(0);
471 i++;
473 assert(i == 5);
477 /****************************************************************************/
478 /* 2 argument versions */
480 // dg is D, but _aApplyRcd2() is C
481 extern (D) alias int delegate(void *, void *) dg2_t;
483 extern (C) int _aApplyRcd2(in char[] aa, dg2_t dg)
484 { int result;
485 size_t i;
486 size_t len = aa.length;
488 debug(apply) printf("_aApplyRcd2(), len = %d\n", len);
489 for (i = len; i != 0; )
490 { dchar d;
492 i--;
493 d = aa[i];
494 if (d & 0x80)
495 { char c = cast(char)d;
496 uint j;
497 uint m = 0x3F;
498 d = 0;
499 while ((c & 0xC0) != 0xC0)
500 { if (i == 0)
501 onUnicodeError("Invalid UTF-8 sequence", 0);
502 i--;
503 d |= (c & 0x3F) << j;
504 j += 6;
505 m >>= 1;
506 c = aa[i];
508 d |= (c & m) << j;
510 result = dg(&i, cast(void *)&d);
511 if (result)
512 break;
514 return result;
517 unittest
519 debug(apply) printf("_aApplyRcd2.unittest\n");
521 auto s = "hello"c[];
522 int i;
524 foreach_reverse (k, dchar d; s)
526 assert(k == 4 - i);
527 switch (i)
529 case 0: assert(d == 'o'); break;
530 case 1: assert(d == 'l'); break;
531 case 2: assert(d == 'l'); break;
532 case 3: assert(d == 'e'); break;
533 case 4: assert(d == 'h'); break;
534 default: assert(0);
536 i++;
538 assert(i == 5);
540 s = "a\u1234\U000A0456b";
541 i = 0;
542 foreach_reverse (k, dchar d; s)
544 //printf("i = %d, k = %d, d = %x\n", i, k, d);
545 switch (i)
547 case 0: assert(d == 'b'); assert(k == 8); break;
548 case 1: assert(d == '\U000A0456'); assert(k == 4); break;
549 case 2: assert(d == '\u1234'); assert(k == 1); break;
550 case 3: assert(d == 'a'); assert(k == 0); break;
551 default: assert(0);
553 i++;
555 assert(i == 4);
558 /*****************************/
560 extern (C) int _aApplyRwd2(in wchar[] aa, dg2_t dg)
561 { int result;
563 debug(apply) printf("_aApplyRwd2(), len = %d\n", aa.length);
564 for (size_t i = aa.length; i != 0; )
565 { dchar d;
567 i--;
568 d = aa[i];
569 if (d >= 0xDC00 && d <= 0xDFFF)
570 { if (i == 0)
571 onUnicodeError("Invalid UTF-16 sequence", 0);
572 i--;
573 d = ((aa[i] - 0xD7C0) << 10) + (d - 0xDC00);
575 result = dg(&i, cast(void *)&d);
576 if (result)
577 break;
579 return result;
582 unittest
584 debug(apply) printf("_aApplyRwd2.unittest\n");
586 auto s = "hello"w[];
587 int i;
589 foreach_reverse (k, dchar d; s)
591 //printf("i = %d, k = %d, d = %x\n", i, k, d);
592 assert(k == 4 - i);
593 switch (i)
595 case 0: assert(d == 'o'); break;
596 case 1: assert(d == 'l'); break;
597 case 2: assert(d == 'l'); break;
598 case 3: assert(d == 'e'); break;
599 case 4: assert(d == 'h'); break;
600 default: assert(0);
602 i++;
604 assert(i == 5);
606 s = "a\u1234\U000A0456b";
607 i = 0;
608 foreach_reverse (k, dchar d; s)
610 //printf("i = %d, k = %d, d = %x\n", i, k, d);
611 switch (i)
613 case 0: assert(k == 4); assert(d == 'b'); break;
614 case 1: assert(k == 2); assert(d == '\U000A0456'); break;
615 case 2: assert(k == 1); assert(d == '\u1234'); break;
616 case 3: assert(k == 0); assert(d == 'a'); break;
617 default: assert(0);
619 i++;
621 assert(i == 4);
624 /*****************************/
626 extern (C) int _aApplyRcw2(in char[] aa, dg2_t dg)
627 { int result;
629 debug(apply) printf("_aApplyRcw2(), len = %d\n", aa.length);
630 for (size_t i = aa.length; i != 0; )
631 { dchar d;
632 wchar w;
634 i--;
635 w = aa[i];
636 if (w & 0x80)
637 { char c = cast(char)w;
638 uint j;
639 uint m = 0x3F;
640 d = 0;
641 while ((c & 0xC0) != 0xC0)
642 { if (i == 0)
643 onUnicodeError("Invalid UTF-8 sequence", 0);
644 i--;
645 d |= (c & 0x3F) << j;
646 j += 6;
647 m >>= 1;
648 c = aa[i];
650 d |= (c & m) << j;
652 if (d <= 0xFFFF)
653 w = cast(wchar) d;
654 else
656 w = cast(wchar) ((((d - 0x10000) >> 10) & 0x3FF) + 0xD800);
657 result = dg(&i, cast(void *)&w);
658 if (result)
659 break;
660 w = cast(wchar) (((d - 0x10000) & 0x3FF) + 0xDC00);
663 result = dg(&i, cast(void *)&w);
664 if (result)
665 break;
667 return result;
670 unittest
672 debug(apply) printf("_aApplyRcw2.unittest\n");
674 auto s = "hello"c[];
675 int i;
677 foreach_reverse (k, wchar d; s)
679 //printf("i = %d, k = %d, d = %x\n", i, k, d);
680 assert(k == 4 - i);
681 switch (i)
683 case 0: assert(d == 'o'); break;
684 case 1: assert(d == 'l'); break;
685 case 2: assert(d == 'l'); break;
686 case 3: assert(d == 'e'); break;
687 case 4: assert(d == 'h'); break;
688 default: assert(0);
690 i++;
692 assert(i == 5);
694 s = "a\u1234\U000A0456b";
695 i = 0;
696 foreach_reverse (k, wchar d; s)
698 //printf("i = %d, k = %d, d = %x\n", i, k, d);
699 switch (i)
701 case 0: assert(k == 8); assert(d == 'b'); break;
702 case 1: assert(k == 4); assert(d == 0xDA41); break;
703 case 2: assert(k == 4); assert(d == 0xDC56); break;
704 case 3: assert(k == 1); assert(d == 0x1234); break;
705 case 4: assert(k == 0); assert(d == 'a'); break;
706 default: assert(0);
708 i++;
710 assert(i == 5);
713 /*****************************/
715 extern (C) int _aApplyRwc2(in wchar[] aa, dg2_t dg)
716 { int result;
718 debug(apply) printf("_aApplyRwc2(), len = %d\n", aa.length);
719 for (size_t i = aa.length; i != 0; )
720 { dchar d;
721 char c;
723 i--;
724 d = aa[i];
725 if (d >= 0xDC00 && d <= 0xDFFF)
726 { if (i == 0)
727 onUnicodeError("Invalid UTF-16 sequence", 0);
728 i--;
729 d = ((aa[i] - 0xD7C0) << 10) + (d - 0xDC00);
732 if (d & ~0x7F)
734 char[4] buf = void;
736 auto b = toUTF8(buf, d);
737 foreach (char c2; b)
739 result = dg(&i, cast(void *)&c2);
740 if (result)
741 return result;
743 continue;
745 c = cast(char)d;
746 result = dg(&i, cast(void *)&c);
747 if (result)
748 break;
750 return result;
753 unittest
755 debug(apply) printf("_aApplyRwc2.unittest\n");
757 auto s = "hello"w[];
758 int i;
760 foreach_reverse (k, char d; s)
762 //printf("i = %d, k = %d, d = %x\n", i, k, d);
763 assert(k == 4 - i);
764 switch (i)
766 case 0: assert(d == 'o'); break;
767 case 1: assert(d == 'l'); break;
768 case 2: assert(d == 'l'); break;
769 case 3: assert(d == 'e'); break;
770 case 4: assert(d == 'h'); break;
771 default: assert(0);
773 i++;
775 assert(i == 5);
777 s = "a\u1234\U000A0456b";
778 i = 0;
779 foreach_reverse (k, char d; s)
781 //printf("i = %d, k = %d, d = %x\n", i, k, d);
782 switch (i)
784 case 0: assert(k == 4); assert(d == 'b'); break;
785 case 1: assert(k == 2); assert(d == 0xF2); break;
786 case 2: assert(k == 2); assert(d == 0xA0); break;
787 case 3: assert(k == 2); assert(d == 0x91); break;
788 case 4: assert(k == 2); assert(d == 0x96); break;
789 case 5: assert(k == 1); assert(d == 0xE1); break;
790 case 6: assert(k == 1); assert(d == 0x88); break;
791 case 7: assert(k == 1); assert(d == 0xB4); break;
792 case 8: assert(k == 0); assert(d == 'a'); break;
793 default: assert(0);
795 i++;
797 assert(i == 9);
800 /*****************************/
802 extern (C) int _aApplyRdc2(in dchar[] aa, dg2_t dg)
803 { int result;
805 debug(apply) printf("_aApplyRdc2(), len = %d\n", aa.length);
806 for (size_t i = aa.length; i != 0; )
807 { dchar d = aa[--i];
808 char c;
810 if (d & ~0x7F)
812 char[4] buf = void;
814 auto b = toUTF8(buf, d);
815 foreach (char c2; b)
817 result = dg(&i, cast(void *)&c2);
818 if (result)
819 return result;
821 continue;
823 else
824 { c = cast(char)d;
826 result = dg(&i, cast(void *)&c);
827 if (result)
828 break;
830 return result;
833 unittest
835 debug(apply) printf("_aApplyRdc2.unittest\n");
837 auto s = "hello"d[];
838 int i;
840 foreach_reverse (k, char d; s)
842 //printf("i = %d, k = %d, d = %x\n", i, k, d);
843 assert(k == 4 - i);
844 switch (i)
846 case 0: assert(d == 'o'); break;
847 case 1: assert(d == 'l'); break;
848 case 2: assert(d == 'l'); break;
849 case 3: assert(d == 'e'); break;
850 case 4: assert(d == 'h'); break;
851 default: assert(0);
853 i++;
855 assert(i == 5);
857 s = "a\u1234\U000A0456b";
858 i = 0;
859 foreach_reverse (k, char d; s)
861 //printf("i = %d, k = %d, d = %x\n", i, k, d);
862 switch (i)
864 case 0: assert(k == 3); assert(d == 'b'); break;
865 case 1: assert(k == 2); assert(d == 0xF2); break;
866 case 2: assert(k == 2); assert(d == 0xA0); break;
867 case 3: assert(k == 2); assert(d == 0x91); break;
868 case 4: assert(k == 2); assert(d == 0x96); break;
869 case 5: assert(k == 1); assert(d == 0xE1); break;
870 case 6: assert(k == 1); assert(d == 0x88); break;
871 case 7: assert(k == 1); assert(d == 0xB4); break;
872 case 8: assert(k == 0); assert(d == 'a'); break;
873 default: assert(0);
875 i++;
877 assert(i == 9);
880 /*****************************/
882 extern (C) int _aApplyRdw2(in dchar[] aa, dg2_t dg)
883 { int result;
885 debug(apply) printf("_aApplyRdw2(), len = %d\n", aa.length);
886 for (size_t i = aa.length; i != 0; )
887 { dchar d = aa[--i];
888 wchar w;
890 if (d <= 0xFFFF)
891 w = cast(wchar) d;
892 else
894 w = cast(wchar) ((((d - 0x10000) >> 10) & 0x3FF) + 0xD800);
895 result = dg(&i, cast(void *)&w);
896 if (result)
897 break;
898 w = cast(wchar) (((d - 0x10000) & 0x3FF) + 0xDC00);
900 result = dg(&i, cast(void *)&w);
901 if (result)
902 break;
904 return result;
907 unittest
909 debug(apply) printf("_aApplyRdw2.unittest\n");
911 auto s = "hello"d[];
912 int i;
914 foreach_reverse (k, wchar d; s)
916 //printf("i = %d, k = %d, d = %x\n", i, k, d);
917 assert(k == 4 - i);
918 switch (i)
920 case 0: assert(d == 'o'); break;
921 case 1: assert(d == 'l'); break;
922 case 2: assert(d == 'l'); break;
923 case 3: assert(d == 'e'); break;
924 case 4: assert(d == 'h'); break;
925 default: assert(0);
927 i++;
929 assert(i == 5);
931 s = "a\u1234\U000A0456b";
932 i = 0;
933 foreach_reverse (k, wchar d; s)
935 //printf("i = %d, k = %d, d = %x\n", i, k, d);
936 switch (i)
938 case 0: assert(k == 3); assert(d == 'b'); break;
939 case 1: assert(k == 2); assert(d == 0xDA41); break;
940 case 2: assert(k == 2); assert(d == 0xDC56); break;
941 case 3: assert(k == 1); assert(d == 0x1234); break;
942 case 4: assert(k == 0); assert(d == 'a'); break;
943 default: assert(0);
945 i++;
947 assert(i == 5);