1 /*---------------------------------------------------------------------------*
2   Project: Revolution ENC sample demo
3   File:    unicode.c
4 
5   Copyright 2006 Nintendo.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law. They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Log: unicode.c,v $
14   Revision 1.1  2006/08/11 10:16:58  yoshioka_yasuhiro
15   Initial commit.
16 
17   $NoKeywords: $
18  *---------------------------------------------------------------------------*/
19 
20 #include <revolution.h>
21 #include <revolution/enc.h>
22 
23 static u32 utf32[] = {0x00000041, 0x00000042, 0x00000043, 0x000000C0, 0x000000C1, 0x000000C2, 0x00003042, 0x00003044, 0x00003046, 0x0000FF71, 0x0000FF72, 0x0000FF73, 0x00010000, 0x00000000};
24 static u16 utf16[] = {0x0041, 0x0042, 0x0043, 0x00C0, 0x00C1, 0x00C2, 0x3042, 0x3044, 0x3046, 0xFF71, 0xFF72, 0xFF73, 0xD800, 0xDC00, 0x0000};
25 static u8 utf8[] = {0x41, 0x42, 0x43, 0xC3, 0x80, 0xC3, 0x81, 0xC3, 0x82, 0xE3, 0x81, 0x82, 0xE3, 0x81, 0x84, 0xE3, 0x81, 0x86, 0xEF, 0xBD, 0xB1, 0xEF, 0xBD, 0xB2, 0xEF, 0xBD, 0xB3, 0xF0, 0x90, 0x80, 0x80, 0x00};
26 
main()27 int main()
28 {
29     #define LENGTH 32
30     BOOL test_clear = TRUE;
31     s32 srclen, dstlen;
32     ENCResult err_code;
33 
34     /* UTF32 str -> UTF16 str */
35     OSReport("\n* UTF32 str -> UTF16 str *\n");
36     srclen = -1;
37     err_code = ENCConvertStringUtf32ToUtf16(NULL, &dstlen, utf32, &srclen);
38     if (err_code)
39     {
40         OSReport("ERROR: %d\n", err_code);
41         OSReport("dstlen: %d, srclen: %d\n", dstlen, srclen);
42         test_clear = FALSE;
43     }
44     else
45     {
46         u16 dst[LENGTH];
47         OSReport("dstlen: %d, srclen: %d\n", dstlen, srclen);
48         err_code = ENCConvertStringUtf32ToUtf16(dst, &dstlen, utf32, &srclen);
49         if (err_code)
50         {
51             OSReport("ERROR: %d\n", err_code);
52             OSReport("dstlen: %d, srclen: %d\n", dstlen, srclen);
53             test_clear = FALSE;
54         }
55         else
56         {
57             s32 i, j;
58             OSReport("dstlen: %d, srclen: %d\n", dstlen, srclen);
59             for (i = 0; i < dstlen; ++i)
60             {
61                 if (dst[i] == utf16[i])
62                     continue;
63                 OSReport("FAILURE\nend @ %d\n", i);
64                 OSReport("result\tanswer\n");
65                 for (j = 0; j < 8; ++j)
66                     OSReport("%#x\t%#x\n", dst[i + j], utf16[i + j]);
67                 test_clear = FALSE;
68                 break;
69             }
70             if (i == dstlen)
71             {
72                 OSReport("SUCCESS\nend @ %d\n", i - 1);
73             }
74         }
75     }
76 
77     /* UTF16 str -> UTF32 str */
78     OSReport("\n* UTF16 str -> UTF32 str *\n");
79     srclen = -1;
80     err_code = ENCConvertStringUtf16ToUtf32(NULL, &dstlen, utf16, &srclen);
81     if (err_code)
82     {
83         OSReport("ERROR: %d\n", err_code);
84         OSReport("dstlen: %d, srclen: %d\n", dstlen, srclen);
85         test_clear = FALSE;
86     }
87     else
88     {
89         u32 dst[LENGTH];
90         OSReport("dstlen: %d, srclen: %d\n", dstlen, srclen);
91         err_code = ENCConvertStringUtf16ToUtf32(dst, &dstlen, utf16, &srclen);
92         if (err_code)
93         {
94             OSReport("ERROR: %d\n", err_code);
95             OSReport("dstlen: %d, srclen: %d\n", dstlen, srclen);
96             test_clear = FALSE;
97         }
98         else
99         {
100             s32 i, j;
101             OSReport("dstlen: %d, srclen: %d\n", dstlen, srclen);
102             for (i = 0; i < dstlen; ++i)
103             {
104                 if (dst[i] == utf32[i])
105                     continue;
106                 OSReport("FAILURE\nend @ %d\n", i);
107                 OSReport("result\tanswer\n");
108                 for (j = 0; j < 8; ++j)
109                     OSReport("%#x\t%#x\n", dst[i + j], utf32[i + j]);
110                 test_clear = FALSE;
111                 break;
112             }
113             if (i == dstlen)
114             {
115                 OSReport("SUCCESS\nend @ %d\n", i - 1);
116             }
117         }
118     }
119 
120     /* UTF32 str -> UTF8 str */
121     OSReport("\n* UTF32 str -> UTF8 str *\n");
122     srclen = -1;
123     err_code = ENCConvertStringUtf32ToUtf8(NULL, &dstlen, utf32, &srclen);
124     if (err_code)
125     {
126         OSReport("ERROR: %d\n", err_code);
127         OSReport("dstlen: %d, srclen: %d\n", dstlen, srclen);
128         test_clear = FALSE;
129     }
130     else
131     {
132         u8 dst[LENGTH];
133         OSReport("dstlen: %d, srclen: %d\n", dstlen, srclen);
134         err_code = ENCConvertStringUtf32ToUtf8(dst, &dstlen, utf32, &srclen);
135         if (err_code)
136         {
137             OSReport("ERROR: %d\n", err_code);
138             OSReport("dstlen: %d, srclen: %d\n", dstlen, srclen);
139             test_clear = FALSE;
140         }
141         else
142         {
143             s32 i, j;
144             OSReport("dstlen: %d, srclen: %d\n", dstlen, srclen);
145             for (i = 0; i < dstlen; ++i)
146             {
147                 if (dst[i] == utf8[i])
148                     continue;
149                 OSReport("FAILURE\nend @ %d\n", i);
150                 OSReport("result\tanswer\n");
151                 for (j = 0; j < 8; ++j)
152                     OSReport("%#x\t%#x\n", dst[i + j], utf8[i + j]);
153                 test_clear = FALSE;
154                 break;
155             }
156             if (i == dstlen)
157             {
158                 OSReport("SUCCESS\nend @ %d\n", i - 1);
159             }
160         }
161     }
162 
163     /* UTF8 str -> UTF32 str */
164     OSReport("\n* UTF8 str -> UTF32 str *\n");
165     srclen = -1;
166     err_code = ENCConvertStringUtf8ToUtf32(NULL, &dstlen, utf8, &srclen);
167     if (err_code)
168     {
169         OSReport("ERROR: %d\n", err_code);
170         OSReport("dstlen: %d, srclen: %d\n", dstlen, srclen);
171         test_clear = FALSE;
172     }
173     else
174     {
175         u32 dst[LENGTH];
176         OSReport("dstlen: %d, srclen: %d\n", dstlen, srclen);
177         err_code = ENCConvertStringUtf8ToUtf32(dst, &dstlen, utf8, &srclen);
178         if (err_code)
179         {
180             OSReport("ERROR: %d\n", err_code);
181             OSReport("dstlen: %d, srclen: %d\n", dstlen, srclen);
182             test_clear = FALSE;
183         }
184         else
185         {
186             s32 i, j;
187             OSReport("dstlen: %d, srclen: %d\n", dstlen, srclen);
188             for (i = 0; i < dstlen; ++i)
189             {
190                 if (dst[i] == utf32[i])
191                     continue;
192                 OSReport("FAILURE\nend @ %d\n", i);
193                 OSReport("result\tanswer\n");
194                 for (j = 0; j < 8; ++j)
195                     OSReport("%#x\t%#x\n", dst[i + j], utf32[i + j]);
196                 test_clear = FALSE;
197                 break;
198             }
199             if (i == dstlen)
200             {
201                 OSReport("SUCCESS\nend @ %d\n", i - 1);
202             }
203         }
204     }
205 
206     /* UTF16 str -> UTF8 str */
207     OSReport("\n* UTF16 str -> UTF8 str *\n");
208     srclen = -1;
209     err_code = ENCConvertStringUtf16ToUtf8(NULL, &dstlen, utf16, &srclen);
210     if (err_code)
211     {
212         OSReport("ERROR: %d\n", err_code);
213         OSReport("dstlen: %d, srclen: %d\n", dstlen, srclen);
214         test_clear = FALSE;
215     }
216     else
217     {
218         u8 dst[LENGTH];
219         OSReport("dstlen: %d, srclen: %d\n", dstlen, srclen);
220         err_code = ENCConvertStringUtf16ToUtf8(dst, &dstlen, utf16, &srclen);
221         if (err_code)
222         {
223             OSReport("ERROR: %d\n", err_code);
224             OSReport("dstlen: %d, srclen: %d\n", dstlen, srclen);
225             test_clear = FALSE;
226         }
227         else
228         {
229             s16 i, j;
230             OSReport("dstlen: %d, srclen: %d\n", dstlen, srclen);
231             for (i = 0; i < dstlen; ++i)
232             {
233                 if (dst[i] == utf8[i])
234                     continue;
235                 OSReport("FAILURE\nend @ %d\n", i);
236                 OSReport("result\tanswer\n");
237                 for (j = 0; j < 8; ++j)
238                     OSReport("%#x\t%#x\n", dst[i + j], utf8[i + j]);
239                 test_clear = FALSE;
240                 break;
241             }
242             if (i == dstlen)
243             {
244                 OSReport("SUCCESS\nend @ %d\n", i - 1);
245             }
246         }
247     }
248 
249     /* UTF8 str -> UTF16 str */
250     OSReport("\n* UTF8 str -> UTF16 str *\n");
251     srclen = -1;
252     err_code = ENCConvertStringUtf8ToUtf16(NULL, &dstlen, utf8, &srclen);
253     if (err_code)
254     {
255         OSReport("ERROR: %d\n", err_code);
256         OSReport("dstlen: %d, srclen: %d\n", dstlen, srclen);
257         test_clear = FALSE;
258     }
259     else
260     {
261         u16 dst[LENGTH];
262         OSReport("dstlen: %d, srclen: %d\n", dstlen, srclen);
263         err_code = ENCConvertStringUtf8ToUtf16(dst, &dstlen, utf8, &srclen);
264         if (err_code)
265         {
266             OSReport("ERROR: %d\n", err_code);
267             OSReport("dstlen: %d, srclen: %d\n", dstlen, srclen);
268             test_clear = FALSE;
269         }
270         else
271         {
272             s16 i, j;
273             OSReport("dstlen: %d, srclen: %d\n", dstlen, srclen);
274             for (i = 0; i < dstlen; ++i)
275             {
276                 if (dst[i] == utf16[i])
277                     continue;
278                 OSReport("FAILURE\nend @ %d\n", i);
279                 OSReport("result\tanswer\n");
280                 for (j = 0; j < 8; ++j)
281                     OSReport("%#x\t%#x\n", dst[i + j], utf16[i + j]);
282                 test_clear = FALSE;
283                 break;
284             }
285             if (i == dstlen)
286             {
287                 OSReport("SUCCESS\nend @ %d\n", i - 1);
288             }
289         }
290     }
291 
292     if (test_clear)
293         OSReport("\nTOTAL SUCCESS\n");
294     else
295         OSReport("\nTOTAL FAILURE\n");
296 
297     return 0;
298 }