1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/********************************************************************
2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * COPYRIGHT:
3b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Copyright (c) 1997-2011, International Business Machines Corporation and
4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * others. All Rights Reserved.
5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ********************************************************************/
6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*******************************************************************************
7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* File CCONVTST.C
9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Modification History:
11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*        Name                     Description
12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*    Steven R. Loomis     7/8/1999      Adding input buffer test
13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru********************************************************************************
14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/
15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <stdio.h>
16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "cstring.h"
17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/uloc.h"
18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/ucnv.h"
19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/ucnv_err.h"
2085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "unicode/ucnv_cb.h"
21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "cintltst.h"
22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/utypes.h"
23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/ustring.h"
24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/ucol.h"
25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "cmemory.h"
2650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "nucnvtst.h"
27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
28b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#define LENGTHOF(array) (sizeof(array)/sizeof((array)[0]))
29b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestNextUChar(UConverter* cnv, const char* source, const char* limit, const int32_t results[], const char* message);
31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestNextUCharError(UConverter* cnv, const char* source, const char* limit, UErrorCode expected, const char* message);
32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if !UCONFIG_NO_COLLATION
33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestJitterbug981(void);
34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestJitterbug1293(void);
36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestNewConvertWithBufferSizes(int32_t osize, int32_t isize) ;
37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestConverterTypesAndStarters(void);
38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestAmbiguous(void);
39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestSignatureDetection(void);
40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestUTF7(void);
41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestIMAP(void);
42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestUTF8(void);
43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestCESU8(void);
44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestUTF16(void);
45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestUTF16BE(void);
46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestUTF16LE(void);
47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestUTF32(void);
48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestUTF32BE(void);
49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestUTF32LE(void);
50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestLATIN1(void);
51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if !UCONFIG_NO_LEGACY_CONVERSION
53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestSBCS(void);
54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestDBCS(void);
55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestMBCS(void);
5650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if !UCONFIG_NO_LEGACY_CONVERSION && !UCONFIG_NO_FILE_IO
5750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic void TestICCRunout(void);
5850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif
59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifdef U_ENABLE_GENERIC_ISO_2022
61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestISO_2022(void);
62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestISO_2022_JP(void);
65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestISO_2022_JP_1(void);
66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestISO_2022_JP_2(void);
67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestISO_2022_KR(void);
68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestISO_2022_KR_1(void);
69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestISO_2022_CN(void);
7027f654740f2a26ad62a5c155af9199af9e69b889claireho#if 0
7127f654740f2a26ad62a5c155af9199af9e69b889claireho   /*
7227f654740f2a26ad62a5c155af9199af9e69b889claireho    * ICU 4.4 (ticket #7314) removes mappings for CNS 11643 planes 3..7
7327f654740f2a26ad62a5c155af9199af9e69b889claireho    */
74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestISO_2022_CN_EXT(void);
7527f654740f2a26ad62a5c155af9199af9e69b889claireho#endif
76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestJIS(void);
77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestHZ(void);
78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestSCSU(void);
81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if !UCONFIG_NO_LEGACY_CONVERSION
83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestEBCDIC_STATEFUL(void);
84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestGB18030(void);
85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestLMBCS(void);
86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestJitterbug255(void);
87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestEBCDICUS4XML(void);
8827f654740f2a26ad62a5c155af9199af9e69b889claireho#if 0
8927f654740f2a26ad62a5c155af9199af9e69b889claireho   /*
9027f654740f2a26ad62a5c155af9199af9e69b889claireho    * ICU 4.4 (ticket #7314) removes mappings for CNS 11643 planes 3..7
9127f654740f2a26ad62a5c155af9199af9e69b889claireho    */
92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestJitterbug915(void);
9327f654740f2a26ad62a5c155af9199af9e69b889claireho#endif
94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestISCII(void);
95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestCoverageMBCS(void);
97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestJitterbug2346(void);
98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestJitterbug2411(void);
99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestJB5275(void);
100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestJB5275_1(void);
10185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic void TestJitterbug6175(void);
102b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
103b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void TestIsFixedWidth(void);
104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
10650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic void TestInBufSizes(void);
10750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestRoundTrippingAllUTF(void);
109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestConv(const uint16_t in[],
110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                     int len,
111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                     const char* conv,
112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                     const char* lang,
113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                     char byteArr[],
114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                     int byteArrLen);
115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* open a converter, using test data if it begins with '@' */
117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic UConverter *my_ucnv_open(const char *cnv, UErrorCode *err);
118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define NEW_MAX_BUFFER 999
121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic int32_t  gInBufferSize = NEW_MAX_BUFFER;
123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic int32_t  gOutBufferSize = NEW_MAX_BUFFER;
124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic char     gNuConvTestName[1024];
125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define nct_min(x,y)  ((x<y) ? x : y)
127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic UConverter *my_ucnv_open(const char *cnv, UErrorCode *err)
129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  if(cnv && cnv[0] == '@') {
131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return ucnv_openPackage(loadTestData(err), cnv+1, err);
132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  } else {
133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return ucnv_open(cnv, err);
134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  }
135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void printSeq(const unsigned char* a, int len)
138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int i=0;
140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("{");
141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    while (i<len)
142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("0x%02x ", a[i++]);
143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("}\n");
144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void printUSeq(const UChar* a, int len)
147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int i=0;
149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("{U+");
150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    while (i<len) log_verbose("0x%04x ", a[i++]);
151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("}\n");
152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void printSeqErr(const unsigned char* a, int len)
155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int i=0;
157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    fprintf(stderr, "{");
158ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    while (i<len)
159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        fprintf(stderr, "0x%02x ", a[i++]);
160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    fprintf(stderr, "}\n");
161ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
162ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
163ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void printUSeqErr(const UChar* a, int len)
164ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
165ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int i=0;
166ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    fprintf(stderr, "{U+");
167ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    while (i<len)
168ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        fprintf(stderr, "0x%04x ", a[i++]);
169ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    fprintf(stderr,"}\n");
170ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
171ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
172ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
173ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruTestNextUChar(UConverter* cnv, const char* source, const char* limit, const int32_t results[], const char* message)
174ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     const char* s0;
176ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     const char* s=(char*)source;
177ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     const int32_t *r=results;
178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     UErrorCode errorCode=U_ZERO_ERROR;
179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     UChar32 c;
180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
181ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     while(s<limit) {
182ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        s0=s;
183ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        c=ucnv_getNextUChar(cnv, &s, limit, &errorCode);
184ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(errorCode==U_INDEX_OUTOFBOUNDS_ERROR) {
185ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            break; /* no more significant input */
186ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        } else if(U_FAILURE(errorCode)) {
187ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("%s ucnv_getNextUChar() failed: %s\n", message, u_errorName(errorCode));
188ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            break;
189ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        } else if(
190ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            /* test the expected number of input bytes only if >=0 */
191ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            (*r>=0 && (int32_t)(s-s0)!=*r) ||
192ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            c!=*(r+1)
193ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ) {
194ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("%s ucnv_getNextUChar() result %lx from %d bytes, should have been %lx from %d bytes.\n",
195ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                message, c, (s-s0), *(r+1), *r);
196ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            break;
197ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
198ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        r+=2;
199ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
200ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
201ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
202ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
203ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruTestNextUCharError(UConverter* cnv, const char* source, const char* limit, UErrorCode expected, const char* message)
204ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
205ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     const char* s=(char*)source;
206ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     UErrorCode errorCode=U_ZERO_ERROR;
207ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     uint32_t c;
208ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     c=ucnv_getNextUChar(cnv, &s, limit, &errorCode);
209ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     if(errorCode != expected){
210ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("FAIL: Expected:%s when %s-----Got:%s\n", myErrorName(expected), message, myErrorName(errorCode));
211ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     }
212ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     if(c != 0xFFFD && c != 0xffff){
213ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("FAIL: Expected return value of 0xfffd or 0xffff when %s-----Got 0x%lx\n", message, c);
214ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     }
215ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
216ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
217ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
218ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestInBufSizes(void)
219ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
220ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  TestNewConvertWithBufferSizes(NEW_MAX_BUFFER,1);
221ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if 1
222ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  TestNewConvertWithBufferSizes(NEW_MAX_BUFFER,2);
223ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  TestNewConvertWithBufferSizes(NEW_MAX_BUFFER,3);
224ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  TestNewConvertWithBufferSizes(NEW_MAX_BUFFER,4);
225ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  TestNewConvertWithBufferSizes(NEW_MAX_BUFFER,5);
226ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  TestNewConvertWithBufferSizes(NEW_MAX_BUFFER,6);
227ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  TestNewConvertWithBufferSizes(1,1);
228ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  TestNewConvertWithBufferSizes(2,3);
229ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  TestNewConvertWithBufferSizes(3,2);
230ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
231ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
232ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
233ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestOutBufSizes(void)
234ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
235ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if 1
236ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  TestNewConvertWithBufferSizes(NEW_MAX_BUFFER,NEW_MAX_BUFFER);
237ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  TestNewConvertWithBufferSizes(1,NEW_MAX_BUFFER);
238ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  TestNewConvertWithBufferSizes(2,NEW_MAX_BUFFER);
239ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  TestNewConvertWithBufferSizes(3,NEW_MAX_BUFFER);
240ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  TestNewConvertWithBufferSizes(4,NEW_MAX_BUFFER);
241ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  TestNewConvertWithBufferSizes(5,NEW_MAX_BUFFER);
242ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
243ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
244ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
245ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
246ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
247ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid addTestNewConvert(TestNode** root)
248ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
24950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if !UCONFIG_NO_FILE_IO
250ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   addTest(root, &TestInBufSizes, "tsconv/nucnvtst/TestInBufSizes");
251ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   addTest(root, &TestOutBufSizes, "tsconv/nucnvtst/TestOutBufSizes");
25250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif
253ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   addTest(root, &TestConverterTypesAndStarters, "tsconv/nucnvtst/TestConverterTypesAndStarters");
254ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   addTest(root, &TestAmbiguous, "tsconv/nucnvtst/TestAmbiguous");
255ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   addTest(root, &TestSignatureDetection, "tsconv/nucnvtst/TestSignatureDetection");
256ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   addTest(root, &TestUTF7, "tsconv/nucnvtst/TestUTF7");
257ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   addTest(root, &TestIMAP, "tsconv/nucnvtst/TestIMAP");
258ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   addTest(root, &TestUTF8, "tsconv/nucnvtst/TestUTF8");
259ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
260ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   /* test ucnv_getNextUChar() for charsets that encode single surrogates with complete byte sequences */
261ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   addTest(root, &TestCESU8, "tsconv/nucnvtst/TestCESU8");
262ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   addTest(root, &TestUTF16, "tsconv/nucnvtst/TestUTF16");
263ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   addTest(root, &TestUTF16BE, "tsconv/nucnvtst/TestUTF16BE");
264ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   addTest(root, &TestUTF16LE, "tsconv/nucnvtst/TestUTF16LE");
265ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   addTest(root, &TestUTF32, "tsconv/nucnvtst/TestUTF32");
266ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   addTest(root, &TestUTF32BE, "tsconv/nucnvtst/TestUTF32BE");
267ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   addTest(root, &TestUTF32LE, "tsconv/nucnvtst/TestUTF32LE");
268ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
269ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if !UCONFIG_NO_LEGACY_CONVERSION
270ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   addTest(root, &TestLMBCS, "tsconv/nucnvtst/TestLMBCS");
271ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
272ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
273ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   addTest(root, &TestLATIN1, "tsconv/nucnvtst/TestLATIN1");
274ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
275ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if !UCONFIG_NO_LEGACY_CONVERSION
276ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   addTest(root, &TestSBCS, "tsconv/nucnvtst/TestSBCS");
27750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if !UCONFIG_NO_FILE_IO
278ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   addTest(root, &TestDBCS, "tsconv/nucnvtst/TestDBCS");
27950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   addTest(root, &TestICCRunout, "tsconv/nucnvtst/TestICCRunout");
28050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif
281ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   addTest(root, &TestMBCS, "tsconv/nucnvtst/TestMBCS");
282ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
283ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifdef U_ENABLE_GENERIC_ISO_2022
284ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   addTest(root, &TestISO_2022, "tsconv/nucnvtst/TestISO_2022");
285ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
286b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho   /* BEGIN android-changed
287ea1f1813c8b13a850b13f256aeb5152bb0942e81claireho      To save space, Android does not build full ISO2022 CJK tables.
288ea1f1813c8b13a850b13f256aeb5152bb0942e81claireho      We turn off the tests here.
289b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho   addTest(root, &TestISO_2022_JP, "tsconv/nucnvtst/TestISO_2022_JP");
290b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho   END android-changed */
291b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho   addTest(root, &TestJIS, "tsconv/nucnvtst/TestJIS");
292b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho   /* BEGIN android-changed
293ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   addTest(root, &TestISO_2022_JP_1, "tsconv/nucnvtst/TestISO_2022_JP_1");
294ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   addTest(root, &TestISO_2022_JP_2, "tsconv/nucnvtst/TestISO_2022_JP_2");
295ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   addTest(root, &TestISO_2022_KR, "tsconv/nucnvtst/TestISO_2022_KR");
296ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   addTest(root, &TestISO_2022_KR_1, "tsconv/nucnvtst/TestISO_2022_KR_1");
297ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   addTest(root, &TestISO_2022_CN, "tsconv/nucnvtst/TestISO_2022_CN");
298b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  END android-changed */
29950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   /*
30050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    * ICU 4.4 (ticket #7314) removes mappings for CNS 11643 planes 3..7
301ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   addTest(root, &TestISO_2022_CN_EXT, "tsconv/nucnvtst/TestISO_2022_CN_EXT");
302ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   addTest(root, &TestJitterbug915, "tsconv/nucnvtst/TestJitterbug915");
30350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    */
304ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   addTest(root, &TestHZ, "tsconv/nucnvtst/TestHZ");
305ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
306ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
307ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   addTest(root, &TestSCSU, "tsconv/nucnvtst/TestSCSU");
308ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
309ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if !UCONFIG_NO_LEGACY_CONVERSION
310ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   addTest(root, &TestEBCDIC_STATEFUL, "tsconv/nucnvtst/TestEBCDIC_STATEFUL");
311ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   addTest(root, &TestGB18030, "tsconv/nucnvtst/TestGB18030");
312ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   addTest(root, &TestJitterbug255, "tsconv/nucnvtst/TestJitterbug255");
313ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   addTest(root, &TestEBCDICUS4XML, "tsconv/nucnvtst/TestEBCDICUS4XML");
314ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   addTest(root, &TestISCII, "tsconv/nucnvtst/TestISCII");
315ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   addTest(root, &TestJB5275, "tsconv/nucnvtst/TestJB5275");
316ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   addTest(root, &TestJB5275_1, "tsconv/nucnvtst/TestJB5275_1");
317ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if !UCONFIG_NO_COLLATION
318ea1f1813c8b13a850b13f256aeb5152bb0942e81claireho   /* BEGIN android-removed
319ea1f1813c8b13a850b13f256aeb5152bb0942e81claireho      To save space, Android does not include the collation tailoring rules.
320ea1f1813c8b13a850b13f256aeb5152bb0942e81claireho      Skip the related tests.
321ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   addTest(root, &TestJitterbug981, "tsconv/nucnvtst/TestJitterbug981");
322ea1f1813c8b13a850b13f256aeb5152bb0942e81claireho      END android-removed */
323ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
324ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
325ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   addTest(root, &TestJitterbug1293, "tsconv/nucnvtst/TestJitterbug1293");
326ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
327ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
328ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
32950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if !UCONFIG_NO_LEGACY_CONVERSION && !UCONFIG_NO_FILE_IO
330ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   addTest(root, &TestCoverageMBCS, "tsconv/nucnvtst/TestCoverageMBCS");
331ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
332ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
333ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   addTest(root, &TestRoundTrippingAllUTF, "tsconv/nucnvtst/TestRoundTrippingAllUTF");
334ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
335ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if !UCONFIG_NO_LEGACY_CONVERSION
336ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   addTest(root, &TestJitterbug2346, "tsconv/nucnvtst/TestJitterbug2346");
337ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   addTest(root, &TestJitterbug2411, "tsconv/nucnvtst/TestJitterbug2411");
338ea1f1813c8b13a850b13f256aeb5152bb0942e81claireho   /* BEGIN android-removed
339ea1f1813c8b13a850b13f256aeb5152bb0942e81claireho      To save space, Android does not build full ISO2022 CJK tables.
340ea1f1813c8b13a850b13f256aeb5152bb0942e81claireho      We turn off the tests here.
34185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho   addTest(root, &TestJitterbug6175, "tsconv/nucnvtst/TestJitterbug6175");
342ea1f1813c8b13a850b13f256aeb5152bb0942e81claireho      END android-removed */
343ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
344b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho   addTest(root, &TestIsFixedWidth, "tsconv/nucnvtst/TestIsFixedWidth");
345b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#endif
346ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
347ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
348ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
349ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* Note that this test already makes use of statics, so it's not really
350ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   multithread safe.
351ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   This convenience function lets us make the error messages actually useful.
352ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/
353ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
354ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void setNuConvTestName(const char *codepage, const char *direction)
355ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
356ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    sprintf(gNuConvTestName, "[Testing %s %s Unicode, InputBufSiz=%d, OutputBufSiz=%d]",
357ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        codepage,
358ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        direction,
359ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        (int)gInBufferSize,
360ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        (int)gOutBufferSize);
361ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
362ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
363ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querutypedef enum
364ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
365ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  TC_OK       = 0,  /* test was OK */
366ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  TC_MISMATCH = 1,  /* Match failed - err was printed */
367ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  TC_FAIL     = 2   /* Test failed, don't print an err because it was already printed. */
368ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} ETestConvertResult;
369ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
370ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* Note: This function uses global variables and it will not do offset
371ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruchecking without gOutBufferSize and gInBufferSize set to NEW_MAX_BUFFER */
372ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic ETestConvertResult testConvertFromU( const UChar *source, int sourceLen,  const uint8_t *expect, int expectLen,
373ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                const char *codepage, const int32_t *expectOffsets , UBool useFallback)
374ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
375ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
376ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UConverter *conv = 0;
377ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char    junkout[NEW_MAX_BUFFER]; /* FIX */
378ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t    junokout[NEW_MAX_BUFFER]; /* FIX */
379ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char *p;
380ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const UChar *src;
381ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char *end;
382ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char *targ;
383ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t *offs;
384ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int i;
385ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t   realBufferSize;
386ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char *realBufferEnd;
387ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const UChar *realSourceEnd;
388ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const UChar *sourceLimit;
389ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UBool checkOffsets = TRUE;
390ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UBool doFlush;
391ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
392ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    for(i=0;i<NEW_MAX_BUFFER;i++)
393ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        junkout[i] = (char)0xF0;
394ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    for(i=0;i<NEW_MAX_BUFFER;i++)
395ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        junokout[i] = 0xFF;
396ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
397ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    setNuConvTestName(codepage, "FROM");
398ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
399ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("\n=========  %s\n", gNuConvTestName);
400ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
401ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    conv = my_ucnv_open(codepage, &status);
402ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
403ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(status))
404ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
405ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_data_err("Couldn't open converter %s\n",codepage);
406ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return TC_FAIL;
407ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
408ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(useFallback){
409ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucnv_setFallback(conv,useFallback);
410ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
411ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
412ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Converter opened..\n");
413ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
414ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    src = source;
415ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    targ = junkout;
416ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    offs = junokout;
417ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
418ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    realBufferSize = (sizeof(junkout)/sizeof(junkout[0]));
419ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    realBufferEnd = junkout + realBufferSize;
420ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    realSourceEnd = source + sourceLen;
421ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
422ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if ( gOutBufferSize != realBufferSize || gInBufferSize != NEW_MAX_BUFFER )
423ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        checkOffsets = FALSE;
424ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
425ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    do
426ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
427ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      end = nct_min(targ + gOutBufferSize, realBufferEnd);
428ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      sourceLimit = nct_min(src + gInBufferSize, realSourceEnd);
429ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
430ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      doFlush = (UBool)(sourceLimit == realSourceEnd);
431ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
432ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      if(targ == realBufferEnd) {
433ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("Error, overflowed the real buffer while about to call fromUnicode! targ=%08lx %s", targ, gNuConvTestName);
434ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return TC_FAIL;
435ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      }
436ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      log_verbose("calling fromUnicode @ SOURCE:%08lx to %08lx  TARGET: %08lx to %08lx, flush=%s\n", src,sourceLimit, targ,end, doFlush?"TRUE":"FALSE");
437ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
438ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
439ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      status = U_ZERO_ERROR;
440ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
441ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      ucnv_fromUnicode (conv,
442ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        &targ,
443ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        end,
444ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        &src,
445ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        sourceLimit,
446ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        checkOffsets ? offs : NULL,
447ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        doFlush, /* flush if we're at the end of the input data */
448ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        &status);
449ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } while ( (status == U_BUFFER_OVERFLOW_ERROR) || (U_SUCCESS(status) && sourceLimit < realSourceEnd) );
450ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
451ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(status)) {
452ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      log_err("Problem doing fromUnicode to %s, errcode %s %s\n", codepage, myErrorName(status), gNuConvTestName);
453ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      return TC_FAIL;
454ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
455ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
456ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("\nConversion done [%d uchars in -> %d chars out]. \nResult :",
457ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                sourceLen, targ-junkout);
458ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
45927f654740f2a26ad62a5c155af9199af9e69b889claireho    if(getTestOption(VERBOSITY_OPTION))
460ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
461ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      char junk[9999];
462ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      char offset_str[9999];
463ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      char *ptr;
464ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
465ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      junk[0] = 0;
466ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      offset_str[0] = 0;
467ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      for(ptr = junkout;ptr<targ;ptr++) {
468ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        sprintf(junk + strlen(junk), "0x%02x, ", (int)(0xFF & *ptr));
469ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        sprintf(offset_str + strlen(offset_str), "0x%02x, ", (int)(0xFF & junokout[ptr-junkout]));
470ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      }
471ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
472ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      log_verbose(junk);
473ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      printSeq((const uint8_t *)expect, expectLen);
474ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      if ( checkOffsets ) {
475ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("\nOffsets:");
476ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose(offset_str);
477ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      }
478ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      log_verbose("\n");
479ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
480ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_close(conv);
481ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
482ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(expectLen != targ-junkout) {
483ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      log_err("Expected %d chars out, got %d %s\n", expectLen, targ-junkout, gNuConvTestName);
484ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      log_verbose("Expected %d chars out, got %d %s\n", expectLen, targ-junkout, gNuConvTestName);
485b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho      fprintf(stderr, "Got:\n");
486ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      printSeqErr((const unsigned char*)junkout, (int32_t)(targ-junkout));
487b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho      fprintf(stderr, "Expected:\n");
488ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      printSeqErr((const unsigned char*)expect, expectLen);
489ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      return TC_MISMATCH;
490ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
491ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
492ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (checkOffsets && (expectOffsets != 0) ) {
493ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      log_verbose("comparing %d offsets..\n", targ-junkout);
494ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      if(memcmp(junokout,expectOffsets,(targ-junkout) * sizeof(int32_t) )){
495ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("did not get the expected offsets. %s\n", gNuConvTestName);
496ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        printSeqErr((const unsigned char*)junkout, (int32_t)(targ-junkout));
497ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("\n");
498ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("Got  :     ");
499ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        for(p=junkout;p<targ;p++) {
500ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          log_err("%d,", junokout[p-junkout]);
501ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
502ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("\n");
503ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("Expected:  ");
504ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        for(i=0; i<(targ-junkout); i++) {
505ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          log_err("%d,", expectOffsets[i]);
506ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
507ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("\n");
508ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      }
509ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
510ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
511ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("comparing..\n");
512ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(!memcmp(junkout, expect, expectLen)) {
513ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      log_verbose("Matches!\n");
514ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      return TC_OK;
515ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } else {
516ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      log_err("String does not match u->%s\n", gNuConvTestName);
517ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      printUSeqErr(source, sourceLen);
518b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho      fprintf(stderr, "Got:\n");
519ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      printSeqErr((const unsigned char *)junkout, expectLen);
520b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho      fprintf(stderr, "Expected:\n");
521ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      printSeqErr((const unsigned char *)expect, expectLen);
522ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
523ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      return TC_MISMATCH;
524ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
525ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
526ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
527ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* Note: This function uses global variables and it will not do offset
528ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruchecking without gOutBufferSize and gInBufferSize set to NEW_MAX_BUFFER */
529ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic ETestConvertResult testConvertToU( const uint8_t *source, int sourcelen, const UChar *expect, int expectlen,
530ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                                          const char *codepage, const int32_t *expectOffsets, UBool useFallback)
531ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
532ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
533ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UConverter *conv = 0;
534ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar    junkout[NEW_MAX_BUFFER]; /* FIX */
535ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t    junokout[NEW_MAX_BUFFER]; /* FIX */
536ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *src;
537ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *realSourceEnd;
538ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *srcLimit;
539ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *p;
540ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *targ;
541ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *end;
542ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t *offs;
543ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int i;
544ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UBool   checkOffsets = TRUE;
545ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
546ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t   realBufferSize;
547ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *realBufferEnd;
548ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
549ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
550ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    for(i=0;i<NEW_MAX_BUFFER;i++)
551ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        junkout[i] = 0xFFFE;
552ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
553ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    for(i=0;i<NEW_MAX_BUFFER;i++)
554ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        junokout[i] = -1;
555ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
556ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    setNuConvTestName(codepage, "TO");
557ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
558ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("\n=========  %s\n", gNuConvTestName);
559ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
560ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    conv = my_ucnv_open(codepage, &status);
561ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
562ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(status))
563ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
564ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_data_err("Couldn't open converter %s\n",gNuConvTestName);
565ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return TC_FAIL;
566ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
567ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(useFallback){
568ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucnv_setFallback(conv,useFallback);
569ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
570ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Converter opened..\n");
571ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
572ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    src = (const char *)source;
573ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    targ = junkout;
574ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    offs = junokout;
575ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
576ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    realBufferSize = (sizeof(junkout)/sizeof(junkout[0]));
577ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    realBufferEnd = junkout + realBufferSize;
578ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    realSourceEnd = src + sourcelen;
579ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
580ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if ( gOutBufferSize != realBufferSize ||  gInBufferSize != NEW_MAX_BUFFER )
581ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        checkOffsets = FALSE;
582ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
583ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    do
584ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
585ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        end = nct_min( targ + gOutBufferSize, realBufferEnd);
586ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        srcLimit = nct_min(realSourceEnd, src + gInBufferSize);
587ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
588ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(targ == realBufferEnd)
589ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {
590ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("Error, the end would overflow the real output buffer while about to call toUnicode! tarjet=%08lx %s",targ,gNuConvTestName);
591ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            return TC_FAIL;
592ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
593ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("calling toUnicode @ %08lx to %08lx\n", targ,end);
594ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
595ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* oldTarg = targ; */
596ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
597ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        status = U_ZERO_ERROR;
598ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
599ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucnv_toUnicode (conv,
600ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                &targ,
601ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                end,
602ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                &src,
603ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                srcLimit,
604ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                checkOffsets ? offs : NULL,
605ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                (UBool)(srcLimit == realSourceEnd), /* flush if we're at the end of hte source data */
606ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                &status);
607ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
608ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /*        offs += (targ-oldTarg); */
609ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
610ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      } while ( (status == U_BUFFER_OVERFLOW_ERROR) || (U_SUCCESS(status) && (srcLimit < realSourceEnd)) ); /* while we just need another buffer */
611ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
612ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(status))
613ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
614ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("Problem doing %s toUnicode, errcode %s %s\n", codepage, myErrorName(status), gNuConvTestName);
615ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return TC_FAIL;
616ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
617ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
618ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("\nConversion done. %d bytes -> %d chars.\nResult :",
619ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        sourcelen, targ-junkout);
62027f654740f2a26ad62a5c155af9199af9e69b889claireho    if(getTestOption(VERBOSITY_OPTION))
621ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
622ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        char junk[9999];
623ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        char offset_str[9999];
624ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UChar *ptr;
625ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
626ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        junk[0] = 0;
627ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        offset_str[0] = 0;
628ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
629ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        for(ptr = junkout;ptr<targ;ptr++)
630ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {
631ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            sprintf(junk + strlen(junk), "0x%04x, ", (0xFFFF) & (unsigned int)*ptr);
632ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            sprintf(offset_str + strlen(offset_str), "0x%04x, ", (0xFFFF) & (unsigned int)junokout[ptr-junkout]);
633ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
634ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
635ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose(junk);
636ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        printUSeq(expect, expectlen);
637ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if ( checkOffsets )
638ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          {
639ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_verbose("\nOffsets:");
640ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_verbose(offset_str);
641ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          }
642ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("\n");
643ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
644ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_close(conv);
645ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
646ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("comparing %d uchars (%d bytes)..\n",expectlen,expectlen*2);
647ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
648ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (checkOffsets && (expectOffsets != 0))
649ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
650ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(memcmp(junokout,expectOffsets,(targ-junkout) * sizeof(int32_t))){
651ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("did not get the expected offsets. %s\n",gNuConvTestName);
652ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("Got:      ");
653ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            for(p=junkout;p<targ;p++) {
654ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                log_err("%d,", junokout[p-junkout]);
655ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
656ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("\n");
657ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("Expected: ");
658ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            for(i=0; i<(targ-junkout); i++) {
659ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                log_err("%d,", expectOffsets[i]);
660ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
661ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("\n");
662ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("output:   ");
663ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            for(i=0; i<(targ-junkout); i++) {
664ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                log_err("%X,", junkout[i]);
665ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
666ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("\n");
667ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("input:    ");
668ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            for(i=0; i<(src-(const char *)source); i++) {
669ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                log_err("%X,", (unsigned char)source[i]);
670ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
671ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("\n");
672ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
673ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
674ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
675ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(!memcmp(junkout, expect, expectlen*2))
676ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
677ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("Matches!\n");
678ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return TC_OK;
679ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
680ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    else
681ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
682ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("String does not match. %s\n", gNuConvTestName);
683ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("String does not match. %s\n", gNuConvTestName);
684ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        printf("\nGot:");
685ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        printUSeqErr(junkout, expectlen);
686ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        printf("\nExpected:");
687ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        printUSeqErr(expect, expectlen);
688ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return TC_MISMATCH;
689ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
690ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
691ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
692ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
693ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestNewConvertWithBufferSizes(int32_t outsize, int32_t insize )
694ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
695ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** test chars #1 */
696ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*  1 2 3  1Han 2Han 3Han .  */
697ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const UChar   sampleText[] =
69885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho     { 0x0031, 0x0032, 0x0033, 0x0000, 0x4e00, 0x4e8c, 0x4e09, 0x002E, 0xD840, 0xDC21 };
69985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    static const UChar sampleTextRoundTripUnmappable[] =
70085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    { 0x0031, 0x0032, 0x0033, 0x0000, 0x4e00, 0x4e8c, 0x4e09, 0x002E, 0xfffd };
701ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
702ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
703ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint8_t expectedUTF8[] =
70485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho     { 0x31, 0x32, 0x33, 0x00, 0xe4, 0xb8, 0x80, 0xe4, 0xba, 0x8c, 0xe4, 0xb8, 0x89, 0x2E, 0xf0, 0xa0, 0x80, 0xa1 };
705ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int32_t toUTF8Offs[] =
70685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho     { 0x00, 0x01, 0x02, 0x03, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x07, 0x08, 0x08, 0x08, 0x08 };
707ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int32_t fmUTF8Offs[] =
70885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho     { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0007, 0x000a, 0x000d, 0x000e, 0x000e };
709ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
710ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifdef U_ENABLE_GENERIC_ISO_2022
711ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* Same as UTF8, but with ^[%B preceeding */
712ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const const uint8_t expectedISO2022[] =
713ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     { 0x1b, 0x25, 0x42, 0x31, 0x32, 0x33, 0x00, 0xe4, 0xb8, 0x80, 0xe4, 0xba, 0x8c, 0xe4, 0xb8, 0x89, 0x2E };
714ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int32_t toISO2022Offs[]     =
715ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     { -1, -1, -1, 0x00, 0x01, 0x02, 0x03, 0x04, 0x04,
716ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       0x04, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x07 }; /* right? */
717ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int32_t fmISO2022Offs[] =
718ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     { 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x000a, 0x000d, 0x0010 }; /* is this right? */
719ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
720ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
721ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*  1 2 3 0, <SO> h1 h2 h3 <SI> . EBCDIC_STATEFUL */
722ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint8_t expectedIBM930[] =
72385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho     { 0xF1, 0xF2, 0xF3, 0x00, 0x0E, 0x45, 0x41, 0x45, 0x42, 0x45, 0x43, 0x0F, 0x4B, 0x0e, 0xfe, 0xfe, 0x0f };
724ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int32_t toIBM930Offs[] =
72585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho     { 0x00, 0x01, 0x02, 0x03, 0x04, 0x04, 0x04, 0x05, 0x05, 0x06, 0x06, 0x07, 0x07, 0x08, 0x08, 0x08, -1 };
726ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int32_t fmIBM930Offs[] =
72785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho     { 0x0000, 0x0001, 0x0002, 0x0003, 0x0005, 0x0007, 0x0009, 0x000c, 0x000e };
728ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
729ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* 1 2 3 0 h1 h2 h3 . MBCS*/
730ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint8_t expectedIBM943[] =
73185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho     {  0x31, 0x32, 0x33, 0x00, 0x88, 0xea, 0x93, 0xf1, 0x8e, 0x4f, 0x2e, 0xfc, 0xfc };
732ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int32_t toIBM943Offs    [] =
73385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho     {  0x00, 0x01, 0x02, 0x03, 0x04, 0x04, 0x05, 0x05, 0x06, 0x06, 0x07, 0x08, 0x08 };
734ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int32_t fmIBM943Offs[] =
73585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho     { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0006, 0x0008, 0x000a, 0x000b };
736ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
737ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* 1 2 3 0 h1 h2 h3 . DBCS*/
738ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint8_t expectedIBM9027[] =
73985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho     {  0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0x4c, 0x41, 0x4c, 0x48, 0x4c, 0x55, 0xfe, 0xfe, 0xfe, 0xfe };
740ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int32_t toIBM9027Offs    [] =
74185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho     {  0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, 0x06, 0x06, 0x07, 0x07, 0x08, 0x08 };
742ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
743ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     /* 1 2 3 0 <?> <?> <?> . SBCS*/
744ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint8_t expectedIBM920[] =
74585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho     {  0x31, 0x32, 0x33, 0x00, 0x1a, 0x1a, 0x1a, 0x2e, 0x1a };
746ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int32_t toIBM920Offs    [] =
74785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho     {  0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };
748ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
749ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* 1 2 3 0 <?> <?> <?> . SBCS*/
750ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint8_t expectedISO88593[] =
75185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho     { 0x31, 0x32, 0x33, 0x00, 0x1a, 0x1a, 0x1a, 0x2E, 0x1a };
752ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int32_t toISO88593Offs[]     =
75385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho     { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };
754ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
755ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* 1 2 3 0 <?> <?> <?> . <?> LATIN_1*/
756ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint8_t expectedLATIN1[] =
75785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho     { 0x31, 0x32, 0x33, 0x00, 0x1a, 0x1a, 0x1a, 0x2E, 0x1a };
758ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int32_t toLATIN1Offs[]     =
75985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho     { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };
760ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
761ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
762ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*  etc */
763ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint8_t expectedUTF16BE[] =
76485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho     { 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x00, 0x4e, 0x00, 0x4e, 0x8c, 0x4e, 0x09, 0x00, 0x2e, 0xd8, 0x40, 0xdc, 0x21 };
765ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int32_t toUTF16BEOffs[]=
76685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho     { 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, 0x06, 0x06, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08 };
767ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int32_t fmUTF16BEOffs[] =
76885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho     { 0x0000, 0x0002, 0x0004, 0x0006, 0x0008, 0x000a, 0x000c,  0x000e, 0x0010, 0x0010 };
769ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
770ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint8_t expectedUTF16LE[] =
77185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho     { 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x8c, 0x4e, 0x09, 0x4e, 0x2e, 0x00, 0x40, 0xd8, 0x21, 0xdc };
772ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int32_t toUTF16LEOffs[]=
77385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho     { 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, 0x06, 0x06,  0x07, 0x07, 0x08, 0x08, 0x08, 0x08 };
774ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int32_t fmUTF16LEOffs[] =
77585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho     { 0x0000, 0x0002, 0x0004, 0x0006, 0x0008, 0x000a, 0x000c, 0x000e, 0x0010, 0x0010 };
776ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
777ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint8_t expectedUTF32BE[] =
778ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     { 0x00, 0x00, 0x00, 0x31,
779ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       0x00, 0x00, 0x00, 0x32,
780ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       0x00, 0x00, 0x00, 0x33,
781ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       0x00, 0x00, 0x00, 0x00,
782ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       0x00, 0x00, 0x4e, 0x00,
783ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       0x00, 0x00, 0x4e, 0x8c,
784ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       0x00, 0x00, 0x4e, 0x09,
78585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho       0x00, 0x00, 0x00, 0x2e,
78685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho       0x00, 0x02, 0x00, 0x21 };
787ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int32_t toUTF32BEOffs[]=
788ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     { 0x00, 0x00, 0x00, 0x00,
789ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       0x01, 0x01, 0x01, 0x01,
790ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       0x02, 0x02, 0x02, 0x02,
791ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       0x03, 0x03, 0x03, 0x03,
792ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       0x04, 0x04, 0x04, 0x04,
793ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       0x05, 0x05, 0x05, 0x05,
794ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       0x06, 0x06, 0x06, 0x06,
795ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       0x07, 0x07, 0x07, 0x07,
79685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho       0x08, 0x08, 0x08, 0x08,
797ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       0x08, 0x08, 0x08, 0x08 };
798ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int32_t fmUTF32BEOffs[] =
79985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho     { 0x0000, 0x0004, 0x0008, 0x000c, 0x0010, 0x0014, 0x0018,  0x001c, 0x0020, 0x0020 };
800ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
801ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint8_t expectedUTF32LE[] =
802ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     { 0x31, 0x00, 0x00, 0x00,
803ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       0x32, 0x00, 0x00, 0x00,
804ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       0x33, 0x00, 0x00, 0x00,
805ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       0x00, 0x00, 0x00, 0x00,
806ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       0x00, 0x4e, 0x00, 0x00,
807ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       0x8c, 0x4e, 0x00, 0x00,
808ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       0x09, 0x4e, 0x00, 0x00,
80985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho       0x2e, 0x00, 0x00, 0x00,
81085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho       0x21, 0x00, 0x02, 0x00 };
811ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int32_t toUTF32LEOffs[]=
812ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     { 0x00, 0x00, 0x00, 0x00,
813ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       0x01, 0x01, 0x01, 0x01,
814ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       0x02, 0x02, 0x02, 0x02,
815ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       0x03, 0x03, 0x03, 0x03,
816ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       0x04, 0x04, 0x04, 0x04,
817ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       0x05, 0x05, 0x05, 0x05,
818ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       0x06, 0x06, 0x06, 0x06,
819ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       0x07, 0x07, 0x07, 0x07,
82085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho       0x08, 0x08, 0x08, 0x08,
821ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       0x08, 0x08, 0x08, 0x08 };
822ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int32_t fmUTF32LEOffs[] =
82385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho     { 0x0000, 0x0004, 0x0008, 0x000c, 0x0010, 0x0014, 0x0018, 0x001c, 0x0020, 0x0020 };
824ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
825ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
826ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
827ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
828ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** Test chars #2 **/
829ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
830ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* Sahha [health],  slashed h's */
831ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const UChar malteseUChars[] = { 0x0053, 0x0061, 0x0127, 0x0127, 0x0061 };
832ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint8_t expectedMaltese913[] = { 0x53, 0x61, 0xB1, 0xB1, 0x61 };
833ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
834ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* LMBCS */
835ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const UChar LMBCSUChars[]     = { 0x0027, 0x010A, 0x0000, 0x0127, 0x2666, 0x0220 };
836ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint8_t expectedLMBCS[] = { 0x27, 0x06, 0x04, 0x00, 0x01, 0x73, 0x01, 0x04, 0x14, 0x02, 0x20 };
837ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int32_t toLMBCSOffs[]   = { 0x00, 0x01, 0x01, 0x02, 0x03, 0x03, 0x04, 0x04 , 0x05, 0x05, 0x05 };
838ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int32_t fmLMBCSOffs[]   = { 0x0000, 0x0001, 0x0003, 0x0004, 0x0006, 0x0008};
839ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*********************************** START OF CODE finally *************/
840ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
841ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    gInBufferSize = insize;
842ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    gOutBufferSize = outsize;
843ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
844ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("\n\n\nTesting conversions with InputBufferSize = %d, OutputBufferSize = %d\n", gInBufferSize, gOutBufferSize);
845ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
846ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
847ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*UTF-8*/
848ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    testConvertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]),
849ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        expectedUTF8, sizeof(expectedUTF8), "UTF8", toUTF8Offs,FALSE );
850ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
851ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Test surrogate behaviour for UTF8\n");
852ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
853ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const UChar testinput[]={ 0x20ac, 0xd801, 0xdc01, 0xdc01 };
854ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const uint8_t expectedUTF8test2[]= { 0xe2, 0x82, 0xac,
855ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                           0xf0, 0x90, 0x90, 0x81,
856ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                           0xef, 0xbf, 0xbd
857ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        };
858ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const int32_t offsets[]={ 0, 0, 0, 1, 1, 1, 1, 3, 3, 3 };
859ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        testConvertFromU(testinput, sizeof(testinput)/sizeof(testinput[0]),
860ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                         expectedUTF8test2, sizeof(expectedUTF8test2), "UTF8", offsets,FALSE );
861ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
862ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
863ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
864ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
865ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if !UCONFIG_NO_LEGACY_CONVERSION && defined(U_ENABLE_GENERIC_ISO_2022)
866ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*ISO-2022*/
867ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    testConvertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]),
868ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        expectedISO2022, sizeof(expectedISO2022), "ISO_2022", toISO2022Offs,FALSE );
869ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
870ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
871ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*UTF16 LE*/
872ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    testConvertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]),
873ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        expectedUTF16LE, sizeof(expectedUTF16LE), "utf-16le", toUTF16LEOffs,FALSE );
874ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*UTF16 BE*/
875ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    testConvertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]),
876ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        expectedUTF16BE, sizeof(expectedUTF16BE), "utf-16be", toUTF16BEOffs,FALSE );
877ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*UTF32 LE*/
878ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    testConvertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]),
879ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        expectedUTF32LE, sizeof(expectedUTF32LE), "utf-32le", toUTF32LEOffs,FALSE );
880ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*UTF32 BE*/
881ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    testConvertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]),
882ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        expectedUTF32BE, sizeof(expectedUTF32BE), "utf-32be", toUTF32BEOffs,FALSE );
883ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
884ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*LATIN_1*/
885ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    testConvertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]),
886ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        expectedLATIN1, sizeof(expectedLATIN1), "LATIN_1", toLATIN1Offs,FALSE );
887ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
888ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if !UCONFIG_NO_LEGACY_CONVERSION
889ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*EBCDIC_STATEFUL*/
890ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    testConvertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]),
891ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        expectedIBM930, sizeof(expectedIBM930), "ibm-930", toIBM930Offs,FALSE );
892ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
893ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    testConvertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]),
894ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        expectedISO88593, sizeof(expectedISO88593), "iso-8859-3", toISO88593Offs,FALSE );
895ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
896ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*MBCS*/
897ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
898ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    testConvertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]),
899ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        expectedIBM943, sizeof(expectedIBM943), "ibm-943", toIBM943Offs,FALSE );
900ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*DBCS*/
901ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    testConvertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]),
902ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        expectedIBM9027, sizeof(expectedIBM9027), "@ibm9027", toIBM9027Offs,FALSE );
903ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*SBCS*/
904ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    testConvertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]),
905ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        expectedIBM920, sizeof(expectedIBM920), "ibm-920", toIBM920Offs,FALSE );
906ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*SBCS*/
907ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    testConvertFromU(sampleText, sizeof(sampleText)/sizeof(sampleText[0]),
908ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        expectedISO88593, sizeof(expectedISO88593), "iso-8859-3", toISO88593Offs,FALSE );
909ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
910ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
911ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
912ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/****/
913ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
914ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*UTF-8*/
915ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    testConvertToU(expectedUTF8, sizeof(expectedUTF8),
916ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        sampleText, sizeof(sampleText)/sizeof(sampleText[0]), "utf8", fmUTF8Offs,FALSE);
917ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if !UCONFIG_NO_LEGACY_CONVERSION && defined(U_ENABLE_GENERIC_ISO_2022)
918ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*ISO-2022*/
919ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    testConvertToU(expectedISO2022, sizeof(expectedISO2022),
920ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        sampleText, sizeof(sampleText)/sizeof(sampleText[0]), "ISO_2022", fmISO2022Offs,FALSE);
921ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
922ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
923ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*UTF16 LE*/
924ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    testConvertToU(expectedUTF16LE, sizeof(expectedUTF16LE),
925ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        sampleText, sizeof(sampleText)/sizeof(sampleText[0]), "utf-16le", fmUTF16LEOffs,FALSE);
926ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*UTF16 BE*/
927ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    testConvertToU(expectedUTF16BE, sizeof(expectedUTF16BE),
928ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        sampleText, sizeof(sampleText)/sizeof(sampleText[0]), "utf-16be", fmUTF16BEOffs,FALSE);
929ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*UTF32 LE*/
930ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    testConvertToU(expectedUTF32LE, sizeof(expectedUTF32LE),
931ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        sampleText, sizeof(sampleText)/sizeof(sampleText[0]), "utf-32le", fmUTF32LEOffs,FALSE);
932ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*UTF32 BE*/
933ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    testConvertToU(expectedUTF32BE, sizeof(expectedUTF32BE),
934ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        sampleText, sizeof(sampleText)/sizeof(sampleText[0]), "utf-32be", fmUTF32BEOffs,FALSE);
935ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
936ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if !UCONFIG_NO_LEGACY_CONVERSION
937ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*EBCDIC_STATEFUL*/
93885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    testConvertToU(expectedIBM930, sizeof(expectedIBM930), sampleTextRoundTripUnmappable,
93985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            sizeof(sampleTextRoundTripUnmappable)/sizeof(sampleTextRoundTripUnmappable[0]), "ibm-930", fmIBM930Offs,FALSE);
940ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*MBCS*/
94185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    testConvertToU(expectedIBM943, sizeof(expectedIBM943),sampleTextRoundTripUnmappable,
94285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            sizeof(sampleTextRoundTripUnmappable)/sizeof(sampleTextRoundTripUnmappable[0]), "ibm-943", fmIBM943Offs,FALSE);
943ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
944ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
945ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* Try it again to make sure it still works */
946ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    testConvertToU(expectedUTF16LE, sizeof(expectedUTF16LE),
947ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        sampleText, sizeof(sampleText)/sizeof(sampleText[0]), "utf-16le", fmUTF16LEOffs,FALSE);
948ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
949ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if !UCONFIG_NO_LEGACY_CONVERSION
950ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    testConvertToU(expectedMaltese913, sizeof(expectedMaltese913),
951ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        malteseUChars, sizeof(malteseUChars)/sizeof(malteseUChars[0]), "latin3", NULL,FALSE);
952ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
953ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    testConvertFromU(malteseUChars, sizeof(malteseUChars)/sizeof(malteseUChars[0]),
954ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        expectedMaltese913, sizeof(expectedMaltese913), "iso-8859-3", NULL,FALSE );
955ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
956ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*LMBCS*/
957ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    testConvertFromU(LMBCSUChars, sizeof(LMBCSUChars)/sizeof(LMBCSUChars[0]),
958ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        expectedLMBCS, sizeof(expectedLMBCS), "LMBCS-1", toLMBCSOffs,FALSE );
959ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    testConvertToU(expectedLMBCS, sizeof(expectedLMBCS),
960ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        LMBCSUChars, sizeof(LMBCSUChars)/sizeof(LMBCSUChars[0]), "LMBCS-1", fmLMBCSOffs,FALSE);
961ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
962ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
963ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* UTF-7 examples are mostly from http://www.imc.org/rfc2152 */
964ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
965ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* encode directly set D and set O */
966ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const uint8_t utf7[] = {
967ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            /*
968ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                Hi Mom -+Jjo--!
969ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                A+ImIDkQ.
970ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                +-
971b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                +ZeVnLIqe-
972ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            */
973ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x48, 0x69, 0x20, 0x4d, 0x6f, 0x6d, 0x20, 0x2d, 0x2b, 0x4a, 0x6a, 0x6f, 0x2d, 0x2d, 0x21,
974ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x41, 0x2b, 0x49, 0x6d, 0x49, 0x44, 0x6b, 0x51, 0x2e,
975ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x2b, 0x2d,
976b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            0x2b, 0x5a, 0x65, 0x56, 0x6e, 0x4c, 0x49, 0x71, 0x65, 0x2d
977ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        };
978ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const UChar unicode[] = {
979ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            /*
980ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                Hi Mom -<WHITE SMILING FACE>-!
981ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                A<NOT IDENTICAL TO><ALPHA>.
982ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                +
983ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                [Japanese word "nihongo"]
984ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            */
985ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x48, 0x69, 0x20, 0x4d, 0x6f, 0x6d, 0x20, 0x2d, 0x263a, 0x2d, 0x21,
986ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x41, 0x2262, 0x0391, 0x2e,
987ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x2b,
988ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x65e5, 0x672c, 0x8a9e
989ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        };
990ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const int32_t toUnicodeOffsets[] = {
991ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0, 1, 2, 3, 4, 5, 6, 7, 9, 13, 14,
992ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            15, 17, 19, 23,
993ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            24,
994ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            27, 29, 32
995ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        };
996ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const int32_t fromUnicodeOffsets[] = {
997ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 9, 10,
998ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            11, 12, 12, 12, 13, 13, 13, 13, 14,
999ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            15, 15,
1000b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            16, 16, 16, 17, 17, 17, 18, 18, 18, 18
1001ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        };
1002ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1003ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* same but escaping set O (the exclamation mark) */
1004ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const uint8_t utf7Restricted[] = {
1005ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            /*
1006ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                Hi Mom -+Jjo--+ACE-
1007ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                A+ImIDkQ.
1008ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                +-
1009b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                +ZeVnLIqe-
1010ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            */
1011ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x48, 0x69, 0x20, 0x4d, 0x6f, 0x6d, 0x20, 0x2d, 0x2b, 0x4a, 0x6a, 0x6f, 0x2d, 0x2d, 0x2b, 0x41, 0x43, 0x45, 0x2d,
1012ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x41, 0x2b, 0x49, 0x6d, 0x49, 0x44, 0x6b, 0x51, 0x2e,
1013ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x2b, 0x2d,
1014b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            0x2b, 0x5a, 0x65, 0x56, 0x6e, 0x4c, 0x49, 0x71, 0x65, 0x2d
1015ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        };
1016ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const int32_t toUnicodeOffsetsR[] = {
1017ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0, 1, 2, 3, 4, 5, 6, 7, 9, 13, 15,
1018ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            19, 21, 23, 27,
1019ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            28,
1020ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            31, 33, 36
1021ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        };
1022ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const int32_t fromUnicodeOffsetsR[] = {
1023ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 9, 10, 10, 10, 10, 10,
1024ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            11, 12, 12, 12, 13, 13, 13, 13, 14,
1025ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            15, 15,
1026b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            16, 16, 16, 17, 17, 17, 18, 18, 18, 18
1027ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        };
1028ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1029ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        testConvertFromU(unicode, sizeof(unicode)/U_SIZEOF_UCHAR, utf7, sizeof(utf7), "UTF-7", fromUnicodeOffsets,FALSE);
1030ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1031ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        testConvertToU(utf7, sizeof(utf7), unicode, sizeof(unicode)/U_SIZEOF_UCHAR, "UTF-7", toUnicodeOffsets,FALSE);
1032ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1033ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        testConvertFromU(unicode, sizeof(unicode)/U_SIZEOF_UCHAR, utf7Restricted, sizeof(utf7Restricted), "UTF-7,version=1", fromUnicodeOffsetsR,FALSE);
1034ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1035ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        testConvertToU(utf7Restricted, sizeof(utf7Restricted), unicode, sizeof(unicode)/U_SIZEOF_UCHAR, "UTF-7,version=1", toUnicodeOffsetsR,FALSE);
1036ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1037ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1038ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*
1039ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * IMAP-mailbox-name examples are mostly from http://www.imc.org/rfc2152,
1040ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * modified according to RFC 2060,
1041ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * and supplemented with the one example in RFC 2060 itself.
1042ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     */
1043ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
1044ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const uint8_t imap[] = {
1045ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            /*  Hi Mom -&Jjo--!
1046ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                A&ImIDkQ-.
1047ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                &-
1048ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                &ZeVnLIqe-
1049ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                \
1050ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                ~peter
1051ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                /mail
1052ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                /&ZeVnLIqe-
1053ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                /&U,BTFw-
1054ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            */
1055ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x48, 0x69, 0x20, 0x4d, 0x6f, 0x6d, 0x20, 0x2d, 0x26, 0x4a, 0x6a, 0x6f, 0x2d, 0x2d, 0x21,
1056ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x41, 0x26, 0x49, 0x6d, 0x49, 0x44, 0x6b, 0x51, 0x2d, 0x2e,
1057ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x26, 0x2d,
1058ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x26, 0x5a, 0x65, 0x56, 0x6e, 0x4c, 0x49, 0x71, 0x65, 0x2d,
1059ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x5c,
1060ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x7e, 0x70, 0x65, 0x74, 0x65, 0x72,
1061ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x2f, 0x6d, 0x61, 0x69, 0x6c,
1062ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x2f, 0x26, 0x5a, 0x65, 0x56, 0x6e, 0x4c, 0x49, 0x71, 0x65, 0x2d,
1063ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x2f, 0x26, 0x55, 0x2c, 0x42, 0x54, 0x46, 0x77, 0x2d
1064ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        };
1065ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const UChar unicode[] = {
1066ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            /*  Hi Mom -<WHITE SMILING FACE>-!
1067ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                A<NOT IDENTICAL TO><ALPHA>.
1068ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                &
1069ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                [Japanese word "nihongo"]
1070ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                \
1071ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                ~peter
1072ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                /mail
1073ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                /<65e5, 672c, 8a9e>
1074ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                /<53f0, 5317>
1075ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            */
1076ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x48, 0x69, 0x20, 0x4d, 0x6f, 0x6d, 0x20, 0x2d, 0x263a, 0x2d, 0x21,
1077ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x41, 0x2262, 0x0391, 0x2e,
1078ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x26,
1079ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x65e5, 0x672c, 0x8a9e,
1080ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x5c,
1081ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x7e, 0x70, 0x65, 0x74, 0x65, 0x72,
1082ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x2f, 0x6d, 0x61, 0x69, 0x6c,
1083ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x2f, 0x65e5, 0x672c, 0x8a9e,
1084ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x2f, 0x53f0, 0x5317
1085ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        };
1086ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const int32_t toUnicodeOffsets[] = {
1087ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0, 1, 2, 3, 4, 5, 6, 7, 9, 13, 14,
1088ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            15, 17, 19, 24,
1089ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            25,
1090ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            28, 30, 33,
1091ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            37,
1092ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            38, 39, 40, 41, 42, 43,
1093ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            44, 45, 46, 47, 48,
1094ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            49, 51, 53, 56,
1095ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            60, 62, 64
1096ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        };
1097ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const int32_t fromUnicodeOffsets[] = {
1098ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 9, 10,
1099ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            11, 12, 12, 12, 13, 13, 13, 13, 13, 14,
1100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            15, 15,
1101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            16, 16, 16, 17, 17, 17, 18, 18, 18, 18,
1102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            19,
1103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            20, 21, 22, 23, 24, 25,
1104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            26, 27, 28, 29, 30,
1105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            31, 32, 32, 32, 33, 33, 33, 34, 34, 34, 34,
1106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            35, 36, 36, 36, 37, 37, 37, 37, 37
1107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        };
1108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        testConvertFromU(unicode, sizeof(unicode)/U_SIZEOF_UCHAR, imap, sizeof(imap), "IMAP-mailbox-name", fromUnicodeOffsets,FALSE);
1110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        testConvertToU(imap, sizeof(imap), unicode, sizeof(unicode)/U_SIZEOF_UCHAR, "IMAP-mailbox-name", toUnicodeOffsets,FALSE);
1112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* Test UTF-8 bad data handling*/
1115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
1116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const uint8_t utf8[]={
1117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x61,
1118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0xf7, 0xbf, 0xbf, 0xbf,         /* > 10FFFF */
1119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x00,
1120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x62,
1121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0xfb, 0xbf, 0xbf, 0xbf, 0xbf,   /* > 10FFFF */
1122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0xfb, 0xbf, 0xbf, 0xbf, 0xbf,   /* > 10FFFF */
1123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0xf4, 0x8f, 0xbf, 0xbf,         /* 10FFFF */
1124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0xdf, 0xbf,                     /* 7ff */
1125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0xbf,                           /* truncated tail */
1126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0xf4, 0x90, 0x80, 0x80,         /* 11FFFF */
1127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x02
1128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        };
1129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const uint16_t utf8Expected[]={
1131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x0061,
1132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0xfffd,
1133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x0000,
1134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x0062,
1135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0xfffd,
1136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0xfffd,
1137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0xdbff, 0xdfff,
1138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x07ff,
1139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0xfffd,
1140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0xfffd,
1141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x0002
1142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        };
1143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const int32_t utf8Offsets[]={
1145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0, 1, 5, 6, 7, 12, 17, 17, 21, 23, 24, 28
1146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        };
1147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        testConvertToU(utf8, sizeof(utf8),
1148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                       utf8Expected, sizeof(utf8Expected)/sizeof(utf8Expected[0]), "utf-8", utf8Offsets ,FALSE);
1149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* Test UTF-32BE bad data handling*/
1153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
1154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const uint8_t utf32[]={
1155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x00, 0x00, 0x00, 0x61,
1156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x00, 0x11, 0x00, 0x00,         /* 0x110000 out of range */
1157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x00, 0x10, 0xff, 0xff,         /* 0x10FFFF in range */
1158ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x00, 0x00, 0x00, 0x62,
1159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0xff, 0xff, 0xff, 0xff,         /* 0xffffffff out of range */
1160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x7f, 0xff, 0xff, 0xff,         /* 0x7fffffff out of range */
1161ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x00, 0x00, 0x01, 0x62,
1162ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x00, 0x00, 0x02, 0x62
1163ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        };
1164ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const uint16_t utf32Expected[]={
1165ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x0061,
1166ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0xfffd,         /* 0x110000 out of range */
1167ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0xDBFF,         /* 0x10FFFF in range */
1168ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0xDFFF,
1169ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x0062,
1170ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0xfffd,         /* 0xffffffff out of range */
1171ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0xfffd,         /* 0x7fffffff out of range */
1172ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x0162,
1173ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x0262
1174ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        };
1175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const int32_t utf32Offsets[]={
1176ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0, 4, 8, 8, 12, 16, 20, 24, 28
1177ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        };
1178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const uint8_t utf32ExpectedBack[]={
1179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x00, 0x00, 0x00, 0x61,
1180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x00, 0x00, 0xff, 0xfd,         /* 0x110000 out of range */
1181ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x00, 0x10, 0xff, 0xff,         /* 0x10FFFF in range */
1182ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x00, 0x00, 0x00, 0x62,
1183ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x00, 0x00, 0xff, 0xfd,         /* 0xffffffff out of range */
1184ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x00, 0x00, 0xff, 0xfd,         /* 0x7fffffff out of range */
1185ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x00, 0x00, 0x01, 0x62,
1186ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x00, 0x00, 0x02, 0x62
1187ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        };
1188ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const int32_t utf32OffsetsBack[]={
1189ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0,0,0,0,
1190ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            1,1,1,1,
1191ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            2,2,2,2,
1192ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            4,4,4,4,
1193ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            5,5,5,5,
1194ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            6,6,6,6,
1195ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            7,7,7,7,
1196ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            8,8,8,8
1197ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        };
1198ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1199ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        testConvertToU(utf32, sizeof(utf32),
1200ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                       utf32Expected, sizeof(utf32Expected)/sizeof(utf32Expected[0]), "utf-32be", utf32Offsets ,FALSE);
1201ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        testConvertFromU(utf32Expected, sizeof(utf32Expected)/sizeof(utf32Expected[0]),
1202ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            utf32ExpectedBack, sizeof(utf32ExpectedBack), "utf-32be", utf32OffsetsBack, FALSE);
1203ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1204ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1205ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* Test UTF-32LE bad data handling*/
1206ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
1207ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const uint8_t utf32[]={
1208ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x61, 0x00, 0x00, 0x00,
1209ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x00, 0x00, 0x11, 0x00,         /* 0x110000 out of range */
1210ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0xff, 0xff, 0x10, 0x00,         /* 0x10FFFF in range */
1211ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x62, 0x00, 0x00, 0x00,
1212ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0xff, 0xff, 0xff, 0xff,         /* 0xffffffff out of range */
1213ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0xff, 0xff, 0xff, 0x7f,         /* 0x7fffffff out of range */
1214ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x62, 0x01, 0x00, 0x00,
1215ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x62, 0x02, 0x00, 0x00,
1216ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        };
1217ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1218ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const uint16_t utf32Expected[]={
1219ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x0061,
1220ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0xfffd,         /* 0x110000 out of range */
1221ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0xDBFF,         /* 0x10FFFF in range */
1222ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0xDFFF,
1223ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x0062,
1224ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0xfffd,         /* 0xffffffff out of range */
1225ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0xfffd,         /* 0x7fffffff out of range */
1226ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x0162,
1227ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x0262
1228ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        };
1229ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const int32_t utf32Offsets[]={
1230ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0, 4, 8, 8, 12, 16, 20, 24, 28
1231ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        };
1232ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const uint8_t utf32ExpectedBack[]={
1233ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x61, 0x00, 0x00, 0x00,
1234ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0xfd, 0xff, 0x00, 0x00,         /* 0x110000 out of range */
1235ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0xff, 0xff, 0x10, 0x00,         /* 0x10FFFF in range */
1236ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x62, 0x00, 0x00, 0x00,
1237ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0xfd, 0xff, 0x00, 0x00,         /* 0xffffffff out of range */
1238ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0xfd, 0xff, 0x00, 0x00,         /* 0x7fffffff out of range */
1239ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x62, 0x01, 0x00, 0x00,
1240ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x62, 0x02, 0x00, 0x00
1241ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        };
1242ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const int32_t utf32OffsetsBack[]={
1243ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0,0,0,0,
1244ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            1,1,1,1,
1245ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            2,2,2,2,
1246ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            4,4,4,4,
1247ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            5,5,5,5,
1248ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            6,6,6,6,
1249ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            7,7,7,7,
1250ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            8,8,8,8
1251ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        };
1252ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        testConvertToU(utf32, sizeof(utf32),
1253ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            utf32Expected, sizeof(utf32Expected)/sizeof(utf32Expected[0]), "utf-32le", utf32Offsets,FALSE );
1254ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        testConvertFromU(utf32Expected, sizeof(utf32Expected)/sizeof(utf32Expected[0]),
1255ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            utf32ExpectedBack, sizeof(utf32ExpectedBack), "utf-32le", utf32OffsetsBack, FALSE);
1256ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1257ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
1258ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1259ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestCoverageMBCS(){
1260ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if 0
1261ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1262ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *directory = loadTestData(&status);
1263ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char* tdpath = NULL;
1264ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char* saveDirectory = (char*)malloc(sizeof(char) *(strlen(u_getDataDirectory())+1));
1265ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int len = strlen(directory);
1266ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char* index=NULL;
1267ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1268ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    tdpath = (char*) malloc(sizeof(char) * (len * 2));
1269ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uprv_strcpy(saveDirectory,u_getDataDirectory());
1270ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Retrieved data directory %s \n",saveDirectory);
1271ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uprv_strcpy(tdpath,directory);
1272ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    index=strrchr(tdpath,(char)U_FILE_SEP_CHAR);
1273ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1274ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if((unsigned int)(index-tdpath) != (strlen(tdpath)-1)){
1275ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            *(index+1)=0;
1276ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1277ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_setDataDirectory(tdpath);
1278ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("ICU data directory is set to: %s \n" ,tdpath);
1279ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
1280ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1281ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*some more test to increase the code coverage in MBCS.  Create an test converter from test1.ucm
1282ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      which is test file for MBCS conversion with single-byte codepage data.*/
1283ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
1284ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1285ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* MBCS with single byte codepage data test1.ucm*/
1286ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        const UChar unicodeInput[]    = { 0x20ac, 0x0005, 0x0006, 0xdbc4, 0xde34, 0x0003};
1287ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        const uint8_t expectedtest1[] = { 0x00, 0x05, 0xff, 0x07, 0xff,};
1288ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        int32_t  totest1Offs[]        = { 0, 1, 2, 3, 5, };
1289ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1290ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /*from Unicode*/
1291ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        testConvertFromU(unicodeInput, sizeof(unicodeInput)/sizeof(unicodeInput[0]),
1292ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            expectedtest1, sizeof(expectedtest1), "@test1", totest1Offs,FALSE );
1293ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1294ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1295ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*some more test to increase the code coverage in MBCS.  Create an test converter from test3.ucm
1296ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      which is test file for MBCS conversion with three-byte codepage data.*/
1297ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
1298ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1299ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* MBCS with three byte codepage data test3.ucm*/
1300ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        const UChar unicodeInput[]    = { 0x20ac, 0x0005, 0x0006, 0x000b, 0xdbc4, 0xde34, 0xd84d, 0xdc56, 0x000e};
1301ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        const uint8_t expectedtest3[] = { 0x00, 0x05, 0xff, 0x01, 0x02, 0x0b,  0x07,  0x01, 0x02, 0x0a,  0xff,};
1302ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        int32_t  totest3Offs[]        = { 0, 1, 2, 3, 3, 3, 4, 6, 6, 6, 8};
1303ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1304ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        const uint8_t test3input[]    = { 0x00, 0x05, 0x06, 0x01, 0x02, 0x0b,  0x07,  0x01, 0x02, 0x0a, 0x01, 0x02, 0x0c,};
1305ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        const UChar expectedUnicode[] = { 0x20ac, 0x0005, 0x0006, 0x000b, 0xdbc4, 0xde34, 0xd84d, 0xdc56, 0xfffd};
1306ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        int32_t fromtest3Offs[]       = { 0, 1, 2, 3, 6, 6, 7, 7, 10 };
1307ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1308ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /*from Unicode*/
1309ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        testConvertFromU(unicodeInput, sizeof(unicodeInput)/sizeof(unicodeInput[0]),
1310ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            expectedtest3, sizeof(expectedtest3), "@test3", totest3Offs,FALSE );
1311ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1312ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /*to Unicode*/
1313ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        testConvertToU(test3input, sizeof(test3input),
1314ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            expectedUnicode, sizeof(expectedUnicode)/sizeof(expectedUnicode[0]), "@test3", fromtest3Offs ,FALSE);
1315ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1316ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1317ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1318ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*some more test to increase the code coverage in MBCS.  Create an test converter from test4.ucm
1319ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      which is test file for MBCS conversion with four-byte codepage data.*/
1320ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
1321ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1322ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* MBCS with three byte codepage data test4.ucm*/
1323ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const UChar unicodeInput[]    = { 0x20ac, 0x0005, 0x0006, 0x000b, 0xdbc4, 0xde34, 0xd84d, 0xdc56, 0x000e};
1324ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const uint8_t expectedtest4[] = { 0x00, 0x05, 0xff, 0x01, 0x02, 0x03, 0x0b,  0x07,  0x01, 0x02, 0x03, 0x0a,  0xff,};
1325ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const int32_t totest4Offs[]   = { 0, 1, 2, 3, 3, 3, 3, 4, 6, 6, 6, 6, 8,};
1326ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1327ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const uint8_t test4input[]    = { 0x00, 0x05, 0x06, 0x01, 0x02, 0x03, 0x0b,  0x07,  0x01, 0x02, 0x03, 0x0a, 0x01, 0x02, 0x03, 0x0c,};
1328ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const UChar expectedUnicode[] = { 0x20ac, 0x0005, 0x0006, 0x000b, 0xdbc4, 0xde34, 0xd84d, 0xdc56, 0xfffd};
1329ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const int32_t fromtest4Offs[] = { 0, 1, 2, 3, 7, 7, 8, 8, 12,};
1330ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1331ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /*from Unicode*/
1332ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        testConvertFromU(unicodeInput, sizeof(unicodeInput)/sizeof(unicodeInput[0]),
1333ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            expectedtest4, sizeof(expectedtest4), "@test4", totest4Offs,FALSE );
1334ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1335ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /*to Unicode*/
1336ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        testConvertToU(test4input, sizeof(test4input),
1337ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            expectedUnicode, sizeof(expectedUnicode)/sizeof(expectedUnicode[0]), "@test4", fromtest4Offs,FALSE );
1338ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1339ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1340ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if 0
1341ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(tdpath);
1342ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* restore the original data directory */
1343ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Setting the data directory to %s \n", saveDirectory);
1344ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_setDataDirectory(saveDirectory);
1345ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(saveDirectory);
1346ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
1347ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1348ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
1349ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1350ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestConverterType(const char *convName, UConverterType convType) {
1351ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UConverter* myConverter;
1352ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode err = U_ZERO_ERROR;
1353ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1354ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    myConverter = my_ucnv_open(convName, &err);
1355ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1356ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(err)) {
1357ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_data_err("Failed to create an %s converter\n", convName);
1358ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
1359ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1360ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    else
1361ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
1362ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (ucnv_getType(myConverter)!=convType) {
1363ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("ucnv_getType Failed for %s. Got enum value 0x%X\n",
1364ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                convName, convType);
1365ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
1366ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        else {
1367ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_verbose("ucnv_getType %s ok\n", convName);
1368ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
1369ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1370ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_close(myConverter);
1371ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
1372ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1373ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestConverterTypesAndStarters()
1374ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
1375ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if !UCONFIG_NO_LEGACY_CONVERSION
1376ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UConverter* myConverter;
1377ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode err = U_ZERO_ERROR;
1378ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UBool mystarters[256];
1379ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1380ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*    const UBool expectedKSCstarters[256] = {
1381ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
1382ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
1383ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
1384ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
1385ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
1386ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
1387ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
1388ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
1389ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
1390ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
1391ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
1392ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
1393ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
1394ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
1395ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
1396ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
1397ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
1398ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE,
1399ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
1400ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
1401ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
1402ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
1403ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
1404ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
1405ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
1406ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TRUE, TRUE, TRUE, TRUE, TRUE, TRUE};*/
1407ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1408ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1409ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Testing KSC, ibm-930, ibm-878  for starters and their conversion types.");
1410ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1411ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    myConverter = ucnv_open("ksc", &err);
1412ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(err)) {
1413ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      log_data_err("Failed to create an ibm-ksc converter\n");
1414ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      return;
1415ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1416ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    else
1417ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
1418ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (ucnv_getType(myConverter)!=UCNV_MBCS)
1419ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("ucnv_getType Failed for ibm-949\n");
1420ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        else
1421ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_verbose("ucnv_getType ibm-949 ok\n");
1422ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1423ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(myConverter!=NULL)
1424ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            ucnv_getStarters(myConverter, mystarters, &err);
1425ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1426ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /*if (memcmp(expectedKSCstarters, mystarters, sizeof(expectedKSCstarters)))
1427ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          log_err("Failed ucnv_getStarters for ksc\n");
1428ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          else
1429ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          log_verbose("ucnv_getStarters ok\n");*/
1430ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1431ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1432ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_close(myConverter);
1433ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1434ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestConverterType("ibm-930", UCNV_EBCDIC_STATEFUL);
1435ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestConverterType("ibm-878", UCNV_SBCS);
1436ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
1437ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1438ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestConverterType("iso-8859-1", UCNV_LATIN_1);
1439ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1440ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestConverterType("ibm-1208", UCNV_UTF8);
1441ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1442ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestConverterType("utf-8", UCNV_UTF8);
1443ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestConverterType("UTF-16BE", UCNV_UTF16_BigEndian);
1444ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestConverterType("UTF-16LE", UCNV_UTF16_LittleEndian);
1445ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestConverterType("UTF-32BE", UCNV_UTF32_BigEndian);
1446ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestConverterType("UTF-32LE", UCNV_UTF32_LittleEndian);
1447ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1448ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if !UCONFIG_NO_LEGACY_CONVERSION
1449ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1450ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if defined(U_ENABLE_GENERIC_ISO_2022)
1451ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestConverterType("iso-2022", UCNV_ISO_2022);
1452ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
1453ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1454ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestConverterType("hz", UCNV_HZ);
1455ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
1456ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1457ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestConverterType("scsu", UCNV_SCSU);
1458ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1459ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if !UCONFIG_NO_LEGACY_CONVERSION
1460ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestConverterType("x-iscii-de", UCNV_ISCII);
1461ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
1462ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1463ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestConverterType("ascii", UCNV_US_ASCII);
1464ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestConverterType("utf-7", UCNV_UTF7);
1465ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestConverterType("IMAP-mailbox-name", UCNV_IMAP_MAILBOX);
1466ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestConverterType("bocu-1", UCNV_BOCU1);
1467ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
1468ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1469ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
1470ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruTestAmbiguousConverter(UConverter *cnv) {
1471ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const char inBytes[3]={ 0x61, 0x5B, 0x5c };
1472ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar outUnicode[20]={ 0, 0, 0, 0 };
1473ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1474ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *s;
1475ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *u;
1476ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode errorCode;
1477ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UBool isAmbiguous;
1478ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1479ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* try to convert an 'a', a square bracket and a US-ASCII backslash */
1480ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
1481ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    s=inBytes;
1482ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u=outUnicode;
1483ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_toUnicode(cnv, &u, u+20, &s, s+3, NULL, TRUE, &errorCode);
1484ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
1485ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* we do not care about general failures in this test; the input may just not be mappable */
1486ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
1487ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1488ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1489ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(outUnicode[0]!=0x61 || outUnicode[1]!=0x5B || outUnicode[2]==0xfffd) {
1490ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* not a close ASCII-family encoding, or 0x5c is unassigned/illegal: this test is not applicable */
1491ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* There are some encodings that are partially ASCII based,
1492ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        like the ISO-7 and GSM series of codepages, which we ignore. */
1493ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
1494ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1495ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1496ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    isAmbiguous=ucnv_isAmbiguous(cnv);
1497ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1498ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* check that outUnicode[1]!=0x5c is exactly the same as ucnv_isAmbiguous() */
1499ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if((outUnicode[2]!=0x5c)!=isAmbiguous) {
1500ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("error: converter \"%s\" needs a backslash fix: %d but ucnv_isAmbiguous()==%d\n",
1501ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            ucnv_getName(cnv, &errorCode), outUnicode[2]!=0x5c, isAmbiguous);
1502ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
1503ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1504ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1505ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(outUnicode[2]!=0x5c) {
1506ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* needs fixup, fix it */
1507ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucnv_fixFileSeparator(cnv, outUnicode, (int32_t)(u-outUnicode));
1508ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(outUnicode[2]!=0x5c) {
1509ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            /* the fix failed */
1510ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("error: ucnv_fixFileSeparator(%s) failed\n", ucnv_getName(cnv, &errorCode));
1511ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            return;
1512ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
1513ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1514ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
1515ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1516ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestAmbiguous()
1517ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
1518ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1519ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UConverter *ascii_cnv = 0, *sjis_cnv = 0, *cnv;
1520ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const char target[] = {
1521ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* "\\usr\\local\\share\\data\\icutest.txt" */
1522ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x5c, 0x75, 0x73, 0x72,
1523ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x5c, 0x6c, 0x6f, 0x63, 0x61, 0x6c,
1524ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x5c, 0x73, 0x68, 0x61, 0x72, 0x65,
1525ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x5c, 0x64, 0x61, 0x74, 0x61,
1526ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x5c, 0x69, 0x63, 0x75, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x74, 0x78, 0x74,
1527ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0
1528ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
1529ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar asciiResult[200], sjisResult[200];
153050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int32_t /*asciiLength = 0,*/ sjisLength = 0, i;
1531ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *name;
1532ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1533ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* enumerate all converters */
1534ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    status=U_ZERO_ERROR;
1535ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    for(i=0; (name=ucnv_getAvailableName(i))!=NULL; ++i) {
1536ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        cnv=ucnv_open(name, &status);
1537ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(U_SUCCESS(status)) {
1538ea1f1813c8b13a850b13f256aeb5152bb0942e81claireho            /* BEGIN android-changed
1539ea1f1813c8b13a850b13f256aeb5152bb0942e81claireho               To save space, Android does not build full ISO2022 CJK tables.
1540ea1f1813c8b13a850b13f256aeb5152bb0942e81claireho               We skip the tests for ISO-2022. */
1541ea1f1813c8b13a850b13f256aeb5152bb0942e81claireho            const char* cnvName = ucnv_getName(cnv, &status);
1542ea1f1813c8b13a850b13f256aeb5152bb0942e81claireho            if (strlen(cnvName) < 8 ||
1543ea1f1813c8b13a850b13f256aeb5152bb0942e81claireho                strncmp(cnvName, "ISO_2022", 8) != 0) {
1544ea1f1813c8b13a850b13f256aeb5152bb0942e81claireho                TestAmbiguousConverter(cnv);
1545ea1f1813c8b13a850b13f256aeb5152bb0942e81claireho            }
1546ea1f1813c8b13a850b13f256aeb5152bb0942e81claireho            /* END android-changed */
1547ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        } else {
1548ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("error: unable to open available converter \"%s\"\n", name);
1549ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            status=U_ZERO_ERROR;
1550ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
1551ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1552ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1553ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if !UCONFIG_NO_LEGACY_CONVERSION
1554ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    sjis_cnv = ucnv_open("ibm-943", &status);
1555ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status))
1556ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
1557ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_data_err("Failed to create a SJIS converter\n");
1558ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
1559ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1560ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ascii_cnv = ucnv_open("LATIN-1", &status);
1561ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status))
1562ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
1563ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_data_err("Failed to create a LATIN-1 converter\n");
1564ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucnv_close(sjis_cnv);
1565ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
1566ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1567ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* convert target from SJIS to Unicode */
1568ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    sjisLength = ucnv_toUChars(sjis_cnv, sjisResult, sizeof(sjisResult)/U_SIZEOF_UCHAR, target, (int32_t)strlen(target), &status);
1569ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status))
1570ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
1571ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("Failed to convert the SJIS string.\n");
1572ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucnv_close(sjis_cnv);
1573ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucnv_close(ascii_cnv);
1574ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
1575ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1576ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* convert target from Latin-1 to Unicode */
157750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /*asciiLength =*/ ucnv_toUChars(ascii_cnv, asciiResult, sizeof(asciiResult)/U_SIZEOF_UCHAR, target, (int32_t)strlen(target), &status);
1578ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status))
1579ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
1580ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("Failed to convert the Latin-1 string.\n");
1581ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucnv_close(sjis_cnv);
1582ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucnv_close(ascii_cnv);
1583ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
1584ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1585ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (!ucnv_isAmbiguous(sjis_cnv))
1586ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
1587ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("SJIS converter should contain ambiguous character mappings.\n");
1588ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucnv_close(sjis_cnv);
1589ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucnv_close(ascii_cnv);
1590ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
1591ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1592ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (u_strcmp(sjisResult, asciiResult) == 0)
1593ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
1594ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("File separators for SJIS don't need to be fixed.\n");
1595ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1596ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_fixFileSeparator(sjis_cnv, sjisResult, sjisLength);
1597ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (u_strcmp(sjisResult, asciiResult) != 0)
1598ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
1599ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("Fixing file separator for SJIS failed.\n");
1600ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1601ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_close(sjis_cnv);
1602ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_close(ascii_cnv);
1603ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
1604ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
1605ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1606ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
1607ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruTestSignatureDetection(){
1608ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* with null terminated strings */
1609ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
1610ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const char* data[] = {
1611ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "\xFE\xFF\x00\x00",     /* UTF-16BE */
1612ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "\xFF\xFE\x00\x00",     /* UTF-16LE */
1613ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "\xEF\xBB\xBF\x00",     /* UTF-8    */
1614ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "\x0E\xFE\xFF\x00",     /* SCSU     */
1615ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1616ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "\xFE\xFF",             /* UTF-16BE */
1617ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "\xFF\xFE",             /* UTF-16LE */
1618ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "\xEF\xBB\xBF",         /* UTF-8    */
1619ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "\x0E\xFE\xFF",         /* SCSU     */
1620ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1621ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "\xFE\xFF\x41\x42",     /* UTF-16BE */
1622ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "\xFF\xFE\x41\x41",     /* UTF-16LE */
1623ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "\xEF\xBB\xBF\x41",     /* UTF-8    */
1624ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "\x0E\xFE\xFF\x41",     /* SCSU     */
1625ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1626ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "\x2B\x2F\x76\x38\x2D", /* UTF-7    */
1627ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "\x2B\x2F\x76\x38\x41", /* UTF-7    */
1628ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "\x2B\x2F\x76\x39\x41", /* UTF-7    */
1629ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "\x2B\x2F\x76\x2B\x41", /* UTF-7    */
1630ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "\x2B\x2F\x76\x2F\x41",  /* UTF-7    */
1631ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1632ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "\xDD\x73\x66\x73"      /* UTF-EBCDIC */
1633ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        };
1634ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const char* expected[] = {
1635ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "UTF-16BE",
1636ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "UTF-16LE",
1637ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "UTF-8",
1638ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "SCSU",
1639ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1640ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "UTF-16BE",
1641ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "UTF-16LE",
1642ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "UTF-8",
1643ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "SCSU",
1644ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1645ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "UTF-16BE",
1646ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "UTF-16LE",
1647ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "UTF-8",
1648ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "SCSU",
1649ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1650ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "UTF-7",
1651ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "UTF-7",
1652ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "UTF-7",
1653ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "UTF-7",
1654ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "UTF-7",
1655ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "UTF-EBCDIC"
1656ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        };
1657ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const int32_t expectedLength[] ={
1658ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            2,
1659ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            2,
1660ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            3,
1661ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            3,
1662ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1663ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            2,
1664ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            2,
1665ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            3,
1666ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            3,
1667ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1668ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            2,
1669ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            2,
1670ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            3,
1671ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            3,
1672ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1673ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            5,
1674ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            4,
1675ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            4,
1676ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            4,
1677ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            4,
1678ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            4
1679ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        };
1680ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        int i=0;
1681ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode err;
1682ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        int32_t signatureLength = -1;
1683ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        const char* source = NULL;
1684ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        const char* enc = NULL;
1685ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        for( ; i<sizeof(data)/sizeof(char*); i++){
1686ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            err = U_ZERO_ERROR;
1687ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            source = data[i];
1688ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            enc = ucnv_detectUnicodeSignature(source, -1 , &signatureLength, &err);
1689ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if(U_FAILURE(err)){
1690ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                log_err("ucnv_detectUnicodeSignature failed for source : %s at index :%i. Error: %s\n", source,i,u_errorName(err));
1691ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                continue;
1692ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
1693ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if(enc == NULL || strcmp(enc,expected[i]) !=0){
1694ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                log_err("ucnv_detectUnicodeSignature failed for source : %s at index :%i. Expected: %s. Got: %s\n",source,i,expected[i],enc);
1695ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                continue;
1696ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
1697ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if(signatureLength != expectedLength[i]){
1698ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                log_err("ucnv_detectUnicodeSignature failed for source : %s at index :%i.Expected Length: %i. Got length: %i\n",source,i,signatureLength,expectedLength[i]);
1699ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
1700ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
1701ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1702ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
1703ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const char* data[] = {
1704ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "\xFE\xFF\x00",         /* UTF-16BE */
1705ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "\xFF\xFE\x00",         /* UTF-16LE */
1706ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "\xEF\xBB\xBF\x00",     /* UTF-8    */
1707ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "\x0E\xFE\xFF\x00",     /* SCSU     */
1708ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "\x00\x00\xFE\xFF",     /* UTF-32BE */
1709ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "\xFF\xFE\x00\x00",     /* UTF-32LE */
1710ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "\xFE\xFF",             /* UTF-16BE */
1711ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "\xFF\xFE",             /* UTF-16LE */
1712ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "\xEF\xBB\xBF",         /* UTF-8    */
1713ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "\x0E\xFE\xFF",         /* SCSU     */
1714ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "\x00\x00\xFE\xFF",     /* UTF-32BE */
1715ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "\xFF\xFE\x00\x00",     /* UTF-32LE */
1716ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "\xFE\xFF\x41\x42",     /* UTF-16BE */
1717ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "\xFF\xFE\x41\x41",     /* UTF-16LE */
1718ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "\xEF\xBB\xBF\x41",     /* UTF-8    */
1719ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "\x0E\xFE\xFF\x41",     /* SCSU     */
1720ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "\x00\x00\xFE\xFF\x41", /* UTF-32BE */
1721ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "\xFF\xFE\x00\x00\x42", /* UTF-32LE */
1722ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "\xFB\xEE\x28",         /* BOCU-1   */
1723ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "\xFF\x41\x42"          /* NULL     */
1724ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        };
1725ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const int len[] = {
1726ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            3,
1727ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            3,
1728ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            4,
1729ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            4,
1730ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            4,
1731ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            4,
1732ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            2,
1733ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            2,
1734ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            3,
1735ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            3,
1736ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            4,
1737ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            4,
1738ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            4,
1739ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            4,
1740ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            4,
1741ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            4,
1742ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            5,
1743ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            5,
1744ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            3,
1745ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            3
1746ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        };
1747ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1748ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const char* expected[] = {
1749ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "UTF-16BE",
1750ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "UTF-16LE",
1751ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "UTF-8",
1752ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "SCSU",
1753ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "UTF-32BE",
1754ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "UTF-32LE",
1755ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "UTF-16BE",
1756ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "UTF-16LE",
1757ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "UTF-8",
1758ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "SCSU",
1759ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "UTF-32BE",
1760ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "UTF-32LE",
1761ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "UTF-16BE",
1762ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "UTF-16LE",
1763ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "UTF-8",
1764ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "SCSU",
1765ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "UTF-32BE",
1766ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "UTF-32LE",
1767ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "BOCU-1",
1768ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                NULL
1769ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        };
1770ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const int32_t expectedLength[] ={
1771ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            2,
1772ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            2,
1773ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            3,
1774ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            3,
1775ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            4,
1776ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            4,
1777ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            2,
1778ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            2,
1779ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            3,
1780ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            3,
1781ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            4,
1782ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            4,
1783ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            2,
1784ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            2,
1785ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            3,
1786ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            3,
1787ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            4,
1788ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            4,
1789ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            3,
1790ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0
1791ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        };
1792ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        int i=0;
1793ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode err;
1794ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        int32_t signatureLength = -1;
1795ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        int32_t sourceLength=-1;
1796ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        const char* source = NULL;
1797ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        const char* enc = NULL;
1798ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        for( ; i<sizeof(data)/sizeof(char*); i++){
1799ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            err = U_ZERO_ERROR;
1800ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            source = data[i];
1801ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            sourceLength = len[i];
1802ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            enc = ucnv_detectUnicodeSignature(source, sourceLength , &signatureLength, &err);
1803ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if(U_FAILURE(err)){
1804ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                log_err("ucnv_detectUnicodeSignature test2 failed for source : %s at index :%i. Error: %s\n", source,i,u_errorName(err));
1805ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                continue;
1806ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
1807ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if(enc == NULL || strcmp(enc,expected[i]) !=0){
1808ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                if(expected[i] !=NULL){
1809ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                 log_err("ucnv_detectUnicodeSignature test2 failed for source : %s at index :%i. Expected: %s. Got: %s\n",source,i,expected[i],enc);
1810ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                 continue;
1811ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                }
1812ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
1813ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if(signatureLength != expectedLength[i]){
1814ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                log_err("ucnv_detectUnicodeSignature test2 failed for source : %s at index :%i.Expected Length: %i. Got length: %i\n",source,i,signatureLength,expectedLength[i]);
1815ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
1816ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
1817ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1818ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
1819ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
182050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic void TestUTF7() {
1821ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* test input */
1822ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint8_t in[]={
1823ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* H - +Jjo- - ! +- +2AHcAQ */
1824ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x48,
1825ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x2d,
1826ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x2b, 0x4a, 0x6a, 0x6f,
1827ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x2d, 0x2d,
1828ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x21,
1829ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x2b, 0x2d,
1830ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x2b, 0x32, 0x41, 0x48, 0x63, 0x41, 0x51
1831ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
1832ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1833ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* expected test results */
1834ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int32_t results[]={
1835ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* number of bytes read, code point */
1836ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        1, 0x48,
1837ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        1, 0x2d,
1838ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        4, 0x263a, /* <WHITE SMILING FACE> */
1839ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        2, 0x2d,
1840ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        1, 0x21,
1841ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        2, 0x2b,
1842ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        7, 0x10401
1843ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
1844ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1845ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *cnvName;
1846ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *source=(const char *)in, *limit=(const char *)in+sizeof(in);
1847ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode errorCode=U_ZERO_ERROR;
1848ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UConverter *cnv=ucnv_open("UTF-7", &errorCode);
1849ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
1850ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("Unable to open a UTF-7 converter: %s\n", u_errorName(errorCode)); /* sholdn't be a data err */
1851ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
1852ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1853ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestNextUChar(cnv, source, limit, results, "UTF-7");
1854ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* Test the condition when source >= sourceLimit */
1855ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestNextUCharError(cnv, source, source, U_INDEX_OUTOFBOUNDS_ERROR, "sourceLimit <= source");
1856ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cnvName = ucnv_getName(cnv, &errorCode);
1857ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(errorCode) || uprv_strcmp(cnvName, "UTF-7") != 0) {
1858ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("UTF-7 converter is called %s: %s\n", cnvName, u_errorName(errorCode));
1859ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1860ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_close(cnv);
1861ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
1862ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
186350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic void TestIMAP() {
1864ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* test input */
1865ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint8_t in[]={
1866ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* H - &Jjo- - ! &- &2AHcAQ- \ */
1867ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x48,
1868ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x2d,
1869ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x26, 0x4a, 0x6a, 0x6f,
1870ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x2d, 0x2d,
1871ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x21,
1872ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x26, 0x2d,
1873ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x26, 0x32, 0x41, 0x48, 0x63, 0x41, 0x51, 0x2d
1874ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
1875ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1876ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* expected test results */
1877ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int32_t results[]={
1878ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* number of bytes read, code point */
1879ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        1, 0x48,
1880ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        1, 0x2d,
1881ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        4, 0x263a, /* <WHITE SMILING FACE> */
1882ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        2, 0x2d,
1883ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        1, 0x21,
1884ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        2, 0x26,
1885ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        7, 0x10401
1886ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
1887ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1888ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *cnvName;
1889ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *source=(const char *)in, *limit=(const char *)in+sizeof(in);
1890ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode errorCode=U_ZERO_ERROR;
1891ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UConverter *cnv=ucnv_open("IMAP-mailbox-name", &errorCode);
1892ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
1893ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("Unable to open a IMAP-mailbox-name converter: %s\n", u_errorName(errorCode)); /* sholdn't be a data err */
1894ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
1895ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1896ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestNextUChar(cnv, source, limit, results, "IMAP-mailbox-name");
1897ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* Test the condition when source >= sourceLimit */
1898ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestNextUCharError(cnv, source, source, U_INDEX_OUTOFBOUNDS_ERROR, "sourceLimit <= source");
1899ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cnvName = ucnv_getName(cnv, &errorCode);
1900ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(errorCode) || uprv_strcmp(cnvName, "IMAP-mailbox-name") != 0) {
1901ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("IMAP-mailbox-name converter is called %s: %s\n", cnvName, u_errorName(errorCode));
1902ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1903ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_close(cnv);
1904ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
1905ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
190650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic void TestUTF8() {
1907ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* test input */
1908ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint8_t in[]={
1909ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x61,
1910ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xc2, 0x80,
1911ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xe0, 0xa0, 0x80,
1912ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xf0, 0x90, 0x80, 0x80,
1913ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xf4, 0x84, 0x8c, 0xa1,
1914ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xf0, 0x90, 0x90, 0x81
1915ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
1916ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1917ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* expected test results */
1918ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int32_t results[]={
1919ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* number of bytes read, code point */
1920ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        1, 0x61,
1921ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        2, 0x80,
1922ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        3, 0x800,
1923ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        4, 0x10000,
1924ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        4, 0x104321,
1925ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        4, 0x10401
1926ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
1927ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1928ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* error test input */
1929ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint8_t in2[]={
1930ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x61,
1931ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xc0, 0x80,                     /* illegal non-shortest form */
1932ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xe0, 0x80, 0x80,               /* illegal non-shortest form */
1933ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xf0, 0x80, 0x80, 0x80,         /* illegal non-shortest form */
1934ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xc0, 0xc0,                     /* illegal trail byte */
1935ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xf4, 0x90, 0x80, 0x80,         /* 0x110000 out of range */
1936ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xf8, 0x80, 0x80, 0x80, 0x80,   /* too long */
1937ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xfe,                           /* illegal byte altogether */
1938ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x62
1939ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
1940ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1941ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* expected error test results */
1942ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int32_t results2[]={
1943ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* number of bytes read, code point */
1944ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        1, 0x61,
1945ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        22, 0x62
1946ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
1947ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1948ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UConverterToUCallback cb;
1949ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const void *p;
1950ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1951ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *source=(const char *)in,*limit=(const char *)in+sizeof(in);
1952ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode errorCode=U_ZERO_ERROR;
1953ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UConverter *cnv=ucnv_open("UTF-8", &errorCode);
1954ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
1955ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("Unable to open a UTF-8 converter: %s\n", u_errorName(errorCode));
1956ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
1957ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
1958ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestNextUChar(cnv, source, limit, results, "UTF-8");
1959ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* Test the condition when source >= sourceLimit */
1960ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestNextUCharError(cnv, source, source, U_INDEX_OUTOFBOUNDS_ERROR, "sourceLimit <= source");
1961ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1962ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* test error behavior with a skip callback */
1963ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_setToUCallBack(cnv, UCNV_TO_U_CALLBACK_SKIP, NULL, &cb, &p, &errorCode);
1964ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    source=(const char *)in2;
1965ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    limit=(const char *)(in2+sizeof(in2));
1966ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestNextUChar(cnv, source, limit, results2, "UTF-8");
1967ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1968ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_close(cnv);
1969ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
1970ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
197150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic void TestCESU8() {
1972ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* test input */
1973ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint8_t in[]={
1974ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x61,
1975ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xc2, 0x80,
1976ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xe0, 0xa0, 0x80,
1977ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xed, 0xa0, 0x80, 0xed, 0xb0, 0x80,
1978ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xed, 0xb0, 0x81, 0xed, 0xa0, 0x82,
1979ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xed, 0xaf, 0xbf, 0xed, 0xbf, 0xbf,
1980ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xef, 0xbf, 0xbc
1981ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
1982ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1983ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* expected test results */
1984ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int32_t results[]={
1985ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* number of bytes read, code point */
1986ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        1, 0x61,
1987ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        2, 0x80,
1988ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        3, 0x800,
1989ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        6, 0x10000,
1990ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        3, 0xdc01,
1991ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        -1,0xd802,  /* may read 3 or 6 bytes */
1992ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        -1,0x10ffff,/* may read 0 or 3 bytes */
1993ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        3, 0xfffc
1994ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
1995ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
1996ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* error test input */
1997ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint8_t in2[]={
1998ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x61,
1999ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xc0, 0x80,                     /* illegal non-shortest form */
2000ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xe0, 0x80, 0x80,               /* illegal non-shortest form */
2001ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xf0, 0x80, 0x80, 0x80,         /* illegal non-shortest form */
2002ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xc0, 0xc0,                     /* illegal trail byte */
2003ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xf0, 0x90, 0x80, 0x80,         /* illegal 4-byte supplementary code point */
2004ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xf4, 0x84, 0x8c, 0xa1,         /* illegal 4-byte supplementary code point */
2005ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xf0, 0x90, 0x90, 0x81,         /* illegal 4-byte supplementary code point */
2006ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xf4, 0x90, 0x80, 0x80,         /* 0x110000 out of range */
2007ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xf8, 0x80, 0x80, 0x80, 0x80,   /* too long */
2008ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xfe,                           /* illegal byte altogether */
2009ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x62
2010ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
2011ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2012ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* expected error test results */
2013ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int32_t results2[]={
2014ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* number of bytes read, code point */
2015ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        1, 0x61,
2016ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        34, 0x62
2017ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
2018ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2019ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UConverterToUCallback cb;
2020ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const void *p;
2021ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2022ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *source=(const char *)in,*limit=(const char *)in+sizeof(in);
2023ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode errorCode=U_ZERO_ERROR;
2024ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UConverter *cnv=ucnv_open("CESU-8", &errorCode);
2025ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
2026ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("Unable to open a CESU-8 converter: %s\n", u_errorName(errorCode));
2027ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
2028ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
2029ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestNextUChar(cnv, source, limit, results, "CESU-8");
2030ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* Test the condition when source >= sourceLimit */
2031ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestNextUCharError(cnv, source, source, U_INDEX_OUTOFBOUNDS_ERROR, "sourceLimit <= source");
2032ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2033ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* test error behavior with a skip callback */
2034ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_setToUCallBack(cnv, UCNV_TO_U_CALLBACK_SKIP, NULL, &cb, &p, &errorCode);
2035ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    source=(const char *)in2;
2036ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    limit=(const char *)(in2+sizeof(in2));
2037ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestNextUChar(cnv, source, limit, results2, "CESU-8");
2038ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2039ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_close(cnv);
2040ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
2041ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
204250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic void TestUTF16() {
2043ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* test input */
2044ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint8_t in1[]={
2045ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xfe, 0xff, 0x4e, 0x00, 0xfe, 0xff
2046ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
2047ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint8_t in2[]={
2048ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xff, 0xfe, 0x4e, 0x00, 0xfe, 0xff
2049ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
2050ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint8_t in3[]={
2051ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xfe, 0xfe, 0x4e, 0x00, 0xfe, 0xff, 0xd8, 0x40, 0xdc, 0x01
2052ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
2053ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2054ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* expected test results */
2055ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int32_t results1[]={
2056ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* number of bytes read, code point */
2057ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        4, 0x4e00,
2058ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        2, 0xfeff
2059ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
2060ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int32_t results2[]={
2061ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* number of bytes read, code point */
2062ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        4, 0x004e,
2063ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        2, 0xfffe
2064ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
2065ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int32_t results3[]={
2066ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* number of bytes read, code point */
2067ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        2, 0xfefe,
2068ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        2, 0x4e00,
2069ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        2, 0xfeff,
2070ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        4, 0x20001
2071ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
2072ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2073ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *source, *limit;
2074ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2075ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode errorCode=U_ZERO_ERROR;
2076ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UConverter *cnv=ucnv_open("UTF-16", &errorCode);
2077ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
2078ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("Unable to open a UTF-16 converter: %s\n", u_errorName(errorCode));
2079ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
2080ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
2081ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2082ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    source=(const char *)in1, limit=(const char *)in1+sizeof(in1);
2083ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestNextUChar(cnv, source, limit, results1, "UTF-16");
2084ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2085ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    source=(const char *)in2, limit=(const char *)in2+sizeof(in2);
2086ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_resetToUnicode(cnv);
2087ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestNextUChar(cnv, source, limit, results2, "UTF-16");
2088ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2089ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    source=(const char *)in3, limit=(const char *)in3+sizeof(in3);
2090ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_resetToUnicode(cnv);
2091ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestNextUChar(cnv, source, limit, results3, "UTF-16");
2092ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2093ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* Test the condition when source >= sourceLimit */
2094ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_resetToUnicode(cnv);
2095ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestNextUCharError(cnv, source, source, U_INDEX_OUTOFBOUNDS_ERROR, "sourceLimit <= source");
2096ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2097ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_close(cnv);
2098ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
2099ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
210050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic void TestUTF16BE() {
2101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* test input */
2102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint8_t in[]={
2103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x00, 0x61,
2104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x00, 0xc0,
2105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x00, 0x31,
2106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x00, 0xf4,
2107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xce, 0xfe,
2108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xd8, 0x01, 0xdc, 0x01
2109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
2110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* expected test results */
2112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int32_t results[]={
2113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* number of bytes read, code point */
2114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        2, 0x61,
2115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        2, 0xc0,
2116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        2, 0x31,
2117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        2, 0xf4,
2118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        2, 0xcefe,
2119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        4, 0x10401
2120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
2121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *source=(const char *)in, *limit=(const char *)in+sizeof(in);
2123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode errorCode=U_ZERO_ERROR;
2124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UConverter *cnv=ucnv_open("utf-16be", &errorCode);
2125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
2126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("Unable to open a UTF16-BE converter: %s\n", u_errorName(errorCode));
2127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
2128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
2129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestNextUChar(cnv, source, limit, results, "UTF-16BE");
2130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* Test the condition when source >= sourceLimit */
2131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestNextUCharError(cnv, source, source, U_INDEX_OUTOFBOUNDS_ERROR, "sourceLimit <= source");
2132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*Test for the condition where there is an invalid character*/
2133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
2134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const uint8_t source2[]={0x61};
2135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucnv_setToUCallBack(cnv, UCNV_TO_U_CALLBACK_STOP, NULL, NULL, NULL, &errorCode);
2136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TestNextUCharError(cnv, (const char*)source2, (const char*)source2+sizeof(source2), U_TRUNCATED_CHAR_FOUND, "an invalid character");
2137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
2138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if 0
2139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*
2140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * Test disabled because currently the UTF-16BE/LE converters are supposed
2141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * to not set errors for unpaired surrogates.
2142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * This may change with
2143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * Jitterbug 1838 - forbid converting surrogate code points in UTF-16/32
2144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     */
2145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*Test for the condition where there is a surrogate pair*/
2147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
2148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        const uint8_t source2[]={0xd8, 0x01};
2149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TestNextUCharError(cnv, (const char*)source2, (const char*)source2+sizeof(source2), U_TRUNCATED_CHAR_FOUND, "an truncated surrogate character");
2150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
2151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
2152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_close(cnv);
2153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
2154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
2156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruTestUTF16LE() {
2157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* test input */
2158ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint8_t in[]={
2159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x61, 0x00,
2160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x31, 0x00,
2161ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x4e, 0x2e,
2162ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x4e, 0x00,
2163ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x01, 0xd8, 0x01, 0xdc
2164ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
2165ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2166ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* expected test results */
2167ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int32_t results[]={
2168ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* number of bytes read, code point */
2169ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        2, 0x61,
2170ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        2, 0x31,
2171ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        2, 0x2e4e,
2172ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        2, 0x4e,
2173ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        4, 0x10401
2174ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
2175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2176ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *source=(const char *)in, *limit=(const char *)in+sizeof(in);
2177ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode errorCode=U_ZERO_ERROR;
2178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UConverter *cnv=ucnv_open("utf-16le", &errorCode);
2179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
2180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("Unable to open a UTF16-LE converter: %s\n", u_errorName(errorCode));
2181ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
2182ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
2183ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestNextUChar(cnv, source, limit, results, "UTF-16LE");
2184ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* Test the condition when source >= sourceLimit */
2185ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestNextUCharError(cnv, source, source, U_INDEX_OUTOFBOUNDS_ERROR, "sourceLimit <= source");
2186ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*Test for the condition where there is an invalid character*/
2187ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
2188ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const uint8_t source2[]={0x61};
2189ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucnv_setToUCallBack(cnv, UCNV_TO_U_CALLBACK_STOP, NULL, NULL, NULL, &errorCode);
2190ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TestNextUCharError(cnv, (const char*)source2, (const char*)source2+sizeof(source2), U_TRUNCATED_CHAR_FOUND, "an invalid character");
2191ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
2192ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if 0
2193ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*
2194ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * Test disabled because currently the UTF-16BE/LE converters are supposed
2195ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * to not set errors for unpaired surrogates.
2196ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * This may change with
2197ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * Jitterbug 1838 - forbid converting surrogate code points in UTF-16/32
2198ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     */
2199ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2200ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*Test for the condition where there is a surrogate character*/
2201ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
2202ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const uint8_t source2[]={0x01, 0xd8};
2203ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TestNextUCharError(cnv, (const char*)source2, (const char*)source2+sizeof(source2), U_TRUNCATED_CHAR_FOUND, "an truncated surrogate character");
2204ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
2205ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
2206ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2207ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_close(cnv);
2208ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
2209ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
221050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic void TestUTF32() {
2211ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* test input */
2212ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint8_t in1[]={
2213ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x00, 0x00, 0xfe, 0xff,   0x00, 0x10, 0x0f, 0x00,   0x00, 0x00, 0xfe, 0xff
2214ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
2215ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint8_t in2[]={
2216ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xff, 0xfe, 0x00, 0x00,   0x00, 0x10, 0x0f, 0x00,   0xfe, 0xff, 0x00, 0x00
2217ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
2218ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint8_t in3[]={
2219ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x00, 0x00, 0xfe, 0xfe,   0x00, 0x10, 0x0f, 0x00,   0x00, 0x00, 0xd8, 0x40,   0x00, 0x00, 0xdc, 0x01
2220ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
2221ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2222ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* expected test results */
2223ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int32_t results1[]={
2224ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* number of bytes read, code point */
2225ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        8, 0x100f00,
2226ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        4, 0xfeff
2227ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
2228ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int32_t results2[]={
2229ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* number of bytes read, code point */
2230ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        8, 0x0f1000,
2231ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        4, 0xfffe
2232ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
2233ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int32_t results3[]={
2234ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* number of bytes read, code point */
2235ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        4, 0xfefe,
2236ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        4, 0x100f00,
2237ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        4, 0xfffd, /* unmatched surrogate */
2238ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        4, 0xfffd  /* unmatched surrogate */
2239ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
2240ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2241ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *source, *limit;
2242ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2243ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode errorCode=U_ZERO_ERROR;
2244ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UConverter *cnv=ucnv_open("UTF-32", &errorCode);
2245ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
2246ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("Unable to open a UTF-32 converter: %s\n", u_errorName(errorCode));
2247ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
2248ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
2249ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2250ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    source=(const char *)in1, limit=(const char *)in1+sizeof(in1);
2251ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestNextUChar(cnv, source, limit, results1, "UTF-32");
2252ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2253ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    source=(const char *)in2, limit=(const char *)in2+sizeof(in2);
2254ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_resetToUnicode(cnv);
2255ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestNextUChar(cnv, source, limit, results2, "UTF-32");
2256ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2257ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    source=(const char *)in3, limit=(const char *)in3+sizeof(in3);
2258ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_resetToUnicode(cnv);
2259ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestNextUChar(cnv, source, limit, results3, "UTF-32");
2260ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2261ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* Test the condition when source >= sourceLimit */
2262ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_resetToUnicode(cnv);
2263ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestNextUCharError(cnv, source, source, U_INDEX_OUTOFBOUNDS_ERROR, "sourceLimit <= source");
2264ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2265ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_close(cnv);
2266ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
2267ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2268ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
2269ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruTestUTF32BE() {
2270ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* test input */
2271ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint8_t in[]={
2272ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x00, 0x00, 0x00, 0x61,
2273ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x00, 0x00, 0x30, 0x61,
2274ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x00, 0x00, 0xdc, 0x00,
2275ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x00, 0x00, 0xd8, 0x00,
2276ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x00, 0x00, 0xdf, 0xff,
2277ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x00, 0x00, 0xff, 0xfe,
2278ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x00, 0x10, 0xab, 0xcd,
2279ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x00, 0x10, 0xff, 0xff
2280ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
2281ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2282ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* expected test results */
2283ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int32_t results[]={
2284ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* number of bytes read, code point */
2285ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        4, 0x61,
2286ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        4, 0x3061,
2287ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        4, 0xfffd,
2288ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        4, 0xfffd,
2289ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        4, 0xfffd,
2290ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        4, 0xfffe,
2291ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        4, 0x10abcd,
2292ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        4, 0x10ffff
2293ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
2294ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2295ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* error test input */
2296ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint8_t in2[]={
2297ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x00, 0x00, 0x00, 0x61,
2298ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x00, 0x11, 0x00, 0x00,         /* 0x110000 out of range */
2299ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x00, 0x00, 0x00, 0x62,
2300ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xff, 0xff, 0xff, 0xff,         /* 0xffffffff out of range */
2301ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x7f, 0xff, 0xff, 0xff,         /* 0x7fffffff out of range */
2302ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x00, 0x00, 0x01, 0x62,
2303ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x00, 0x00, 0x02, 0x62
2304ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
2305ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2306ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* expected error test results */
2307ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int32_t results2[]={
2308ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* number of bytes read, code point */
2309ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        4,  0x61,
2310ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        8,  0x62,
2311ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        12, 0x162,
2312ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        4,  0x262
2313ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
2314ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2315ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UConverterToUCallback cb;
2316ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const void *p;
2317ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2318ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *source=(const char *)in, *limit=(const char *)in+sizeof(in);
2319ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode errorCode=U_ZERO_ERROR;
2320ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UConverter *cnv=ucnv_open("UTF-32BE", &errorCode);
2321ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
2322ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("Unable to open a UTF-32BE converter: %s\n", u_errorName(errorCode));
2323ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
2324ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
2325ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestNextUChar(cnv, source, limit, results, "UTF-32BE");
2326ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2327ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* Test the condition when source >= sourceLimit */
2328ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestNextUCharError(cnv, source, source, U_INDEX_OUTOFBOUNDS_ERROR, "sourceLimit <= source");
2329ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2330ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* test error behavior with a skip callback */
2331ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_setToUCallBack(cnv, UCNV_TO_U_CALLBACK_SKIP, NULL, &cb, &p, &errorCode);
2332ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    source=(const char *)in2;
2333ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    limit=(const char *)(in2+sizeof(in2));
2334ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestNextUChar(cnv, source, limit, results2, "UTF-32BE");
2335ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2336ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_close(cnv);
2337ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
2338ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2339ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
2340ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruTestUTF32LE() {
2341ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* test input */
2342ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint8_t in[]={
2343ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x61, 0x00, 0x00, 0x00,
2344ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x61, 0x30, 0x00, 0x00,
2345ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x00, 0xdc, 0x00, 0x00,
2346ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x00, 0xd8, 0x00, 0x00,
2347ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xff, 0xdf, 0x00, 0x00,
2348ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xfe, 0xff, 0x00, 0x00,
2349ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xcd, 0xab, 0x10, 0x00,
2350ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xff, 0xff, 0x10, 0x00
2351ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
2352ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2353ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* expected test results */
2354ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int32_t results[]={
2355ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* number of bytes read, code point */
2356ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        4, 0x61,
2357ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        4, 0x3061,
2358ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        4, 0xfffd,
2359ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        4, 0xfffd,
2360ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        4, 0xfffd,
2361ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        4, 0xfffe,
2362ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        4, 0x10abcd,
2363ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        4, 0x10ffff
2364ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
2365ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2366ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* error test input */
2367ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint8_t in2[]={
2368ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x61, 0x00, 0x00, 0x00,
2369ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x00, 0x00, 0x11, 0x00,         /* 0x110000 out of range */
2370ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x62, 0x00, 0x00, 0x00,
2371ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xff, 0xff, 0xff, 0xff,         /* 0xffffffff out of range */
2372ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xff, 0xff, 0xff, 0x7f,         /* 0x7fffffff out of range */
2373ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x62, 0x01, 0x00, 0x00,
2374ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x62, 0x02, 0x00, 0x00,
2375ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
2376ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2377ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* expected error test results */
2378ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int32_t results2[]={
2379ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* number of bytes read, code point */
2380ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        4,  0x61,
2381ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        8,  0x62,
2382ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        12, 0x162,
2383ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        4,  0x262,
2384ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
2385ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2386ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UConverterToUCallback cb;
2387ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const void *p;
2388ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2389ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *source=(const char *)in, *limit=(const char *)in+sizeof(in);
2390ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode errorCode=U_ZERO_ERROR;
2391ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UConverter *cnv=ucnv_open("UTF-32LE", &errorCode);
2392ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
2393ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("Unable to open a UTF-32LE converter: %s\n", u_errorName(errorCode));
2394ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
2395ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
2396ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestNextUChar(cnv, source, limit, results, "UTF-32LE");
2397ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2398ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* Test the condition when source >= sourceLimit */
2399ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestNextUCharError(cnv, source, source, U_INDEX_OUTOFBOUNDS_ERROR, "sourceLimit <= source");
2400ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2401ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* test error behavior with a skip callback */
2402ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_setToUCallBack(cnv, UCNV_TO_U_CALLBACK_SKIP, NULL, &cb, &p, &errorCode);
2403ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    source=(const char *)in2;
2404ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    limit=(const char *)(in2+sizeof(in2));
2405ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestNextUChar(cnv, source, limit, results2, "UTF-32LE");
2406ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2407ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_close(cnv);
2408ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
2409ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2410ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
2411ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruTestLATIN1() {
2412ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* test input */
2413ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint8_t in[]={
2414ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       0x61,
2415ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       0x31,
2416ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       0x32,
2417ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       0xc0,
2418ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       0xf0,
2419ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       0xf4,
2420ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
2421ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2422ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* expected test results */
2423ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int32_t results[]={
2424ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* number of bytes read, code point */
2425ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        1, 0x61,
2426ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        1, 0x31,
2427ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        1, 0x32,
2428ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        1, 0xc0,
2429ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        1, 0xf0,
2430ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        1, 0xf4,
2431ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
2432ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint16_t in1[] = {
2433ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x08, 0x00, 0x1b, 0x4c, 0xea, 0x16, 0xca, 0xd3, 0x94, 0x0f, 0x53, 0xef, 0x61, 0x1b, 0xe5, 0x84,
2434ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xc4, 0x0f, 0x53, 0xef, 0x61, 0x1b, 0xe5, 0x84, 0xc4, 0x16, 0xca, 0xd3, 0x94, 0x08, 0x02, 0x0f,
2435ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x53, 0x4a, 0x4e, 0x16, 0x7d, 0x00, 0x30, 0x82, 0x52, 0x4d, 0x30, 0x6b, 0x6d, 0x41, 0x88, 0x4c,
2436ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xe5, 0x97, 0x9f, 0x08, 0x0c, 0x16, 0xca, 0xd3, 0x94, 0x15, 0xae, 0x0e, 0x6b, 0x4c, 0x08, 0x0d,
2437ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x8c, 0xb4, 0xa3, 0x9f, 0xca, 0x99, 0xcb, 0x8b, 0xc2, 0x97, 0xcc, 0xaa, 0x84, 0x08, 0x02, 0x0e,
2438ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x7c, 0x73, 0xe2, 0x16, 0xa3, 0xb7, 0xcb, 0x93, 0xd3, 0xb4, 0xc5, 0xdc, 0x9f, 0x0e, 0x79, 0x3e,
2439ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x06, 0xae, 0xb1, 0x9d, 0x93, 0xd3, 0x08, 0x0c, 0xbe, 0xa3, 0x8f, 0x08, 0x88, 0xbe, 0xa3, 0x8d,
2440ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xd3, 0xa8, 0xa3, 0x97, 0xc5, 0x17, 0x89, 0x08, 0x0d, 0x15, 0xd2, 0x08, 0x01, 0x93, 0xc8, 0xaa,
2441ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x8f, 0x0e, 0x61, 0x1b, 0x99, 0xcb, 0x0e, 0x4e, 0xba, 0x9f, 0xa1, 0xae, 0x93, 0xa8, 0xa0, 0x08,
2442ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x02, 0x08, 0x0c, 0xe2, 0x16, 0xa3, 0xb7, 0xcb, 0x0f, 0x4f, 0xe1, 0x80, 0x05, 0xec, 0x60, 0x8d,
2443ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xea, 0x06, 0xd3, 0xe6, 0x0f, 0x8a, 0x00, 0x30, 0x44, 0x65, 0xb9, 0xe4, 0xfe, 0xe7, 0xc2, 0x06,
2444ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xcb, 0x82
2445ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
2446ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint8_t out1[] = {
2447ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x08, 0x00, 0x1b, 0x4c, 0xea, 0x16, 0xca, 0xd3, 0x94, 0x0f, 0x53, 0xef, 0x61, 0x1b, 0xe5, 0x84,
2448ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xc4, 0x0f, 0x53, 0xef, 0x61, 0x1b, 0xe5, 0x84, 0xc4, 0x16, 0xca, 0xd3, 0x94, 0x08, 0x02, 0x0f,
2449ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x53, 0x4a, 0x4e, 0x16, 0x7d, 0x00, 0x30, 0x82, 0x52, 0x4d, 0x30, 0x6b, 0x6d, 0x41, 0x88, 0x4c,
2450ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xe5, 0x97, 0x9f, 0x08, 0x0c, 0x16, 0xca, 0xd3, 0x94, 0x15, 0xae, 0x0e, 0x6b, 0x4c, 0x08, 0x0d,
2451ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x8c, 0xb4, 0xa3, 0x9f, 0xca, 0x99, 0xcb, 0x8b, 0xc2, 0x97, 0xcc, 0xaa, 0x84, 0x08, 0x02, 0x0e,
2452ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x7c, 0x73, 0xe2, 0x16, 0xa3, 0xb7, 0xcb, 0x93, 0xd3, 0xb4, 0xc5, 0xdc, 0x9f, 0x0e, 0x79, 0x3e,
2453ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x06, 0xae, 0xb1, 0x9d, 0x93, 0xd3, 0x08, 0x0c, 0xbe, 0xa3, 0x8f, 0x08, 0x88, 0xbe, 0xa3, 0x8d,
2454ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xd3, 0xa8, 0xa3, 0x97, 0xc5, 0x17, 0x89, 0x08, 0x0d, 0x15, 0xd2, 0x08, 0x01, 0x93, 0xc8, 0xaa,
2455ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x8f, 0x0e, 0x61, 0x1b, 0x99, 0xcb, 0x0e, 0x4e, 0xba, 0x9f, 0xa1, 0xae, 0x93, 0xa8, 0xa0, 0x08,
2456ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x02, 0x08, 0x0c, 0xe2, 0x16, 0xa3, 0xb7, 0xcb, 0x0f, 0x4f, 0xe1, 0x80, 0x05, 0xec, 0x60, 0x8d,
2457ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xea, 0x06, 0xd3, 0xe6, 0x0f, 0x8a, 0x00, 0x30, 0x44, 0x65, 0xb9, 0xe4, 0xfe, 0xe7, 0xc2, 0x06,
2458ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xcb, 0x82
2459ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
2460ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint16_t in2[]={
2461ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x1B, 0x24, 0x29, 0x47, 0x0E, 0x23, 0x21, 0x23, 0x22, 0x23,
2462ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x23, 0x23, 0x24, 0x23, 0x25, 0x23, 0x26, 0x23, 0x27, 0x23,
2463ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x28, 0x23, 0x29, 0x23, 0x2A, 0x23, 0x2B, 0x0F, 0x2F, 0x2A,
2464ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x70, 0x6C, 0x61, 0x6E, 0x65, 0x20, 0x31, 0x20, 0x2A, 0x2F,
2465ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0D, 0x0A, 0x1B, 0x24, 0x2A, 0x48, 0x1B, 0x4E, 0x22, 0x21,
2466ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x1B, 0x4E, 0x22, 0x22, 0x1B, 0x4E, 0x22, 0x23, 0x1B, 0x4E,
2467ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x22, 0x24, 0x1B, 0x4E, 0x22, 0x25, 0x0F, 0x2F, 0x2A, 0x70,
2468ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x6C, 0x61, 0x6E, 0x65, 0x32, 0x2A, 0x2F, 0x20, 0x0D, 0x0A,
2469ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x1B, 0x24, 0x2B, 0x49, 0x1B, 0x4F, 0x22, 0x44, 0x1B, 0x4F,
2470ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x22, 0x45, 0x1B, 0x4F, 0x22, 0x46, 0x1B, 0x4F, 0x22, 0x47,
2471ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x1B, 0x4F, 0x22, 0x48, 0x0F, 0x2F, 0x2A, 0x70, 0x6C, 0x61,
2472ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x6E, 0x65, 0x20, 0x33, 0x20, 0x2A, 0x2F, 0x0D, 0x0A, 0x1B,
2473ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x24, 0x2B, 0x4A, 0x1B, 0x4F, 0x21, 0x44, 0x1B, 0x4F, 0x21,
2474ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x45, 0x1B, 0x4F, 0x22, 0x6A, 0x1B, 0x4F, 0x22, 0x6B, 0x1B,
2475ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x4F, 0x22, 0x6C, 0x0F, 0x2F, 0x2A, 0x70, 0x6C, 0x61, 0x6E,
2476ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x65, 0x20, 0x34, 0x20, 0x2A, 0x2F, 0x0D, 0x0A, 0x1B, 0x24,
2477ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x2B, 0x4B, 0x1B, 0x4F, 0x21, 0x74, 0x1B, 0x4F, 0x22, 0x50,
2478ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x1B, 0x4F, 0x22, 0x51, 0x1B, 0x4F, 0x23, 0x37, 0x1B, 0x4F,
2479ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x22, 0x5C, 0x0F, 0x2F, 0x2A, 0x70, 0x6C, 0x61, 0x6E,
2480ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x65, 0x20, 0x35, 0x20, 0x2A, 0x2F, 0x0D, 0x0A, 0x1B, 0x24,
2481ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x2B, 0x4C, 0x1B, 0x4F, 0x21, 0x23, 0x1B, 0x4F, 0x22, 0x2C,
2482ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x1B, 0x4F, 0x23, 0x4E, 0x1B, 0x4F, 0x21, 0x6E, 0x1B, 0x4F,
2483ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x23, 0x71, 0x0F, 0x2F, 0x2A, 0x70, 0x6C, 0x61, 0x6E, 0x65,
2484ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x20, 0x36, 0x20, 0x2A, 0x2F, 0x0D, 0x0A, 0x1B, 0x24, 0x2B,
2485ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x4D, 0x1B, 0x4F, 0x22, 0x71, 0x1B, 0x4F, 0x21, 0x4E, 0x1B,
2486ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x4F, 0x21, 0x6A, 0x1B, 0x4F, 0x23, 0x3A, 0x1B, 0x4F, 0x23,
2487ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x6F, 0x0F, 0x2F, 0x2A, 0x70, 0x6C, 0x61, 0x6E, 0x65, 0x20,
2488ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x37, 0x20, 0x2A, 0x2F,
2489ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
2490ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const unsigned char out2[]={
2491ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x1B, 0x24, 0x29, 0x47, 0x0E, 0x23, 0x21, 0x23, 0x22, 0x23,
2492ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x23, 0x23, 0x24, 0x23, 0x25, 0x23, 0x26, 0x23, 0x27, 0x23,
2493ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x28, 0x23, 0x29, 0x23, 0x2A, 0x23, 0x2B, 0x0F, 0x2F, 0x2A,
2494ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x70, 0x6C, 0x61, 0x6E, 0x65, 0x20, 0x31, 0x20, 0x2A, 0x2F,
2495ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0D, 0x0A, 0x1B, 0x24, 0x2A, 0x48, 0x1B, 0x4E, 0x22, 0x21,
2496ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x1B, 0x4E, 0x22, 0x22, 0x1B, 0x4E, 0x22, 0x23, 0x1B, 0x4E,
2497ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x22, 0x24, 0x1B, 0x4E, 0x22, 0x25, 0x0F, 0x2F, 0x2A, 0x70,
2498ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x6C, 0x61, 0x6E, 0x65, 0x32, 0x2A, 0x2F, 0x20, 0x0D, 0x0A,
2499ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x1B, 0x24, 0x2B, 0x49, 0x1B, 0x4F, 0x22, 0x44, 0x1B, 0x4F,
2500ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x22, 0x45, 0x1B, 0x4F, 0x22, 0x46, 0x1B, 0x4F, 0x22, 0x47,
2501ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x1B, 0x4F, 0x22, 0x48, 0x0F, 0x2F, 0x2A, 0x70, 0x6C, 0x61,
2502ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x6E, 0x65, 0x20, 0x33, 0x20, 0x2A, 0x2F, 0x0D, 0x0A, 0x1B,
2503ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x24, 0x2B, 0x4A, 0x1B, 0x4F, 0x21, 0x44, 0x1B, 0x4F, 0x21,
2504ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x45, 0x1B, 0x4F, 0x22, 0x6A, 0x1B, 0x4F, 0x22, 0x6B, 0x1B,
2505ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x4F, 0x22, 0x6C, 0x0F, 0x2F, 0x2A, 0x70, 0x6C, 0x61, 0x6E,
2506ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x65, 0x20, 0x34, 0x20, 0x2A, 0x2F, 0x0D, 0x0A, 0x1B, 0x24,
2507ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x2B, 0x4B, 0x1B, 0x4F, 0x21, 0x74, 0x1B, 0x4F, 0x22, 0x50,
2508ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x1B, 0x4F, 0x22, 0x51, 0x1B, 0x4F, 0x23, 0x37, 0x1B, 0x4F,
2509ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x22, 0x5C, 0x0F, 0x2F, 0x2A, 0x70, 0x6C, 0x61, 0x6E,
2510ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x65, 0x20, 0x35, 0x20, 0x2A, 0x2F, 0x0D, 0x0A, 0x1B, 0x24,
2511ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x2B, 0x4C, 0x1B, 0x4F, 0x21, 0x23, 0x1B, 0x4F, 0x22, 0x2C,
2512ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x1B, 0x4F, 0x23, 0x4E, 0x1B, 0x4F, 0x21, 0x6E, 0x1B, 0x4F,
2513ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x23, 0x71, 0x0F, 0x2F, 0x2A, 0x70, 0x6C, 0x61, 0x6E, 0x65,
2514ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x20, 0x36, 0x20, 0x2A, 0x2F, 0x0D, 0x0A, 0x1B, 0x24, 0x2B,
2515ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x4D, 0x1B, 0x4F, 0x22, 0x71, 0x1B, 0x4F, 0x21, 0x4E, 0x1B,
2516ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x4F, 0x21, 0x6A, 0x1B, 0x4F, 0x23, 0x3A, 0x1B, 0x4F, 0x23,
2517ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x6F, 0x0F, 0x2F, 0x2A, 0x70, 0x6C, 0x61, 0x6E, 0x65, 0x20,
2518ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x37, 0x20, 0x2A, 0x2F,
2519ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
2520ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *source=(const char *)in;
2521ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *limit=(const char *)in+sizeof(in);
2522ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2523ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode errorCode=U_ZERO_ERROR;
2524ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UConverter *cnv=ucnv_open("LATIN_1", &errorCode);
2525ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
252685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_data_err("Unable to open a LATIN_1 converter: %s\n", u_errorName(errorCode));
2527ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
2528ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
2529ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestNextUChar(cnv, source, limit, results, "LATIN_1");
2530ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* Test the condition when source >= sourceLimit */
2531ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestNextUCharError(cnv, source, source, U_INDEX_OUTOFBOUNDS_ERROR, "sourceLimit <= source");
2532ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestConv((uint16_t*)in1,sizeof(in1)/2,"LATIN_1","LATIN-1",(char*)out1,sizeof(out1));
2533ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestConv((uint16_t*)in2,sizeof(in2)/2,"ASCII","ASCII",(char*)out2,sizeof(out2));
2534ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2535ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_close(cnv);
2536ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
2537ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2538ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
2539ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruTestSBCS() {
2540ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* test input */
2541ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint8_t in[]={ 0x61, 0xc0, 0x80, 0xe0, 0xf0, 0xf4};
2542ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* expected test results */
2543ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int32_t results[]={
2544ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* number of bytes read, code point */
2545ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        1, 0x61,
2546ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        1, 0xbf,
2547ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        1, 0xc4,
2548ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        1, 0x2021,
2549ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        1, 0xf8ff,
2550ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        1, 0x00d9
2551ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
2552ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2553ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *source=(const char *)in, *limit=(const char *)in+sizeof(in);
2554ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode errorCode=U_ZERO_ERROR;
2555ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UConverter *cnv=ucnv_open("x-mac-turkish", &errorCode);
2556ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
2557ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_data_err("Unable to open a SBCS(x-mac-turkish) converter: %s\n", u_errorName(errorCode));
2558ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
2559ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
2560ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestNextUChar(cnv, source, limit, results, "SBCS(x-mac-turkish)");
2561ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* Test the condition when source >= sourceLimit */
2562ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestNextUCharError(cnv, source, source, U_INDEX_OUTOFBOUNDS_ERROR, "sourceLimit <= source");
2563ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*Test for Illegal character */ /*
2564ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
2565ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint8_t input1[]={ 0xA1 };
2566ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* illegalsource=(const char*)input1;
2567ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestNextUCharError(cnv, illegalsource, illegalsource+sizeof(illegalsource), U_INVALID_CHAR_FOUND, "source has a illegal characte");
2568ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
2569ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   */
2570ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_close(cnv);
2571ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
2572ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2573ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
2574ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruTestDBCS() {
2575ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* test input */
2576ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint8_t in[]={
2577ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x44, 0x6a,
2578ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xc4, 0x9c,
2579ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x7a, 0x74,
2580ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x46, 0xab,
2581ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x42, 0x5b,
2582ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2583ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
2584ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2585ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* expected test results */
2586ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int32_t results[]={
2587ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* number of bytes read, code point */
2588ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        2, 0x00a7,
2589ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        2, 0xe1d2,
2590ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        2, 0x6962,
2591ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        2, 0xf842,
2592ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        2, 0xffe5,
2593ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
2594ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2595ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *source=(const char *)in, *limit=(const char *)in+sizeof(in);
2596ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode errorCode=U_ZERO_ERROR;
2597ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2598ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UConverter *cnv=my_ucnv_open("@ibm9027", &errorCode);
2599ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
2600ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_data_err("Unable to open a DBCS(@ibm9027) converter: %s\n", u_errorName(errorCode));
2601ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
2602ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
2603ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestNextUChar(cnv, source, limit, results, "DBCS(@ibm9027)");
2604ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* Test the condition when source >= sourceLimit */
2605ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestNextUCharError(cnv, source, source, U_INDEX_OUTOFBOUNDS_ERROR, "sourceLimit <= source");
2606ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*Test for the condition where there is an invalid character*/
2607ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
2608ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const uint8_t source2[]={0x1a, 0x1b};
2609ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TestNextUCharError(cnv, (const char*)source2, (const char*)source2+sizeof(source2), U_ZERO_ERROR, "an invalid character");
2610ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
2611ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*Test for the condition where we have a truncated char*/
2612ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
2613ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const uint8_t source1[]={0xc4};
2614ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucnv_setToUCallBack(cnv, UCNV_TO_U_CALLBACK_STOP, NULL, NULL, NULL, &errorCode);
2615ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TestNextUCharError(cnv, (const char*)source1, (const char*)source1+sizeof(source1), U_TRUNCATED_CHAR_FOUND, "a character is truncated");
2616ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
2617ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_close(cnv);
2618ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
2619ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2620ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
2621ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruTestMBCS() {
2622ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* test input */
2623ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint8_t in[]={
2624ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x01,
2625ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xa6, 0xa3,
2626ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x00,
2627ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xa6, 0xa1,
2628ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x08,
2629ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xc2, 0x76,
2630ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xc2, 0x78,
2631ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2632ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
2633ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2634ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* expected test results */
2635ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int32_t results[]={
2636ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* number of bytes read, code point */
2637ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        1, 0x0001,
2638ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        2, 0x250c,
2639ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        1, 0x0000,
2640ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        2, 0x2500,
2641ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        1, 0x0008,
2642ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        2, 0xd60c,
2643ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        2, 0xd60e,
2644ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
2645ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2646ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *source=(const char *)in, *limit=(const char *)in+sizeof(in);
2647ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode errorCode=U_ZERO_ERROR;
2648ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2649ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UConverter *cnv=ucnv_open("ibm-1363", &errorCode);
2650ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
2651ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_data_err("Unable to open a MBCS(ibm-1363) converter: %s\n", u_errorName(errorCode));
2652ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
2653ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
2654ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestNextUChar(cnv, source, limit, results, "MBCS(ibm-1363)");
2655ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* Test the condition when source >= sourceLimit */
2656ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestNextUCharError(cnv, source, source, U_INDEX_OUTOFBOUNDS_ERROR, "sourceLimit <= source");
2657ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*Test for the condition where there is an invalid character*/
2658ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
265985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        static const uint8_t source2[]={0xa1, 0x80};
2660ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TestNextUCharError(cnv, (const char*)source2, (const char*)source2+sizeof(source2), U_ZERO_ERROR, "an invalid character");
2661ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
2662ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*Test for the condition where we have a truncated char*/
2663ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
2664ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const uint8_t source1[]={0xc4};
2665ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucnv_setToUCallBack(cnv, UCNV_TO_U_CALLBACK_STOP, NULL, NULL, NULL, &errorCode);
2666ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TestNextUCharError(cnv, (const char*)source1, (const char*)source1+sizeof(source1), U_TRUNCATED_CHAR_FOUND, "a character is truncated");
2667ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
2668ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_close(cnv);
2669ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2670ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
2671ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
267250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if !UCONFIG_NO_LEGACY_CONVERSION && !UCONFIG_NO_FILE_IO
267350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic void
267450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoTestICCRunout() {
267550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/*    { "ibm-1363", :bin{ a2aea2 }, "\u00a1\u001a", :intvector{ 0, 2 }, :int{1}, :int{0}, "\", "?", :bin{""} } */
267650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
267750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    const char *cnvName = "ibm-1363";
267850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UErrorCode status = U_ZERO_ERROR;
267927f654740f2a26ad62a5c155af9199af9e69b889claireho    const char sourceData[] = { (char)0xa2, (char)0xae, (char)0xa2 };
268027f654740f2a26ad62a5c155af9199af9e69b889claireho    /* UChar   expectUData[] = { 0x00a1, 0x001a }; */
268127f654740f2a26ad62a5c155af9199af9e69b889claireho    const char *source = sourceData;
268227f654740f2a26ad62a5c155af9199af9e69b889claireho    const char *sourceLim = sourceData+sizeof(sourceData);
268350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UChar c1, c2, c3;
268450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UConverter *cnv=ucnv_open(cnvName, &status);
268550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(U_FAILURE(status)) {
268650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_data_err("Unable to open %s converter: %s\n", cnvName, u_errorName(status));
268750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho	return;
268850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
268950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
269050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if 0
269127f654740f2a26ad62a5c155af9199af9e69b889claireho    {
269227f654740f2a26ad62a5c155af9199af9e69b889claireho    UChar   targetBuf[256];
269327f654740f2a26ad62a5c155af9199af9e69b889claireho    UChar   *target = targetBuf;
269427f654740f2a26ad62a5c155af9199af9e69b889claireho    UChar   *targetLim = target+256;
269550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    ucnv_toUnicode(cnv, &target, targetLim, &source, sourceLim, NULL, TRUE, &status);
269650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
269750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    log_info("After convert: target@%d, source@%d, status%s\n",
269850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho	     target-targetBuf, source-sourceData, u_errorName(status));
269950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
270050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(U_FAILURE(status)) {
270150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho	log_err("Failed to convert: %s\n", u_errorName(status));
270250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    } else {
270350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
270450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
270527f654740f2a26ad62a5c155af9199af9e69b889claireho    }
270650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif
270750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
270850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    c1=ucnv_getNextUChar(cnv, &source, sourceLim, &status);
270950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    log_verbose("c1: U+%04X, source@%d, status %s\n", c1, source-sourceData, u_errorName(status));
271050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
271150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    c2=ucnv_getNextUChar(cnv, &source, sourceLim, &status);
271250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    log_verbose("c2: U+%04X, source@%d, status %s\n", c2, source-sourceData, u_errorName(status));
271350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
271450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    c3=ucnv_getNextUChar(cnv, &source, sourceLim, &status);
271550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    log_verbose("c3: U+%04X, source@%d, status %s\n", c3, source-sourceData, u_errorName(status));
271650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
271750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(status==U_INDEX_OUTOFBOUNDS_ERROR && c3==0xFFFF) {
271850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho	log_verbose("OK\n");
271950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    } else {
272050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho	log_err("FAIL: c3 was not FFFF or err was not U_INDEXOUTOFBOUNDS_ERROR\n");
272150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
272250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
272350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    ucnv_close(cnv);
272450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
272550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
272650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif
272750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
2728ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifdef U_ENABLE_GENERIC_ISO_2022
2729ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2730ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
2731ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruTestISO_2022() {
2732ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* test input */
2733ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint8_t in[]={
2734ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x1b, 0x25, 0x42,
2735ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x31,
2736ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x32,
2737ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x61,
2738ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xc2, 0x80,
2739ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xe0, 0xa0, 0x80,
2740ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xf0, 0x90, 0x80, 0x80
2741ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
2742ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2743ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2744ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2745ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* expected test results */
2746ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int32_t results[]={
2747ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* number of bytes read, code point */
2748ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        4, 0x0031,  /* 4 bytes including the escape sequence */
2749ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        1, 0x0032,
2750ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        1, 0x61,
2751ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        2, 0x80,
2752ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        3, 0x800,
2753ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        4, 0x10000
2754ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
2755ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2756ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *source=(const char *)in, *limit=(const char *)in+sizeof(in);
2757ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode errorCode=U_ZERO_ERROR;
2758ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UConverter *cnv;
2759ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2760ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cnv=ucnv_open("ISO_2022", &errorCode);
2761ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
2762ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_data_err("Unable to open a iso-2022 converter: %s\n", u_errorName(errorCode));
2763ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
2764ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
2765ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestNextUChar(cnv, source, limit, results, "ISO_2022");
2766ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2767ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* Test the condition when source >= sourceLimit */
2768ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestNextUCharError(cnv, source, source-1, U_ILLEGAL_ARGUMENT_ERROR, "sourceLimit < source");
2769ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestNextUCharError(cnv, source, source, U_INDEX_OUTOFBOUNDS_ERROR, "sourceLimit <= source");
2770ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*Test for the condition where we have a truncated char*/
2771ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
2772ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const uint8_t source1[]={0xc4};
2773ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucnv_setToUCallBack(cnv, UCNV_TO_U_CALLBACK_STOP, NULL, NULL, NULL, &errorCode);
2774ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TestNextUCharError(cnv, (const char*)source1, (const char*)source1+sizeof(source1), U_TRUNCATED_CHAR_FOUND, "a character is truncated");
2775ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
2776ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*Test for the condition where there is an invalid character*/
2777ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
2778ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const uint8_t source2[]={0xa1, 0x01};
2779ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TestNextUCharError(cnv, (const char*)source2, (const char*)source2+sizeof(source2), U_ILLEGAL_CHAR_FOUND, "an invalid character");
2780ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
2781ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_close(cnv);
2782ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
2783ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2784ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
2785ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2786ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
2787ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruTestSmallTargetBuffer(const uint16_t* source, const UChar* sourceLimit,UConverter* cnv){
2788ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const UChar* uSource;
2789ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const UChar* uSourceLimit;
2790ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* cSource;
2791ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* cSourceLimit;
2792ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *uTargetLimit =NULL;
2793ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *uTarget;
2794ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char *cTarget;
2795ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *cTargetLimit;
2796ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char *cBuf;
279750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UChar *uBuf; /*,*test;*/
2798ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t uBufSize = 120;
2799ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int len=0;
2800ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int i=2;
2801ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode errorCode=U_ZERO_ERROR;
2802ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uBuf =  (UChar*)malloc(uBufSize * sizeof(UChar)*5);
2803ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cBuf =(char*)malloc(uBufSize * sizeof(char) * 10);
2804ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_reset(cnv);
2805ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    for(;--i>0; ){
2806ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uSource = (UChar*) source;
2807ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uSourceLimit=(const UChar*)sourceLimit;
2808ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        cTarget = cBuf;
2809ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uTarget = uBuf;
2810ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        cSource = cBuf;
2811ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        cTargetLimit = cBuf;
2812ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uTargetLimit = uBuf;
2813ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2814ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        do{
2815ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2816ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            cTargetLimit = cTargetLimit+ i;
2817ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            ucnv_fromUnicode( cnv , &cTarget, cTargetLimit,&uSource,uSourceLimit,NULL,FALSE, &errorCode);
2818ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if(errorCode==U_BUFFER_OVERFLOW_ERROR){
2819ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru               errorCode=U_ZERO_ERROR;
2820ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                continue;
2821ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
2822ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2823ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if(U_FAILURE(errorCode)){
2824ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                log_err("ucnv_toUnicode conversion failed reason %s\n", u_errorName(errorCode));
2825ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                return;
2826ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
2827ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2828ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }while (uSource<uSourceLimit);
2829ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2830ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        cSourceLimit =cTarget;
2831ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        do{
2832ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            uTargetLimit=uTargetLimit+i;
2833ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            ucnv_toUnicode(cnv,&uTarget,uTargetLimit,&cSource,cSourceLimit,NULL,FALSE,&errorCode);
2834ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if(errorCode==U_BUFFER_OVERFLOW_ERROR){
2835ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru               errorCode=U_ZERO_ERROR;
2836ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                continue;
2837ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
2838ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if(U_FAILURE(errorCode)){
2839ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                   log_err("ucnv_toUnicode conversion failed reason %s\n", u_errorName(errorCode));
2840ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    return;
2841ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
2842ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }while(cSource<cSourceLimit);
2843ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2844ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uSource = source;
284550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /*test =uBuf;*/
2846ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        for(len=0;len<(int)(source - sourceLimit);len++){
2847ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if(uBuf[len]!=uSource[len]){
2848ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                log_err("Expected : \\u%04X \t Got: \\u%04X\n",uSource[len],(int)uBuf[len]) ;
2849ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
2850ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
2851ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
2852ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(uBuf);
2853ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(cBuf);
2854ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
2855ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* Test for Jitterbug 778 */
2856ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestToAndFromUChars(const uint16_t* source, const UChar* sourceLimit,UConverter* cnv){
2857ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const UChar* uSource;
2858ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const UChar* uSourceLimit;
2859ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* cSource;
2860ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *uTargetLimit =NULL;
2861ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *uTarget;
2862ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char *cTarget;
2863ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *cTargetLimit;
2864ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char *cBuf;
2865ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *uBuf,*test;
2866ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t uBufSize = 120;
2867ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int numCharsInTarget=0;
2868ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode errorCode=U_ZERO_ERROR;
2869ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uBuf =  (UChar*)malloc(uBufSize * sizeof(UChar)*5);
2870ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cBuf =(char*)malloc(uBufSize * sizeof(char) * 5);
2871ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uSource = source;
2872ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uSourceLimit=sourceLimit;
2873ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cTarget = cBuf;
2874ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cTargetLimit = cBuf +uBufSize*5;
2875ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uTarget = uBuf;
2876ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uTargetLimit = uBuf+ uBufSize*5;
2877ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_reset(cnv);
2878ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    numCharsInTarget=ucnv_fromUChars(cnv, cTarget, (int32_t)(cTargetLimit-cTarget), uSource, (int32_t)(uSourceLimit-uSource), &errorCode);
2879ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)){
2880ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ucnv_fromUnicode conversion failed reason %s\n", u_errorName(errorCode));
2881ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
2882ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
2883ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cSource = cBuf;
2884ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    test =uBuf;
2885ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_toUChars(cnv,uTarget,(int32_t)(uTargetLimit-uTarget),cSource,numCharsInTarget,&errorCode);
2886ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)){
2887ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ucnv_toUChars conversion failed, reason %s\n", u_errorName(errorCode));
2888ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
2889ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
2890ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uSource = source;
2891ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    while(uSource<uSourceLimit){
2892ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(*test!=*uSource){
2893ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2894ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("Expected : \\u%04X \t Got: \\u%04X\n",*uSource,(int)*test) ;
2895ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
2896ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uSource++;
2897ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        test++;
2898ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
2899ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(uBuf);
2900ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(cBuf);
2901ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
2902ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2903ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestSmallSourceBuffer(const uint16_t* source, const UChar* sourceLimit,UConverter* cnv){
2904ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const UChar* uSource;
2905ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const UChar* uSourceLimit;
2906ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* cSource;
2907ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* cSourceLimit;
2908ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *uTargetLimit =NULL;
2909ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *uTarget;
2910ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char *cTarget;
2911ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *cTargetLimit;
2912ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char *cBuf;
291350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UChar *uBuf; /*,*test;*/
2914ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t uBufSize = 120;
2915ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int len=0;
2916ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int i=2;
2917ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const UChar *temp = sourceLimit;
2918ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode errorCode=U_ZERO_ERROR;
2919ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uBuf =  (UChar*)malloc(uBufSize * sizeof(UChar)*5);
2920ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cBuf =(char*)malloc(uBufSize * sizeof(char) * 10);
2921ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2922ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_reset(cnv);
2923ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    for(;--i>0;){
2924ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uSource = (UChar*) source;
2925ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        cTarget = cBuf;
2926ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uTarget = uBuf;
2927ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        cSource = cBuf;
2928ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        cTargetLimit = cBuf;
2929ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uTargetLimit = uBuf+uBufSize*5;
2930ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        cTargetLimit = cTargetLimit+uBufSize*10;
2931ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uSourceLimit=uSource;
2932ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        do{
2933ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2934ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if (uSourceLimit < sourceLimit) {
2935ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                uSourceLimit = uSourceLimit+1;
2936ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
2937ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            ucnv_fromUnicode( cnv , &cTarget, cTargetLimit,&uSource,uSourceLimit,NULL,FALSE, &errorCode);
2938ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if(errorCode==U_BUFFER_OVERFLOW_ERROR){
2939ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru               errorCode=U_ZERO_ERROR;
2940ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                continue;
2941ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
2942ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2943ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if(U_FAILURE(errorCode)){
2944ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                log_err("ucnv_toUnicode conversion failed reason %s\n", u_errorName(errorCode));
2945ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                return;
2946ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
2947ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2948ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }while (uSource<temp);
2949ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2950ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        cSourceLimit =cBuf;
2951ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        do{
2952ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if (cSourceLimit < cBuf + (cTarget - cBuf)) {
2953ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                cSourceLimit = cSourceLimit+1;
2954ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
2955ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            ucnv_toUnicode(cnv,&uTarget,uTargetLimit,&cSource,cSourceLimit,NULL,FALSE,&errorCode);
2956ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if(errorCode==U_BUFFER_OVERFLOW_ERROR){
2957ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru               errorCode=U_ZERO_ERROR;
2958ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                continue;
2959ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
2960ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if(U_FAILURE(errorCode)){
2961ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                   log_err("ucnv_toUnicode conversion failed reason %s\n", u_errorName(errorCode));
2962ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    return;
2963ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
2964ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }while(cSource<cTarget);
2965ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
2966ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uSource = source;
296750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /*test =uBuf;*/
2968ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        for(;len<(int)(source - sourceLimit);len++){
2969ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if(uBuf[len]!=uSource[len]){
2970ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                log_err("Expected : \\u%04X \t Got: \\u%04X\n",uSource[len],(int)uBuf[len]) ;
2971ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
2972ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
2973ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
2974ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(uBuf);
2975ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(cBuf);
2976ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
2977ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
2978ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruTestGetNextUChar2022(UConverter* cnv, const char* source, const char* limit,
2979ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                     const uint16_t results[], const char* message){
298050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/*     const char* s0; */
2981ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     const char* s=(char*)source;
2982ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     const uint16_t *r=results;
2983ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     UErrorCode errorCode=U_ZERO_ERROR;
2984ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     uint32_t c,exC;
2985ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     ucnv_reset(cnv);
2986ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     while(s<limit) {
298750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho	 /* s0=s; */
2988ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        c=ucnv_getNextUChar(cnv, &s, limit, &errorCode);
2989ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(errorCode==U_INDEX_OUTOFBOUNDS_ERROR) {
2990ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            break; /* no more significant input */
2991ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        } else if(U_FAILURE(errorCode)) {
2992ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("%s ucnv_getNextUChar() failed: %s\n", message, u_errorName(errorCode));
2993ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            break;
2994ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        } else {
2995ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if(UTF_IS_FIRST_SURROGATE(*r)){
2996ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                int i =0, len = 2;
2997ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                UTF_NEXT_CHAR_SAFE(r, i, len, exC, FALSE);
2998ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                r++;
2999ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }else{
3000ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                exC = *r;
3001ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
3002ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if(c!=(uint32_t)(exC))
3003ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                log_err("%s ucnv_getNextUChar() Expected:  \\u%04X Got:  \\u%04X \n",message,(uint32_t) (*r),c);
3004ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
3005ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        r++;
3006ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
3007ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
3008ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3009ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic int TestJitterbug930(const char* enc){
3010ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode err = U_ZERO_ERROR;
3011ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UConverter*converter;
3012ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char out[80];
3013ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char*target = out;
3014ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar in[4];
3015ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const UChar*source = in;
3016ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t off[80];
3017ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t* offsets = off;
3018ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int numOffWritten=0;
3019ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UBool flush = 0;
3020ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    converter = my_ucnv_open(enc, &err);
3021ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3022ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    in[0] = 0x41;     /* 0x4E00;*/
3023ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    in[1] = 0x4E01;
3024ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    in[2] = 0x4E02;
3025ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    in[3] = 0x4E03;
3026ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3027ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    memset(off, '*', sizeof(off));
3028ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3029ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_fromUnicode (converter,
3030ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            &target,
3031ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            target+2,
3032ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            &source,
3033ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            source+3,
3034ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            offsets,
3035ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            flush,
3036ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            &err);
3037ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3038ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* writes three bytes into the output buffer: 41 1B 24
3039ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        * but offsets contains 0 1 1
3040ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    */
3041ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    while(*offsets< off[10]){
3042ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        numOffWritten++;
3043ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        offsets++;
3044ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
3045ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Testing Jitterbug 930 for encoding %s",enc);
3046ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(numOffWritten!= (int)(target-out)){
3047ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("Jitterbug 930 test for enc: %s failed. Expected: %i Got: %i",enc, (int)(target-out),numOffWritten);
3048ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
3049ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3050ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    err = U_ZERO_ERROR;
3051ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3052ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    memset(off,'*' , sizeof(off));
3053ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3054ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    flush = 1;
3055ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    offsets=off;
3056ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_fromUnicode (converter,
3057ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            &target,
3058ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            target+4,
3059ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            &source,
3060ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            source,
3061ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            offsets,
3062ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            flush,
3063ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            &err);
3064ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    numOffWritten=0;
3065ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    while(*offsets< off[10]){
3066ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        numOffWritten++;
3067ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(*offsets!= -1){
3068ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("Jitterbug 930 test for enc: %s failed. Expected: %i Got: %i",enc,-1,*offsets) ;
3069ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
3070ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        offsets++;
3071ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
3072ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3073ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* writes 42 43 7A into output buffer,
3074ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * offsets contains -1 -1 -1
3075ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     */
3076ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_close(converter);
3077ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return 0;
3078ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
3079ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3080ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
3081ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruTestHZ() {
3082ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* test input */
3083ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint16_t in[]={
3084ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x3000, 0x3001, 0x3002, 0x00B7, 0x02C9, 0x02C7, 0x00A8, 0x3003, 0x3005, 0x2014,
3085ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0xFF5E, 0x2016, 0x2026, 0x007E, 0x997C, 0x70B3, 0x75C5, 0x5E76, 0x73BB, 0x83E0,
3086ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x64AD, 0x62E8, 0x94B5, 0x000A, 0x6CE2, 0x535A, 0x52C3, 0x640F, 0x94C2, 0x7B94,
3087ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x4F2F, 0x5E1B, 0x8236, 0x000A, 0x8116, 0x818A, 0x6E24, 0x6CCA, 0x9A73, 0x6355,
3088ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x535C, 0x54FA, 0x8865, 0x000A, 0x57E0, 0x4E0D, 0x5E03, 0x6B65, 0x7C3F, 0x90E8,
3089ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x6016, 0x248F, 0x2490, 0x000A, 0x2491, 0x2492, 0x2493, 0x2494, 0x2495, 0x2496,
3090ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x2497, 0x2498, 0x2499, 0x000A, 0x249A, 0x249B, 0x2474, 0x2475, 0x2476, 0x2477,
3091ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x2478, 0x2479, 0x247A, 0x000A, 0x247B, 0x247C, 0x247D, 0x247E, 0x247F, 0x2480,
3092ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x2481, 0x2482, 0x2483, 0x000A, 0x0041, 0x0043, 0x0044, 0x0045, 0x0046, 0x007E,
3093ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x0048, 0x0049, 0x004A, 0x000A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050,
3094ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x0051, 0x0052, 0x0053, 0x000A, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059,
3095ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x005A, 0x005B, 0x005C, 0x000A
3096ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      };
3097ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const UChar* uSource;
3098ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const UChar* uSourceLimit;
3099ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* cSource;
3100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* cSourceLimit;
3101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *uTargetLimit =NULL;
3102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *uTarget;
3103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char *cTarget;
3104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *cTargetLimit;
3105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char *cBuf;
3106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *uBuf,*test;
3107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t uBufSize = 120;
3108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode errorCode=U_ZERO_ERROR;
3109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UConverter *cnv;
3110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t* offsets = (int32_t*) malloc(uBufSize * sizeof(int32_t) * 5);
3111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t* myOff= offsets;
3112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cnv=ucnv_open("HZ", &errorCode);
3113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
3114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_data_err("Unable to open HZ converter: %s\n", u_errorName(errorCode));
3115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
3116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
3117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uBuf =  (UChar*)malloc(uBufSize * sizeof(UChar)*5);
3119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cBuf =(char*)malloc(uBufSize * sizeof(char) * 5);
3120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uSource = (const UChar*)in;
3121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uSourceLimit=(const UChar*)in + (sizeof(in)/sizeof(in[0]));
3122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cTarget = cBuf;
3123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cTargetLimit = cBuf +uBufSize*5;
3124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uTarget = uBuf;
3125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uTargetLimit = uBuf+ uBufSize*5;
3126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_fromUnicode( cnv , &cTarget, cTargetLimit,&uSource,uSourceLimit,myOff,TRUE, &errorCode);
3127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)){
3128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ucnv_fromUnicode conversion failed reason %s\n", u_errorName(errorCode));
3129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
3130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
3131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cSource = cBuf;
3132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cSourceLimit =cTarget;
3133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    test =uBuf;
3134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    myOff=offsets;
3135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_toUnicode(cnv,&uTarget,uTargetLimit,&cSource,cSourceLimit,myOff,TRUE,&errorCode);
3136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)){
3137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ucnv_toUnicode conversion failed reason %s\n", u_errorName(errorCode));
3138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
3139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
3140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uSource = (const UChar*)in;
3141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    while(uSource<uSourceLimit){
3142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(*test!=*uSource){
3143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("Expected : \\u%04X \t Got: \\u%04X\n",*uSource,(int)*test) ;
3145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
3146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uSource++;
3147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        test++;
3148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
3149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestGetNextUChar2022(cnv, cBuf, cTarget, in, "HZ encoding");
3150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestSmallTargetBuffer(in,(const UChar*)in + (sizeof(in)/sizeof(in[0])),cnv);
3151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestSmallSourceBuffer(in,(const UChar*)in + (sizeof(in)/sizeof(in[0])),cnv);
3152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestToAndFromUChars(in,(const UChar*)in + (sizeof(in)/sizeof(in[0])),cnv);
3153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestJitterbug930("csISO2022JP");
3154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_close(cnv);
3155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(offsets);
3156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(uBuf);
3157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(cBuf);
3158ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
3159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
3161ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruTestISCII(){
3162ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* test input */
3163ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint16_t in[]={
3164ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* test full range of Devanagari */
3165ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0901,0x0902,0x0903,0x0905,0x0906,0x0907,0x0908,0x0909,0x090A,
3166ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x090B,0x090E,0x090F,0x0910,0x090D,0x0912,0x0913,0x0914,0x0911,
3167ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0915,0x0916,0x0917,0x0918,0x0919,0x091A,0x091B,0x091C,0x091D,
3168ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x091E,0x091F,0x0920,0x0921,0x0922,0x0923,0x0924,0x0925,0x0926,
3169ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0927,0x0928,0x0929,0x092A,0x092B,0x092C,0x092D,0x092E,0x092F,
3170ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x095F,0x0930,0x0931,0x0932,0x0933,0x0934,0x0935,0x0936,0x0937,
3171ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0938,0x0939,0x200D,0x093E,0x093F,0x0940,0x0941,0x0942,0x0943,
3172ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0946,0x0947,0x0948,0x0945,0x094A,0x094B,0x094C,0x0949,0x094D,
3173ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x093d,0x0966,0x0967,0x0968,0x0969,0x096A,0x096B,0x096C,
3174ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x096D,0x096E,0x096F,
3175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* test Soft halant*/
3176ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0915,0x094d, 0x200D,
3177ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* test explicit halant */
3178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0915,0x094d, 0x200c,
3179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* test double danda */
3180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x965,
3181ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* test ASCII */
3182ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x1B, 0x24, 0x29, 0x47, 0x0E, 0x23, 0x21, 0x23, 0x22, 0x23,
3183ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x23, 0x23, 0x24, 0x23, 0x25, 0x23, 0x26, 0x23, 0x27, 0x23,
3184ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x28, 0x23, 0x29, 0x23, 0x2A, 0x23, 0x2B, 0x0F, 0x2F, 0x2A,
3185ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* tests from Lotus */
3186ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0061,0x0915,0x000D,0x000A,0x0996,0x0043,
3187ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0930,0x094D,0x200D,
3188ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0901,0x000D,0x000A,0x0905,0x0985,0x0043,
3189ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0915,0x0921,0x002B,0x095F,
3190ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* tamil range */
3191ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0B86, 0xB87, 0xB88,
3192ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* telugu range */
3193ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0C05, 0x0C02, 0x0C03,0x0c31,
3194ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* kannada range */
3195ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0C85, 0xC82, 0x0C83,
3196ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* test Abbr sign and Anudatta */
3197ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0970, 0x952,
3198ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       /* 0x0958,
3199ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0959,
3200ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x095A,
3201ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x095B,
3202ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x095C,
3203ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x095D,
3204ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x095E,
3205ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x095F,*/
3206ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0960 /* Vocallic RRI 0xAB, 0xE9*/,
3207ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0944 /* Vowel Sign Vocallic RRI 0xDF, 0xE9 */,
3208ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x090C ,
3209ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0962,
3210ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0961 /* Vocallic LL 0xa6, 0xE9 */,
3211ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0963 /* Vowel Sign Vocallic LL 0xdb, 0xE9, */,
3212ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0950 /* OM Symbol 0xa1, 0xE9,*/,
3213ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x093D /* Avagraha  0xEA, 0xE9*/,
3214ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0958,
3215ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0959,
3216ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x095A,
3217ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x095B,
3218ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x095C,
3219ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x095D,
3220ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x095E,
3221ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0020, 0x094D, 0x0930, 0x0000, 0x00A0
3222ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      };
3223ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const unsigned char byteArr[]={
3224ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3225ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,
3226ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,
3227ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xbb,
3228ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xbc,0xbd,0xbe,0xbf,0xc0,0xc1,0xc2,0xc3,0xc4,
3229ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,
3230ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xce,0xcf,0xd0,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,
3231ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xd7,0xd8,0xd9,0xda,0xdb,0xdc,0xdd,0xde,0xdf,
3232ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,
3233ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xea,0xe9,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,
3234ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xf8,0xf9,0xfa,
3235ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* test soft halant */
3236ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xb3, 0xE8, 0xE9,
3237ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* test explicit halant */
3238ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xb3, 0xE8, 0xE8,
3239ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* test double danda */
3240ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xea, 0xea,
3241ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* test ASCII */
3242ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x1B, 0x24, 0x29, 0x47, 0x0E, 0x23, 0x21, 0x23, 0x22, 0x23,
3243ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x23, 0x23, 0x24, 0x23, 0x25, 0x23, 0x26, 0x23, 0x27, 0x23,
3244ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x28, 0x23, 0x29, 0x23, 0x2A, 0x23, 0x2B, 0x0F, 0x2F, 0x2A,
3245ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* test ATR code */
3246ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3247ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* tests from Lotus */
3248ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x61,0xEF,0x42,0xEF,0x30,0xB3,0x0D,0x0A,0xEF,0x43,0xB4,0x43,
3249ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xEF,0x42,0xCF,0xE8,0xD9,
3250ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xEF,0x42,0xA1,0x0D,0x0A,0xEF,0x42,0xA4,0xEF,0x43,0xA4,0x43,
3251ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xEF,0x42,0xB3,0xBF,0x2B,0xEF,0x42,0xCE,
3252ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* tamil range */
3253ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xEF, 0x44, 0xa5, 0xa6, 0xa7,
3254ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* telugu range */
3255ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xEF, 0x45,0xa4, 0xa2, 0xa3,0xd0,
3256ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* kannada range */
3257ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xEF, 0x48,0xa4, 0xa2, 0xa3,
3258ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* anudatta and abbreviation sign */
3259ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xEF, 0x42, 0xF0, 0xBF, 0xF0, 0xB8,
3260ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3261ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3262ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xAA, 0xE9,/* RI + NUKTA 0x0960*/
3263ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3264ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xDF, 0xE9,/* Vowel sign RI + NUKTA 0x0944*/
3265ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3266ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xa6, 0xE9,/* Vowel I + NUKTA 0x090C*/
3267ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3268ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xdb, 0xE9,/* Vowel sign I + Nukta 0x0962*/
3269ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3270ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xa7, 0xE9,/* Vowel II + NUKTA 0x0961*/
3271ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3272ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xdc, 0xE9,/* Vowel sign II + Nukta 0x0963*/
3273ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3274ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xa1, 0xE9,/* chandrabindu + Nukta 0x0950*/
3275ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3276ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xEA, 0xE9, /* Danda + Nukta 0x093D*/
3277ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3278ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xB3, 0xE9, /* Ka + NUKTA */
3279ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3280ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xB4, 0xE9, /* Kha + NUKTA */
3281ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3282ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xB5, 0xE9, /* Ga + NUKTA */
3283ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3284ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xBA, 0xE9,
3285ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3286ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xBF, 0xE9,
3287ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3288ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xC0, 0xE9,
3289ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3290ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xC9, 0xE9,
3291ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* INV halant RA    */
3292ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xD9, 0xE8, 0xCF,
3293ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x00, 0x00A0,
3294ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* just consume unhandled codepoints */
3295ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xEF, 0x30,
3296ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3297ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
3298ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    testConvertToU(byteArr,(sizeof(byteArr)),in,(sizeof(in)/U_SIZEOF_UCHAR),"x-iscii-de",NULL,TRUE);
3299ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestConv(in,(sizeof(in)/2),"ISCII,version=0","hindi", (char *)byteArr,sizeof(byteArr));
3300ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3301ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
3302ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3303ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
3304ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruTestISO_2022_JP() {
3305ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* test input */
3306ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint16_t in[]={
3307ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0041,/*0x00E9,*/0x3000, 0x3001, 0x3002, 0x0020, 0x000D, 0x000A,
3308ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x000D, 0x000A,
3309ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x000D, 0x000A,
3310ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x3005, 0x3006, 0x3007, 0x30FC, 0x2015, 0x2010, 0xFF0F, 0x005C, 0x000D, 0x000A,
3311c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru        0x3013, 0x2018, 0x2026, 0x2025, 0x2018, 0x2019, 0x201C, 0x000D, 0x000A,
3312ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x201D, 0x3014, 0x000D, 0x000A,
3313ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x000D, 0x000A,
3314ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x000D, 0x000A,
3315ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        };
3316ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const UChar* uSource;
3317ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const UChar* uSourceLimit;
3318ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* cSource;
3319ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* cSourceLimit;
3320ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *uTargetLimit =NULL;
3321ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *uTarget;
3322ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char *cTarget;
3323ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *cTargetLimit;
3324ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char *cBuf;
3325ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *uBuf,*test;
3326ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t uBufSize = 120;
3327ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode errorCode=U_ZERO_ERROR;
3328ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UConverter *cnv;
3329ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t* offsets = (int32_t*) malloc(uBufSize * sizeof(int32_t) * 5);
3330ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t* myOff= offsets;
3331ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cnv=ucnv_open("ISO_2022_JP_1", &errorCode);
3332ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
3333ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_data_err("Unable to open an ISO_2022_JP_1 converter: %s\n", u_errorName(errorCode));
3334ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
3335ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
3336ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3337ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uBuf =  (UChar*)malloc(uBufSize * sizeof(UChar)*5);
3338ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cBuf =(char*)malloc(uBufSize * sizeof(char) * 5);
3339ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uSource = (const UChar*)in;
3340ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uSourceLimit=(const UChar*)in + (sizeof(in)/sizeof(in[0]));
3341ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cTarget = cBuf;
3342ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cTargetLimit = cBuf +uBufSize*5;
3343ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uTarget = uBuf;
3344ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uTargetLimit = uBuf+ uBufSize*5;
3345ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_fromUnicode( cnv , &cTarget, cTargetLimit,&uSource,uSourceLimit,myOff,TRUE, &errorCode);
3346ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)){
3347ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ucnv_fromUnicode conversion failed reason %s\n", u_errorName(errorCode));
3348ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
3349ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
3350ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cSource = cBuf;
3351ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cSourceLimit =cTarget;
3352ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    test =uBuf;
3353ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    myOff=offsets;
3354ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_toUnicode(cnv,&uTarget,uTargetLimit,&cSource,cSourceLimit,myOff,TRUE,&errorCode);
3355ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)){
3356ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ucnv_toUnicode conversion failed reason %s\n", u_errorName(errorCode));
3357ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
3358ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
3359ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3360ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uSource = (const UChar*)in;
3361ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    while(uSource<uSourceLimit){
3362ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(*test!=*uSource){
3363ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3364ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("Expected : \\u%04X \t Got: \\u%04X\n",*uSource,(int)*test) ;
3365ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
3366ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uSource++;
3367ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        test++;
3368ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
3369ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3370ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestSmallTargetBuffer(in,(const UChar*)in + (sizeof(in)/sizeof(in[0])),cnv);
3371ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestSmallSourceBuffer(in,(const UChar*)in + (sizeof(in)/sizeof(in[0])),cnv);
3372ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestGetNextUChar2022(cnv, cBuf, cTarget, in, "ISO-2022-JP encoding");
3373ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestToAndFromUChars(in,(const UChar*)in + (sizeof(in)/sizeof(in[0])),cnv);
3374ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestJitterbug930("csISO2022JP");
3375ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_close(cnv);
3376ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(uBuf);
3377ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(cBuf);
3378ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(offsets);
3379ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
3380ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3381ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestConv(const uint16_t in[],int len, const char* conv, const char* lang, char byteArr[],int byteArrLen){
3382ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const UChar* uSource;
3383ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const UChar* uSourceLimit;
3384ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* cSource;
3385ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* cSourceLimit;
3386ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *uTargetLimit =NULL;
3387ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *uTarget;
3388ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char *cTarget;
3389ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *cTargetLimit;
3390ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char *cBuf;
3391ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *uBuf,*test;
3392ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t uBufSize = 120*10;
3393ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode errorCode=U_ZERO_ERROR;
3394ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UConverter *cnv;
3395ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t* offsets = (int32_t*) malloc(uBufSize * sizeof(int32_t) );
3396ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t* myOff= offsets;
3397ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cnv=my_ucnv_open(conv, &errorCode);
3398ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
3399ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_data_err("Unable to open a %s converter: %s\n", conv, u_errorName(errorCode));
3400ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
3401ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
3402ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3403ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uBuf =  (UChar*)malloc(uBufSize * sizeof(UChar));
3404ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cBuf =(char*)malloc(uBufSize * sizeof(char));
3405ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uSource = (const UChar*)in;
3406ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uSourceLimit=uSource+len;
3407ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cTarget = cBuf;
3408ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cTargetLimit = cBuf +uBufSize;
3409ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uTarget = uBuf;
3410ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uTargetLimit = uBuf+ uBufSize;
3411ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_fromUnicode( cnv , &cTarget, cTargetLimit,&uSource,uSourceLimit,myOff,TRUE, &errorCode);
3412ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)){
3413ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ucnv_fromUnicode conversion failed reason %s\n", u_errorName(errorCode));
3414ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
3415ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
3416ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*log_verbose("length of compressed string for language %s using %s:%i \n",conv,lang,(cTarget-cBuf));*/
3417ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cSource = cBuf;
3418ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cSourceLimit =cTarget;
3419ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    test =uBuf;
3420ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    myOff=offsets;
3421ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_toUnicode(cnv,&uTarget,uTargetLimit,&cSource,cSourceLimit,myOff,TRUE,&errorCode);
3422ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)){
3423ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ucnv_toUnicode conversion failed, reason: %s\n", u_errorName(errorCode));
3424ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
3425ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
3426ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3427ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uSource = (const UChar*)in;
3428ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    while(uSource<uSourceLimit){
3429ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(*test!=*uSource){
3430ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("for codepage %s : Expected : \\u%04X \t Got: \\u%04X\n",conv,*uSource,(int)*test) ;
3431ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
3432ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uSource++;
3433ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        test++;
3434ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
3435ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestSmallTargetBuffer(in,(const UChar*)&in[len],cnv);
3436ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestSmallSourceBuffer(in,(const UChar*)&in[len],cnv);
3437ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestGetNextUChar2022(cnv, cBuf, cTarget, in, conv);
3438ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(byteArr && byteArrLen!=0){
3439ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TestGetNextUChar2022(cnv, byteArr, (byteArr+byteArrLen), in, lang);
3440ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TestToAndFromUChars(in,(const UChar*)&in[len],cnv);
3441ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {
3442ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            cSource = byteArr;
3443ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            cSourceLimit = cSource+byteArrLen;
3444ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            test=uBuf;
3445ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            myOff = offsets;
3446ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            ucnv_toUnicode(cnv,&uTarget,uTargetLimit,&cSource,cSourceLimit,myOff,TRUE,&errorCode);
3447ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if(U_FAILURE(errorCode)){
3448ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                log_err("ucnv_toUnicode conversion failed reason %s\n", u_errorName(errorCode));
3449ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                return;
3450ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
3451ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3452ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            uSource = (const UChar*)in;
3453ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            while(uSource<uSourceLimit){
3454ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                if(*test!=*uSource){
3455ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    log_err("Expected : \\u%04X \t Got: \\u%04X\n",*uSource,(int)*test) ;
3456ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                }
3457ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                uSource++;
3458ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                test++;
3459ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
3460ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
3461ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
3462ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3463ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_close(cnv);
3464ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(uBuf);
3465ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(cBuf);
3466ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(offsets);
3467ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
3468ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic UChar U_CALLCONV
3469ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru_charAt(int32_t offset, void *context) {
3470ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return ((char*)context)[offset];
3471ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
3472ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3473ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic int32_t
3474ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruunescape(UChar* dst, int32_t dstLen,const char* src,int32_t srcLen,UErrorCode *status){
3475ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t srcIndex=0;
3476ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t dstIndex=0;
3477ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(*status)){
3478ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return 0;
3479ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
3480ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if((dst==NULL && dstLen>0) || (src==NULL ) || dstLen < -1 || srcLen <-1 ){
3481ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        *status = U_ILLEGAL_ARGUMENT_ERROR;
3482ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return 0;
3483ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
3484ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(srcLen==-1){
3485ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        srcLen = (int32_t)uprv_strlen(src);
3486ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
3487ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3488ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    for (; srcIndex<srcLen; ) {
3489ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UChar32 c = src[srcIndex++];
3490ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (c == 0x005C /*'\\'*/) {
3491ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            c = u_unescapeAt(_charAt,&srcIndex,srcLen,(void*)src); /* advances i*/
3492ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if (c == (UChar32)0xFFFFFFFF) {
3493ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                *status=U_INVALID_CHAR_FOUND; /* return empty string */
3494ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                break; /* invalid escape sequence */
3495ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
3496ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
3497ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(dstIndex < dstLen){
3498ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if(c>0xFFFF){
3499ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru               dst[dstIndex++] = UTF16_LEAD(c);
3500ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru               if(dstIndex<dstLen){
3501ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    dst[dstIndex]=UTF16_TRAIL(c);
3502ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru               }else{
3503ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                   *status=U_BUFFER_OVERFLOW_ERROR;
3504ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru               }
3505ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }else{
3506ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                dst[dstIndex]=(UChar)c;
3507ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
3508ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3509ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }else{
3510ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            *status = U_BUFFER_OVERFLOW_ERROR;
3511ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
3512ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        dstIndex++; /* for preflighting */
3513ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
3514ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return dstIndex;
3515ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
3516ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3517ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
3518ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruTestFullRoundtrip(const char* cp){
3519ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar usource[10] ={0};
3520ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar nsrc[10] = {0};
3521ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uint32_t i=1;
3522ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int len=0, ulen;
3523ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    nsrc[0]=0x0061;
3524ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* Test codepoint 0 */
3525ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestConv(usource,1,cp,"",NULL,0);
3526ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestConv(usource,2,cp,"",NULL,0);
3527ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    nsrc[2]=0x5555;
3528ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestConv(nsrc,3,cp,"",NULL,0);
3529ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3530ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    for(;i<=0x10FFFF;i++){
3531ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(i==0xD800){
3532ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            i=0xDFFF;
3533ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            continue;
3534ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
3535ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(i<=0xFFFF){
3536ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            usource[0] =(UChar) i;
3537ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            len=1;
3538ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }else{
3539ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            usource[0]=UTF16_LEAD(i);
3540ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            usource[1]=UTF16_TRAIL(i);
3541ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            len=2;
3542ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
3543ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ulen=len;
3544ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(i==0x80) {
3545ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            usource[2]=0;
3546ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
3547ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* Test only single code points */
3548ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TestConv(usource,ulen,cp,"",NULL,0);
3549ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* Test codepoint repeated twice */
3550ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        usource[ulen]=usource[0];
3551ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        usource[ulen+1]=usource[1];
3552ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ulen+=len;
3553ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TestConv(usource,ulen,cp,"",NULL,0);
3554ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* Test codepoint repeated 3 times */
3555ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        usource[ulen]=usource[0];
3556ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        usource[ulen+1]=usource[1];
3557ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ulen+=len;
3558ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TestConv(usource,ulen,cp,"",NULL,0);
3559ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* Test codepoint in between 2 codepoints */
3560ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        nsrc[1]=usource[0];
3561ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        nsrc[2]=usource[1];
3562ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        nsrc[len+1]=0x5555;
3563ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TestConv(nsrc,len+2,cp,"",NULL,0);
3564ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uprv_memset(usource,0,sizeof(UChar)*10);
3565ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
3566ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
3567ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3568ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
3569ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruTestRoundTrippingAllUTF(void){
357027f654740f2a26ad62a5c155af9199af9e69b889claireho    if(!getTestOption(QUICK_OPTION)){
3571ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("Running exhaustive round trip test for BOCU-1\n");
3572ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TestFullRoundtrip("BOCU-1");
3573ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("Running exhaustive round trip test for SCSU\n");
3574ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TestFullRoundtrip("SCSU");
3575ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("Running exhaustive round trip test for UTF-8\n");
3576ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TestFullRoundtrip("UTF-8");
3577ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("Running exhaustive round trip test for CESU-8\n");
3578ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TestFullRoundtrip("CESU-8");
3579ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("Running exhaustive round trip test for UTF-16BE\n");
3580ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TestFullRoundtrip("UTF-16BE");
3581ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("Running exhaustive round trip test for UTF-16LE\n");
3582ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TestFullRoundtrip("UTF-16LE");
3583ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("Running exhaustive round trip test for UTF-16\n");
3584ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TestFullRoundtrip("UTF-16");
3585ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("Running exhaustive round trip test for UTF-32BE\n");
3586ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TestFullRoundtrip("UTF-32BE");
3587ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("Running exhaustive round trip test for UTF-32LE\n");
3588ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TestFullRoundtrip("UTF-32LE");
3589ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("Running exhaustive round trip test for UTF-32\n");
3590ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TestFullRoundtrip("UTF-32");
3591ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("Running exhaustive round trip test for UTF-7\n");
3592ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TestFullRoundtrip("UTF-7");
3593ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("Running exhaustive round trip test for UTF-7\n");
3594ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TestFullRoundtrip("UTF-7,version=1");
3595ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("Running exhaustive round trip test for IMAP-mailbox-name\n");
3596ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TestFullRoundtrip("IMAP-mailbox-name");
3597b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        /*
3598b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         *
3599b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         * With the update to GB18030 2005 (Ticket #8274), this test will fail because the 2005 version of
3600b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         * GB18030 contains mappings to actual Unicode codepoints (which were previously mapped to PUA).
3601b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         * The old mappings remain as fallbacks.
3602b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         * This test may be reintroduced at a later time.
3603b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         *
3604b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         * 110118 - mow
3605b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         */
3606b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         /*
3607b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         log_verbose("Running exhaustive round trip test for GB18030\n");
3608b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         TestFullRoundtrip("GB18030");
3609b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho         */
3610ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
3611ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
3612ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3613ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
3614ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruTestSCSU() {
3615ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3616ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint16_t germanUTF16[]={
3617ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x00d6, 0x006c, 0x0020, 0x0066, 0x006c, 0x0069, 0x0065, 0x00df, 0x0074
3618ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
3619ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3620ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint8_t germanSCSU[]={
3621ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xd6, 0x6c, 0x20, 0x66, 0x6c, 0x69, 0x65, 0xdf, 0x74
3622ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
3623ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3624ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint16_t russianUTF16[]={
3625ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x041c, 0x043e, 0x0441, 0x043a, 0x0432, 0x0430
3626ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
3627ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3628ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint8_t russianSCSU[]={
3629ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x12, 0x9c, 0xbe, 0xc1, 0xba, 0xb2, 0xb0
3630ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
3631ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3632ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint16_t japaneseUTF16[]={
3633ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x3000, 0x266a, 0x30ea, 0x30f3, 0x30b4, 0x53ef, 0x611b,
3634ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x3044, 0x3084, 0x53ef, 0x611b, 0x3044, 0x3084, 0x30ea, 0x30f3,
3635ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x30b4, 0x3002, 0x534a, 0x4e16, 0x7d00, 0x3082, 0x524d, 0x306b,
3636ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x6d41, 0x884c, 0x3057, 0x305f, 0x300c, 0x30ea, 0x30f3, 0x30b4,
3637ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x306e, 0x6b4c, 0x300d, 0x304c, 0x3074, 0x3063, 0x305f, 0x308a,
3638ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x3059, 0x308b, 0x304b, 0x3082, 0x3057, 0x308c, 0x306a, 0x3044,
3639ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x3002, 0x7c73, 0x30a2, 0x30c3, 0x30d7, 0x30eb, 0x30b3, 0x30f3,
3640ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x30d4, 0x30e5, 0x30fc, 0x30bf, 0x793e, 0x306e, 0x30d1, 0x30bd,
3641ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x30b3, 0x30f3, 0x300c, 0x30de, 0x30c3, 0x30af, 0xff08, 0x30de,
3642ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x30c3, 0x30ad, 0x30f3, 0x30c8, 0x30c3, 0x30b7, 0x30e5, 0xff09,
3643ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x300d, 0x3092, 0x3001, 0x3053, 0x3088, 0x306a, 0x304f, 0x611b,
3644ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x3059, 0x308b, 0x4eba, 0x305f, 0x3061, 0x306e, 0x3053, 0x3068,
3645ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x3060, 0x3002, 0x300c, 0x30a2, 0x30c3, 0x30d7, 0x30eb, 0x4fe1,
3646ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x8005, 0x300d, 0x306a, 0x3093, 0x3066, 0x8a00, 0x3044, 0x65b9,
3647ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x307e, 0x3067, 0x3042, 0x308b, 0x3002
3648ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
3649ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3650ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* SCSUEncoder produces a slightly longer result (179B vs. 178B) because of one different choice:
3651ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     it uses an SQn once where a longer look-ahead could have shown that SCn is more efficient */
3652ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint8_t japaneseSCSU[]={
3653ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x08, 0x00, 0x1b, 0x4c, 0xea, 0x16, 0xca, 0xd3, 0x94, 0x0f, 0x53, 0xef, 0x61, 0x1b, 0xe5, 0x84,
3654ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xc4, 0x0f, 0x53, 0xef, 0x61, 0x1b, 0xe5, 0x84, 0xc4, 0x16, 0xca, 0xd3, 0x94, 0x08, 0x02, 0x0f,
3655ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x53, 0x4a, 0x4e, 0x16, 0x7d, 0x00, 0x30, 0x82, 0x52, 0x4d, 0x30, 0x6b, 0x6d, 0x41, 0x88, 0x4c,
3656ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xe5, 0x97, 0x9f, 0x08, 0x0c, 0x16, 0xca, 0xd3, 0x94, 0x15, 0xae, 0x0e, 0x6b, 0x4c, 0x08, 0x0d,
3657ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x8c, 0xb4, 0xa3, 0x9f, 0xca, 0x99, 0xcb, 0x8b, 0xc2, 0x97, 0xcc, 0xaa, 0x84, 0x08, 0x02, 0x0e,
3658ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x7c, 0x73, 0xe2, 0x16, 0xa3, 0xb7, 0xcb, 0x93, 0xd3, 0xb4, 0xc5, 0xdc, 0x9f, 0x0e, 0x79, 0x3e,
3659ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x06, 0xae, 0xb1, 0x9d, 0x93, 0xd3, 0x08, 0x0c, 0xbe, 0xa3, 0x8f, 0x08, 0x88, 0xbe, 0xa3, 0x8d,
3660ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xd3, 0xa8, 0xa3, 0x97, 0xc5, 0x17, 0x89, 0x08, 0x0d, 0x15, 0xd2, 0x08, 0x01, 0x93, 0xc8, 0xaa,
3661ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x8f, 0x0e, 0x61, 0x1b, 0x99, 0xcb, 0x0e, 0x4e, 0xba, 0x9f, 0xa1, 0xae, 0x93, 0xa8, 0xa0, 0x08,
3662ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x02, 0x08, 0x0c, 0xe2, 0x16, 0xa3, 0xb7, 0xcb, 0x0f, 0x4f, 0xe1, 0x80, 0x05, 0xec, 0x60, 0x8d,
3663ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xea, 0x06, 0xd3, 0xe6, 0x0f, 0x8a, 0x00, 0x30, 0x44, 0x65, 0xb9, 0xe4, 0xfe, 0xe7, 0xc2, 0x06,
3664ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xcb, 0x82
3665ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
3666ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3667ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint16_t allFeaturesUTF16[]={
3668ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0041, 0x00df, 0x0401, 0x015f, 0x00df, 0x01df, 0xf000, 0xdbff,
3669ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xdfff, 0x000d, 0x000a, 0x0041, 0x00df, 0x0401, 0x015f, 0x00df,
3670ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x01df, 0xf000, 0xdbff, 0xdfff
3671ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
3672ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3673ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* see comment at japaneseSCSU: the same kind of different choice yields a slightly shorter
3674ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * result here (34B vs. 35B)
3675ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     */
3676ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint8_t allFeaturesSCSU[]={
3677ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x41, 0xdf, 0x12, 0x81, 0x03, 0x5f, 0x10, 0xdf, 0x1b, 0x03,
3678ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xdf, 0x1c, 0x88, 0x80, 0x0b, 0xbf, 0xff, 0xff, 0x0d, 0x0a,
3679ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x41, 0x10, 0xdf, 0x12, 0x81, 0x03, 0x5f, 0x10, 0xdf, 0x13,
3680ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xdf, 0x14, 0x80, 0x15, 0xff
3681ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
3682ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint16_t monkeyIn[]={
3683ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x00A8, 0x3003, 0x3005, 0x2015, 0xFF5E, 0x2016, 0x2026, 0x2018, 0x000D, 0x000A,
3684ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x2019, 0x201C, 0x201D, 0x3014, 0x3015, 0x3008, 0x3009, 0x300A, 0x000D, 0x000A,
3685ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x300B, 0x300C, 0x300D, 0x300E, 0x300F, 0x3016, 0x3017, 0x3010, 0x000D, 0x000A,
3686ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x3011, 0x00B1, 0x00D7, 0x00F7, 0x2236, 0x2227, 0x7FC1, 0x8956, 0x000D, 0x000A,
3687ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x9D2C, 0x9D0E, 0x9EC4, 0x5CA1, 0x6C96, 0x837B, 0x5104, 0x5C4B, 0x000D, 0x000A,
3688ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x61B6, 0x81C6, 0x6876, 0x7261, 0x4E59, 0x4FFA, 0x5378, 0x57F7, 0x000D, 0x000A,
3689ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x57F4, 0x57F9, 0x57FA, 0x57FC, 0x5800, 0x5802, 0x5805, 0x5806, 0x000D, 0x000A,
3690ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x580A, 0x581E, 0x6BB5, 0x6BB7, 0x6BBA, 0x6BBC, 0x9CE2, 0x977C, 0x000D, 0x000A,
3691ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x6BBF, 0x6BC1, 0x6BC5, 0x6BC6, 0x6BCB, 0x6BCD, 0x6BCF, 0x6BD2, 0x000D, 0x000A,
3692ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x6BD3, 0x6BD4, 0x6BD6, 0x6BD7, 0x6BD8, 0x6BDB, 0x6BEB, 0x6BEC, 0x000D, 0x000A,
3693ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x6C05, 0x6C08, 0x6C0F, 0x6C11, 0x6C13, 0x6C23, 0x6C34, 0x0041, 0x000D, 0x000A,
3694ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x000D, 0x000A,
3695ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x000D, 0x000A,
3696ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x000D, 0x000A,
3697ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x005B, 0x9792, 0x9CCC, 0x9CCD, 0x9CCE, 0x9CCF, 0x9CD0, 0x9CD3, 0x000D, 0x000A,
3698ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x9CD4, 0x9CD5, 0x9CD7, 0x9CD8, 0x9CD9, 0x9CDC, 0x9CDD, 0x9CDF, 0x000D, 0x000A,
3699ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x9785, 0x9791, 0x00BD, 0x0390, 0x0385, 0x0386, 0x0388, 0x0389, 0x000D, 0x000A,
3700ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x038E, 0x038F, 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x000D, 0x000A,
3701ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x038A, 0x038C, 0x039C, 0x000D, 0x000A,
3702ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* test non-BMP code points */
3703ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xD869, 0xDE99, 0xD869, 0xDE9C, 0xD869, 0xDE9D, 0xD869, 0xDE9E, 0xD869, 0xDE9F,
3704ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xD869, 0xDEA0, 0xD869, 0xDEA5, 0xD869, 0xDEA6, 0xD869, 0xDEA7, 0xD869, 0xDEA8,
3705ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xD869, 0xDEAB, 0xD869, 0xDEAC, 0xD869, 0xDEAD, 0xD869, 0xDEAE, 0xD869, 0xDEAF,
3706ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xD869, 0xDEB0, 0xD869, 0xDEB1, 0xD869, 0xDEB3, 0xD869, 0xDEB5, 0xD869, 0xDEB6,
3707ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xD869, 0xDEB7, 0xD869, 0xDEB8, 0xD869, 0xDEB9, 0xD869, 0xDEBA, 0xD869, 0xDEBB,
3708ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xD869, 0xDEBC, 0xD869, 0xDEBD, 0xD869, 0xDEBE, 0xD869, 0xDEBF, 0xD869, 0xDEC0,
3709ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xD869, 0xDEC1, 0xD869, 0xDEC2, 0xD869, 0xDEC3, 0xD869, 0xDEC4, 0xD869, 0xDEC8,
3710ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xD869, 0xDECA, 0xD869, 0xDECB, 0xD869, 0xDECD, 0xD869, 0xDECE, 0xD869, 0xDECF,
3711ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xD869, 0xDED0, 0xD869, 0xDED1, 0xD869, 0xDED2, 0xD869, 0xDED3, 0xD869, 0xDED4,
3712ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xD869, 0xDED5, 0xD800, 0xDC00, 0xD800, 0xDC00, 0xD800, 0xDC00, 0xDBFF, 0xDFFF,
3713ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xDBFF, 0xDFFF, 0xDBFF, 0xDFFF,
3714ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3715ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3716ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x4DB3, 0x4DB4, 0x4DB5, 0x4E00, 0x4E00, 0x4E01, 0x4E02, 0x4E03, 0x000D, 0x000A,
3717ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x33E0, 0x33E6, 0x000D, 0x000A,
3718ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x4E05, 0x4E07, 0x4E04, 0x4E08, 0x4E08, 0x4E09, 0x4E0A, 0x4E0B, 0x000D, 0x000A,
3719ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x4E0C, 0x0021, 0x0022, 0x0023, 0x0024, 0xFF40, 0xFF41, 0xFF42, 0x000D, 0x000A,
3720ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0x000D, 0x000A,
3721ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
3722ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const char *fTestCases [] = {
3723ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          "\\ud800\\udc00", /* smallest surrogate*/
3724ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          "\\ud8ff\\udcff",
3725ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          "\\udBff\\udFff", /* largest surrogate pair*/
3726ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          "\\ud834\\udc00",
3727ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          "\\U0010FFFF",
3728ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          "Hello \\u9292 \\u9192 World!",
3729ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          "Hell\\u0429o \\u9292 \\u9192 W\\u00e4rld!",
3730ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          "Hell\\u0429o \\u9292 \\u9292W\\u00e4rld!",
3731ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3732ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          "\\u0648\\u06c8", /* catch missing reset*/
3733ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          "\\u0648\\u06c8",
3734ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3735ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          "\\u4444\\uE001", /* lowest quotable*/
3736ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          "\\u4444\\uf2FF", /* highest quotable*/
3737ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          "\\u4444\\uf188\\u4444",
3738ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          "\\u4444\\uf188\\uf288",
3739ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          "\\u4444\\uf188abc\\u0429\\uf288",
3740ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          "\\u9292\\u2222",
3741ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          "Hell\\u0429\\u04230o \\u9292 \\u9292W\\u00e4\\u0192rld!",
3742ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          "Hell\\u0429o \\u9292 \\u9292W\\u00e4rld!",
3743ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          "Hello World!123456",
3744ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          "Hello W\\u0081\\u011f\\u0082!", /* Latin 1 run*/
3745ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3746ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          "abc\\u0301\\u0302",  /* uses SQn for u301 u302*/
3747ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          "abc\\u4411d",      /* uses SQU*/
3748ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          "abc\\u4411\\u4412d",/* uses SCU*/
3749ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          "abc\\u0401\\u0402\\u047f\\u00a5\\u0405", /* uses SQn for ua5*/
3750ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          "\\u9191\\u9191\\u3041\\u9191\\u3041\\u3041\\u3000", /* SJIS like data*/
3751ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          "\\u9292\\u2222",
3752ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          "\\u9191\\u9191\\u3041\\u9191\\u3041\\u3041\\u3000",
3753ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          "\\u9999\\u3051\\u300c\\u9999\\u9999\\u3060\\u9999\\u3065\\u3065\\u3065\\u300c",
3754ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          "\\u3000\\u266a\\u30ea\\u30f3\\u30b4\\u53ef\\u611b\\u3044\\u3084\\u53ef\\u611b\\u3044\\u3084\\u30ea\\u30f3\\u30b4\\u3002",
3755ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3756ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          "", /* empty input*/
3757ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          "\\u0000", /* smallest BMP character*/
3758ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          "\\uFFFF", /* largest BMP character*/
3759ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3760ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          /* regression tests*/
3761ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          "\\u6441\\ub413\\ua733\\uf8fe\\ueedb\\u587f\\u195f\\u4899\\uf23d\\u49fd\\u0aac\\u5792\\ufc22\\ufc3c\\ufc46\\u00aa",
3762ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          "\\u00df\\u01df\\uf000\\udbff\\udfff\\u000d\n\\u0041\\u00df\\u0401\\u015f\\u00df\\u01df\\uf000\\udbff\\udfff",
3763ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          "\\u30f9\\u8321\\u05e5\\u181c\\ud72b\\u2019\\u99c9\\u2f2f\\uc10c\\u82e1\\u2c4d\\u1ebc\\u6013\\u66dc\\ubbde\\u94a5\\u4726\\u74af\\u3083\\u55b9\\u000c",
3764ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          "\\u0041\\u00df\\u0401\\u015f",
3765ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          "\\u9066\\u2123abc",
3766ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          "\\ud266\\u43d7\\u\\ue386\\uc9c0\\u4a6b\\u9222\\u901f\\u7410\\ua63f\\u539b\\u9596\\u482e\\u9d47\\ucfe4\\u7b71\\uc280\\uf26a\\u982f\\u862a\\u4edd\\uf513\\ufda6\\u869d\\u2ee0\\ua216\\u3ff6\\u3c70\\u89c0\\u9576\\ud5ec\\ubfda\\u6cca\\u5bb3\\ubcea\\u554c\\u914e\\ufa4a\\uede3\\u2990\\ud2f5\\u2729\\u5141\\u0f26\\uccd8\\u5413\\ud196\\ubbe2\\u51b9\\u9b48\\u0dc8\\u2195\\u21a2\\u21e9\\u00e4\\u9d92\\u0bc0\\u06c5",
3767ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          "\\uf95b\\u2458\\u2468\\u0e20\\uf51b\\ue36e\\ubfc1\\u0080\\u02dd\\uf1b5\\u0cf3\\u6059\\u7489",
3768ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
3769ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int i=0;
3770ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    for(;i<sizeof(fTestCases)/sizeof(*fTestCases);i++){
3771ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        const char* cSrc = fTestCases[i];
3772ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
3773ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        int32_t cSrcLen,srcLen;
3774ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UChar* src;
3775ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* UConverter* cnv = ucnv_open("SCSU",&status); */
3776ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        cSrcLen = srcLen = (int32_t)uprv_strlen(fTestCases[i]);
3777ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        src = (UChar*) malloc((sizeof(UChar) * srcLen) + sizeof(UChar));
3778ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        srcLen=unescape(src,srcLen,cSrc,cSrcLen,&status);
3779ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_verbose("Testing roundtrip for src: %s at index :%d\n",cSrc,i);
3780ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TestConv(src,srcLen,"SCSU","Coverage",NULL,0);
3781ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        free(src);
3782ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
3783ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestConv(allFeaturesUTF16,(sizeof(allFeaturesUTF16)/2),"SCSU","all features", (char *)allFeaturesSCSU,sizeof(allFeaturesSCSU));
3784ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestConv(allFeaturesUTF16,(sizeof(allFeaturesUTF16)/2),"SCSU","all features",(char *)allFeaturesSCSU,sizeof(allFeaturesSCSU));
3785ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestConv(japaneseUTF16,(sizeof(japaneseUTF16)/2),"SCSU","japaneese",(char *)japaneseSCSU,sizeof(japaneseSCSU));
3786ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestConv(japaneseUTF16,(sizeof(japaneseUTF16)/2),"SCSU,locale=ja","japaneese",(char *)japaneseSCSU,sizeof(japaneseSCSU));
3787ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestConv(germanUTF16,(sizeof(germanUTF16)/2),"SCSU","german",(char *)germanSCSU,sizeof(germanSCSU));
3788ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestConv(russianUTF16,(sizeof(russianUTF16)/2), "SCSU","russian",(char *)russianSCSU,sizeof(russianSCSU));
3789ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestConv(monkeyIn,(sizeof(monkeyIn)/2),"SCSU","monkey",NULL,0);
3790ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
3791ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3792ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if !UCONFIG_NO_LEGACY_CONVERSION
3793ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestJitterbug2346(){
3794ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char source[] = { 0x1b,0x24,0x42,0x3d,0x45,0x1b,0x28,0x4a,0x0d,0x0a,
3795ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                      0x1b,0x24,0x42,0x3d,0x45,0x1b,0x28,0x4a,0x0d,0x0a};
3796ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uint16_t expected[] = {0x91CD,0x000D,0x000A,0x91CD,0x000D,0x000A};
3797ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3798ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar uTarget[500]={'\0'};
3799ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar* utarget=uTarget;
3800ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar* utargetLimit=uTarget+sizeof(uTarget)/2;
3801ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3802ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char cTarget[500]={'\0'};
3803ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char* ctarget=cTarget;
3804ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char* ctargetLimit=cTarget+sizeof(cTarget);
3805ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* csource=source;
3806ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar* temp = expected;
3807ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode err=U_ZERO_ERROR;
3808ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3809ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UConverter* conv =ucnv_open("ISO_2022_JP",&err);
3810ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(err)) {
3811ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_data_err("Unable to open a iso-2022 converter: %s\n", u_errorName(err));
3812ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
3813ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
3814ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_toUnicode(conv,&utarget,utargetLimit,&csource,csource+sizeof(source),NULL,TRUE,&err);
3815ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(err)) {
3816ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ISO_2022_JP to Unicode conversion failed: %s\n", u_errorName(err));
3817ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
3818ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
3819ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    utargetLimit=utarget;
3820ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    utarget = uTarget;
3821ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    while(utarget<utargetLimit){
3822ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(*temp!=*utarget){
3823ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3824ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("Expected : \\u%04X \t Got: \\u%04X\n",*utarget,(int)*temp) ;
3825ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
3826ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        utarget++;
3827ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        temp++;
3828ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
3829ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_fromUnicode(conv,&ctarget,ctargetLimit,(const UChar**)&utarget,utargetLimit,NULL,TRUE,&err);
3830ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(err)) {
3831ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ISO_2022_JP from Unicode conversion failed: %s\n", u_errorName(err));
3832ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
3833ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
3834ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ctargetLimit=ctarget;
3835ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ctarget =cTarget;
3836ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_close(conv);
3837ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3838ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3839ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
3840ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3841ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
3842ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruTestISO_2022_JP_1() {
3843ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* test input */
3844ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint16_t in[]={
3845ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x3000, 0x3001, 0x3002, 0x0020, 0xFF0E, 0x30FB, 0xFF1A, 0xFF1B, 0x000D, 0x000A,
3846ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x000D, 0x000A,
3847ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x52C8, 0x52CC, 0x52CF, 0x52D1, 0x52D4, 0x52D6, 0x52DB, 0x52DC, 0x000D, 0x000A,
3848ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x000D, 0x000A,
3849ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x3005, 0x3006, 0x3007, 0x30FC, 0x2015, 0x2010, 0xFF0F, 0x005C, 0x000D, 0x000A,
3850c0f3e2506e4cc62ff8c220fe72849728e9d6cecfJean-Baptiste Queru        0x3013, 0x2018, 0x2026, 0x2025, 0x2018, 0x2019, 0x201C, 0x000D, 0x000A,
3851ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x201D, 0x000D, 0x000A,
3852ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x000D, 0x000A,
3853ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x4F94, 0x4F97, 0x52BA, 0x52BB, 0x52BD, 0x52C0, 0x52C4, 0x52C6, 0x000D, 0x000A,
3854ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x000D, 0x000A,
3855ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x4F78, 0x4F79, 0x4F7A, 0x4F7D, 0x4F7E, 0x4F81, 0x4F82, 0x4F84, 0x000D, 0x000A,
3856ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x4F85, 0x4F89, 0x4F8A, 0x4F8C, 0x4F8E, 0x4F90, 0x4F92, 0x4F93, 0x000D, 0x000A,
3857ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x52E1, 0x52E5, 0x52E8, 0x52E9, 0x000D, 0x000A
3858ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      };
3859ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const UChar* uSource;
3860ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const UChar* uSourceLimit;
3861ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* cSource;
3862ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* cSourceLimit;
3863ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *uTargetLimit =NULL;
3864ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *uTarget;
3865ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char *cTarget;
3866ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *cTargetLimit;
3867ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char *cBuf;
3868ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *uBuf,*test;
3869ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t uBufSize = 120;
3870ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode errorCode=U_ZERO_ERROR;
3871ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UConverter *cnv;
3872ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3873ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cnv=ucnv_open("ISO_2022_JP_1", &errorCode);
3874ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
3875ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_data_err("Unable to open a iso-2022 converter: %s\n", u_errorName(errorCode));
3876ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
3877ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
3878ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3879ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uBuf =  (UChar*)malloc(uBufSize * sizeof(UChar)*5);
3880ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cBuf =(char*)malloc(uBufSize * sizeof(char) * 5);
3881ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uSource = (const UChar*)in;
3882ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uSourceLimit=(const UChar*)in + (sizeof(in)/sizeof(in[0]));
3883ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cTarget = cBuf;
3884ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cTargetLimit = cBuf +uBufSize*5;
3885ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uTarget = uBuf;
3886ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uTargetLimit = uBuf+ uBufSize*5;
3887ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_fromUnicode( cnv , &cTarget, cTargetLimit,&uSource,uSourceLimit,NULL,TRUE, &errorCode);
3888ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)){
3889ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ucnv_fromUnicode conversion failed reason %s\n", u_errorName(errorCode));
3890ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
3891ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
3892ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cSource = cBuf;
3893ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cSourceLimit =cTarget;
3894ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    test =uBuf;
3895ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_toUnicode(cnv,&uTarget,uTargetLimit,&cSource,cSourceLimit,NULL,TRUE,&errorCode);
3896ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)){
3897ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ucnv_toUnicode conversion failed reason %s\n", u_errorName(errorCode));
3898ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
3899ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
3900ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uSource = (const UChar*)in;
3901ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    while(uSource<uSourceLimit){
3902ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(*test!=*uSource){
3903ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3904ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("Expected : \\u%04X \t Got: \\u%04X\n",*uSource,(int)*test) ;
3905ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
3906ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uSource++;
3907ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        test++;
3908ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
3909ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*ucnv_close(cnv);
3910ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cnv=ucnv_open("ISO_2022,locale=jp,version=1", &errorCode);*/
3911ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*Test for the condition where there is an invalid character*/
3912ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_reset(cnv);
3913ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
3914ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const uint8_t source2[]={0x0e,0x24,0x053};
3915ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TestNextUCharError(cnv, (const char*)source2, (const char*)source2+sizeof(source2), U_ZERO_ERROR, "an invalid character [ISO-2022-JP-1]");
3916ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
3917ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestSmallTargetBuffer(in,(const UChar*)in + (sizeof(in)/sizeof(in[0])),cnv);
3918ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestSmallSourceBuffer(in,(const UChar*)in + (sizeof(in)/sizeof(in[0])),cnv);
3919ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_close(cnv);
3920ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(uBuf);
3921ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(cBuf);
3922ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
3923ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3924ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
3925ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruTestISO_2022_JP_2() {
3926ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* test input */
3927ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint16_t in[]={
3928ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x00A8, 0x3003, 0x3005, 0x2015, 0xFF5E, 0x2016, 0x2026, 0x2018, 0x000D, 0x000A,
3929ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x2019, 0x201C, 0x201D, 0x3014, 0x3015, 0x3008, 0x3009, 0x300A, 0x000D, 0x000A,
3930ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x300B, 0x300C, 0x300D, 0x300E, 0x300F, 0x3016, 0x3017, 0x3010, 0x000D, 0x000A,
3931ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x3011, 0x00B1, 0x00D7, 0x00F7, 0x2236, 0x2227, 0x7FC1, 0x8956, 0x000D, 0x000A,
3932ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x9D2C, 0x9D0E, 0x9EC4, 0x5CA1, 0x6C96, 0x837B, 0x5104, 0x5C4B, 0x000D, 0x000A,
3933ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x61B6, 0x81C6, 0x6876, 0x7261, 0x4E59, 0x4FFA, 0x5378, 0x57F7, 0x000D, 0x000A,
3934ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x57F4, 0x57F9, 0x57FA, 0x57FC, 0x5800, 0x5802, 0x5805, 0x5806, 0x000D, 0x000A,
3935ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x580A, 0x581E, 0x6BB5, 0x6BB7, 0x6BBA, 0x6BBC, 0x9CE2, 0x977C, 0x000D, 0x000A,
3936ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x6BBF, 0x6BC1, 0x6BC5, 0x6BC6, 0x6BCB, 0x6BCD, 0x6BCF, 0x6BD2, 0x000D, 0x000A,
3937ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x6BD3, 0x6BD4, 0x6BD6, 0x6BD7, 0x6BD8, 0x6BDB, 0x6BEB, 0x6BEC, 0x000D, 0x000A,
3938ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x6C05, 0x6C08, 0x6C0F, 0x6C11, 0x6C13, 0x6C23, 0x6C34, 0x0041, 0x000D, 0x000A,
3939ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x000D, 0x000A,
3940ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x000D, 0x000A,
3941ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x000D, 0x000A,
3942ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x005B, 0x9792, 0x9CCC, 0x9CCD, 0x9CCE, 0x9CCF, 0x9CD0, 0x9CD3, 0x000D, 0x000A,
3943ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x9CD4, 0x9CD5, 0x9CD7, 0x9CD8, 0x9CD9, 0x9CDC, 0x9CDD, 0x9CDF, 0x000D, 0x000A,
3944ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x9785, 0x9791, 0x00BD, 0x0390, 0x0385, 0x0386, 0x0388, 0x0389, 0x000D, 0x000A,
3945ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x038E, 0x038F, 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x000D, 0x000A,
3946ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x038A, 0x038C, 0x039C, 0x000D, 0x000A
3947ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      };
3948ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const UChar* uSource;
3949ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const UChar* uSourceLimit;
3950ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* cSource;
3951ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* cSourceLimit;
3952ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *uTargetLimit =NULL;
3953ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *uTarget;
3954ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char *cTarget;
3955ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *cTargetLimit;
3956ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char *cBuf;
3957ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *uBuf,*test;
3958ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t uBufSize = 120;
3959ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode errorCode=U_ZERO_ERROR;
3960ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UConverter *cnv;
3961ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t* offsets = (int32_t*) malloc(uBufSize * sizeof(int32_t) * 5);
3962ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t* myOff= offsets;
3963ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cnv=ucnv_open("ISO_2022_JP_2", &errorCode);
3964ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
3965ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_data_err("Unable to open a iso-2022 converter: %s\n", u_errorName(errorCode));
3966ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
3967ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
3968ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3969ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uBuf =  (UChar*)malloc(uBufSize * sizeof(UChar)*5);
3970ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cBuf =(char*)malloc(uBufSize * sizeof(char) * 5);
3971ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uSource = (const UChar*)in;
3972ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uSourceLimit=(const UChar*)in + (sizeof(in)/sizeof(in[0]));
3973ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cTarget = cBuf;
3974ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cTargetLimit = cBuf +uBufSize*5;
3975ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uTarget = uBuf;
3976ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uTargetLimit = uBuf+ uBufSize*5;
3977ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_fromUnicode( cnv , &cTarget, cTargetLimit,&uSource,uSourceLimit,myOff,TRUE, &errorCode);
3978ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)){
3979ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ucnv_fromUnicode conversion failed reason %s\n", u_errorName(errorCode));
3980ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
3981ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
3982ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cSource = cBuf;
3983ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cSourceLimit =cTarget;
3984ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    test =uBuf;
3985ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    myOff=offsets;
3986ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_toUnicode(cnv,&uTarget,uTargetLimit,&cSource,cSourceLimit,myOff,TRUE,&errorCode);
3987ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)){
3988ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ucnv_toUnicode conversion failed reason %s\n", u_errorName(errorCode));
3989ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
3990ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
3991ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uSource = (const UChar*)in;
3992ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    while(uSource<uSourceLimit){
3993ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(*test!=*uSource){
3994ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3995ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("Expected : \\u%04X \t Got: \\u%04X\n",*uSource,(int)*test) ;
3996ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
3997ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uSource++;
3998ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        test++;
3999ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
4000ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestSmallTargetBuffer(in,(const UChar*)in + (sizeof(in)/sizeof(in[0])),cnv);
4001ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestSmallSourceBuffer(in,(const UChar*)in + (sizeof(in)/sizeof(in[0])),cnv);
4002ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestToAndFromUChars(in,(const UChar*)in + (sizeof(in)/sizeof(in[0])),cnv);
4003ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*Test for the condition where there is an invalid character*/
4004ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_reset(cnv);
4005ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
4006ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const uint8_t source2[]={0x0e,0x24,0x053};
4007ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TestNextUCharError(cnv, (const char*)source2, (const char*)source2+sizeof(source2), U_ZERO_ERROR, "an invalid character [ISO-2022-JP-2]");
4008ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
4009ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_close(cnv);
4010ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(uBuf);
4011ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(cBuf);
4012ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(offsets);
4013ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
4014ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4015ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
4016ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruTestISO_2022_KR() {
4017ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* test input */
4018ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint16_t in[]={
401985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                    0x9F4B,0x9F4E,0x9F52,0x9F5F,0x9F61,0x9F67,0x9F6A,0x000A,0x000D
402085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                   ,0x9F6C,0x9F77,0x9F8D,0x9F90,0x9F95,0x9F9C,0xAC00,0xAC01,0xAC04
4021ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                   ,0xAC07,0xAC08,0xAC09,0x0025,0x0026,0x0027,0x000A,0x000D,0x0028,0x0029
4022ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                   ,0x002A,0x002B,0x002C,0x002D,0x002E,0x53C3,0x53C8,0x53C9,0x53CA,0x53CB
402385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                   ,0x53CD,0x53D4,0x53D6,0x53D7,0x53DB,0x000A,0x000D,0x53E1,0x53E2
4024ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                   ,0x53E3,0x53E4,0x000A,0x000D};
4025ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const UChar* uSource;
4026ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const UChar* uSourceLimit;
4027ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* cSource;
4028ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* cSourceLimit;
4029ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *uTargetLimit =NULL;
4030ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *uTarget;
4031ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char *cTarget;
4032ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *cTargetLimit;
4033ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char *cBuf;
4034ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *uBuf,*test;
4035ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t uBufSize = 120;
4036ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode errorCode=U_ZERO_ERROR;
4037ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UConverter *cnv;
4038ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t* offsets = (int32_t*) malloc(uBufSize * sizeof(int32_t) * 5);
4039ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t* myOff= offsets;
4040ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cnv=ucnv_open("ISO_2022,locale=kr", &errorCode);
4041ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
4042ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_data_err("Unable to open a iso-2022 converter: %s\n", u_errorName(errorCode));
4043ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
4044ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
4045ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4046ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uBuf =  (UChar*)malloc(uBufSize * sizeof(UChar)*5);
4047ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cBuf =(char*)malloc(uBufSize * sizeof(char) * 5);
4048ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uSource = (const UChar*)in;
4049ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uSourceLimit=(const UChar*)in + (sizeof(in)/sizeof(in[0]));
4050ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cTarget = cBuf;
4051ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cTargetLimit = cBuf +uBufSize*5;
4052ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uTarget = uBuf;
4053ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uTargetLimit = uBuf+ uBufSize*5;
4054ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_fromUnicode( cnv , &cTarget, cTargetLimit,&uSource,uSourceLimit,myOff,TRUE, &errorCode);
4055ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)){
4056ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ucnv_fromUnicode conversion failed reason %s\n", u_errorName(errorCode));
4057ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
4058ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
4059ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cSource = cBuf;
4060ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cSourceLimit =cTarget;
4061ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    test =uBuf;
4062ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    myOff=offsets;
4063ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_toUnicode(cnv,&uTarget,uTargetLimit,&cSource,cSourceLimit,myOff,TRUE,&errorCode);
4064ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)){
4065ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ucnv_toUnicode conversion failed reason %s\n", u_errorName(errorCode));
4066ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
4067ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
4068ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uSource = (const UChar*)in;
4069ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    while(uSource<uSourceLimit){
4070ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(*test!=*uSource){
4071ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("Expected : \\u%04X \t Got: \\u%04X\n",*uSource,*test) ;
4072ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
4073ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uSource++;
4074ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        test++;
4075ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
4076ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestGetNextUChar2022(cnv, cBuf, cTarget, in, "ISO-2022-KR encoding");
4077ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestSmallTargetBuffer(in,(const UChar*)in + (sizeof(in)/sizeof(in[0])),cnv);
4078ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestSmallSourceBuffer(in,(const UChar*)in + (sizeof(in)/sizeof(in[0])),cnv);
4079ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestToAndFromUChars(in,(const UChar*)in + (sizeof(in)/sizeof(in[0])),cnv);
4080ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestJitterbug930("csISO2022KR");
4081ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*Test for the condition where there is an invalid character*/
4082ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_reset(cnv);
4083ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
4084ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const uint8_t source2[]={0x1b,0x24,0x053};
4085ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucnv_setToUCallBack(cnv, UCNV_TO_U_CALLBACK_STOP, NULL, NULL, NULL, &errorCode);
4086ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TestNextUCharError(cnv, (const char*)source2, (const char*)source2+sizeof(source2), U_ILLEGAL_ESCAPE_SEQUENCE, "an invalid character [ISO-2022-KR]");
4087ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
4088ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_close(cnv);
4089ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(uBuf);
4090ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(cBuf);
4091ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(offsets);
4092ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
4093ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4094ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
4095ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruTestISO_2022_KR_1() {
4096ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* test input */
4097ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint16_t in[]={
4098ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    0x9F4B,0x9F4E,0x9F52,0x9F5F,0x9F61,0x9F67,0x9F6A,0x000A,0x000D
4099ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                   ,0x9F6C,0x9F77,0x9F8D,0x9F90,0x9F95,0x9F9C,0xAC00,0xAC01,0xAC04
4100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                   ,0xAC07,0xAC08,0xAC09,0x0025,0x0026,0x0027,0x000A,0x000D,0x0028,0x0029
4101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                   ,0x002A,0x002B,0x002C,0x002D,0x002E,0x53C3,0x53C8,0x53C9,0x53CA,0x53CB
4102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                   ,0x53CD,0x53D4,0x53D6,0x53D7,0x53DB,0x000A,0x000D,0x53E1,0x53E2
4103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                   ,0x53E3,0x53E4,0x000A,0x000D};
4104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const UChar* uSource;
4105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const UChar* uSourceLimit;
4106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* cSource;
4107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* cSourceLimit;
4108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *uTargetLimit =NULL;
4109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *uTarget;
4110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char *cTarget;
4111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *cTargetLimit;
4112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char *cBuf;
4113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *uBuf,*test;
4114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t uBufSize = 120;
4115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode errorCode=U_ZERO_ERROR;
4116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UConverter *cnv;
4117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t* offsets = (int32_t*) malloc(uBufSize * sizeof(int32_t) * 5);
4118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t* myOff= offsets;
4119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cnv=ucnv_open("ibm-25546", &errorCode);
4120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
4121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_data_err("Unable to open a iso-2022 converter: %s\n", u_errorName(errorCode));
4122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
4123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
4124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uBuf =  (UChar*)malloc(uBufSize * sizeof(UChar)*5);
4126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cBuf =(char*)malloc(uBufSize * sizeof(char) * 5);
4127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uSource = (const UChar*)in;
4128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uSourceLimit=(const UChar*)in + (sizeof(in)/sizeof(in[0]));
4129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cTarget = cBuf;
4130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cTargetLimit = cBuf +uBufSize*5;
4131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uTarget = uBuf;
4132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uTargetLimit = uBuf+ uBufSize*5;
4133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_fromUnicode( cnv , &cTarget, cTargetLimit,&uSource,uSourceLimit,myOff,TRUE, &errorCode);
4134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)){
4135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ucnv_fromUnicode conversion failed reason %s\n", u_errorName(errorCode));
4136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
4137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
4138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cSource = cBuf;
4139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cSourceLimit =cTarget;
4140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    test =uBuf;
4141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    myOff=offsets;
4142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_toUnicode(cnv,&uTarget,uTargetLimit,&cSource,cSourceLimit,myOff,TRUE,&errorCode);
4143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)){
4144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ucnv_toUnicode conversion failed reason %s\n", u_errorName(errorCode));
4145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
4146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
4147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uSource = (const UChar*)in;
4148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    while(uSource<uSourceLimit){
4149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(*test!=*uSource){
4150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("Expected : \\u%04X \t Got: \\u%04X\n",*uSource,*test) ;
4151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
4152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uSource++;
4153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        test++;
4154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
4155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_reset(cnv);
4156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestGetNextUChar2022(cnv, cBuf, cTarget, in, "ISO-2022-KR encoding");
4157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestSmallTargetBuffer(in,(const UChar*)in + (sizeof(in)/sizeof(in[0])),cnv);
4158ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestSmallSourceBuffer(in,(const UChar*)in + (sizeof(in)/sizeof(in[0])),cnv);
4159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_reset(cnv);
4160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestToAndFromUChars(in,(const UChar*)in + (sizeof(in)/sizeof(in[0])),cnv);
4161ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /*Test for the condition where there is an invalid character*/
4162ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_reset(cnv);
4163ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
4164ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const uint8_t source2[]={0x1b,0x24,0x053};
4165ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucnv_setToUCallBack(cnv, UCNV_TO_U_CALLBACK_STOP, NULL, NULL, NULL, &errorCode);
4166ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TestNextUCharError(cnv, (const char*)source2, (const char*)source2+sizeof(source2), U_ILLEGAL_ESCAPE_SEQUENCE, "an invalid character [ISO-2022-KR]");
4167ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
4168ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_close(cnv);
4169ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(uBuf);
4170ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(cBuf);
4171ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(offsets);
4172ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
4173ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4174ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestJitterbug2411(){
4175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const char* source = "\x1b\x24\x29\x43\x6b\x6b\x6e\x6e\x6a\x68\x70\x6f\x69\x75\x79\x71\x77\x65\x68\x67\x0A"
4176ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                         "\x1b\x24\x29\x43\x6a\x61\x73\x64\x66\x6a\x61\x73\x64\x66\x68\x6f\x69\x75\x79\x1b\x24\x29\x43";
4177ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UConverter* kr=NULL, *kr1=NULL;
4178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode errorCode = U_ZERO_ERROR;
4179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar tgt[100]={'\0'};
4180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar* target = tgt;
4181ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar* targetLimit = target+100;
4182ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    kr=ucnv_open("iso-2022-kr", &errorCode);
4183ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
4184ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_data_err("Unable to open a iso-2022-kr converter: %s\n", u_errorName(errorCode));
4185ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
4186ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
4187ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_toUnicode(kr,&target,targetLimit,&source,source+uprv_strlen(source),NULL,TRUE,&errorCode);
4188ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
4189ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("iso-2022-kr cannot handle multiple escape sequences : %s\n", u_errorName(errorCode));
4190ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
4191ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
4192ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    kr1 = ucnv_open("ibm-25546", &errorCode);
4193ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
4194ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_data_err("Unable to open a iso-2022-kr_1 converter: %s\n", u_errorName(errorCode));
4195ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
4196ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
4197ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    target = tgt;
4198ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    targetLimit = target+100;
4199ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_toUnicode(kr,&target,targetLimit,&source,source+uprv_strlen(source),NULL,TRUE,&errorCode);
4200ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4201ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
4202ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("iso-2022-kr_1 cannot handle multiple escape sequences : %s\n", u_errorName(errorCode));
4203ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
4204ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
4205ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4206ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_close(kr);
4207ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_close(kr1);
4208ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4209ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
4210ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4211ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
4212ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruTestJIS(){
4213ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* From Unicode moved to testdata/conversion.txt */
4214ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*To Unicode*/
4215ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
4216ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const uint8_t sampleTextJIS[] = {
4217ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x1b,0x28,0x48,0x41,0x42, /*jis-Roman*/
4218ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x1b,0x28,0x49,0x41,0x42, /*Katakana Set*/
4219ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x1b,0x26,0x40,0x1b,0x24,0x42,0x21,0x21 /*recognize and ignore <esc>&@*/
4220ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        };
4221ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const uint16_t expectedISO2022JIS[] = {
4222ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x0041, 0x0042,
4223ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0xFF81, 0xFF82,
4224ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x3000
4225ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        };
4226ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const int32_t  toISO2022JISOffs[]={
4227ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            3,4,
4228ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            8,9,
4229ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            16
4230ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        };
4231ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4232ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const uint8_t sampleTextJIS7[] = {
4233ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x1b,0x28,0x48,0x41,0x42, /*JIS7-Roman*/
4234ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x1b,0x28,0x49,0x41,0x42, /*Katakana Set*/
4235ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x1b,0x24,0x42,0x21,0x21,
4236ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x0e,0x41,0x42,0x0f,      /*Test Katakana set with SI and SO */
4237ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x21,0x22,
4238ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x1b,0x26,0x40,0x1b,0x24,0x42,0x21,0x21 /*recognize and ignore <esc>&@*/
4239ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        };
4240ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const uint16_t expectedISO2022JIS7[] = {
4241ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x0041, 0x0042,
4242ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0xFF81, 0xFF82,
4243ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x3000,
4244ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0xFF81, 0xFF82,
4245ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x3001,
4246ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x3000
4247ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        };
4248ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const int32_t  toISO2022JIS7Offs[]={
4249ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            3,4,
4250ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            8,9,
4251ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            13,16,
4252ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            17,
4253ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            19,27
4254ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        };
4255ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const uint8_t sampleTextJIS8[] = {
4256ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x1b,0x28,0x48,0x41,0x42, /*JIS8-Roman*/
4257ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0xa1,0xc8,0xd9,/*Katakana Set*/
4258ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x1b,0x28,0x42,
4259ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x41,0x42,
4260ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0xb1,0xc3, /*Katakana Set*/
4261ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x1b,0x24,0x42,0x21,0x21
4262ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        };
4263ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const uint16_t expectedISO2022JIS8[] = {
4264ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x0041, 0x0042,
4265ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0xff61, 0xff88, 0xff99,
4266ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x0041, 0x0042,
4267ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0xff71, 0xff83,
4268ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x3000
4269ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        };
4270ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const int32_t  toISO2022JIS8Offs[]={
4271ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            3, 4,  5,  6,
4272ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            7, 11, 12, 13,
4273ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            14, 18,
4274ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        };
4275ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4276ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        testConvertToU(sampleTextJIS,sizeof(sampleTextJIS),expectedISO2022JIS,
4277ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            sizeof(expectedISO2022JIS)/sizeof(expectedISO2022JIS[0]),"JIS", toISO2022JISOffs,TRUE);
4278ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        testConvertToU(sampleTextJIS7,sizeof(sampleTextJIS7),expectedISO2022JIS7,
4279ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            sizeof(expectedISO2022JIS7)/sizeof(expectedISO2022JIS7[0]),"JIS7", toISO2022JIS7Offs,TRUE);
4280ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        testConvertToU(sampleTextJIS8,sizeof(sampleTextJIS8),expectedISO2022JIS8,
4281ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            sizeof(expectedISO2022JIS8)/sizeof(expectedISO2022JIS8[0]),"JIS8", toISO2022JIS8Offs,TRUE);
4282ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
4283ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4284ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
4285ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
428627f654740f2a26ad62a5c155af9199af9e69b889claireho
428727f654740f2a26ad62a5c155af9199af9e69b889claireho#if 0
428827f654740f2a26ad62a5c155af9199af9e69b889claireho ICU 4.4 (ticket #7314) removes mappings for CNS 11643 planes 3..7
428927f654740f2a26ad62a5c155af9199af9e69b889claireho
4290ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestJitterbug915(){
4291ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* tests for roundtripping of the below sequence
4292ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru\x1b$)G\x0E#!#"###$#%#&#'#(#)#*#+          / *plane 1 * /
4293ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru\x1b$*H\x1bN"!\x1bN""\x1bN"#\x1bN"$\x1bN"% / *plane 2 * /
4294ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru\x1b$+I\x1bO"D\x1bO"E\x1bO"F\x1bO"G\x1bO"H / *plane 3 * /
4295ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru\x1b$+J\x1bO!D\x1bO!E\x1bO"j\x1bO"k\x1bO"l / *plane 4 * /
4296ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru\x1b$+K\x1bO!t\x1bO"P\x1bO"Q\x1bO#7\x1bO"\ / *plane 5 * /
4297ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru\x1b$+L\x1bO!#\x1bO",\x1bO#N\x1bO!n\x1bO#q / *plane 6 * /
4298ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru\x1b$+M\x1bO"q\x1bO!N\x1bO!j\x1bO#:\x1bO#o / *plane 7 * /
4299ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/
4300ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const char cSource[]={
4301ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x1B, 0x24, 0x29, 0x47, 0x0E, 0x23, 0x21, 0x23, 0x22, 0x23,
4302ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x23, 0x23, 0x24, 0x23, 0x25, 0x23, 0x26, 0x23, 0x27, 0x23,
4303ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x28, 0x23, 0x29, 0x23, 0x2A, 0x23, 0x2B, 0x0F, 0x2F, 0x2A,
4304ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x70, 0x6C, 0x61, 0x6E, 0x65, 0x20, 0x31, 0x20, 0x2A, 0x2F,
4305ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0D, 0x0A, 0x1B, 0x24, 0x2A, 0x48, 0x1B, 0x4E, 0x22, 0x21,
4306ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x1B, 0x4E, 0x22, 0x22, 0x1B, 0x4E, 0x22, 0x23, 0x1B, 0x4E,
4307ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x22, 0x24, 0x1B, 0x4E, 0x22, 0x25, 0x2F, 0x2A, 0x70,
4308ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x6C, 0x61, 0x6E, 0x65, 0x32, 0x2A, 0x2F, 0x20, 0x0D, 0x0A,
4309ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x1B, 0x24, 0x2B, 0x49, 0x1B, 0x4F, 0x22, 0x44, 0x1B, 0x4F,
4310ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x22, 0x45, 0x1B, 0x4F, 0x22, 0x46, 0x1B, 0x4F, 0x22, 0x47,
4311ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x1B, 0x4F, 0x22, 0x48, 0x2F, 0x2A, 0x70, 0x6C, 0x61,
4312ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x6E, 0x65, 0x20, 0x33, 0x20, 0x2A, 0x2F, 0x0D, 0x0A, 0x1B,
4313ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x24, 0x2B, 0x4A, 0x1B, 0x4F, 0x21, 0x44, 0x1B, 0x4F, 0x21,
4314ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x45, 0x1B, 0x4F, 0x22, 0x6A, 0x1B, 0x4F, 0x22, 0x6B, 0x1B,
4315ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x4F, 0x22, 0x6C, 0x2F, 0x2A, 0x70, 0x6C, 0x61, 0x6E,
4316ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x65, 0x20, 0x34, 0x20, 0x2A, 0x2F, 0x0D, 0x0A, 0x1B, 0x24,
4317ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x2B, 0x4B, 0x1B, 0x4F, 0x21, 0x74, 0x1B, 0x4F, 0x22, 0x50,
4318ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x1B, 0x4F, 0x22, 0x51, 0x1B, 0x4F, 0x23, 0x37, 0x1B, 0x4F,
4319ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x22, 0x5C, 0x2F, 0x2A, 0x70, 0x6C, 0x61, 0x6E,
4320ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x65, 0x20, 0x35, 0x20, 0x2A, 0x2F, 0x0D, 0x0A, 0x1B, 0x24,
4321ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x2B, 0x4C, 0x1B, 0x4F, 0x21, 0x23, 0x1B, 0x4F, 0x22, 0x2C,
4322ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x1B, 0x4F, 0x23, 0x4E, 0x1B, 0x4F, 0x21, 0x6E, 0x1B, 0x4F,
4323ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x23, 0x71, 0x2F, 0x2A, 0x70, 0x6C, 0x61, 0x6E, 0x65,
4324ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x20, 0x36, 0x20, 0x2A, 0x2F, 0x0D, 0x0A, 0x1B, 0x24, 0x2B,
4325ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x4D, 0x1B, 0x4F, 0x22, 0x71, 0x1B, 0x4F, 0x21, 0x4E, 0x1B,
4326ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x4F, 0x21, 0x6A, 0x1B, 0x4F, 0x23, 0x3A, 0x1B, 0x4F, 0x23,
4327ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x6F, 0x2F, 0x2A, 0x70, 0x6C, 0x61, 0x6E, 0x65, 0x20,
4328ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x37, 0x20, 0x2A, 0x2F
4329ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
4330ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar uTarget[500]={'\0'};
4331ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar* utarget=uTarget;
4332ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar* utargetLimit=uTarget+sizeof(uTarget)/2;
4333ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4334ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char cTarget[500]={'\0'};
4335ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char* ctarget=cTarget;
4336ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char* ctargetLimit=cTarget+sizeof(cTarget);
4337ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* csource=cSource;
4338ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* tempSrc = cSource;
4339ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode err=U_ZERO_ERROR;
4340ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4341ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UConverter* conv =ucnv_open("ISO_2022_CN_EXT",&err);
4342ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(err)) {
4343ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_data_err("Unable to open a iso-2022 converter: %s\n", u_errorName(err));
4344ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
4345ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
4346ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_toUnicode(conv,&utarget,utargetLimit,&csource,csource+sizeof(cSource),NULL,TRUE,&err);
4347ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(err)) {
4348ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("iso-2022-CN to Unicode conversion failed: %s\n", u_errorName(err));
4349ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
4350ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
4351ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    utargetLimit=utarget;
4352ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    utarget = uTarget;
4353ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_fromUnicode(conv,&ctarget,ctargetLimit,(const UChar**)&utarget,utargetLimit,NULL,TRUE,&err);
4354ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(err)) {
4355ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("iso-2022-CN from Unicode conversion failed: %s\n", u_errorName(err));
4356ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
4357ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
4358ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ctargetLimit=ctarget;
4359ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ctarget =cTarget;
4360ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    while(ctarget<ctargetLimit){
4361ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(*ctarget != *tempSrc){
4362ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("j915[%d] Expected : \\x%02X \t Got: \\x%02X\n", (int)(ctarget-cTarget), *ctarget,(int)*tempSrc) ;
4363ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
4364ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ++ctarget;
4365ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ++tempSrc;
4366ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
4367ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4368ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_close(conv);
4369ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
4370ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4371ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
4372ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruTestISO_2022_CN_EXT() {
4373ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* test input */
4374ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint16_t in[]={
4375ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                /* test Non-BMP code points */
4376ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0xD869, 0xDE99, 0xD869, 0xDE9C, 0xD869, 0xDE9D, 0xD869, 0xDE9E, 0xD869, 0xDE9F,
4377ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0xD869, 0xDEA0, 0xD869, 0xDEA5, 0xD869, 0xDEA6, 0xD869, 0xDEA7, 0xD869, 0xDEA8,
4378ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0xD869, 0xDEAB, 0xD869, 0xDEAC, 0xD869, 0xDEAD, 0xD869, 0xDEAE, 0xD869, 0xDEAF,
4379ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0xD869, 0xDEB0, 0xD869, 0xDEB1, 0xD869, 0xDEB3, 0xD869, 0xDEB5, 0xD869, 0xDEB6,
4380ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0xD869, 0xDEB7, 0xD869, 0xDEB8, 0xD869, 0xDEB9, 0xD869, 0xDEBA, 0xD869, 0xDEBB,
4381ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0xD869, 0xDEBC, 0xD869, 0xDEBD, 0xD869, 0xDEBE, 0xD869, 0xDEBF, 0xD869, 0xDEC0,
4382ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0xD869, 0xDEC1, 0xD869, 0xDEC2, 0xD869, 0xDEC3, 0xD869, 0xDEC4, 0xD869, 0xDEC8,
4383ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0xD869, 0xDECA, 0xD869, 0xDECB, 0xD869, 0xDECD, 0xD869, 0xDECE, 0xD869, 0xDECF,
4384ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0xD869, 0xDED0, 0xD869, 0xDED1, 0xD869, 0xDED2, 0xD869, 0xDED3, 0xD869, 0xDED4,
4385ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0xD869, 0xDED5,
4386ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4387ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0x4DB3, 0x4DB4, 0x4DB5, 0x4E00, 0x4E00, 0x4E01, 0x4E02, 0x4E03, 0x000D, 0x000A,
4388ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x33E0, 0x33E6, 0x000D, 0x000A,
4389ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0x4E05, 0x4E07, 0x4E04, 0x4E08, 0x4E08, 0x4E09, 0x4E0A, 0x4E0B, 0x000D, 0x000A,
4390ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0x4E0C, 0x0021, 0x0022, 0x0023, 0x0024, 0xFF40, 0xFF41, 0xFF42, 0x000D, 0x000A,
4391ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0x000D, 0x000A,
4392ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0x6332, 0x63B0, 0x643F, 0x000D, 0x000A,
4393ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0x64D8, 0x8004, 0x6BEA, 0x6BF3, 0x6BFD, 0x6BF5, 0x6BF9, 0x6C05, 0x000D, 0x000A,
4394ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x000D, 0x000A,
4395ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0x6C07, 0x6C06, 0x6C0D, 0x6C15, 0x9CD9, 0x9CDC, 0x9CDD, 0x9CDF, 0x000D, 0x000A,
4396ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0x9CE2, 0x977C, 0x9785, 0x9791, 0x9792, 0x9794, 0x97AF, 0x97AB, 0x000D, 0x000A,
4397ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0x97A3, 0x97B2, 0x97B4, 0x9AB1, 0x9AB0, 0x9AB7, 0x9E58, 0x9AB6, 0x000D, 0x000A,
4398ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0x9ABA, 0x9ABC, 0x9AC1, 0x9AC0, 0x9AC5, 0x9AC2, 0x9ACB, 0x9ACC, 0x000D, 0x000A,
4399ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0x9AD1, 0x9B45, 0x9B43, 0x9B47, 0x9B49, 0x9B48, 0x9B4D, 0x9B51, 0x000D, 0x000A,
4400ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0x98E8, 0x990D, 0x992E, 0x9955, 0x9954, 0x9ADF, 0x3443, 0x3444, 0x000D, 0x000A,
4401ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0x3445, 0x3449, 0x344A, 0x344B, 0x60F2, 0x60F3, 0x60F4, 0x60F5, 0x000D, 0x000A,
4402ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0x60F6, 0x60F7, 0x60F8, 0x60F9, 0x60FA, 0x60FB, 0x60FC, 0x60FD, 0x000D, 0x000A,
4403ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0x60FE, 0x60FF, 0x6100, 0x6101, 0x6102, 0x0041, 0x0042, 0x0043, 0x000D, 0x000A,
4404ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x000D, 0x000A,
4405ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4406ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0x33E7, 0x33E8, 0x33E9, 0x33EA, 0x000D, 0x000A
4407ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4408ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      };
4409ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4410ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const UChar* uSource;
4411ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const UChar* uSourceLimit;
4412ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* cSource;
4413ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* cSourceLimit;
4414ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *uTargetLimit =NULL;
4415ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *uTarget;
4416ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char *cTarget;
4417ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *cTargetLimit;
4418ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char *cBuf;
4419ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *uBuf,*test;
4420ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t uBufSize = 180;
4421ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode errorCode=U_ZERO_ERROR;
4422ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UConverter *cnv;
4423ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t* offsets = (int32_t*) malloc(uBufSize * sizeof(int32_t) * 5);
4424ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t* myOff= offsets;
4425ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cnv=ucnv_open("ISO_2022,locale=cn,version=1", &errorCode);
4426ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
4427ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_data_err("Unable to open a iso-2022 converter: %s\n", u_errorName(errorCode));
4428ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
4429ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
4430ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4431ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uBuf =  (UChar*)malloc(uBufSize * sizeof(UChar)*5);
4432ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cBuf =(char*)malloc(uBufSize * sizeof(char) * 10);
4433ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uSource = (const UChar*)in;
4434ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uSourceLimit=(const UChar*)in + (sizeof(in)/sizeof(in[0]));
4435ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cTarget = cBuf;
4436ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cTargetLimit = cBuf +uBufSize*5;
4437ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uTarget = uBuf;
4438ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uTargetLimit = uBuf+ uBufSize*5;
4439ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_fromUnicode( cnv , &cTarget, cTargetLimit,&uSource,uSourceLimit,myOff,TRUE, &errorCode);
4440ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)){
4441ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ucnv_fromUnicode conversion failed reason %s\n", u_errorName(errorCode));
4442ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
4443ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
4444ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cSource = cBuf;
4445ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cSourceLimit =cTarget;
4446ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    test =uBuf;
4447ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    myOff=offsets;
4448ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_toUnicode(cnv,&uTarget,uTargetLimit,&cSource,cSourceLimit,myOff,TRUE,&errorCode);
4449ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)){
4450ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ucnv_toUnicode conversion failed reason %s\n", u_errorName(errorCode));
4451ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
4452ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
4453ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uSource = (const UChar*)in;
4454ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    while(uSource<uSourceLimit){
4455ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(*test!=*uSource){
4456ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("Expected : \\u%04X \t Got: \\u%04X\n",*uSource,(int)*test) ;
4457ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
4458ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        else{
4459ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_verbose("      Got: \\u%04X\n",(int)*test) ;
4460ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
4461ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uSource++;
4462ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        test++;
4463ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
4464ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestSmallTargetBuffer(in,(const UChar*)in + (sizeof(in)/sizeof(in[0])),cnv);
4465ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestSmallSourceBuffer(in,(const UChar*)in + (sizeof(in)/sizeof(in[0])),cnv);
4466ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*Test for the condition where there is an invalid character*/
4467ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_reset(cnv);
4468ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
4469ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const uint8_t source2[]={0x0e,0x24,0x053};
4470ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TestNextUCharError(cnv, (const char*)source2, (const char*)source2+sizeof(source2), U_ZERO_ERROR, "an invalid character [ISO-2022-CN-EXT]");
4471ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
4472ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_close(cnv);
4473ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(uBuf);
4474ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(cBuf);
4475ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(offsets);
4476ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
447727f654740f2a26ad62a5c155af9199af9e69b889claireho#endif
4478ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4479ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
4480ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruTestISO_2022_CN() {
4481ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* test input */
4482ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint16_t in[]={
4483ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         /* jitterbug 951 */
4484ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0xFF2D, 0xFF49, 0xFF58, 0xFF45, 0xFF44, 0x0020, 0xFF43, 0xFF48, 0xFF41, 0xFF52,
4485ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0x0020, 0xFF06, 0x0020, 0xFF11, 0xFF12, 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17,
4486ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0xFF18, 0xFF19, 0xFF10, 0x0020, 0xFF4E, 0xFF55, 0xFF4D, 0xFF42, 0xFF45, 0xFF52,
4487ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0x0020, 0xFF54, 0xFF45, 0xFF53, 0xFF54, 0x0020, 0xFF4C, 0xFF49, 0xFF4E, 0xFF45,
4488ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0x0020, 0x0045, 0x004e, 0x0044,
4489ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         /**/
4490ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0x4E00, 0x4E00, 0x4E01, 0x4E03, 0x60F6, 0x60F7, 0x60F8, 0x60FB, 0x000D, 0x000A,
4491ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x60FB, 0x60FC, 0x000D, 0x000A,
4492ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0x4E07, 0x4E08, 0x4E08, 0x4E09, 0x4E0A, 0x4E0B, 0x0042, 0x0043, 0x000D, 0x000A,
4493ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0x4E0C, 0x0021, 0x0022, 0x0023, 0x0024, 0xFF40, 0xFF41, 0xFF42, 0x000D, 0x000A,
4494ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0x000D, 0x000A,
4495ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0x6332, 0x63B0, 0x643F, 0x000D, 0x000A,
4496ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0x64D8, 0x8004, 0x6BEA, 0x6BF3, 0x6BFD, 0x6BF5, 0x6BF9, 0x6C05, 0x000D, 0x000A,
4497ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0x6C07, 0x6C06, 0x6C0D, 0x6C15, 0x9CD9, 0x9CDC, 0x9CDD, 0x9CDF, 0x000D, 0x000A,
4498ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0x9CE2, 0x977C, 0x9785, 0x9791, 0x9792, 0x9794, 0x97AF, 0x97AB, 0x000D, 0x000A,
4499ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0x97A3, 0x97B2, 0x97B4, 0x9AB1, 0x9AB0, 0x9AB7, 0x9E58, 0x9AB6, 0x000D, 0x000A,
4500ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0x9ABA, 0x9ABC, 0x9AC1, 0x9AC0, 0x9AC5, 0x9AC2, 0x9ACB, 0x9ACC, 0x000D, 0x000A,
4501ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0x9AD1, 0x9B45, 0x9B43, 0x9B47, 0x9B49, 0x9B48, 0x9B4D, 0x9B51, 0x000D, 0x000A,
4502ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0x98E8, 0x990D, 0x992E, 0x9955, 0x9954, 0x9ADF, 0x60FE, 0x60FF, 0x000D, 0x000A,
4503ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0x60F2, 0x60F3, 0x60F4, 0x60F5, 0x000D, 0x000A, 0x60F9, 0x60FA, 0x000D, 0x000A,
4504ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0x6100, 0x6101, 0x0041, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x000D, 0x000A,
4505ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0x247D, 0x247E, 0x247F, 0x2480, 0x2481, 0x2482, 0x2483, 0x2484, 0x2485, 0x2486,
4506ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         0x2487, 0x2460, 0x2461, 0xFF20, 0xFF21, 0xFF22, 0x0049, 0x004A, 0x000D, 0x000A,
4507ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4508ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      };
4509ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const UChar* uSource;
4510ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const UChar* uSourceLimit;
4511ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* cSource;
4512ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* cSourceLimit;
4513ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *uTargetLimit =NULL;
4514ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *uTarget;
4515ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char *cTarget;
4516ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *cTargetLimit;
4517ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char *cBuf;
4518ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *uBuf,*test;
4519ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t uBufSize = 180;
4520ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode errorCode=U_ZERO_ERROR;
4521ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UConverter *cnv;
4522ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t* offsets = (int32_t*) malloc(uBufSize * sizeof(int32_t) * 5);
4523ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t* myOff= offsets;
4524ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cnv=ucnv_open("ISO_2022,locale=cn,version=0", &errorCode);
4525ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
4526ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_data_err("Unable to open a iso-2022 converter: %s\n", u_errorName(errorCode));
4527ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
4528ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
4529ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4530ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uBuf =  (UChar*)malloc(uBufSize * sizeof(UChar)*5);
4531ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cBuf =(char*)malloc(uBufSize * sizeof(char) * 10);
4532ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uSource = (const UChar*)in;
4533ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uSourceLimit=(const UChar*)in + (sizeof(in)/sizeof(in[0]));
4534ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cTarget = cBuf;
4535ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cTargetLimit = cBuf +uBufSize*5;
4536ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uTarget = uBuf;
4537ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uTargetLimit = uBuf+ uBufSize*5;
4538ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_fromUnicode( cnv , &cTarget, cTargetLimit,&uSource,uSourceLimit,myOff,TRUE, &errorCode);
4539ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)){
4540ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ucnv_fromUnicode conversion failed reason %s\n", u_errorName(errorCode));
4541ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
4542ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
4543ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cSource = cBuf;
4544ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cSourceLimit =cTarget;
4545ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    test =uBuf;
4546ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    myOff=offsets;
4547ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_toUnicode(cnv,&uTarget,uTargetLimit,&cSource,cSourceLimit,myOff,TRUE,&errorCode);
4548ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)){
4549ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("ucnv_toUnicode conversion failed reason %s\n", u_errorName(errorCode));
4550ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
4551ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
4552ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uSource = (const UChar*)in;
4553ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    while(uSource<uSourceLimit){
4554ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(*test!=*uSource){
4555ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("Expected : \\u%04X \t Got: \\u%04X\n",*uSource,(int)*test) ;
4556ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
4557ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        else{
4558ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_verbose("      Got: \\u%04X\n",(int)*test) ;
4559ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
4560ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uSource++;
4561ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        test++;
4562ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
4563ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestGetNextUChar2022(cnv, cBuf, cTarget, in, "ISO-2022-CN encoding");
4564ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestSmallTargetBuffer(in,(const UChar*)in + (sizeof(in)/sizeof(in[0])),cnv);
4565ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestSmallSourceBuffer(in,(const UChar*)in + (sizeof(in)/sizeof(in[0])),cnv);
4566ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestToAndFromUChars(in,(const UChar*)in + (sizeof(in)/sizeof(in[0])),cnv);
4567ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestJitterbug930("csISO2022CN");
4568ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*Test for the condition where there is an invalid character*/
4569ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_reset(cnv);
4570ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
4571ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const uint8_t source2[]={0x0e,0x24,0x053};
4572ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TestNextUCharError(cnv, (const char*)source2, (const char*)source2+sizeof(source2), U_ZERO_ERROR, "an invalid character [ISO-2022-CN]");
4573ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
4574ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4575ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_close(cnv);
4576ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(uBuf);
4577ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(cBuf);
4578ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(offsets);
4579ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
4580ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
458185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/* Tests for empty segments in ISO-2022-JP/KR/CN, HZ, check that UConverterCallbackReason is UCNV_IRREGULAR */
458285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hotypedef struct {
458385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    const char *    converterName;
458485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    const char *    inputText;
458585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    int             inputTextLength;
458685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} EmptySegmentTest;
458785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
458885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/* Callback for TestJitterbug6175, should only get called for empty segment errors */
458985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic void UCNV_TO_U_CALLBACK_EMPTYSEGMENT( const void *context, UConverterToUnicodeArgs *toArgs, const char* codeUnits,
459085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho                                             int32_t length, UConverterCallbackReason reason, UErrorCode * err ) {
459185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if (reason > UCNV_IRREGULAR) {
459285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        return;
459385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
459485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if (reason != UCNV_IRREGULAR) {
459585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err("toUnicode callback invoked for empty segment but reason is not UCNV_IRREGULAR\n");
459685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
459785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    /* Standard stuff below from UCNV_TO_U_CALLBACK_SUBSTITUTE */
459885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    *err = U_ZERO_ERROR;
459985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    ucnv_cbToUWriteSub(toArgs,0,err);
460085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}
460185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
460285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoenum { kEmptySegmentToUCharsMax = 64 };
460385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic void TestJitterbug6175(void) {
460485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    static const char  iso2022jp_a[] = { 0x61, 0x62, 0x1B,0x24,0x42, 0x1B,0x28,0x42, 0x63, 0x64, 0x0D, 0x0A };
460585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    static const char  iso2022kr_a[] = { 0x1B,0x24,0x29,0x43, 0x61, 0x0E, 0x0F, 0x62, 0x0D, 0x0A };
460685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    static const char  iso2022cn_a[] = { 0x61, 0x1B,0x24,0x29,0x41, 0x62, 0x0E, 0x0F, 0x1B,0x24,0x2A,0x48, 0x1B,0x4E, 0x6A,0x65, 0x63, 0x0D, 0x0A };
460785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    static const char  iso2022cn_b[] = { 0x61, 0x1B,0x24,0x29,0x41, 0x62, 0x0E, 0x1B,0x24,0x29,0x47, 0x68,0x64, 0x0F, 0x63, 0x0D, 0x0A };
460885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    static const char  hzGB2312_a[]  = { 0x61, 0x62, 0x7E,0x7B, 0x7E,0x7D, 0x63, 0x64 };
460985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    static const EmptySegmentTest emptySegmentTests[] = {
461085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        /* converterName inputText    inputTextLength */
461185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        { "ISO-2022-JP", iso2022jp_a, sizeof(iso2022jp_a) },
461285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        { "ISO-2022-KR", iso2022kr_a, sizeof(iso2022kr_a) },
461385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        { "ISO-2022-CN", iso2022cn_a, sizeof(iso2022cn_a) },
461485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        { "ISO-2022-CN", iso2022cn_b, sizeof(iso2022cn_b) },
461585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        { "HZ-GB-2312",  hzGB2312_a,  sizeof(hzGB2312_a)  },
461685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        /* terminator: */
461785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        { NULL,          NULL,        0,                  }
461885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    };
461985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    const EmptySegmentTest * testPtr;
462085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    for (testPtr = emptySegmentTests; testPtr->converterName != NULL; ++testPtr) {
462185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        UErrorCode   err = U_ZERO_ERROR;
462285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        UConverter * cnv = ucnv_open(testPtr->converterName, &err);
462385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        if (U_FAILURE(err)) {
462485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            log_data_err("Unable to open %s converter: %s\n", testPtr->converterName, u_errorName(err));
462585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            return;
462685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
462785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        ucnv_setToUCallBack(cnv, UCNV_TO_U_CALLBACK_EMPTYSEGMENT, NULL, NULL, NULL, &err);
462885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        if (U_FAILURE(err)) {
462985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            log_data_err("Unable to setToUCallBack for %s converter: %s\n", testPtr->converterName, u_errorName(err));
463085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            ucnv_close(cnv);
463185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            return;
463285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
463385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        {
463485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            UChar         toUChars[kEmptySegmentToUCharsMax];
463585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            UChar *       toUCharsPtr = toUChars;
463685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            const UChar * toUCharsLimit = toUCharsPtr + kEmptySegmentToUCharsMax;
463785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            const char *  inCharsPtr = testPtr->inputText;
463885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            const char *  inCharsLimit = inCharsPtr + testPtr->inputTextLength;
463985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            ucnv_toUnicode(cnv, &toUCharsPtr, toUCharsLimit, &inCharsPtr, inCharsLimit, NULL, TRUE, &err);
464085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        }
464185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        ucnv_close(cnv);
464285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
464385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}
464485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
4645ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
4646ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruTestEBCDIC_STATEFUL() {
4647ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* test input */
4648ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint8_t in[]={
4649ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x61,
4650ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x1a,
4651ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0f, 0x4b,
4652ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x42,
4653ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x40,
4654ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x36,
4655ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
4656ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4657ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* expected test results */
4658ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int32_t results[]={
4659ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* number of bytes read, code point */
4660ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        1, 0x002f,
4661ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        1, 0x0092,
4662ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        2, 0x002e,
4663ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        1, 0xff62,
4664ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        1, 0x0020,
4665ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        1, 0x0096,
4666ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4667ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
4668ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint8_t in2[]={
4669ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0f,
4670ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xa1,
4671ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x01
4672ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
4673ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4674ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* expected test results */
4675ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int32_t results2[]={
4676ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* number of bytes read, code point */
4677ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        2, 0x203E,
4678ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        1, 0x0001,
4679ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
4680ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4681ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *source=(const char *)in, *limit=(const char *)in+sizeof(in);
4682ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode errorCode=U_ZERO_ERROR;
4683ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UConverter *cnv=ucnv_open("ibm-930", &errorCode);
4684ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
4685ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_data_err("Unable to open a EBCDIC_STATEFUL(ibm-930) converter: %s\n", u_errorName(errorCode));
4686ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
4687ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
4688ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestNextUChar(cnv, source, limit, results, "EBCDIC_STATEFUL(ibm-930)");
4689ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_reset(cnv);
4690ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     /* Test the condition when source >= sourceLimit */
4691ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestNextUCharError(cnv, source, source, U_INDEX_OUTOFBOUNDS_ERROR, "sourceLimit <= source");
4692ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_reset(cnv);
4693ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*Test for the condition where source > sourcelimit after consuming the shift chracter */
4694ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
4695ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const uint8_t source1[]={0x0f};
4696ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TestNextUCharError(cnv, (const char*)source1, (const char*)source1+sizeof(source1), U_INDEX_OUTOFBOUNDS_ERROR, "a character is truncated");
4697ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
4698ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*Test for the condition where there is an invalid character*/
4699ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_reset(cnv);
4700ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
4701ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        static const uint8_t source2[]={0x0e, 0x7F, 0xFF};
4702ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TestNextUCharError(cnv, (const char*)source2, (const char*)source2+sizeof(source2), U_ZERO_ERROR, "an invalid character [EBCDIC STATEFUL]");
4703ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
4704ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_reset(cnv);
4705ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    source=(const char*)in2;
4706ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    limit=(const char*)in2+sizeof(in2);
4707ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestNextUChar(cnv,source,limit,results2,"EBCDIC_STATEFUL(ibm-930),seq#2");
4708ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_close(cnv);
4709ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4710ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
4711ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4712ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
4713ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruTestGB18030() {
4714ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* test input */
4715ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint8_t in[]={
4716ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x24,
4717ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x7f,
4718ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x81, 0x30, 0x81, 0x30,
4719ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xa8, 0xbf,
4720ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xa2, 0xe3,
4721ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xd2, 0xbb,
4722ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x82, 0x35, 0x8f, 0x33,
4723ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x84, 0x31, 0xa4, 0x39,
4724ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x90, 0x30, 0x81, 0x30,
4725ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xe3, 0x32, 0x9a, 0x35
4726ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if 0
4727ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /*
4728ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         * Feature removed   markus 2000-oct-26
4729ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         * Only some codepages must match surrogate pairs into supplementary code points -
4730ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         * see javadoc for ucnv_getNextUChar() and implementation notes in ucnvmbcs.c .
4731ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         * GB 18030 provides direct encodings for supplementary code points, therefore
4732ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         * it must not combine two single-encoded surrogates into one code point.
4733ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         */
4734ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x83, 0x36, 0xc8, 0x30, 0x83, 0x37, 0xb0, 0x34 /* separately encoded surrogates */
4735ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
4736ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
4737ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4738ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* expected test results */
4739ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int32_t results[]={
4740ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* number of bytes read, code point */
4741ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        1, 0x24,
4742ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        1, 0x7f,
4743ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        4, 0x80,
4744ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        2, 0x1f9,
4745ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        2, 0x20ac,
4746ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        2, 0x4e00,
4747ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        4, 0x9fa6,
4748ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        4, 0xffff,
4749ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        4, 0x10000,
4750ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        4, 0x10ffff
4751ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if 0
4752ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* Feature removed. See comment above. */
4753ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        8, 0x10000
4754ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
4755ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
4756ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4757ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*    const char *source=(const char *)in,*limit=(const char *)in+sizeof(in); */
4758ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode errorCode=U_ZERO_ERROR;
4759ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UConverter *cnv=ucnv_open("gb18030", &errorCode);
4760ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
4761ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_data_err("Unable to open a gb18030 converter: %s\n", u_errorName(errorCode));
4762ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
4763ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
4764ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    TestNextUChar(cnv, (const char *)in, (const char *)in+sizeof(in), results, "gb18030");
4765ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_close(cnv);
4766ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
4767ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4768ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
4769ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruTestLMBCS() {
4770ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* LMBCS-1 string */
4771ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint8_t pszLMBCS[]={
4772ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x61,
4773ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x01, 0x29,
4774ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x81,
4775ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xA0,
4776ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0F, 0x27,
4777ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0F, 0x91,
4778ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x14, 0x0a, 0x74,
4779ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x14, 0xF6, 0x02,
4780ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x14, 0xd8, 0x4d, 0x14, 0xdc, 0x56, /* UTF-16 surrogate pair */
4781ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x10, 0x88, 0xA0,
4782ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
4783ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4784ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* Unicode UChar32 equivalents */
4785ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const UChar32 pszUnicode32[]={
4786ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* code point */
4787ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x00000061,
4788ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x00002013,
4789ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x000000FC,
4790ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x000000E1,
4791ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x00000007,
4792ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x00000091,
4793ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x00000a74,
4794ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x00000200,
4795ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x00023456, /* code point for surrogate pair */
4796ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x00005516
4797ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
4798ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4799ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* Unicode UChar equivalents */
4800ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const UChar pszUnicode[]={
4801ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* code point */
4802ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0061,
4803ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x2013,
4804ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x00FC,
4805ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x00E1,
4806ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0007,
4807ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0091,
4808ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0a74,
4809ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0200,
4810ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xD84D, /* low surrogate */
4811ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0xDC56, /* high surrogate */
4812ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x5516
4813ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
4814ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4815ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* expected test results */
4816ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int offsets32[]={
4817ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* number of bytes read, code point */
4818ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0,
4819ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        1,
4820ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        3,
4821ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        4,
4822ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        5,
4823ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        7,
4824ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        9,
4825ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        12,
4826ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        15,
4827ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        21,
4828ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        24
4829ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
4830ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4831ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* expected test results */
4832ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const int offsets[]={
4833ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* number of bytes read, code point */
4834ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0,
4835ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        1,
4836ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        3,
4837ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        4,
4838ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        5,
4839ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        7,
4840ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        9,
4841ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        12,
4842ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        15,
4843ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        18,
4844ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        21,
4845ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        24
4846ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
4847ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4848ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4849ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UConverter *cnv;
4850ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4851ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define NAME_LMBCS_1 "LMBCS-1"
4852ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define NAME_LMBCS_2 "LMBCS-2"
4853ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4854ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4855ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   /* Some basic open/close/property tests on some LMBCS converters */
4856ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
4857ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4858ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      char expected_subchars[] = {0x3F};   /* ANSI Question Mark */
4859ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      char new_subchars [] = {0x7F};       /* subst char used by SmartSuite..*/
4860ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      char get_subchars [1];
4861ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      const char * get_name;
4862ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      UConverter *cnv1;
4863ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      UConverter *cnv2;
4864ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4865ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      int8_t len = sizeof(get_subchars);
4866ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4867ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      UErrorCode errorCode=U_ZERO_ERROR;
4868ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4869ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      /* Open */
4870ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      cnv1=ucnv_open(NAME_LMBCS_1, &errorCode);
4871ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      if(U_FAILURE(errorCode)) {
4872ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         log_data_err("Unable to open a LMBCS-1 converter: %s\n", u_errorName(errorCode));
4873ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         return;
4874ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      }
4875ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      cnv2=ucnv_open(NAME_LMBCS_2, &errorCode);
4876ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      if(U_FAILURE(errorCode)) {
4877ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         log_data_err("Unable to open a LMBCS-2 converter: %s\n", u_errorName(errorCode));
4878ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         return;
4879ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      }
4880ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4881ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      /* Name */
4882ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      get_name = ucnv_getName (cnv1, &errorCode);
4883ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      if (strcmp(NAME_LMBCS_1,get_name)){
4884ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         log_err("Unexpected converter name: %s\n", get_name);
4885ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      }
4886ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      get_name = ucnv_getName (cnv2, &errorCode);
4887ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      if (strcmp(NAME_LMBCS_2,get_name)){
4888ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         log_err("Unexpected converter name: %s\n", get_name);
4889ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      }
4890ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4891ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      /* substitution chars */
4892ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      ucnv_getSubstChars (cnv1, get_subchars, &len, &errorCode);
4893ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      if(U_FAILURE(errorCode)) {
4894ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         log_err("Failure on get subst chars: %s\n", u_errorName(errorCode));
4895ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      }
4896ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      if (len!=1){
4897ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         log_err("Unexpected length of sub chars\n");
4898ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      }
4899ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      if (get_subchars[0] != expected_subchars[0]){
4900ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru           log_err("Unexpected value of sub chars\n");
4901ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      }
4902ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      ucnv_setSubstChars (cnv2,new_subchars, len, &errorCode);
4903ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      if(U_FAILURE(errorCode)) {
4904ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         log_err("Failure on set subst chars: %s\n", u_errorName(errorCode));
4905ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      }
4906ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      ucnv_getSubstChars (cnv2, get_subchars, &len, &errorCode);
4907ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      if(U_FAILURE(errorCode)) {
4908ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         log_err("Failure on get subst chars: %s\n", u_errorName(errorCode));
4909ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      }
4910ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      if (len!=1){
4911ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         log_err("Unexpected length of sub chars\n");
4912ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      }
4913ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      if (get_subchars[0] != new_subchars[0]){
4914ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru           log_err("Unexpected value of sub chars\n");
4915ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      }
4916ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      ucnv_close(cnv1);
4917ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      ucnv_close(cnv2);
4918ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4919ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
4920ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4921ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* LMBCS to Unicode - offsets */
4922ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
4923ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       UErrorCode errorCode=U_ZERO_ERROR;
4924ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4925ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       const char * pSource = (const char *)pszLMBCS;
4926ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       const char * sourceLimit = (const char *)pszLMBCS + sizeof(pszLMBCS);
4927ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4928ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       UChar Out [sizeof(pszUnicode) + 1];
4929ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       UChar * pOut = Out;
4930ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       UChar * OutLimit = Out + sizeof(pszUnicode)/sizeof(UChar);
4931ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4932ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       int32_t off [sizeof(offsets)];
4933ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4934ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      /* last 'offset' in expected results is just the final size.
4935ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         (Makes other tests easier). Compensate here: */
4936ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4937ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       off[(sizeof(offsets)/sizeof(offsets[0]))-1] = sizeof(pszLMBCS);
4938ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4939ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4940ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4941ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      cnv=ucnv_open("lmbcs", &errorCode); /* use generic name for LMBCS-1 */
4942ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      if(U_FAILURE(errorCode)) {
4943ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru           log_data_err("Unable to open a LMBCS converter: %s\n", u_errorName(errorCode));
4944ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru           return;
4945ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      }
4946ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4947ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4948ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4949ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      ucnv_toUnicode (cnv,
4950ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                      &pOut,
4951ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                      OutLimit,
4952ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                      &pSource,
4953ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                      sourceLimit,
4954ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                      off,
4955ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                      TRUE,
4956ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                      &errorCode);
4957ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4958ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4959ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       if (memcmp(off,offsets,sizeof(offsets)))
4960ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       {
4961ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         log_err("LMBCS->Uni: Calculated offsets do not match expected results\n");
4962ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       }
4963ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       if (memcmp(Out,pszUnicode,sizeof(pszUnicode)))
4964ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       {
4965ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         log_err("LMBCS->Uni: Calculated codepoints do not match expected results\n");
4966ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       }
4967ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       ucnv_close(cnv);
4968ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
4969ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
4970ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   /* LMBCS to Unicode - getNextUChar */
4971ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      const char * sourceStart;
4972ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      const char *source=(const char *)pszLMBCS;
4973ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      const char *limit=(const char *)pszLMBCS+sizeof(pszLMBCS);
4974ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      const UChar32 *results= pszUnicode32;
4975ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      const int *off = offsets32;
4976ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4977ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      UErrorCode errorCode=U_ZERO_ERROR;
4978ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      UChar32 uniChar;
4979ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4980ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      cnv=ucnv_open("LMBCS-1", &errorCode);
4981ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      if(U_FAILURE(errorCode)) {
4982ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru           log_data_err("Unable to open a LMBCS-1 converter: %s\n", u_errorName(errorCode));
4983ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru           return;
4984ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      }
4985ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      else
4986ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      {
4987ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
4988ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         while(source<limit) {
4989ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            sourceStart=source;
4990ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            uniChar=ucnv_getNextUChar(cnv, &source, source + (off[1] - off[0]), &errorCode);
4991ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if(U_FAILURE(errorCode)) {
4992ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                  log_err("LMBCS-1 ucnv_getNextUChar() failed: %s\n", u_errorName(errorCode));
4993ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                  break;
4994ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            } else if(source-sourceStart != off[1] - off[0] || uniChar != *results) {
4995ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru               log_err("LMBCS-1 ucnv_getNextUChar() result %lx from %d bytes, should have been %lx from %d bytes.\n",
4996ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                   uniChar, (source-sourceStart), *results, *off);
4997ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru               break;
4998ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
4999ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            results++;
5000ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            off++;
5001ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         }
5002ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       }
5003ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       ucnv_close(cnv);
5004ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
5005ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    { /* test locale & optimization group operations: Unicode to LMBCS */
5006ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5007ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      UErrorCode errorCode=U_ZERO_ERROR;
5008ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      UConverter *cnv16he = ucnv_open("LMBCS-16,locale=he", &errorCode);
5009ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      UConverter *cnv16jp = ucnv_open("LMBCS-16,locale=ja_JP", &errorCode);
5010ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      UConverter *cnv01us = ucnv_open("LMBCS-1,locale=us_EN", &errorCode);
5011ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      UChar uniString [] = {0x0192}; /* Latin Small letter f with hook */
5012ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      const UChar * pUniOut = uniString;
5013ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      UChar * pUniIn = uniString;
5014ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      uint8_t lmbcsString [4];
5015ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      const char * pLMBCSOut = (const char *)lmbcsString;
5016ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      char * pLMBCSIn = (char *)lmbcsString;
5017ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5018ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      /* 0192 (hook) converts to both group 3 & group 1. input locale should differentiate */
5019ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      ucnv_fromUnicode (cnv16he,
5020ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        &pLMBCSIn, (pLMBCSIn + sizeof(lmbcsString)/sizeof(lmbcsString[0])),
5021ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        &pUniOut, pUniOut + sizeof(uniString)/sizeof(uniString[0]),
5022ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        NULL, 1, &errorCode);
5023ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5024ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      if (lmbcsString[0] != 0x3 || lmbcsString[1] != 0x83)
5025ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      {
5026ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         log_err("LMBCS-16,locale=he gives unexpected translation\n");
5027ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      }
5028ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5029ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      pLMBCSIn= (char *)lmbcsString;
5030ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      pUniOut = uniString;
5031ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      ucnv_fromUnicode (cnv01us,
5032ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        &pLMBCSIn, (const char *)(lmbcsString + sizeof(lmbcsString)/sizeof(lmbcsString[0])),
5033ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        &pUniOut, pUniOut + sizeof(uniString)/sizeof(uniString[0]),
5034ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        NULL, 1, &errorCode);
5035ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5036ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      if (lmbcsString[0] != 0x9F)
5037ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      {
5038ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         log_err("LMBCS-1,locale=US gives unexpected translation\n");
5039ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      }
5040ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5041ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      /* single byte char from mbcs char set */
5042ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      lmbcsString[0] = 0xAE;  /* 1/2 width katakana letter small Yo */
5043ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      pLMBCSOut = (const char *)lmbcsString;
5044ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      pUniIn = uniString;
5045ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      ucnv_toUnicode (cnv16jp,
5046ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        &pUniIn, pUniIn + 1,
5047ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        &pLMBCSOut, (pLMBCSOut + 1),
5048ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        NULL, 1, &errorCode);
5049ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      if (U_FAILURE(errorCode) || pLMBCSOut != (const char *)lmbcsString+1 || pUniIn != uniString+1 || uniString[0] != 0xFF6E)
5050ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      {
5051ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru           log_err("Unexpected results from LMBCS-16 single byte char\n");
5052ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      }
5053ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      /* convert to group 1: should be 3 bytes */
5054ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      pLMBCSIn = (char *)lmbcsString;
5055ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      pUniOut = uniString;
5056ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      ucnv_fromUnicode (cnv01us,
5057ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        &pLMBCSIn, (const char *)(pLMBCSIn + 3),
5058ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        &pUniOut, pUniOut + 1,
5059ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        NULL, 1, &errorCode);
5060ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      if (U_FAILURE(errorCode) || pLMBCSIn != (const char *)lmbcsString+3 || pUniOut != uniString+1
5061ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         || lmbcsString[0] != 0x10 || lmbcsString[1] != 0x10 || lmbcsString[2] != 0xAE)
5062ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      {
5063ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru           log_err("Unexpected results to LMBCS-1 single byte mbcs char\n");
5064ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      }
5065ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      pLMBCSOut = (const char *)lmbcsString;
5066ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      pUniIn = uniString;
5067ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      ucnv_toUnicode (cnv01us,
5068ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        &pUniIn, pUniIn + 1,
5069ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        &pLMBCSOut, (const char *)(pLMBCSOut + 3),
5070ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        NULL, 1, &errorCode);
5071ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      if (U_FAILURE(errorCode) || pLMBCSOut != (const char *)lmbcsString+3 || pUniIn != uniString+1 || uniString[0] != 0xFF6E)
5072ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      {
5073ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru           log_err("Unexpected results from LMBCS-1 single byte mbcs char\n");
5074ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      }
5075ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      pLMBCSIn = (char *)lmbcsString;
5076ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      pUniOut = uniString;
5077ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      ucnv_fromUnicode (cnv16jp,
5078ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        &pLMBCSIn, (const char *)(pLMBCSIn + 1),
5079ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        &pUniOut, pUniOut + 1,
5080ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        NULL, 1, &errorCode);
5081ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      if (U_FAILURE(errorCode) || pLMBCSIn != (const char *)lmbcsString+1 || pUniOut != uniString+1 || lmbcsString[0] != 0xAE)
5082ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      {
5083ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru           log_err("Unexpected results to LMBCS-16 single byte mbcs char\n");
5084ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      }
5085ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      ucnv_close(cnv16he);
5086ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      ucnv_close(cnv16jp);
5087ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      ucnv_close(cnv01us);
5088ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
5089ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
5090ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       /* Small source buffer testing, LMBCS -> Unicode */
5091ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5092ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       UErrorCode errorCode=U_ZERO_ERROR;
5093ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5094ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       const char * pSource = (const char *)pszLMBCS;
5095ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       const char * sourceLimit = (const char *)pszLMBCS + sizeof(pszLMBCS);
5096ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       int codepointCount = 0;
5097ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5098ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       UChar Out [sizeof(pszUnicode) + 1];
5099ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       UChar * pOut = Out;
5100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       UChar * OutLimit = Out + sizeof(pszUnicode)/sizeof(UChar);
5101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       cnv = ucnv_open(NAME_LMBCS_1, &errorCode);
5104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       if(U_FAILURE(errorCode)) {
5105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru           log_err("Unable to open a LMBCS-1 converter: %s\n", u_errorName(errorCode));
5106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru           return;
5107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       }
5108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       while ((pSource < sourceLimit) && U_SUCCESS (errorCode))
5111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       {
5112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru           ucnv_toUnicode (cnv,
5113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru               &pOut,
5114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru               OutLimit,
5115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru               &pSource,
5116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru               (pSource+1), /* claim that this is a 1- byte buffer */
5117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru               NULL,
5118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru               FALSE,    /* FALSE means there might be more chars in the next buffer */
5119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru               &errorCode);
5120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru           if (U_SUCCESS (errorCode))
5122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru           {
5123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru               if ((pSource - (const char *)pszLMBCS) == offsets [codepointCount+1])
5124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru               {
5125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                   /* we are on to the next code point: check value */
5126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                   if (Out[0] != pszUnicode[codepointCount]){
5128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                       log_err("LMBCS->Uni result %lx should have been %lx \n",
5129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                           Out[0], pszUnicode[codepointCount]);
5130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                   }
5131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                   pOut = Out; /* reset for accumulating next code point */
5133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                   codepointCount++;
5134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru               }
5135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru           }
5136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru           else
5137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru           {
5138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru               log_err("Unexpected Error on toUnicode: %s\n", u_errorName(errorCode));
5139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru           }
5140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       }
5141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       {
5142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         /* limits & surrogate error testing */
5143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         char LIn [sizeof(pszLMBCS)];
5144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         const char * pLIn = LIn;
5145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         char LOut [sizeof(pszLMBCS)];
5147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         char * pLOut = LOut;
5148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         UChar UOut [sizeof(pszUnicode)];
5150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         UChar * pUOut = UOut;
5151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         UChar UIn [sizeof(pszUnicode)];
5153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         const UChar * pUIn = UIn;
5154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         int32_t off [sizeof(offsets)];
5156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         UChar32 uniChar;
5157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5158ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         errorCode=U_ZERO_ERROR;
5159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         /* negative source request should always return U_ILLEGAL_ARGUMENT_ERROR */
516127f654740f2a26ad62a5c155af9199af9e69b889claireho         pUIn++;
516227f654740f2a26ad62a5c155af9199af9e69b889claireho         ucnv_fromUnicode(cnv, &pLOut, pLOut+1, &pUIn, pUIn-1, off, FALSE, &errorCode);
5163ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         if (errorCode != U_ILLEGAL_ARGUMENT_ERROR)
5164ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         {
5165ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("Unexpected Error on negative source request to ucnv_fromUnicode: %s\n", u_errorName(errorCode));
5166ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         }
516727f654740f2a26ad62a5c155af9199af9e69b889claireho         pUIn--;
516827f654740f2a26ad62a5c155af9199af9e69b889claireho
5169ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         errorCode=U_ZERO_ERROR;
5170ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         ucnv_toUnicode(cnv, &pUOut,pUOut+1,(const char **)&pLIn,(const char *)(pLIn-1),off,FALSE, &errorCode);
5171ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         if (errorCode != U_ILLEGAL_ARGUMENT_ERROR)
5172ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         {
5173ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("Unexpected Error on negative source request to ucnv_toUnicode: %s\n", u_errorName(errorCode));
5174ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         }
5175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         errorCode=U_ZERO_ERROR;
5176ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5177ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         uniChar = ucnv_getNextUChar(cnv, (const char **)&pLIn, (const char *)(pLIn-1), &errorCode);
5178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         if (errorCode != U_ILLEGAL_ARGUMENT_ERROR)
5179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         {
5180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("Unexpected Error on negative source request to ucnv_getNextUChar: %s\n", u_errorName(errorCode));
5181ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         }
5182ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         errorCode=U_ZERO_ERROR;
5183ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5184ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         /* 0 byte source request - no error, no pointer movement */
5185ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         ucnv_toUnicode(cnv, &pUOut,pUOut+1,(const char **)&pLIn,(const char *)pLIn,off,FALSE, &errorCode);
5186ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         ucnv_fromUnicode(cnv, &pLOut,pLOut+1,&pUIn,pUIn,off,FALSE, &errorCode);
5187ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         if(U_FAILURE(errorCode)) {
5188ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("0 byte source request: unexpected error: %s\n", u_errorName(errorCode));
5189ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         }
5190ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         if ((pUOut != UOut) || (pUIn != UIn) || (pLOut != LOut) || (pLIn != LIn))
5191ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         {
5192ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru              log_err("Unexpected pointer move in 0 byte source request \n");
5193ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         }
5194ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         /*0 byte source request - GetNextUChar : error & value == fffe or ffff */
5195ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         uniChar = ucnv_getNextUChar(cnv, (const char **)&pLIn, (const char *)pLIn, &errorCode);
5196ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         if (errorCode != U_INDEX_OUTOFBOUNDS_ERROR)
5197ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         {
5198ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("Unexpected Error on 0-byte source request to ucnv_getnextUChar: %s\n", u_errorName(errorCode));
5199ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         }
5200ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         if (((uint32_t)uniChar - 0xfffe) > 1) /* not 0xfffe<=uniChar<=0xffff */
5201ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         {
5202ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("Unexpected value on 0-byte source request to ucnv_getnextUChar \n");
5203ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         }
5204ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         errorCode = U_ZERO_ERROR;
5205ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5206ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         /* running out of target room : U_BUFFER_OVERFLOW_ERROR */
5207ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5208ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         pUIn = pszUnicode;
5209ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         ucnv_fromUnicode(cnv, &pLOut,pLOut+offsets[4],&pUIn,pUIn+sizeof(pszUnicode)/sizeof(UChar),off,FALSE, &errorCode);
5210ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         if (errorCode != U_BUFFER_OVERFLOW_ERROR || pLOut != LOut + offsets[4] || pUIn != pszUnicode+4 )
5211ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         {
5212ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("Unexpected results on out of target room to ucnv_fromUnicode\n");
5213ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         }
5214ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5215ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         errorCode = U_ZERO_ERROR;
5216ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5217ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         pLIn = (const char *)pszLMBCS;
5218ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         ucnv_toUnicode(cnv, &pUOut,pUOut+4,&pLIn,(pLIn+sizeof(pszLMBCS)),off,FALSE, &errorCode);
5219ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         if (errorCode != U_BUFFER_OVERFLOW_ERROR || pUOut != UOut + 4 || pLIn != (const char *)pszLMBCS+offsets[4])
5220ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         {
5221ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("Unexpected results on out of target room to ucnv_toUnicode\n");
5222ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         }
5223ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5224ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         /* unpaired or chopped LMBCS surrogates */
5225ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5226ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         /* OK high surrogate, Low surrogate is chopped */
5227ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         LIn [0] = (char)0x14;
5228ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         LIn [1] = (char)0xD8;
5229ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         LIn [2] = (char)0x01;
5230ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         LIn [3] = (char)0x14;
5231ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         LIn [4] = (char)0xDC;
5232ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         pLIn = LIn;
5233ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         errorCode = U_ZERO_ERROR;
5234ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         pUOut = UOut;
5235ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5236ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         ucnv_setToUCallBack(cnv, UCNV_TO_U_CALLBACK_STOP, NULL, NULL, NULL, &errorCode);
5237ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         ucnv_toUnicode(cnv, &pUOut,pUOut+sizeof(UOut)/sizeof(UChar),(const char **)&pLIn,(const char *)(pLIn+5),off,TRUE, &errorCode);
5238ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         if (UOut[0] != 0xD801 || errorCode != U_TRUNCATED_CHAR_FOUND || pUOut != UOut + 1 || pLIn != LIn + 5)
5239ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         {
5240ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("Unexpected results on chopped low surrogate\n");
5241ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         }
5242ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5243ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         /* chopped at surrogate boundary */
5244ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         LIn [0] = (char)0x14;
5245ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         LIn [1] = (char)0xD8;
5246ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         LIn [2] = (char)0x01;
5247ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         pLIn = LIn;
5248ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         errorCode = U_ZERO_ERROR;
5249ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         pUOut = UOut;
5250ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5251ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         ucnv_toUnicode(cnv, &pUOut,pUOut+sizeof(UOut)/sizeof(UChar),(const char **)&pLIn,(const char *)(pLIn+3),off,TRUE, &errorCode);
5252ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         if (UOut[0] != 0xD801 || U_FAILURE(errorCode) || pUOut != UOut + 1 || pLIn != LIn + 3)
5253ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         {
5254ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("Unexpected results on chopped at surrogate boundary \n");
5255ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         }
5256ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5257ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         /* unpaired surrogate plus valid Unichar */
5258ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         LIn [0] = (char)0x14;
5259ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         LIn [1] = (char)0xD8;
5260ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         LIn [2] = (char)0x01;
5261ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         LIn [3] = (char)0x14;
5262ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         LIn [4] = (char)0xC9;
5263ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         LIn [5] = (char)0xD0;
5264ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         pLIn = LIn;
5265ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         errorCode = U_ZERO_ERROR;
5266ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         pUOut = UOut;
5267ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5268ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         ucnv_toUnicode(cnv, &pUOut,pUOut+sizeof(UOut)/sizeof(UChar),(const char **)&pLIn,(const char *)(pLIn+6),off,TRUE, &errorCode);
5269ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         if (UOut[0] != 0xD801 || UOut[1] != 0xC9D0 || U_FAILURE(errorCode) || pUOut != UOut + 2 || pLIn != LIn + 6)
5270ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         {
5271ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("Unexpected results after unpaired surrogate plus valid Unichar \n");
5272ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         }
5273ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5274ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      /* unpaired surrogate plus chopped Unichar */
5275ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         LIn [0] = (char)0x14;
5276ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         LIn [1] = (char)0xD8;
5277ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         LIn [2] = (char)0x01;
5278ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         LIn [3] = (char)0x14;
5279ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         LIn [4] = (char)0xC9;
5280ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5281ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         pLIn = LIn;
5282ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         errorCode = U_ZERO_ERROR;
5283ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         pUOut = UOut;
5284ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5285ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         ucnv_toUnicode(cnv, &pUOut,pUOut+sizeof(UOut)/sizeof(UChar),(const char **)&pLIn,(const char *)(pLIn+5),off,TRUE, &errorCode);
5286ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         if (UOut[0] != 0xD801 || errorCode != U_TRUNCATED_CHAR_FOUND || pUOut != UOut + 1 || pLIn != LIn + 5)
5287ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         {
5288ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("Unexpected results after unpaired surrogate plus chopped Unichar \n");
5289ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         }
5290ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5291ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         /* unpaired surrogate plus valid non-Unichar */
5292ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         LIn [0] = (char)0x14;
5293ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         LIn [1] = (char)0xD8;
5294ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         LIn [2] = (char)0x01;
5295ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         LIn [3] = (char)0x0F;
5296ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         LIn [4] = (char)0x3B;
5297ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5298ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         pLIn = LIn;
5299ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         errorCode = U_ZERO_ERROR;
5300ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         pUOut = UOut;
5301ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5302ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         ucnv_toUnicode(cnv, &pUOut,pUOut+sizeof(UOut)/sizeof(UChar),(const char **)&pLIn,(const char *)(pLIn+5),off,TRUE, &errorCode);
5303ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         if (UOut[0] != 0xD801 || UOut[1] != 0x1B || U_FAILURE(errorCode) || pUOut != UOut + 2 || pLIn != LIn + 5)
5304ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         {
5305ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("Unexpected results after unpaired surrogate plus valid non-Unichar\n");
5306ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         }
5307ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5308ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         /* unpaired surrogate plus chopped non-Unichar */
5309ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         LIn [0] = (char)0x14;
5310ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         LIn [1] = (char)0xD8;
5311ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         LIn [2] = (char)0x01;
5312ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         LIn [3] = (char)0x0F;
5313ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5314ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         pLIn = LIn;
5315ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         errorCode = U_ZERO_ERROR;
5316ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         pUOut = UOut;
5317ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5318ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         ucnv_toUnicode(cnv, &pUOut,pUOut+sizeof(UOut)/sizeof(UChar),(const char **)&pLIn,(const char *)(pLIn+4),off,TRUE, &errorCode);
5319ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5320ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         if (UOut[0] != 0xD801 || errorCode != U_TRUNCATED_CHAR_FOUND || pUOut != UOut + 1 || pLIn != LIn + 4)
5321ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         {
5322ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("Unexpected results after unpaired surrogate plus chopped non-Unichar\n");
5323ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         }
5324ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       }
5325ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
5326ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   ucnv_close(cnv);  /* final cleanup */
5327ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
5328ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5329ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5330ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestJitterbug255()
5331ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
5332ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const uint8_t testBytes[] = { 0x95, 0xcf, 0x8a, 0xb7, 0x0d, 0x0a, 0x00 };
5333ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *testBuffer = (const char *)testBytes;
5334ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *testEnd = (const char *)testBytes + sizeof(testBytes);
5335ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
533650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /*UChar32 result;*/
5337ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UConverter *cnv = 0;
5338ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5339ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cnv = ucnv_open("shift-jis", &status);
5340ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status) || cnv == 0) {
5341ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_data_err("Failed to open the converter for SJIS.\n");
5342ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                return;
5343ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
5344ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    while (testBuffer != testEnd)
5345ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
534650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /*result = */ucnv_getNextUChar (cnv, &testBuffer, testEnd , &status);
5347ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (U_FAILURE(status))
5348ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {
5349ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("Failed to convert the next UChar for SJIS.\n");
5350ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            break;
5351ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
5352ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
5353ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_close(cnv);
5354ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
5355ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5356ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestEBCDICUS4XML()
5357ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
5358ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar unicodes_x[] = {0x0000, 0x0000, 0x0000, 0x0000};
5359ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const UChar toUnicodeMaps_x[] = {0x000A, 0x000A, 0x000D, 0x0000};
5360ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const char fromUnicodeMaps_x[] = {0x25, 0x25, 0x0D, 0x00};
5361ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const char newLines_x[] = {0x25, 0x15, 0x0D, 0x00};
5362ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char target_x[] = {0x00, 0x00, 0x00, 0x00};
5363ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *unicodes = unicodes_x;
5364ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const UChar *toUnicodeMaps = toUnicodeMaps_x;
5365ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char *target = target_x;
5366ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* fromUnicodeMaps = fromUnicodeMaps_x, *newLines = newLines_x;
5367ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
5368ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UConverter *cnv = 0;
5369ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5370ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    cnv = ucnv_open("ebcdic-xml-us", &status);
5371ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status) || cnv == 0) {
5372ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_data_err("Failed to open the converter for EBCDIC-XML-US.\n");
5373ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
5374ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
5375ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_toUnicode(cnv, &unicodes, unicodes+3, (const char**)&newLines, newLines+3, NULL, TRUE, &status);
5376ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status) || memcmp(unicodes_x, toUnicodeMaps, sizeof(UChar)*3) != 0) {
5377ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("To Unicode conversion failed in EBCDICUS4XML test. %s\n",
5378ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            u_errorName(status));
5379ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        printUSeqErr(unicodes_x, 3);
5380ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        printUSeqErr(toUnicodeMaps, 3);
5381ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
5382ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    status = U_ZERO_ERROR;
5383ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_fromUnicode(cnv, &target, target+3, (const UChar**)&toUnicodeMaps, toUnicodeMaps+3, NULL, TRUE, &status);
5384ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status) || memcmp(target_x, fromUnicodeMaps, sizeof(char)*3) != 0) {
5385ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("From Unicode conversion failed in EBCDICUS4XML test. %s\n",
5386ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            u_errorName(status));
5387ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        printSeqErr((const unsigned char*)target_x, 3);
5388ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        printSeqErr((const unsigned char*)fromUnicodeMaps, 3);
5389ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
5390ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_close(cnv);
5391ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
5392ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_LEGACY_COLLATION */
5393ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5394ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if !UCONFIG_NO_COLLATION
5395ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5396ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestJitterbug981(){
5397ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const UChar* rules;
5398ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t rules_length, target_cap, bytes_needed, buff_size;
5399ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
5400ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UConverter *utf8cnv;
5401ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UCollator* myCollator;
5402ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char *buff;
5403ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int numNeeded=0;
5404ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    utf8cnv = ucnv_open ("utf8", &status);
5405ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(status)){
540685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_err("Could not open UTF-8 converter. Error: %s\n", u_errorName(status));
5407ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
5408ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
5409ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    myCollator = ucol_open("zh", &status);
5410ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(status)){
541185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_data_err("Could not open collator for zh locale. Error: %s\n", u_errorName(status));
541285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        ucnv_close(utf8cnv);
5413ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
5414ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
5415ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5416ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    rules = ucol_getRules(myCollator, &rules_length);
5417ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    buff_size = rules_length * ucnv_getMaxCharSize(utf8cnv);
5418ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    buff = malloc(buff_size);
5419ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5420ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    target_cap = 0;
5421ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    do {
5422ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucnv_reset(utf8cnv);
5423ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        status = U_ZERO_ERROR;
5424ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(target_cap >= buff_size) {
5425ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("wanted %d bytes, only %d available\n", target_cap, buff_size);
5426ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            break;
5427ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
5428ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        bytes_needed = ucnv_fromUChars(utf8cnv, buff, target_cap,
5429ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            rules, rules_length, &status);
5430ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        target_cap = (bytes_needed > target_cap) ? bytes_needed : target_cap +1;
5431ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(numNeeded!=0 && numNeeded!= bytes_needed){
5432ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("ucnv_fromUChars returns different values for required capacity in pre-flight and conversion modes");
5433ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            break;
5434ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
5435ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        numNeeded = bytes_needed;
5436ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } while (status == U_BUFFER_OVERFLOW_ERROR);
5437ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucol_close(myCollator);
5438ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_close(utf8cnv);
5439ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    free(buff);
5440ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
5441ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5442ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
5443ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5444ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestJitterbug1293(){
5445ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const UChar src[] = {0x30DE, 0x30A4, 0x5E83, 0x544A, 0x30BF, 0x30A4, 0x30D7,0x000};
5446ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char target[256];
5447ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
5448ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UConverter* conv=NULL;
5449ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t target_cap, bytes_needed, numNeeded = 0;
5450ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    conv = ucnv_open("shift-jis",&status);
5451ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(status)){
5452ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      log_data_err("Could not open Shift-Jis converter. Error: %s", u_errorName(status));
5453ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      return;
5454ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
5455ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5456ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    do{
5457ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        target_cap =0;
5458ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        bytes_needed = ucnv_fromUChars(conv,target,256,src,u_strlen(src),&status);
5459ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        target_cap = (bytes_needed > target_cap) ? bytes_needed : target_cap +1;
5460ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(numNeeded!=0 && numNeeded!= bytes_needed){
5461ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          log_err("ucnv_fromUChars returns different values for required capacity in pre-flight and conversion modes");
5462ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
5463ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        numNeeded = bytes_needed;
5464ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } while (status == U_BUFFER_OVERFLOW_ERROR);
5465ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(status)){
5466ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      log_err("An error occured in ucnv_fromUChars. Error: %s", u_errorName(status));
5467ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      return;
5468ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
5469ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_close(conv);
5470ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
5471ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestJB5275_1(){
5472ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5473ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const char* data = "\x3B\xB3\x0A" /* Easy characters */
5474ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                                "\xC0\xE9\xBF\xE9\xE8\xD8\x0A" /* Gurmukhi test */
5475ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                                /* Switch script: */
5476ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                                "\xEF\x43\xC0\xE9\xBF\xE9\xE8\xD8\x0A" /* Bengali test */
5477ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                                "\x3B\xB3\x0A" /* Easy characters - new line, so should default!*/
5478ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                                "\xEF\x40\x3B\xB3\x0A";
5479ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const UChar expected[] ={
5480ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x003b, 0x0a15, 0x000a, /* Easy characters */
548185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho            0x0a5c, 0x0a4d, 0x0a39, 0x0a5c, 0x0a4d, 0x0a39, 0x000a, /* Gurmukhi test */
5482ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x09dd, 0x09dc, 0x09cd, 0x09b9, 0x000a, /* Switch script: to Bengali*/
5483ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x003b, 0x0a15, 0x000a, /* Easy characters - new line, so should default!*/
5484ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            0x003b, 0x0a15, 0x000a /* Back to Gurmukhi*/
5485ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
5486ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5487ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
5488ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UConverter* conv = ucnv_open("iscii-gur", &status);
5489ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar dest[100] = {'\0'};
5490ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar* target = dest;
5491ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar* targetLimit = dest+100;
5492ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* source = data;
5493ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* sourceLimit = data+strlen(data);
5494ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const UChar* exp = expected;
549585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
549685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    if (U_FAILURE(status)) {
549785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        log_data_err("Unable to open converter: iscii-gur got errorCode: %s\n", u_errorName(status));
549885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        return;
549985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
550085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
5501ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    log_verbose("Testing switching back to default script when new line is encountered.\n");
5502ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_toUnicode(conv, &target, targetLimit, &source, sourceLimit, NULL, TRUE, &status);
5503ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(status)){
5504ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("conversion failed: %s \n", u_errorName(status));
5505ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
5506ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    targetLimit = target;
5507ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    target = dest;
5508ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    printUSeq(target, targetLimit-target);
5509ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    while(target<targetLimit){
5510ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(*exp!=*target){
5511ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("did not get the expected output. \\u%04X != \\u%04X (got)\n", *exp, *target);
5512ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
5513ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        target++;
5514ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        exp++;
5515ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
5516ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_close(conv);
5517ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
5518ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5519ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestJB5275(){
5520ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const char* data =
5521ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* "\xEF\x42\xEF\x41\xA4\xD5\xE5\xB3\xEA\x0A"  unsupported sequence \xEF\x41 */
5522ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* "\xEF\x42\xEF\x41\xD4\xDA\xB3\xE8\xEA\x0A"  unsupported sequence \xEF\x41  */
5523ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* "\xEF\x44\xEF\x41\xC8\xE1\x8B\xDB\xB3\xE8 \xB3\xE4\xC1\xE8\x0A"  unsupported sequence \xEF\x41 */
5524ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        "\xEF\x4B\xC0\xE9\xBF\xE9\xE8\xD8\x0A"  /* Gurmukhi test */
5525ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        "\xEF\x4A\xC0\xD4\xBF\xD4\xE8\xD8\x0A"  /* Gujarati test */
5526ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        "\xEF\x48\x38\xB3\x0A"  /* Kannada test */
5527ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        "\xEF\x49\x39\xB3\x0A"  /* Malayalam test */
5528ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        "\xEF\x4A\x3A\xB3\x0A"  /* Gujarati test */
5529ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        "\xEF\x4B\x3B\xB3\x0A"  /* Punjabi test */
5530ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* "\xEF\x4C\x3C\xB3\x0A"  unsupported sequence \xEF\x41 */;
5531ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    static const UChar expected[] ={
553285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        0x0A5C, 0x0A4D, 0x0A39, 0x0A5C, 0x0A4D, 0x0A39, 0x000A, /* Gurmukhi test */
5533ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0AA2, 0x0AB5, 0x0AA1, 0x0AB5, 0x0ACD, 0x0AB9, 0x000A,     /* Gujarati test */
5534ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0038, 0x0C95, 0x000A, /* Kannada test */
5535ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x0039, 0x0D15, 0x000A, /* Malayalam test */
5536ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x003A, 0x0A95, 0x000A, /* Gujarati test */
5537ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        0x003B, 0x0A15, 0x000A, /* Punjabi test */
5538ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
5539ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5540ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
5541ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UConverter* conv = ucnv_open("iscii", &status);
5542ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar dest[100] = {'\0'};
5543ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar* target = dest;
5544ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar* targetLimit = dest+100;
5545ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* source = data;
5546ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char* sourceLimit = data+strlen(data);
5547ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const UChar* exp = expected;
5548ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_toUnicode(conv, &target, targetLimit, &source, sourceLimit, NULL, TRUE, &status);
5549ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(status)){
5550ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("conversion failed: %s \n", u_errorName(status));
5551ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
5552ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    targetLimit = target;
5553ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    target = dest;
5554ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5555ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    printUSeq(target, targetLimit-target);
5556ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5557ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    while(target<targetLimit){
5558ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(*exp!=*target){
5559ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            log_err("did not get the expected output. \\u%04X != \\u%04X (got)\n", *exp, *target);
5560ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
5561ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        target++;
5562ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        exp++;
5563ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
5564ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_close(conv);
5565ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
5566b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
5567b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void
5568b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoTestIsFixedWidth() {
5569b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UErrorCode status = U_ZERO_ERROR;
5570b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UConverter *cnv = NULL;
5571b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t i;
5572b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
5573b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const char *fixedWidth[] = {
5574b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            "US-ASCII",
5575b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            "UTF32",
5576b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            "ibm-5478_P100-1995"
5577b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    };
5578b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
5579b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const char *notFixedWidth[] = {
5580b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            "GB18030",
5581b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            "UTF8",
5582b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            "windows-949-2000",
5583b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            "UTF16"
5584b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    };
5585b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
5586b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    for (i = 0; i < LENGTHOF(fixedWidth); i++) {
5587b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        cnv = ucnv_open(fixedWidth[i], &status);
5588b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (cnv == NULL || U_FAILURE(status)) {
5589b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            log_data_err("Error open converter: %s - %s \n", fixedWidth[i], u_errorName(status));
5590b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            continue;
5591b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
5592b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
5593b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (!ucnv_isFixedWidth(cnv, &status)) {
5594b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            log_err("%s is a fixedWidth converter but returned FALSE.\n", fixedWidth[i]);
5595b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
5596b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        ucnv_close(cnv);
5597b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
5598b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
5599b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    for (i = 0; i < LENGTHOF(notFixedWidth); i++) {
5600b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        cnv = ucnv_open(notFixedWidth[i], &status);
5601b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (cnv == NULL || U_FAILURE(status)) {
5602b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            log_data_err("Error open converter: %s - %s \n", notFixedWidth[i], u_errorName(status));
5603b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            continue;
5604b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
5605b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
5606b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (ucnv_isFixedWidth(cnv, &status)) {
5607b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            log_err("%s is NOT a fixedWidth converter but returned TRUE.\n", notFixedWidth[i]);
5608b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
5609b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        ucnv_close(cnv);
5610b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
5611b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
5612