1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/********************************************************************
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * COPYRIGHT:
3b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Copyright (c) 1997-2011, International Business Machines Corporation and
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * others. All Rights Reserved.
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ********************************************************************/
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*****************************************************************************
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* File CU_CAPITST.C
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Modification History:
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*        Name                      Description
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*     Madhu Katragadda              Ported for C API
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru******************************************************************************
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdio.h>
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdlib.h>
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <string.h>
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <ctype.h>
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uloc.h"
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ucnv.h"
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ucnv_err.h"
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/putil.h"
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uset.h"
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h"
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ucnv_bld.h" /* for sizeof(UConverter) */
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cmemory.h"  /* for UAlignedMemory */
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cintltst.h"
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ccapitst.h"
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* for not including "cstring.h" -begin*/
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef U_WINDOWS
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#   define ctest_stricmp(str1, str2) U_STANDARD_CPP_NAMESPACE _stricmp(str1, str2)
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#elif defined(POSIX)
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#   define ctest_stricmp(str1, str2) U_STANDARD_CPP_NAMESPACE strcasecmp(str1, str2)
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else
36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#   define ctest_stricmp(str1, str2) T_CString_stricmp(str1, str2)
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic int U_EXPORT2
40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruT_CString_stricmp(const char *str1, const char *str2) {
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(str1==NULL) {
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(str2==NULL) {
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return 0;
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return -1;
46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else if(str2==NULL) {
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 1;
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* compare non-NULL strings lexically with lowercase */
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int rc;
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unsigned char c1, c2;
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for(;;) {
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            c1=(unsigned char)*str1;
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            c2=(unsigned char)*str2;
56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(c1==0) {
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if(c2==0) {
58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    return 0;
59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                } else {
60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    return -1;
61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else if(c2==0) {
63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                return 1;
64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                /* compare non-zero characters with lowercase */
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                rc=(int)(unsigned char)tolower(c1)-(int)(unsigned char)tolower(c2);
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if(rc!=0) {
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    return rc;
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ++str1;
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ++str2;
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* for not including "cstring.h"  -end*/
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define NUM_CODEPAGE 1
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define MAX_FILE_LEN 1024*20
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define UCS_FILE_NAME_SIZE 512
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*returns an action other than the one provided*/
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UConverterFromUCallback otherUnicodeAction(UConverterFromUCallback MIA);
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UConverterToUCallback otherCharAction(UConverterToUCallback MIA);
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UConverter *
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querucnv_open(const char *name, UErrorCode *pErrorCode) {
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(name!=NULL && name[0]=='*') {
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return ucnv_openPackage(loadTestData(pErrorCode), name+1, pErrorCode);
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return ucnv_open(name, pErrorCode);
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void ListNames(void);
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestFlushCache(void);
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestDuplicateAlias(void);
101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestCCSID(void);
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestJ932(void);
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestJ1968(void);
104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestLMBCSMaxChar(void);
105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_LEGACY_CONVERSION
107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestConvertSafeCloneCallback(void);
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestEBCDICSwapLFNL(void);
111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestConvertEx(void);
112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestConvertExFromUTF8(void);
11350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic void TestConvertExFromUTF8_C5F0(void);
114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestConvertAlgorithmic(void);
115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       void TestDefaultConverterError(void);    /* defined in cctest.c */
11627f654740f2a26ad62a5c155af9199af9e69b889claireho       void TestDefaultConverterSet(void);    /* defined in cctest.c */
117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestToUCountPending(void);
118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestFromUCountPending(void);
119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestDefaultName(void);
120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestCompareNames(void);
121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestSubstString(void);
122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void InvalidArguments(void);
123b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void TestGetName(void);
124b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void TestUTFBOM(void);
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid addTestConvert(TestNode** root);
127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid addTestConvert(TestNode** root)
129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &ListNames,                   "tsconv/ccapitst/ListNames");
131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestConvert,                 "tsconv/ccapitst/TestConvert");
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestFlushCache,              "tsconv/ccapitst/TestFlushCache");
133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestAlias,                   "tsconv/ccapitst/TestAlias");
134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestDuplicateAlias,          "tsconv/ccapitst/TestDuplicateAlias");
135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestConvertSafeClone,        "tsconv/ccapitst/TestConvertSafeClone");
136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_LEGACY_CONVERSION
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestConvertSafeCloneCallback,"tsconv/ccapitst/TestConvertSafeCloneCallback");
138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestCCSID,                   "tsconv/ccapitst/TestCCSID");
140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestJ932,                    "tsconv/ccapitst/TestJ932");
141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestJ1968,                   "tsconv/ccapitst/TestJ1968");
14250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if !UCONFIG_NO_FILE_IO && !UCONFIG_NO_LEGACY_CONVERSION
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestLMBCSMaxChar,            "tsconv/ccapitst/TestLMBCSMaxChar");
14450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif
145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestEBCDICSwapLFNL,          "tsconv/ccapitst/TestEBCDICSwapLFNL");
146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestConvertEx,               "tsconv/ccapitst/TestConvertEx");
147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestConvertExFromUTF8,       "tsconv/ccapitst/TestConvertExFromUTF8");
14850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    addTest(root, &TestConvertExFromUTF8_C5F0,  "tsconv/ccapitst/TestConvertExFromUTF8_C5F0");
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestConvertAlgorithmic,      "tsconv/ccapitst/TestConvertAlgorithmic");
150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestDefaultConverterError,   "tsconv/ccapitst/TestDefaultConverterError");
15127f654740f2a26ad62a5c155af9199af9e69b889claireho    addTest(root, &TestDefaultConverterSet,     "tsconv/ccapitst/TestDefaultConverterSet");
15250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if !UCONFIG_NO_FILE_IO
153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestToUCountPending,         "tsconv/ccapitst/TestToUCountPending");
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestFromUCountPending,       "tsconv/ccapitst/TestFromUCountPending");
15550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif
156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestDefaultName,             "tsconv/ccapitst/TestDefaultName");
157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestCompareNames,            "tsconv/ccapitst/TestCompareNames");
158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestSubstString,             "tsconv/ccapitst/TestSubstString");
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &InvalidArguments,            "tsconv/ccapitst/InvalidArguments");
160b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    addTest(root, &TestGetName,                 "tsconv/ccapitst/TestGetName");
161b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    addTest(root, &TestUTFBOM,                  "tsconv/ccapitst/TestUTFBOM");
162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void ListNames(void) {
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode          err                 =   U_ZERO_ERROR;
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t             testLong1           =   0;
167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char*            available_conv;
168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UEnumeration *allNamesEnum = NULL;
169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t allNamesCount = 0;
170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint16_t            count;
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("Testing ucnv_openAllNames()...");
173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    allNamesEnum = ucnv_openAllNames(&err);
174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(err)) {
1756d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_data_err("FAILURE! ucnv_openAllNames() -> %s\n", myErrorName(err));
176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *string = NULL;
179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t len = 0;
180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t count1 = 0;
181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t count2 = 0;
182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        allNamesCount = uenum_count(allNamesEnum, &err);
183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        while ((string = uenum_next(allNamesEnum, &len, &err))) {
184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            count1++;
185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("read \"%s\", length %i\n", string, len);
186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(err)) {
188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAILURE! uenum_next(allNamesEnum...) set an error: %s\n", u_errorName(err));
189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            err = U_ZERO_ERROR;
190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uenum_reset(allNamesEnum, &err);
192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        while ((string = uenum_next(allNamesEnum, &len, &err))) {
193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            count2++;
194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ucnv_close(ucnv_open(string, &err));
195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("read \"%s\", length %i (%s)\n", string, len, U_SUCCESS(err) ? "available" : "unavailable");
196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            err = U_ZERO_ERROR;
197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (count1 != count2) {
199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAILURE! uenum_reset(allNamesEnum, &err); doesn't work\n");
200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uenum_close(allNamesEnum);
203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    err = U_ZERO_ERROR;
204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*Tests ucnv_getAvailableName(), getAvialableCount()*/
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("Testing ucnv_countAvailable()...");
208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    testLong1=ucnv_countAvailable();
210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_info("Number of available codepages: %d/%d\n", testLong1, allNamesCount);
211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\n---Testing ucnv_getAvailableName..");  /*need to check this out */
213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    available_conv = ucnv_getAvailableName(testLong1);
215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       /*test ucnv_getAvailableName with err condition*/
216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\n---Testing ucnv_getAvailableName..with index < 0 ");
217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    available_conv = ucnv_getAvailableName(-1);
218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(available_conv != NULL){
219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucnv_getAvailableName() with index < 0) should return NULL\n");
220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Test ucnv_countAliases() etc. */
223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    count = ucnv_countAliases("utf-8", &err);
224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(err)) {
2256d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_data_err("FAILURE! ucnv_countAliases(\"utf-8\") -> %s\n", myErrorName(err));
226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else if(count <= 0) {
227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAILURE! ucnv_countAliases(\"utf-8\") -> %d aliases\n", count);
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* try to get the aliases individually */
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *alias;
231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        alias = ucnv_getAlias("utf-8", 0, &err);
232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(err)) {
233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAILURE! ucnv_getAlias(\"utf-8\", 0) -> %s\n", myErrorName(err));
234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else if(strcmp("UTF-8", alias) != 0) {
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAILURE! ucnv_getAlias(\"utf-8\", 0) -> %s instead of UTF-8\n", alias);
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            uint16_t aliasNum;
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            for(aliasNum = 0; aliasNum < count; ++aliasNum) {
239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                alias = ucnv_getAlias("utf-8", aliasNum, &err);
240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if(U_FAILURE(err)) {
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    log_err("FAILURE! ucnv_getAlias(\"utf-8\", %d) -> %s\n", aliasNum, myErrorName(err));
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                } else if(strlen(alias) > 20) {
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    /* sanity check */
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    log_err("FAILURE! ucnv_getAlias(\"utf-8\", %d) -> alias %s insanely long, corrupt?!\n", aliasNum, alias);
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                } else {
246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    log_verbose("alias %d for utf-8: %s\n", aliasNum, alias);
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(U_SUCCESS(err)) {
250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                /* try to fill an array with all aliases */
251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                const char **aliases;
252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                aliases=(const char **)malloc(count * sizeof(const char *));
253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if(aliases != 0) {
254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    ucnv_getAliases("utf-8", aliases, &err);
255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    if(U_FAILURE(err)) {
256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        log_err("FAILURE! ucnv_getAliases(\"utf-8\") -> %s\n", myErrorName(err));
257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    } else {
258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        for(aliasNum = 0; aliasNum < count; ++aliasNum) {
259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            /* compare the pointers with the ones returned individually */
260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            alias = ucnv_getAlias("utf-8", aliasNum, &err);
261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            if(U_FAILURE(err)) {
262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                log_err("FAILURE! ucnv_getAlias(\"utf-8\", %d) -> %s\n", aliasNum, myErrorName(err));
263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            } else if(aliases[aliasNum] != alias) {
264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                log_err("FAILURE! ucnv_getAliases(\"utf-8\")[%d] != ucnv_getAlias(\"utf-8\", %d)\n", aliasNum, aliasNum);
265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            }
266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        }
267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    }
268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    free((char **)aliases);
269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestConvert()
277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_LEGACY_CONVERSION
279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char                myptr[4];
280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char                save[4];
281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t             testLong1           =   0;
282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint16_t            rest                =   0;
283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t             len                 =   0;
284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t             x                   =   0;
285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    FILE*               ucs_file_in         =   NULL;
286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar                BOM                 =   0x0000;
287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar                myUChar           =   0x0000;
288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char*               mytarget; /*    [MAX_FILE_LEN] */
289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char*               mytarget_1;
290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char*               mytarget_use;
291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar*                consumedUni         =   NULL;
292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char*               consumed            =   NULL;
293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char*                 output_cp_buffer; /*    [MAX_FILE_LEN] */
294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar*                ucs_file_buffer; /*    [MAX_FILE_LEN] */
295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar*                ucs_file_buffer_use;
296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar*                my_ucs_file_buffer; /*    [MAX_FILE_LEN] */
297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar*                my_ucs_file_buffer_1;
298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int8_t                ii                  =   0;
299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t             j                   =   0;
300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint16_t            codepage_index      =   0;
301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t             cp                  =   0;
302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode          err                 =   U_ZERO_ERROR;
303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char                ucs_file_name[UCS_FILE_NAME_SIZE];
304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UConverterFromUCallback          MIA1, MIA1_2;
305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UConverterToUCallback              MIA2, MIA2_2;
306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const void         *MIA1Context, *MIA1Context2, *MIA2Context, *MIA2Context2;
307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UConverter*            someConverters[5];
308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UConverter*         myConverter = 0;
309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar*                displayname = 0;
310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* locale;
312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar* uchar1 = 0;
314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar* uchar2 = 0;
315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar* uchar3 = 0;
316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t targetcapacity2;
317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t targetcapacity;
318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t targetsize;
319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t disnamelen;
320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UChar* tmp_ucs_buf;
322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UChar* tmp_consumedUni=NULL;
323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* tmp_mytarget_use;
324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* tmp_consumed;
325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /******************************************************************
327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                Checking Unicode -> ksc
328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     ******************************************************************/
329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char*      CodePagesToTest[NUM_CODEPAGE]       =
331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       "ibm-949_P110-1999"
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const uint16_t CodePageNumberToTest[NUM_CODEPAGE]             =
337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        949
339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const int8_t     CodePagesMinChars[NUM_CODEPAGE] =
343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        1
345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const int8_t     CodePagesMaxChars[NUM_CODEPAGE] =
349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        2
351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const uint16_t        CodePagesSubstitutionChars[NUM_CODEPAGE]    =
355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xAFFE
357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* CodePagesTestFiles[NUM_CODEPAGE]    =
360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      "uni-text.bin"
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UConverterPlatform        CodePagesPlatform[NUM_CODEPAGE]    =
366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UCNV_IBM
368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* CodePagesLocale[NUM_CODEPAGE] =
372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "ko_KR"
374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UConverterFromUCallback oldFromUAction = NULL;
377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UConverterToUCallback oldToUAction = NULL;
378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const void* oldFromUContext = NULL;
379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const void* oldToUContext = NULL;
380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Allocate memory */
382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    mytarget = (char*) malloc(MAX_FILE_LEN * sizeof(mytarget[0]));
383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    output_cp_buffer = (char*) malloc(MAX_FILE_LEN * sizeof(output_cp_buffer[0]));
384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucs_file_buffer = (UChar*) malloc(MAX_FILE_LEN * sizeof(ucs_file_buffer[0]));
385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    my_ucs_file_buffer = (UChar*) malloc(MAX_FILE_LEN * sizeof(my_ucs_file_buffer[0]));
386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucs_file_buffer_use = ucs_file_buffer;
388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    mytarget_1=mytarget;
389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    mytarget_use        = mytarget;
390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    my_ucs_file_buffer_1=my_ucs_file_buffer;
391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* flush the converter cache to get a consistent state before the flushing is tested */
393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_flushCache();
394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*Testing ucnv_openU()*/
396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar converterName[]={ 0x0069, 0x0062, 0x006d, 0x002d, 0x0039, 0x0034, 0x0033, 0x0000}; /*ibm-943*/
398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar firstSortedName[]={ 0x0021, 0x0000}; /* ! */
399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar lastSortedName[]={ 0x007E, 0x0000}; /* ~ */
400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *illegalNameChars={ "ibm-943 ibm-943 ibm-943 ibm-943 ibm-943 ibm-943 ibm-943 ibm-943 ibm-943 ibm-943"};
401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar illegalName[100];
402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UConverter *converter=NULL;
403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err=U_ZERO_ERROR;
404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        converter=ucnv_openU(converterName, &err);
405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(err)){
406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_data_err("FAILURE! ucnv_openU(ibm-943, err) failed. %s\n", myErrorName(err));
407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_close(converter);
409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err=U_ZERO_ERROR;
410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        converter=ucnv_openU(NULL, &err);
411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(err)){
412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAILURE! ucnv_openU(NULL, err)  failed. %s\n", myErrorName(err));
413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_close(converter);
415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*testing with error value*/
416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err=U_ILLEGAL_ARGUMENT_ERROR;
417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        converter=ucnv_openU(converterName, &err);
418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!(converter == NULL)){
419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_data_err("FAILURE! ucnv_openU(ibm-943, U_ILLEGAL_ARGUMENT_ERROR) is expected to fail\n");
420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_close(converter);
422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err=U_ZERO_ERROR;
423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_uastrcpy(illegalName, "");
424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_uastrcpy(illegalName, illegalNameChars);
425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_openU(illegalName, &err);
426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!(err==U_ILLEGAL_ARGUMENT_ERROR)){
427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAILURE! ucnv_openU(illegalName, err) is expected to fail\n");
428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err=U_ZERO_ERROR;
431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_openU(firstSortedName, &err);
432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(err!=U_FILE_ACCESS_ERROR){
433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAILURE! ucnv_openU(firstSortedName, err) is expected to fail\n");
434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err=U_ZERO_ERROR;
437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_openU(lastSortedName, &err);
438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(err!=U_FILE_ACCESS_ERROR){
439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAILURE! ucnv_openU(lastSortedName, err) is expected to fail\n");
440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err=U_ZERO_ERROR;
443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("Testing ucnv_open() with converter name greater than 7 characters\n");
445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         UConverter *cnv=NULL;
447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         err=U_ZERO_ERROR;
448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         cnv=ucnv_open("ibm-949,Madhu", &err);
449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         if(U_FAILURE(err)){
450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_data_err("FAILURE! ucnv_open(\"ibm-949,Madhu\", err)  failed. %s\n", myErrorName(err));
451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         }
452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         ucnv_close(cnv);
453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      /*Testing ucnv_convert()*/
456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t targetLimit=0, sourceLimit=0, i=0, targetCapacity=0;
458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const uint8_t source[]={ 0x00, 0x04, 0x05, 0x06, 0xa2, 0xb4, 0x00};
459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const uint8_t expectedTarget[]={ 0x00, 0x37, 0x2d, 0x2e, 0x0e, 0x49, 0x62, 0x0f, 0x00};
460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char *target=0;
461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        sourceLimit=sizeof(source)/sizeof(source[0]);
462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err=U_ZERO_ERROR;
463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        targetLimit=0;
464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        targetCapacity=ucnv_convert("ibm-1364", "ibm-1363", NULL, targetLimit , (const char*)source, sourceLimit, &err);
466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(err == U_BUFFER_OVERFLOW_ERROR){
467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            err=U_ZERO_ERROR;
468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            targetLimit=targetCapacity+1;
469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            target=(char*)malloc(sizeof(char) * targetLimit);
470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            targetCapacity=ucnv_convert("ibm-1364", "ibm-1363", target, targetLimit , (const char*)source, sourceLimit, &err);
471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(err)){
473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_data_err("FAILURE! ucnv_convert(ibm-1363->ibm-1364) failed. %s\n", myErrorName(err));
474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else {
476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            for(i=0; i<targetCapacity; i++){
477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if(target[i] != expectedTarget[i]){
478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    log_err("FAIL: ucnv_convert(ibm-1363->ibm-1364) failed.at index \n i=%d,  Expected: %lx Got: %lx\n", i, (UChar)expectedTarget[i], (uint8_t)target[i]);
479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            i=ucnv_convert("ibm-1364", "ibm-1363", target, targetLimit , (const char*)source+1, -1, &err);
483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(U_FAILURE(err) || i!=7){
484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("FAILURE! ucnv_convert() with sourceLimit=-1 failed: %s, returned %d instead of 7\n",
485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    u_errorName(err), i);
486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /*Test error conditions*/
489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            err=U_ZERO_ERROR;
490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            i=ucnv_convert("ibm-1364", "ibm-1363", target, targetLimit , (const char*)source, 0, &err);
491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(i !=0){
492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("FAILURE! ucnv_convert() with sourceLimit=0 is expected to return 0\n");
493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            err=U_ILLEGAL_ARGUMENT_ERROR;
496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            sourceLimit=sizeof(source)/sizeof(source[0]);
497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            i=ucnv_convert("ibm-1364", "ibm-1363", target, targetLimit , (const char*)source, sourceLimit, &err);
498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(i !=0 ){
499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("FAILURE! ucnv_convert() with err=U_ILLEGAL_ARGUMENT_ERROR is expected to return 0\n");
500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            err=U_ZERO_ERROR;
503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            sourceLimit=sizeof(source)/sizeof(source[0]);
504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            targetLimit=0;
505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            i=ucnv_convert("ibm-1364", "ibm-1363", target, targetLimit , (const char*)source, sourceLimit, &err);
506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(!(U_FAILURE(err) && err==U_BUFFER_OVERFLOW_ERROR)){
507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("FAILURE! ucnv_convert() with targetLimit=0 is expected to throw U_BUFFER_OVERFLOW_ERROR\n");
508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            err=U_ZERO_ERROR;
510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            free(target);
511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*Testing ucnv_openCCSID and ucnv_open with error conditions*/
515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\n---Testing ucnv_open with err ! = U_ZERO_ERROR...\n");
516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    err=U_ILLEGAL_ARGUMENT_ERROR;
517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(ucnv_open(NULL, &err) != NULL){
518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucnv_open with err != U_ZERO_ERROR is supposed to fail\n");
519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(ucnv_openCCSID(1051, UCNV_IBM, &err) != NULL){
521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucnv_open with err != U_ZERO_ERROR is supposed to fail\n");
522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    err=U_ZERO_ERROR;
524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Testing ucnv_openCCSID(), ucnv_open(), ucnv_getName() */
526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\n---Testing ucnv_open default...\n");
527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    someConverters[0] = ucnv_open(NULL,&err);
528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    someConverters[1] = ucnv_open(NULL,&err);
529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    someConverters[2] = ucnv_open("utf8", &err);
530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    someConverters[3] = ucnv_openCCSID(949,UCNV_IBM,&err);
531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_close(ucnv_openCCSID(1051, UCNV_IBM, &err)); /* test for j350; ucnv_close(NULL) is safe */
532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(err)){ log_data_err("FAILURE! %s\n", myErrorName(err));}
533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Testing ucnv_getName()*/
535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*default code page */
536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_getName(someConverters[0], &err);
537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(err)) {
538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_data_err("getName[0] failed\n");
539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("getName(someConverters[0]) returned %s\n", ucnv_getName(someConverters[0], &err));
541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_getName(someConverters[1], &err);
543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(err)) {
544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_data_err("getName[1] failed\n");
545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("getName(someConverters[1]) returned %s\n", ucnv_getName(someConverters[1], &err));
547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_close(someConverters[0]);
550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_close(someConverters[1]);
551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_close(someConverters[2]);
552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_close(someConverters[3]);
553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (codepage_index=0; codepage_index <  NUM_CODEPAGE; ++codepage_index)
556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t i = 0;
558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err = U_ZERO_ERROR;
560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef U_TOPSRCDIR
561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strcpy(ucs_file_name, U_TOPSRCDIR U_FILE_SEP_STRING"test"U_FILE_SEP_STRING"testdata"U_FILE_SEP_STRING);
562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else
563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strcpy(ucs_file_name, loadTestData(&err));
564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(err)){
566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("\nCouldn't get the test data directory... Exiting...Error:%s\n", u_errorName(err));
567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            char* index = strrchr(ucs_file_name,(char)U_FILE_SEP_CHAR);
572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if((unsigned int)(index-ucs_file_name) != (strlen(ucs_file_name)-1)){
574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    *(index+1)=0;
575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strcat(ucs_file_name,".."U_FILE_SEP_STRING);
579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strcat(ucs_file_name, CodePagesTestFiles[codepage_index]);
581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucs_file_in = fopen(ucs_file_name,"rb");
583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!ucs_file_in)
584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
585c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            log_data_err("Couldn't open the Unicode file [%s]... Exiting...\n", ucs_file_name);
586b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            break;
587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*Creates a converter and testing ucnv_openCCSID(u_int code_page, platform, errstatus*/
590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*  myConverter =ucnv_openCCSID(CodePageNumberToTest[codepage_index],UCNV_IBM, &err); */
592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*  ucnv_flushCache(); */
593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        myConverter =ucnv_open( "ibm-949", &err);
594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!myConverter || U_FAILURE(err))
595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_data_err("Error creating the ibm-949 converter - %s \n", u_errorName(err));
597b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            fclose(ucs_file_in);
598b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            break;
599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*testing for ucnv_getName()  */
602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Testing ucnv_getName()...\n");
603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_getName(myConverter, &err);
604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(err))
605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error in getName\n");
606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("getName o.k. %s\n", ucnv_getName(myConverter, &err));
609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (ctest_stricmp(ucnv_getName(myConverter, &err), CodePagesToTest[codepage_index]))
611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("getName failed\n");
612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("getName ok\n");
614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*Test getName with error condition*/
615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            const char* name=0;
617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            err=U_ILLEGAL_ARGUMENT_ERROR;
618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("Testing ucnv_getName with err != U_ZERO_ERROR");
619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            name=ucnv_getName(myConverter, &err);
620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(name != NULL){
621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("ucnv_getName() with err != U_ZERO_ERROR is expected to fail");
622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            err=U_ZERO_ERROR;
624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*Tests ucnv_getMaxCharSize() and ucnv_getMinCharSize()*/
628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Testing ucnv_getMaxCharSize()...\n");
630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (ucnv_getMaxCharSize(myConverter)==CodePagesMaxChars[codepage_index])
631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("Max byte per character OK\n");
632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Max byte per character failed\n");
634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("\n---Testing ucnv_getMinCharSize()...\n");
636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (ucnv_getMinCharSize(myConverter)==CodePagesMinChars[codepage_index])
637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("Min byte per character OK\n");
638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Min byte per character failed\n");
640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*Testing for ucnv_getSubstChars() and ucnv_setSubstChars()*/
643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("\n---Testing ucnv_getSubstChars...\n");
644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ii=4;
645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_getSubstChars(myConverter, myptr, &ii, &err);
646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (ii <= 0) {
647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ucnv_getSubstChars returned a negative number %d\n", ii);
648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for(x=0;x<ii;x++)
651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            rest = (uint16_t)(((unsigned char)rest << 8) + (unsigned char)myptr[x]);
652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (rest==CodePagesSubstitutionChars[codepage_index])
653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("Substitution character ok\n");
654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Substitution character failed.\n");
656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("\n---Testing ucnv_setSubstChars RoundTrip Test ...\n");
658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_setSubstChars(myConverter, myptr, ii, &err);
659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(err))
660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAILURE! %s\n", myErrorName(err));
662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_getSubstChars(myConverter,save, &ii, &err);
664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(err))
665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAILURE! %s\n", myErrorName(err));
667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (strncmp(save, myptr, ii))
670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Saved substitution character failed\n");
671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("Saved substitution character ok\n");
673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*Testing for ucnv_getSubstChars() and ucnv_setSubstChars() with error conditions*/
675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("\n---Testing ucnv_getSubstChars.. with len < minBytesPerChar\n");
676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ii=1;
677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_getSubstChars(myConverter, myptr, &ii, &err);
678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(err != U_INDEX_OUTOFBOUNDS_ERROR){
679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ucnv_getSubstChars() with len < minBytesPerChar should throw U_INDEX_OUTOFBOUNDS_ERROR Got %s\n", myErrorName(err));
680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err=U_ZERO_ERROR;
682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ii=4;
683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_getSubstChars(myConverter, myptr, &ii, &err);
684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("\n---Testing ucnv_setSubstChars.. with len < minBytesPerChar\n");
685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_setSubstChars(myConverter, myptr, 0, &err);
686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(err != U_ILLEGAL_ARGUMENT_ERROR){
687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ucnv_setSubstChars() with len < minBytesPerChar should throw U_ILLEGAL_ARGUMENT_ERROR Got %s\n", myErrorName(err));
688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("\n---Testing ucnv_setSubstChars.. with err != U_ZERO_ERROR \n");
690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strcpy(myptr, "abc");
691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_setSubstChars(myConverter, myptr, ii, &err);
692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err=U_ZERO_ERROR;
693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_getSubstChars(myConverter, save, &ii, &err);
694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(strncmp(save, myptr, ii) == 0){
695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("uncv_setSubstChars() with err != U_ZERO_ERROR shouldn't set the SubstChars and just return\n");
696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("\n---Testing ucnv_getSubstChars.. with err != U_ZERO_ERROR \n");
698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err=U_ZERO_ERROR;
699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strcpy(myptr, "abc");
700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_setSubstChars(myConverter, myptr, ii, &err);
701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err=U_ILLEGAL_ARGUMENT_ERROR;
702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_getSubstChars(myConverter, save, &ii, &err);
703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(strncmp(save, myptr, ii) == 0){
704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("uncv_setSubstChars() with err != U_ZERO_ERROR shouldn't fill the SubstChars in the buffer, it just returns\n");
705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err=U_ZERO_ERROR;
707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*------*/
708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef U_ENABLE_GENERIC_ISO_2022
710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*resetState  ucnv_reset()*/
711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("\n---Testing ucnv_reset()..\n");
712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_reset(myConverter);
713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             UChar32 c;
715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             const uint8_t in[]={  0x1b, 0x25, 0x42, 0x31, 0x32, 0x61, 0xc0, 0x80, 0xe0, 0x80, 0x80, 0xf0, 0x80, 0x80, 0x80};
716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             const char *source=(const char *)in, *limit=(const char *)in+sizeof(in);
717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             UConverter *cnv=ucnv_open("ISO_2022", &err);
718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             if(U_FAILURE(err)) {
719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("Unable to open a iso-2022 converter: %s\n", u_errorName(err));
720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             }
721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             c=ucnv_getNextUChar(cnv, &source, limit, &err);
722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             if((U_FAILURE(err) || c != (UChar32)0x0031)) {
723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("ucnv_getNextUChar() failed: %s\n", u_errorName(err));
724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             }
725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             ucnv_reset(cnv);
726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             ucnv_close(cnv);
727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*getDisplayName*/
732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("\n---Testing ucnv_getDisplayName()...\n");
733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        locale=CodePagesLocale[codepage_index];
734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        len=0;
735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        displayname=NULL;
736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        disnamelen = ucnv_getDisplayName(myConverter, locale, displayname, len, &err);
737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(err==U_BUFFER_OVERFLOW_ERROR) {
738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            err=U_ZERO_ERROR;
739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            displayname=(UChar*)malloc((disnamelen+1) * sizeof(UChar));
740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ucnv_getDisplayName(myConverter,locale,displayname,disnamelen+1, &err);
741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(U_FAILURE(err)) {
742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("getDisplayName failed. The error is  %s\n", myErrorName(err));
743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else {
745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_verbose(" getDisplayName o.k.\n");
746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            free(displayname);
748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            displayname=NULL;
749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else {
751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("getDisplayName preflight doesn't work. Error is  %s\n", myErrorName(err));
752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*test ucnv_getDiaplayName with error condition*/
754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err= U_ILLEGAL_ARGUMENT_ERROR;
755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        len=ucnv_getDisplayName(myConverter,locale,NULL,0, &err);
756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if( len !=0 ){
757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ucnv_getDisplayName() with err != U_ZERO_ERROR is supposed to return 0\n");
758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*test ucnv_getDiaplayName with error condition*/
760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err=U_ZERO_ERROR;
761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        len=ucnv_getDisplayName(NULL,locale,NULL,0, &err);
762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if( len !=0 || U_SUCCESS(err)){
763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ucnv_getDisplayName(NULL) with cnv == NULL is supposed to return 0\n");
764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err=U_ZERO_ERROR;
766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* testing ucnv_setFromUCallBack() and ucnv_getFromUCallBack()*/
768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_getFromUCallBack(myConverter, &MIA1, &MIA1Context);
769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("\n---Testing ucnv_setFromUCallBack...\n");
771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_setFromUCallBack(myConverter, otherUnicodeAction(MIA1), &BOM, &oldFromUAction, &oldFromUContext, &err);
772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(err) || oldFromUAction != MIA1 || oldFromUContext != MIA1Context)
773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAILURE! %s\n", myErrorName(err));
775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_getFromUCallBack(myConverter, &MIA1_2, &MIA1Context2);
778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (MIA1_2 != otherUnicodeAction(MIA1) || MIA1Context2 != &BOM)
779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("get From UCallBack failed\n");
780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("get From UCallBack ok\n");
782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("\n---Testing getFromUCallBack Roundtrip...\n");
784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_setFromUCallBack(myConverter,MIA1, MIA1Context, &oldFromUAction, &oldFromUContext, &err);
785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(err) || oldFromUAction != otherUnicodeAction(MIA1) || oldFromUContext != &BOM)
786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAILURE! %s\n", myErrorName(err));
788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_getFromUCallBack(myConverter, &MIA1_2, &MIA1Context2);
791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (MIA1_2 != MIA1 || MIA1Context2 != MIA1Context)
792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("get From UCallBack action failed\n");
793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("get From UCallBack action ok\n");
795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*testing ucnv_setToUCallBack with error conditions*/
797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err=U_ILLEGAL_ARGUMENT_ERROR;
798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("\n---Testing setFromUCallBack. with err != U_ZERO_ERROR..\n");
799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_setFromUCallBack(myConverter, otherUnicodeAction(MIA1), &BOM, &oldFromUAction, &oldFromUContext, &err);
800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_getFromUCallBack(myConverter, &MIA1_2, &MIA1Context2);
801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(MIA1_2 == otherUnicodeAction(MIA1) || MIA1Context2 == &BOM){
802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("To setFromUCallBack with err != U_ZERO_ERROR is supposed to fail\n");
803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err=U_ZERO_ERROR;
805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*testing ucnv_setToUCallBack() and ucnv_getToUCallBack()*/
808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_getToUCallBack(myConverter, &MIA2, &MIA2Context);
809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("\n---Testing setTo UCallBack...\n");
811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_setToUCallBack(myConverter,otherCharAction(MIA2), &BOM, &oldToUAction, &oldToUContext, &err);
812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(err) || oldToUAction != MIA2 || oldToUContext != MIA2Context)
813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAILURE! %s\n", myErrorName(err));
815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_getToUCallBack(myConverter, &MIA2_2, &MIA2Context2);
818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (MIA2_2 != otherCharAction(MIA2) || MIA2Context2 != &BOM)
819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("To UCallBack failed\n");
820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("To UCallBack ok\n");
822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("\n---Testing setTo UCallBack Roundtrip...\n");
824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_setToUCallBack(myConverter,MIA2, MIA2Context, &oldToUAction, &oldToUContext, &err);
825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(err) || oldToUAction != otherCharAction(MIA2) || oldToUContext != &BOM)
826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { log_err("FAILURE! %s\n", myErrorName(err));  }
827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_getToUCallBack(myConverter, &MIA2_2, &MIA2Context2);
829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (MIA2_2 != MIA2 || MIA2Context2 != MIA2Context)
830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("To UCallBack failed\n");
831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("To UCallBack ok\n");
833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*testing ucnv_setToUCallBack with error conditions*/
835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err=U_ILLEGAL_ARGUMENT_ERROR;
836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("\n---Testing setToUCallBack. with err != U_ZERO_ERROR..\n");
837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_setToUCallBack(myConverter,otherCharAction(MIA2), NULL, &oldToUAction, &oldToUContext, &err);
838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_getToUCallBack(myConverter, &MIA2_2, &MIA2Context2);
839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (MIA2_2 == otherCharAction(MIA2) || MIA2Context2 == &BOM){
840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("To setToUCallBack with err != U_ZERO_ERROR is supposed to fail\n");
841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err=U_ZERO_ERROR;
843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*getcodepageid testing ucnv_getCCSID() */
846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("\n----Testing getCCSID....\n");
847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cp =    ucnv_getCCSID(myConverter,&err);
848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(err))
849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAILURE!..... %s\n", myErrorName(err));
851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (cp != CodePageNumberToTest[codepage_index])
853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Codepage number test failed\n");
854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("Codepage number test OK\n");
856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*testing ucnv_getCCSID() with err != U_ZERO_ERROR*/
858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err=U_ILLEGAL_ARGUMENT_ERROR;
859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if( ucnv_getCCSID(myConverter,&err) != -1){
860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ucnv_getCCSID() with err != U_ZERO_ERROR is supposed to fail\n");
861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err=U_ZERO_ERROR;
863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*getCodepagePlatform testing ucnv_getPlatform()*/
865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("\n---Testing getCodepagePlatform ..\n");
866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (CodePagesPlatform[codepage_index]!=ucnv_getPlatform(myConverter, &err))
867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Platform codepage test failed\n");
868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("Platform codepage test ok\n");
870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(err))
872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAILURE! %s\n", myErrorName(err));
874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*testing ucnv_getPlatform() with err != U_ZERO_ERROR*/
876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err= U_ILLEGAL_ARGUMENT_ERROR;
877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(ucnv_getPlatform(myConverter, &err) != UCNV_UNKNOWN){
878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ucnv)getPlatform with err != U_ZERO_ERROR is supposed to fail\n");
879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err=U_ZERO_ERROR;
881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*Reads the BOM*/
884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fread(&BOM, sizeof(UChar), 1, ucs_file_in);
885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (BOM!=0xFEFF && BOM!=0xFFFE)
886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("File Missing BOM...Bailing!\n");
888b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            fclose(ucs_file_in);
889b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            break;
890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*Reads in the file*/
894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        while(!feof(ucs_file_in)&&(i+=fread(ucs_file_buffer+i, sizeof(UChar), 1, ucs_file_in)))
895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            myUChar = ucs_file_buffer[i-1];
897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ucs_file_buffer[i-1] = (UChar)((BOM==0xFEFF)?myUChar:((myUChar >> 8) | (myUChar << 8))); /*adjust if BIG_ENDIAN*/
899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        myUChar = ucs_file_buffer[i-1];
902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucs_file_buffer[i-1] = (UChar)((BOM==0xFEFF)?myUChar:((myUChar >> 8) | (myUChar << 8))); /*adjust if BIG_ENDIAN Corner Case*/
903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*testing ucnv_fromUChars() and ucnv_toUChars() */
906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*uchar1---fromUChar--->output_cp_buffer --toUChar--->uchar2*/
907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uchar1=(UChar*)malloc(sizeof(UChar) * (i+1));
909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_uastrcpy(uchar1,"");
910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_strncpy(uchar1,ucs_file_buffer,i);
911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uchar1[i] = 0;
912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uchar3=(UChar*)malloc(sizeof(UChar)*(i+1));
914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_uastrcpy(uchar3,"");
915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_strncpy(uchar3,ucs_file_buffer,i);
916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uchar3[i] = 0;
917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*Calls the Conversion Routine */
919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        testLong1 = MAX_FILE_LEN;
920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("\n---Testing ucnv_fromUChars()\n");
921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        targetcapacity = ucnv_fromUChars(myConverter, output_cp_buffer, testLong1,  uchar1, -1, &err);
922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(err))
923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("\nFAILURE...%s\n", myErrorName(err));
925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose(" ucnv_fromUChars() o.k.\n");
928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*test the conversion routine */
930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("\n---Testing ucnv_toUChars()\n");
931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*call it first time for trapping the targetcapacity and size needed to allocate memory for the buffer uchar2 */
932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        targetcapacity2=0;
933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        targetsize = ucnv_toUChars(myConverter,
934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                     NULL,
935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                     targetcapacity2,
936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                     output_cp_buffer,
937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                     strlen(output_cp_buffer),
938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                     &err);
939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*if there is an buffer overflow then trap the values and pass them and make the actual call*/
940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(err==U_BUFFER_OVERFLOW_ERROR)
942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            err=U_ZERO_ERROR;
944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            uchar2=(UChar*)malloc((targetsize+1) * sizeof(UChar));
945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            targetsize = ucnv_toUChars(myConverter,
946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   uchar2,
947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   targetsize+1,
948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   output_cp_buffer,
949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   strlen(output_cp_buffer),
950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   &err);
951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(U_FAILURE(err))
953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("ucnv_toUChars() FAILED %s\n", myErrorName(err));
954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else
955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_verbose(" ucnv_toUChars() o.k.\n");
956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(u_strcmp(uchar1,uchar2)!=0)
958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("equality test failed with conversion routine\n");
959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ERR: calling toUChars: Didn't get U_BUFFER_OVERFLOW .. expected it.\n");
963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*Testing ucnv_fromUChars and ucnv_toUChars with error conditions*/
965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err=U_ILLEGAL_ARGUMENT_ERROR;
966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("\n---Testing ucnv_fromUChars() with err != U_ZERO_ERROR\n");
967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        targetcapacity = ucnv_fromUChars(myConverter, output_cp_buffer, testLong1,  uchar1, -1, &err);
968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (targetcapacity !=0) {
969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("\nFAILURE: ucnv_fromUChars with err != U_ZERO_ERROR is expected to fail and return 0\n");
970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err=U_ZERO_ERROR;
972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("\n---Testing ucnv_fromUChars() with converter=NULL\n");
973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        targetcapacity = ucnv_fromUChars(NULL, output_cp_buffer, testLong1,  uchar1, -1, &err);
974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (targetcapacity !=0 || err != U_ILLEGAL_ARGUMENT_ERROR) {
975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("\nFAILURE: ucnv_fromUChars with converter=NULL is expected to fail\n");
976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err=U_ZERO_ERROR;
978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("\n---Testing ucnv_fromUChars() with sourceLength = 0\n");
979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        targetcapacity = ucnv_fromUChars(myConverter, output_cp_buffer, testLong1,  uchar1, 0, &err);
980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (targetcapacity !=0) {
981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("\nFAILURE: ucnv_fromUChars with sourceLength 0 is expected to return 0\n");
982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("\n---Testing ucnv_fromUChars() with targetLength = 0\n");
984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        targetcapacity = ucnv_fromUChars(myConverter, output_cp_buffer, 0,  uchar1, -1, &err);
985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (err != U_BUFFER_OVERFLOW_ERROR) {
986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("\nFAILURE: ucnv_fromUChars with targetLength 0 is expected to fail and throw U_BUFFER_OVERFLOW_ERROR\n");
987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*toUChars with error conditions*/
989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        targetsize = ucnv_toUChars(myConverter, uchar2, targetsize, output_cp_buffer, strlen(output_cp_buffer), &err);
990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(targetsize != 0){
991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("\nFAILURE: ucnv_toUChars with err != U_ZERO_ERROR is expected to fail and return 0\n");
992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err=U_ZERO_ERROR;
994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        targetsize = ucnv_toUChars(myConverter, uchar2, -1, output_cp_buffer, strlen(output_cp_buffer), &err);
995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(targetsize != 0 || err != U_ILLEGAL_ARGUMENT_ERROR){
996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("\nFAILURE: ucnv_toUChars with targetsize < 0 is expected to throw U_ILLEGAL_ARGUMENT_ERROR and return 0\n");
997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err=U_ZERO_ERROR;
999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        targetsize = ucnv_toUChars(myConverter, uchar2, 0, output_cp_buffer, 0, &err);
1000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (targetsize !=0) {
1001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("\nFAILURE: ucnv_toUChars with sourceLength 0 is expected to return 0\n");
1002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        targetcapacity2=0;
1004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        targetsize = ucnv_toUChars(myConverter, NULL, targetcapacity2, output_cp_buffer,  strlen(output_cp_buffer), &err);
1005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (err != U_STRING_NOT_TERMINATED_WARNING) {
1006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("\nFAILURE: ucnv_toUChars(targetLength)->%s instead of U_STRING_NOT_TERMINATED_WARNING\n",
1007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    u_errorName(err));
1008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err=U_ZERO_ERROR;
1010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*-----*/
1011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*testing for ucnv_fromUnicode() and ucnv_toUnicode() */
1014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*Clean up re-usable vars*/
1015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        j=0;
1016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Testing ucnv_fromUnicode().....\n");
1017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        tmp_ucs_buf=ucs_file_buffer_use;
1018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_fromUnicode(myConverter, &mytarget_1,
1019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                 mytarget + MAX_FILE_LEN,
1020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                 &tmp_ucs_buf,
1021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                 ucs_file_buffer_use+i,
1022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                 NULL,
1023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                 TRUE,
1024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                 &err);
1025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        consumedUni = (UChar*)tmp_consumedUni;
1026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(err))
1028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAILURE! %s\n", myErrorName(err));
1030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
1032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("ucnv_fromUnicode()   o.k.\n");
1033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*Uni1 ----ToUnicode----> Cp2 ----FromUnicode---->Uni3 */
1035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Testing ucnv_toUnicode().....\n");
1036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        tmp_mytarget_use=mytarget_use;
1037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        tmp_consumed = consumed;
1038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_toUnicode(myConverter, &my_ucs_file_buffer_1,
1039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                my_ucs_file_buffer + MAX_FILE_LEN,
1040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                &tmp_mytarget_use,
1041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                mytarget_use + (mytarget_1 - mytarget),
1042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                NULL,
1043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                FALSE,
1044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                &err);
1045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        consumed = (char*)tmp_consumed;
1046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(err))
1047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAILURE! %s\n", myErrorName(err));
1049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
1051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("ucnv_toUnicode()  o.k.\n");
1052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("\n---Testing   RoundTrip ...\n");
1055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_strncpy(uchar3, my_ucs_file_buffer,i);
1058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uchar3[i] = 0;
1059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(u_strcmp(uchar1,uchar3)==0)
1061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("Equality test o.k.\n");
1062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
1063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Equality test failed\n");
1064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*sanity compare */
1066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(uchar2 == NULL)
1067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("uchar2 was NULL (ccapitst.c line %d), couldn't do sanity check\n", __LINE__);
1069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
1071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(u_strcmp(uchar2, uchar3)==0)
1073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_verbose("Equality test o.k.\n");
1074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else
1075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("Equality test failed\n");
1076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fclose(ucs_file_in);
1079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_close(myConverter);
1080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (uchar1 != 0) free(uchar1);
1081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (uchar2 != 0) free(uchar2);
1082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (uchar3 != 0) free(uchar3);
1083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free((void*)mytarget);
1086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free((void*)output_cp_buffer);
1087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free((void*)ucs_file_buffer);
1088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free((void*)my_ucs_file_buffer);
1089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UConverterFromUCallback otherUnicodeAction(UConverterFromUCallback MIA)
1093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (MIA==(UConverterFromUCallback)UCNV_FROM_U_CALLBACK_STOP)?(UConverterFromUCallback)UCNV_FROM_U_CALLBACK_SUBSTITUTE:(UConverterFromUCallback)UCNV_FROM_U_CALLBACK_STOP;
1095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UConverterToUCallback otherCharAction(UConverterToUCallback MIA)
1099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (MIA==(UConverterToUCallback)UCNV_TO_U_CALLBACK_STOP)?(UConverterToUCallback)UCNV_TO_U_CALLBACK_SUBSTITUTE:(UConverterToUCallback)UCNV_TO_U_CALLBACK_STOP;
1101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestFlushCache(void) {
1104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_LEGACY_CONVERSION
1105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode          err                 =   U_ZERO_ERROR;
1106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UConverter*            someConverters[5];
1107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int flushCount = 0;
1108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* flush the converter cache to get a consistent state before the flushing is tested */
1110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_flushCache();
1111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*Testing ucnv_open()*/
1113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Note: These converters have been chosen because they do NOT
1114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       encode the Latin characters (U+0041, ...), and therefore are
1115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       highly unlikely to be chosen as system default codepages */
1116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    someConverters[0] = ucnv_open("ibm-1047", &err);
1118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(err)) {
1119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_data_err("FAILURE! %s\n", myErrorName(err));
1120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    someConverters[1] = ucnv_open("ibm-1047", &err);
1123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(err)) {
1124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_data_err("FAILURE! %s\n", myErrorName(err));
1125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    someConverters[2] = ucnv_open("ibm-1047", &err);
1128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(err)) {
1129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_data_err("FAILURE! %s\n", myErrorName(err));
1130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    someConverters[3] = ucnv_open("gb18030", &err);
1133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(err)) {
1134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_data_err("FAILURE! %s\n", myErrorName(err));
1135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    someConverters[4] = ucnv_open("ibm-954", &err);
1138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(err)) {
1139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_data_err("FAILURE! %s\n", myErrorName(err));
1140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Testing ucnv_flushCache() */
1144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\n---Testing ucnv_flushCache...\n");
1145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if ((flushCount=ucnv_flushCache())==0)
1146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Flush cache ok\n");
1147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
1148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_data_err("Flush Cache failed [line %d], expect 0 got %d \n", __LINE__, flushCount);
1149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*testing ucnv_close() and ucnv_flushCache() */
1151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_close(someConverters[0]);
1152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_close(someConverters[1]);
1153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if ((flushCount=ucnv_flushCache())==0)
1155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Flush cache ok\n");
1156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
1157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_data_err("Flush Cache failed [line %d], expect 0 got %d \n", __LINE__, flushCount);
1158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_close(someConverters[2]);
1160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_close(someConverters[3]);
1161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if ((flushCount=ucnv_flushCache())==2)
1163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Flush cache ok\n");  /*because first, second and third are same  */
1164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
1165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_data_err("Flush Cache failed  line %d, got %d expected 2 or there is an error in ucnv_close()\n",
1166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            __LINE__,
1167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            flushCount);
1168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_close(someConverters[4]);
1170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if ( (flushCount=ucnv_flushCache())==1)
1171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Flush cache ok\n");
1172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
1173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_data_err("Flush Cache failed line %d, expected 1 got %d \n", __LINE__, flushCount);
1174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test the converter alias API, specifically the fuzzy matching of
1179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * alias names and the alias table integrity.  Make sure each
1180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * converter has at least one alias (itself), and that its listed
1181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * aliases map back to itself.  Check some hard-coded UTF-8 and
1182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * ISO_2022 aliases to make sure they work.
1183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestAlias() {
1185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i, ncnv;
1186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Predetermined aliases that we expect to map back to ISO_2022
1189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * and UTF-8.  UPDATE THIS DATA AS NECESSARY. */
1190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* ISO_2022_NAMES[] =
1191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"ISO_2022,locale=ja,version=2", "ISO-2022-JP-2", "csISO2022JP2",
1192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         "Iso-2022jP2", "isO-2022_Jp_2", "iSo--2022,locale=ja,version=2"};
1193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t ISO_2022_NAMES_LENGTH =
1194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        sizeof(ISO_2022_NAMES) / sizeof(ISO_2022_NAMES[0]);
1195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *UTF8_NAMES[] =
1196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "UTF-8", "utf-8", "utf8", "ibm-1208",
1197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          "utf_8", "ibm1208", "cp1208" };
1198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t UTF8_NAMES_LENGTH =
1199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        sizeof(UTF8_NAMES) / sizeof(UTF8_NAMES[0]);
1200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    struct {
1202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *name;
1203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *alias;
1204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } CONVERTERS_NAMES[] = {
1205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "UTF-32BE", "UTF32_BigEndian" },
1206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "UTF-32LE", "UTF32_LittleEndian" },
1207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "UTF-32",   "ISO-10646-UCS-4" },
1208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "UTF32_PlatformEndian", "UTF32_PlatformEndian" },
1209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "UTF-32",   "ucs-4" }
1210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
1211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t CONVERTERS_NAMES_LENGTH = sizeof(CONVERTERS_NAMES) / sizeof(*CONVERTERS_NAMES);
1212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* When there are bugs in gencnval or in ucnv_io, converters can
1214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       appear to have no aliases. */
1215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ncnv = ucnv_countAvailable();
1216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("%d converters\n", ncnv);
1217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i=0; i<ncnv; ++i) {
1218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *name = ucnv_getAvailableName(i);
1219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *alias0;
1220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uint16_t na = ucnv_countAliases(name, &status);
1221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uint16_t j;
1222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UConverter *cnv;
1223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (na == 0) {
1225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL: Converter \"%s\" (i=%d)"
1226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    " has no aliases; expect at least one\n",
1227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    name, i);
1228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            continue;
1229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cnv = ucnv_open(name, &status);
1231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) {
1232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_data_err("FAIL: Converter \"%s\" (i=%d)"
1233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    " can't be opened.\n",
1234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    name, i);
1235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else {
1237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (strcmp(ucnv_getName(cnv, &status), name) != 0
1238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                && (strstr(name, "PlatformEndian") == 0 && strstr(name, "OppositeEndian") == 0)) {
1239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("FAIL: Converter \"%s\" returned \"%s\" for getName. "
1240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        "The should be the same\n",
1241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        name, ucnv_getName(cnv, &status));
1242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_close(cnv);
1245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
1247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        alias0 = ucnv_getAlias(name, 0, &status);
1248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (j=1; j<na; ++j) {
1249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            const char *alias;
1250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /* Make sure each alias maps back to the the same list of
1251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               aliases.  Assume that if alias 0 is the same, the whole
1252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               list is the same (this should always be true). */
1253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            const char *mapBack;
1254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status = U_ZERO_ERROR;
1256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            alias = ucnv_getAlias(name, j, &status);
1257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (status == U_AMBIGUOUS_ALIAS_WARNING) {
1258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("FAIL: Converter \"%s\"is ambiguous\n", name);
1259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (alias == NULL) {
1262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("FAIL: Converter \"%s\" -> "
1263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        "alias[%d]=NULL\n",
1264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        name, j);
1265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                continue;
1266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            mapBack = ucnv_getAlias(alias, 0, &status);
1269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (mapBack == NULL) {
1271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("FAIL: Converter \"%s\" -> "
1272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        "alias[%d]=\"%s\" -> "
1273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        "alias[0]=NULL, exp. \"%s\"\n",
1274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        name, j, alias, alias0);
1275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                continue;
1276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (0 != strcmp(alias0, mapBack)) {
1279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                int32_t idx;
1280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                UBool foundAlias = FALSE;
1281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (status == U_AMBIGUOUS_ALIAS_WARNING) {
1282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    /* Make sure that we only get this mismapping when there is
1283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                       an ambiguous alias, and the other converter has this alias too. */
1284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    for (idx = 0; idx < ucnv_countAliases(mapBack, &status); idx++) {
1285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        if (strcmp(ucnv_getAlias(mapBack, (uint16_t)idx, &status), alias) == 0) {
1286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            foundAlias = TRUE;
1287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            break;
1288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        }
1289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    }
1290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                /* else not ambiguous, and this is a real problem. foundAlias = FALSE */
1292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (!foundAlias) {
1294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    log_err("FAIL: Converter \"%s\" -> "
1295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "alias[%d]=\"%s\" -> "
1296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "alias[0]=\"%s\", exp. \"%s\"\n",
1297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            name, j, alias, mapBack, alias0);
1298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Check a list of predetermined aliases that we expect to map
1305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * back to ISO_2022 and UTF-8. */
1306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i=1; i<ISO_2022_NAMES_LENGTH; ++i) {
1307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* mapBack = ucnv_getAlias(ISO_2022_NAMES[i], 0, &status);
1308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!mapBack) {
1309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          log_data_err("Couldn't get alias for %s. You probably have no data\n", ISO_2022_NAMES[i]);
1310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          continue;
1311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (0 != strcmp(mapBack, ISO_2022_NAMES[0])) {
1313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL: \"%s\" -> \"%s\", expect \"ISO_2022,locale=ja,version=2\"\n",
1314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    ISO_2022_NAMES[i], mapBack);
1315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i=1; i<UTF8_NAMES_LENGTH; ++i) {
1320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* mapBack = ucnv_getAlias(UTF8_NAMES[i], 0, &status);
1321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!mapBack) {
1322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          log_data_err("Couldn't get alias for %s. You probably have no data\n", UTF8_NAMES[i]);
1323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          continue;
1324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (mapBack && 0 != strcmp(mapBack, UTF8_NAMES[0])) {
1326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL: \"%s\" -> \"%s\", expect UTF-8\n",
1327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    UTF8_NAMES[i], mapBack);
1328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
1332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Check a list of predetermined aliases that we expect to map
1333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * back to predermined converter names.
1334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
1335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < CONVERTERS_NAMES_LENGTH; ++i) {
1337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* mapBack = ucnv_getAlias(CONVERTERS_NAMES[i].alias, 0, &status);
1338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!mapBack) {
1339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          log_data_err("Couldn't get alias for %s. You probably have no data\n", CONVERTERS_NAMES[i].name);
1340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          continue;
1341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (0 != strcmp(mapBack, CONVERTERS_NAMES[i].name)) {
1343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL: \"%s\" -> \"%s\", expect %s\n",
1344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    CONVERTERS_NAMES[i].alias, mapBack, CONVERTERS_NAMES[i].name);
1345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestDuplicateAlias(void) {
1351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *alias;
1352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
1355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    alias = ucnv_getStandardName("Shift_JIS", "IBM", &status);
1356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (alias == NULL || strcmp(alias, "ibm-943") != 0 || status != U_AMBIGUOUS_ALIAS_WARNING) {
13576d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_data_err("FAIL: Didn't get ibm-943 for Shift_JIS {IBM}. Got %s\n", alias);
1358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
1360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    alias = ucnv_getStandardName("ibm-943", "IANA", &status);
1361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (alias == NULL || strcmp(alias, "Shift_JIS") != 0 || status != U_AMBIGUOUS_ALIAS_WARNING) {
1362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_data_err("FAIL: Didn't get Shift_JIS for ibm-943 {IANA}. Got %s\n", alias);
1363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
1365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    alias = ucnv_getStandardName("ibm-943_P130-2000", "IANA", &status);
1366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (alias != NULL || status == U_AMBIGUOUS_ALIAS_WARNING) {
1367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_data_err("FAIL: Didn't get NULL for ibm-943 {IANA}. Got %s\n", alias);
1368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Test safe clone callback */
1373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic uint32_t    TSCC_nextSerial()
1375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static uint32_t n = 1;
1377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (n++);
1379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querutypedef struct
1382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t       magic;      /* 0xC0FFEE to identify that the object is OK */
1384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t       serial;     /* minted from nextSerial, above */
1385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool          wasClosed;  /* close happened on the object */
1386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} TSCCContext;
1387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic TSCCContext *TSCC_clone(TSCCContext *ctx)
1389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TSCCContext *newCtx = (TSCCContext *)malloc(sizeof(TSCCContext));
1391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    newCtx->serial = TSCC_nextSerial();
1393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    newCtx->wasClosed = 0;
1394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    newCtx->magic = 0xC0FFEE;
1395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("TSCC_clone: %p:%d -> new context %p:%d\n", ctx, ctx->serial, newCtx, newCtx->serial);
1397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return newCtx;
1399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TSCC_fromU(const void *context,
1402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        UConverterFromUnicodeArgs *fromUArgs,
1403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        const UChar* codeUnits,
1404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        int32_t length,
1405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        UChar32 codePoint,
1406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        UConverterCallbackReason reason,
1407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        UErrorCode * err)
1408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TSCCContext *ctx = (TSCCContext*)context;
1410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UConverterFromUCallback junkFrom;
1411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("TSCC_fromU: Context %p:%d called, reason %d on cnv %p\n", ctx, ctx->serial, reason, fromUArgs->converter);
1413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(ctx->magic != 0xC0FFEE) {
1415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("TSCC_fromU: Context %p:%d magic is 0x%x should be 0xC0FFEE.\n", ctx,ctx->serial, ctx->magic);
1416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(reason == UCNV_CLONE) {
1420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode subErr = U_ZERO_ERROR;
1421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TSCCContext *newCtx;
1422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TSCCContext *junkCtx;
1423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TSCCContext **pjunkCtx = &junkCtx;
1424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* "recreate" it */
1426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("TSCC_fromU: cloning..\n");
1427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        newCtx = TSCC_clone(ctx);
1428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(newCtx == NULL) {
1430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("TSCC_fromU: internal clone failed on %p\n", ctx);
1431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* now, SET it */
1434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_getFromUCallBack(fromUArgs->converter, &junkFrom, (const void**)pjunkCtx);
1435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_setFromUCallBack(fromUArgs->converter, junkFrom, newCtx, NULL, NULL, &subErr);
1436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(subErr)) {
1438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            *err = subErr;
1439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(reason == UCNV_CLOSE) {
1443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("TSCC_fromU: Context %p:%d closing\n", ctx, ctx->serial);
1444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ctx->wasClosed = TRUE;
1445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TSCC_toU(const void *context,
1450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        UConverterToUnicodeArgs *toUArgs,
1451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        const char* codeUnits,
1452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        int32_t length,
1453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        UConverterCallbackReason reason,
1454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        UErrorCode * err)
1455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TSCCContext *ctx = (TSCCContext*)context;
1457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UConverterToUCallback junkFrom;
1458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("TSCC_toU: Context %p:%d called, reason %d on cnv %p\n", ctx, ctx->serial, reason, toUArgs->converter);
1460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(ctx->magic != 0xC0FFEE) {
1462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("TSCC_toU: Context %p:%d magic is 0x%x should be 0xC0FFEE.\n", ctx,ctx->serial, ctx->magic);
1463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(reason == UCNV_CLONE) {
1467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode subErr = U_ZERO_ERROR;
1468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TSCCContext *newCtx;
1469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TSCCContext *junkCtx;
1470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TSCCContext **pjunkCtx = &junkCtx;
1471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* "recreate" it */
1473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("TSCC_toU: cloning..\n");
1474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        newCtx = TSCC_clone(ctx);
1475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(newCtx == NULL) {
1477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("TSCC_toU: internal clone failed on %p\n", ctx);
1478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* now, SET it */
1481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_getToUCallBack(toUArgs->converter, &junkFrom, (const void**)pjunkCtx);
1482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_setToUCallBack(toUArgs->converter, junkFrom, newCtx, NULL, NULL, &subErr);
1483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(subErr)) {
1485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            *err = subErr;
1486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(reason == UCNV_CLOSE) {
1490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("TSCC_toU: Context %p:%d closing\n", ctx, ctx->serial);
1491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ctx->wasClosed = TRUE;
1492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TSCC_init(TSCCContext *q)
1496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    q->magic = 0xC0FFEE;
1498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    q->serial = TSCC_nextSerial();
1499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    q->wasClosed = 0;
1500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TSCC_print_log(TSCCContext *q, const char *name)
1503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(q==NULL) {
1505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("TSCContext: %s is NULL!!\n", name);
1506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(q->magic != 0xC0FFEE) {
1508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("TSCCContext: %p:%d's magic is %x, supposed to be 0xC0FFEE\n",
1509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    q,q->serial, q->magic);
1510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("TSCCContext %p:%d=%s - magic %x, %s\n",
1512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    q, q->serial, name, q->magic, q->wasClosed?"CLOSED":"open");
1513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_LEGACY_CONVERSION
1517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestConvertSafeCloneCallback()
1518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode err = U_ZERO_ERROR;
1520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TSCCContext from1, to1;
1521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TSCCContext *from2, *from3, *to2, *to3;
1522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TSCCContext **pfrom2 = &from2, **pfrom3 = &from3, **pto2 = &to2, **pto3 = &to3;
1523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char hunk[8192];
1524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t hunkSize = 8192;
1525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UConverterFromUCallback junkFrom;
1526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UConverterToUCallback junkTo;
1527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UConverter *conv1, *conv2 = NULL;
1528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    conv1 = ucnv_open("iso-8859-3", &err);
1530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(err)) {
15326d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_data_err("Err opening iso-8859-3, %s\n", u_errorName(err));
1533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("Opened conv1=%p\n", conv1);
1537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TSCC_init(&from1);
1539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TSCC_init(&to1);
1540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TSCC_print_log(&from1, "from1");
1542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TSCC_print_log(&to1, "to1");
1543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_setFromUCallBack(conv1, TSCC_fromU, &from1, NULL, NULL, &err);
1545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("Set from1 on conv1\n");
1546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TSCC_print_log(&from1, "from1");
1547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_setToUCallBack(conv1, TSCC_toU, &to1, NULL, NULL, &err);
1549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("Set to1 on conv1\n");
1550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TSCC_print_log(&to1, "to1");
1551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    conv2 = ucnv_safeClone(conv1, hunk, &hunkSize, &err);
1553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(err)) {
1554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("safeClone failed: %s\n", u_errorName(err));
1555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("Cloned to conv2=%p.\n", conv2);
1558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**********   from *********************/
1560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_getFromUCallBack(conv2, &junkFrom, (const void**)pfrom2);
1561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_getFromUCallBack(conv1, &junkFrom, (const void**)pfrom3);
1562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TSCC_print_log(from2, "from2");
1564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TSCC_print_log(from3, "from3(==from1)");
1565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(from2 == NULL) {
1567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL! from2 is null \n");
1568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(from3 == NULL) {
1572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL! from3 is null \n");
1573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(from3 != (&from1) ) {
1577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL! conv1's FROM context changed!\n");
1578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(from2 == (&from1) ) {
1581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL! conv1's FROM context is the same as conv2's!\n");
1582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(from1.wasClosed) {
1585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL! from1 is closed \n");
1586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(from2->wasClosed) {
1589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL! from2 was closed\n");
1590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**********   to *********************/
1593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_getToUCallBack(conv2, &junkTo, (const void**)pto2);
1594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_getToUCallBack(conv1, &junkTo, (const void**)pto3);
1595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TSCC_print_log(to2, "to2");
1597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TSCC_print_log(to3, "to3(==to1)");
1598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(to2 == NULL) {
1600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL! to2 is null \n");
1601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(to3 == NULL) {
1605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL! to3 is null \n");
1606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(to3 != (&to1) ) {
1610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL! conv1's TO context changed!\n");
1611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(to2 == (&to1) ) {
1614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL! conv1's TO context is the same as conv2's!\n");
1615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(to1.wasClosed) {
1618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL! to1 is closed \n");
1619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(to2->wasClosed) {
1622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL! to2 was closed\n");
1623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*************************************/
1626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_close(conv1);
1628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("ucnv_closed (conv1)\n");
1629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TSCC_print_log(&from1, "from1");
1630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TSCC_print_log(from2, "from2");
1631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TSCC_print_log(&to1, "to1");
1632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TSCC_print_log(to2, "to2");
1633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(from1.wasClosed == FALSE) {
1635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL! from1 is NOT closed \n");
1636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(from2->wasClosed) {
1639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL! from2 was closed\n");
1640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(to1.wasClosed == FALSE) {
1643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL! to1 is NOT closed \n");
1644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(to2->wasClosed) {
1647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL! to2 was closed\n");
1648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_close(conv2);
1651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("ucnv_closed (conv2)\n");
1652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TSCC_print_log(&from1, "from1");
1654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TSCC_print_log(from2, "from2");
1655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(from1.wasClosed == FALSE) {
1657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL! from1 is NOT closed \n");
1658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(from2->wasClosed == FALSE) {
1661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL! from2 was NOT closed\n");
1662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TSCC_print_log(&to1, "to1");
1665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TSCC_print_log(to2, "to2");
1666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(to1.wasClosed == FALSE) {
1668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL! to1 is NOT closed \n");
1669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(to2->wasClosed == FALSE) {
1672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL! to2 was NOT closed\n");
1673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(to2 != (&to1)) {
1676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        free(to2); /* to1 is stack based */
1677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(from2 != (&from1)) {
1679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        free(from2); /* from1 is stack based */
1680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool
1685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerucontainsAnyOtherByte(uint8_t *p, int32_t length, uint8_t b) {
1686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while(length>0) {
1687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(*p!=b) {
1688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return TRUE;
1689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ++p;
1691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        --length;
1692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return FALSE;
1694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestConvertSafeClone()
1697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* one 'regular' & all the 'private stateful' converters */
1699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char *const names[] = {
1700b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/* BEGIN android-changed */
1701b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/* To save data space, Android does not support ISO2022 CJK */
1702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_LEGACY_CONVERSION
1703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "ibm-1047",
1704b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        /* "ISO_2022,locale=zh,version=1", */
1705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "SCSU",
1707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_LEGACY_CONVERSION
1708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "HZ",
1709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "lmbcs",
1710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "ISCII,version=0",
1711b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        /* "ISO_2022,locale=kr,version=1", */
1712b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        /* "ISO_2022,locale=jp,version=2", */
1713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "BOCU-1",
1715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "UTF-7",
1716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_LEGACY_CONVERSION
1717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "IMAP-mailbox-name",
1718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "ibm-1047-s390"
1719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else
1720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "IMAP=mailbox-name"
1721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1722b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/* END  android-changed */
1723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
1724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* store the actual sizes of each converter */
1726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t actualSizes[LENGTHOF(names)];
1727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const int32_t bufferSizes[] = {
1729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        U_CNV_SAFECLONE_BUFFERSIZE,
1730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        (int32_t)(3*sizeof(UConverter))/2,  /* 1.5*sizeof(UConverter) */
1731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        (int32_t)sizeof(UConverter)/2       /* 0.5*sizeof(UConverter) */
1732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
1733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char charBuffer[21];   /* Leave at an odd number for alignment testing */
1735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint8_t buffer[3] [U_CNV_SAFECLONE_BUFFERSIZE];
1736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t bufferSize, maxBufferSize;
1737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *maxName;
1738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UConverter * cnv, *cnv2;
1739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode err;
1740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char *pCharBuffer;
1742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *pConstCharBuffer;
1743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *charBufferLimit = charBuffer + sizeof(charBuffer)/sizeof(*charBuffer);
1744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar uniBuffer[] = {0x0058, 0x0059, 0x005A}; /* "XYZ" */
1745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar uniCharBuffer[20];
1746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char  charSourceBuffer[] = { 0x1b, 0x24, 0x42 };
1747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *pCharSource = charSourceBuffer;
1748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *pCharSourceLimit = charSourceBuffer + sizeof(charSourceBuffer);
1749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar *pUCharTarget = uniCharBuffer;
1750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar *pUCharTargetLimit = uniCharBuffer + sizeof(uniCharBuffer)/sizeof(*uniCharBuffer);
1751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UChar * pUniBuffer;
1752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UChar *uniBufferLimit = uniBuffer + sizeof(uniBuffer)/sizeof(*uniBuffer);
1753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t index, j;
1754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    err = U_ZERO_ERROR;
1756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cnv = ucnv_open(names[0], &err);
1757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_SUCCESS(err)) {
1758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Check the various error & informational states: */
1759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Null status - just returns NULL */
1761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        bufferSize = U_CNV_SAFECLONE_BUFFERSIZE;
1762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (0 != ucnv_safeClone(cnv, buffer[0], &bufferSize, 0))
1763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL: Cloned converter failed to deal correctly with null status\n");
1765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* error status - should return 0 & keep error the same */
1767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err = U_MEMORY_ALLOCATION_ERROR;
1768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (0 != ucnv_safeClone(cnv, buffer[0], &bufferSize, &err) || err != U_MEMORY_ALLOCATION_ERROR)
1769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL: Cloned converter failed to deal correctly with incoming error status\n");
1771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err = U_ZERO_ERROR;
1773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Null buffer size pointer - just returns NULL & set error to U_ILLEGAL_ARGUMENT_ERROR*/
1775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (0 != ucnv_safeClone(cnv, buffer[0], 0, &err) || err != U_ILLEGAL_ARGUMENT_ERROR)
1776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL: Cloned converter failed to deal correctly with null bufferSize pointer\n");
1778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err = U_ZERO_ERROR;
1780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* buffer size pointer is 0 - fill in pbufferSize with a size */
1782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        bufferSize = 0;
1783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (0 != ucnv_safeClone(cnv, buffer[0], &bufferSize, &err) || U_FAILURE(err) || bufferSize <= 0)
1784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL: Cloned converter failed a sizing request ('preflighting')\n");
1786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Verify our define is large enough  */
1788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_CNV_SAFECLONE_BUFFERSIZE < bufferSize)
1789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL: Pre-calculated buffer size is too small\n");
1791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Verify we can use this run-time calculated size */
1793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (0 == (cnv2 = ucnv_safeClone(cnv, buffer[0], &bufferSize, &err)) || U_FAILURE(err))
1794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL: Converter can't be cloned with run-time size\n");
1796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (cnv2) {
1798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ucnv_close(cnv2);
1799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* size one byte too small - should allocate & let us know */
1802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        --bufferSize;
1803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (0 == (cnv2 = ucnv_safeClone(cnv, 0, &bufferSize, &err)) || err != U_SAFECLONE_ALLOCATED_WARNING)
1804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL: Cloned converter failed to deal correctly with too-small buffer size\n");
1806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (cnv2) {
1808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ucnv_close(cnv2);
1809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err = U_ZERO_ERROR;
1812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        bufferSize = U_CNV_SAFECLONE_BUFFERSIZE;
1813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Null buffer pointer - return converter & set error to U_SAFECLONE_ALLOCATED_ERROR */
1815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (0 == (cnv2 = ucnv_safeClone(cnv, 0, &bufferSize, &err)) || err != U_SAFECLONE_ALLOCATED_WARNING)
1816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL: Cloned converter failed to deal correctly with null buffer pointer\n");
1818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (cnv2) {
1820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ucnv_close(cnv2);
1821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        err = U_ZERO_ERROR;
1824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Null converter - return NULL & set U_ILLEGAL_ARGUMENT_ERROR */
1826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (0 != ucnv_safeClone(0, buffer[0], &bufferSize, &err) || err != U_ILLEGAL_ARGUMENT_ERROR)
1827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL: Cloned converter failed to deal correctly with null converter pointer\n");
1829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_close(cnv);
1832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    maxBufferSize = 0;
1835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    maxName = "";
1836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Do these cloned converters work at all - shuffle UChars to chars & back again..*/
1838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(j = 0; j < LENGTHOF(bufferSizes); ++j) {
1840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (index = 0; index < LENGTHOF(names); index++)
1841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            err = U_ZERO_ERROR;
1843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            cnv = ucnv_open(names[index], &err);
1844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(U_FAILURE(err)) {
1845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_data_err("ucnv_open(\"%s\") failed - %s\n", names[index], u_errorName(err));
1846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                continue;
1847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(j == 0) {
1850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                /* preflight to get maxBufferSize */
1851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                actualSizes[index] = 0;
1852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                ucnv_safeClone(cnv, NULL, &actualSizes[index], &err);
1853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if(actualSizes[index] > maxBufferSize) {
1854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    maxBufferSize = actualSizes[index];
1855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    maxName = names[index];
1856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            memset(buffer, 0xaa, sizeof(buffer));
1860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            bufferSize = bufferSizes[j];
1862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            cnv2 = ucnv_safeClone(cnv, buffer[1], &bufferSize, &err);
1863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /* close the original immediately to make sure that the clone works by itself */
1865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ucnv_close(cnv);
1866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if( actualSizes[index] <= (bufferSizes[j] - (int32_t)sizeof(UAlignedMemory)) &&
1868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                err == U_SAFECLONE_ALLOCATED_WARNING
1869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ) {
1870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("ucnv_safeClone(%s) did a heap clone although the buffer was large enough\n", names[index]);
1871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /* check if the clone function overwrote any bytes that it is not supposed to touch */
1874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(bufferSize <= bufferSizes[j]) {
1875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                /* used the stack buffer */
1876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if( containsAnyOtherByte(buffer[0], (int32_t)sizeof(buffer[0]), 0xaa) ||
1877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    containsAnyOtherByte(buffer[1]+bufferSize, (int32_t)(sizeof(buffer)-(sizeof(buffer[0])+bufferSize)), 0xaa)
1878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                ) {
1879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    log_err("cloning %s in a stack buffer overwrote bytes outside the bufferSize %d (requested %d)\n",
1880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        names[index], bufferSize, bufferSizes[j]);
1881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
1883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                /* heap-allocated the clone */
1884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if(containsAnyOtherByte(buffer[0], (int32_t)sizeof(buffer), 0xaa)) {
1885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    log_err("cloning %s used the heap (bufferSize %d, requested %d) but overwrote stack buffer bytes\n",
1886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        names[index], bufferSize, bufferSizes[j]);
1887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            pCharBuffer = charBuffer;
1891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            pUniBuffer = uniBuffer;
1892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ucnv_fromUnicode(cnv2,
1894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            &pCharBuffer,
1895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            charBufferLimit,
1896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            &pUniBuffer,
1897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            uniBufferLimit,
1898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            NULL,
1899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            TRUE,
1900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            &err);
1901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(U_FAILURE(err)){
1902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("FAIL: cloned converter failed to do fromU conversion. Error: %s\n",u_errorName(err));
1903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ucnv_toUnicode(cnv2,
1905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           &pUCharTarget,
1906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           pUCharTargetLimit,
1907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           &pCharSource,
1908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           pCharSourceLimit,
1909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           NULL,
1910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           TRUE,
1911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           &err
1912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           );
1913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(U_FAILURE(err)){
1915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("FAIL: cloned converter failed to do toU conversion. Error: %s\n",u_errorName(err));
1916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            pConstCharBuffer = charBuffer;
1919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (uniBuffer [0] != ucnv_getNextUChar(cnv2, &pConstCharBuffer, pCharBuffer, &err))
1920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {
1921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("FAIL: Cloned converter failed to do conversion. Error: %s\n",u_errorName(err));
1922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ucnv_close(cnv2);
1924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("ucnv_safeClone(): sizeof(UConverter)=%lu  max preflighted clone size=%d (%s)  U_CNV_SAFECLONE_BUFFERSIZE=%d\n",
1928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        sizeof(UConverter), maxBufferSize, maxName, (int)U_CNV_SAFECLONE_BUFFERSIZE);
1929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(maxBufferSize > U_CNV_SAFECLONE_BUFFERSIZE) {
1930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucnv_safeClone(): max preflighted clone size=%d (%s) is larger than U_CNV_SAFECLONE_BUFFERSIZE=%d\n",
1931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            maxBufferSize, maxName, (int)U_CNV_SAFECLONE_BUFFERSIZE);
1932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestCCSID() {
1936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_LEGACY_CONVERSION
1937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UConverter *cnv;
1938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode;
1939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t ccsids[]={ 37, 850, 943, 949, 950, 1047, 1252, 1392, 33722 };
1940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i, ccsid;
1941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<(int32_t)(sizeof(ccsids)/sizeof(int32_t)); ++i) {
1943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ccsid=ccsids[i];
1944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errorCode=U_ZERO_ERROR;
1946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cnv=ucnv_openCCSID(ccsid, UCNV_IBM, &errorCode);
1947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(errorCode)) {
1948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_data_err("error: ucnv_openCCSID(%ld) failed (%s)\n", ccsid, u_errorName(errorCode));
1949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            continue;
1950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(ccsid!=ucnv_getCCSID(cnv, &errorCode)) {
1953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("error: ucnv_getCCSID(ucnv_openCCSID(%ld))=%ld\n", ccsid, ucnv_getCCSID(cnv, &errorCode));
1954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* skip gb18030(ccsid 1392) */
1957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(ccsid != 1392 && UCNV_IBM!=ucnv_getPlatform(cnv, &errorCode)) {
1958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("error: ucnv_getPlatform(ucnv_openCCSID(%ld))=%ld!=UCNV_IBM\n", ccsid, ucnv_getPlatform(cnv, &errorCode));
1959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_close(cnv);
1962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* jitterbug 932: ucnv_convert() bugs --------------------------------------- */
1967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* CHUNK_SIZE defined in common\ucnv.c: */
1969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define CHUNK_SIZE 1024
1970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void bug1(void);
1972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void bug2(void);
1973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void bug3(void);
1974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
1976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestJ932(void)
1977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   bug1(); /* Unicode intermediate buffer straddle bug */
1979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   bug2(); /* pre-flighting size incorrect caused by simple overflow */
1980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   bug3(); /* pre-flighting size incorrect caused by expansion overflow */
1981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
1984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * jitterbug 932: test chunking boundary conditions in
1985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t  ucnv_convert(const char *toConverterName,
1987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          const char *fromConverterName,
1988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          char *target,
1989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          int32_t targetSize,
1990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          const char *source,
1991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          int32_t sourceSize,
1992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          UErrorCode * err)
1993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * See discussions on the icu mailing list in
1995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 2001-April with the subject "converter 'flush' question".
1996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
1997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Bug report and test code provided by Edward J. Batutis.
1998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void bug1()
2000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_LEGACY_CONVERSION
2002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   char char_in[CHUNK_SIZE+32];
2003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   char char_out[CHUNK_SIZE*2];
2004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   /* GB 18030 equivalent of U+10000 is 90308130 */
2006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   static const char test_seq[]={ (char)0x90u, 0x30, (char)0x81u, 0x30 };
2007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   UErrorCode err = U_ZERO_ERROR;
2009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   int32_t i, test_seq_len = sizeof(test_seq);
2010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   /*
2012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    * causes straddle bug in Unicode intermediate buffer by sliding the test sequence forward
2013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    * until the straddle bug appears. I didn't want to hard-code everything so this test could
2014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    * be expanded - however this is the only type of straddle bug I can think of at the moment -
2015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    * a high surrogate in the last position of the Unicode intermediate buffer. Apparently no
2016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    * other Unicode sequences cause a bug since combining sequences are not supported by the
2017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    * converters.
2018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    */
2019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   for (i = test_seq_len; i >= 0; i--) {
2021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      /* put character sequence into input buffer */
2022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      memset(char_in, 0x61, sizeof(char_in)); /* GB 18030 'a' */
2023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      memcpy(char_in + (CHUNK_SIZE - i), test_seq, test_seq_len);
2024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      /* do the conversion */
2026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      ucnv_convert("us-ascii", /* out */
2027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   "gb18030",  /* in */
2028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   char_out,
2029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   sizeof(char_out),
2030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   char_in,
2031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   sizeof(char_in),
2032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   &err);
2033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      /* bug1: */
2035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      if (err == U_TRUNCATED_CHAR_FOUND) {
2036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         /* this happens when surrogate pair straddles the intermediate buffer in
2037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          * T_UConverter_fromCodepageToCodepage */
2038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         log_err("error j932 bug 1: expected success, got U_TRUNCATED_CHAR_FOUND\n");
2039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
2040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   }
2041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
2042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* bug2: pre-flighting loop bug: simple overflow causes bug */
2045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void bug2()
2046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* US-ASCII "1234567890" */
2048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char source[]={ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39 };
2049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char sourceUTF8[]={ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, (char)0xef, (char)0x80, (char)0x80 };
2050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char sourceUTF32[]={ 0x00, 0x00, 0x00, 0x30,
2051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                      0x00, 0x00, 0x00, 0x31,
2052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                      0x00, 0x00, 0x00, 0x32,
2053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                      0x00, 0x00, 0x00, 0x33,
2054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                      0x00, 0x00, 0x00, 0x34,
2055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                      0x00, 0x00, 0x00, 0x35,
2056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                      0x00, 0x00, 0x00, 0x36,
2057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                      0x00, 0x00, 0x00, 0x37,
2058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                      0x00, 0x00, 0x00, 0x38,
2059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                      0x00, 0x00, (char)0xf0, 0x00};
2060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static char target[5];
2061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode err = U_ZERO_ERROR;
2063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t size;
2064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* do the conversion */
2066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    size = ucnv_convert("iso-8859-1", /* out */
2067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        "us-ascii",  /* in */
2068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        target,
2069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        sizeof(target),
2070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        source,
2071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        sizeof(source),
2072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        &err);
2073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if ( size != 10 ) {
2075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* bug2: size is 5, should be 10 */
2076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_data_err("error j932 bug 2 us-ascii->iso-8859-1: got preflighting size %d instead of 10\n", size);
2077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    err = U_ZERO_ERROR;
2080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* do the conversion */
2081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    size = ucnv_convert("UTF-32BE", /* out */
2082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        "UTF-8",  /* in */
2083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        target,
2084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        sizeof(target),
2085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        sourceUTF8,
2086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        sizeof(sourceUTF8),
2087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        &err);
2088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if ( size != 32 ) {
2090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* bug2: size is 5, should be 32 */
2091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error j932 bug 2 UTF-8->UTF-32BE: got preflighting size %d instead of 32\n", size);
2092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    err = U_ZERO_ERROR;
2095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* do the conversion */
2096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    size = ucnv_convert("UTF-8", /* out */
2097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        "UTF-32BE",  /* in */
2098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        target,
2099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        sizeof(target),
2100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        sourceUTF32,
2101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        sizeof(sourceUTF32),
2102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        &err);
2103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if ( size != 12 ) {
2105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* bug2: size is 5, should be 12 */
2106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error j932 bug 2 UTF-32BE->UTF-8: got preflighting size %d instead of 12\n", size);
2107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
2111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * bug3: when the characters expand going from source to target codepage
2112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *       you get bug3 in addition to bug2
2113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
2114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void bug3()
2115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_LEGACY_CONVERSION
2117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char char_in[CHUNK_SIZE*4];
2118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char target[5];
2119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode err = U_ZERO_ERROR;
2120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t size;
2121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
2123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * first get the buggy size from bug2 then
2124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * compare it to buggy size with an expansion
2125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
2126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(char_in, 0x61, sizeof(char_in)); /* US-ASCII 'a' */
2127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* do the conversion */
2129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    size = ucnv_convert("lmbcs",     /* out */
2130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        "us-ascii",  /* in */
2131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        target,
2132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        sizeof(target),
2133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        char_in,
2134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        sizeof(char_in),
2135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        &err);
2136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if ( size != sizeof(char_in) ) {
2138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*
2139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * bug2: size is 0x2805 (CHUNK_SIZE*2+5 - maybe 5 is the size of the overflow buffer
2140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * in the converter?), should be CHUNK_SIZE*4
2141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *
2142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * Markus 2001-05-18: 5 is the size of our target[] here, ucnv_convert() did not reset targetSize...
2143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         */
2144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_data_err("error j932 bug 2/3a: expected preflighting size 0x%04x, got 0x%04x\n", sizeof(char_in), size);
2145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
2148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * now do the conversion with expansion
2149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * ascii 0x08 expands to 0x0F 0x28 in lmbcs
2150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
2151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(char_in, 8, sizeof(char_in));
2152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    err = U_ZERO_ERROR;
2153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* do the conversion */
2155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    size = ucnv_convert("lmbcs", /* out */
2156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        "us-ascii",  /* in */
2157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        target,
2158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        sizeof(target),
2159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        char_in,
2160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        sizeof(char_in),
2161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        &err);
2162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* expect 2X expansion */
2164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if ( size != sizeof(char_in) * 2 ) {
2165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*
2166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * bug3:
2167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * bug2 would lead us to expect 0x2805, but it isn't that either, it is 0x3c05:
2168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         */
2169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_data_err("error j932 bug 3b: expected 0x%04x, got 0x%04x\n", sizeof(char_in) * 2, size);
2170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
2172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
2175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruconvertExStreaming(UConverter *srcCnv, UConverter *targetCnv,
2176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   const char *src, int32_t srcLength,
2177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   const char *expectTarget, int32_t expectTargetLength,
2178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   int32_t chunkSize,
2179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   const char *testName,
2180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   UErrorCode expectCode) {
2181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar pivotBuffer[CHUNK_SIZE];
2182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar *pivotSource, *pivotTarget;
2183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UChar *pivotLimit;
2184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char targetBuffer[CHUNK_SIZE];
2186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char *target;
2187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *srcLimit, *finalSrcLimit, *targetLimit;
2188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t targetLength;
2190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool flush;
2192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode;
2194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* setup */
2196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(chunkSize>CHUNK_SIZE) {
2197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        chunkSize=CHUNK_SIZE;
2198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pivotSource=pivotTarget=pivotBuffer;
2201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pivotLimit=pivotBuffer+chunkSize;
2202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    finalSrcLimit=src+srcLength;
2204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    target=targetBuffer;
2205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    targetLimit=targetBuffer+chunkSize;
2206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_resetToUnicode(srcCnv);
2208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_resetFromUnicode(targetCnv);
2209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    flush=FALSE;
2212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* convert, streaming-style (both converters and pivot keep state) */
2214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(;;) {
2215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* for testing, give ucnv_convertEx() at most <chunkSize> input/pivot/output units at a time */
2216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(src+chunkSize<=finalSrcLimit) {
2217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            srcLimit=src+chunkSize;
2218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
2219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            srcLimit=finalSrcLimit;
2220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_convertEx(targetCnv, srcCnv,
2222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                       &target, targetLimit,
2223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                       &src, srcLimit,
2224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                       pivotBuffer, &pivotSource, &pivotTarget, pivotLimit,
2225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                       FALSE, flush, &errorCode);
2226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        targetLength=(int32_t)(target-targetBuffer);
2227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(target>targetLimit) {
2228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ucnv_convertEx(%s) chunk[%d] target %p exceeds targetLimit %p\n",
2229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    testName, chunkSize, target, targetLimit);
2230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break; /* TODO: major problem! */
2231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(errorCode==U_BUFFER_OVERFLOW_ERROR) {
2233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /* continue converting another chunk */
2234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errorCode=U_ZERO_ERROR;
2235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(targetLength+chunkSize<=sizeof(targetBuffer)) {
2236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                targetLimit=target+chunkSize;
2237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
2238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                targetLimit=targetBuffer+sizeof(targetBuffer);
2239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else if(U_FAILURE(errorCode)) {
2241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /* failure */
2242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
2243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else if(flush) {
2244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /* all done */
2245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
2246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else if(src==finalSrcLimit && pivotSource==pivotTarget) {
2247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /* all consumed, now flush without input (separate from conversion for testing) */
2248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            flush=TRUE;
2249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(!(errorCode==expectCode || (expectCode==U_ZERO_ERROR && errorCode==U_STRING_NOT_TERMINATED_WARNING))) {
2253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucnv_convertEx(%s) chunk[%d] results in %s instead of %s\n",
2254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                testName, chunkSize, u_errorName(errorCode), u_errorName(expectCode));
2255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else if(targetLength!=expectTargetLength) {
2256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucnv_convertEx(%s) chunk[%d] writes %d bytes instead of %d\n",
2257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                testName, chunkSize, targetLength, expectTargetLength);
2258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else if(memcmp(targetBuffer, expectTarget, targetLength)!=0) {
2259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucnv_convertEx(%s) chunk[%d] writes different bytes than expected\n",
2260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                testName, chunkSize);
2261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
2265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruconvertExMultiStreaming(UConverter *srcCnv, UConverter *targetCnv,
2266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        const char *src, int32_t srcLength,
2267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        const char *expectTarget, int32_t expectTargetLength,
2268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        const char *testName,
2269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        UErrorCode expectCode) {
2270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    convertExStreaming(srcCnv, targetCnv,
2271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                       src, srcLength,
2272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                       expectTarget, expectTargetLength,
2273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                       1, testName, expectCode);
2274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    convertExStreaming(srcCnv, targetCnv,
2275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                       src, srcLength,
2276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                       expectTarget, expectTargetLength,
2277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                       3, testName, expectCode);
2278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    convertExStreaming(srcCnv, targetCnv,
2279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                       src, srcLength,
2280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                       expectTarget, expectTargetLength,
2281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                       7, testName, expectCode);
2282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestConvertEx() {
2285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_LEGACY_CONVERSION
2286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const uint8_t
2287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    utf8[]={
2288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* 4e00           30a1              ff61              0410 */
2289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xe4, 0xb8, 0x80, 0xe3, 0x82, 0xa1, 0xef, 0xbd, 0xa1, 0xd0, 0x90
2290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
2291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    shiftJIS[]={
2292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x88, 0xea, 0x83, 0x40, 0xa1, 0x84, 0x40
2293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
2294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorTarget[]={
2295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*
2296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * expected output when converting shiftJIS[] from UTF-8 to Shift-JIS:
2297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * SUB, SUB, 0x40, SUB, SUB, 0x40
2298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         */
2299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xfc, 0xfc, 0xfc, 0xfc, 0x40, 0xfc, 0xfc, 0xfc, 0xfc, 0x40
2300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
2301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char srcBuffer[100], targetBuffer[100];
2303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *src;
2305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char *target;
2306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar pivotBuffer[100];
2308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar *pivotSource, *pivotTarget;
2309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UConverter *cnv1, *cnv2;
2311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode;
2312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cnv1=ucnv_open("UTF-8", &errorCode);
2315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
2316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("unable to open a UTF-8 converter - %s\n", u_errorName(errorCode));
2317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
2318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cnv2=ucnv_open("Shift-JIS", &errorCode);
2321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
2322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_data_err("unable to open a Shift-JIS converter - %s\n", u_errorName(errorCode));
2323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_close(cnv1);
2324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
2325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* test ucnv_convertEx() with streaming conversion style */
2328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    convertExMultiStreaming(cnv1, cnv2,
2329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        (const char *)utf8, sizeof(utf8), (const char *)shiftJIS, sizeof(shiftJIS),
2330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "UTF-8 -> Shift-JIS", U_ZERO_ERROR);
2331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    convertExMultiStreaming(cnv2, cnv1,
2333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        (const char *)shiftJIS, sizeof(shiftJIS), (const char *)utf8, sizeof(utf8),
2334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "Shift-JIS -> UTF-8", U_ZERO_ERROR);
2335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* U_ZERO_ERROR because by default the SUB callbacks are set */
2337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    convertExMultiStreaming(cnv1, cnv2,
2338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        (const char *)shiftJIS, sizeof(shiftJIS), (const char *)errorTarget, sizeof(errorTarget),
2339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "shiftJIS[] UTF-8 -> Shift-JIS", U_ZERO_ERROR);
2340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* test some simple conversions */
2342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* NUL-terminated source and target */
2344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_STRING_NOT_TERMINATED_WARNING;
2345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memcpy(srcBuffer, utf8, sizeof(utf8));
2346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcBuffer[sizeof(utf8)]=0;
2347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    src=srcBuffer;
2348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    target=targetBuffer;
2349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_convertEx(cnv2, cnv1, &target, targetBuffer+sizeof(targetBuffer), &src, NULL,
2350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   NULL, NULL, NULL, NULL, TRUE, TRUE, &errorCode);
2351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if( errorCode!=U_ZERO_ERROR ||
2352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        target-targetBuffer!=sizeof(shiftJIS) ||
2353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *target!=0 ||
2354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        memcmp(targetBuffer, shiftJIS, sizeof(shiftJIS))!=0
2355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ) {
2356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucnv_convertEx(simple UTF-8 -> Shift_JIS) fails: %s - writes %d bytes, expect %d\n",
2357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                u_errorName(errorCode), target-targetBuffer, sizeof(shiftJIS));
2358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* NUL-terminated source and U_STRING_NOT_TERMINATED_WARNING */
2361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_AMBIGUOUS_ALIAS_WARNING;
2362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(targetBuffer, 0xff, sizeof(targetBuffer));
2363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    src=srcBuffer;
2364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    target=targetBuffer;
2365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_convertEx(cnv2, cnv1, &target, targetBuffer+sizeof(shiftJIS), &src, NULL,
2366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   NULL, NULL, NULL, NULL, TRUE, TRUE, &errorCode);
2367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if( errorCode!=U_STRING_NOT_TERMINATED_WARNING ||
2368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        target-targetBuffer!=sizeof(shiftJIS) ||
2369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *target!=(char)0xff ||
2370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        memcmp(targetBuffer, shiftJIS, sizeof(shiftJIS))!=0
2371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ) {
2372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucnv_convertEx(simple UTF-8 -> Shift_JIS) fails: %s, expect U_STRING_NOT_TERMINATED_WARNING - writes %d bytes, expect %d\n",
2373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                u_errorName(errorCode), target-targetBuffer, sizeof(shiftJIS));
2374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* bad arguments */
2377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_MESSAGE_PARSE_ERROR;
2378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    src=srcBuffer;
2379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    target=targetBuffer;
2380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_convertEx(cnv2, cnv1, &target, targetBuffer+sizeof(targetBuffer), &src, NULL,
2381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   NULL, NULL, NULL, NULL, TRUE, TRUE, &errorCode);
2382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_MESSAGE_PARSE_ERROR) {
2383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucnv_convertEx(U_MESSAGE_PARSE_ERROR) sets %s\n", u_errorName(errorCode));
2384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* pivotLimit==pivotStart */
2387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pivotSource=pivotTarget=pivotBuffer;
2389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_convertEx(cnv2, cnv1, &target, targetBuffer+sizeof(targetBuffer), &src, NULL,
2390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   pivotBuffer, &pivotSource, &pivotTarget, pivotBuffer, TRUE, TRUE, &errorCode);
2391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) {
2392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucnv_convertEx(pivotLimit==pivotStart) sets %s\n", u_errorName(errorCode));
2393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* *pivotSource==NULL */
2396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pivotSource=NULL;
2398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_convertEx(cnv2, cnv1, &target, targetBuffer+sizeof(targetBuffer), &src, NULL,
2399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   pivotBuffer, &pivotSource, &pivotTarget, pivotBuffer+1, TRUE, TRUE, &errorCode);
2400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) {
2401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucnv_convertEx(*pivotSource==NULL) sets %s\n", u_errorName(errorCode));
2402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* *source==NULL */
2405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    src=NULL;
2407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pivotSource=pivotBuffer;
2408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_convertEx(cnv2, cnv1, &target, targetBuffer+sizeof(targetBuffer), &src, NULL,
2409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   pivotBuffer, &pivotSource, &pivotTarget, pivotBuffer+1, TRUE, TRUE, &errorCode);
2410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) {
2411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucnv_convertEx(*source==NULL) sets %s\n", u_errorName(errorCode));
2412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* streaming conversion without a pivot buffer */
2415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    src=srcBuffer;
2417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pivotSource=pivotBuffer;
2418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_convertEx(cnv2, cnv1, &target, targetBuffer+sizeof(targetBuffer), &src, NULL,
2419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   NULL, &pivotSource, &pivotTarget, pivotBuffer+1, TRUE, FALSE, &errorCode);
2420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) {
2421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucnv_convertEx(pivotStart==NULL) sets %s\n", u_errorName(errorCode));
2422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_close(cnv1);
2425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_close(cnv2);
2426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
2427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Test illegal UTF-8 input: Data and functions for TestConvertExFromUTF8(). */
2430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char *const badUTF8[]={
2431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* trail byte */
2432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\x80",
2433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* truncated multi-byte sequences */
2435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\xd0",
2436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\xe0",
2437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\xe1",
2438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\xed",
2439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\xee",
2440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\xf0",
2441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\xf1",
2442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\xf4",
2443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\xf8",
2444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\xfc",
2445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\xe0\x80",
2447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\xe0\xa0",
2448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\xe1\x80",
2449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\xed\x80",
2450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\xed\xa0",
2451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\xee\x80",
2452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\xf0\x80",
2453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\xf0\x90",
2454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\xf1\x80",
2455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\xf4\x80",
2456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\xf4\x90",
2457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\xf8\x80",
2458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\xfc\x80",
2459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\xf0\x80\x80",
2461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\xf0\x90\x80",
2462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\xf1\x80\x80",
2463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\xf4\x80\x80",
2464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\xf4\x90\x80",
2465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\xf8\x80\x80",
2466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\xfc\x80\x80",
2467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\xf8\x80\x80\x80",
2469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\xfc\x80\x80\x80",
2470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\xfc\x80\x80\x80\x80",
2472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* complete sequences but non-shortest forms or out of range etc. */
2474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\xc0\x80",
2475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\xe0\x80\x80",
2476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\xed\xa0\x80",
2477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\xf0\x80\x80\x80",
2478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\xf4\x90\x80\x80",
2479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\xf8\x80\x80\x80\x80",
2480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\xfc\x80\x80\x80\x80\x80",
2481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\xfe",
2482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "\xff"
2483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
2484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2485b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#define ARG_CHAR_ARR_SIZE 8
2486b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* get some character that can be converted and convert it */
2488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool getTestChar(UConverter *cnv, const char *converterName,
2489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         char charUTF8[4], int32_t *pCharUTF8Length,
2490b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                         char char0[ARG_CHAR_ARR_SIZE], int32_t *pChar0Length,
2491b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                         char char1[ARG_CHAR_ARR_SIZE], int32_t *pChar1Length) {
2492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar utf16[U16_MAX_LENGTH];
2493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t utf16Length;
2494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UChar *utf16Source;
2496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char *target;
2497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    USet *set;
2499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar32 c;
2500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode;
2501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    set=uset_open(1, 0);
2504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_getUnicodeSet(cnv, set, UCNV_ROUNDTRIP_SET, &errorCode);
2505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c=uset_charAt(set, uset_size(set)/2);
2506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uset_close(set);
2507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    utf16Length=0;
2509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    U16_APPEND_UNSAFE(utf16, utf16Length, c);
2510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    *pCharUTF8Length=0;
2511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    U8_APPEND_UNSAFE(charUTF8, *pCharUTF8Length, c);
2512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    utf16Source=utf16;
2514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    target=char0;
2515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_fromUnicode(cnv,
2516b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                     &target, char0+ARG_CHAR_ARR_SIZE,
2517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                     &utf16Source, utf16+utf16Length,
2518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                     NULL, FALSE, &errorCode);
2519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    *pChar0Length=(int32_t)(target-char0);
2520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    utf16Source=utf16;
2522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    target=char1;
2523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_fromUnicode(cnv,
2524b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                     &target, char1+ARG_CHAR_ARR_SIZE,
2525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                     &utf16Source, utf16+utf16Length,
2526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                     NULL, FALSE, &errorCode);
2527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    *pChar1Length=(int32_t)(target-char1);
2528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
2530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("unable to get test character for %s - %s\n", converterName, u_errorName(errorCode));
2531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
2532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return TRUE;
2534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void testFromTruncatedUTF8(UConverter *utf8Cnv, UConverter *cnv, const char *converterName,
2537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                  char charUTF8[4], int32_t charUTF8Length,
2538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                  char char0[8], int32_t char0Length,
2539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                  char char1[8], int32_t char1Length) {
2540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char utf8[16];
2541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t utf8Length;
2542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char output[16];
2544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t outputLength;
2545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char invalidChars[8];
2547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int8_t invalidLength;
2548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *source;
2550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char *target;
2551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar pivotBuffer[8];
2553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar *pivotSource, *pivotTarget;
2554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode;
2556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
2557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* test truncated sequences */
2559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_setToUCallBack(utf8Cnv, UCNV_TO_U_CALLBACK_STOP, NULL, NULL, NULL, &errorCode);
2561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memcpy(utf8, charUTF8, charUTF8Length);
2563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<LENGTHOF(badUTF8); ++i) {
2565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* truncated sequence? */
2566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t length=strlen(badUTF8[i]);
2567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(length>=(1+U8_COUNT_TRAIL_BYTES(badUTF8[i][0]))) {
2568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            continue;
2569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* assemble a string with the test character and the truncated sequence */
2572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        memcpy(utf8+charUTF8Length, badUTF8[i], length);
2573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        utf8Length=charUTF8Length+length;
2574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* convert and check the invalidChars */
2576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        source=utf8;
2577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        target=output;
2578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pivotSource=pivotTarget=pivotBuffer;
2579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errorCode=U_ZERO_ERROR;
2580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_convertEx(cnv, utf8Cnv,
2581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                       &target, output+sizeof(output),
2582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                       &source, utf8+utf8Length,
2583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                       pivotBuffer, &pivotSource, &pivotTarget, pivotBuffer+LENGTHOF(pivotBuffer),
2584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                       TRUE, TRUE, /* reset & flush */
2585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                       &errorCode);
2586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        outputLength=(int32_t)(target-output);
2587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(errorCode!=U_TRUNCATED_CHAR_FOUND || pivotSource!=pivotBuffer) {
2588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("unexpected error %s from %s badUTF8[%ld]\n", u_errorName(errorCode), converterName, (long)i);
2589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            continue;
2590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errorCode=U_ZERO_ERROR;
2593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        invalidLength=(int8_t)sizeof(invalidChars);
2594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_getInvalidChars(utf8Cnv, invalidChars, &invalidLength, &errorCode);
2595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(invalidLength!=length || 0!=memcmp(invalidChars, badUTF8[i], length)) {
2596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("wrong invalidChars from %s badUTF8[%ld]\n", converterName, (long)i);
2597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void testFromBadUTF8(UConverter *utf8Cnv, UConverter *cnv, const char *converterName,
2602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            char charUTF8[4], int32_t charUTF8Length,
2603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            char char0[8], int32_t char0Length,
2604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            char char1[8], int32_t char1Length) {
2605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char utf8[600], expect[600];
2606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t utf8Length, expectLength;
2607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char testName[32];
2609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode;
2611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
2612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_setToUCallBack(utf8Cnv, UCNV_TO_U_CALLBACK_SKIP, NULL, NULL, NULL, &errorCode);
2615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
2617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * assemble an input string with the test character between each
2618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * bad sequence,
2619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * and an expected string with repeated test character output
2620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
2621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memcpy(utf8, charUTF8, charUTF8Length);
2622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    utf8Length=charUTF8Length;
2623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memcpy(expect, char0, char0Length);
2625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expectLength=char0Length;
2626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<LENGTHOF(badUTF8); ++i) {
2628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t length=strlen(badUTF8[i]);
2629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        memcpy(utf8+utf8Length, badUTF8[i], length);
2630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        utf8Length+=length;
2631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        memcpy(utf8+utf8Length, charUTF8, charUTF8Length);
2633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        utf8Length+=charUTF8Length;
2634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        memcpy(expect+expectLength, char1, char1Length);
2636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expectLength+=char1Length;
2637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* expect that each bad UTF-8 sequence is detected and skipped */
2640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strcpy(testName, "from bad UTF-8 to ");
2641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strcat(testName, converterName);
2642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    convertExMultiStreaming(utf8Cnv, cnv,
2644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            utf8, utf8Length,
2645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            expect, expectLength,
2646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            testName,
2647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            U_ZERO_ERROR);
2648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Test illegal UTF-8 input. */
2651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestConvertExFromUTF8() {
2652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char *const converterNames[]={
2653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_LEGACY_CONVERSION
2654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "windows-1252",
2655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "shift-jis",
2656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
2657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "us-ascii",
2658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "iso-8859-1",
2659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "utf-8"
2660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
2661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UConverter *utf8Cnv, *cnv;
2663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode;
2664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
2665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* fromUnicode versions of some character, from initial state and later */
2667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char charUTF8[4], char0[8], char1[8];
2668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t charUTF8Length, char0Length, char1Length;
2669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    utf8Cnv=ucnv_open("UTF-8", &errorCode);
2672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
26736d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_data_err("unable to open UTF-8 converter - %s\n", u_errorName(errorCode));
2674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
2675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<LENGTHOF(converterNames); ++i) {
2678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errorCode=U_ZERO_ERROR;
2679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cnv=ucnv_open(converterNames[i], &errorCode);
2680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(errorCode)) {
26816d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            log_data_err("unable to open %s converter - %s\n", converterNames[i], u_errorName(errorCode));
2682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            continue;
2683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!getTestChar(cnv, converterNames[i], charUTF8, &charUTF8Length, char0, &char0Length, char1, &char1Length)) {
2685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            continue;
2686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        testFromTruncatedUTF8(utf8Cnv, cnv, converterNames[i], charUTF8, charUTF8Length, char0, char0Length, char1, char1Length);
2688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        testFromBadUTF8(utf8Cnv, cnv, converterNames[i], charUTF8, charUTF8Length, char0, char0Length, char1, char1Length);
2689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_close(cnv);
2690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_close(utf8Cnv);
2692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
269450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic void TestConvertExFromUTF8_C5F0() {
269550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    static const char *const converterNames[]={
269650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if !UCONFIG_NO_LEGACY_CONVERSION
269750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        "windows-1251",
269850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        "shift-jis",
269950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif
270050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        "us-ascii",
270150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        "iso-8859-1",
270250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        "utf-8"
270350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    };
270450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
270550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UConverter *utf8Cnv, *cnv;
270650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UErrorCode errorCode;
270750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int32_t i;
270850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
270927f654740f2a26ad62a5c155af9199af9e69b889claireho    static const char bad_utf8[2]={ (char)0xC5, (char)0xF0 };
271050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /* Expect "&#65533;&#65533;" (2x U+FFFD as decimal NCRs) */
271150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    static const char twoNCRs[16]={
271250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        0x26, 0x23, 0x36, 0x35, 0x35, 0x33, 0x33, 0x3B,
271350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        0x26, 0x23, 0x36, 0x35, 0x35, 0x33, 0x33, 0x3B
271450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    };
271550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    static const char twoFFFD[6]={
271650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        (char)0xef, (char)0xbf, (char)0xbd,
271750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        (char)0xef, (char)0xbf, (char)0xbd
271850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    };
271950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    const char *expected;
272050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int32_t expectedLength;
272150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    char dest[20];  /* longer than longest expectedLength */
272250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
272350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    const char *src;
272450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    char *target;
272550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
272650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UChar pivotBuffer[128];
272750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UChar *pivotSource, *pivotTarget;
272850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
272950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    errorCode=U_ZERO_ERROR;
273050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    utf8Cnv=ucnv_open("UTF-8", &errorCode);
273150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(U_FAILURE(errorCode)) {
273250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_data_err("unable to open UTF-8 converter - %s\n", u_errorName(errorCode));
273350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return;
273450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
273550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
273650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    for(i=0; i<LENGTHOF(converterNames); ++i) {
273750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        errorCode=U_ZERO_ERROR;
273850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        cnv=ucnv_open(converterNames[i], &errorCode);
273950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        ucnv_setFromUCallBack(cnv, UCNV_FROM_U_CALLBACK_ESCAPE, UCNV_ESCAPE_XML_DEC,
274050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                              NULL, NULL, &errorCode);
274150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if(U_FAILURE(errorCode)) {
274250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            log_data_err("unable to open %s converter - %s\n",
274350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                         converterNames[i], u_errorName(errorCode));
274450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            continue;
274550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
274650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        src=bad_utf8;
274750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        target=dest;
274850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uprv_memset(dest, 9, sizeof(dest));
274950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if(i==LENGTHOF(converterNames)-1) {
275050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            /* conversion to UTF-8 yields two U+FFFD directly */
275150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            expected=twoFFFD;
275250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            expectedLength=6;
275350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        } else {
275450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            /* conversion to a non-Unicode charset yields two NCRs */
275550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            expected=twoNCRs;
275650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            expectedLength=16;
275750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
275850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        pivotBuffer[0]=0;
275950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        pivotBuffer[1]=1;
276050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        pivotBuffer[2]=2;
276150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        pivotSource=pivotTarget=pivotBuffer;
276250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        ucnv_convertEx(
276350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            cnv, utf8Cnv,
276450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            &target, dest+expectedLength,
276550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            &src, bad_utf8+sizeof(bad_utf8),
276650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            pivotBuffer, &pivotSource, &pivotTarget, pivotBuffer+LENGTHOF(pivotBuffer),
276750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            TRUE, TRUE, &errorCode);
276850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if( errorCode!=U_STRING_NOT_TERMINATED_WARNING || src!=bad_utf8+2 ||
276950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            target!=dest+expectedLength || 0!=uprv_memcmp(dest, expected, expectedLength) ||
277050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            dest[expectedLength]!=9
277150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        ) {
277250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            log_err("ucnv_convertEx(UTF-8 C5 F0 -> %s/decimal NCRs) failed\n", converterNames[i]);
277350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
277450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        ucnv_close(cnv);
277550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
277650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    ucnv_close(utf8Cnv);
277750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
277850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
2779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
2780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestConvertAlgorithmic() {
2781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_LEGACY_CONVERSION
2782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const uint8_t
2783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    utf8[]={
2784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* 4e00           30a1              ff61              0410 */
2785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xe4, 0xb8, 0x80, 0xe3, 0x82, 0xa1, 0xef, 0xbd, 0xa1, 0xd0, 0x90
2786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
2787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    shiftJIS[]={
2788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x88, 0xea, 0x83, 0x40, 0xa1, 0x84, 0x40
2789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
2790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /*errorTarget[]={*/
2791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*
2792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * expected output when converting shiftJIS[] from UTF-8 to Shift-JIS:
2793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * SUB, SUB, 0x40, SUB, SUB, 0x40
2794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         */
2795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /* 0x81, 0xa1, 0x81, 0xa1, 0x40, 0x81, 0xa1, 0x81, 0xa1, 0x40*/
2796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /*},*/
2797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    utf16[]={
2798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xfe, 0xff /* BOM only, no text */
2799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
2800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    utf32[]={
2801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xff, 0xfe, 0, 0 /* BOM only, no text */
2802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
2803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char target[100], utf8NUL[100], shiftJISNUL[100];
2805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UConverter *cnv;
2807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode;
2808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t length;
2810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cnv=ucnv_open("Shift-JIS", &errorCode);
2813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
2814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_data_err("unable to open a Shift-JIS converter - %s\n", u_errorName(errorCode));
2815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_close(cnv);
2816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
2817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memcpy(utf8NUL, utf8, sizeof(utf8));
2820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    utf8NUL[sizeof(utf8)]=0;
2821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memcpy(shiftJISNUL, shiftJIS, sizeof(shiftJIS));
2822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    shiftJISNUL[sizeof(shiftJIS)]=0;
2823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
2825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * The to/from algorithmic convenience functions share a common implementation,
2826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * so we need not test all permutations of them.
2827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
2828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* length in, not terminated out */
2830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=ucnv_fromAlgorithmic(cnv, UCNV_UTF8, target, sizeof(shiftJIS), (const char *)utf8, sizeof(utf8), &errorCode);
2832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if( errorCode!=U_STRING_NOT_TERMINATED_WARNING ||
2833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        length!=sizeof(shiftJIS) ||
2834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        memcmp(target, shiftJIS, length)!=0
2835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ) {
2836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucnv_fromAlgorithmic(UTF-8 -> Shift-JIS) fails (%s expect U_STRING_NOT_TERMINATED_WARNING), returns %d expect %d\n",
2837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                u_errorName(errorCode), length, sizeof(shiftJIS));
2838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* terminated in and out */
2841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(target, 0x55, sizeof(target));
2842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_STRING_NOT_TERMINATED_WARNING;
2843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=ucnv_toAlgorithmic(UCNV_UTF8, cnv, target, sizeof(target), shiftJISNUL, -1, &errorCode);
2844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if( errorCode!=U_ZERO_ERROR ||
2845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        length!=sizeof(utf8) ||
2846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        memcmp(target, utf8, length)!=0
2847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ) {
2848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucnv_toAlgorithmic(Shift-JIS -> UTF-8) fails (%s expect U_ZERO_ERROR), returns %d expect %d\n",
2849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                u_errorName(errorCode), length, sizeof(shiftJIS));
2850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* empty string, some target buffer */
2853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_STRING_NOT_TERMINATED_WARNING;
2854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=ucnv_toAlgorithmic(UCNV_UTF8, cnv, target, sizeof(target), shiftJISNUL, 0, &errorCode);
2855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if( errorCode!=U_ZERO_ERROR ||
2856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        length!=0
2857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ) {
2858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucnv_toAlgorithmic(empty string -> UTF-8) fails (%s expect U_ZERO_ERROR), returns %d expect 0\n",
2859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                u_errorName(errorCode), length);
2860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* pseudo-empty string, no target buffer */
2863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=ucnv_fromAlgorithmic(cnv, UCNV_UTF16, target, 0, (const char *)utf16, 2, &errorCode);
2865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if( errorCode!=U_STRING_NOT_TERMINATED_WARNING ||
2866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        length!=0
2867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ) {
2868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucnv_fromAlgorithmic(UTF-16 only BOM -> Shift-JIS) fails (%s expect U_STRING_NOT_TERMINATED_WARNING), returns %d expect 0\n",
2869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                u_errorName(errorCode), length);
2870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=ucnv_fromAlgorithmic(cnv, UCNV_UTF32, target, 0, (const char *)utf32, 4, &errorCode);
2874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if( errorCode!=U_STRING_NOT_TERMINATED_WARNING ||
2875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        length!=0
2876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ) {
2877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucnv_fromAlgorithmic(UTF-32 only BOM -> Shift-JIS) fails (%s expect U_STRING_NOT_TERMINATED_WARNING), returns %d expect 0\n",
2878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                u_errorName(errorCode), length);
2879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* bad arguments */
2882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_MESSAGE_PARSE_ERROR;
2883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=ucnv_fromAlgorithmic(cnv, UCNV_UTF16, target, 0, (const char *)utf16, 2, &errorCode);
2884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_MESSAGE_PARSE_ERROR) {
2885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucnv_fromAlgorithmic(U_MESSAGE_PARSE_ERROR) sets %s\n", u_errorName(errorCode));
2886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* source==NULL */
2889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=ucnv_fromAlgorithmic(cnv, UCNV_UTF16, target, 0, NULL, 2, &errorCode);
2891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) {
2892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucnv_fromAlgorithmic(source==NULL) sets %s\n", u_errorName(errorCode));
2893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* illegal alg. type */
2896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
2897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=ucnv_fromAlgorithmic(cnv, (UConverterType)99, target, 0, (const char *)utf16, 2, &errorCode);
2898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) {
2899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucnv_fromAlgorithmic(illegal alg. type) sets %s\n", u_errorName(errorCode));
2900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucnv_close(cnv);
2902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
2903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestLMBCSMaxChar(void) {
2906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const struct {
2907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int8_t maxSize;
2908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *name;
2909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } converter[] = {
2910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* some non-LMBCS converters - perfect test setup here */
2911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 1, "US-ASCII"},
2912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 1, "ISO-8859-1"},
2913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
291450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        { 2, "UTF-16"},
291550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        { 2, "UTF-16BE"},
2916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 3, "UTF-8"},
2917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 3, "CESU-8"},
2918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 3, "SCSU"},
2919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 4, "UTF-32"},
2920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 4, "UTF-7"},
2921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 4, "IMAP-mailbox-name"},
2922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 4, "BOCU-1"},
2923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 1, "windows-1256"},
2925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 2, "Shift-JIS"},
2926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 2, "ibm-16684"},
2927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 3, "ibm-930"},
2928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 3, "ibm-1390"},
2929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 4, "*test3"},
2930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 16,"*test4"},
2931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 4, "ISCII"},
2933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 4, "HZ"},
2934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 3, "ISO-2022"},
2936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 3, "ISO-2022-KR"},
2937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 6, "ISO-2022-JP"},
2938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 8, "ISO-2022-CN"},
2939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* LMBCS */
2941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 3, "LMBCS-1"},
2942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 3, "LMBCS-2"},
2943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 3, "LMBCS-3"},
2944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 3, "LMBCS-4"},
2945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 3, "LMBCS-5"},
2946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 3, "LMBCS-6"},
2947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 3, "LMBCS-8"},
2948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 3, "LMBCS-11"},
2949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 3, "LMBCS-16"},
2950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 3, "LMBCS-17"},
2951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 3, "LMBCS-18"},
2952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 3, "LMBCS-19"}
2953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
2954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t idx;
2955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (idx = 0; idx < LENGTHOF(converter); idx++) {
2957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
2958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UConverter *cnv = cnv_open(converter[idx].name, &status);
2959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) {
2960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            continue;
2961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (converter[idx].maxSize != ucnv_getMaxCharSize(cnv)) {
2963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("error: ucnv_getMaxCharSize(%s) expected %d, got %d\n",
2964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                converter[idx].name, converter[idx].maxSize, ucnv_getMaxCharSize(cnv));
2965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_close(cnv);
2967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* mostly test that the macro compiles */
2970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(UCNV_GET_MAX_BYTES_FOR_STRING(1, 2)<10) {
2971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error UCNV_GET_MAX_BYTES_FOR_STRING(1, 2)<10\n");
2972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestJ1968(void) {
2977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode err = U_ZERO_ERROR;
2978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UConverter *cnv;
2979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char myConvName[] = "My really really really really really really really really really really really"
2980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          " really really really really really really really really really really really"
2981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          " really really really really really really really really long converter name";
2982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar myConvNameU[sizeof(myConvName)];
2983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_charsToUChars(myConvName, myConvNameU, sizeof(myConvName));
2985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    err = U_ZERO_ERROR;
2987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    myConvNameU[UCNV_MAX_CONVERTER_NAME_LENGTH+1] = 0;
2988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cnv = ucnv_openU(myConvNameU, &err);
2989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (cnv || err != U_ILLEGAL_ARGUMENT_ERROR) {
2990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("1U) Didn't get U_ILLEGAL_ARGUMENT_ERROR as expected %s\n", u_errorName(err));
2991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    err = U_ZERO_ERROR;
2994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    myConvNameU[UCNV_MAX_CONVERTER_NAME_LENGTH] = 0;
2995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cnv = ucnv_openU(myConvNameU, &err);
2996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (cnv || err != U_ILLEGAL_ARGUMENT_ERROR) {
2997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("2U) Didn't get U_ILLEGAL_ARGUMENT_ERROR as expected %s\n", u_errorName(err));
2998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    err = U_ZERO_ERROR;
3001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    myConvNameU[UCNV_MAX_CONVERTER_NAME_LENGTH-1] = 0;
3002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cnv = ucnv_openU(myConvNameU, &err);
3003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (cnv || err != U_FILE_ACCESS_ERROR) {
3004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("3U) Didn't get U_FILE_ACCESS_ERROR as expected %s\n", u_errorName(err));
3005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    err = U_ZERO_ERROR;
3011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cnv = ucnv_open(myConvName, &err);
3012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (cnv || err != U_ILLEGAL_ARGUMENT_ERROR) {
3013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("1) Didn't get U_ILLEGAL_ARGUMENT_ERROR as expected %s\n", u_errorName(err));
3014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    err = U_ZERO_ERROR;
3017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    myConvName[UCNV_MAX_CONVERTER_NAME_LENGTH] = ',';
3018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cnv = ucnv_open(myConvName, &err);
3019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (cnv || err != U_ILLEGAL_ARGUMENT_ERROR) {
3020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("2) Didn't get U_ILLEGAL_ARGUMENT_ERROR as expected %s\n", u_errorName(err));
3021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    err = U_ZERO_ERROR;
3024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    myConvName[UCNV_MAX_CONVERTER_NAME_LENGTH-1] = ',';
3025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cnv = ucnv_open(myConvName, &err);
3026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (cnv || err != U_FILE_ACCESS_ERROR) {
3027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("3) Didn't get U_FILE_ACCESS_ERROR as expected %s\n", u_errorName(err));
3028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    err = U_ZERO_ERROR;
3031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    myConvName[UCNV_MAX_CONVERTER_NAME_LENGTH-1] = ',';
3032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strncpy(myConvName + UCNV_MAX_CONVERTER_NAME_LENGTH, "locale=", 7);
3033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cnv = ucnv_open(myConvName, &err);
3034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (cnv || err != U_ILLEGAL_ARGUMENT_ERROR) {
3035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("4) Didn't get U_ILLEGAL_ARGUMENT_ERROR as expected %s\n", u_errorName(err));
3036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* The comma isn't really a part of the converter name. */
3039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    err = U_ZERO_ERROR;
3040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    myConvName[UCNV_MAX_CONVERTER_NAME_LENGTH] = 0;
3041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cnv = ucnv_open(myConvName, &err);
3042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (cnv || err != U_FILE_ACCESS_ERROR) {
3043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("5) Didn't get U_FILE_ACCESS_ERROR as expected %s\n", u_errorName(err));
3044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    err = U_ZERO_ERROR;
3047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    myConvName[UCNV_MAX_CONVERTER_NAME_LENGTH-1] = ' ';
3048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cnv = ucnv_open(myConvName, &err);
3049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (cnv || err != U_ILLEGAL_ARGUMENT_ERROR) {
3050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("6) Didn't get U_ILLEGAL_ARGUMENT_ERROR as expected %s\n", u_errorName(err));
3051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    err = U_ZERO_ERROR;
3054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    myConvName[UCNV_MAX_CONVERTER_NAME_LENGTH-1] = 0;
3055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cnv = ucnv_open(myConvName, &err);
3056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (cnv || err != U_FILE_ACCESS_ERROR) {
3057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("7) Didn't get U_FILE_ACCESS_ERROR as expected %s\n", u_errorName(err));
3058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_LEGACY_CONVERSION
3063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
3064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerutestSwap(const char *name, UBool swap) {
3065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
3066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Test Unicode text.
3067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Contains characters that are the highest for some of the
3068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * tested conversions, to make sure that the ucnvmbcs.c code that modifies the
3069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * tables copies the entire tables.
3070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
3071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar text[]={
3072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x61, 0xd, 0x62, 0xa, 0x4e00, 0x3000, 0xfffd, 0xa, 0x20, 0x85, 0xff5e, 0x7a
3073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
3074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar uNormal[32], uSwapped[32];
3076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char normal[32], swapped[32];
3077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UChar *pcu;
3078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar *pu;
3079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char *pc;
3080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i, normalLength, swappedLength;
3081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar u;
3082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char c;
3083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *swappedName;
3085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UConverter *cnv, *swapCnv;
3086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode;
3087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* if the swap flag is FALSE, then the test encoding is not EBCDIC and must not swap */
3089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* open both the normal and the LF/NL-swapping converters */
3091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strcpy(swapped, name);
3092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strcat(swapped, UCNV_SWAP_LFNL_OPTION_STRING);
3093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
3095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    swapCnv=ucnv_open(swapped, &errorCode);
3096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cnv=ucnv_open(name, &errorCode);
3097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
3098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_data_err("TestEBCDICSwapLFNL error: unable to open %s or %s (%s)\n", name, swapped, u_errorName(errorCode));
3099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto cleanup;
3100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* the name must contain the swap option if and only if we expect the converter to swap */
3103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    swappedName=ucnv_getName(swapCnv, &errorCode);
3104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
3105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("TestEBCDICSwapLFNL error: ucnv_getName(%s,swaplfnl) failed (%s)\n", name, u_errorName(errorCode));
3106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto cleanup;
3107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pc=strstr(swappedName, UCNV_SWAP_LFNL_OPTION_STRING);
3110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(swap != (pc!=NULL)) {
3111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("TestEBCDICSwapLFNL error: ucnv_getName(%s,swaplfnl)=%s should (%d) contain 'swaplfnl'\n", name, swappedName, swap);
3112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto cleanup;
3113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* convert to EBCDIC */
3116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pcu=text;
3117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pc=normal;
3118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_fromUnicode(cnv, &pc, normal+LENGTHOF(normal), &pcu, text+LENGTHOF(text), NULL, TRUE, &errorCode);
3119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    normalLength=(int32_t)(pc-normal);
3120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pcu=text;
3122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pc=swapped;
3123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_fromUnicode(swapCnv, &pc, swapped+LENGTHOF(swapped), &pcu, text+LENGTHOF(text), NULL, TRUE, &errorCode);
3124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    swappedLength=(int32_t)(pc-swapped);
3125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
3127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("TestEBCDICSwapLFNL error converting to %s - (%s)\n", name, u_errorName(errorCode));
3128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto cleanup;
3129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* compare EBCDIC output */
3132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(normalLength!=swappedLength) {
3133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("TestEBCDICSwapLFNL error converting to %s - output lengths %d vs. %d\n", name, normalLength, swappedLength);
3134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto cleanup;
3135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<normalLength; ++i) {
3137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* swap EBCDIC LF/NL for comparison */
3138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        c=normal[i];
3139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(swap) {
3140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(c==0x15) {
3141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                c=0x25;
3142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else if(c==0x25) {
3143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                c=0x15;
3144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
3145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(c!=swapped[i]) {
3148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("TestEBCDICSwapLFNL error converting to %s - did not swap properly, output[%d]=0x%02x\n", name, i, (uint8_t)swapped[i]);
3149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            goto cleanup;
3150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* convert back to Unicode (may not roundtrip) */
3154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pc=normal;
3155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pu=uNormal;
3156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_toUnicode(cnv, &pu, uNormal+LENGTHOF(uNormal), (const char **)&pc, normal+normalLength, NULL, TRUE, &errorCode);
3157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    normalLength=(int32_t)(pu-uNormal);
3158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pc=normal;
3160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pu=uSwapped;
3161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_toUnicode(swapCnv, &pu, uSwapped+LENGTHOF(uSwapped), (const char **)&pc, normal+swappedLength, NULL, TRUE, &errorCode);
3162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    swappedLength=(int32_t)(pu-uSwapped);
3163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
3165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("TestEBCDICSwapLFNL error converting from %s - (%s)\n", name, u_errorName(errorCode));
3166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto cleanup;
3167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* compare EBCDIC output */
3170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(normalLength!=swappedLength) {
3171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("TestEBCDICSwapLFNL error converting from %s - output lengths %d vs. %d\n", name, normalLength, swappedLength);
3172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto cleanup;
3173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<normalLength; ++i) {
3175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* swap EBCDIC LF/NL for comparison */
3176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u=uNormal[i];
3177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(swap) {
3178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(u==0xa) {
3179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                u=0x85;
3180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else if(u==0x85) {
3181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                u=0xa;
3182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
3183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(u!=uSwapped[i]) {
3186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("TestEBCDICSwapLFNL error converting from %s - did not swap properly, output[%d]=U+%04x\n", name, i, uSwapped[i]);
3187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            goto cleanup;
3188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* clean up */
3192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querucleanup:
3193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_close(cnv);
3194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_close(swapCnv);
3195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
3198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestEBCDICSwapLFNL() {
3199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const struct {
3200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *name;
3201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UBool swap;
3202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } tests[]={
3203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "ibm-37", TRUE },
3204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "ibm-1047", TRUE },
3205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "ibm-1140", TRUE },
3206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "ibm-930", TRUE },
3207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { "iso-8859-3", FALSE }
3208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
3209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int i;
3211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<LENGTHOF(tests); ++i) {
3213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        testSwap(tests[i].name, tests[i].swap);
3214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else
3217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
3218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestEBCDICSwapLFNL() {
3219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /* test nothing... */
3220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
3222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const UVersionInfo ICU_34 = {3,4,0,0};
3224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestFromUCountPending(){
3226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_LEGACY_CONVERSION
3227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
3228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*       const UChar expectedUnicode[] = { 0x20ac, 0x0005, 0x0006, 0x000b, 0xdbc4, 0xde34, 0xd84d, 0xdc56, 0xfffd}; */
3229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const struct {
3230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar input[6];
3231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t len;
3232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t exp;
3233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }fromUnicodeTests[] = {
3234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*m:n conversion*/
3235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{0xdbc4},1,1},
3236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{ 0xdbc4, 0xde34, 0xd84d},3,1},
3237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{ 0xdbc4, 0xde34, 0xd900},3,3},
3238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
3239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int i;
3240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UConverter* cnv = ucnv_openPackage(loadTestData(&status), "test3", &status);
3241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)){
3242c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        log_data_err("Could not create converter for test3. Error: %s\n", u_errorName(status));
3243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
3244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<LENGTHOF(fromUnicodeTests); ++i) {
3246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char tgt[10];
3247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char* target = tgt;
3248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char* targetLimit = target + 10;
3249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const UChar* source = fromUnicodeTests[i].input;
3250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const UChar* sourceLimit = source + fromUnicodeTests[i].len;
3251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t len = 0;
3252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_reset(cnv);
3253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_fromUnicode(cnv,&target, targetLimit, &source, sourceLimit, NULL, FALSE, &status);
3254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        len = ucnv_fromUCountPending(cnv, &status);
3255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status)){
3256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ucnv_fromUnicode call did not succeed. Error: %s\n", u_errorName(status));
3257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status = U_ZERO_ERROR;
3258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            continue;
3259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(len != fromUnicodeTests[i].exp){
3261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Did not get the expeced output for ucnv_fromUInputConsumed.\n");
3262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
3265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
3266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*
3267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * The converter has to read the tail before it knows that
3268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * only head alone matches.
3269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * At the end, the output for head will overflow the target,
3270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * middle will be pending, and tail will not have been consumed.
3271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         */
3272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*
3273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        \U00101234  -> x (<U101234>   \x07 |0)
3274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        \U00101234\U00050005 -> y (<U101234>+<U50005>          \x07+\x00+\x01\x02\x0e+\x05 |0)
3275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        \U00101234\U00050005\U00060006 -> z (<U101234>+<U50005>+<U60006> \x07+\x00+\x01\x02\x0f+\x09 |0)
3276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        \U00060007 -> unassigned
3277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        */
3278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static const UChar head[] = {0xDBC4,0xDE34,0xD900,0xDC05,0x0000};/* \U00101234\U00050005 */
3279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static const UChar middle[] = {0xD940,0x0000};     /* first half of \U00060006 or \U00060007 */
3280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static const UChar tail[] = {0xDC07,0x0000};/* second half of \U00060007 */
3281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char tgt[10];
3282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char* target = tgt;
3283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char* targetLimit = target + 2; /* expect overflow from converting \U00101234\U00050005 */
3284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const UChar* source = head;
3285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const UChar* sourceLimit = source + u_strlen(head);
3286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t len = 0;
3287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_reset(cnv);
3288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_fromUnicode(cnv,&target, targetLimit, &source, sourceLimit, NULL, FALSE, &status);
3289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        len = ucnv_fromUCountPending(cnv, &status);
3290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status)){
3291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ucnv_fromUnicode call did not succeed. Error: %s\n", u_errorName(status));
3292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status = U_ZERO_ERROR;
3293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(len!=4){
3295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ucnv_fromUInputHeld did not return correct length for head\n");
3296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        source = middle;
3298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        sourceLimit = source + u_strlen(middle);
3299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_fromUnicode(cnv,&target, targetLimit, &source, sourceLimit, NULL, FALSE, &status);
3300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        len = ucnv_fromUCountPending(cnv, &status);
3301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status)){
3302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ucnv_fromUnicode call did not succeed. Error: %s\n", u_errorName(status));
3303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status = U_ZERO_ERROR;
3304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(len!=5){
3306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ucnv_fromUInputHeld did not return correct length for middle\n");
3307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        source = tail;
3309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        sourceLimit = source + u_strlen(tail);
3310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_fromUnicode(cnv,&target, targetLimit, &source, sourceLimit, NULL, FALSE, &status);
3311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(status != U_BUFFER_OVERFLOW_ERROR){
3312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ucnv_fromUnicode call did not succeed. Error: %s\n", u_errorName(status));
3313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
3315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        len = ucnv_fromUCountPending(cnv, &status);
3316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* middle[1] is pending, tail has not been consumed */
3317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status)){
3318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ucnv_fromUInputHeld call did not succeed. Error: %s\n", u_errorName(status));
3319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(len!=1){
3321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ucnv_fromUInputHeld did not return correct length for tail\n");
3322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_close(cnv);
3325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
3326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
3329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestToUCountPending(){
3330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_LEGACY_CONVERSION
3331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
3332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const struct {
3333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char input[6];
3334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t len;
3335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t exp;
3336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }toUnicodeTests[] = {
3337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*m:n conversion*/
3338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{0x05, 0x01, 0x02},3,3},
3339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{0x01, 0x02},2,2},
3340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {{0x07,  0x00, 0x01, 0x02},4,4},
3341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
3342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int i;
3344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UConverterToUCallback *oldToUAction= NULL;
3345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UConverter* cnv = ucnv_openPackage(loadTestData(&status), "test3", &status);
3346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)){
3347c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        log_data_err("Could not create converter for test3. Error: %s\n", u_errorName(status));
3348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
3349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_setToUCallBack(cnv, UCNV_TO_U_CALLBACK_STOP, NULL, oldToUAction, NULL, &status);
3351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<LENGTHOF(toUnicodeTests); ++i) {
3352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar tgt[10];
3353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar* target = tgt;
3354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar* targetLimit = target + 20;
3355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* source = toUnicodeTests[i].input;
3356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* sourceLimit = source + toUnicodeTests[i].len;
3357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t len = 0;
3358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_reset(cnv);
3359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_toUnicode(cnv,&target, targetLimit, &source, sourceLimit, NULL, FALSE, &status);
3360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        len = ucnv_toUCountPending(cnv,&status);
3361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status)){
3362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ucnv_toUnicode call did not succeed. Error: %s\n", u_errorName(status));
3363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status = U_ZERO_ERROR;
3364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            continue;
3365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(len != toUnicodeTests[i].exp){
3367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Did not get the expeced output for ucnv_toUInputConsumed.\n");
3368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
3371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_close(cnv);
3372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
3374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*
3375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * The converter has to read the tail before it knows that
3376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * only head alone matches.
3377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * At the end, the output for head will overflow the target,
3378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * mid will be pending, and tail will not have been consumed.
3379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         */
3380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char head[] = { 0x01, 0x02, 0x03, 0x0a , 0x00};
3381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char mid[] = { 0x01, 0x02, 0x03, 0x0b, 0x00 };
3382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char tail[] = {  0x01, 0x02, 0x03, 0x0d, 0x00 };
3383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*
3384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x01, 0x02, 0x03, 0x0a  -> x (<U23456>    \x01\x02\x03\x0a |0)
3385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x01, 0x02, 0x03, 0x0b  -> y (<U000b>     \x01\x02\x03\x0b |0)
3386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x01, 0x02, 0x03, 0x0d  -> z (<U34567>    \x01\x02\x03\x0d |3)
3387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x01, 0x02, 0x03, 0x0a + 0x01, 0x02, 0x03, 0x0b + 0x01 + many more -> z (see test4 "many bytes, and bytes per UChar")
3388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        */
3389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar tgt[10];
3390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar* target = tgt;
3391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar* targetLimit = target + 1; /* expect overflow from converting */
3392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* source = head;
3393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* sourceLimit = source + strlen(head);
3394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t len = 0;
3395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cnv = ucnv_openPackage(loadTestData(&status), "test4", &status);
3396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status)){
3397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Could not create converter for test3. Error: %s\n", u_errorName(status));
3398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
3399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_setToUCallBack(cnv, UCNV_TO_U_CALLBACK_STOP, NULL, oldToUAction, NULL, &status);
3401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_toUnicode(cnv,&target, targetLimit, &source, sourceLimit, NULL, FALSE, &status);
3402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        len = ucnv_toUCountPending(cnv,&status);
3403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status)){
3404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ucnv_toUnicode call did not succeed. Error: %s\n", u_errorName(status));
3405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(len != 4){
3407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Did not get the expected len for head.\n");
3408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        source=mid;
3410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        sourceLimit = source+strlen(mid);
3411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_toUnicode(cnv,&target, targetLimit, &source, sourceLimit, NULL, FALSE, &status);
3412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        len = ucnv_toUCountPending(cnv,&status);
3413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status)){
3414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ucnv_toUnicode call did not succeed. Error: %s\n", u_errorName(status));
3415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(len != 8){
3417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Did not get the expected len for mid.\n");
3418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        source=tail;
3421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        sourceLimit = source+strlen(tail);
3422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        targetLimit = target;
3423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_toUnicode(cnv,&target, targetLimit, &source, sourceLimit, NULL, FALSE, &status);
3424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(status != U_BUFFER_OVERFLOW_ERROR){
3425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ucnv_toUnicode call did not succeed. Error: %s\n", u_errorName(status));
3426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
3428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        len = ucnv_toUCountPending(cnv,&status);
3429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* mid[4] is pending, tail has not been consumed */
3430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status)){
3431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ucnv_toUCountPending call did not succeed. Error: %s\n", u_errorName(status));
3432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(len != 4){
3434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Did not get the expected len for tail.\n");
3435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_close(cnv);
3437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
3439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3441b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void TestOneDefaultNameChange(const char *name, const char *expected) {
3442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
3443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UConverter *cnv;
3444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_setDefaultName(name);
3445b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if(strcmp(ucnv_getDefaultName(), expected)==0)
3446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("setDefaultName of %s works.\n", name);
3447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
3448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("setDefaultName of %s failed\n", name);
3449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cnv=ucnv_open(NULL, &status);
3450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) || cnv == NULL) {
3451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("opening the default converter of %s failed\n", name);
3452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
3453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3454b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if(strcmp(ucnv_getName(cnv, &status), expected)==0)
3455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("ucnv_getName of %s works.\n", name);
3456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
3457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucnv_getName of %s failed\n", name);
3458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_close(cnv);
3459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestDefaultName(void) {
3462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*Testing ucnv_getDefaultName() and ucnv_setDefaultNAme()*/
3463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static char defaultName[UCNV_MAX_CONVERTER_NAME_LENGTH + 1];
3464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strcpy(defaultName, ucnv_getDefaultName());
3465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("getDefaultName returned %s\n", defaultName);
3467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*change the default name by setting it */
3469b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    TestOneDefaultNameChange("UTF-8", "UTF-8");
3470b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#if U_CHARSET_IS_UTF8
3471b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    TestOneDefaultNameChange("ISCII,version=1", "UTF-8");
3472b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    TestOneDefaultNameChange("ISCII,version=2", "UTF-8");
3473b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    TestOneDefaultNameChange("ISO-8859-1", "UTF-8");
3474b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#else
3475b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru# if !UCONFIG_NO_LEGACY_CONVERSION
3476b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    TestOneDefaultNameChange("ISCII,version=1", "ISCII,version=1");
3477b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    TestOneDefaultNameChange("ISCII,version=2", "ISCII,version=2");
3478b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru# endif
3479b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    TestOneDefaultNameChange("ISO-8859-1", "ISO-8859-1");
3480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
3481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*set the default name back*/
3483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_setDefaultName(defaultName);
3484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Test that ucnv_compareNames() matches names according to spec. ----------- */
3487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic U_INLINE int
3489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querusign(int n) {
3490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(n==0) {
3491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 0;
3492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else if(n<0) {
3493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return -1;
3494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else /* n>0 */ {
3495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 1;
3496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
3500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerucompareNames(const char **names) {
3501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *relation, *name1, *name2;
3502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int rel, result;
3503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    relation=*names++;
3505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(*relation=='=') {
3506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        rel = 0;
3507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else if(*relation=='<') {
3508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        rel = -1;
3509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
3510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        rel = 1;
3511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    name1=*names++;
3514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(name1==NULL) {
3515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
3516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while((name2=*names++)!=NULL) {
3518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result=ucnv_compareNames(name1, name2);
3519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(sign(result)!=rel) {
3520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ucnv_compareNames(\"%s\", \"%s\")=%d, sign!=%d\n", name1, name2, result, rel);
3521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        name1=name2;
3523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
3527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestCompareNames() {
3528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char *equalUTF8[]={ "=", "UTF-8", "utf_8", "u*T@f08", "Utf 8", NULL };
3529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char *equalIBM[]={ "=", "ibm-37", "IBM037", "i-B-m  00037", "ibm-0037", "IBM00037", NULL };
3530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char *lessMac[]={ "<", "macos-0_1-10.2", "macos-1-10.0.2", "macos-1-10.2", NULL };
3531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char *lessUTF080[]={ "<", "UTF-0008", "utf$080", "u*T@f0800", "Utf 0000000009", NULL };
3532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    compareNames(equalUTF8);
3534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    compareNames(equalIBM);
3535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    compareNames(lessMac);
3536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    compareNames(lessUTF080);
3537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
3540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestSubstString() {
3541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar surrogate[1]={ 0xd900 };
3542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[16];
3543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar sub[5]={ 0x61, 0x62, 0x63, 0x64, 0x65 };
3545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char subChars[5]={ 0x61, 0x62, 0x63, 0x64, 0x65 };
3546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UConverter *cnv;
3547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode;
3548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t length;
3549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int8_t len8;
3550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* UTF-16/32: test that the BOM is output before the sub character */
3552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
3553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cnv=ucnv_open("UTF-16", &errorCode);
3554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
35556d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_data_err("ucnv_open(UTF-16) failed - %s\n", u_errorName(errorCode));
3556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
3557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=ucnv_fromUChars(cnv, buffer, (int32_t)sizeof(buffer), surrogate, 1, &errorCode);
3559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_close(cnv);
3560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode) ||
3561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        length!=4 ||
3562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        NULL == ucnv_detectUnicodeSignature(buffer, length, NULL, &errorCode)
3563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ) {
3564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucnv_fromUChars(UTF-16, U+D900) did not write a BOM\n");
3565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
3568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cnv=ucnv_open("UTF-32", &errorCode);
3569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
35706d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_data_err("ucnv_open(UTF-32) failed - %s\n", u_errorName(errorCode));
3571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
3572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=ucnv_fromUChars(cnv, buffer, (int32_t)sizeof(buffer), surrogate, 1, &errorCode);
3574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_close(cnv);
3575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode) ||
3576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        length!=8 ||
3577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        NULL == ucnv_detectUnicodeSignature(buffer, length, NULL, &errorCode)
3578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ) {
3579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucnv_fromUChars(UTF-32, U+D900) did not write a BOM\n");
3580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Simple API test of ucnv_setSubstString() + ucnv_getSubstChars(). */
3583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
3584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cnv=ucnv_open("ISO-8859-1", &errorCode);
3585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
35866d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_data_err("ucnv_open(ISO-8859-1) failed - %s\n", u_errorName(errorCode));
3587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
3588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_setSubstString(cnv, sub, LENGTHOF(sub), &errorCode);
3590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
3591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucnv_setSubstString(ISO-8859-1, sub[5]) failed - %s\n", u_errorName(errorCode));
3592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
3593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        len8 = sizeof(buffer);
3594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_getSubstChars(cnv, buffer, &len8, &errorCode);
3595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Stateless converter, we expect the string converted to charset bytes. */
3596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(errorCode) || len8!=sizeof(subChars) || 0!=uprv_memcmp(buffer, subChars, len8)) {
3597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ucnv_getSubstChars(ucnv_setSubstString(ISO-8859-1, sub[5])) failed - %s\n", u_errorName(errorCode));
3598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_close(cnv);
3601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_LEGACY_CONVERSION
3603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
3604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cnv=ucnv_open("HZ", &errorCode);
3605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
36066d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_data_err("ucnv_open(HZ) failed - %s\n", u_errorName(errorCode));
3607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
3608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_setSubstString(cnv, sub, LENGTHOF(sub), &errorCode);
3610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
3611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucnv_setSubstString(HZ, sub[5]) failed - %s\n", u_errorName(errorCode));
3612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
3613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        len8 = sizeof(buffer);
3614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_getSubstChars(cnv, buffer, &len8, &errorCode);
3615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Stateful converter, we expect that the Unicode string was set and that we get an empty char * string now. */
3616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(errorCode) || len8!=0) {
3617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ucnv_getSubstChars(ucnv_setSubstString(HZ, sub[5])) failed - %s\n", u_errorName(errorCode));
3618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
3619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_close(cnv);
3621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
3622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
3623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Further testing of ucnv_setSubstString() is done via intltest convert.
3624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * We do not test edge cases of illegal arguments and similar because the
3625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * function implementation uses all of its parameters in calls to other
3626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * functions with UErrorCode parameters.
3627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
3628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
3631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruInvalidArguments() {
3632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UConverter *cnv;
3633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode;
3634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char charBuffer[2] = {1, 1};
3635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char ucharAsCharBuffer[2] = {2, 2};
3636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char *charsPtr = charBuffer;
3637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar *ucharsPtr = (UChar *)ucharAsCharBuffer;
3638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar *ucharsBadPtr = (UChar *)(ucharAsCharBuffer + 1);
3639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
3641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cnv=ucnv_open("UTF-8", &errorCode);
3642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
3643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucnv_open() failed - %s\n", u_errorName(errorCode));
3644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
3645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
3648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* This one should fail because an incomplete UChar is being passed in */
3649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_fromUnicode(cnv, &charsPtr, charsPtr, (const UChar **)&ucharsPtr, ucharsBadPtr, NULL, TRUE, &errorCode);
3650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode != U_ILLEGAL_ARGUMENT_ERROR) {
3651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucnv_fromUnicode() failed to return U_ILLEGAL_ARGUMENT_ERROR for incomplete UChar * buffer - %s\n", u_errorName(errorCode));
3652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
3655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* This one should fail because ucharsBadPtr is > than ucharsPtr */
3656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_fromUnicode(cnv, &charsPtr, charsPtr, (const UChar **)&ucharsBadPtr, ucharsPtr, NULL, TRUE, &errorCode);
3657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode != U_ILLEGAL_ARGUMENT_ERROR) {
3658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucnv_fromUnicode() failed to return U_ILLEGAL_ARGUMENT_ERROR for bad limit pointer - %s\n", u_errorName(errorCode));
3659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
3662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* This one should fail because an incomplete UChar is being passed in */
3663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_toUnicode(cnv, &ucharsPtr, ucharsBadPtr, (const char **)&charsPtr, charsPtr, NULL, TRUE, &errorCode);
3664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode != U_ILLEGAL_ARGUMENT_ERROR) {
3665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucnv_toUnicode() failed to return U_ILLEGAL_ARGUMENT_ERROR for incomplete UChar * buffer - %s\n", u_errorName(errorCode));
3666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
3669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* This one should fail because ucharsBadPtr is > than ucharsPtr */
3670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_toUnicode(cnv, &ucharsBadPtr, ucharsPtr, (const char **)&charsPtr, charsPtr, NULL, TRUE, &errorCode);
3671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode != U_ILLEGAL_ARGUMENT_ERROR) {
3672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ucnv_toUnicode() failed to return U_ILLEGAL_ARGUMENT_ERROR for bad limit pointer - %s\n", u_errorName(errorCode));
3673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (charBuffer[0] != 1 || charBuffer[1] != 1
3676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        || ucharAsCharBuffer[0] != 2 || ucharAsCharBuffer[1] != 2)
3677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
3678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Data was incorrectly written to buffers\n");
3679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
3680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_close(cnv);
3682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3684b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void TestGetName() {
3685b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    static const char *const names[] = {
3686b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "Unicode",                  "UTF-16",
3687b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "UnicodeBigUnmarked",       "UTF-16BE",
3688b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "UnicodeBig",               "UTF-16BE,version=1",
3689b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "UnicodeLittleUnmarked",    "UTF-16LE",
3690b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "UnicodeLittle",            "UTF-16LE,version=1",
3691b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "x-UTF-16LE-BOM",           "UTF-16LE,version=1"
3692b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    };
3693b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int32_t i;
3694b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    for(i = 0; i < LENGTHOF(names); i += 2) {
3695b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UErrorCode errorCode = U_ZERO_ERROR;
3696b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UConverter *cnv = ucnv_open(names[i], &errorCode);
3697b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if(U_SUCCESS(errorCode)) {
3698b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            const char *name = ucnv_getName(cnv, &errorCode);
3699b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            if(U_FAILURE(errorCode) || 0 != strcmp(name, names[i+1])) {
3700b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                log_err("ucnv_getName(%s) = %s != %s -- %s\n",
3701b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                        names[i], name, names[i+1], u_errorName(errorCode));
3702b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            }
3703b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            ucnv_close(cnv);
3704b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
3705b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
3706b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
3707b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
3708b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void TestUTFBOM() {
3709b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    static const UChar a16[] = { 0x61 };
3710b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    static const char *const names[] = {
3711b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "UTF-16",
3712b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "UTF-16,version=1",
3713b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "UTF-16BE",
3714b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "UnicodeBig",
3715b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "UTF-16LE",
3716b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        "UnicodeLittle"
3717b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    };
3718b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    static const uint8_t expected[][5] = {
3719b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#if U_IS_BIG_ENDIAN
3720b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        { 4, 0xfe, 0xff, 0, 0x61 },
3721b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        { 4, 0xfe, 0xff, 0, 0x61 },
3722b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#else
3723b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        { 4, 0xff, 0xfe, 0x61, 0 },
3724b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        { 4, 0xff, 0xfe, 0x61, 0 },
3725b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#endif
3726b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
3727b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        { 2, 0, 0x61 },
3728b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        { 4, 0xfe, 0xff, 0, 0x61 },
3729b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
3730b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        { 2, 0x61, 0 },
3731b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        { 4, 0xff, 0xfe, 0x61, 0 }
3732b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    };
3733b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
3734b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    char bytes[10];
3735b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int32_t i;
3736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3737b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    for(i = 0; i < LENGTHOF(names); ++i) {
3738b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UErrorCode errorCode = U_ZERO_ERROR;
3739b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UConverter *cnv = ucnv_open(names[i], &errorCode);
37406d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        int32_t length = 0;
3741b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        const uint8_t *exp = expected[i];
37426d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        if (U_FAILURE(errorCode)) {
37436d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru           log_err_status(errorCode, "Unable to open converter: %s got error code: %s\n", names[i], u_errorName(errorCode));
37446d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru           continue;
37456d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        }
37466d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        length = ucnv_fromUChars(cnv, bytes, (int32_t)sizeof(bytes), a16, 1, &errorCode);
37476d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru
3748b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if(U_FAILURE(errorCode) || length != exp[0] || 0 != memcmp(bytes, exp+1, length)) {
3749b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            log_err("unexpected %s BOM writing behavior -- %s\n",
3750b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    names[i], u_errorName(errorCode));
3751b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
3752b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        ucnv_close(cnv);
3753b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
3754b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
3755