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 "��" (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