]> git.saurik.com Git - apple/icu.git/blame_incremental - icuSources/test/cintltst/nccbtst.c
ICU-66108.tar.gz
[apple/icu.git] / icuSources / test / cintltst / nccbtst.c
... / ...
CommitLineData
1// © 2016 and later: Unicode, Inc. and others.
2// License & terms of use: http://www.unicode.org/copyright.html
3/********************************************************************
4 * COPYRIGHT:
5 * Copyright (c) 1997-2016, International Business Machines Corporation and
6 * others. All Rights Reserved.
7 ********************************************************************/
8/*
9********************************************************************************
10* File NCCBTST.C
11*
12* Modification History:
13* Name Description
14* Madhu Katragadda 7/21/1999 Testing error callback routines
15********************************************************************************
16*/
17#include <stdio.h>
18#include <stdlib.h>
19#include <string.h>
20#include <ctype.h>
21#include "cmemory.h"
22#include "cstring.h"
23#include "unicode/uloc.h"
24#include "unicode/ucnv.h"
25#include "unicode/ucnv_err.h"
26#include "cintltst.h"
27#include "unicode/utypes.h"
28#include "unicode/ustring.h"
29#include "nccbtst.h"
30#include "unicode/ucnv_cb.h"
31#include "unicode/utf16.h"
32
33#define NEW_MAX_BUFFER 999
34
35#define nct_min(x,y) ((x<y) ? x : y)
36
37static int32_t gInBufferSize = 0;
38static int32_t gOutBufferSize = 0;
39static char gNuConvTestName[1024];
40
41static void printSeq(const uint8_t* a, int len)
42{
43 int i=0;
44 log_verbose("\n{");
45 while (i<len)
46 log_verbose("0x%02X, ", a[i++]);
47 log_verbose("}\n");
48}
49
50static void printUSeq(const UChar* a, int len)
51{
52 int i=0;
53 log_verbose("{");
54 while (i<len)
55 log_verbose(" 0x%04x, ", a[i++]);
56 log_verbose("}\n");
57}
58
59static void printSeqErr(const uint8_t* a, int len)
60{
61 int i=0;
62 fprintf(stderr, "{");
63 while (i<len)
64 fprintf(stderr, " 0x%02x, ", a[i++]);
65 fprintf(stderr, "}\n");
66}
67
68static void printUSeqErr(const UChar* a, int len)
69{
70 int i=0;
71 fprintf(stderr, "{");
72 while (i<len)
73 fprintf(stderr, "0x%04x, ", a[i++]);
74 fprintf(stderr,"}\n");
75}
76
77static void setNuConvTestName(const char *codepage, const char *direction)
78{
79 sprintf(gNuConvTestName, "[testing %s %s Unicode, InputBufSiz=%d, OutputBufSiz=%d]",
80 codepage,
81 direction,
82 (int)gInBufferSize,
83 (int)gOutBufferSize);
84}
85
86
87static void TestCallBackFailure(void);
88
89void addTestConvertErrorCallBack(TestNode** root);
90
91void addTestConvertErrorCallBack(TestNode** root)
92{
93 addTest(root, &TestSkipCallBack, "tsconv/nccbtst/TestSkipCallBack");
94 addTest(root, &TestStopCallBack, "tsconv/nccbtst/TestStopCallBack");
95 addTest(root, &TestSubCallBack, "tsconv/nccbtst/TestSubCallBack");
96 addTest(root, &TestSubWithValueCallBack, "tsconv/nccbtst/TestSubWithValueCallBack");
97
98#if !UCONFIG_NO_LEGACY_CONVERSION
99 addTest(root, &TestLegalAndOtherCallBack, "tsconv/nccbtst/TestLegalAndOtherCallBack");
100 addTest(root, &TestSingleByteCallBack, "tsconv/nccbtst/TestSingleByteCallBack");
101#endif
102
103 addTest(root, &TestCallBackFailure, "tsconv/nccbtst/TestCallBackFailure");
104}
105
106static void TestSkipCallBack()
107{
108 TestSkip(NEW_MAX_BUFFER, NEW_MAX_BUFFER);
109 TestSkip(1,NEW_MAX_BUFFER);
110 TestSkip(1,1);
111 TestSkip(NEW_MAX_BUFFER, 1);
112}
113
114static void TestStopCallBack()
115{
116 TestStop(NEW_MAX_BUFFER, NEW_MAX_BUFFER);
117 TestStop(1,NEW_MAX_BUFFER);
118 TestStop(1,1);
119 TestStop(NEW_MAX_BUFFER, 1);
120}
121
122static void TestSubCallBack()
123{
124 TestSub(NEW_MAX_BUFFER, NEW_MAX_BUFFER);
125 TestSub(1,NEW_MAX_BUFFER);
126 TestSub(1,1);
127 TestSub(NEW_MAX_BUFFER, 1);
128
129#if !UCONFIG_NO_LEGACY_CONVERSION
130 TestEBCDIC_STATEFUL_Sub(1, 1);
131 TestEBCDIC_STATEFUL_Sub(1, NEW_MAX_BUFFER);
132 TestEBCDIC_STATEFUL_Sub(NEW_MAX_BUFFER, 1);
133 TestEBCDIC_STATEFUL_Sub(NEW_MAX_BUFFER, NEW_MAX_BUFFER);
134#endif
135}
136
137static void TestSubWithValueCallBack()
138{
139 TestSubWithValue(NEW_MAX_BUFFER, NEW_MAX_BUFFER);
140 TestSubWithValue(1,NEW_MAX_BUFFER);
141 TestSubWithValue(1,1);
142 TestSubWithValue(NEW_MAX_BUFFER, 1);
143}
144
145#if !UCONFIG_NO_LEGACY_CONVERSION
146static void TestLegalAndOtherCallBack()
147{
148 TestLegalAndOthers(NEW_MAX_BUFFER, NEW_MAX_BUFFER);
149 TestLegalAndOthers(1,NEW_MAX_BUFFER);
150 TestLegalAndOthers(1,1);
151 TestLegalAndOthers(NEW_MAX_BUFFER, 1);
152}
153
154static void TestSingleByteCallBack()
155{
156 TestSingleByte(NEW_MAX_BUFFER, NEW_MAX_BUFFER);
157 TestSingleByte(1,NEW_MAX_BUFFER);
158 TestSingleByte(1,1);
159 TestSingleByte(NEW_MAX_BUFFER, 1);
160}
161#endif
162
163static void TestSkip(int32_t inputsize, int32_t outputsize)
164{
165 static const uint8_t expskipIBM_949[]= {
166 0x00, 0xb0, 0xa1, 0xb0, 0xa2, 0xc8, 0xd3 };
167
168 static const uint8_t expskipIBM_943[] = {
169 0x9f, 0xaf, 0x9f, 0xb1, 0x89, 0x59 };
170
171 static const uint8_t expskipIBM_930[] = {
172 0x0e, 0x5d, 0x5f, 0x5d, 0x63, 0x46, 0x6b, 0x0f };
173
174 gInBufferSize = inputsize;
175 gOutBufferSize = outputsize;
176
177 /*From Unicode*/
178 log_verbose("Testing fromUnicode with UCNV_FROM_U_CALLBACK_SKIP \n");
179
180#if !UCONFIG_NO_LEGACY_CONVERSION
181 {
182 static const UChar sampleText[] = { 0x0000, 0xAC00, 0xAC01, 0xEF67, 0xD700 };
183 static const UChar sampleText2[] = { 0x6D63, 0x6D64, 0x6D65, 0x6D66 };
184
185 static const int32_t toIBM949Offsskip [] = { 0, 1, 1, 2, 2, 4, 4 };
186 static const int32_t toIBM943Offsskip [] = { 0, 0, 1, 1, 3, 3 };
187
188 if(!testConvertFromUnicode(sampleText, UPRV_LENGTHOF(sampleText),
189 expskipIBM_949, UPRV_LENGTHOF(expskipIBM_949), "ibm-949",
190 UCNV_FROM_U_CALLBACK_SKIP, toIBM949Offsskip, NULL, 0 ))
191 log_err("u-> ibm-949 with skip did not match.\n");
192 if(!testConvertFromUnicode(sampleText2, UPRV_LENGTHOF(sampleText2),
193 expskipIBM_943, UPRV_LENGTHOF(expskipIBM_943), "ibm-943",
194 UCNV_FROM_U_CALLBACK_SKIP, toIBM943Offsskip, NULL, 0 ))
195 log_err("u-> ibm-943 with skip did not match.\n");
196 }
197
198 {
199 static const UChar fromU[] = { 0x61, 0xff5e, 0x62, 0x6d63, 0xff5e, 0x6d64, 0x63, 0xff5e, 0x6d66 };
200 static const uint8_t fromUBytes[] = { 0x62, 0x63, 0x0e, 0x5d, 0x5f, 0x5d, 0x63, 0x0f, 0x64, 0x0e, 0x46, 0x6b, 0x0f };
201 static const int32_t fromUOffsets[] = { 0, 2, 3, 3, 3, 5, 5, 6, 6, 8, 8, 8, 8 };
202
203 /* test ibm-930 (EBCDIC_STATEFUL) with fallbacks that are not taken to check correct state transitions */
204 if(!testConvertFromUnicode(fromU, UPRV_LENGTHOF(fromU),
205 fromUBytes, UPRV_LENGTHOF(fromUBytes),
206 "ibm-930",
207 UCNV_FROM_U_CALLBACK_SKIP, fromUOffsets,
208 NULL, 0)
209 ) {
210 log_err("u->ibm-930 with skip with untaken fallbacks did not match.\n");
211 }
212 }
213#endif
214
215 {
216 static const UChar usasciiFromU[] = { 0x61, 0x80, 0x4e00, 0x31, 0xd800, 0xdfff, 0x39 };
217 static const uint8_t usasciiFromUBytes[] = { 0x61, 0x31, 0x39 };
218 static const int32_t usasciiFromUOffsets[] = { 0, 3, 6 };
219
220 static const UChar latin1FromU[] = { 0x61, 0xa0, 0x4e00, 0x31, 0xd800, 0xdfff, 0x39 };
221 static const uint8_t latin1FromUBytes[] = { 0x61, 0xa0, 0x31, 0x39 };
222 static const int32_t latin1FromUOffsets[] = { 0, 1, 3, 6 };
223
224 /* US-ASCII */
225 if(!testConvertFromUnicode(usasciiFromU, UPRV_LENGTHOF(usasciiFromU),
226 usasciiFromUBytes, UPRV_LENGTHOF(usasciiFromUBytes),
227 "US-ASCII",
228 UCNV_FROM_U_CALLBACK_SKIP, usasciiFromUOffsets,
229 NULL, 0)
230 ) {
231 log_err("u->US-ASCII with skip did not match.\n");
232 }
233
234#if !UCONFIG_NO_LEGACY_CONVERSION
235 /* SBCS NLTC codepage 367 for US-ASCII */
236 if(!testConvertFromUnicode(usasciiFromU, UPRV_LENGTHOF(usasciiFromU),
237 usasciiFromUBytes, UPRV_LENGTHOF(usasciiFromUBytes),
238 "ibm-367",
239 UCNV_FROM_U_CALLBACK_SKIP, usasciiFromUOffsets,
240 NULL, 0)
241 ) {
242 log_err("u->ibm-367 with skip did not match.\n");
243 }
244#endif
245
246 /* ISO-Latin-1 */
247 if(!testConvertFromUnicode(latin1FromU, UPRV_LENGTHOF(latin1FromU),
248 latin1FromUBytes, UPRV_LENGTHOF(latin1FromUBytes),
249 "LATIN_1",
250 UCNV_FROM_U_CALLBACK_SKIP, latin1FromUOffsets,
251 NULL, 0)
252 ) {
253 log_err("u->LATIN_1 with skip did not match.\n");
254 }
255
256#if !UCONFIG_NO_LEGACY_CONVERSION
257 /* windows-1252 */
258 if(!testConvertFromUnicode(latin1FromU, UPRV_LENGTHOF(latin1FromU),
259 latin1FromUBytes, UPRV_LENGTHOF(latin1FromUBytes),
260 "windows-1252",
261 UCNV_FROM_U_CALLBACK_SKIP, latin1FromUOffsets,
262 NULL, 0)
263 ) {
264 log_err("u->windows-1252 with skip did not match.\n");
265 }
266 }
267
268 {
269 static const UChar inputTest[] = { 0x0061, 0xd801, 0xdc01, 0xd801, 0x0061 };
270 static const uint8_t toIBM943[]= { 0x61, 0x61 };
271 static const int32_t offset[]= {0, 4};
272
273 /* EUC_JP*/
274 static const UChar euc_jp_inputText[]={ 0x0061, 0x4edd, 0x5bec, 0xd801, 0xdc01, 0xd801, 0x0061, 0x00a2 };
275 static const uint8_t to_euc_jp[]={ 0x61, 0xa1, 0xb8, 0x8f, 0xf4, 0xae,
276 0x61, 0x8e, 0xe0,
277 };
278 static const int32_t fromEUC_JPOffs [] ={ 0, 1, 1, 2, 2, 2, 6, 7, 7};
279
280 /*EUC_TW*/
281 static const UChar euc_tw_inputText[]={ 0x0061, 0x2295, 0x5BF2, 0xd801, 0xdc01, 0xd801, 0x0061, 0x8706, 0x8a, };
282 static const uint8_t to_euc_tw[]={
283 0x61, 0xa2, 0xd3, 0x8e, 0xa2, 0xdc, 0xe5,
284 0x61, 0xe6, 0xca, 0x8a,
285 };
286 static const int32_t from_euc_twOffs [] ={ 0, 1, 1, 2, 2, 2, 2, 6, 7, 7, 8,};
287
288 /*ISO-2022-JP*/
289 static const UChar iso_2022_jp_inputText[]={0x0041, 0x00E9/*unassigned*/,0x0042, };
290 static const uint8_t to_iso_2022_jp[]={
291 0x41,
292 0x42,
293
294 };
295 static const int32_t from_iso_2022_jpOffs [] ={0,2};
296
297 /*ISO-2022-JP*/
298 UChar const iso_2022_jp_inputText2[]={0x0041, 0x00E9/*unassigned*/,0x43,0xd800/*illegal*/,0x0042, };
299 static const uint8_t to_iso_2022_jp2[]={
300 0x41,
301 0x43,
302
303 };
304 static const int32_t from_iso_2022_jpOffs2 [] ={0,2};
305
306 /*ISO-2022-cn*/
307 static const UChar iso_2022_cn_inputText[]={ 0x0041, 0x3712/*unassigned*/, 0x0042, };
308 static const uint8_t to_iso_2022_cn[]={
309 0x41, 0x42
310 };
311 static const int32_t from_iso_2022_cnOffs [] ={
312 0, 2
313 };
314
315 /*ISO-2022-CN*/
316 static const UChar iso_2022_cn_inputText1[]={0x0041, 0x3712/*unassigned*/,0x43,0xd800/*illegal*/,0x0042, };
317 static const uint8_t to_iso_2022_cn1[]={
318 0x41, 0x43
319
320 };
321 static const int32_t from_iso_2022_cnOffs1 [] ={ 0, 2 };
322
323 /*ISO-2022-kr*/
324 static const UChar iso_2022_kr_inputText[]={ 0x0041, 0x03A0,0x3712/*unassigned*/,0x03A0, 0x0042, };
325 static const uint8_t to_iso_2022_kr[]={
326 0x1b, 0x24, 0x29, 0x43,
327 0x41,
328 0x0e, 0x25, 0x50,
329 0x25, 0x50,
330 0x0f, 0x42,
331 };
332 static const int32_t from_iso_2022_krOffs [] ={
333 -1,-1,-1,-1,
334 0,
335 1,1,1,
336 3,3,
337 4,4
338 };
339
340 /*ISO-2022-kr*/
341 static const UChar iso_2022_kr_inputText1[]={ 0x0041, 0x03A0,0x3712/*unassigned*/,0x03A0,0xd801/*illegal*/, 0x0042, };
342 static const uint8_t to_iso_2022_kr1[]={
343 0x1b, 0x24, 0x29, 0x43,
344 0x41,
345 0x0e, 0x25, 0x50,
346 0x25, 0x50,
347
348 };
349 static const int32_t from_iso_2022_krOffs1 [] ={
350 -1,-1,-1,-1,
351 0,
352 1,1,1,
353 3,3,
354
355 };
356 /* HZ encoding */
357 static const UChar hz_inputText[]={ 0x0041, 0x03A0,0x0662/*unassigned*/,0x03A0, 0x0042, };
358
359 static const uint8_t to_hz[]={
360 0x7e, 0x7d, 0x41,
361 0x7e, 0x7b, 0x26, 0x30,
362 0x26, 0x30,
363 0x7e, 0x7d, 0x42,
364
365 };
366 static const int32_t from_hzOffs [] ={
367 0,0,0,
368 1,1,1,1,
369 3,3,
370 4,4,4,4
371 };
372
373 static const UChar hz_inputText1[]={ 0x0041, 0x03A0,0x0662/*unassigned*/,0x03A0,0xd801/*illegal*/, 0x0042, };
374
375 static const uint8_t to_hz1[]={
376 0x7e, 0x7d, 0x41,
377 0x7e, 0x7b, 0x26, 0x30,
378 0x26, 0x30,
379
380
381 };
382 static const int32_t from_hzOffs1 [] ={
383 0,0,0,
384 1,1,1,1,
385 3,3,
386
387 };
388
389#endif
390
391 static const UChar SCSU_inputText[]={ 0x0041, 0xd801/*illegal*/, 0x0042, };
392
393 static const uint8_t to_SCSU[]={
394 0x41,
395 0x42
396
397
398 };
399 static const int32_t from_SCSUOffs [] ={
400 0,
401 2,
402
403 };
404
405#if !UCONFIG_NO_LEGACY_CONVERSION
406 /* ISCII */
407 static const UChar iscii_inputText[]={ 0x0041, 0x3712/*unassigned*/, 0x0042, };
408 static const uint8_t to_iscii[]={
409 0x41,
410 0x42,
411 };
412 static const int32_t from_isciiOffs [] ={
413 0,2,
414
415 };
416 /*ISCII*/
417 static const UChar iscii_inputText1[]={0x0044, 0x3712/*unassigned*/,0x43,0xd800/*illegal*/,0x0042, };
418 static const uint8_t to_iscii1[]={
419 0x44,
420 0x43,
421
422 };
423 static const int32_t from_isciiOffs1 [] ={0,2};
424
425 if(!testConvertFromUnicode(inputTest, UPRV_LENGTHOF(inputTest),
426 toIBM943, UPRV_LENGTHOF(toIBM943), "ibm-943",
427 UCNV_FROM_U_CALLBACK_SKIP, offset, NULL, 0 ))
428 log_err("u-> ibm-943 with skip did not match.\n");
429
430 if(!testConvertFromUnicode(euc_jp_inputText, UPRV_LENGTHOF(euc_jp_inputText),
431 to_euc_jp, UPRV_LENGTHOF(to_euc_jp), "IBM-eucJP",
432 UCNV_FROM_U_CALLBACK_SKIP, fromEUC_JPOffs, NULL, 0 ))
433 log_err("u-> euc-jp with skip did not match.\n");
434
435 if(!testConvertFromUnicode(euc_tw_inputText, UPRV_LENGTHOF(euc_tw_inputText),
436 to_euc_tw, UPRV_LENGTHOF(to_euc_tw), "euc-tw",
437 UCNV_FROM_U_CALLBACK_SKIP, from_euc_twOffs, NULL, 0 ))
438 log_err("u-> euc-tw with skip did not match.\n");
439
440 /*iso_2022_jp*/
441 if(!testConvertFromUnicode(iso_2022_jp_inputText, UPRV_LENGTHOF(iso_2022_jp_inputText),
442 to_iso_2022_jp, UPRV_LENGTHOF(to_iso_2022_jp), "iso-2022-jp",
443 UCNV_FROM_U_CALLBACK_SKIP, from_iso_2022_jpOffs, NULL, 0 ))
444 log_err("u-> iso-2022-jp with skip did not match.\n");
445
446 /* with context */
447 if(!testConvertFromUnicodeWithContext(iso_2022_jp_inputText2, UPRV_LENGTHOF(iso_2022_jp_inputText2),
448 to_iso_2022_jp2, UPRV_LENGTHOF(to_iso_2022_jp2), "iso-2022-jp",
449 UCNV_FROM_U_CALLBACK_SKIP, from_iso_2022_jpOffs2, NULL, 0,UCNV_SKIP_STOP_ON_ILLEGAL,U_ILLEGAL_CHAR_FOUND ))
450 log_err("u-> iso-2022-jp with skip & UCNV_SKIP_STOP_ON_ILLEGAL did not match.\n");
451
452 /*iso_2022_cn*/
453 if(!testConvertFromUnicode(iso_2022_cn_inputText, UPRV_LENGTHOF(iso_2022_cn_inputText),
454 to_iso_2022_cn, UPRV_LENGTHOF(to_iso_2022_cn), "iso-2022-cn",
455 UCNV_FROM_U_CALLBACK_SKIP, from_iso_2022_cnOffs, NULL, 0 ))
456 log_err("u-> iso-2022-cn with skip did not match.\n");
457 /*with context*/
458 if(!testConvertFromUnicodeWithContext(iso_2022_cn_inputText1, UPRV_LENGTHOF(iso_2022_cn_inputText1),
459 to_iso_2022_cn1, UPRV_LENGTHOF(to_iso_2022_cn1), "iso-2022-cn",
460 UCNV_FROM_U_CALLBACK_SKIP, from_iso_2022_cnOffs1, NULL, 0,UCNV_SKIP_STOP_ON_ILLEGAL,U_ILLEGAL_CHAR_FOUND ))
461 log_err("u-> iso-2022-cn with skip & UCNV_SKIP_STOP_ON_ILLEGAL did not match.\n");
462
463 /*iso_2022_kr*/
464 if(!testConvertFromUnicode(iso_2022_kr_inputText, UPRV_LENGTHOF(iso_2022_kr_inputText),
465 to_iso_2022_kr, UPRV_LENGTHOF(to_iso_2022_kr), "iso-2022-kr",
466 UCNV_FROM_U_CALLBACK_SKIP, from_iso_2022_krOffs, NULL, 0 ))
467 log_err("u-> iso-2022-kr with skip did not match.\n");
468 /*with context*/
469 if(!testConvertFromUnicodeWithContext(iso_2022_kr_inputText1, UPRV_LENGTHOF(iso_2022_kr_inputText1),
470 to_iso_2022_kr1, UPRV_LENGTHOF(to_iso_2022_kr1), "iso-2022-kr",
471 UCNV_FROM_U_CALLBACK_SKIP, from_iso_2022_krOffs1, NULL, 0,UCNV_SKIP_STOP_ON_ILLEGAL,U_ILLEGAL_CHAR_FOUND ))
472 log_err("u-> iso-2022-kr with skip & UCNV_SKIP_STOP_ON_ILLEGAL did not match.\n");
473
474 /*hz*/
475 if(!testConvertFromUnicode(hz_inputText, UPRV_LENGTHOF(hz_inputText),
476 to_hz, UPRV_LENGTHOF(to_hz), "HZ",
477 UCNV_FROM_U_CALLBACK_SKIP, from_hzOffs, NULL, 0 ))
478 log_err("u-> HZ with skip did not match.\n");
479 /*with context*/
480 if(!testConvertFromUnicodeWithContext(hz_inputText1, UPRV_LENGTHOF(hz_inputText1),
481 to_hz1, UPRV_LENGTHOF(to_hz1), "hz",
482 UCNV_FROM_U_CALLBACK_SKIP, from_hzOffs1, NULL, 0,UCNV_SKIP_STOP_ON_ILLEGAL,U_ILLEGAL_CHAR_FOUND ))
483 log_err("u-> hz with skip & UCNV_SKIP_STOP_ON_ILLEGAL did not match.\n");
484#endif
485
486 /*SCSU*/
487 if(!testConvertFromUnicode(SCSU_inputText, UPRV_LENGTHOF(SCSU_inputText),
488 to_SCSU, UPRV_LENGTHOF(to_SCSU), "SCSU",
489 UCNV_FROM_U_CALLBACK_SKIP, from_SCSUOffs, NULL, 0 ))
490 log_err("u-> SCSU with skip did not match.\n");
491
492#if !UCONFIG_NO_LEGACY_CONVERSION
493 /*ISCII*/
494 if(!testConvertFromUnicode(iscii_inputText, UPRV_LENGTHOF(iscii_inputText),
495 to_iscii, UPRV_LENGTHOF(to_iscii), "ISCII,version=0",
496 UCNV_FROM_U_CALLBACK_SKIP, from_isciiOffs, NULL, 0 ))
497 log_err("u-> iscii with skip did not match.\n");
498 /*with context*/
499 if(!testConvertFromUnicodeWithContext(iscii_inputText1, UPRV_LENGTHOF(iscii_inputText1),
500 to_iscii1, UPRV_LENGTHOF(to_iscii1), "ISCII,version=0",
501 UCNV_FROM_U_CALLBACK_SKIP, from_isciiOffs1, NULL, 0,UCNV_SKIP_STOP_ON_ILLEGAL,U_ILLEGAL_CHAR_FOUND ))
502 log_err("u-> iscii with skip & UCNV_SKIP_STOP_ON_ILLEGAL did not match.\n");
503#endif
504 }
505
506 log_verbose("Testing fromUnicode for BOCU-1 with UCNV_TO_U_CALLBACK_SKIP\n");
507 {
508 static const uint8_t sampleText[]={ /* from cintltst/bocu1tst.c/TestBOCU1 text 1 */
509 0xFB, 0xEE, 0x28, /* from source offset 0 */
510 0x24, 0x1E, 0x52,
511 0xB2,
512 0x20,
513 0xB3,
514 0xB1,
515 0x0D,
516 0x0A,
517
518 0x20, /* from 8 */
519 0x00,
520 0xD0, 0x6C,
521 0xB6,
522 0xD8, 0xA5,
523 0x20,
524 0x68,
525 0x59,
526
527 0xF9, 0x28, /* from 16 */
528 0x6D,
529 0x20,
530 0x73,
531 0xE0, 0x2D,
532 0xDE, 0x43,
533 0xD0, 0x33,
534 0x20,
535
536 0xFA, 0x83, /* from 24 */
537 0x25, 0x01,
538 0xFB, 0x16, 0x87,
539 0x4B, 0x16,
540 0x20,
541 0xE6, 0xBD,
542 0xEB, 0x5B,
543 0x4B, 0xCC,
544
545 0xF9, 0xA2, /* from 32 */
546 0xFC, 0x10, 0x3E,
547 0xFE, 0x16, 0x3A, 0x8C,
548 0x20,
549 0xFC, 0x03, 0xAC,
550
551 0x01, /* from 41 */
552 0xDE, 0x83,
553 0x20,
554 0x09
555 };
556 static const UChar expected[]={
557 0xFEFF, 0x0061, 0x0062, 0x0020, /* 0 */
558 0x0063, 0x0061, 0x000D, 0x000A,
559
560 0x0020, 0x0000, 0x00DF, 0x00E6, /* 8 */
561 0x0930, 0x0020, 0x0918, 0x0909,
562
563 0x3086, 0x304D, 0x0020, 0x3053, /* 16 */
564 0x4000, 0x4E00, 0x7777, 0x0020,
565
566 0x9FA5, 0x4E00, 0xAC00, 0xBCDE, /* 24 */
567 0x0020, 0xD7A3, 0xDC00, 0xD800,
568
569 0xD800, 0xDC00, 0xD845, 0xDDDD, /* 32 */
570 0xDBBB, 0xDDEE, 0x0020, 0xDBFF,
571
572 0xDFFF, 0x0001, 0x0E40, 0x0020, /* 40 */
573 0x0009
574 };
575 static const int32_t offsets[]={
576 0, 0, 0, 1, 1, 1, 2, 3, 4, 5, 6, 7,
577 8, 9, 10, 10, 11, 12, 12, 13, 14, 15,
578 16, 16, 17, 18, 19, 20, 20, 21, 21, 22, 22, 23,
579 24, 24, 25, 25, 26, 26, 26, 27, 27, 28, 29, 29, 30, 30, 31, 31,
580 32, 32, 34, 34, 34, 36, 36, 36, 36, 38, 39, 39, 39,
581 41, 42, 42, 43, 44
582 };
583
584 /* BOCU-1 fromUnicode never calls callbacks, so this only tests single-byte and offsets behavior */
585 if(!testConvertFromUnicode(expected, UPRV_LENGTHOF(expected),
586 sampleText, UPRV_LENGTHOF(sampleText),
587 "BOCU-1",
588 UCNV_FROM_U_CALLBACK_SKIP, offsets, NULL, 0)
589 ) {
590 log_err("u->BOCU-1 with skip did not match.\n");
591 }
592 }
593
594 log_verbose("Testing fromUnicode for CESU-8 with UCNV_TO_U_CALLBACK_SKIP\n");
595 {
596 const uint8_t sampleText[]={
597 0x61, /* 'a' */
598 0xc4, 0xb5, /* U+0135 */
599 0xed, 0x80, 0xa0, /* Hangul U+d020 */
600 0xed, 0xa0, 0x81, 0xed, 0xb0, 0x81, /* surrogate pair for U+10401 */
601 0xee, 0x80, 0x80, /* PUA U+e000 */
602 0xed, 0xb0, 0x81, /* unpaired trail surrogate U+dc01 */
603 0x62, /* 'b' */
604 0xed, 0xa0, 0x81, /* unpaired lead surrogate U+d801 */
605 0xd0, 0x80 /* U+0400 */
606 };
607 UChar expected[]={
608 0x0061,
609 0x0135,
610 0xd020,
611 0xd801, 0xdc01,
612 0xe000,
613 0xdc01,
614 0x0062,
615 0xd801,
616 0x0400
617 };
618 int32_t offsets[]={
619 0,
620 1, 1,
621 2, 2, 2,
622 3, 3, 3, 4, 4, 4,
623 5, 5, 5,
624 6, 6, 6,
625 7,
626 8, 8, 8,
627 9, 9
628 };
629
630 /* CESU-8 fromUnicode never calls callbacks, so this only tests conversion and offsets behavior */
631
632 /* without offsets */
633 if(!testConvertFromUnicode(expected, UPRV_LENGTHOF(expected),
634 sampleText, UPRV_LENGTHOF(sampleText),
635 "CESU-8",
636 UCNV_FROM_U_CALLBACK_SKIP, NULL, NULL, 0)
637 ) {
638 log_err("u->CESU-8 with skip did not match.\n");
639 }
640
641 /* with offsets */
642 if(!testConvertFromUnicode(expected, UPRV_LENGTHOF(expected),
643 sampleText, UPRV_LENGTHOF(sampleText),
644 "CESU-8",
645 UCNV_FROM_U_CALLBACK_SKIP, offsets, NULL, 0)
646 ) {
647 log_err("u->CESU-8 with skip did not match.\n");
648 }
649 }
650
651 /*to Unicode*/
652 log_verbose("Testing toUnicode with UCNV_TO_U_CALLBACK_SKIP \n");
653
654#if !UCONFIG_NO_LEGACY_CONVERSION
655 {
656
657 static const UChar IBM_949skiptoUnicode[]= {0x0000, 0xAC00, 0xAC01, 0xD700 };
658 static const UChar IBM_943skiptoUnicode[]= { 0x6D63, 0x6D64, 0x6D66 };
659 static const UChar IBM_930skiptoUnicode[]= { 0x6D63, 0x6D64, 0x6D66 };
660
661 static const int32_t fromIBM949Offs [] = { 0, 1, 3, 5};
662 static const int32_t fromIBM943Offs [] = { 0, 2, 4};
663 static const int32_t fromIBM930Offs [] = { 1, 3, 5};
664
665 if(!testConvertToUnicode(expskipIBM_949, UPRV_LENGTHOF(expskipIBM_949),
666 IBM_949skiptoUnicode, UPRV_LENGTHOF(IBM_949skiptoUnicode),"ibm-949",
667 UCNV_TO_U_CALLBACK_SKIP, fromIBM949Offs, NULL, 0 ))
668 log_err("ibm-949->u with skip did not match.\n");
669 if(!testConvertToUnicode(expskipIBM_943, UPRV_LENGTHOF(expskipIBM_943),
670 IBM_943skiptoUnicode, UPRV_LENGTHOF(IBM_943skiptoUnicode),"ibm-943",
671 UCNV_TO_U_CALLBACK_SKIP, fromIBM943Offs, NULL, 0 ))
672 log_err("ibm-943->u with skip did not match.\n");
673
674
675 if(!testConvertToUnicode(expskipIBM_930, UPRV_LENGTHOF(expskipIBM_930),
676 IBM_930skiptoUnicode, UPRV_LENGTHOF(IBM_930skiptoUnicode),"ibm-930",
677 UCNV_TO_U_CALLBACK_SKIP, fromIBM930Offs, NULL, 0 ))
678 log_err("ibm-930->u with skip did not match.\n");
679
680
681 if(!testConvertToUnicodeWithContext(expskipIBM_930, UPRV_LENGTHOF(expskipIBM_930),
682 IBM_930skiptoUnicode, UPRV_LENGTHOF(IBM_930skiptoUnicode),"ibm-930",
683 UCNV_TO_U_CALLBACK_SKIP, fromIBM930Offs, NULL, 0,"i",U_ILLEGAL_CHAR_FOUND ))
684 log_err("ibm-930->u with skip did not match.\n");
685 }
686#endif
687
688 {
689 static const uint8_t usasciiToUBytes[] = { 0x61, 0x80, 0x31 };
690 static const UChar usasciiToU[] = { 0x61, 0x31 };
691 static const int32_t usasciiToUOffsets[] = { 0, 2 };
692
693 static const uint8_t latin1ToUBytes[] = { 0x61, 0xa0, 0x31 };
694 static const UChar latin1ToU[] = { 0x61, 0xa0, 0x31 };
695 static const int32_t latin1ToUOffsets[] = { 0, 1, 2 };
696
697 /* US-ASCII */
698 if(!testConvertToUnicode(usasciiToUBytes, UPRV_LENGTHOF(usasciiToUBytes),
699 usasciiToU, UPRV_LENGTHOF(usasciiToU),
700 "US-ASCII",
701 UCNV_TO_U_CALLBACK_SKIP, usasciiToUOffsets,
702 NULL, 0)
703 ) {
704 log_err("US-ASCII->u with skip did not match.\n");
705 }
706
707#if !UCONFIG_NO_LEGACY_CONVERSION
708 /* SBCS NLTC codepage 367 for US-ASCII */
709 if(!testConvertToUnicode(usasciiToUBytes, UPRV_LENGTHOF(usasciiToUBytes),
710 usasciiToU, UPRV_LENGTHOF(usasciiToU),
711 "ibm-367",
712 UCNV_TO_U_CALLBACK_SKIP, usasciiToUOffsets,
713 NULL, 0)
714 ) {
715 log_err("ibm-367->u with skip did not match.\n");
716 }
717#endif
718
719 /* ISO-Latin-1 */
720 if(!testConvertToUnicode(latin1ToUBytes, UPRV_LENGTHOF(latin1ToUBytes),
721 latin1ToU, UPRV_LENGTHOF(latin1ToU),
722 "LATIN_1",
723 UCNV_TO_U_CALLBACK_SKIP, latin1ToUOffsets,
724 NULL, 0)
725 ) {
726 log_err("LATIN_1->u with skip did not match.\n");
727 }
728
729#if !UCONFIG_NO_LEGACY_CONVERSION
730 /* windows-1252 */
731 if(!testConvertToUnicode(latin1ToUBytes, UPRV_LENGTHOF(latin1ToUBytes),
732 latin1ToU, UPRV_LENGTHOF(latin1ToU),
733 "windows-1252",
734 UCNV_TO_U_CALLBACK_SKIP, latin1ToUOffsets,
735 NULL, 0)
736 ) {
737 log_err("windows-1252->u with skip did not match.\n");
738 }
739#endif
740 }
741
742#if !UCONFIG_NO_LEGACY_CONVERSION
743 {
744 static const uint8_t sampleTxtEBCIDIC_STATEFUL [] ={
745 0x0e, 0x5d, 0x5f , 0x41, 0x79, 0x41, 0x44
746 };
747 static const UChar EBCIDIC_STATEFUL_toUnicode[] ={ 0x6d63, 0x03b4
748 };
749 static const int32_t from_EBCIDIC_STATEFULOffsets []={ 1, 5};
750
751
752 /* euc-jp*/
753 static const uint8_t sampleTxt_euc_jp[]={ 0x61, 0xa1, 0xb8, 0x8f, 0xf4, 0xae,
754 0x8f, 0xda, 0xa1, /*unassigned*/
755 0x8e, 0xe0,
756 };
757 static const UChar euc_jptoUnicode[]={ 0x0061, 0x4edd, 0x5bec, 0x00a2};
758 static const int32_t from_euc_jpOffs [] ={ 0, 1, 3, 9};
759
760 /*EUC_TW*/
761 static const uint8_t sampleTxt_euc_tw[]={ 0x61, 0xa2, 0xd3, 0x8e, 0xa2, 0xdc, 0xe5,
762 0x8e, 0xaa, 0xbb, 0xcc,/*unassigned*/
763 0xe6, 0xca, 0x8a,
764 };
765 static const UChar euc_twtoUnicode[]={ 0x0061, 0x2295, 0x5BF2, 0x8706, 0x8a, };
766 static const int32_t from_euc_twOffs [] ={ 0, 1, 3, 11, 13};
767 /*iso-2022-jp*/
768 static const uint8_t sampleTxt_iso_2022_jp[]={
769 0x41,
770 0x1b, 0x24, 0x42, 0x3a, 0x1a, /*unassigned*/
771 0x1b, 0x28, 0x42, 0x42,
772
773 };
774 static const UChar iso_2022_jptoUnicode[]={ 0x41,0x42 };
775 static const int32_t from_iso_2022_jpOffs [] ={ 0,9 };
776
777 /*iso-2022-cn*/
778 static const uint8_t sampleTxt_iso_2022_cn[]={
779 0x0f, 0x41, 0x44,
780 0x1B, 0x24, 0x29, 0x47,
781 0x0E, 0x40, 0x6f, /*unassigned*/
782 0x0f, 0x42,
783
784 };
785
786 static const UChar iso_2022_cntoUnicode[]={ 0x41, 0x44,0x42 };
787 static const int32_t from_iso_2022_cnOffs [] ={ 1, 2, 11 };
788
789 /*iso-2022-kr*/
790 static const uint8_t sampleTxt_iso_2022_kr[]={
791 0x1b, 0x24, 0x29, 0x43,
792 0x41,
793 0x0E, 0x7f, 0x1E,
794 0x0e, 0x25, 0x50,
795 0x0f, 0x51,
796 0x42, 0x43,
797
798 };
799 static const UChar iso_2022_krtoUnicode[]={ 0x41,0x03A0,0x51, 0x42,0x43};
800 static const int32_t from_iso_2022_krOffs [] ={ 4, 9, 12, 13 , 14 };
801
802 /*hz*/
803 static const uint8_t sampleTxt_hz[]={
804 0x41,
805 0x7e, 0x7b, 0x26, 0x30,
806 0x7f, 0x1E, /*unassigned*/
807 0x26, 0x30,
808 0x7e, 0x7d, 0x42,
809 0x7e, 0x7b, 0x7f, 0x1E,/*unassigned*/
810 0x7e, 0x7d, 0x42,
811 };
812 static const UChar hztoUnicode[]={
813 0x41,
814 0x03a0,
815 0x03A0,
816 0x42,
817 0x42,};
818
819 static const int32_t from_hzOffs [] ={0,3,7,11,18, };
820
821 /*ISCII*/
822 static const uint8_t sampleTxt_iscii[]={
823 0x41,
824 0xa1,
825 0xEB, /*unassigned*/
826 0x26,
827 0x30,
828 0xa2,
829 0xEC, /*unassigned*/
830 0x42,
831 };
832 static const UChar isciitoUnicode[]={
833 0x41,
834 0x0901,
835 0x26,
836 0x30,
837 0x0902,
838 0x42,
839 };
840
841 static const int32_t from_isciiOffs [] ={0,1,3,4,5,7 };
842
843 /*LMBCS*/
844 static const uint8_t sampleTxtLMBCS[]={ 0x12, 0xc9, 0x50,
845 0x12, 0x92, 0xa0, /*unassigned*/
846 0x12, 0x92, 0xA1,
847 };
848 static const UChar LMBCSToUnicode[]={ 0x4e2e, 0xe5c4};
849 static const int32_t fromLMBCS[] = {0, 6};
850
851 if(!testConvertToUnicode(sampleTxtEBCIDIC_STATEFUL, UPRV_LENGTHOF(sampleTxtEBCIDIC_STATEFUL),
852 EBCIDIC_STATEFUL_toUnicode, UPRV_LENGTHOF(EBCIDIC_STATEFUL_toUnicode),"ibm-930",
853 UCNV_TO_U_CALLBACK_SKIP, from_EBCIDIC_STATEFULOffsets, NULL, 0 ))
854 log_err("EBCIDIC_STATEFUL->u with skip did not match.\n");
855
856 if(!testConvertToUnicodeWithContext(sampleTxtEBCIDIC_STATEFUL, UPRV_LENGTHOF(sampleTxtEBCIDIC_STATEFUL),
857 EBCIDIC_STATEFUL_toUnicode, UPRV_LENGTHOF(EBCIDIC_STATEFUL_toUnicode),"ibm-930",
858 UCNV_TO_U_CALLBACK_SKIP, from_EBCIDIC_STATEFULOffsets, NULL, 0,"i",U_ILLEGAL_CHAR_FOUND ))
859 log_err("EBCIDIC_STATEFUL->u with skip did not match.\n");
860
861 if(!testConvertToUnicode(sampleTxt_euc_jp, UPRV_LENGTHOF(sampleTxt_euc_jp),
862 euc_jptoUnicode, UPRV_LENGTHOF(euc_jptoUnicode),"IBM-eucJP",
863 UCNV_TO_U_CALLBACK_SKIP, from_euc_jpOffs , NULL, 0))
864 log_err("euc-jp->u with skip did not match.\n");
865
866
867
868 if(!testConvertToUnicode(sampleTxt_euc_tw, UPRV_LENGTHOF(sampleTxt_euc_tw),
869 euc_twtoUnicode, UPRV_LENGTHOF(euc_twtoUnicode),"euc-tw",
870 UCNV_TO_U_CALLBACK_SKIP, from_euc_twOffs , NULL, 0))
871 log_err("euc-tw->u with skip did not match.\n");
872
873
874 if(!testConvertToUnicode(sampleTxt_iso_2022_jp, UPRV_LENGTHOF(sampleTxt_iso_2022_jp),
875 iso_2022_jptoUnicode, UPRV_LENGTHOF(iso_2022_jptoUnicode),"iso-2022-jp",
876 UCNV_TO_U_CALLBACK_SKIP, from_iso_2022_jpOffs , NULL, 0))
877 log_err("iso-2022-jp->u with skip did not match.\n");
878
879 if(!testConvertToUnicode(sampleTxt_iso_2022_cn, UPRV_LENGTHOF(sampleTxt_iso_2022_cn),
880 iso_2022_cntoUnicode, UPRV_LENGTHOF(iso_2022_cntoUnicode),"iso-2022-cn",
881 UCNV_TO_U_CALLBACK_SKIP, from_iso_2022_cnOffs , NULL, 0))
882 log_err("iso-2022-cn->u with skip did not match.\n");
883
884 if(!testConvertToUnicode(sampleTxt_iso_2022_kr, UPRV_LENGTHOF(sampleTxt_iso_2022_kr),
885 iso_2022_krtoUnicode, UPRV_LENGTHOF(iso_2022_krtoUnicode),"iso-2022-kr",
886 UCNV_TO_U_CALLBACK_SKIP, from_iso_2022_krOffs , NULL, 0))
887 log_err("iso-2022-kr->u with skip did not match.\n");
888
889 if(!testConvertToUnicode(sampleTxt_hz, UPRV_LENGTHOF(sampleTxt_hz),
890 hztoUnicode, UPRV_LENGTHOF(hztoUnicode),"HZ",
891 UCNV_TO_U_CALLBACK_SKIP, from_hzOffs , NULL, 0))
892 log_err("HZ->u with skip did not match.\n");
893
894 if(!testConvertToUnicode(sampleTxt_iscii, UPRV_LENGTHOF(sampleTxt_iscii),
895 isciitoUnicode, UPRV_LENGTHOF(isciitoUnicode),"ISCII,version=0",
896 UCNV_TO_U_CALLBACK_SKIP, from_isciiOffs , NULL, 0))
897 log_err("iscii->u with skip did not match.\n");
898
899 if(!testConvertToUnicode(sampleTxtLMBCS, UPRV_LENGTHOF(sampleTxtLMBCS),
900 LMBCSToUnicode, UPRV_LENGTHOF(LMBCSToUnicode),"LMBCS-1",
901 UCNV_TO_U_CALLBACK_SKIP, fromLMBCS , NULL, 0))
902 log_err("LMBCS->u with skip did not match.\n");
903
904 }
905#endif
906
907 log_verbose("Testing to Unicode for UTF-8 with UCNV_TO_U_CALLBACK_SKIP \n");
908 {
909 const uint8_t sampleText1[] = { 0x31, 0xe4, 0xba, 0x8c,
910 0xe0, 0x80, 0x61,};
911 UChar expected1[] = { 0x0031, 0x4e8c, 0x0061};
912 int32_t offsets1[] = { 0x0000, 0x0001, 0x0006};
913
914 if(!testConvertToUnicode(sampleText1, UPRV_LENGTHOF(sampleText1),
915 expected1, UPRV_LENGTHOF(expected1),"utf8",
916 UCNV_TO_U_CALLBACK_SKIP, offsets1, NULL, 0 ))
917 log_err("utf8->u with skip did not match.\n");
918 }
919
920 log_verbose("Testing toUnicode for SCSU with UCNV_TO_U_CALLBACK_SKIP \n");
921 {
922 const uint8_t sampleText1[] = { 0xba, 0x8c,0xF8, 0x61,0x0c, 0x0c,};
923 UChar expected1[] = { 0x00ba, 0x008c, 0x00f8, 0x0061,0xfffe,0xfffe};
924 int32_t offsets1[] = { 0x0000, 0x0001,0x0002,0x0003,4,5};
925
926 if(!testConvertToUnicode(sampleText1, UPRV_LENGTHOF(sampleText1),
927 expected1, UPRV_LENGTHOF(expected1),"SCSU",
928 UCNV_TO_U_CALLBACK_SKIP, offsets1, NULL, 0 ))
929 log_err("scsu->u with skip did not match.\n");
930 }
931
932 log_verbose("Testing toUnicode for BOCU-1 with UCNV_TO_U_CALLBACK_SKIP\n");
933 {
934 const uint8_t sampleText[]={ /* modified from cintltst/bocu1tst.c/TestBOCU1 text 1 */
935 0xFB, 0xEE, 0x28, /* single-code point sequence at offset 0 */
936 0x24, 0x1E, 0x52, /* 3 */
937 0xB2, /* 6 */
938 0x20, /* 7 */
939 0x40, 0x07, /* 8 - wrong trail byte */
940 0xB3, /* 10 */
941 0xB1, /* 11 */
942 0xD0, 0x20, /* 12 - wrong trail byte */
943 0x0D, /* 14 */
944 0x0A, /* 15 */
945 0x20, /* 16 */
946 0x00, /* 17 */
947 0xD0, 0x6C, /* 18 */
948 0xB6, /* 20 */
949 0xD8, 0xA5, /* 21 */
950 0x20, /* 23 */
951 0x68, /* 24 */
952 0x59, /* 25 */
953 0xF9, 0x28, /* 26 */
954 0x6D, /* 28 */
955 0x20, /* 29 */
956 0x73, /* 30 */
957 0xE0, 0x2D, /* 31 */
958 0xDE, 0x43, /* 33 */
959 0xD0, 0x33, /* 35 */
960 0x20, /* 37 */
961 0xFA, 0x83, /* 38 */
962 0x25, 0x01, /* 40 */
963 0xFB, 0x16, 0x87, /* 42 */
964 0x4B, 0x16, /* 45 */
965 0x20, /* 47 */
966 0xE6, 0xBD, /* 48 */
967 0xEB, 0x5B, /* 50 */
968 0x4B, 0xCC, /* 52 */
969 0xF9, 0xA2, /* 54 */
970 0xFC, 0x10, 0x3E, /* 56 */
971 0xFE, 0x16, 0x3A, 0x8C, /* 59 */
972 0x20, /* 63 */
973 0xFC, 0x03, 0xAC, /* 64 */
974 0xFF, /* 67 - FF just resets the state without encoding anything */
975 0x01, /* 68 */
976 0xDE, 0x83, /* 69 */
977 0x20, /* 71 */
978 0x09 /* 72 */
979 };
980 UChar expected[]={
981 0xFEFF, 0x0061, 0x0062, 0x0020,
982 0x0063, 0x0061, 0x000D, 0x000A,
983 0x0020, 0x0000, 0x00DF, 0x00E6,
984 0x0930, 0x0020, 0x0918, 0x0909,
985 0x3086, 0x304D, 0x0020, 0x3053,
986 0x4000, 0x4E00, 0x7777, 0x0020,
987 0x9FA5, 0x4E00, 0xAC00, 0xBCDE,
988 0x0020, 0xD7A3, 0xDC00, 0xD800,
989 0xD800, 0xDC00, 0xD845, 0xDDDD,
990 0xDBBB, 0xDDEE, 0x0020, 0xDBFF,
991 0xDFFF, 0x0001, 0x0E40, 0x0020,
992 0x0009
993 };
994 int32_t offsets[]={
995 0, 3, 6, 7, /* skip 8, */
996 10, 11, /* skip 12, */
997 14, 15, 16, 17, 18,
998 20, 21, 23, 24, 25, 26, 28, 29,
999 30, 31, 33, 35, 37, 38,
1000 40, 42, 45, 47, 48,
1001 50, 52, 54, /* trail */ 54, 56, /* trail */ 56, 59, /* trail */ 59,
1002 63, 64, /* trail */ 64, /* reset only 67, */
1003 68, 69,
1004 71, 72
1005 };
1006
1007 if(!testConvertToUnicode(sampleText, UPRV_LENGTHOF(sampleText),
1008 expected, UPRV_LENGTHOF(expected), "BOCU-1",
1009 UCNV_TO_U_CALLBACK_SKIP, offsets, NULL, 0)
1010 ) {
1011 log_err("BOCU-1->u with skip did not match.\n");
1012 }
1013 }
1014
1015 log_verbose("Testing toUnicode for CESU-8 with UCNV_TO_U_CALLBACK_SKIP\n");
1016 {
1017 const uint8_t sampleText[]={
1018 0x61, /* 0 'a' */
1019 0xc0, 0x80, /* 1 non-shortest form */
1020 0xc4, 0xb5, /* 3 U+0135 */
1021 0xed, 0x80, 0xa0, /* 5 Hangul U+d020 */
1022 0xed, 0xa0, 0x81, 0xed, 0xb0, 0x81, /* 8 surrogate pair for U+10401 */
1023 0xee, 0x80, 0x80, /* 14 PUA U+e000 */
1024 0xed, 0xb0, 0x81, /* 17 unpaired trail surrogate U+dc01 */
1025 0xf0, 0x90, 0x80, 0x80, /* 20 illegal 4-byte form for U+10000 */
1026 0x62, /* 24 'b' */
1027 0xed, 0xa0, 0x81, /* 25 unpaired lead surrogate U+d801 */
1028 0xed, 0xa0, /* 28 incomplete sequence */
1029 0xd0, 0x80 /* 30 U+0400 */
1030 };
1031 UChar expected[]={
1032 0x0061,
1033 /* skip */
1034 0x0135,
1035 0xd020,
1036 0xd801, 0xdc01,
1037 0xe000,
1038 0xdc01,
1039 /* skip */
1040 0x0062,
1041 0xd801,
1042 0x0400
1043 };
1044 int32_t offsets[]={
1045 0,
1046 /* skip 1, */
1047 3,
1048 5,
1049 8, 11,
1050 14,
1051 17,
1052 /* skip 20, 20, */
1053 24,
1054 25,
1055 /* skip 28 */
1056 30
1057 };
1058
1059 /* without offsets */
1060 if(!testConvertToUnicode(sampleText, UPRV_LENGTHOF(sampleText),
1061 expected, UPRV_LENGTHOF(expected), "CESU-8",
1062 UCNV_TO_U_CALLBACK_SKIP, NULL, NULL, 0)
1063 ) {
1064 log_err("CESU-8->u with skip did not match.\n");
1065 }
1066
1067 /* with offsets */
1068 if(!testConvertToUnicode(sampleText, UPRV_LENGTHOF(sampleText),
1069 expected, UPRV_LENGTHOF(expected), "CESU-8",
1070 UCNV_TO_U_CALLBACK_SKIP, offsets, NULL, 0)
1071 ) {
1072 log_err("CESU-8->u with skip did not match.\n");
1073 }
1074 }
1075}
1076
1077static void TestStop(int32_t inputsize, int32_t outputsize)
1078{
1079 static const UChar sampleText[] = { 0x0000, 0xAC00, 0xAC01, 0xEF67, 0xD700 };
1080 static const UChar sampleText2[] = { 0x6D63, 0x6D64, 0x6D65, 0x6D66 };
1081
1082 static const uint8_t expstopIBM_949[]= {
1083 0x00, 0xb0, 0xa1, 0xb0, 0xa2};
1084
1085 static const uint8_t expstopIBM_943[] = {
1086 0x9f, 0xaf, 0x9f, 0xb1};
1087
1088 static const uint8_t expstopIBM_930[] = {
1089 0x0e, 0x5d, 0x5f, 0x5d, 0x63};
1090
1091 static const UChar IBM_949stoptoUnicode[]= {0x0000, 0xAC00, 0xAC01};
1092 static const UChar IBM_943stoptoUnicode[]= { 0x6D63, 0x6D64};
1093 static const UChar IBM_930stoptoUnicode[]= { 0x6D63, 0x6D64};
1094
1095
1096 static const int32_t toIBM949Offsstop [] = { 0, 1, 1, 2, 2};
1097 static const int32_t toIBM943Offsstop [] = { 0, 0, 1, 1};
1098 static const int32_t toIBM930Offsstop [] = { 0, 0, 0, 1, 1};
1099
1100 static const int32_t fromIBM949Offs [] = { 0, 1, 3};
1101 static const int32_t fromIBM943Offs [] = { 0, 2};
1102 static const int32_t fromIBM930Offs [] = { 1, 3};
1103
1104 gInBufferSize = inputsize;
1105 gOutBufferSize = outputsize;
1106
1107 /*From Unicode*/
1108
1109#if !UCONFIG_NO_LEGACY_CONVERSION
1110 if(!testConvertFromUnicode(sampleText, UPRV_LENGTHOF(sampleText),
1111 expstopIBM_949, UPRV_LENGTHOF(expstopIBM_949), "ibm-949",
1112 UCNV_FROM_U_CALLBACK_STOP, toIBM949Offsstop, NULL, 0 ))
1113 log_err("u-> ibm-949 with stop did not match.\n");
1114 if(!testConvertFromUnicode(sampleText2, UPRV_LENGTHOF(sampleText2),
1115 expstopIBM_943, UPRV_LENGTHOF(expstopIBM_943), "ibm-943",
1116 UCNV_FROM_U_CALLBACK_STOP, toIBM943Offsstop , NULL, 0))
1117 log_err("u-> ibm-943 with stop did not match.\n");
1118 if(!testConvertFromUnicode(sampleText2, UPRV_LENGTHOF(sampleText2),
1119 expstopIBM_930, UPRV_LENGTHOF(expstopIBM_930), "ibm-930",
1120 UCNV_FROM_U_CALLBACK_STOP, toIBM930Offsstop, NULL, 0 ))
1121 log_err("u-> ibm-930 with stop did not match.\n");
1122
1123 log_verbose("Testing fromUnicode with UCNV_FROM_U_CALLBACK_STOP \n");
1124 {
1125 static const UChar inputTest[] = { 0x0061, 0xd801, 0xdc01, 0xd801, 0x0061 };
1126 static const uint8_t toIBM943[]= { 0x61,};
1127 static const int32_t offset[]= {0,} ;
1128
1129 /*EUC_JP*/
1130 static const UChar euc_jp_inputText[]={ 0x0061, 0x4edd, 0x5bec, 0xd801, 0xdc01, 0xd801, 0x0061, 0x00a2 };
1131 static const uint8_t to_euc_jp[]={ 0x61, 0xa1, 0xb8, 0x8f, 0xf4, 0xae,};
1132 static const int32_t fromEUC_JPOffs [] ={ 0, 1, 1, 2, 2, 2,};
1133
1134 /*EUC_TW*/
1135 static const UChar euc_tw_inputText[]={ 0x0061, 0x2295, 0x5BF2, 0xd801, 0xdc01, 0xd801, 0x0061, 0x8706, 0x8a, };
1136 static const uint8_t to_euc_tw[]={
1137 0x61, 0xa2, 0xd3, 0x8e, 0xa2, 0xdc, 0xe5,};
1138 static const int32_t from_euc_twOffs [] ={ 0, 1, 1, 2, 2, 2, 2,};
1139
1140 /*ISO-2022-JP*/
1141 static const UChar iso_2022_jp_inputText[]={0x0041, 0x00E9, 0x0042, };
1142 static const uint8_t to_iso_2022_jp[]={
1143 0x41,
1144
1145 };
1146 static const int32_t from_iso_2022_jpOffs [] ={0,};
1147
1148 /*ISO-2022-cn*/
1149 static const UChar iso_2022_cn_inputText[]={ 0x0041, 0x3712, 0x0042, };
1150 static const uint8_t to_iso_2022_cn[]={
1151 0x41,
1152
1153 };
1154 static const int32_t from_iso_2022_cnOffs [] ={
1155 0,0,
1156 2,2,
1157 };
1158
1159 /*ISO-2022-kr*/
1160 static const UChar iso_2022_kr_inputText[]={ 0x0041, 0x03A0,0x3712/*unassigned*/,0x03A0, 0x0042, };
1161 static const uint8_t to_iso_2022_kr[]={
1162 0x1b, 0x24, 0x29, 0x43,
1163 0x41,
1164 0x0e, 0x25, 0x50,
1165 };
1166 static const int32_t from_iso_2022_krOffs [] ={
1167 -1,-1,-1,-1,
1168 0,
1169 1,1,1,
1170 };
1171
1172 /* HZ encoding */
1173 static const UChar hz_inputText[]={ 0x0041, 0x03A0,0x0662/*unassigned*/,0x03A0, 0x0042, };
1174
1175 static const uint8_t to_hz[]={
1176 0x7e, 0x7d, 0x41,
1177 0x7e, 0x7b, 0x26, 0x30,
1178
1179 };
1180 static const int32_t from_hzOffs [] ={
1181 0, 0,0,
1182 1,1,1,1,
1183 };
1184
1185 /*ISCII*/
1186 static const UChar iscii_inputText[]={ 0x0041, 0x3712, 0x0042, };
1187 static const uint8_t to_iscii[]={
1188 0x41,
1189 };
1190 static const int32_t from_isciiOffs [] ={
1191 0,
1192 };
1193
1194 if(!testConvertFromUnicode(inputTest, UPRV_LENGTHOF(inputTest),
1195 toIBM943, UPRV_LENGTHOF(toIBM943), "ibm-943",
1196 UCNV_FROM_U_CALLBACK_STOP, offset, NULL, 0 ))
1197 log_err("u-> ibm-943 with stop did not match.\n");
1198
1199 if(!testConvertFromUnicode(euc_jp_inputText, UPRV_LENGTHOF(euc_jp_inputText),
1200 to_euc_jp, UPRV_LENGTHOF(to_euc_jp), "IBM-eucJP",
1201 UCNV_FROM_U_CALLBACK_STOP, fromEUC_JPOffs, NULL, 0 ))
1202 log_err("u-> euc-jp with stop did not match.\n");
1203
1204 if(!testConvertFromUnicode(euc_tw_inputText, UPRV_LENGTHOF(euc_tw_inputText),
1205 to_euc_tw, UPRV_LENGTHOF(to_euc_tw), "euc-tw",
1206 UCNV_FROM_U_CALLBACK_STOP, from_euc_twOffs, NULL, 0 ))
1207 log_err("u-> euc-tw with stop did not match.\n");
1208
1209 if(!testConvertFromUnicode(iso_2022_jp_inputText, UPRV_LENGTHOF(iso_2022_jp_inputText),
1210 to_iso_2022_jp, UPRV_LENGTHOF(to_iso_2022_jp), "iso-2022-jp",
1211 UCNV_FROM_U_CALLBACK_STOP, from_iso_2022_jpOffs, NULL, 0 ))
1212 log_err("u-> iso-2022-jp with stop did not match.\n");
1213
1214 if(!testConvertFromUnicode(iso_2022_jp_inputText, UPRV_LENGTHOF(iso_2022_jp_inputText),
1215 to_iso_2022_jp, UPRV_LENGTHOF(to_iso_2022_jp), "iso-2022-jp",
1216 UCNV_FROM_U_CALLBACK_STOP, from_iso_2022_jpOffs, NULL, 0 ))
1217 log_err("u-> iso-2022-jp with stop did not match.\n");
1218
1219 if(!testConvertFromUnicode(iso_2022_cn_inputText, UPRV_LENGTHOF(iso_2022_cn_inputText),
1220 to_iso_2022_cn, UPRV_LENGTHOF(to_iso_2022_cn), "iso-2022-cn",
1221 UCNV_FROM_U_CALLBACK_STOP, from_iso_2022_cnOffs, NULL, 0 ))
1222 log_err("u-> iso-2022-cn with stop did not match.\n");
1223
1224 if(!testConvertFromUnicode(iso_2022_kr_inputText, UPRV_LENGTHOF(iso_2022_kr_inputText),
1225 to_iso_2022_kr, UPRV_LENGTHOF(to_iso_2022_kr), "iso-2022-kr",
1226 UCNV_FROM_U_CALLBACK_STOP, from_iso_2022_krOffs, NULL, 0 ))
1227 log_err("u-> iso-2022-kr with stop did not match.\n");
1228
1229 if(!testConvertFromUnicode(hz_inputText, UPRV_LENGTHOF(hz_inputText),
1230 to_hz, UPRV_LENGTHOF(to_hz), "HZ",
1231 UCNV_FROM_U_CALLBACK_STOP, from_hzOffs, NULL, 0 ))
1232 log_err("u-> HZ with stop did not match.\n");\
1233
1234 if(!testConvertFromUnicode(iscii_inputText, UPRV_LENGTHOF(iscii_inputText),
1235 to_iscii, UPRV_LENGTHOF(to_iscii), "ISCII,version=0",
1236 UCNV_FROM_U_CALLBACK_STOP, from_isciiOffs, NULL, 0 ))
1237 log_err("u-> iscii with stop did not match.\n");
1238
1239
1240 }
1241#endif
1242
1243 log_verbose("Testing fromUnicode for SCSU with UCNV_FROM_U_CALLBACK_STOP \n");
1244 {
1245 static const UChar SCSU_inputText[]={ 0x0041, 0xd801/*illegal*/, 0x0042, };
1246
1247 static const uint8_t to_SCSU[]={
1248 0x41,
1249
1250 };
1251 int32_t from_SCSUOffs [] ={
1252 0,
1253
1254 };
1255 if(!testConvertFromUnicode(SCSU_inputText, UPRV_LENGTHOF(SCSU_inputText),
1256 to_SCSU, UPRV_LENGTHOF(to_SCSU), "SCSU",
1257 UCNV_FROM_U_CALLBACK_STOP, from_SCSUOffs, NULL, 0 ))
1258 log_err("u-> SCSU with skip did not match.\n");
1259
1260 }
1261
1262 /*to Unicode*/
1263
1264#if !UCONFIG_NO_LEGACY_CONVERSION
1265 if(!testConvertToUnicode(expstopIBM_949, UPRV_LENGTHOF(expstopIBM_949),
1266 IBM_949stoptoUnicode, UPRV_LENGTHOF(IBM_949stoptoUnicode),"ibm-949",
1267 UCNV_TO_U_CALLBACK_STOP, fromIBM949Offs, NULL, 0 ))
1268 log_err("ibm-949->u with stop did not match.\n");
1269 if(!testConvertToUnicode(expstopIBM_943, UPRV_LENGTHOF(expstopIBM_943),
1270 IBM_943stoptoUnicode, UPRV_LENGTHOF(IBM_943stoptoUnicode),"ibm-943",
1271 UCNV_TO_U_CALLBACK_STOP, fromIBM943Offs, NULL, 0 ))
1272 log_err("ibm-943->u with stop did not match.\n");
1273 if(!testConvertToUnicode(expstopIBM_930, UPRV_LENGTHOF(expstopIBM_930),
1274 IBM_930stoptoUnicode, UPRV_LENGTHOF(IBM_930stoptoUnicode),"ibm-930",
1275 UCNV_TO_U_CALLBACK_STOP, fromIBM930Offs, NULL, 0 ))
1276 log_err("ibm-930->u with stop did not match.\n");
1277
1278 log_verbose("Testing toUnicode with UCNV_TO_U_CALLBACK_STOP \n");
1279 {
1280
1281 static const uint8_t sampleTxtEBCIDIC_STATEFUL [] ={
1282 0x0e, 0x5d, 0x5f , 0x41, 0x79, 0x41, 0x44
1283 };
1284 static const UChar EBCIDIC_STATEFUL_toUnicode[] ={ 0x6d63 };
1285 static const int32_t from_EBCIDIC_STATEFULOffsets []={ 1};
1286
1287
1288 /*EUC-JP*/
1289 static const uint8_t sampleTxt_euc_jp[]={ 0x61, 0xa1, 0xb8, 0x8f, 0xf4, 0xae,
1290 0x8f, 0xda, 0xa1, /*unassigned*/
1291 0x8e, 0xe0,
1292 };
1293 static const UChar euc_jptoUnicode[]={ 0x0061, 0x4edd, 0x5bec};
1294 static const int32_t from_euc_jpOffs [] ={ 0, 1, 3};
1295
1296 /*EUC_TW*/
1297 static const uint8_t sampleTxt_euc_tw[]={ 0x61, 0xa2, 0xd3, 0x8e, 0xa2, 0xdc, 0xe5,
1298 0x8e, 0xaa, 0xbb, 0xcc,/*unassigned*/
1299 0xe6, 0xca, 0x8a,
1300 };
1301 UChar euc_twtoUnicode[]={ 0x0061, 0x2295, 0x5BF2};
1302 int32_t from_euc_twOffs [] ={ 0, 1, 3};
1303
1304
1305
1306 if(!testConvertToUnicode(sampleTxtEBCIDIC_STATEFUL, UPRV_LENGTHOF(sampleTxtEBCIDIC_STATEFUL),
1307 EBCIDIC_STATEFUL_toUnicode, UPRV_LENGTHOF(EBCIDIC_STATEFUL_toUnicode),"ibm-930",
1308 UCNV_TO_U_CALLBACK_STOP, from_EBCIDIC_STATEFULOffsets, NULL, 0 ))
1309 log_err("EBCIDIC_STATEFUL->u with stop did not match.\n");
1310
1311 if(!testConvertToUnicode(sampleTxt_euc_jp, UPRV_LENGTHOF(sampleTxt_euc_jp),
1312 euc_jptoUnicode, UPRV_LENGTHOF(euc_jptoUnicode),"IBM-eucJP",
1313 UCNV_TO_U_CALLBACK_STOP, from_euc_jpOffs , NULL, 0))
1314 log_err("euc-jp->u with stop did not match.\n");
1315
1316 if(!testConvertToUnicode(sampleTxt_euc_tw, UPRV_LENGTHOF(sampleTxt_euc_tw),
1317 euc_twtoUnicode, UPRV_LENGTHOF(euc_twtoUnicode),"euc-tw",
1318 UCNV_TO_U_CALLBACK_STOP, from_euc_twOffs, NULL, 0 ))
1319 log_err("euc-tw->u with stop did not match.\n");
1320 }
1321#endif
1322
1323 log_verbose("Testing toUnicode for UTF-8 with UCNV_TO_U_CALLBACK_STOP \n");
1324 {
1325 static const uint8_t sampleText1[] = { 0x31, 0xe4, 0xba, 0x8c,
1326 0xe0, 0x80, 0x61,};
1327 static const UChar expected1[] = { 0x0031, 0x4e8c,};
1328 static const int32_t offsets1[] = { 0x0000, 0x0001};
1329
1330 if(!testConvertToUnicode(sampleText1, UPRV_LENGTHOF(sampleText1),
1331 expected1, UPRV_LENGTHOF(expected1),"utf8",
1332 UCNV_TO_U_CALLBACK_STOP, offsets1, NULL, 0 ))
1333 log_err("utf8->u with stop did not match.\n");
1334 }
1335 log_verbose("Testing toUnicode for SCSU with UCNV_TO_U_CALLBACK_STOP \n");
1336 {
1337 static const uint8_t sampleText1[] = { 0xba, 0x8c,0xF8, 0x61,0x0c, 0x0c,0x04};
1338 static const UChar expected1[] = { 0x00ba, 0x008c, 0x00f8, 0x0061};
1339 static const int32_t offsets1[] = { 0x0000, 0x0001,0x0002,0x0003};
1340
1341 if(!testConvertToUnicode(sampleText1, UPRV_LENGTHOF(sampleText1),
1342 expected1, UPRV_LENGTHOF(expected1),"SCSU",
1343 UCNV_TO_U_CALLBACK_STOP, offsets1, NULL, 0 ))
1344 log_err("scsu->u with stop did not match.\n");
1345 }
1346
1347}
1348
1349static void TestSub(int32_t inputsize, int32_t outputsize)
1350{
1351 static const UChar sampleText[] = { 0x0000, 0xAC00, 0xAC01, 0xEF67, 0xD700 };
1352 static const UChar sampleText2[]= { 0x6D63, 0x6D64, 0x6D65, 0x6D66 };
1353
1354 static const uint8_t expsubIBM_949[] =
1355 { 0x00, 0xb0, 0xa1, 0xb0, 0xa2, 0xaf, 0xfe, 0xc8, 0xd3 };
1356
1357 static const uint8_t expsubIBM_943[] = {
1358 0x9f, 0xaf, 0x9f, 0xb1, 0xfc, 0xfc, 0x89, 0x59 };
1359
1360 static const uint8_t expsubIBM_930[] = {
1361 0x0e, 0x5d, 0x5f, 0x5d, 0x63, 0xfe, 0xfe, 0x46, 0x6b, 0x0f };
1362
1363 static const UChar IBM_949subtoUnicode[]= {0x0000, 0xAC00, 0xAC01, 0xfffd, 0xD700 };
1364 static const UChar IBM_943subtoUnicode[]= {0x6D63, 0x6D64, 0xfffd, 0x6D66 };
1365 static const UChar IBM_930subtoUnicode[]= {0x6D63, 0x6D64, 0xfffd, 0x6D66 };
1366
1367 static const int32_t toIBM949Offssub [] ={ 0, 1, 1, 2, 2, 3, 3, 4, 4 };
1368 static const int32_t toIBM943Offssub [] ={ 0, 0, 1, 1, 2, 2, 3, 3 };
1369 static const int32_t toIBM930Offssub [] ={ 0, 0, 0, 1, 1, 2, 2, 3, 3, 3 };
1370
1371 static const int32_t fromIBM949Offs [] = { 0, 1, 3, 5, 7 };
1372 static const int32_t fromIBM943Offs [] = { 0, 2, 4, 6 };
1373 static const int32_t fromIBM930Offs [] = { 1, 3, 5, 7 };
1374
1375 gInBufferSize = inputsize;
1376 gOutBufferSize = outputsize;
1377
1378 /*from unicode*/
1379
1380#if !UCONFIG_NO_LEGACY_CONVERSION
1381 if(!testConvertFromUnicode(sampleText, UPRV_LENGTHOF(sampleText),
1382 expsubIBM_949, UPRV_LENGTHOF(expsubIBM_949), "ibm-949",
1383 UCNV_FROM_U_CALLBACK_SUBSTITUTE, toIBM949Offssub, NULL, 0 ))
1384 log_err("u-> ibm-949 with subst did not match.\n");
1385 if(!testConvertFromUnicode(sampleText2, UPRV_LENGTHOF(sampleText2),
1386 expsubIBM_943, UPRV_LENGTHOF(expsubIBM_943), "ibm-943",
1387 UCNV_FROM_U_CALLBACK_SUBSTITUTE, toIBM943Offssub , NULL, 0))
1388 log_err("u-> ibm-943 with subst did not match.\n");
1389 if(!testConvertFromUnicode(sampleText2, UPRV_LENGTHOF(sampleText2),
1390 expsubIBM_930, UPRV_LENGTHOF(expsubIBM_930), "ibm-930",
1391 UCNV_FROM_U_CALLBACK_SUBSTITUTE, toIBM930Offssub, NULL, 0 ))
1392 log_err("u-> ibm-930 with subst did not match.\n");
1393
1394 log_verbose("Testing fromUnicode with UCNV_FROM_U_CALLBACK_SUBSTITUTE \n");
1395 {
1396 static const UChar inputTest[] = { 0x0061, 0xd801, 0xdc01, 0xd801, 0x0061 };
1397 static const uint8_t toIBM943[]= { 0x61, 0xfc, 0xfc, 0xfc, 0xfc, 0x61 };
1398 static const int32_t offset[]= {0, 1, 1, 3, 3, 4};
1399
1400
1401 /* EUC_JP*/
1402 static const UChar euc_jp_inputText[]={ 0x0061, 0x4edd, 0x5bec, 0xd801, 0xdc01, 0xd801, 0x0061, 0x00a2 };
1403 static const uint8_t to_euc_jp[]={ 0x61, 0xa1, 0xb8, 0x8f, 0xf4, 0xae,
1404 0xf4, 0xfe, 0xf4, 0xfe,
1405 0x61, 0x8e, 0xe0,
1406 };
1407 static const int32_t fromEUC_JPOffs [] ={ 0, 1, 1, 2, 2, 2, 3, 3, 5, 5, 6, 7, 7};
1408
1409 /*EUC_TW*/
1410 static const UChar euc_tw_inputText[]={ 0x0061, 0x2295, 0x5BF2, 0xd801, 0xdc01, 0xd801, 0x0061, 0x8706, 0x8a, };
1411 static const uint8_t to_euc_tw[]={
1412 0x61, 0xa2, 0xd3, 0x8e, 0xa2, 0xdc, 0xe5,
1413 0xfd, 0xfe, 0xfd, 0xfe,
1414 0x61, 0xe6, 0xca, 0x8a,
1415 };
1416
1417 static const int32_t from_euc_twOffs [] ={ 0, 1, 1, 2, 2, 2, 2, 3, 3, 5, 5, 6, 7, 7, 8,};
1418
1419 if(!testConvertFromUnicode(inputTest, UPRV_LENGTHOF(inputTest),
1420 toIBM943, UPRV_LENGTHOF(toIBM943), "ibm-943",
1421 UCNV_FROM_U_CALLBACK_SUBSTITUTE, offset, NULL, 0 ))
1422 log_err("u-> ibm-943 with substitute did not match.\n");
1423
1424 if(!testConvertFromUnicode(euc_jp_inputText, UPRV_LENGTHOF(euc_jp_inputText),
1425 to_euc_jp, UPRV_LENGTHOF(to_euc_jp), "IBM-eucJP",
1426 UCNV_FROM_U_CALLBACK_SUBSTITUTE, fromEUC_JPOffs, NULL, 0 ))
1427 log_err("u-> euc-jp with substitute did not match.\n");
1428
1429 if(!testConvertFromUnicode(euc_tw_inputText, UPRV_LENGTHOF(euc_tw_inputText),
1430 to_euc_tw, UPRV_LENGTHOF(to_euc_tw), "euc-tw",
1431 UCNV_FROM_U_CALLBACK_SUBSTITUTE, from_euc_twOffs, NULL, 0 ))
1432 log_err("u-> euc-tw with substitute did not match.\n");
1433 }
1434#endif
1435
1436 log_verbose("Testing fromUnicode for SCSU with UCNV_FROM_U_CALLBACK_SUBSTITUTE \n");
1437 {
1438 UChar SCSU_inputText[]={ 0x0041, 0xd801/*illegal*/, 0x0042, };
1439
1440 const uint8_t to_SCSU[]={
1441 0x41,
1442 0x0e, 0xff,0xfd,
1443 0x42
1444
1445
1446 };
1447 int32_t from_SCSUOffs [] ={
1448 0,
1449 1,1,1,
1450 2,
1451
1452 };
1453 const uint8_t to_SCSU_1[]={
1454 0x41,
1455
1456 };
1457 int32_t from_SCSUOffs_1 [] ={
1458 0,
1459
1460 };
1461 if(!testConvertFromUnicode(SCSU_inputText, UPRV_LENGTHOF(SCSU_inputText),
1462 to_SCSU, UPRV_LENGTHOF(to_SCSU), "SCSU",
1463 UCNV_FROM_U_CALLBACK_SUBSTITUTE, from_SCSUOffs, NULL, 0 ))
1464 log_err("u-> SCSU with substitute did not match.\n");
1465
1466 if(!testConvertFromUnicodeWithContext(SCSU_inputText, UPRV_LENGTHOF(SCSU_inputText),
1467 to_SCSU_1, UPRV_LENGTHOF(to_SCSU_1), "SCSU",
1468 UCNV_FROM_U_CALLBACK_SUBSTITUTE, from_SCSUOffs_1, NULL, 0,"i",U_ILLEGAL_CHAR_FOUND ))
1469 log_err("u-> SCSU with substitute did not match.\n");
1470 }
1471
1472 log_verbose("Testing fromUnicode for UTF-8 with UCNV_FROM_U_CALLBACK_SUBSTITUTE\n");
1473 {
1474 static const UChar testinput[]={ 0x20ac, 0xd801, 0xdc01, 0xdc01, 0xd801, 0xffff, 0x0061,};
1475 static const uint8_t expectedUTF8[]= { 0xe2, 0x82, 0xac,
1476 0xf0, 0x90, 0x90, 0x81,
1477 0xef, 0xbf, 0xbd, 0xef, 0xbf, 0xbd,
1478 0xef, 0xbf, 0xbf, 0x61,
1479
1480 };
1481 static const int32_t offsets[]={ 0, 0, 0, 1, 1, 1, 1, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6 };
1482 if(!testConvertFromUnicode(testinput, UPRV_LENGTHOF(testinput),
1483 expectedUTF8, UPRV_LENGTHOF(expectedUTF8), "utf8",
1484 UCNV_FROM_U_CALLBACK_SUBSTITUTE, offsets, NULL, 0 )) {
1485 log_err("u-> utf8 with substitute did not match.\n");
1486 }
1487 }
1488
1489 log_verbose("Testing fromUnicode for UTF-16 with UCNV_FROM_U_CALLBACK_SUBSTITUTE\n");
1490 {
1491 static const UChar in[]={ 0x0041, 0xfeff };
1492
1493 static const uint8_t out[]={
1494#if U_IS_BIG_ENDIAN
1495 0xfe, 0xff,
1496 0x00, 0x41,
1497 0xfe, 0xff
1498#else
1499 0xff, 0xfe,
1500 0x41, 0x00,
1501 0xff, 0xfe
1502#endif
1503 };
1504 static const int32_t offsets[]={
1505 -1, -1, 0, 0, 1, 1
1506 };
1507
1508 if(!testConvertFromUnicode(in, UPRV_LENGTHOF(in),
1509 out, UPRV_LENGTHOF(out), "UTF-16",
1510 UCNV_FROM_U_CALLBACK_SUBSTITUTE, offsets, NULL, 0)
1511 ) {
1512 log_err("u->UTF-16 with substitute did not match.\n");
1513 }
1514 }
1515
1516 log_verbose("Testing fromUnicode for UTF-32 with UCNV_FROM_U_CALLBACK_SUBSTITUTE\n");
1517 {
1518 static const UChar in[]={ 0x0041, 0xfeff };
1519
1520 static const uint8_t out[]={
1521#if U_IS_BIG_ENDIAN
1522 0x00, 0x00, 0xfe, 0xff,
1523 0x00, 0x00, 0x00, 0x41,
1524 0x00, 0x00, 0xfe, 0xff
1525#else
1526 0xff, 0xfe, 0x00, 0x00,
1527 0x41, 0x00, 0x00, 0x00,
1528 0xff, 0xfe, 0x00, 0x00
1529#endif
1530 };
1531 static const int32_t offsets[]={
1532 -1, -1, -1, -1, 0, 0, 0, 0, 1, 1, 1, 1
1533 };
1534
1535 if(!testConvertFromUnicode(in, UPRV_LENGTHOF(in),
1536 out, UPRV_LENGTHOF(out), "UTF-32",
1537 UCNV_FROM_U_CALLBACK_SUBSTITUTE, offsets, NULL, 0)
1538 ) {
1539 log_err("u->UTF-32 with substitute did not match.\n");
1540 }
1541 }
1542
1543 /*to unicode*/
1544
1545#if !UCONFIG_NO_LEGACY_CONVERSION
1546 if(!testConvertToUnicode(expsubIBM_949, UPRV_LENGTHOF(expsubIBM_949),
1547 IBM_949subtoUnicode, UPRV_LENGTHOF(IBM_949subtoUnicode),"ibm-949",
1548 UCNV_TO_U_CALLBACK_SUBSTITUTE, fromIBM949Offs, NULL, 0 ))
1549 log_err("ibm-949->u with substitute did not match.\n");
1550 if(!testConvertToUnicode(expsubIBM_943, UPRV_LENGTHOF(expsubIBM_943),
1551 IBM_943subtoUnicode, UPRV_LENGTHOF(IBM_943subtoUnicode),"ibm-943",
1552 UCNV_TO_U_CALLBACK_SUBSTITUTE, fromIBM943Offs, NULL, 0 ))
1553 log_err("ibm-943->u with substitute did not match.\n");
1554 if(!testConvertToUnicode(expsubIBM_930, UPRV_LENGTHOF(expsubIBM_930),
1555 IBM_930subtoUnicode, UPRV_LENGTHOF(IBM_930subtoUnicode),"ibm-930",
1556 UCNV_TO_U_CALLBACK_SUBSTITUTE, fromIBM930Offs, NULL, 0 ))
1557 log_err("ibm-930->u with substitute did not match.\n");
1558
1559 log_verbose("Testing toUnicode with UCNV_TO_U_CALLBACK_SUBSTITUTE \n");
1560 {
1561
1562 const uint8_t sampleTxtEBCIDIC_STATEFUL [] ={
1563 0x0e, 0x5d, 0x5f , 0x41, 0x79, 0x41, 0x44
1564 };
1565 UChar EBCIDIC_STATEFUL_toUnicode[] ={ 0x6d63, 0xfffd, 0x03b4
1566 };
1567 int32_t from_EBCIDIC_STATEFULOffsets []={ 1, 3, 5};
1568
1569
1570 /* EUC_JP*/
1571 const uint8_t sampleTxt_euc_jp[]={ 0x61, 0xa1, 0xb8, 0x8f, 0xf4, 0xae,
1572 0x8f, 0xda, 0xa1, /*unassigned*/
1573 0x8e, 0xe0, 0x8a
1574 };
1575 UChar euc_jptoUnicode[]={ 0x0061, 0x4edd, 0x5bec, 0xfffd, 0x00a2, 0x008a };
1576 int32_t from_euc_jpOffs [] ={ 0, 1, 3, 6, 9, 11 };
1577
1578 /*EUC_TW*/
1579 const uint8_t sampleTxt_euc_tw[]={
1580 0x61, 0xa2, 0xd3, 0x8e, 0xa2, 0xdc, 0xe5,
1581 0x8e, 0xaa, 0xbb, 0xcc,/*unassigned*/
1582 0xe6, 0xca, 0x8a,
1583 };
1584 UChar euc_twtoUnicode[]={ 0x0061, 0x2295, 0x5BF2, 0xfffd, 0x8706, 0x8a, };
1585 int32_t from_euc_twOffs [] ={ 0, 1, 3, 7, 11, 13};
1586
1587
1588 if(!testConvertToUnicode(sampleTxtEBCIDIC_STATEFUL, UPRV_LENGTHOF(sampleTxtEBCIDIC_STATEFUL),
1589 EBCIDIC_STATEFUL_toUnicode, UPRV_LENGTHOF(EBCIDIC_STATEFUL_toUnicode),"ibm-930",
1590 UCNV_TO_U_CALLBACK_SUBSTITUTE, from_EBCIDIC_STATEFULOffsets, NULL, 0 ))
1591 log_err("EBCIDIC_STATEFUL->u with substitute did not match.\n");
1592
1593
1594 if(!testConvertToUnicode(sampleTxt_euc_jp, UPRV_LENGTHOF(sampleTxt_euc_jp),
1595 euc_jptoUnicode, UPRV_LENGTHOF(euc_jptoUnicode),"IBM-eucJP",
1596 UCNV_TO_U_CALLBACK_SUBSTITUTE, from_euc_jpOffs, NULL, 0 ))
1597 log_err("euc-jp->u with substitute did not match.\n");
1598
1599
1600 if(!testConvertToUnicode(sampleTxt_euc_tw, UPRV_LENGTHOF(sampleTxt_euc_tw),
1601 euc_twtoUnicode, UPRV_LENGTHOF(euc_twtoUnicode),"euc-tw",
1602 UCNV_TO_U_CALLBACK_SUBSTITUTE, from_euc_twOffs, NULL, 0 ))
1603 log_err("euc-tw->u with substitute did not match.\n");
1604
1605
1606 if(!testConvertToUnicodeWithContext(sampleTxt_euc_jp, UPRV_LENGTHOF(sampleTxt_euc_jp),
1607 euc_jptoUnicode, UPRV_LENGTHOF(euc_jptoUnicode),"IBM-eucJP",
1608 UCNV_TO_U_CALLBACK_SUBSTITUTE, from_euc_jpOffs, NULL, 0 ,"i", U_ILLEGAL_CHAR_FOUND))
1609 log_err("euc-jp->u with substitute did not match.\n");
1610 }
1611#endif
1612
1613 log_verbose("Testing toUnicode for UTF-8 with UCNV_TO_U_CALLBACK_SUBSTITUTE \n");
1614 {
1615 const uint8_t sampleText1[] = { 0x31, 0xe4, 0xba, 0x8c,
1616 0xe0, 0x80, 0x61,};
1617 UChar expected1[] = { 0x0031, 0x4e8c, 0xfffd, 0xfffd, 0x0061};
1618 int32_t offsets1[] = { 0x0000, 0x0001, 0x0004, 0x0005, 0x0006};
1619
1620 if(!testConvertToUnicode(sampleText1, UPRV_LENGTHOF(sampleText1),
1621 expected1, UPRV_LENGTHOF(expected1),"utf8",
1622 UCNV_TO_U_CALLBACK_SUBSTITUTE, offsets1, NULL, 0 ))
1623 log_err("utf8->u with substitute did not match.\n");
1624 }
1625 log_verbose("Testing toUnicode for SCSU with UCNV_TO_U_CALLBACK_SUBSTITUTE \n");
1626 {
1627 const uint8_t sampleText1[] = { 0xba, 0x8c,0xF8, 0x61,0x0c, 0x0c,};
1628 UChar expected1[] = { 0x00ba, 0x008c, 0x00f8, 0x0061,0xfffd,0xfffd};
1629 int32_t offsets1[] = { 0x0000, 0x0001,0x0002,0x0003,4,5};
1630
1631 if(!testConvertToUnicode(sampleText1, UPRV_LENGTHOF(sampleText1),
1632 expected1, UPRV_LENGTHOF(expected1),"SCSU",
1633 UCNV_TO_U_CALLBACK_SUBSTITUTE, offsets1, NULL, 0 ))
1634 log_err("scsu->u with stop did not match.\n");
1635 }
1636
1637#if !UCONFIG_NO_LEGACY_CONVERSION
1638 log_verbose("Testing ibm-930 subchar/subchar1\n");
1639 {
1640 static const UChar u1[]={ 0x6d63, 0x6d64, 0x6d65, 0x6d66, 0xdf };
1641 static const uint8_t s1[]={ 0x0e, 0x5d, 0x5f, 0x5d, 0x63, 0xfe, 0xfe, 0x46, 0x6b, 0x0f, 0x3f };
1642 static const int32_t offsets1[]={ 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4 };
1643
1644 static const UChar u2[]={ 0x6d63, 0x6d64, 0xfffd, 0x6d66, 0x1a };
1645 static const uint8_t s2[]={ 0x0e, 0x5d, 0x5f, 0x5d, 0x63, 0xfc, 0xfc, 0x46, 0x6b, 0x0f, 0x57 };
1646 static const int32_t offsets2[]={ 1, 3, 5, 7, 10 };
1647
1648 if(!testConvertFromUnicode(u1, UPRV_LENGTHOF(u1), s1, UPRV_LENGTHOF(s1), "ibm-930",
1649 UCNV_FROM_U_CALLBACK_SUBSTITUTE, offsets1, NULL, 0)
1650 ) {
1651 log_err("u->ibm-930 subchar/subchar1 did not match.\n");
1652 }
1653
1654 if(!testConvertToUnicode(s2, UPRV_LENGTHOF(s2), u2, UPRV_LENGTHOF(u2), "ibm-930",
1655 UCNV_TO_U_CALLBACK_SUBSTITUTE, offsets2, NULL, 0)
1656 ) {
1657 log_err("ibm-930->u subchar/subchar1 did not match.\n");
1658 }
1659 }
1660
1661 log_verbose("Testing GB 18030 with substitute callbacks\n");
1662 {
1663 static const UChar u2[]={
1664 0x24, 0x7f, 0x80, 0x1f9, 0x20ac, 0x4e00, 0x9fa6, 0xffff, 0xd800, 0xdc00, 0xfffd, 0xdbff, 0xdfff };
1665 static const uint8_t gb2[]={
1666 0x24, 0x7f, 0x81, 0x30, 0x81, 0x30, 0xa8, 0xbf, 0xa2, 0xe3, 0xd2, 0xbb, 0x82, 0x35, 0x8f, 0x33, 0x84, 0x31, 0xa4, 0x39, 0x90, 0x30, 0x81, 0x30, 0xe3, 0x32, 0x9a, 0x36, 0xe3, 0x32, 0x9a, 0x35 };
1667 static const int32_t offsets2[]={
1668 0, 1, 2, 6, 8, 10, 12, 16, 20, 20, 24, 28, 28 };
1669
1670 if(!testConvertToUnicode(gb2, UPRV_LENGTHOF(gb2), u2, UPRV_LENGTHOF(u2), "gb18030",
1671 UCNV_TO_U_CALLBACK_SUBSTITUTE, offsets2, NULL, 0)
1672 ) {
1673 log_err("gb18030->u with substitute did not match.\n");
1674 }
1675 }
1676#endif
1677
1678 log_verbose("Testing UTF-7 toUnicode with substitute callbacks\n");
1679 {
1680 static const uint8_t utf7[]={
1681 /* a~ a+AB~ a+AB\x0c a+AB- a+AB. a+. */
1682 0x61, 0x7e, 0x61, 0x2b, 0x41, 0x42, 0x7e, 0x61, 0x2b, 0x41, 0x42, 0x0c, 0x61, 0x2b, 0x41, 0x42, 0x2d, 0x61, 0x2b, 0x41, 0x42, 0x2e, 0x61, 0x2b, 0x2e
1683 };
1684 static const UChar unicode[]={
1685 0x61, 0xfffd, 0x61, 0xfffd, 0xfffd, 0x61, 0xfffd, 0xfffd, 0x61, 0xfffd, 0x61, 0xfffd, 0x2e, 0x61, 0xfffd, 0x2e
1686 };
1687 static const int32_t offsets[]={
1688 0, 1, 2, 4, 6, 7, 9, 11, 12, 14, 17, 19, 21, 22, 23, 24
1689 };
1690
1691 if(!testConvertToUnicode(utf7, UPRV_LENGTHOF(utf7), unicode, UPRV_LENGTHOF(unicode), "UTF-7",
1692 UCNV_TO_U_CALLBACK_SUBSTITUTE, offsets, NULL, 0)
1693 ) {
1694 log_err("UTF-7->u with substitute did not match.\n");
1695 }
1696 }
1697
1698 log_verbose("Testing UTF-16 toUnicode with substitute callbacks\n");
1699 {
1700 static const uint8_t
1701 in1[]={ 0xfe, 0xff, 0x4e, 0x00, 0xfe, 0xff },
1702 in2[]={ 0xff, 0xfe, 0x4e, 0x00, 0xfe, 0xff },
1703 in3[]={ 0xfe, 0xfd, 0x4e, 0x00, 0xfe, 0xff };
1704
1705 static const UChar
1706 out1[]={ 0x4e00, 0xfeff },
1707 out2[]={ 0x004e, 0xfffe },
1708 out3[]={ 0xfefd, 0x4e00, 0xfeff };
1709
1710 static const int32_t
1711 offsets1[]={ 2, 4 },
1712 offsets2[]={ 2, 4 },
1713 offsets3[]={ 0, 2, 4 };
1714
1715 if(!testConvertToUnicode(in1, UPRV_LENGTHOF(in1), out1, UPRV_LENGTHOF(out1), "UTF-16",
1716 UCNV_TO_U_CALLBACK_SUBSTITUTE, offsets1, NULL, 0)
1717 ) {
1718 log_err("UTF-16 (BE BOM)->u with substitute did not match.\n");
1719 }
1720
1721 if(!testConvertToUnicode(in2, UPRV_LENGTHOF(in2), out2, UPRV_LENGTHOF(out2), "UTF-16",
1722 UCNV_TO_U_CALLBACK_SUBSTITUTE, offsets2, NULL, 0)
1723 ) {
1724 log_err("UTF-16 (LE BOM)->u with substitute did not match.\n");
1725 }
1726
1727 if(!testConvertToUnicode(in3, UPRV_LENGTHOF(in3), out3, UPRV_LENGTHOF(out3), "UTF-16",
1728 UCNV_TO_U_CALLBACK_SUBSTITUTE, offsets3, NULL, 0)
1729 ) {
1730 log_err("UTF-16 (no BOM)->u with substitute did not match.\n");
1731 }
1732 }
1733
1734 log_verbose("Testing UTF-32 toUnicode with substitute callbacks\n");
1735 {
1736 static const uint8_t
1737 in1[]={ 0x00, 0x00, 0xfe, 0xff, 0x00, 0x10, 0x0f, 0x00, 0x00, 0x00, 0xfe, 0xff },
1738 in2[]={ 0xff, 0xfe, 0x00, 0x00, 0x00, 0x10, 0x0f, 0x00, 0xfe, 0xff, 0x00, 0x00 },
1739 in3[]={ 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x10, 0x0f, 0x00, 0x00, 0x00, 0xd8, 0x40, 0x00, 0x00, 0xdc, 0x01 },
1740 in4[]={ 0x00, 0x01, 0x02, 0x03, 0x00, 0x11, 0x12, 0x00, 0x00, 0x00, 0x4e, 0x00 };
1741
1742 static const UChar
1743 out1[]={ U16_LEAD(0x100f00), U16_TRAIL(0x100f00), 0xfeff },
1744 out2[]={ U16_LEAD(0x0f1000), U16_TRAIL(0x0f1000), 0xfffe },
1745 out3[]={ 0xfefe, U16_LEAD(0x100f00), U16_TRAIL(0x100f00), 0xfffd, 0xfffd },
1746 out4[]={ U16_LEAD(0x10203), U16_TRAIL(0x10203), 0xfffd, 0x4e00 };
1747
1748 static const int32_t
1749 offsets1[]={ 4, 4, 8 },
1750 offsets2[]={ 4, 4, 8 },
1751 offsets3[]={ 0, 4, 4, 8, 12 },
1752 offsets4[]={ 0, 0, 4, 8 };
1753
1754 if(!testConvertToUnicode(in1, UPRV_LENGTHOF(in1), out1, UPRV_LENGTHOF(out1), "UTF-32",
1755 UCNV_TO_U_CALLBACK_SUBSTITUTE, offsets1, NULL, 0)
1756 ) {
1757 log_err("UTF-32 (BE BOM)->u with substitute did not match.\n");
1758 }
1759
1760 if(!testConvertToUnicode(in2, UPRV_LENGTHOF(in2), out2, UPRV_LENGTHOF(out2), "UTF-32",
1761 UCNV_TO_U_CALLBACK_SUBSTITUTE, offsets2, NULL, 0)
1762 ) {
1763 log_err("UTF-32 (LE BOM)->u with substitute did not match.\n");
1764 }
1765
1766 if(!testConvertToUnicode(in3, UPRV_LENGTHOF(in3), out3, UPRV_LENGTHOF(out3), "UTF-32",
1767 UCNV_TO_U_CALLBACK_SUBSTITUTE, offsets3, NULL, 0)
1768 ) {
1769 log_err("UTF-32 (no BOM)->u with substitute did not match.\n");
1770 }
1771
1772 if(!testConvertToUnicode(in4, UPRV_LENGTHOF(in4), out4, UPRV_LENGTHOF(out4), "UTF-32",
1773 UCNV_TO_U_CALLBACK_SUBSTITUTE, offsets4, NULL, 0)
1774 ) {
1775 log_err("UTF-32 (no BOM, with error)->u with substitute did not match.\n");
1776 }
1777 }
1778}
1779
1780static void TestSubWithValue(int32_t inputsize, int32_t outputsize)
1781{
1782 UChar sampleText[] = { 0x0000, 0xAC00, 0xAC01, 0xEF67, 0xD700 };
1783 UChar sampleText2[] = { 0x6D63, 0x6D64, 0x6D65, 0x6D66 };
1784
1785 const uint8_t expsubwvalIBM_949[]= {
1786 0x00, 0xb0, 0xa1, 0xb0, 0xa2,
1787 0x25, 0x55, 0x45, 0x46, 0x36, 0x37, 0xc8, 0xd3 };
1788
1789 const uint8_t expsubwvalIBM_943[]= {
1790 0x9f, 0xaf, 0x9f, 0xb1,
1791 0x25, 0x55, 0x36, 0x44, 0x36, 0x35, 0x89, 0x59 };
1792
1793 const uint8_t expsubwvalIBM_930[] = {
1794 0x0e, 0x5d, 0x5f, 0x5d, 0x63, 0x0f, 0x6c, 0xe4, 0xf6, 0xc4, 0xf6, 0xf5, 0x0e, 0x46, 0x6b, 0x0f };
1795
1796 int32_t toIBM949Offs [] ={ 0, 1, 1, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4 };
1797 int32_t toIBM943Offs [] = { 0, 0, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3 };
1798 int32_t toIBM930Offs [] = { 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3 }; /* last item: 3,3,3,3 because there's SO+DBCS+SI */
1799
1800 gInBufferSize = inputsize;
1801 gOutBufferSize = outputsize;
1802
1803 /*from Unicode*/
1804
1805#if !UCONFIG_NO_LEGACY_CONVERSION
1806 if(!testConvertFromUnicode(sampleText, UPRV_LENGTHOF(sampleText),
1807 expsubwvalIBM_949, UPRV_LENGTHOF(expsubwvalIBM_949), "ibm-949",
1808 UCNV_FROM_U_CALLBACK_ESCAPE, toIBM949Offs, NULL, 0 ))
1809 log_err("u-> ibm-949 with subst with value did not match.\n");
1810
1811 if(!testConvertFromUnicode(sampleText2, UPRV_LENGTHOF(sampleText2),
1812 expsubwvalIBM_943, UPRV_LENGTHOF(expsubwvalIBM_943), "ibm-943",
1813 UCNV_FROM_U_CALLBACK_ESCAPE, toIBM943Offs, NULL, 0 ))
1814 log_err("u-> ibm-943 with sub with value did not match.\n");
1815
1816 if(!testConvertFromUnicode(sampleText2, UPRV_LENGTHOF(sampleText2),
1817 expsubwvalIBM_930, UPRV_LENGTHOF(expsubwvalIBM_930), "ibm-930",
1818 UCNV_FROM_U_CALLBACK_ESCAPE, toIBM930Offs, NULL, 0 ))
1819 log_err("u-> ibm-930 with subst with value did not match.\n");
1820
1821
1822 log_verbose("Testing fromUnicode with UCNV_FROM_U_CALLBACK_ESCAPE \n");
1823 {
1824 static const UChar inputTest[] = { 0x0061, 0xd801, 0xdc01, 0xd801, 0x0061 };
1825 static const uint8_t toIBM943[]= { 0x61,
1826 0x25, 0x55, 0x44, 0x38, 0x30, 0x31,
1827 0x25, 0x55, 0x44, 0x43, 0x30, 0x31,
1828 0x25, 0x55, 0x44, 0x38, 0x30, 0x31,
1829 0x61 };
1830 static const int32_t offset[]= {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 4};
1831
1832
1833 /* EUC_JP*/
1834 static const UChar euc_jp_inputText[]={ 0x0061, 0x4edd, 0x5bec, 0xd801, 0xdc01, 0xd801, 0x0061, 0x00a2, };
1835 static const uint8_t to_euc_jp[]={ 0x61, 0xa1, 0xb8, 0x8f, 0xf4, 0xae,
1836 0x25, 0x55, 0x44, 0x38, 0x30, 0x31,
1837 0x25, 0x55, 0x44, 0x43, 0x30, 0x31,
1838 0x25, 0x55, 0x44, 0x38, 0x30, 0x31,
1839 0x61, 0x8e, 0xe0,
1840 };
1841 static const int32_t fromEUC_JPOffs [] ={ 0, 1, 1, 2, 2, 2,
1842 3, 3, 3, 3, 3, 3,
1843 3, 3, 3, 3, 3, 3,
1844 5, 5, 5, 5, 5, 5,
1845 6, 7, 7,
1846 };
1847
1848 /*EUC_TW*/
1849 static const UChar euc_tw_inputText[]={ 0x0061, 0x2295, 0x5BF2, 0xd801, 0xdc01, 0xd801, 0x0061, 0x8706, 0x8a, };
1850 static const uint8_t to_euc_tw[]={
1851 0x61, 0xa2, 0xd3, 0x8e, 0xa2, 0xdc, 0xe5,
1852 0x25, 0x55, 0x44, 0x38, 0x30, 0x31,
1853 0x25, 0x55, 0x44, 0x43, 0x30, 0x31,
1854 0x25, 0x55, 0x44, 0x38, 0x30, 0x31,
1855 0x61, 0xe6, 0xca, 0x8a,
1856 };
1857 static const int32_t from_euc_twOffs [] ={ 0, 1, 1, 2, 2, 2, 2,
1858 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 5, 5, 5, 5, 5,
1859 6, 7, 7, 8,
1860 };
1861 /*ISO-2022-JP*/
1862 static const UChar iso_2022_jp_inputText1[]={ 0x3000, 0x00E9, 0x3001,0x00E9, 0x0042} ;
1863 static const uint8_t to_iso_2022_jp1[]={
1864 0x1b, 0x24, 0x42, 0x21, 0x21,
1865 0x1b, 0x28, 0x42, 0x25, 0x55, 0x30, 0x30, 0x45, 0x39,
1866 0x1b, 0x24, 0x42, 0x21, 0x22,
1867 0x1b, 0x28, 0x42, 0x25, 0x55, 0x30, 0x30, 0x45, 0x39,
1868 0x42,
1869 };
1870
1871 static const int32_t from_iso_2022_jpOffs1 [] ={
1872 0,0,0,0,0,
1873 1,1,1,1,1,1,1,1,1,
1874 2,2,2,2,2,
1875 3,3,3,3,3,3,3,3,3,
1876 4,
1877 };
1878 /* surrogate pair*/
1879 static const UChar iso_2022_jp_inputText2[]={ 0x3000, 0xD84D, 0xDC56, 0x3001,0xD84D,0xDC56, 0x0042} ;
1880 static const uint8_t to_iso_2022_jp2[]={
1881 0x1b, 0x24, 0x42, 0x21, 0x21,
1882 0x1b, 0x28, 0x42, 0x25, 0x55, 0x44, 0x38, 0x34, 0x44,
1883 0x25, 0x55, 0x44, 0x43, 0x35, 0x36,
1884 0x1b, 0x24, 0x42, 0x21, 0x22,
1885 0x1b, 0x28, 0x42, 0x25, 0x55, 0x44, 0x38, 0x34, 0x44,
1886 0x25, 0x55, 0x44, 0x43, 0x35, 0x36,
1887 0x42,
1888 };
1889 static const int32_t from_iso_2022_jpOffs2 [] ={
1890 0,0,0,0,0,
1891 1,1,1,1,1,1,1,1,1,
1892 1,1,1,1,1,1,
1893 3,3,3,3,3,
1894 4,4,4,4,4,4,4,4,4,
1895 4,4,4,4,4,4,
1896 6,
1897 };
1898
1899 /*ISO-2022-cn*/
1900 static const UChar iso_2022_cn_inputText[]={ 0x0041, 0x3712, 0x0042, };
1901 static const uint8_t to_iso_2022_cn[]={
1902 0x41,
1903 0x25, 0x55, 0x33, 0x37, 0x31, 0x32,
1904 0x42,
1905 };
1906 static const int32_t from_iso_2022_cnOffs [] ={
1907 0,
1908 1,1,1,1,1,1,
1909 2,
1910 };
1911
1912 static const UChar iso_2022_cn_inputText4[]={ 0x3000, 0xD84D, 0xDC56, 0x3001,0xD84D,0xDC56, 0x0042};
1913
1914 static const uint8_t to_iso_2022_cn4[]={
1915 0x1b, 0x24, 0x29, 0x41, 0x0e, 0x21, 0x21,
1916 0x0f, 0x25, 0x55, 0x44, 0x38, 0x34, 0x44,
1917 0x25, 0x55, 0x44, 0x43, 0x35, 0x36,
1918 0x0e, 0x21, 0x22,
1919 0x0f, 0x25, 0x55, 0x44, 0x38, 0x34, 0x44,
1920 0x25, 0x55, 0x44, 0x43, 0x35, 0x36,
1921 0x42,
1922 };
1923 static const int32_t from_iso_2022_cnOffs4 [] ={
1924 0,0,0,0,0,0,0,
1925 1,1,1,1,1,1,1,
1926 1,1,1,1,1,1,
1927 3,3,3,
1928 4,4,4,4,4,4,4,
1929 4,4,4,4,4,4,
1930 6
1931
1932 };
1933
1934 /*ISO-2022-kr*/
1935 static const UChar iso_2022_kr_inputText2[]={ 0x0041, 0x03A0,0xD84D, 0xDC56/*unassigned*/,0x03A0, 0x0042,0xD84D, 0xDC56/*unassigned*/,0x43 };
1936 static const uint8_t to_iso_2022_kr2[]={
1937 0x1b, 0x24, 0x29, 0x43,
1938 0x41,
1939 0x0e, 0x25, 0x50,
1940 0x0f, 0x25, 0x55, 0x44, 0x38, 0x34, 0x44,
1941 0x25, 0x55, 0x44, 0x43, 0x35, 0x36,
1942 0x0e, 0x25, 0x50,
1943 0x0f, 0x42,
1944 0x25, 0x55, 0x44, 0x38, 0x34, 0x44,
1945 0x25, 0x55, 0x44, 0x43, 0x35, 0x36,
1946 0x43
1947 };
1948 static const int32_t from_iso_2022_krOffs2 [] ={
1949 -1,-1,-1,-1,
1950 0,
1951 1,1,1,
1952 2,2,2,2,2,2,2,
1953 2,2,2,2,2,2,
1954 4,4,4,
1955 5,5,
1956 6,6,6,6,6,6,
1957 6,6,6,6,6,6,
1958 8,
1959 };
1960
1961 static const UChar iso_2022_kr_inputText[]={ 0x0041, 0x03A0,0x3712/*unassigned*/,0x03A0, 0x0042,0x3712/*unassigned*/,0x43 };
1962 static const uint8_t to_iso_2022_kr[]={
1963 0x1b, 0x24, 0x29, 0x43,
1964 0x41,
1965 0x0e, 0x25, 0x50,
1966 0x0f, 0x25, 0x55, 0x33, 0x37, 0x31, 0x32, /*unassigned*/
1967 0x0e, 0x25, 0x50,
1968 0x0f, 0x42,
1969 0x25, 0x55, 0x33, 0x37, 0x31, 0x32, /*unassigned*/
1970 0x43
1971 };
1972
1973
1974 static const int32_t from_iso_2022_krOffs [] ={
1975 -1,-1,-1,-1,
1976 0,
1977 1,1,1,
1978 2,2,2,2,2,2,2,
1979 3,3,3,
1980 4,4,
1981 5,5,5,5,5,5,
1982 6,
1983 };
1984 /* HZ encoding */
1985 static const UChar hz_inputText[]={ 0x0041, 0x03A0,0x0662/*unassigned*/,0x03A0, 0x0042, };
1986
1987 static const uint8_t to_hz[]={
1988 0x7e, 0x7d, 0x41,
1989 0x7e, 0x7b, 0x26, 0x30,
1990 0x7e, 0x7d, 0x25, 0x55, 0x30, 0x36, 0x36, 0x32, /*unassigned*/
1991 0x7e, 0x7b, 0x26, 0x30,
1992 0x7e, 0x7d, 0x42,
1993
1994 };
1995 static const int32_t from_hzOffs [] ={
1996 0,0,0,
1997 1,1,1,1,
1998 2,2,2,2,2,2,2,2,
1999 3,3,3,3,
2000 4,4,4
2001 };
2002
2003 static const UChar hz_inputText2[]={ 0x0041, 0x03A0,0xD84D, 0xDC56/*unassigned*/,0x03A0, 0x0042,0xD84D, 0xDC56/*unassigned*/,0x43 };
2004 static const uint8_t to_hz2[]={
2005 0x7e, 0x7d, 0x41,
2006 0x7e, 0x7b, 0x26, 0x30,
2007 0x7e, 0x7d, 0x25, 0x55, 0x44, 0x38, 0x34, 0x44,
2008 0x25, 0x55, 0x44, 0x43, 0x35, 0x36,
2009 0x7e, 0x7b, 0x26, 0x30,
2010 0x7e, 0x7d, 0x42,
2011 0x25, 0x55, 0x44, 0x38, 0x34, 0x44,
2012 0x25, 0x55, 0x44, 0x43, 0x35, 0x36,
2013 0x43
2014 };
2015 static const int32_t from_hzOffs2 [] ={
2016 0,0,0,
2017 1,1,1,1,
2018 2,2,2,2,2,2,2,2,
2019 2,2,2,2,2,2,
2020 4,4,4,4,
2021 5,5,5,
2022 6,6,6,6,6,6,
2023 6,6,6,6,6,6,
2024 8,
2025 };
2026
2027 /*ISCII*/
2028 static const UChar iscii_inputText[]={ 0x0041, 0x0901,0x3712/*unassigned*/,0x0902, 0x0042,0x3712/*unassigned*/,0x43 };
2029 static const uint8_t to_iscii[]={
2030 0x41,
2031 0xef, 0x42, 0xa1,
2032 0x25, 0x55, 0x33, 0x37, 0x31, 0x32, /*unassigned*/
2033 0xa2,
2034 0x42,
2035 0x25, 0x55, 0x33, 0x37, 0x31, 0x32, /*unassigned*/
2036 0x43
2037 };
2038
2039
2040 static const int32_t from_isciiOffs [] ={
2041 0,
2042 1,1,1,
2043 2,2,2,2,2,2,
2044 3,
2045 4,
2046 5,5,5,5,5,5,
2047 6,
2048 };
2049
2050 if(!testConvertFromUnicode(inputTest, UPRV_LENGTHOF(inputTest),
2051 toIBM943, UPRV_LENGTHOF(toIBM943), "ibm-943",
2052 UCNV_FROM_U_CALLBACK_ESCAPE, offset, NULL, 0 ))
2053 log_err("u-> ibm-943 with subst with value did not match.\n");
2054
2055 if(!testConvertFromUnicode(euc_jp_inputText, UPRV_LENGTHOF(euc_jp_inputText),
2056 to_euc_jp, UPRV_LENGTHOF(to_euc_jp), "IBM-eucJP",
2057 UCNV_FROM_U_CALLBACK_ESCAPE, fromEUC_JPOffs, NULL, 0 ))
2058 log_err("u-> euc-jp with subst with value did not match.\n");
2059
2060 if(!testConvertFromUnicode(euc_tw_inputText, UPRV_LENGTHOF(euc_tw_inputText),
2061 to_euc_tw, UPRV_LENGTHOF(to_euc_tw), "euc-tw",
2062 UCNV_FROM_U_CALLBACK_ESCAPE, from_euc_twOffs, NULL, 0 ))
2063 log_err("u-> euc-tw with subst with value did not match.\n");
2064
2065 if(!testConvertFromUnicode(iso_2022_jp_inputText1, UPRV_LENGTHOF(iso_2022_jp_inputText1),
2066 to_iso_2022_jp1, UPRV_LENGTHOF(to_iso_2022_jp1), "iso-2022-jp",
2067 UCNV_FROM_U_CALLBACK_ESCAPE, from_iso_2022_jpOffs1, NULL, 0 ))
2068 log_err("u-> iso_2022_jp with subst with value did not match.\n");
2069
2070 if(!testConvertFromUnicode(iso_2022_jp_inputText1, UPRV_LENGTHOF(iso_2022_jp_inputText1),
2071 to_iso_2022_jp1, UPRV_LENGTHOF(to_iso_2022_jp1), "iso-2022-jp",
2072 UCNV_FROM_U_CALLBACK_ESCAPE, from_iso_2022_jpOffs1, NULL, 0 ))
2073 log_err("u-> iso_2022_jp with subst with value did not match.\n");
2074
2075 if(!testConvertFromUnicode(iso_2022_jp_inputText2, UPRV_LENGTHOF(iso_2022_jp_inputText2),
2076 to_iso_2022_jp2, UPRV_LENGTHOF(to_iso_2022_jp2), "iso-2022-jp",
2077 UCNV_FROM_U_CALLBACK_ESCAPE, from_iso_2022_jpOffs2, NULL, 0 ))
2078 log_err("u-> iso_2022_jp with subst with value did not match.\n");
2079 /*ESCAPE OPTIONS*/
2080 {
2081 /* surrogate pair*/
2082 static const UChar iso_2022_jp_inputText3[]={ 0x3000, 0xD84D, 0xDC56, 0x3001,0xD84D,0xDC56, 0x0042,0x0901c } ;
2083 static const uint8_t to_iso_2022_jp3_v2[]={
2084 0x1b, 0x24, 0x42, 0x21, 0x21,
2085 0x1b, 0x28, 0x42, 0x26, 0x23, 0x31, 0x34, 0x34, 0x34, 0x37, 0x30, 0x3b,
2086
2087 0x1b, 0x24, 0x42, 0x21, 0x22,
2088 0x1b, 0x28, 0x42, 0x26, 0x23, 0x31, 0x34, 0x34, 0x34, 0x37, 0x30, 0x3b,
2089
2090 0x42,
2091 0x26, 0x23, 0x33, 0x36, 0x38, 0x39, 0x32, 0x3b,
2092 };
2093
2094 static const int32_t from_iso_2022_jpOffs3_v2 [] ={
2095 0,0,0,0,0,
2096 1,1,1,1,1,1,1,1,1,1,1,1,
2097
2098 3,3,3,3,3,
2099 4,4,4,4,4,4,4,4,4,4,4,4,
2100
2101 6,
2102 7,7,7,7,7,7,7,7,7
2103 };
2104
2105 if(!testConvertFromUnicodeWithContext(iso_2022_jp_inputText3, UPRV_LENGTHOF(iso_2022_jp_inputText3),
2106 to_iso_2022_jp3_v2, UPRV_LENGTHOF(to_iso_2022_jp3_v2), "iso-2022-jp",
2107 UCNV_FROM_U_CALLBACK_ESCAPE, from_iso_2022_jpOffs3_v2, NULL, 0,UCNV_ESCAPE_XML_DEC,U_ZERO_ERROR ))
2108 log_err("u-> iso-2022-jp with sub & UCNV_ESCAPE_XML_DEC did not match.\n");
2109 }
2110 {
2111 static const UChar iso_2022_cn_inputText5[]={ 0x3000, 0xD84D, 0xDC56, 0x3001,0xD84D,0xDC56, 0x0042,0x0902};
2112 static const uint8_t to_iso_2022_cn5_v2[]={
2113 0x1b, 0x24, 0x29, 0x41, 0x0e, 0x21, 0x21,
2114 0x0f, 0x5c, 0x75, 0x44, 0x38, 0x34, 0x44,
2115 0x5c, 0x75, 0x44, 0x43, 0x35, 0x36,
2116 0x0e, 0x21, 0x22,
2117 0x0f, 0x5c, 0x75, 0x44, 0x38, 0x34, 0x44,
2118 0x5c, 0x75, 0x44, 0x43, 0x35, 0x36,
2119 0x42,
2120 0x5c, 0x75, 0x30, 0x39, 0x30, 0x32,
2121 };
2122 static const int32_t from_iso_2022_cnOffs5_v2 [] ={
2123 0,0,0,0,0,0,0,
2124 1,1,1,1,1,1,1,
2125 1,1,1,1,1,1,
2126 3,3,3,
2127 4,4,4,4,4,4,4,
2128 4,4,4,4,4,4,
2129 6,
2130 7,7,7,7,7,7
2131 };
2132 if(!testConvertFromUnicodeWithContext(iso_2022_cn_inputText5, UPRV_LENGTHOF(iso_2022_cn_inputText5),
2133 to_iso_2022_cn5_v2, UPRV_LENGTHOF(to_iso_2022_cn5_v2), "iso-2022-cn",
2134 UCNV_FROM_U_CALLBACK_ESCAPE, from_iso_2022_cnOffs5_v2, NULL, 0,UCNV_ESCAPE_JAVA,U_ZERO_ERROR ))
2135 log_err("u-> iso-2022-cn with sub & UCNV_ESCAPE_JAVA did not match.\n");
2136
2137 }
2138 {
2139 static const UChar iso_2022_cn_inputText6[]={ 0x3000, 0xD84D, 0xDC56, 0x3001,0xD84D,0xDC56, 0x0042,0x0902};
2140 static const uint8_t to_iso_2022_cn6_v2[]={
2141 0x1b, 0x24, 0x29, 0x41, 0x0e, 0x21, 0x21,
2142 0x0f, 0x7b, 0x55, 0x2b, 0x32, 0x33, 0x34, 0x35, 0x36, 0x7d,
2143 0x0e, 0x21, 0x22,
2144 0x0f, 0x7b, 0x55, 0x2b, 0x32, 0x33, 0x34, 0x35, 0x36, 0x7d,
2145 0x42,
2146 0x7b, 0x55, 0x2b, 0x30, 0x39, 0x30, 0x32, 0x7d
2147 };
2148 static const int32_t from_iso_2022_cnOffs6_v2 [] ={
2149 0, 0, 0, 0, 0, 0, 0,
2150 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2151 3, 3, 3,
2152 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
2153 6,
2154 7, 7, 7, 7, 7, 7, 7, 7,
2155 };
2156 if(!testConvertFromUnicodeWithContext(iso_2022_cn_inputText6, UPRV_LENGTHOF(iso_2022_cn_inputText6),
2157 to_iso_2022_cn6_v2, UPRV_LENGTHOF(to_iso_2022_cn6_v2), "iso-2022-cn",
2158 UCNV_FROM_U_CALLBACK_ESCAPE, from_iso_2022_cnOffs6_v2, NULL, 0,UCNV_ESCAPE_UNICODE,U_ZERO_ERROR ))
2159 log_err("u-> iso-2022-cn with sub & UCNV_ESCAPE_UNICODE did not match.\n");
2160
2161 }
2162 {
2163 static const UChar iso_2022_cn_inputText7[]={ 0x3000, 0xD84D, 0xDC56, 0x3001,0xD84D,0xDC56, 0x0042,0x0902};
2164 static const uint8_t to_iso_2022_cn7_v2[]={
2165 0x1b, 0x24, 0x29, 0x41, 0x0e, 0x21, 0x21,
2166 0x0f, 0x25, 0x55, 0x44, 0x38, 0x34, 0x44, 0x25, 0x55, 0x44, 0x43, 0x35, 0x36,
2167 0x0e, 0x21, 0x22,
2168 0x0f, 0x25, 0x55, 0x44, 0x38, 0x34, 0x44, 0x25, 0x55, 0x44, 0x43, 0x35, 0x36,
2169 0x42, 0x25, 0x55, 0x30, 0x39, 0x30, 0x32,
2170 };
2171 static const int32_t from_iso_2022_cnOffs7_v2 [] ={
2172 0, 0, 0, 0, 0, 0, 0,
2173 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2174 3, 3, 3,
2175 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
2176 6,
2177 7, 7, 7, 7, 7, 7,
2178 };
2179 if(!testConvertFromUnicodeWithContext(iso_2022_cn_inputText7, UPRV_LENGTHOF(iso_2022_cn_inputText7),
2180 to_iso_2022_cn7_v2, UPRV_LENGTHOF(to_iso_2022_cn7_v2), "iso-2022-cn",
2181 UCNV_FROM_U_CALLBACK_ESCAPE, from_iso_2022_cnOffs7_v2, NULL, 0,"K" ,U_ZERO_ERROR ))
2182 log_err("u-> iso-2022-cn with sub & K did not match.\n");
2183
2184 }
2185 {
2186 static const UChar iso_2022_cn_inputText8[]={
2187 0x3000,
2188 0xD84D, 0xDC56,
2189 0x3001,
2190 0xD84D, 0xDC56,
2191 0xDBFF, 0xDFFF,
2192 0x0042,
2193 0x0902};
2194 static const uint8_t to_iso_2022_cn8_v2[]={
2195 0x1b, 0x24, 0x29, 0x41, 0x0e, 0x21, 0x21,
2196 0x0f, 0x5c, 0x32, 0x33, 0x34, 0x35, 0x36, 0x20,
2197 0x0e, 0x21, 0x22,
2198 0x0f, 0x5c, 0x32, 0x33, 0x34, 0x35, 0x36, 0x20,
2199 0x5c, 0x31, 0x30, 0x46, 0x46, 0x46, 0x46, 0x20,
2200 0x42,
2201 0x5c, 0x39, 0x30, 0x32, 0x20
2202 };
2203 static const int32_t from_iso_2022_cnOffs8_v2 [] ={
2204 0, 0, 0, 0, 0, 0, 0,
2205 1, 1, 1, 1, 1, 1, 1, 1,
2206 3, 3, 3,
2207 4, 4, 4, 4, 4, 4, 4, 4,
2208 6, 6, 6, 6, 6, 6, 6, 6,
2209 8,
2210 9, 9, 9, 9, 9
2211 };
2212 if(!testConvertFromUnicodeWithContext(iso_2022_cn_inputText8, UPRV_LENGTHOF(iso_2022_cn_inputText8),
2213 to_iso_2022_cn8_v2, UPRV_LENGTHOF(to_iso_2022_cn8_v2), "iso-2022-cn",
2214 UCNV_FROM_U_CALLBACK_ESCAPE, from_iso_2022_cnOffs8_v2, NULL, 0,UCNV_ESCAPE_CSS2,U_ZERO_ERROR ))
2215 log_err("u-> iso-2022-cn with sub & UCNV_ESCAPE_CSS2 did not match.\n");
2216
2217 }
2218 {
2219 static const uint8_t to_iso_2022_cn4_v3[]={
2220 0x1b, 0x24, 0x29, 0x41, 0x0e, 0x21, 0x21,
2221 0x0f, 0x5c, 0x55, 0x30, 0x30, 0x30, 0x32, 0x33, 0x34, 0x35, 0x36,
2222 0x0e, 0x21, 0x22,
2223 0x0f, 0x5c, 0x55, 0x30, 0x30, 0x30, 0x32, 0x33, 0x34, 0x35, 0x36,
2224 0x42
2225 };
2226
2227
2228 static const int32_t from_iso_2022_cnOffs4_v3 [] ={
2229 0,0,0,0,0,0,0,
2230 1,1,1,1,1,1,1,1,1,1,1,
2231
2232 3,3,3,
2233 4,4,4,4,4,4,4,4,4,4,4,
2234
2235 6
2236
2237 };
2238 if(!testConvertFromUnicodeWithContext(iso_2022_cn_inputText4, UPRV_LENGTHOF(iso_2022_cn_inputText4),
2239 to_iso_2022_cn4_v3, UPRV_LENGTHOF(to_iso_2022_cn4_v3), "iso-2022-cn",
2240 UCNV_FROM_U_CALLBACK_ESCAPE, from_iso_2022_cnOffs4_v3, NULL, 0,UCNV_ESCAPE_C,U_ZERO_ERROR ))
2241 {
2242 log_err("u-> iso-2022-cn with skip & UCNV_ESCAPE_C did not match.\n");
2243 }
2244 }
2245 if(!testConvertFromUnicode(iso_2022_cn_inputText, UPRV_LENGTHOF(iso_2022_cn_inputText),
2246 to_iso_2022_cn, UPRV_LENGTHOF(to_iso_2022_cn), "iso-2022-cn",
2247 UCNV_FROM_U_CALLBACK_ESCAPE, from_iso_2022_cnOffs, NULL, 0 ))
2248 log_err("u-> iso_2022_cn with subst with value did not match.\n");
2249
2250 if(!testConvertFromUnicode(iso_2022_cn_inputText4, UPRV_LENGTHOF(iso_2022_cn_inputText4),
2251 to_iso_2022_cn4, UPRV_LENGTHOF(to_iso_2022_cn4), "iso-2022-cn",
2252 UCNV_FROM_U_CALLBACK_ESCAPE, from_iso_2022_cnOffs4, NULL, 0 ))
2253 log_err("u-> iso_2022_cn with subst with value did not match.\n");
2254 if(!testConvertFromUnicode(iso_2022_kr_inputText, UPRV_LENGTHOF(iso_2022_kr_inputText),
2255 to_iso_2022_kr, UPRV_LENGTHOF(to_iso_2022_kr), "iso-2022-kr",
2256 UCNV_FROM_U_CALLBACK_ESCAPE, from_iso_2022_krOffs, NULL, 0 ))
2257 log_err("u-> iso_2022_kr with subst with value did not match.\n");
2258 if(!testConvertFromUnicode(iso_2022_kr_inputText2, UPRV_LENGTHOF(iso_2022_kr_inputText2),
2259 to_iso_2022_kr2, UPRV_LENGTHOF(to_iso_2022_kr2), "iso-2022-kr",
2260 UCNV_FROM_U_CALLBACK_ESCAPE, from_iso_2022_krOffs2, NULL, 0 ))
2261 log_err("u-> iso_2022_kr2 with subst with value did not match.\n");
2262 if(!testConvertFromUnicode(hz_inputText, UPRV_LENGTHOF(hz_inputText),
2263 to_hz, UPRV_LENGTHOF(to_hz), "HZ",
2264 UCNV_FROM_U_CALLBACK_ESCAPE, from_hzOffs, NULL, 0 ))
2265 log_err("u-> hz with subst with value did not match.\n");
2266 if(!testConvertFromUnicode(hz_inputText2, UPRV_LENGTHOF(hz_inputText2),
2267 to_hz2, UPRV_LENGTHOF(to_hz2), "HZ",
2268 UCNV_FROM_U_CALLBACK_ESCAPE, from_hzOffs2, NULL, 0 ))
2269 log_err("u-> hz with subst with value did not match.\n");
2270
2271 if(!testConvertFromUnicode(iscii_inputText, UPRV_LENGTHOF(iscii_inputText),
2272 to_iscii, UPRV_LENGTHOF(to_iscii), "ISCII,version=0",
2273 UCNV_FROM_U_CALLBACK_ESCAPE, from_isciiOffs, NULL, 0 ))
2274 log_err("u-> iscii with subst with value did not match.\n");
2275 }
2276#endif
2277
2278 log_verbose("Testing toUnicode with UCNV_TO_U_CALLBACK_ESCAPE \n");
2279 /*to Unicode*/
2280 {
2281#if !UCONFIG_NO_LEGACY_CONVERSION
2282 static const uint8_t sampleTxtToU[]= { 0x00, 0x9f, 0xaf,
2283 0x81, 0xad, /*unassigned*/
2284 0x89, 0xd3 };
2285 static const UChar IBM_943toUnicode[] = { 0x0000, 0x6D63,
2286 0x25, 0x58, 0x38, 0x31, 0x25, 0x58, 0x41, 0x44,
2287 0x7B87};
2288 static const int32_t fromIBM943Offs [] = { 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 5};
2289
2290 /* EUC_JP*/
2291 static const uint8_t sampleTxt_EUC_JP[]={ 0x61, 0xa1, 0xb8, 0x8f, 0xf4, 0xae,
2292 0x8f, 0xda, 0xa1, /*unassigned*/
2293 0x8e, 0xe0,
2294 };
2295 static const UChar EUC_JPtoUnicode[]={ 0x0061, 0x4edd, 0x5bec,
2296 0x25, 0x58, 0x38, 0x46, 0x25, 0x58, 0x44, 0x41, 0x25, 0x58, 0x41, 0x31,
2297 0x00a2 };
2298 static const int32_t fromEUC_JPOffs [] ={ 0, 1, 3,
2299 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
2300 9,
2301 };
2302
2303 /*EUC_TW*/
2304 static const uint8_t sampleTxt_euc_tw[]={
2305 0x61, 0xa2, 0xd3, 0x8e, 0xa2, 0xdc, 0xe5,
2306 0x8e, 0xaa, 0xbb, 0xcc,/*unassigned*/
2307 0xe6, 0xca, 0x8a,
2308 };
2309 static const UChar euc_twtoUnicode[]={ 0x0061, 0x2295, 0x5BF2,
2310 0x25, 0x58, 0x38, 0x45, 0x25, 0x58, 0x41, 0x41, 0x25, 0x58, 0x42, 0x42, 0x25, 0x58, 0x43, 0x43,
2311 0x8706, 0x8a, };
2312 static const int32_t from_euc_twOffs [] ={ 0, 1, 3,
2313 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
2314 11, 13};
2315
2316 /*iso-2022-jp*/
2317 static const uint8_t sampleTxt_iso_2022_jp[]={
2318 0x1b, 0x28, 0x42, 0x41,
2319 0x1b, 0x24, 0x42, 0x3a, 0x1a, /*unassigned*/
2320 0x1b, 0x28, 0x42, 0x42,
2321
2322 };
2323 /* A % X 3 A % X 1 A B */
2324 static const UChar iso_2022_jptoUnicode[]={ 0x41,0x25,0x58,0x33,0x41,0x25,0x58,0x31,0x41, 0x42 };
2325 static const int32_t from_iso_2022_jpOffs [] ={ 3, 7, 7, 7, 7, 7, 7, 7, 7, 12 };
2326
2327 /*iso-2022-cn*/
2328 static const uint8_t sampleTxt_iso_2022_cn[]={
2329 0x0f, 0x41, 0x44,
2330 0x1B, 0x24, 0x29, 0x47,
2331 0x0E, 0x40, 0x6c, /*unassigned*/
2332 0x0f, 0x42,
2333
2334 };
2335 static const UChar iso_2022_cntoUnicode[]={ 0x41, 0x44,0x25,0x58,0x34,0x30,0x25,0x58,0x36,0x43,0x42 };
2336 static const int32_t from_iso_2022_cnOffs [] ={ 1, 2, 8, 8, 8, 8, 8, 8, 8, 8, 11 };
2337
2338 /*iso-2022-kr*/
2339 static const uint8_t sampleTxt_iso_2022_kr[]={
2340 0x1b, 0x24, 0x29, 0x43,
2341 0x41,
2342 0x0E, 0x7f, 0x1E,
2343 0x0e, 0x25, 0x50,
2344 0x0f, 0x51,
2345 0x42, 0x43,
2346
2347 };
2348 static const UChar iso_2022_krtoUnicode[]={ 0x41,0x25,0x58,0x37,0x46,0x25,0x58,0x31,0x45,0x03A0,0x51, 0x42,0x43};
2349 static const int32_t from_iso_2022_krOffs [] ={ 4, 6, 6, 6, 6, 6, 6, 6, 6, 9, 12, 13 , 14 };
2350
2351 /*hz*/
2352 static const uint8_t sampleTxt_hz[]={
2353 0x41,
2354 0x7e, 0x7b, 0x26, 0x30,
2355 0x7f, 0x1E, /*unassigned*/
2356 0x26, 0x30,
2357 0x7e, 0x7d, 0x42,
2358 0x7e, 0x7b, 0x7f, 0x1E,/*unassigned*/
2359 0x7e, 0x7d, 0x42,
2360 };
2361 static const UChar hztoUnicode[]={
2362 0x41,
2363 0x03a0,
2364 0x25,0x58,0x37,0x46,0x25,0x58,0x31,0x45,
2365 0x03A0,
2366 0x42,
2367 0x25,0x58,0x37,0x46,0x25,0x58,0x31,0x45,
2368 0x42,};
2369
2370 static const int32_t from_hzOffs [] ={0,3,5,5,5,5,5,5,5,5,7,11,14,14,14,14,14,14,14,14,18, };
2371
2372
2373 /*iscii*/
2374 static const uint8_t sampleTxt_iscii[]={
2375 0x41,
2376 0x30,
2377 0xEB, /*unassigned*/
2378 0xa3,
2379 0x42,
2380 0xEC, /*unassigned*/
2381 0x42,
2382 };
2383 static const UChar isciitoUnicode[]={
2384 0x41,
2385 0x30,
2386 0x25, 0x58, 0x45, 0x42,
2387 0x0903,
2388 0x42,
2389 0x25, 0x58, 0x45, 0x43,
2390 0x42,};
2391
2392 static const int32_t from_isciiOffs [] ={0,1,2,2,2,2,3,4,5,5,5,5,6 };
2393#endif
2394
2395 /*UTF8*/
2396 static const uint8_t sampleTxtUTF8[]={
2397 0x20, 0x64, 0x50,
2398 0xC2, 0x7E, /* truncated char */
2399 0x20,
2400 0xE0, 0xB5, 0x7E, /* truncated char */
2401 0x40,
2402 };
2403 static const UChar UTF8ToUnicode[]={
2404 0x0020, 0x0064, 0x0050,
2405 0x0025, 0x0058, 0x0043, 0x0032, 0x007E, /* \xC2~ */
2406 0x0020,
2407 0x0025, 0x0058, 0x0045, 0x0030, 0x0025, 0x0058, 0x0042, 0x0035, 0x007E,
2408 0x0040
2409 };
2410 static const int32_t fromUTF8[] = {
2411 0, 1, 2,
2412 3, 3, 3, 3, 4,
2413 5,
2414 6, 6, 6, 6, 6, 6, 6, 6, 8,
2415 9
2416 };
2417 static const UChar UTF8ToUnicodeXML_DEC[]={
2418 0x0020, 0x0064, 0x0050,
2419 0x0026, 0x0023, 0x0031, 0x0039, 0x0034, 0x003B, 0x007E, /* &#194;~ */
2420 0x0020,
2421 0x0026, 0x0023, 0x0032, 0x0032, 0x0034, 0x003B, 0x0026, 0x0023, 0x0031, 0x0038, 0x0031, 0x003B, 0x007E,
2422 0x0040
2423 };
2424 static const int32_t fromUTF8XML_DEC[] = {
2425 0, 1, 2,
2426 3, 3, 3, 3, 3, 3, 4,
2427 5,
2428 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8,
2429 9
2430 };
2431
2432
2433#if !UCONFIG_NO_LEGACY_CONVERSION
2434 if(!testConvertToUnicode(sampleTxtToU, UPRV_LENGTHOF(sampleTxtToU),
2435 IBM_943toUnicode, UPRV_LENGTHOF(IBM_943toUnicode),"ibm-943",
2436 UCNV_TO_U_CALLBACK_ESCAPE, fromIBM943Offs, NULL, 0 ))
2437 log_err("ibm-943->u with substitute with value did not match.\n");
2438
2439 if(!testConvertToUnicode(sampleTxt_EUC_JP, UPRV_LENGTHOF(sampleTxt_EUC_JP),
2440 EUC_JPtoUnicode, UPRV_LENGTHOF(EUC_JPtoUnicode),"IBM-eucJP",
2441 UCNV_TO_U_CALLBACK_ESCAPE, fromEUC_JPOffs, NULL, 0))
2442 log_err("euc-jp->u with substitute with value did not match.\n");
2443
2444 if(!testConvertToUnicode(sampleTxt_euc_tw, UPRV_LENGTHOF(sampleTxt_euc_tw),
2445 euc_twtoUnicode, UPRV_LENGTHOF(euc_twtoUnicode),"euc-tw",
2446 UCNV_TO_U_CALLBACK_ESCAPE, from_euc_twOffs, NULL, 0))
2447 log_err("euc-tw->u with substitute with value did not match.\n");
2448
2449 if(!testConvertToUnicode(sampleTxt_iso_2022_jp, UPRV_LENGTHOF(sampleTxt_iso_2022_jp),
2450 iso_2022_jptoUnicode, UPRV_LENGTHOF(iso_2022_jptoUnicode),"iso-2022-jp",
2451 UCNV_TO_U_CALLBACK_ESCAPE, from_iso_2022_jpOffs, NULL, 0))
2452 log_err("iso-2022-jp->u with substitute with value did not match.\n");
2453
2454 if(!testConvertToUnicodeWithContext(sampleTxt_iso_2022_jp, UPRV_LENGTHOF(sampleTxt_iso_2022_jp),
2455 iso_2022_jptoUnicode, UPRV_LENGTHOF(iso_2022_jptoUnicode),"iso-2022-jp",
2456 UCNV_TO_U_CALLBACK_ESCAPE, from_iso_2022_jpOffs, NULL, 0,"K",U_ZERO_ERROR))
2457 log_err("iso-2022-jp->u with substitute with value did not match.\n");
2458
2459 {/* test UCNV_TO_U_CALLBACK_ESCAPE with options */
2460 {
2461 static const UChar iso_2022_jptoUnicodeDec[]={
2462 0x0041,
2463 /* & # 5 8 ; */
2464 0x0026, 0x0023, 0x0035, 0x0038, 0x003b,
2465 0x0026, 0x0023, 0x0032, 0x0036, 0x003b,
2466 0x0042 };
2467 static const int32_t from_iso_2022_jpOffsDec [] ={ 3,7,7,7,7,7,7,7,7,7,7,12, };
2468 if(!testConvertToUnicodeWithContext(sampleTxt_iso_2022_jp, UPRV_LENGTHOF(sampleTxt_iso_2022_jp),
2469 iso_2022_jptoUnicodeDec, UPRV_LENGTHOF(iso_2022_jptoUnicodeDec),"iso-2022-jp",
2470 UCNV_TO_U_CALLBACK_ESCAPE, from_iso_2022_jpOffsDec, NULL, 0,UCNV_ESCAPE_XML_DEC,U_ZERO_ERROR ))
2471 log_err("iso-2022-jp->u with substitute with value and UCNV_ESCAPE_XML_DEC did not match.\n");
2472 }
2473 {
2474 static const UChar iso_2022_jptoUnicodeHex[]={
2475 0x0041,
2476 /* & # x 3 A ; */
2477 0x0026, 0x0023, 0x0078, 0x0033, 0x0041, 0x003b,
2478 0x0026, 0x0023, 0x0078, 0x0031, 0x0041, 0x003b,
2479 0x0042 };
2480 static const int32_t from_iso_2022_jpOffsHex [] ={ 3,7,7,7,7,7,7,7,7,7,7,7,7,12 };
2481 if(!testConvertToUnicodeWithContext(sampleTxt_iso_2022_jp, UPRV_LENGTHOF(sampleTxt_iso_2022_jp),
2482 iso_2022_jptoUnicodeHex, UPRV_LENGTHOF(iso_2022_jptoUnicodeHex),"iso-2022-jp",
2483 UCNV_TO_U_CALLBACK_ESCAPE, from_iso_2022_jpOffsHex, NULL, 0,UCNV_ESCAPE_XML_HEX,U_ZERO_ERROR ))
2484 log_err("iso-2022-jp->u with substitute with value and UCNV_ESCAPE_XML_HEX did not match.\n");
2485 }
2486 {
2487 static const UChar iso_2022_jptoUnicodeC[]={
2488 0x0041,
2489 0x005C, 0x0078, 0x0033, 0x0041, /* \x3A */
2490 0x005C, 0x0078, 0x0031, 0x0041, /* \x1A */
2491 0x0042 };
2492 int32_t from_iso_2022_jpOffsC [] ={ 3,7,7,7,7,7,7,7,7,12 };
2493 if(!testConvertToUnicodeWithContext(sampleTxt_iso_2022_jp, UPRV_LENGTHOF(sampleTxt_iso_2022_jp),
2494 iso_2022_jptoUnicodeC, UPRV_LENGTHOF(iso_2022_jptoUnicodeC),"iso-2022-jp",
2495 UCNV_TO_U_CALLBACK_ESCAPE, from_iso_2022_jpOffsC, NULL, 0,UCNV_ESCAPE_C,U_ZERO_ERROR ))
2496 log_err("iso-2022-jp->u with substitute with value and UCNV_ESCAPE_C did not match.\n");
2497 }
2498 }
2499 if(!testConvertToUnicode(sampleTxt_iso_2022_cn, UPRV_LENGTHOF(sampleTxt_iso_2022_cn),
2500 iso_2022_cntoUnicode, UPRV_LENGTHOF(iso_2022_cntoUnicode),"iso-2022-cn",
2501 UCNV_TO_U_CALLBACK_ESCAPE, from_iso_2022_cnOffs, NULL, 0))
2502 log_err("iso-2022-cn->u with substitute with value did not match.\n");
2503
2504 if(!testConvertToUnicode(sampleTxt_iso_2022_kr, UPRV_LENGTHOF(sampleTxt_iso_2022_kr),
2505 iso_2022_krtoUnicode, UPRV_LENGTHOF(iso_2022_krtoUnicode),"iso-2022-kr",
2506 UCNV_TO_U_CALLBACK_ESCAPE, from_iso_2022_krOffs, NULL, 0))
2507 log_err("iso-2022-kr->u with substitute with value did not match.\n");
2508
2509 if(!testConvertToUnicode(sampleTxt_hz, UPRV_LENGTHOF(sampleTxt_hz),
2510 hztoUnicode, UPRV_LENGTHOF(hztoUnicode),"HZ",
2511 UCNV_TO_U_CALLBACK_ESCAPE, from_hzOffs, NULL, 0))
2512 log_err("hz->u with substitute with value did not match.\n");
2513
2514 if(!testConvertToUnicode(sampleTxt_iscii, UPRV_LENGTHOF(sampleTxt_iscii),
2515 isciitoUnicode, UPRV_LENGTHOF(isciitoUnicode),"ISCII,version=0",
2516 UCNV_TO_U_CALLBACK_ESCAPE, from_isciiOffs, NULL, 0))
2517 log_err("ISCII ->u with substitute with value did not match.\n");
2518#endif
2519
2520 if(!testConvertToUnicode(sampleTxtUTF8, UPRV_LENGTHOF(sampleTxtUTF8),
2521 UTF8ToUnicode, UPRV_LENGTHOF(UTF8ToUnicode),"UTF-8",
2522 UCNV_TO_U_CALLBACK_ESCAPE, fromUTF8, NULL, 0))
2523 log_err("UTF8->u with UCNV_TO_U_CALLBACK_ESCAPE with value did not match.\n");
2524 if(!testConvertToUnicodeWithContext(sampleTxtUTF8, UPRV_LENGTHOF(sampleTxtUTF8),
2525 UTF8ToUnicodeXML_DEC, UPRV_LENGTHOF(UTF8ToUnicodeXML_DEC),"UTF-8",
2526 UCNV_TO_U_CALLBACK_ESCAPE, fromUTF8XML_DEC, NULL, 0, UCNV_ESCAPE_XML_DEC, U_ZERO_ERROR))
2527 log_err("UTF8->u with UCNV_TO_U_CALLBACK_ESCAPE with value did not match.\n");
2528 }
2529}
2530
2531#if !UCONFIG_NO_LEGACY_CONVERSION
2532static void TestLegalAndOthers(int32_t inputsize, int32_t outputsize)
2533{
2534 static const UChar legalText[] = { 0x0000, 0xAC00, 0xAC01, 0xD700 };
2535 static const uint8_t templegal949[] ={ 0x00, 0xb0, 0xa1, 0xb0, 0xa2, 0xc8, 0xd3 };
2536 static const int32_t to949legal[] = {0, 1, 1, 2, 2, 3, 3};
2537
2538
2539 static const uint8_t text943[] = {
2540 0x82, 0xa9, 0x82, 0x20, 0x61, 0x8a, 0xbf, 0x8e, 0x9a };
2541 static const UChar toUnicode943sub[] = { 0x304b, 0x1a, 0x20, 0x0061, 0x6f22, 0x5b57 };
2542 static const UChar toUnicode943skip[]= { 0x304b, 0x20, 0x0061, 0x6f22, 0x5b57 };
2543 static const UChar toUnicode943stop[]= { 0x304b};
2544
2545 static const int32_t fromIBM943Offssub[] = { 0, 2, 3, 4, 5, 7 };
2546 static const int32_t fromIBM943Offsskip[] = { 0, 3, 4, 5, 7 };
2547 static const int32_t fromIBM943Offsstop[] = { 0};
2548
2549 gInBufferSize = inputsize;
2550 gOutBufferSize = outputsize;
2551 /*checking with a legal value*/
2552 if(!testConvertFromUnicode(legalText, UPRV_LENGTHOF(legalText),
2553 templegal949, UPRV_LENGTHOF(templegal949), "ibm-949",
2554 UCNV_FROM_U_CALLBACK_SKIP, to949legal, NULL, 0 ))
2555 log_err("u-> ibm-949 with skip did not match.\n");
2556
2557 /*checking illegal value for ibm-943 with substitute*/
2558 if(!testConvertToUnicode(text943, UPRV_LENGTHOF(text943),
2559 toUnicode943sub, UPRV_LENGTHOF(toUnicode943sub),"ibm-943",
2560 UCNV_TO_U_CALLBACK_SUBSTITUTE, fromIBM943Offssub, NULL, 0 ))
2561 log_err("ibm-943->u with subst did not match.\n");
2562 /*checking illegal value for ibm-943 with skip */
2563 if(!testConvertToUnicode(text943, UPRV_LENGTHOF(text943),
2564 toUnicode943skip, UPRV_LENGTHOF(toUnicode943skip),"ibm-943",
2565 UCNV_TO_U_CALLBACK_SKIP, fromIBM943Offsskip, NULL, 0 ))
2566 log_err("ibm-943->u with skip did not match.\n");
2567
2568 /*checking illegal value for ibm-943 with stop */
2569 if(!testConvertToUnicode(text943, UPRV_LENGTHOF(text943),
2570 toUnicode943stop, UPRV_LENGTHOF(toUnicode943stop),"ibm-943",
2571 UCNV_TO_U_CALLBACK_STOP, fromIBM943Offsstop, NULL, 0 ))
2572 log_err("ibm-943->u with stop did not match.\n");
2573
2574}
2575
2576static void TestSingleByte(int32_t inputsize, int32_t outputsize)
2577{
2578 static const uint8_t sampleText[] = {
2579 0x82, 0xa9, 0x61, 0x62, 0x63 , 0x82,
2580 0xff, 0x32, 0x33};
2581 static const UChar toUnicode943sub[] = { 0x304b, 0x0061, 0x0062, 0x0063, 0x1a, 0x1a, 0x0032, 0x0033 };
2582 static const int32_t fromIBM943Offssub[] = { 0, 2, 3, 4, 5, 6, 7, 8 };
2583 /*checking illegal value for ibm-943 with substitute*/
2584 gInBufferSize = inputsize;
2585 gOutBufferSize = outputsize;
2586
2587 if(!testConvertToUnicode(sampleText, UPRV_LENGTHOF(sampleText),
2588 toUnicode943sub, UPRV_LENGTHOF(toUnicode943sub),"ibm-943",
2589 UCNV_TO_U_CALLBACK_SUBSTITUTE, fromIBM943Offssub, NULL, 0 ))
2590 log_err("ibm-943->u with subst did not match.\n");
2591}
2592
2593static void TestEBCDIC_STATEFUL_Sub(int32_t inputsize, int32_t outputsize)
2594{
2595 /*EBCDIC_STATEFUL*/
2596 static const UChar ebcdic_inputTest[] = { 0x0061, 0x6d64, 0x0061, 0x00A2, 0x6d65, 0x0061 };
2597 static const uint8_t toIBM930[]= { 0x62, 0x0e, 0x5d, 0x63, 0x0f, 0x62, 0xb1, 0x0e, 0xfe, 0xfe, 0x0f, 0x62 };
2598 static const int32_t offset_930[]= { 0, 1, 1, 1, 2, 2, 3, 4, 4, 4, 5, 5 };
2599/* s SO doubl SI sng s SO fe fe SI s */
2600
2601 /*EBCDIC_STATEFUL with subChar=3f*/
2602 static const uint8_t toIBM930_subvaried[]= { 0x62, 0x0e, 0x5d, 0x63, 0x0f, 0x62, 0xb1, 0x3f, 0x62 };
2603 static const int32_t offset_930_subvaried[]= { 0, 1, 1, 1, 2, 2, 3, 4, 5 };
2604 static const char mySubChar[]={ 0x3f};
2605
2606 gInBufferSize = inputsize;
2607 gOutBufferSize = outputsize;
2608
2609 if(!testConvertFromUnicode(ebcdic_inputTest, UPRV_LENGTHOF(ebcdic_inputTest),
2610 toIBM930, UPRV_LENGTHOF(toIBM930), "ibm-930",
2611 UCNV_FROM_U_CALLBACK_SUBSTITUTE, offset_930, NULL, 0 ))
2612 log_err("u-> ibm-930(EBCDIC_STATEFUL) with subst did not match.\n");
2613
2614 if(!testConvertFromUnicode(ebcdic_inputTest, UPRV_LENGTHOF(ebcdic_inputTest),
2615 toIBM930_subvaried, UPRV_LENGTHOF(toIBM930_subvaried), "ibm-930",
2616 UCNV_FROM_U_CALLBACK_SUBSTITUTE, offset_930_subvaried, mySubChar, 1 ))
2617 log_err("u-> ibm-930(EBCDIC_STATEFUL) with subst(setSubChar=0x3f) did not match.\n");
2618}
2619#endif
2620
2621UBool testConvertFromUnicode(const UChar *source, int sourceLen, const uint8_t *expect, int expectLen,
2622 const char *codepage, UConverterFromUCallback callback , const int32_t *expectOffsets,
2623 const char *mySubChar, int8_t len)
2624{
2625
2626
2627 UErrorCode status = U_ZERO_ERROR;
2628 UConverter *conv = 0;
2629 char junkout[NEW_MAX_BUFFER]; /* FIX */
2630 int32_t junokout[NEW_MAX_BUFFER]; /* FIX */
2631 const UChar *src;
2632 char *end;
2633 char *targ;
2634 int32_t *offs;
2635 int i;
2636 int32_t realBufferSize;
2637 char *realBufferEnd;
2638 const UChar *realSourceEnd;
2639 const UChar *sourceLimit;
2640 UBool checkOffsets = TRUE;
2641 UBool doFlush;
2642 char junk[9999];
2643 char offset_str[9999];
2644 char *p;
2645 UConverterFromUCallback oldAction = NULL;
2646 const void* oldContext = NULL;
2647
2648
2649 for(i=0;i<NEW_MAX_BUFFER;i++)
2650 junkout[i] = (char)0xF0;
2651 for(i=0;i<NEW_MAX_BUFFER;i++)
2652 junokout[i] = 0xFF;
2653 setNuConvTestName(codepage, "FROM");
2654
2655 log_verbose("\nTesting========= %s FROM \n inputbuffer= %d outputbuffer= %d\n", codepage, gInBufferSize,
2656 gOutBufferSize);
2657
2658 conv = ucnv_open(codepage, &status);
2659 if(U_FAILURE(status))
2660 {
2661 log_data_err("Couldn't open converter %s\n",codepage);
2662 return TRUE;
2663 }
2664
2665 log_verbose("Converter opened..\n");
2666
2667 /*----setting the callback routine----*/
2668 ucnv_setFromUCallBack (conv, callback, NULL, &oldAction, &oldContext, &status);
2669 if (U_FAILURE(status))
2670 {
2671 log_err("FAILURE in setting the callback Function! %s\n", myErrorName(status));
2672 }
2673 /*------------------------*/
2674 /*setting the subChar*/
2675 if(mySubChar != NULL){
2676 ucnv_setSubstChars(conv, mySubChar, len, &status);
2677 if (U_FAILURE(status)) {
2678 log_err("FAILURE in setting the callback Function! %s\n", myErrorName(status));
2679 }
2680 }
2681 /*------------*/
2682
2683 src = source;
2684 targ = junkout;
2685 offs = junokout;
2686
2687 realBufferSize = UPRV_LENGTHOF(junkout);
2688 realBufferEnd = junkout + realBufferSize;
2689 realSourceEnd = source + sourceLen;
2690
2691 if ( gOutBufferSize != realBufferSize )
2692 checkOffsets = FALSE;
2693
2694 if( gInBufferSize != NEW_MAX_BUFFER )
2695 checkOffsets = FALSE;
2696
2697 do
2698 {
2699 end = nct_min(targ + gOutBufferSize, realBufferEnd);
2700 sourceLimit = nct_min(src + gInBufferSize, realSourceEnd);
2701
2702 doFlush = (UBool)(sourceLimit == realSourceEnd);
2703
2704 if(targ == realBufferEnd)
2705 {
2706 log_err("Error, overflowed the real buffer while about to call fromUnicode! targ=%08lx %s", targ, gNuConvTestName);
2707 return FALSE;
2708 }
2709 log_verbose("calling fromUnicode @ SOURCE:%08lx to %08lx TARGET: %08lx to %08lx, flush=%s\n", src,sourceLimit, targ,end, doFlush?"TRUE":"FALSE");
2710
2711
2712 status = U_ZERO_ERROR;
2713
2714 ucnv_fromUnicode (conv,
2715 (char **)&targ,
2716 (const char *)end,
2717 &src,
2718 sourceLimit,
2719 checkOffsets ? offs : NULL,
2720 doFlush, /* flush if we're at the end of the input data */
2721 &status);
2722 } while ( (status == U_BUFFER_OVERFLOW_ERROR) || (U_SUCCESS(status) && (sourceLimit < realSourceEnd)) );
2723
2724
2725 if(status==U_INVALID_CHAR_FOUND || status == U_ILLEGAL_CHAR_FOUND){
2726 UChar errChars[50]; /* should be sufficient */
2727 int8_t errLen = 50;
2728 UErrorCode err = U_ZERO_ERROR;
2729 const UChar* start= NULL;
2730 ucnv_getInvalidUChars(conv,errChars, &errLen, &err);
2731 if(U_FAILURE(err)){
2732 log_err("ucnv_getInvalidUChars failed with error : %s\n",u_errorName(err));
2733 }
2734 /* length of in invalid chars should be equal to returned length*/
2735 start = src - errLen;
2736 if(u_strncmp(errChars,start,errLen)!=0){
2737 log_err("ucnv_getInvalidUChars did not return the correct invalid chars for encoding %s \n", ucnv_getName(conv,&err));
2738 }
2739 }
2740 /* allow failure codes for the stop callback */
2741 if(U_FAILURE(status) &&
2742 (callback != UCNV_FROM_U_CALLBACK_STOP || (status != U_INVALID_CHAR_FOUND && status != U_ILLEGAL_CHAR_FOUND)))
2743 {
2744 log_err("Problem in fromUnicode, errcode %s %s\n", myErrorName(status), gNuConvTestName);
2745 return FALSE;
2746 }
2747
2748 log_verbose("\nConversion done [%d uchars in -> %d chars out]. \nResult :",
2749 sourceLen, targ-junkout);
2750 if(getTestOption(VERBOSITY_OPTION))
2751 {
2752
2753 junk[0] = 0;
2754 offset_str[0] = 0;
2755 for(p = junkout;p<targ;p++)
2756 {
2757 sprintf(junk + strlen(junk), "0x%02x, ", (0xFF) & (unsigned int)*p);
2758 sprintf(offset_str + strlen(offset_str), "0x%02x, ", (0xFF) & (unsigned int)junokout[p-junkout]);
2759 }
2760
2761 log_verbose(junk);
2762 printSeq(expect, expectLen);
2763 if ( checkOffsets )
2764 {
2765 log_verbose("\nOffsets:");
2766 log_verbose(offset_str);
2767 }
2768 log_verbose("\n");
2769 }
2770 ucnv_close(conv);
2771
2772
2773 if(expectLen != targ-junkout)
2774 {
2775 log_err("Expected %d chars out, got %d %s\n", expectLen, targ-junkout, gNuConvTestName);
2776 log_verbose("Expected %d chars out, got %d %s\n", expectLen, targ-junkout, gNuConvTestName);
2777 printSeqErr((const uint8_t *)junkout, (int32_t)(targ-junkout));
2778 printSeqErr(expect, expectLen);
2779 return FALSE;
2780 }
2781
2782 if (checkOffsets && (expectOffsets != 0) )
2783 {
2784 log_verbose("comparing %d offsets..\n", targ-junkout);
2785 if(memcmp(junokout,expectOffsets,(targ-junkout) * sizeof(int32_t) )){
2786 log_err("did not get the expected offsets while %s \n", gNuConvTestName);
2787 log_err("Got Output : ");
2788 printSeqErr((const uint8_t *)junkout, (int32_t)(targ-junkout));
2789 log_err("Got Offsets: ");
2790 for(p=junkout;p<targ;p++)
2791 log_err("%d,", junokout[p-junkout]);
2792 log_err("\n");
2793 log_err("Expected Offsets: ");
2794 for(i=0; i<(targ-junkout); i++)
2795 log_err("%d,", expectOffsets[i]);
2796 log_err("\n");
2797 return FALSE;
2798 }
2799 }
2800
2801 if(!memcmp(junkout, expect, expectLen))
2802 {
2803 log_verbose("String matches! %s\n", gNuConvTestName);
2804 return TRUE;
2805 }
2806 else
2807 {
2808 log_err("String does not match. %s\n", gNuConvTestName);
2809 log_err("source: ");
2810 printUSeqErr(source, sourceLen);
2811 log_err("Got: ");
2812 printSeqErr((const uint8_t *)junkout, expectLen);
2813 log_err("Expected: ");
2814 printSeqErr(expect, expectLen);
2815 return FALSE;
2816 }
2817}
2818
2819UBool testConvertToUnicode( const uint8_t *source, int sourcelen, const UChar *expect, int expectlen,
2820 const char *codepage, UConverterToUCallback callback, const int32_t *expectOffsets,
2821 const char *mySubChar, int8_t len)
2822{
2823 UErrorCode status = U_ZERO_ERROR;
2824 UConverter *conv = 0;
2825 UChar junkout[NEW_MAX_BUFFER]; /* FIX */
2826 int32_t junokout[NEW_MAX_BUFFER]; /* FIX */
2827 const char *src;
2828 const char *realSourceEnd;
2829 const char *srcLimit;
2830 UChar *targ;
2831 UChar *end;
2832 int32_t *offs;
2833 int i;
2834 UBool checkOffsets = TRUE;
2835 char junk[9999];
2836 char offset_str[9999];
2837 UChar *p;
2838 UConverterToUCallback oldAction = NULL;
2839 const void* oldContext = NULL;
2840
2841 int32_t realBufferSize;
2842 UChar *realBufferEnd;
2843
2844
2845 for(i=0;i<NEW_MAX_BUFFER;i++)
2846 junkout[i] = 0xFFFE;
2847
2848 for(i=0;i<NEW_MAX_BUFFER;i++)
2849 junokout[i] = -1;
2850
2851 setNuConvTestName(codepage, "TO");
2852
2853 log_verbose("\n========= %s\n", gNuConvTestName);
2854
2855 conv = ucnv_open(codepage, &status);
2856 if(U_FAILURE(status))
2857 {
2858 log_data_err("Couldn't open converter %s\n",gNuConvTestName);
2859 return TRUE;
2860 }
2861
2862 log_verbose("Converter opened..\n");
2863
2864 src = (const char *)source;
2865 targ = junkout;
2866 offs = junokout;
2867
2868 realBufferSize = UPRV_LENGTHOF(junkout);
2869 realBufferEnd = junkout + realBufferSize;
2870 realSourceEnd = src + sourcelen;
2871 /*----setting the callback routine----*/
2872 ucnv_setToUCallBack (conv, callback, NULL, &oldAction, &oldContext, &status);
2873 if (U_FAILURE(status))
2874 {
2875 log_err("FAILURE in setting the callback Function! %s\n", myErrorName(status));
2876 }
2877 /*-------------------------------------*/
2878 /*setting the subChar*/
2879 if(mySubChar != NULL){
2880 ucnv_setSubstChars(conv, mySubChar, len, &status);
2881 if (U_FAILURE(status)) {
2882 log_err("FAILURE in setting the callback Function! %s\n", myErrorName(status));
2883 }
2884 }
2885 /*------------*/
2886
2887
2888 if ( gOutBufferSize != realBufferSize )
2889 checkOffsets = FALSE;
2890
2891 if( gInBufferSize != NEW_MAX_BUFFER )
2892 checkOffsets = FALSE;
2893
2894 do
2895 {
2896 end = nct_min( targ + gOutBufferSize, realBufferEnd);
2897 srcLimit = nct_min(realSourceEnd, src + gInBufferSize);
2898
2899 if(targ == realBufferEnd)
2900 {
2901 log_err("Error, the end would overflow the real output buffer while about to call toUnicode! tarjey=%08lx %s",targ,gNuConvTestName);
2902 return FALSE;
2903 }
2904 log_verbose("calling toUnicode @ %08lx to %08lx\n", targ,end);
2905
2906
2907
2908 status = U_ZERO_ERROR;
2909
2910 ucnv_toUnicode (conv,
2911 &targ,
2912 end,
2913 (const char **)&src,
2914 (const char *)srcLimit,
2915 checkOffsets ? offs : NULL,
2916 (UBool)(srcLimit == realSourceEnd), /* flush if we're at the end of the source data */
2917 &status);
2918 } while ( (status == U_BUFFER_OVERFLOW_ERROR) || (U_SUCCESS(status) && (srcLimit < realSourceEnd)) ); /* while we just need another buffer */
2919
2920 if(status==U_INVALID_CHAR_FOUND || status == U_ILLEGAL_CHAR_FOUND){
2921 char errChars[50]; /* should be sufficient */
2922 int8_t errLen = 50;
2923 UErrorCode err = U_ZERO_ERROR;
2924 const char* start= NULL;
2925 ucnv_getInvalidChars(conv,errChars, &errLen, &err);
2926 if(U_FAILURE(err)){
2927 log_err("ucnv_getInvalidChars failed with error : %s\n",u_errorName(err));
2928 }
2929 /* length of in invalid chars should be equal to returned length*/
2930 start = src - errLen;
2931 if(uprv_strncmp(errChars,start,errLen)!=0){
2932 log_err("ucnv_getInvalidChars did not return the correct invalid chars for encoding %s \n", ucnv_getName(conv,&err));
2933 }
2934 }
2935 /* allow failure codes for the stop callback */
2936 if(U_FAILURE(status) &&
2937 (callback != UCNV_TO_U_CALLBACK_STOP || (status != U_INVALID_CHAR_FOUND && status != U_ILLEGAL_CHAR_FOUND && status != U_TRUNCATED_CHAR_FOUND)))
2938 {
2939 log_err("Problem doing toUnicode, errcode %s %s\n", myErrorName(status), gNuConvTestName);
2940 return FALSE;
2941 }
2942
2943 log_verbose("\nConversion done. %d bytes -> %d chars.\nResult :",
2944 sourcelen, targ-junkout);
2945 if(getTestOption(VERBOSITY_OPTION))
2946 {
2947
2948 junk[0] = 0;
2949 offset_str[0] = 0;
2950
2951 for(p = junkout;p<targ;p++)
2952 {
2953 sprintf(junk + strlen(junk), "0x%04x, ", (0xFFFF) & (unsigned int)*p);
2954 sprintf(offset_str + strlen(offset_str), "0x%04x, ", (0xFFFF) & (unsigned int)junokout[p-junkout]);
2955 }
2956
2957 log_verbose(junk);
2958 printUSeq(expect, expectlen);
2959 if ( checkOffsets )
2960 {
2961 log_verbose("\nOffsets:");
2962 log_verbose(offset_str);
2963 }
2964 log_verbose("\n");
2965 }
2966 ucnv_close(conv);
2967
2968 log_verbose("comparing %d uchars (%d bytes)..\n",expectlen,expectlen*2);
2969
2970 if (checkOffsets && (expectOffsets != 0))
2971 {
2972 if(memcmp(junokout,expectOffsets,(targ-junkout) * sizeof(int32_t)))
2973 {
2974 log_err("did not get the expected offsets while %s \n", gNuConvTestName);
2975 log_err("Got offsets: ");
2976 for(p=junkout;p<targ;p++)
2977 log_err(" %2d,", junokout[p-junkout]);
2978 log_err("\n");
2979 log_err("Expected offsets: ");
2980 for(i=0; i<(targ-junkout); i++)
2981 log_err(" %2d,", expectOffsets[i]);
2982 log_err("\n");
2983 log_err("Got output: ");
2984 for(i=0; i<(targ-junkout); i++)
2985 log_err("0x%04x,", junkout[i]);
2986 log_err("\n");
2987 log_err("From source: ");
2988 for(i=0; i<(src-(const char *)source); i++)
2989 log_err(" 0x%02x,", (unsigned char)source[i]);
2990 log_err("\n");
2991 }
2992 }
2993
2994 if(!memcmp(junkout, expect, expectlen*2))
2995 {
2996 log_verbose("Matches!\n");
2997 return TRUE;
2998 }
2999 else
3000 {
3001 log_err("String does not match. %s\n", gNuConvTestName);
3002 log_verbose("String does not match. %s\n", gNuConvTestName);
3003 log_err("Got: ");
3004 printUSeqErr(junkout, expectlen);
3005 log_err("Expected: ");
3006 printUSeqErr(expect, expectlen);
3007 log_err("\n");
3008 return FALSE;
3009 }
3010}
3011
3012UBool testConvertFromUnicodeWithContext(const UChar *source, int sourceLen, const uint8_t *expect, int expectLen,
3013 const char *codepage, UConverterFromUCallback callback , const int32_t *expectOffsets,
3014 const char *mySubChar, int8_t len, const void* context, UErrorCode expectedError)
3015{
3016
3017
3018 UErrorCode status = U_ZERO_ERROR;
3019 UConverter *conv = 0;
3020 char junkout[NEW_MAX_BUFFER]; /* FIX */
3021 int32_t junokout[NEW_MAX_BUFFER]; /* FIX */
3022 const UChar *src;
3023 char *end;
3024 char *targ;
3025 int32_t *offs;
3026 int i;
3027 int32_t realBufferSize;
3028 char *realBufferEnd;
3029 const UChar *realSourceEnd;
3030 const UChar *sourceLimit;
3031 UBool checkOffsets = TRUE;
3032 UBool doFlush;
3033 char junk[9999];
3034 char offset_str[9999];
3035 char *p;
3036 UConverterFromUCallback oldAction = NULL;
3037 const void* oldContext = NULL;
3038
3039
3040 for(i=0;i<NEW_MAX_BUFFER;i++)
3041 junkout[i] = (char)0xF0;
3042 for(i=0;i<NEW_MAX_BUFFER;i++)
3043 junokout[i] = 0xFF;
3044 setNuConvTestName(codepage, "FROM");
3045
3046 log_verbose("\nTesting========= %s FROM \n inputbuffer= %d outputbuffer= %d\n", codepage, gInBufferSize,
3047 gOutBufferSize);
3048
3049 conv = ucnv_open(codepage, &status);
3050 if(U_FAILURE(status))
3051 {
3052 log_data_err("Couldn't open converter %s\n",codepage);
3053 return TRUE; /* Because the err has already been logged. */
3054 }
3055
3056 log_verbose("Converter opened..\n");
3057
3058 /*----setting the callback routine----*/
3059 ucnv_setFromUCallBack (conv, callback, context, &oldAction, &oldContext, &status);
3060 if (U_FAILURE(status))
3061 {
3062 log_err("FAILURE in setting the callback Function! %s\n", myErrorName(status));
3063 }
3064 /*------------------------*/
3065 /*setting the subChar*/
3066 if(mySubChar != NULL){
3067 ucnv_setSubstChars(conv, mySubChar, len, &status);
3068 if (U_FAILURE(status)) {
3069 log_err("FAILURE in setting substitution chars! %s\n", myErrorName(status));
3070 }
3071 }
3072 /*------------*/
3073
3074 src = source;
3075 targ = junkout;
3076 offs = junokout;
3077
3078 realBufferSize = UPRV_LENGTHOF(junkout);
3079 realBufferEnd = junkout + realBufferSize;
3080 realSourceEnd = source + sourceLen;
3081
3082 if ( gOutBufferSize != realBufferSize )
3083 checkOffsets = FALSE;
3084
3085 if( gInBufferSize != NEW_MAX_BUFFER )
3086 checkOffsets = FALSE;
3087
3088 do
3089 {
3090 end = nct_min(targ + gOutBufferSize, realBufferEnd);
3091 sourceLimit = nct_min(src + gInBufferSize, realSourceEnd);
3092
3093 doFlush = (UBool)(sourceLimit == realSourceEnd);
3094
3095 if(targ == realBufferEnd)
3096 {
3097 log_err("Error, overflowed the real buffer while about to call fromUnicode! targ=%08lx %s", targ, gNuConvTestName);
3098 return FALSE;
3099 }
3100 log_verbose("calling fromUnicode @ SOURCE:%08lx to %08lx TARGET: %08lx to %08lx, flush=%s\n", src,sourceLimit, targ,end, doFlush?"TRUE":"FALSE");
3101
3102
3103 status = U_ZERO_ERROR;
3104
3105 ucnv_fromUnicode (conv,
3106 (char **)&targ,
3107 (const char *)end,
3108 &src,
3109 sourceLimit,
3110 checkOffsets ? offs : NULL,
3111 doFlush, /* flush if we're at the end of the input data */
3112 &status);
3113 } while ( (status == U_BUFFER_OVERFLOW_ERROR) || (U_SUCCESS(status) && (sourceLimit < realSourceEnd)) );
3114
3115 /* allow failure codes for the stop callback */
3116 if(U_FAILURE(status) && status != expectedError)
3117 {
3118 log_err("Problem in fromUnicode, errcode %s %s\n", myErrorName(status), gNuConvTestName);
3119 return FALSE;
3120 }
3121
3122 log_verbose("\nConversion done [%d uchars in -> %d chars out]. \nResult :",
3123 sourceLen, targ-junkout);
3124 if(getTestOption(VERBOSITY_OPTION))
3125 {
3126
3127 junk[0] = 0;
3128 offset_str[0] = 0;
3129 for(p = junkout;p<targ;p++)
3130 {
3131 sprintf(junk + strlen(junk), "0x%02x, ", (0xFF) & (unsigned int)*p);
3132 sprintf(offset_str + strlen(offset_str), "0x%02x, ", (0xFF) & (unsigned int)junokout[p-junkout]);
3133 }
3134
3135 log_verbose(junk);
3136 printSeq(expect, expectLen);
3137 if ( checkOffsets )
3138 {
3139 log_verbose("\nOffsets:");
3140 log_verbose(offset_str);
3141 }
3142 log_verbose("\n");
3143 }
3144 ucnv_close(conv);
3145
3146
3147 if(expectLen != targ-junkout)
3148 {
3149 log_err("Expected %d chars out, got %d %s\n", expectLen, targ-junkout, gNuConvTestName);
3150 log_verbose("Expected %d chars out, got %d %s\n", expectLen, targ-junkout, gNuConvTestName);
3151 printSeqErr((const uint8_t *)junkout, (int32_t)(targ-junkout));
3152 printSeqErr(expect, expectLen);
3153 return FALSE;
3154 }
3155
3156 if (checkOffsets && (expectOffsets != 0) )
3157 {
3158 log_verbose("comparing %d offsets..\n", targ-junkout);
3159 if(memcmp(junokout,expectOffsets,(targ-junkout) * sizeof(int32_t) )){
3160 log_err("did not get the expected offsets while %s \n", gNuConvTestName);
3161 log_err("Got Output : ");
3162 printSeqErr((const uint8_t *)junkout, (int32_t)(targ-junkout));
3163 log_err("Got Offsets: ");
3164 for(p=junkout;p<targ;p++)
3165 log_err("%d,", junokout[p-junkout]);
3166 log_err("\n");
3167 log_err("Expected Offsets: ");
3168 for(i=0; i<(targ-junkout); i++)
3169 log_err("%d,", expectOffsets[i]);
3170 log_err("\n");
3171 return FALSE;
3172 }
3173 }
3174
3175 if(!memcmp(junkout, expect, expectLen))
3176 {
3177 log_verbose("String matches! %s\n", gNuConvTestName);
3178 return TRUE;
3179 }
3180 else
3181 {
3182 log_err("String does not match. %s\n", gNuConvTestName);
3183 log_err("source: ");
3184 printUSeqErr(source, sourceLen);
3185 log_err("Got: ");
3186 printSeqErr((const uint8_t *)junkout, expectLen);
3187 log_err("Expected: ");
3188 printSeqErr(expect, expectLen);
3189 return FALSE;
3190 }
3191}
3192UBool testConvertToUnicodeWithContext( const uint8_t *source, int sourcelen, const UChar *expect, int expectlen,
3193 const char *codepage, UConverterToUCallback callback, const int32_t *expectOffsets,
3194 const char *mySubChar, int8_t len, const void* context, UErrorCode expectedError)
3195{
3196 UErrorCode status = U_ZERO_ERROR;
3197 UConverter *conv = 0;
3198 UChar junkout[NEW_MAX_BUFFER]; /* FIX */
3199 int32_t junokout[NEW_MAX_BUFFER]; /* FIX */
3200 const char *src;
3201 const char *realSourceEnd;
3202 const char *srcLimit;
3203 UChar *targ;
3204 UChar *end;
3205 int32_t *offs;
3206 int i;
3207 UBool checkOffsets = TRUE;
3208 char junk[9999];
3209 char offset_str[9999];
3210 UChar *p;
3211 UConverterToUCallback oldAction = NULL;
3212 const void* oldContext = NULL;
3213
3214 int32_t realBufferSize;
3215 UChar *realBufferEnd;
3216
3217
3218 for(i=0;i<NEW_MAX_BUFFER;i++)
3219 junkout[i] = 0xFFFE;
3220
3221 for(i=0;i<NEW_MAX_BUFFER;i++)
3222 junokout[i] = -1;
3223
3224 setNuConvTestName(codepage, "TO");
3225
3226 log_verbose("\n========= %s\n", gNuConvTestName);
3227
3228 conv = ucnv_open(codepage, &status);
3229 if(U_FAILURE(status))
3230 {
3231 log_data_err("Couldn't open converter %s\n",gNuConvTestName);
3232 return TRUE;
3233 }
3234
3235 log_verbose("Converter opened..\n");
3236
3237 src = (const char *)source;
3238 targ = junkout;
3239 offs = junokout;
3240
3241 realBufferSize = UPRV_LENGTHOF(junkout);
3242 realBufferEnd = junkout + realBufferSize;
3243 realSourceEnd = src + sourcelen;
3244 /*----setting the callback routine----*/
3245 ucnv_setToUCallBack (conv, callback, context, &oldAction, &oldContext, &status);
3246 if (U_FAILURE(status))
3247 {
3248 log_err("FAILURE in setting the callback Function! %s\n", myErrorName(status));
3249 }
3250 /*-------------------------------------*/
3251 /*setting the subChar*/
3252 if(mySubChar != NULL){
3253 ucnv_setSubstChars(conv, mySubChar, len, &status);
3254 if (U_FAILURE(status)) {
3255 log_err("FAILURE in setting the callback Function! %s\n", myErrorName(status));
3256 }
3257 }
3258 /*------------*/
3259
3260
3261 if ( gOutBufferSize != realBufferSize )
3262 checkOffsets = FALSE;
3263
3264 if( gInBufferSize != NEW_MAX_BUFFER )
3265 checkOffsets = FALSE;
3266
3267 do
3268 {
3269 end = nct_min( targ + gOutBufferSize, realBufferEnd);
3270 srcLimit = nct_min(realSourceEnd, src + gInBufferSize);
3271
3272 if(targ == realBufferEnd)
3273 {
3274 log_err("Error, the end would overflow the real output buffer while about to call toUnicode! tarjey=%08lx %s",targ,gNuConvTestName);
3275 return FALSE;
3276 }
3277 log_verbose("calling toUnicode @ %08lx to %08lx\n", targ,end);
3278
3279
3280
3281 status = U_ZERO_ERROR;
3282
3283 ucnv_toUnicode (conv,
3284 &targ,
3285 end,
3286 (const char **)&src,
3287 (const char *)srcLimit,
3288 checkOffsets ? offs : NULL,
3289 (UBool)(srcLimit == realSourceEnd), /* flush if we're at the end of the source data */
3290 &status);
3291 } while ( (status == U_BUFFER_OVERFLOW_ERROR) || (U_SUCCESS(status) && (srcLimit < realSourceEnd)) ); /* while we just need another buffer */
3292
3293 /* allow failure codes for the stop callback */
3294 if(U_FAILURE(status) && status!=expectedError)
3295 {
3296 log_err("Problem doing toUnicode, errcode %s %s\n", myErrorName(status), gNuConvTestName);
3297 return FALSE;
3298 }
3299
3300 log_verbose("\nConversion done. %d bytes -> %d chars.\nResult :",
3301 sourcelen, targ-junkout);
3302 if(getTestOption(VERBOSITY_OPTION))
3303 {
3304
3305 junk[0] = 0;
3306 offset_str[0] = 0;
3307
3308 for(p = junkout;p<targ;p++)
3309 {
3310 sprintf(junk + strlen(junk), "0x%04x, ", (0xFFFF) & (unsigned int)*p);
3311 sprintf(offset_str + strlen(offset_str), "0x%04x, ", (0xFFFF) & (unsigned int)junokout[p-junkout]);
3312 }
3313
3314 log_verbose(junk);
3315 printUSeq(expect, expectlen);
3316 if ( checkOffsets )
3317 {
3318 log_verbose("\nOffsets:");
3319 log_verbose(offset_str);
3320 }
3321 log_verbose("\n");
3322 }
3323 ucnv_close(conv);
3324
3325 log_verbose("comparing %d uchars (%d bytes)..\n",expectlen,expectlen*2);
3326
3327 if (checkOffsets && (expectOffsets != 0))
3328 {
3329 if(memcmp(junokout,expectOffsets,(targ-junkout) * sizeof(int32_t)))
3330 {
3331 log_err("did not get the expected offsets while %s \n", gNuConvTestName);
3332 log_err("Got offsets: ");
3333 for(p=junkout;p<targ;p++)
3334 log_err(" %2d,", junokout[p-junkout]);
3335 log_err("\n");
3336 log_err("Expected offsets: ");
3337 for(i=0; i<(targ-junkout); i++)
3338 log_err(" %2d,", expectOffsets[i]);
3339 log_err("\n");
3340 log_err("Got output: ");
3341 for(i=0; i<(targ-junkout); i++)
3342 log_err("0x%04x,", junkout[i]);
3343 log_err("\n");
3344 log_err("From source: ");
3345 for(i=0; i<(src-(const char *)source); i++)
3346 log_err(" 0x%02x,", (unsigned char)source[i]);
3347 log_err("\n");
3348 }
3349 }
3350
3351 if(!memcmp(junkout, expect, expectlen*2))
3352 {
3353 log_verbose("Matches!\n");
3354 return TRUE;
3355 }
3356 else
3357 {
3358 log_err("String does not match. %s\n", gNuConvTestName);
3359 log_verbose("String does not match. %s\n", gNuConvTestName);
3360 log_err("Got: ");
3361 printUSeqErr(junkout, expectlen);
3362 log_err("Expected: ");
3363 printUSeqErr(expect, expectlen);
3364 log_err("\n");
3365 return FALSE;
3366 }
3367}
3368
3369static void TestCallBackFailure(void) {
3370 UErrorCode status = U_USELESS_COLLATOR_ERROR;
3371 ucnv_cbFromUWriteBytes(NULL, NULL, -1, -1, &status);
3372 if (status != U_USELESS_COLLATOR_ERROR) {
3373 log_err("Error: ucnv_cbFromUWriteBytes did not react correctly to a bad UErrorCode\n");
3374 }
3375 ucnv_cbFromUWriteUChars(NULL, NULL, NULL, -1, &status);
3376 if (status != U_USELESS_COLLATOR_ERROR) {
3377 log_err("Error: ucnv_cbFromUWriteUChars did not react correctly to a bad UErrorCode\n");
3378 }
3379 ucnv_cbFromUWriteSub(NULL, -1, &status);
3380 if (status != U_USELESS_COLLATOR_ERROR) {
3381 log_err("Error: ucnv_cbFromUWriteSub did not react correctly to a bad UErrorCode\n");
3382 }
3383 ucnv_cbToUWriteUChars(NULL, NULL, -1, -1, &status);
3384 if (status != U_USELESS_COLLATOR_ERROR) {
3385 log_err("Error: ucnv_cbToUWriteUChars did not react correctly to a bad UErrorCode\n");
3386 }
3387}