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