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