1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/******************************************************************** 2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * COPYRIGHT: 3b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Copyright (c) 2001-2011, International Business Machines Corporation and 4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * others. All Rights Reserved. 5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ********************************************************************/ 6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/******************************************************************************** 7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* File custrtrn.C 9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Modification History: 11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Name Description 12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Ram String transformations test 13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru********************************************************************************* 14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/****************************************************************************/ 16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdlib.h> 19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdio.h> 2050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include <string.h> 21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h" 22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h" 23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ures.h" 24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ustr_imp.h" 25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cintltst.h" 26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cmemory.h" 27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cstring.h" 28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cwchar.h" 29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0])) 31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid addUCharTransformTest(TestNode** root); 33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 34b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void Test_strToUTF32(void); 35b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void Test_strToUTF32_surrogates(void); 36b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void Test_strFromUTF32(void); 37b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void Test_strFromUTF32_surrogates(void); 38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void Test_UChar_UTF8_API(void); 39c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Querustatic void Test_FromUTF8(void); 40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void Test_FromUTF8Lenient(void); 41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void Test_UChar_WCHART_API(void); 42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void Test_widestrs(void); 43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void Test_WCHART_LongString(void); 4450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic void Test_strToJavaModifiedUTF8(void); 4550294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic void Test_strFromJavaModifiedUTF8(void); 4650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic void TestNullEmptySource(void); 47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruaddUCharTransformTest(TestNode** root) 50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 51b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru addTest(root, &Test_strToUTF32, "custrtrn/Test_strToUTF32"); 52b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru addTest(root, &Test_strToUTF32_surrogates, "custrtrn/Test_strToUTF32_surrogates"); 53b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru addTest(root, &Test_strFromUTF32, "custrtrn/Test_strFromUTF32"); 54b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru addTest(root, &Test_strFromUTF32_surrogates, "custrtrn/Test_strFromUTF32_surrogates"); 55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, &Test_UChar_UTF8_API, "custrtrn/Test_UChar_UTF8_API"); 56c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru addTest(root, &Test_FromUTF8, "custrtrn/Test_FromUTF8"); 57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, &Test_FromUTF8Lenient, "custrtrn/Test_FromUTF8Lenient"); 58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, &Test_UChar_WCHART_API, "custrtrn/Test_UChar_WCHART_API"); 59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, &Test_widestrs, "custrtrn/Test_widestrs"); 6027f654740f2a26ad62a5c155af9199af9e69b889claireho#if !UCONFIG_NO_FILE_IO && !UCONFIG_NO_LEGACY_CONVERSION 61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, &Test_WCHART_LongString, "custrtrn/Test_WCHART_LongString"); 6250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif 6350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho addTest(root, &Test_strToJavaModifiedUTF8, "custrtrn/Test_strToJavaModifiedUTF8"); 6450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho addTest(root, &Test_strFromJavaModifiedUTF8, "custrtrn/Test_strFromJavaModifiedUTF8"); 6550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho addTest(root, &TestNullEmptySource, "custrtrn/TestNullEmptySource"); 66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const UChar32 src32[]={ 69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x00A8, 0x3003, 0x3005, 0x2015, 0xFF5E, 0x2016, 0x2026, 0x2018, 0x000D, 0x000A, 70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x2019, 0x201C, 0x201D, 0x3014, 0x3015, 0x3008, 0x3009, 0x300A, 0x000D, 0x000A, 71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x300B, 0x300C, 0x300D, 0x300E, 0x300F, 0x3016, 0x3017, 0x3010, 0x000D, 0x000A, 72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x3011, 0x00B1, 0x00D7, 0x00F7, 0x2236, 0x2227, 0x7FC1, 0x8956, 0x000D, 0x000A, 73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x9D2C, 0x9D0E, 0x9EC4, 0x5CA1, 0x6C96, 0x837B, 0x5104, 0x5C4B, 0x000D, 0x000A, 74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x61B6, 0x81C6, 0x6876, 0x7261, 0x4E59, 0x4FFA, 0x5378, 0x57F7, 0x000D, 0x000A, 75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x57F4, 0x57F9, 0x57FA, 0x57FC, 0x5800, 0x5802, 0x5805, 0x5806, 0x000D, 0x000A, 76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x580A, 0x581E, 0x6BB5, 0x6BB7, 0x6BBA, 0x6BBC, 0x9CE2, 0x977C, 0x000D, 0x000A, 77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x6BBF, 0x6BC1, 0x6BC5, 0x6BC6, 0x6BCB, 0x6BCD, 0x6BCF, 0x6BD2, 0x000D, 0x000A, 78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x6BD3, 0x6BD4, 0x6BD6, 0x6BD7, 0x6BD8, 0x6BDB, 0x6BEB, 0x6BEC, 0x000D, 0x000A, 79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x6C05, 0x6C08, 0x6C0F, 0x6C11, 0x6C13, 0x6C23, 0x6C34, 0x0041, 0x000D, 0x000A, 80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x000D, 0x000A, 81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x000D, 0x000A, 82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x000D, 0x000A, 83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x005B, 0x9792, 0x9CCC, 0x9CCD, 0x9CCE, 0x9CCF, 0x9CD0, 0x9CD3, 0x000D, 0x000A, 84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x9CD4, 0x9CD5, 0x9CD7, 0x9CD8, 0x9CD9, 0x9CDC, 0x9CDD, 0x9CDF, 0x000D, 0x000A, 85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x9785, 0x9791, 0x00BD, 0x0390, 0x0385, 0x0386, 0x0388, 0x0389, 0x000D, 0x000A, 86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x038E, 0x038F, 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x000D, 0x000A, 87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x038A, 0x038C, 0x039C, 0x000D, 0x000A, 88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test non-BMP code points */ 89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0002A699, 90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0002A69C, 0x0002A69D, 0x0002A69E, 0x0002A69F, 0x0002A6A0, 0x0002A6A5, 0x0002A6A6, 0x0002A6A7, 0x0002A6A8, 0x0002A6AB, 91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0002A6AC, 0x0002A6AD, 0x0002A6AE, 0x0002A6AF, 0x0002A6B0, 0x0002A6B1, 0x0002A6B3, 0x0002A6B5, 0x0002A6B6, 0x0002A6B7, 92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0002A6B8, 0x0002A6B9, 0x0002A6BA, 0x0002A6BB, 0x0002A6BC, 0x0002A6BD, 0x0002A6BE, 0x0002A6BF, 0x0002A6C0, 0x0002A6C1, 93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0002A6C2, 0x0002A6C3, 0x0002A6C4, 0x0002A6C8, 0x0002A6CA, 0x0002A6CB, 0x0002A6CD, 0x0002A6CE, 0x0002A6CF, 0x0002A6D0, 94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0002A6D1, 0x0002A6D2, 0x0002A6D3, 0x0002A6D4, 0x0002A6D5, 95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x4DB3, 0x4DB4, 0x4DB5, 0x4E00, 0x4E00, 0x4E01, 0x4E02, 0x4E03, 0x000D, 0x000A, 97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x33E0, 0x33E6, 0x000D, 0x000A, 98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x4E05, 0x4E07, 0x4E04, 0x4E08, 0x4E08, 0x4E09, 0x4E0A, 0x4E0B, 0x000D, 0x000A, 99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x4E0C, 0x0021, 0x0022, 0x0023, 0x0024, 0xFF40, 0xFF41, 0xFF42, 0x000D, 0x000A, 100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0x000D, 0x000A,0x0000 101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const UChar src16[] = { 104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x00A8, 0x3003, 0x3005, 0x2015, 0xFF5E, 0x2016, 0x2026, 0x2018, 0x000D, 0x000A, 105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x2019, 0x201C, 0x201D, 0x3014, 0x3015, 0x3008, 0x3009, 0x300A, 0x000D, 0x000A, 106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x300B, 0x300C, 0x300D, 0x300E, 0x300F, 0x3016, 0x3017, 0x3010, 0x000D, 0x000A, 107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x3011, 0x00B1, 0x00D7, 0x00F7, 0x2236, 0x2227, 0x7FC1, 0x8956, 0x000D, 0x000A, 108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x9D2C, 0x9D0E, 0x9EC4, 0x5CA1, 0x6C96, 0x837B, 0x5104, 0x5C4B, 0x000D, 0x000A, 109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x61B6, 0x81C6, 0x6876, 0x7261, 0x4E59, 0x4FFA, 0x5378, 0x57F7, 0x000D, 0x000A, 110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x57F4, 0x57F9, 0x57FA, 0x57FC, 0x5800, 0x5802, 0x5805, 0x5806, 0x000D, 0x000A, 111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x580A, 0x581E, 0x6BB5, 0x6BB7, 0x6BBA, 0x6BBC, 0x9CE2, 0x977C, 0x000D, 0x000A, 112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x6BBF, 0x6BC1, 0x6BC5, 0x6BC6, 0x6BCB, 0x6BCD, 0x6BCF, 0x6BD2, 0x000D, 0x000A, 113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x6BD3, 0x6BD4, 0x6BD6, 0x6BD7, 0x6BD8, 0x6BDB, 0x6BEB, 0x6BEC, 0x000D, 0x000A, 114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x6C05, 0x6C08, 0x6C0F, 0x6C11, 0x6C13, 0x6C23, 0x6C34, 0x0041, 0x000D, 0x000A, 115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x000D, 0x000A, 116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x000D, 0x000A, 117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x000D, 0x000A, 118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x005B, 0x9792, 0x9CCC, 0x9CCD, 0x9CCE, 0x9CCF, 0x9CD0, 0x9CD3, 0x000D, 0x000A, 119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x9CD4, 0x9CD5, 0x9CD7, 0x9CD8, 0x9CD9, 0x9CDC, 0x9CDD, 0x9CDF, 0x000D, 0x000A, 120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x9785, 0x9791, 0x00BD, 0x0390, 0x0385, 0x0386, 0x0388, 0x0389, 0x000D, 0x000A, 121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x038E, 0x038F, 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x000D, 0x000A, 122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x038A, 0x038C, 0x039C, 0x000D, 0x000A, 123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test non-BMP code points */ 125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xD869, 0xDE99, 0xD869, 0xDE9C, 0xD869, 0xDE9D, 0xD869, 0xDE9E, 0xD869, 0xDE9F, 126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xD869, 0xDEA0, 0xD869, 0xDEA5, 0xD869, 0xDEA6, 0xD869, 0xDEA7, 0xD869, 0xDEA8, 127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xD869, 0xDEAB, 0xD869, 0xDEAC, 0xD869, 0xDEAD, 0xD869, 0xDEAE, 0xD869, 0xDEAF, 128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xD869, 0xDEB0, 0xD869, 0xDEB1, 0xD869, 0xDEB3, 0xD869, 0xDEB5, 0xD869, 0xDEB6, 129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xD869, 0xDEB7, 0xD869, 0xDEB8, 0xD869, 0xDEB9, 0xD869, 0xDEBA, 0xD869, 0xDEBB, 130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xD869, 0xDEBC, 0xD869, 0xDEBD, 0xD869, 0xDEBE, 0xD869, 0xDEBF, 0xD869, 0xDEC0, 131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xD869, 0xDEC1, 0xD869, 0xDEC2, 0xD869, 0xDEC3, 0xD869, 0xDEC4, 0xD869, 0xDEC8, 132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xD869, 0xDECA, 0xD869, 0xDECB, 0xD869, 0xDECD, 0xD869, 0xDECE, 0xD869, 0xDECF, 133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xD869, 0xDED0, 0xD869, 0xDED1, 0xD869, 0xDED2, 0xD869, 0xDED3, 0xD869, 0xDED4, 134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xD869, 0xDED5, 135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x4DB3, 0x4DB4, 0x4DB5, 0x4E00, 0x4E00, 0x4E01, 0x4E02, 0x4E03, 0x000D, 0x000A, 137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x33E0, 0x33E6, 0x000D, 0x000A, 138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x4E05, 0x4E07, 0x4E04, 0x4E08, 0x4E08, 0x4E09, 0x4E0A, 0x4E0B, 0x000D, 0x000A, 139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x4E0C, 0x0021, 0x0022, 0x0023, 0x0024, 0xFF40, 0xFF41, 0xFF42, 0x000D, 0x000A, 140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0x000D, 0x000A,0x0000 141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 144b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void Test_strToUTF32(void){ 145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode err = U_ZERO_ERROR; 146b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UChar32 u32Target[400]; 147b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t u32DestLen; 148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int i= 0; 149b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 150b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* first with length */ 151b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u32DestLen = -2; 152b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strToUTF32(u32Target, 0, &u32DestLen, src16, LENGTHOF(src16),&err); 153b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_BUFFER_OVERFLOW_ERROR || u32DestLen != LENGTHOF(src32)) { 154b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strToUTF32(preflight with length): " 155b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "length %ld != %ld and %s != U_BUFFER_OVERFLOW_ERROR\n", 156b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru (long)u32DestLen, (long)LENGTHOF(src32), u_errorName(err)); 157b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 158b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 159b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 160b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u32DestLen = -2; 161b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strToUTF32(u32Target, LENGTHOF(src32)+1, &u32DestLen, src16, LENGTHOF(src16),&err); 162b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_ZERO_ERROR || u32DestLen != LENGTHOF(src32)) { 163b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strToUTF32(with length): " 164b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "length %ld != %ld and %s != U_ZERO_ERROR\n", 165b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru (long)u32DestLen, (long)LENGTHOF(src32), u_errorName(err)); 166b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 167b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 168b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /*for(i=0; i< u32DestLen; i++){ 169b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru printf("0x%08X, ",uTarget[i]); 170b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(i%10==0){ 171b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru printf("\n"); 172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 173b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru }*/ 174b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru for(i=0; i< LENGTHOF(src32); i++){ 175b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(u32Target[i] != src32[i]){ 176b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_verbose("u_strToUTF32(with length) failed expected: %04X got: %04X at index: %i \n", src32[i], u32Target[i],i); 177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 178b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 179b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(u32Target[i] != 0){ 180b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_verbose("u_strToUTF32(with length) failed expected: %04X got: %04X at index: %i \n", 0, u32Target[i],i); 181b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 182b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 183b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* now NUL-terminated */ 184b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u32DestLen = -2; 185b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strToUTF32(NULL,0, &u32DestLen, src16, -1,&err); 186b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_BUFFER_OVERFLOW_ERROR || u32DestLen != LENGTHOF(src32)-1) { 187b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strToUTF32(preflight with NUL-termination): " 188b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "length %ld != %ld and %s != U_BUFFER_OVERFLOW_ERROR\n", 189b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru (long)u32DestLen, (long)LENGTHOF(src32)-1, u_errorName(err)); 190b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 191b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 192b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 193b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u32DestLen = -2; 194b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strToUTF32(u32Target, LENGTHOF(src32), &u32DestLen, src16, -1,&err); 195b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_ZERO_ERROR || u32DestLen != LENGTHOF(src32)-1) { 196b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strToUTF32(with NUL-termination): " 197b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "length %ld != %ld and %s != U_ZERO_ERROR\n", 198b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru (long)u32DestLen, (long)LENGTHOF(src32)-1, u_errorName(err)); 199b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 200b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 201b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 202b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru for(i=0; i< LENGTHOF(src32); i++){ 203b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(u32Target[i] != src32[i]){ 204b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_verbose("u_strToUTF32(NUL-termination) failed expected: %04X got: %04X \n", src32[i], u32Target[i]); 205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 206b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 207b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 209b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru/* test unpaired surrogates */ 210b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void Test_strToUTF32_surrogates() { 211b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UErrorCode err = U_ZERO_ERROR; 212b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UChar32 u32Target[400]; 213b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t len16, u32DestLen; 214b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t numSubstitutions; 215b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int i; 216b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 217b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru static const UChar surr16[] = { 0x41, 0xd900, 0x61, 0xdc00, 0x5a, 0xd900, 0xdc00, 0x7a, 0 }; 218b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru static const UChar32 expected[] = { 0x5a, 0x50000, 0x7a, 0 }; 219b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru static const UChar32 expected_FFFD[] = { 0x41, 0xfffd, 0x61, 0xfffd, 0x5a, 0x50000, 0x7a, 0 }; 220b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru static const UChar32 expected_12345[] = { 0x41, 0x12345, 0x61, 0x12345, 0x5a, 0x50000, 0x7a, 0 }; 221b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru len16 = LENGTHOF(surr16); 222b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru for(i = 0; i < 4; ++i) { 223b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 224b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strToUTF32(u32Target, 0, &u32DestLen, surr16+i, len16-i, &err); 225b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_INVALID_CHAR_FOUND) { 226b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strToUTF32(preflight surr16+%ld) sets %s != U_INVALID_CHAR_FOUND\n", 227b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru (long)i, u_errorName(err)); 228b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 229b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 231b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 232b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strToUTF32(u32Target, LENGTHOF(u32Target), &u32DestLen, surr16+i, len16-i, &err); 233b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_INVALID_CHAR_FOUND) { 234b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strToUTF32(surr16+%ld) sets %s != U_INVALID_CHAR_FOUND\n", 235b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru (long)i, u_errorName(err)); 236b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 238b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 239b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 240b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strToUTF32(NULL, 0, &u32DestLen, surr16+i, -1, &err); 241b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_INVALID_CHAR_FOUND) { 242b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strToUTF32(preflight surr16+%ld/NUL) sets %s != U_INVALID_CHAR_FOUND\n", 243b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru (long)i, u_errorName(err)); 244b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 246b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 247b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 248b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strToUTF32(u32Target, LENGTHOF(u32Target), &u32DestLen, surr16+i, -1, &err); 249b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_INVALID_CHAR_FOUND) { 250b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strToUTF32(surr16+%ld/NUL) sets %s != U_INVALID_CHAR_FOUND\n", 251b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru (long)i, u_errorName(err)); 252b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 254b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 256b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 257b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strToUTF32(u32Target, 0, &u32DestLen, surr16+4, len16-4-1, &err); 258b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_BUFFER_OVERFLOW_ERROR || u32DestLen != 3) { 259b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strToUTF32(preflight surr16+4) sets %s != U_BUFFER_OVERFLOW_ERROR or an unexpected length\n", 260b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_errorName(err)); 261b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 264b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 265b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strToUTF32(u32Target, LENGTHOF(u32Target), &u32DestLen, surr16+4, len16-4-1, &err); 266b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_ZERO_ERROR || u32DestLen != 3 || uprv_memcmp(u32Target, expected, 4*4)) { 267b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strToUTF32(surr16+4) sets %s != U_ZERO_ERROR or does not produce the expected string\n", 268b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_errorName(err)); 269b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 270b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 271b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 272b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 273b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strToUTF32(NULL, 0, &u32DestLen, surr16+4, -1, &err); 274b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_BUFFER_OVERFLOW_ERROR || u32DestLen != 3) { 275b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strToUTF32(preflight surr16+4/NUL) sets %s != U_BUFFER_OVERFLOW_ERROR or an unexpected length\n", 276b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_errorName(err)); 277b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 278b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 279b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 280b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 281b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strToUTF32(u32Target, LENGTHOF(u32Target), &u32DestLen, surr16+4, -1, &err); 282b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_ZERO_ERROR || u32DestLen != 3 || uprv_memcmp(u32Target, expected, 4*4)) { 283b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strToUTF32(surr16+4/NUL) sets %s != U_ZERO_ERROR or does not produce the expected string\n", 284b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_errorName(err)); 285b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 286b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 287b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 288b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* with substitution character */ 289b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru numSubstitutions = -1; 290b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 291b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strToUTF32WithSub(u32Target, 0, &u32DestLen, surr16, len16-1, 0xfffd, &numSubstitutions, &err); 292b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_BUFFER_OVERFLOW_ERROR || u32DestLen != 7 || numSubstitutions != 2) { 293b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strToUTF32WithSub(preflight surr16) sets %s != U_BUFFER_OVERFLOW_ERROR or an unexpected length\n", 294b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_errorName(err)); 295b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 296b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 297b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 298b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 299b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strToUTF32WithSub(u32Target, LENGTHOF(u32Target), &u32DestLen, surr16, len16-1, 0xfffd, &numSubstitutions, &err); 300b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_ZERO_ERROR || u32DestLen != 7 || numSubstitutions != 2 || uprv_memcmp(u32Target, expected_FFFD, 8*4)) { 301b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strToUTF32WithSub(surr16) sets %s != U_ZERO_ERROR or does not produce the expected string\n", 302b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_errorName(err)); 303b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 304b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 305b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 306b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 307b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strToUTF32WithSub(NULL, 0, &u32DestLen, surr16, -1, 0x12345, &numSubstitutions, &err); 308b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_BUFFER_OVERFLOW_ERROR || u32DestLen != 7 || numSubstitutions != 2) { 309b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strToUTF32WithSub(preflight surr16/NUL) sets %s != U_BUFFER_OVERFLOW_ERROR or an unexpected length\n", 310b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_errorName(err)); 311b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 312b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 313b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 314b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 315b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strToUTF32WithSub(u32Target, LENGTHOF(u32Target), &u32DestLen, surr16, -1, 0x12345, &numSubstitutions, &err); 316b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_ZERO_ERROR || u32DestLen != 7 || numSubstitutions != 2 || uprv_memcmp(u32Target, expected_12345, 8*4)) { 317b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strToUTF32WithSub(surr16/NUL) sets %s != U_ZERO_ERROR or does not produce the expected string\n", 318b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_errorName(err)); 319b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 320b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 321b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 322b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 323b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void Test_strFromUTF32(void){ 324b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UErrorCode err = U_ZERO_ERROR; 325b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UChar uTarget[400]; 326b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t uDestLen; 327b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int i= 0; 328b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 329b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* first with length */ 330b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru uDestLen = -2; 331b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strFromUTF32(uTarget,0,&uDestLen,src32,LENGTHOF(src32),&err); 332b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_BUFFER_OVERFLOW_ERROR || uDestLen != LENGTHOF(src16)) { 333b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strFromUTF32(preflight with length): " 334b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "length %ld != %ld and %s != U_BUFFER_OVERFLOW_ERROR\n", 335b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru (long)uDestLen, (long)LENGTHOF(src16), u_errorName(err)); 336b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 337b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 338b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 339b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru uDestLen = -2; 340b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strFromUTF32(uTarget, LENGTHOF(src16)+1,&uDestLen,src32,LENGTHOF(src32),&err); 341b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_ZERO_ERROR || uDestLen != LENGTHOF(src16)) { 342b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strFromUTF32(with length): " 343b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "length %ld != %ld and %s != U_ZERO_ERROR\n", 344b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru (long)uDestLen, (long)LENGTHOF(src16), u_errorName(err)); 345b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 346b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 347b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /*for(i=0; i< uDestLen; i++){ 348b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru printf("0x%04X, ",uTarget[i]); 349b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(i%10==0){ 350b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru printf("\n"); 351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 352b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru }*/ 353b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 354b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru for(i=0; i< uDestLen; i++){ 355b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(uTarget[i] != src16[i]){ 356b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_verbose("u_strFromUTF32(with length) failed expected: %04X got: %04X at index: %i \n", src16[i] ,uTarget[i],i); 357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 358b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 359b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(uTarget[i] != 0){ 360b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_verbose("u_strFromUTF32(with length) failed expected: %04X got: %04X at index: %i \n", 0,uTarget[i],i); 361b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 363b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* now NUL-terminated */ 364b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru uDestLen = -2; 365b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strFromUTF32(NULL,0,&uDestLen,src32,-1,&err); 366b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_BUFFER_OVERFLOW_ERROR || uDestLen != LENGTHOF(src16)-1) { 367b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strFromUTF32(preflight with NUL-termination): " 368b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "length %ld != %ld and %s != U_BUFFER_OVERFLOW_ERROR\n", 369b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru (long)uDestLen, (long)LENGTHOF(src16)-1, u_errorName(err)); 370b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 371b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 372b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 373b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru uDestLen = -2; 374b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strFromUTF32(uTarget, LENGTHOF(src16),&uDestLen,src32,-1,&err); 375b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_ZERO_ERROR || uDestLen != LENGTHOF(src16)-1) { 376b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strFromUTF32(with NUL-termination): " 377b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "length %ld != %ld and %s != U_ZERO_ERROR\n", 378b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru (long)uDestLen, (long)LENGTHOF(src16)-1, u_errorName(err)); 379b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 380b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 381b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 382b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru for(i=0; i< uDestLen; i++){ 383b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(uTarget[i] != src16[i]){ 384b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_verbose("u_strFromUTF32(with NUL-termination) failed expected: %04X got: %04X \n", src16[i] ,uTarget[i]); 385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 386b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 387b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 389b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru/* test surrogate code points */ 390b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void Test_strFromUTF32_surrogates() { 391b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UErrorCode err = U_ZERO_ERROR; 392b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UChar uTarget[400]; 393b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t len32, uDestLen; 394b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t numSubstitutions; 395b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int i; 396b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 397b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru static const UChar32 surr32[] = { 0x41, 0xd900, 0x61, 0xdc00, -1, 0x110000, 0x5a, 0x50000, 0x7a, 0 }; 398b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru static const UChar expected[] = { 0x5a, 0xd900, 0xdc00, 0x7a, 0 }; 399b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru static const UChar expected_FFFD[] = { 0x41, 0xfffd, 0x61, 0xfffd, 0xfffd, 0xfffd, 0x5a, 0xd900, 0xdc00, 0x7a, 0 }; 400b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru static const UChar expected_12345[] = { 0x41, 0xd808, 0xdf45, 0x61, 0xd808, 0xdf45, 0xd808, 0xdf45, 0xd808, 0xdf45, 401b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 0x5a, 0xd900, 0xdc00, 0x7a, 0 }; 402b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru len32 = LENGTHOF(surr32); 403b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru for(i = 0; i < 6; ++i) { 404b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 405b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strFromUTF32(uTarget, 0, &uDestLen, surr32+i, len32-i, &err); 406b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_INVALID_CHAR_FOUND) { 407b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strFromUTF32(preflight surr32+%ld) sets %s != U_INVALID_CHAR_FOUND\n", 408b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru (long)i, u_errorName(err)); 409b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 410b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 412b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 413b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strFromUTF32(uTarget, LENGTHOF(uTarget), &uDestLen, surr32+i, len32-i, &err); 414b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_INVALID_CHAR_FOUND) { 415b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strFromUTF32(surr32+%ld) sets %s != U_INVALID_CHAR_FOUND\n", 416b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru (long)i, u_errorName(err)); 417b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 419b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 420b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 421b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strFromUTF32(NULL, 0, &uDestLen, surr32+i, -1, &err); 422b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_INVALID_CHAR_FOUND) { 423b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strFromUTF32(preflight surr32+%ld/NUL) sets %s != U_INVALID_CHAR_FOUND\n", 424b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru (long)i, u_errorName(err)); 425b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 427b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 428b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 429b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strFromUTF32(uTarget, LENGTHOF(uTarget), &uDestLen, surr32+i, -1, &err); 430b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_INVALID_CHAR_FOUND) { 431b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strFromUTF32(surr32+%ld/NUL) sets %s != U_INVALID_CHAR_FOUND\n", 432b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru (long)i, u_errorName(err)); 433b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 435b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 437b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 438b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strFromUTF32(uTarget, 0, &uDestLen, surr32+6, len32-6-1, &err); 439b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_BUFFER_OVERFLOW_ERROR || uDestLen != 4) { 440b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strFromUTF32(preflight surr32+6) sets %s != U_BUFFER_OVERFLOW_ERROR or an unexpected length\n", 441b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_errorName(err)); 442b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 443b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 444b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 445b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 446b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strFromUTF32(uTarget, LENGTHOF(uTarget), &uDestLen, surr32+6, len32-6-1, &err); 447b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_ZERO_ERROR || uDestLen != 4 || u_memcmp(uTarget, expected, 5)) { 448b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strFromUTF32(surr32+6) sets %s != U_ZERO_ERROR or does not produce the expected string\n", 449b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_errorName(err)); 450b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 451b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 452b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 453b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 454b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strFromUTF32(NULL, 0, &uDestLen, surr32+6, -1, &err); 455b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_BUFFER_OVERFLOW_ERROR || uDestLen != 4) { 456b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strFromUTF32(preflight surr32+6/NUL) sets %s != U_BUFFER_OVERFLOW_ERROR or an unexpected length\n", 457b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_errorName(err)); 458b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 459b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 460b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 461b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 462b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strFromUTF32(uTarget, LENGTHOF(uTarget), &uDestLen, surr32+6, -1, &err); 463b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_ZERO_ERROR || uDestLen != 4 || u_memcmp(uTarget, expected, 5)) { 464b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strFromUTF32(surr32+6/NUL) sets %s != U_ZERO_ERROR or does not produce the expected string\n", 465b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_errorName(err)); 466b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 467b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 468b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 469b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* with substitution character */ 470b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru numSubstitutions = -1; 471b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 472b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strFromUTF32WithSub(uTarget, 0, &uDestLen, surr32, len32-1, 0xfffd, &numSubstitutions, &err); 473b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_BUFFER_OVERFLOW_ERROR || uDestLen != 10 || numSubstitutions != 4) { 474b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strFromUTF32WithSub(preflight surr32) sets %s != U_BUFFER_OVERFLOW_ERROR or an unexpected length\n", 475b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_errorName(err)); 476b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 479b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 480b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strFromUTF32WithSub(uTarget, LENGTHOF(uTarget), &uDestLen, surr32, len32-1, 0xfffd, &numSubstitutions, &err); 481b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_ZERO_ERROR || uDestLen != 10 || numSubstitutions != 4 || u_memcmp(uTarget, expected_FFFD, 11)) { 482b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strFromUTF32WithSub(surr32) sets %s != U_ZERO_ERROR or does not produce the expected string\n", 483b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_errorName(err)); 484b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 485b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 486b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 487b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 488b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strFromUTF32WithSub(NULL, 0, &uDestLen, surr32, -1, 0x12345, &numSubstitutions, &err); 489b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_BUFFER_OVERFLOW_ERROR || uDestLen != 14 || numSubstitutions != 4) { 490b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strFromUTF32WithSub(preflight surr32/NUL) sets %s != U_BUFFER_OVERFLOW_ERROR or an unexpected length\n", 491b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_errorName(err)); 492b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 493b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 494b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 495b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 496b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strFromUTF32WithSub(uTarget, LENGTHOF(uTarget), &uDestLen, surr32, -1, 0x12345, &numSubstitutions, &err); 497b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_ZERO_ERROR || uDestLen != 14 || numSubstitutions != 4 || u_memcmp(uTarget, expected_12345, 15)) { 498b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strFromUTF32WithSub(surr32/NUL) sets %s != U_ZERO_ERROR or does not produce the expected string\n", 499b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_errorName(err)); 500b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 501b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 502b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void Test_UChar_UTF8_API(void){ 505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode err = U_ZERO_ERROR; 507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar uTemp[1]; 508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char u8Temp[1]; 509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar* uTarget=uTemp; 510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* u8Src; 511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t u8SrcLen = 0; 512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t uTargetLength = 0; 513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t uDestLen=0; 514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar* uSrc = src16; 515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t uSrcLen = sizeof(src16)/2; 516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char* u8Target = u8Temp; 517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t u8TargetLength =0; 518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t u8DestLen =0; 519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool failed = FALSE; 520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int i= 0; 521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t numSubstitutions; 522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* preflight */ 525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u8Temp[0] = 0x12; 526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strToUTF8(u8Target,u8TargetLength, &u8DestLen, uSrc, uSrcLen,&err); 527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(err == U_BUFFER_OVERFLOW_ERROR && u8Temp[0] == 0x12){ 528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err = U_ZERO_ERROR; 529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u8Target = (char*) malloc (sizeof(uint8_t) * (u8DestLen+1)); 530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u8TargetLength = u8DestLen; 531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u8Target[u8TargetLength] = (char)0xfe; 533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u8DestLen = -1; 534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strToUTF8(u8Target,u8TargetLength, &u8DestLen, uSrc, uSrcLen,&err); 535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(err) || u8DestLen != u8TargetLength || u8Target[u8TargetLength] != (char)0xfe){ 536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strToUTF8 failed after preflight. Error: %s\n", u_errorName(err)); 537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Should have gotten U_BUFFER_OVERFLOW_ERROR"); 543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failed = FALSE; 545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*for(i=0; i< u8DestLen; i++){ 546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru printf("0x%04X, ",u8Target[i]); 547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(i%10==0){ 548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru printf("\n"); 549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }*/ 551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*for(i=0; i< u8DestLen; i++){ 552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(u8Target[i] != src8[i]){ 553b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_verbose("u_strToUTF8() failed expected: %04X got: %04X \n", src8[i], u8Target[i]); 554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failed =TRUE; 555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(failed){ 558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strToUTF8() failed \n"); 559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }*/ 560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u8Src = u8Target; 561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u8SrcLen = u8DestLen; 562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* preflight */ 564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uTemp[0] = 0x1234; 565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strFromUTF8(uTarget,uTargetLength,&uDestLen,u8Src,u8SrcLen,&err); 566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(err == U_BUFFER_OVERFLOW_ERROR && uTemp[0] == 0x1234){ 567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err = U_ZERO_ERROR; 568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uTarget = (UChar*) malloc( sizeof(UChar) * (uDestLen+1)); 569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uTargetLength = uDestLen; 570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uTarget[uTargetLength] = 0xfff0; 572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uDestLen = -1; 573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strFromUTF8(uTarget,uTargetLength,&uDestLen,u8Src,u8SrcLen,&err); 574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: u_strFromUTF8(preflight) should have gotten U_BUFFER_OVERFLOW_ERROR\n"); 577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*for(i=0; i< uDestLen; i++){ 579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru printf("0x%04X, ",uTarget[i]); 580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(i%10==0){ 581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru printf("\n"); 582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }*/ 584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(err) || uDestLen != uTargetLength || uTarget[uTargetLength] != 0xfff0) { 586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failed = TRUE; 587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i< uSrcLen; i++){ 589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(uTarget[i] != src16[i]){ 590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("u_strFromUTF8() failed expected: \\u%04X got: \\u%04X at index: %i \n", src16[i] ,uTarget[i],i); 591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failed =TRUE; 592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(failed){ 595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: u_strFromUTF8(after preflighting) failed\n"); 596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(u8Target); 599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(uTarget); 600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u8SrcLen = -1; 603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uTargetLength = 0; 604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uSrcLen =-1; 605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u8TargetLength=0; 606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failed = FALSE; 607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* preflight */ 608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strToUTF8(NULL,u8TargetLength, &u8DestLen, uSrc, uSrcLen,&err); 609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(err == U_BUFFER_OVERFLOW_ERROR){ 610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err = U_ZERO_ERROR; 611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u8Target = (char*) malloc (sizeof(uint8_t) * (u8DestLen+1)); 612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u8TargetLength = u8DestLen; 613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strToUTF8(u8Target,u8TargetLength, &u8DestLen, uSrc, uSrcLen,&err); 615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Should have gotten U_BUFFER_OVERFLOW_ERROR"); 619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failed = FALSE; 621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*for(i=0; i< u8DestLen; i++){ 622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru printf("0x%04X, ",u8Target[i]); 623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(i%10==0){ 624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru printf("\n"); 625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }*/ 627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*for(i=0; i< u8DestLen; i++){ 628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(u8Target[i] != src8[i]){ 629b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_verbose("u_strToUTF8() failed expected: %04X got: %04X \n", src8[i], u8Target[i]); 630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failed =TRUE; 631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(failed){ 634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strToUTF8() failed \n"); 635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }*/ 636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u8Src = u8Target; 637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u8SrcLen = u8DestLen; 638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* preflight */ 640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strFromUTF8(NULL,uTargetLength,&uDestLen,u8Src,u8SrcLen,&err); 641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(err == U_BUFFER_OVERFLOW_ERROR){ 642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err = U_ZERO_ERROR; 643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uTarget = (UChar*) malloc( sizeof(UChar) * (uDestLen+1)); 644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uTargetLength = uDestLen; 645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strFromUTF8(uTarget,uTargetLength,&uDestLen,u8Src,u8SrcLen,&err); 647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Should have gotten U_BUFFER_OVERFLOW_ERROR"); 650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*for(i=0; i< uDestLen; i++){ 652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru printf("0x%04X, ",uTarget[i]); 653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(i%10==0){ 654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru printf("\n"); 655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }*/ 657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i< uSrcLen; i++){ 659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(uTarget[i] != src16[i]){ 660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("u_strFromUTF8() failed expected: \\u%04X got: \\u%04X at index: %i \n", src16[i] ,uTarget[i],i); 661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failed =TRUE; 662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(failed){ 665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strToUTF8() failed \n"); 666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(u8Target); 669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(uTarget); 670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test UTF-8 with single surrogates - illegal in Unicode 3.2 */ 673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar 675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru withLead16[]={ 0x1800, 0xd89a, 0x0061 }, 676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru withTrail16[]={ 0x1800, 0xdcba, 0x0061, 0 }, 677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru withTrail16SubFFFD[]={ 0x1800, 0xfffd, 0x0061, 0 }, /* sub==U+FFFD */ 678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru withTrail16Sub50005[]={ 0x1800, 0xd900, 0xdc05, 0x0061, 0 }; /* sub==U+50005 */ 679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const uint8_t 680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru withLead8[]={ 0xe1, 0xa0, 0x80, 0xed, 0xa2, 0x9a, 0x61 }, 681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru withTrail8[]={ 0xe1, 0xa0, 0x80, 0xed, 0xb2, 0xba, 0x61, 0 }, 682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru withTrail8Sub1A[]={ 0xe1, 0xa0, 0x80, 0x1a, 0x61, 0 }, /* sub==U+001A */ 683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru withTrail8SubFFFD[]={ 0xe1, 0xa0, 0x80, 0xef, 0xbf, 0xbd, 0x61, 0 }; /* sub==U+FFFD */ 684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar out16[10]; 685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char out8[10]; 686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( 688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (err=U_ZERO_ERROR, u_strToUTF8(out8, LENGTHOF(out8), NULL, withLead16, LENGTHOF(withLead16), &err), err!=U_INVALID_CHAR_FOUND) || 689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (err=U_ZERO_ERROR, u_strToUTF8(out8, LENGTHOF(out8), NULL, withTrail16, -1, &err), err!=U_INVALID_CHAR_FOUND) || 690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (err=U_ZERO_ERROR, u_strFromUTF8(out16, LENGTHOF(out16), NULL, (const char *)withLead8, LENGTHOF(withLead8), &err), err!=U_INVALID_CHAR_FOUND) || 691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (err=U_ZERO_ERROR, u_strFromUTF8(out16, LENGTHOF(out16), NULL, (const char *)withTrail8, -1, &err), err!=U_INVALID_CHAR_FOUND) 692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: u_strTo/FromUTF8(string with single surrogate) fails to report error\n"); 694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test error handling with substitution characters */ 697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* from UTF-8 with length */ 699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err=U_ZERO_ERROR; 700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numSubstitutions=-1; 701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru out16[0]=0x55aa; 702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uDestLen=0; 703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strFromUTF8WithSub(out16, LENGTHOF(out16), &uDestLen, 704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (const char *)withTrail8, uprv_strlen((const char *)withTrail8), 705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x50005, &numSubstitutions, 706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &err); 707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(err) || uDestLen!=u_strlen(withTrail16Sub50005) || 708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0!=u_memcmp(withTrail16Sub50005, out16, uDestLen+1) || 709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numSubstitutions!=1) { 710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: u_strFromUTF8WithSub(length) failed\n"); 711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* from UTF-8 with NUL termination */ 714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err=U_ZERO_ERROR; 715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numSubstitutions=-1; 716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru out16[0]=0x55aa; 717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uDestLen=0; 718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strFromUTF8WithSub(out16, LENGTHOF(out16), &uDestLen, 719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (const char *)withTrail8, -1, 720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xfffd, &numSubstitutions, 721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &err); 722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(err) || uDestLen!=u_strlen(withTrail16SubFFFD) || 723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0!=u_memcmp(withTrail16SubFFFD, out16, uDestLen+1) || 724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numSubstitutions!=1) { 725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: u_strFromUTF8WithSub(NUL termination) failed\n"); 726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* preflight from UTF-8 with NUL termination */ 729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err=U_ZERO_ERROR; 730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numSubstitutions=-1; 731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru out16[0]=0x55aa; 732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uDestLen=0; 733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strFromUTF8WithSub(out16, 1, &uDestLen, 734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (const char *)withTrail8, -1, 735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x50005, &numSubstitutions, 736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &err); 737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(err!=U_BUFFER_OVERFLOW_ERROR || uDestLen!=u_strlen(withTrail16Sub50005) || numSubstitutions!=1) { 738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: u_strFromUTF8WithSub(preflight/NUL termination) failed\n"); 739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* to UTF-8 with length */ 742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err=U_ZERO_ERROR; 743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numSubstitutions=-1; 744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru out8[0]=(char)0xf5; 745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u8DestLen=0; 746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strToUTF8WithSub(out8, LENGTHOF(out8), &u8DestLen, 747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru withTrail16, u_strlen(withTrail16), 748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xfffd, &numSubstitutions, 749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &err); 750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(err) || u8DestLen!=uprv_strlen((const char *)withTrail8SubFFFD) || 751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0!=uprv_memcmp((const char *)withTrail8SubFFFD, out8, u8DestLen+1) || 752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numSubstitutions!=1) { 753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: u_strToUTF8WithSub(length) failed\n"); 754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* to UTF-8 with NUL termination */ 757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err=U_ZERO_ERROR; 758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numSubstitutions=-1; 759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru out8[0]=(char)0xf5; 760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u8DestLen=0; 761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strToUTF8WithSub(out8, LENGTHOF(out8), &u8DestLen, 762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru withTrail16, -1, 763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x1a, &numSubstitutions, 764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &err); 765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(err) || u8DestLen!=uprv_strlen((const char *)withTrail8Sub1A) || 766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0!=uprv_memcmp((const char *)withTrail8Sub1A, out8, u8DestLen+1) || 767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numSubstitutions!=1) { 768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: u_strToUTF8WithSub(NUL termination) failed\n"); 769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* preflight to UTF-8 with NUL termination */ 772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err=U_ZERO_ERROR; 773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numSubstitutions=-1; 774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru out8[0]=(char)0xf5; 775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u8DestLen=0; 776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strToUTF8WithSub(out8, 1, &u8DestLen, 777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru withTrail16, -1, 778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xfffd, &numSubstitutions, 779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &err); 780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(err!=U_BUFFER_OVERFLOW_ERROR || u8DestLen!=uprv_strlen((const char *)withTrail8SubFFFD) || 781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numSubstitutions!=1) { 782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: u_strToUTF8WithSub(preflight/NUL termination) failed\n"); 783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test that numSubstitutions==0 if there are no substitutions */ 786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* from UTF-8 with length (just first 3 bytes which are valid) */ 788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err=U_ZERO_ERROR; 789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numSubstitutions=-1; 790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru out16[0]=0x55aa; 791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uDestLen=0; 792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strFromUTF8WithSub(out16, LENGTHOF(out16), &uDestLen, 793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (const char *)withTrail8, 3, 794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x50005, &numSubstitutions, 795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &err); 796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(err) || uDestLen!=1 || 797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0!=u_memcmp(withTrail16Sub50005, out16, uDestLen) || 798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numSubstitutions!=0) { 799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: u_strFromUTF8WithSub(no subs) failed\n"); 800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* to UTF-8 with length (just first UChar which is valid) */ 803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err=U_ZERO_ERROR; 804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numSubstitutions=-1; 805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru out8[0]=(char)0xf5; 806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u8DestLen=0; 807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strToUTF8WithSub(out8, LENGTHOF(out8), &u8DestLen, 808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru withTrail16, 1, 809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xfffd, &numSubstitutions, 810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &err); 811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(err) || u8DestLen!=3 || 812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0!=uprv_memcmp((const char *)withTrail8SubFFFD, out8, u8DestLen) || 813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numSubstitutions!=0) { 814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: u_strToUTF8WithSub(no subs) failed\n"); 815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test that numSubstitutions==0 if subchar==U_SENTINEL (no subchar) */ 818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* from UTF-8 with length (just first 3 bytes which are valid) */ 820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err=U_ZERO_ERROR; 821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numSubstitutions=-1; 822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru out16[0]=0x55aa; 823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uDestLen=0; 824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strFromUTF8WithSub(out16, LENGTHOF(out16), &uDestLen, 825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (const char *)withTrail8, 3, 826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SENTINEL, &numSubstitutions, 827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &err); 828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(err) || uDestLen!=1 || 829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0!=u_memcmp(withTrail16Sub50005, out16, uDestLen) || 830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numSubstitutions!=0) { 831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: u_strFromUTF8WithSub(no subchar) failed\n"); 832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* to UTF-8 with length (just first UChar which is valid) */ 835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err=U_ZERO_ERROR; 836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numSubstitutions=-1; 837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru out8[0]=(char)0xf5; 838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u8DestLen=0; 839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strToUTF8WithSub(out8, LENGTHOF(out8), &u8DestLen, 840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru withTrail16, 1, 841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SENTINEL, &numSubstitutions, 842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &err); 843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(err) || u8DestLen!=3 || 844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0!=uprv_memcmp((const char *)withTrail8SubFFFD, out8, u8DestLen) || 845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numSubstitutions!=0) { 846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: u_strToUTF8WithSub(no subchar) failed\n"); 847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* compare if two strings are equal, but match 0xfffd in the second string with anything in the first */ 852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool 853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruequalAnyFFFD(const UChar *s, const UChar *t, int32_t length) { 854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar c1, c2; 855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while(length>0) { 857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c1=*s++; 858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c2=*t++; 859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(c1!=c2 && c2!=0xfffd) { 860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru --length; 863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* test u_strFromUTF8Lenient() */ 868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 869c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruTest_FromUTF8(void) { 870c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* 871c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * Test case from icu-support list 20071130 "u_strFromUTF8() returns U_INVALID_CHAR_FOUND(10)" 872c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru */ 873c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru static const uint8_t bytes[]={ 0xe0, 0xa5, 0x9c, 0 }; 874c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UChar dest[64]; 875c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UChar *destPointer; 876c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t destLength; 877c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UErrorCode errorCode; 878c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 879c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* 3 bytes input, one UChar output (U+095C) */ 880c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 881c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru destLength=-99; 882c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru destPointer=u_strFromUTF8(NULL, 0, &destLength, (const char *)bytes, 3, &errorCode); 883c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if(errorCode!=U_BUFFER_OVERFLOW_ERROR || destPointer!=NULL || destLength!=1) { 884c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru log_err("error: u_strFromUTF8(preflight srcLength=3) fails: destLength=%ld - %s\n", 885c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru (long)destLength, u_errorName(errorCode)); 886c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 887c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 888c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* 4 bytes input, two UChars output (U+095C U+0000) */ 889c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 890c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru destLength=-99; 891c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru destPointer=u_strFromUTF8(NULL, 0, &destLength, (const char *)bytes, 4, &errorCode); 892c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if(errorCode!=U_BUFFER_OVERFLOW_ERROR || destPointer!=NULL || destLength!=2) { 893c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru log_err("error: u_strFromUTF8(preflight srcLength=4) fails: destLength=%ld - %s\n", 894c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru (long)destLength, u_errorName(errorCode)); 895c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 896c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 897c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* NUL-terminated 3 bytes input, one UChar output (U+095C) */ 898c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 899c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru destLength=-99; 900c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru destPointer=u_strFromUTF8(NULL, 0, &destLength, (const char *)bytes, -1, &errorCode); 901c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if(errorCode!=U_BUFFER_OVERFLOW_ERROR || destPointer!=NULL || destLength!=1) { 902c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru log_err("error: u_strFromUTF8(preflight srcLength=-1) fails: destLength=%ld - %s\n", 903c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru (long)destLength, u_errorName(errorCode)); 904c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 905c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 906c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* 3 bytes input, one UChar output (U+095C), transform not just preflight */ 907c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 908c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru dest[0]=dest[1]=99; 909c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru destLength=-99; 910c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru destPointer=u_strFromUTF8(dest, LENGTHOF(dest), &destLength, (const char *)bytes, 3, &errorCode); 911c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if(U_FAILURE(errorCode) || destPointer!=dest || destLength!=1 || dest[0]!=0x95c || dest[1]!=0) { 912c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru log_err("error: u_strFromUTF8(transform srcLength=3) fails: destLength=%ld - %s\n", 913c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru (long)destLength, u_errorName(errorCode)); 914c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 915c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 916c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 917c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru/* test u_strFromUTF8Lenient() */ 918c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Querustatic void 919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTest_FromUTF8Lenient(void) { 920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Multiple input strings, each NUL-terminated. 922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Terminate with a string starting with 0xff. 923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const uint8_t bytes[]={ 925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* well-formed UTF-8 */ 926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x61, 0xc3, 0x9f, 0xe0, 0xa0, 0x80, 0xf0, 0xa0, 0x80, 0x80, 927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x62, 0xc3, 0xa0, 0xe0, 0xa0, 0x81, 0xf0, 0xa0, 0x80, 0x81, 0, 928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* various malformed sequences */ 930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xc3, 0xc3, 0x9f, 0xc3, 0xa0, 0xe0, 0x80, 0x8a, 0xf0, 0x41, 0x42, 0x43, 0, 931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* truncated input */ 933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xc3, 0, 934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xe0, 0, 935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xe0, 0xa0, 0, 936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xf0, 0, 937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xf0, 0x90, 0, 938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xf0, 0x90, 0x80, 0, 939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* non-ASCII characters in the last few bytes */ 941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x61, 0xc3, 0x9f, 0xe0, 0xa0, 0x80, 0, 942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x61, 0xe0, 0xa0, 0x80, 0xc3, 0x9f, 0, 943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* empty string */ 945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0, 946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* finish */ 948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xff, 0 949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Multiple output strings, each NUL-terminated. 0xfffd matches anything. */ 952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar uchars[]={ 953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x61, 0xdf, 0x800, 0xd840, 0xdc00, 954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x62, 0xe0, 0x801, 0xd840, 0xdc01, 0, 955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xfffd, 0x9f, 0xe0, 0xa, 0xfffd, 0xfffd, 0, 957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xfffd, 0, 959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xfffd, 0, 960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xfffd, 0, 961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xfffd, 0, 962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xfffd, 0, 963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xfffd, 0, 964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x61, 0xdf, 0x800, 0, 966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x61, 0x800, 0xdf, 0, 967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0, 969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0 971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar dest[64]; 974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *pb; 975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar *pu, *pDest; 976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t srcLength, destLength0, destLength; 977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int number; 978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode; 979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* verify checking for some illegal arguments */ 981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dest[0]=0x1234; 982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLength=-1; 983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pDest=u_strFromUTF8Lenient(dest, 1, &destLength, NULL, -1, &errorCode); 985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || dest[0]!=0x1234) { 986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strFromUTF8Lenient(src=NULL) failed\n"); 987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dest[0]=0x1234; 990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLength=-1; 991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pDest=u_strFromUTF8Lenient(NULL, 1, &destLength, (const char *)bytes, -1, &errorCode); 993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) { 994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strFromUTF8Lenient(dest=NULL[1]) failed\n"); 995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dest[0]=0x1234; 998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLength=-1; 999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_MEMORY_ALLOCATION_ERROR; 1000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pDest=u_strFromUTF8Lenient(dest, 1, &destLength, (const char *)bytes, -1, &errorCode); 1001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_MEMORY_ALLOCATION_ERROR || dest[0]!=0x1234) { 1002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strFromUTF8Lenient(U_MEMORY_ALLOCATION_ERROR) failed\n"); 1003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dest[0]=0x1234; 1006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLength=-1; 1007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_MEMORY_ALLOCATION_ERROR; 1008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pDest=u_strFromUTF8Lenient(dest, 1, &destLength, (const char *)bytes, -1, NULL); 1009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(dest[0]!=0x1234) { 1010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strFromUTF8Lenient(pErrorCode=NULL) failed\n"); 1011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test normal behavior */ 1014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru number=0; /* string number for log_err() */ 1015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(pb=(const char *)bytes, pu=uchars; 1017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *pb!=(char)0xff; 1018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pb+=srcLength+1, pu+=destLength0+1, ++number 1019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 1020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLength=uprv_strlen(pb); 1021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLength0=u_strlen(pu); 1022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* preflighting with NUL-termination */ 1024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dest[0]=0x1234; 1025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLength=-1; 1026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 1027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pDest=u_strFromUTF8Lenient(NULL, 0, &destLength, pb, -1, &errorCode); 1028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (errorCode!= (destLength0==0 ? U_STRING_NOT_TERMINATED_WARNING : U_BUFFER_OVERFLOW_ERROR) || 1029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pDest!=NULL || dest[0]!=0x1234 || destLength!=destLength0 1030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 1031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strFromUTF8Lenient(%d preflighting with NUL-termination) failed\n", number); 1032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* preflighting/some capacity with NUL-termination */ 1035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(srcLength>0) { 1036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dest[destLength0-1]=0x1234; 1037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLength=-1; 1038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 1039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pDest=u_strFromUTF8Lenient(dest, destLength0-1, &destLength, pb, -1, &errorCode); 1040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (errorCode!=U_BUFFER_OVERFLOW_ERROR || 1041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dest[destLength0-1]!=0x1234 || destLength!=destLength0 1042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 1043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strFromUTF8Lenient(%d preflighting/some capacity with NUL-termination) failed\n", number); 1044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* conversion with NUL-termination, much capacity */ 1048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dest[0]=dest[destLength0]=0x1234; 1049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLength=-1; 1050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 1051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pDest=u_strFromUTF8Lenient(dest, LENGTHOF(dest), &destLength, pb, -1, &errorCode); 1052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (errorCode!=U_ZERO_ERROR || 1053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pDest!=dest || dest[destLength0]!=0 || 1054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLength!=destLength0 || !equalAnyFFFD(dest, pu, destLength) 1055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 1056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strFromUTF8Lenient(%d conversion with NUL-termination, much capacity) failed\n", number); 1057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* conversion with NUL-termination, exact capacity */ 1060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dest[0]=dest[destLength0]=0x1234; 1061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLength=-1; 1062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 1063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pDest=u_strFromUTF8Lenient(dest, destLength0, &destLength, pb, -1, &errorCode); 1064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (errorCode!=U_STRING_NOT_TERMINATED_WARNING || 1065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pDest!=dest || dest[destLength0]!=0x1234 || 1066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLength!=destLength0 || !equalAnyFFFD(dest, pu, destLength) 1067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 1068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strFromUTF8Lenient(%d conversion with NUL-termination, exact capacity) failed\n", number); 1069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* preflighting with length */ 1072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dest[0]=0x1234; 1073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLength=-1; 1074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 1075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pDest=u_strFromUTF8Lenient(NULL, 0, &destLength, pb, srcLength, &errorCode); 1076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (errorCode!= (destLength0==0 ? U_STRING_NOT_TERMINATED_WARNING : U_BUFFER_OVERFLOW_ERROR) || 1077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pDest!=NULL || dest[0]!=0x1234 || destLength!=srcLength 1078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 1079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strFromUTF8Lenient(%d preflighting with length) failed\n", number); 1080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* preflighting/some capacity with length */ 1083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(srcLength>0) { 1084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dest[srcLength-1]=0x1234; 1085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLength=-1; 1086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 1087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pDest=u_strFromUTF8Lenient(dest, srcLength-1, &destLength, pb, srcLength, &errorCode); 1088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (errorCode!=U_BUFFER_OVERFLOW_ERROR || 1089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dest[srcLength-1]!=0x1234 || destLength!=srcLength 1090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 1091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strFromUTF8Lenient(%d preflighting/some capacity with length) failed\n", number); 1092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* conversion with length, much capacity */ 1096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dest[0]=dest[destLength0]=0x1234; 1097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLength=-1; 1098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 1099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pDest=u_strFromUTF8Lenient(dest, LENGTHOF(dest), &destLength, pb, srcLength, &errorCode); 1100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (errorCode!=U_ZERO_ERROR || 1101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pDest!=dest || dest[destLength0]!=0 || 1102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLength!=destLength0 || !equalAnyFFFD(dest, pu, destLength) 1103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 1104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strFromUTF8Lenient(%d conversion with length, much capacity) failed\n", number); 1105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* conversion with length, srcLength capacity */ 1108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dest[0]=dest[srcLength]=dest[destLength0]=0x1234; 1109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLength=-1; 1110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 1111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pDest=u_strFromUTF8Lenient(dest, srcLength, &destLength, pb, srcLength, &errorCode); 1112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(srcLength==destLength0) { 1113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (errorCode!=U_STRING_NOT_TERMINATED_WARNING || 1114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pDest!=dest || dest[destLength0]!=0x1234 || 1115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLength!=destLength0 || !equalAnyFFFD(dest, pu, destLength) 1116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 1117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strFromUTF8Lenient(%d conversion with length, srcLength capacity/not terminated) failed\n", number); 1118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (errorCode!=U_ZERO_ERROR || 1121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pDest!=dest || dest[destLength0]!=0 || 1122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLength!=destLength0 || !equalAnyFFFD(dest, pu, destLength) 1123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 1124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strFromUTF8Lenient(%d conversion with length, srcLength capacity/terminated) failed\n", number); 1125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const uint16_t src16j[] = { 1131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x000D, 0x000A, 1132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x000D, 0x000A, 1133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x000D, 0x000A, 1134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x000D, 0x000A, 1135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0000, 1136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Test only ASCII */ 1137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 1139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const uint16_t src16WithNulls[] = { 1140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0000, 1141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0048, 0x0049, 0x004A, 0x000D, 0x000A, 0x0000, 1142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0000, 1143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0050, 0x0051, 0x0052, 0x000D, 0x000A, 0x0000, 1144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0000, 1145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0058, 0x0059, 0x005A, 0x000D, 0x000A, 0x0000, 1146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0000, 1147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0058, 0x0059, 0x005A, 0x000D, 0x000A, 0x0000, 1148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test only ASCII */ 1149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 1150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 1151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x00AE, 0x00AF, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 1152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, 0x00C0, 0x00C1, 1153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 1154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x00CC, 0x00CD, 0x00CE, 0x00CF, 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 1155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, 1156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 1157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0054, 0x0000 */ 1158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 1160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void Test_UChar_WCHART_API(void){ 1161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if (defined(U_WCHAR_IS_UTF16) || defined(U_WCHAR_IS_UTF32)) || (!UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION) 1162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode err = U_ZERO_ERROR; 1163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar* uSrc = src16j; 1164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t uSrcLen = sizeof(src16j)/2; 1165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wchar_t* wDest = NULL; 1166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t wDestLen = 0; 1167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t reqLen= 0 ; 1168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool failed = FALSE; 1169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar* uDest = NULL; 1170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t uDestLen = 0; 1171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int i =0; 1172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Bad UErrorCode arguments. Make sure that the API doesn't crash, and that Purify doesn't complain. */ 1174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strFromWCS(NULL,0,NULL,NULL,0,NULL) != NULL) { 1175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strFromWCS() should return NULL with a bad argument\n"); 1176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strToWCS(NULL,0,NULL,NULL,0,NULL) != NULL) { 1178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strToWCS() should return NULL with a bad argument\n"); 1179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 118150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* NULL source & destination. */ 1182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err = U_ZERO_ERROR; 1183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strFromWCS(NULL,0,NULL,NULL,0,&err); 118450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (err != U_STRING_NOT_TERMINATED_WARNING) { 118550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strFromWCS(NULL, NULL) failed. Error: %s \n", u_errorName(err)); 1186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err = U_ZERO_ERROR; 1188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strToWCS(NULL,0,NULL,NULL,0,&err); 118950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (err != U_STRING_NOT_TERMINATED_WARNING) { 119050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strToWCS(NULL, NULL) failed. Error: %s \n", u_errorName(err)); 1191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err = U_ZERO_ERROR; 1193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* pre-flight*/ 1195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strToWCS(wDest,wDestLen,&reqLen,uSrc,uSrcLen-1,&err); 1196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(err == U_BUFFER_OVERFLOW_ERROR){ 1198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err=U_ZERO_ERROR; 1199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wDest =(wchar_t*) malloc(sizeof(wchar_t) * (reqLen+1)); 1200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wDestLen = reqLen+1; 1201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strToWCS(wDest,wDestLen,&reqLen,uSrc,uSrcLen-1,&err); 1202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* pre-flight */ 1205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strFromWCS(uDest, uDestLen,&reqLen,wDest,reqLen,&err); 1206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(err == U_BUFFER_OVERFLOW_ERROR){ 1209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err =U_ZERO_ERROR; 1210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uDest = (UChar*) malloc(sizeof(UChar) * (reqLen+1)); 1211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uDestLen = reqLen + 1; 1212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strFromWCS(uDest, uDestLen,&reqLen,wDest,reqLen,&err); 1213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }else if(U_FAILURE(err)){ 1214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strFromWCS() failed. Error: %s \n", u_errorName(err)); 1216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i< uSrcLen; i++){ 1220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(uDest[i] != src16j[i]){ 1221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("u_str*WCS() failed for unterminated string expected: \\u%04X got: \\u%04X at index: %i \n", src16j[i] ,uDest[i],i); 1222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failed =TRUE; 1223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(err)){ 1227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failed = TRUE; 1228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(failed){ 1230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strToWCS() failed \n"); 1231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(wDest); 1233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(uDest); 1234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test with embeded nulls */ 1237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uSrc = src16WithNulls; 1238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uSrcLen = sizeof(src16WithNulls)/2; 1239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wDestLen =0; 1240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uDestLen =0; 1241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wDest = NULL; 1242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uDest = NULL; 1243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* pre-flight*/ 1244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strToWCS(wDest,wDestLen,&reqLen,uSrc,uSrcLen-1,&err); 1245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(err == U_BUFFER_OVERFLOW_ERROR){ 1247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err=U_ZERO_ERROR; 1248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wDest =(wchar_t*) malloc(sizeof(wchar_t) * (reqLen+1)); 1249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wDestLen = reqLen+1; 1250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strToWCS(wDest,wDestLen,&reqLen,uSrc,uSrcLen-1,&err); 1251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* pre-flight */ 1254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strFromWCS(uDest, uDestLen,&reqLen,wDest,reqLen,&err); 1255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(err == U_BUFFER_OVERFLOW_ERROR){ 1257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err =U_ZERO_ERROR; 1258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uDest = (UChar*) malloc(sizeof(UChar) * (reqLen+1)); 1259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uDestLen = reqLen + 1; 1260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strFromWCS(uDest, uDestLen,&reqLen,wDest,reqLen,&err); 1261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1263b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(!U_FAILURE(err)) { 1264b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru for(i=0; i< uSrcLen; i++){ 1265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(uDest[i] != src16WithNulls[i]){ 1266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("u_str*WCS() failed for string with nulls expected: \\u%04X got: \\u%04X at index: %i \n", src16WithNulls[i] ,uDest[i],i); 1267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failed =TRUE; 1268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1269b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(err)){ 1273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failed = TRUE; 1274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(failed){ 1276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strToWCS() failed \n"); 1277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(wDest); 1279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(uDest); 1280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uSrc = src16j; 1286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uSrcLen = sizeof(src16j)/2; 1287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wDestLen =0; 1288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uDestLen =0; 1289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wDest = NULL; 1290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uDest = NULL; 1291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wDestLen = 0; 1292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* pre-flight*/ 1293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strToWCS(wDest,wDestLen,&reqLen,uSrc,-1,&err); 1294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(err == U_BUFFER_OVERFLOW_ERROR){ 1296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err=U_ZERO_ERROR; 1297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wDest =(wchar_t*) malloc(sizeof(wchar_t) * (reqLen+1)); 1298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wDestLen = reqLen+1; 1299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strToWCS(wDest,wDestLen,&reqLen,uSrc,-1,&err); 1300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uDestLen = 0; 1302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* pre-flight */ 1303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strFromWCS(uDest, uDestLen,&reqLen,wDest,-1,&err); 1304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(err == U_BUFFER_OVERFLOW_ERROR){ 1306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err =U_ZERO_ERROR; 1307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uDest = (UChar*) malloc(sizeof(UChar) * (reqLen+1)); 1308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uDestLen = reqLen + 1; 1309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strFromWCS(uDest, uDestLen,&reqLen,wDest,-1,&err); 1310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1313b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(!U_FAILURE(err)) { 1314b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru for(i=0; i< uSrcLen; i++){ 1315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(uDest[i] != src16j[i]){ 1316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("u_str*WCS() failed for null terminated string expected: \\u%04X got: \\u%04X at index: %i \n", src16j[i] ,uDest[i],i); 1317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failed =TRUE; 1318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1319b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(err)){ 1323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failed = TRUE; 1324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(failed){ 1326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strToWCS() failed \n"); 1327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(wDest); 1329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(uDest); 1330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 1333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test u_terminateWChars(). 1334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * All u_terminateXYZ() use the same implementation macro; 1335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * we test this function to improve API coverage. 1336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wchar_t buffer[10]; 1339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err=U_ZERO_ERROR; 1341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer[3]=0x20ac; 1342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wDestLen=u_terminateWChars(buffer, LENGTHOF(buffer), 3, &err); 1343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(err!=U_ZERO_ERROR || wDestLen!=3 || buffer[3]!=0) { 1344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_terminateWChars(buffer, all, 3, zero) failed: %s length %d [3]==U+%04x\n", 1345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_errorName(err), wDestLen, buffer[3]); 1346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err=U_ZERO_ERROR; 1349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer[3]=0x20ac; 1350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wDestLen=u_terminateWChars(buffer, 3, 3, &err); 1351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(err!=U_STRING_NOT_TERMINATED_WARNING || wDestLen!=3 || buffer[3]!=0x20ac) { 1352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_terminateWChars(buffer, 3, 3, zero) failed: %s length %d [3]==U+%04x\n", 1353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_errorName(err), wDestLen, buffer[3]); 1354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err=U_STRING_NOT_TERMINATED_WARNING; 1357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer[3]=0x20ac; 1358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wDestLen=u_terminateWChars(buffer, LENGTHOF(buffer), 3, &err); 1359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(err!=U_ZERO_ERROR || wDestLen!=3 || buffer[3]!=0) { 1360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_terminateWChars(buffer, all, 3, not-terminated) failed: %s length %d [3]==U+%04x\n", 1361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_errorName(err), wDestLen, buffer[3]); 1362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err=U_ZERO_ERROR; 1365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer[3]=0x20ac; 1366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wDestLen=u_terminateWChars(buffer, 2, 3, &err); 1367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(err!=U_BUFFER_OVERFLOW_ERROR || wDestLen!=3 || buffer[3]!=0x20ac) { 1368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_terminateWChars(buffer, 2, 3, zero) failed: %s length %d [3]==U+%04x\n", 1369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_errorName(err), wDestLen, buffer[3]); 1370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 1373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_info("Not testing u_str*WCS because (!UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION) and wchar is neither utf16 nor utf32"); 1374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 1375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void Test_widestrs() 1378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if (defined(U_WCHAR_IS_UTF16) || defined(U_WCHAR_IS_UTF32)) || (!UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION) 1380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wchar_t ws[100]; 1381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar rts[100]; 1382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t wcap = sizeof(ws) / sizeof(*ws); 1383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t wl; 1384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t rtcap = sizeof(rts) / sizeof(*rts); 1385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t rtl; 1386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wchar_t *wcs; 1387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar *cp; 1388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *errname; 1389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar ustr[] = {'h', 'e', 'l', 'l', 'o', 0}; 1390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t ul = sizeof(ustr)/sizeof(*ustr) -1; 1391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char astr[100]; 1392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode err; 1394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err = U_ZERO_ERROR; 1396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wcs = u_strToWCS(ws, wcap, &wl, ustr, ul, &err); 1397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(err)) { 1398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errname = u_errorName(err); 1399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("test_widestrs: u_strToWCS error: %s!\n",errname); 1400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(ul!=wl){ 1402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strToWCS: ustr = %s, ul = %d, ws = %S, wl = %d!\n", u_austrcpy(astr, ustr), ul, ws, wl); 1403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err = U_ZERO_ERROR; 1405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wl = (int32_t)uprv_wcslen(wcs); 1406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru cp = u_strFromWCS(rts, rtcap, &rtl, wcs, wl, &err); 1407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(err)) { 1408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errname = u_errorName(err); 1409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stderr, "test_widestrs: ucnv_wcstombs error: %s!\n",errname); 1410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(wl != rtl){ 1412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strFromWCS: wcs = %S, wl = %d,rts = %s, rtl = %d!\n", wcs, wl, u_austrcpy(astr, rts), rtl); 1413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 1415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_info("Not testing u_str*WCS because (!UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION) and wchar is neither utf16 nor utf32"); 1416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 1417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 1420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTest_WCHART_LongString(){ 1421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if (defined(U_WCHAR_IS_UTF16) || defined(U_WCHAR_IS_UTF32)) || (!UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION) 1422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* testdatapath=loadTestData(&status); 1424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UResourceBundle *theBundle = ures_open(testdatapath, "testtypes", &status); 1425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t strLen =0; 1426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar* str = ures_getStringByKey(theBundle, "testinclude",&strLen,&status); 1427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar* uSrc = str; 1428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t uSrcLen = strLen; 1429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t wDestLen =0, reqLen=0, i=0; 1430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t uDestLen =0; 1431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wchar_t* wDest = NULL; 1432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar* uDest = NULL; 1433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool failed = FALSE; 1434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1435b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_verbose("Loaded string of %d UChars\n", uSrcLen); 1436b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 1437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)){ 1438c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru log_data_err("Could not get testinclude resource from testtypes bundle. Error: %s\n",u_errorName(status)); 1439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* pre-flight*/ 1443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strToWCS(wDest,wDestLen,&reqLen,uSrc,-1,&status); 1444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(status == U_BUFFER_OVERFLOW_ERROR){ 1446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status=U_ZERO_ERROR; 1447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wDest =(wchar_t*) malloc(sizeof(wchar_t) * (reqLen+1)); 1448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wDestLen = reqLen+1; 1449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strToWCS(wDest,wDestLen,&reqLen,uSrc,-1,&status); 1450b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_verbose("To %d*%d-byte wchar_ts\n", reqLen,sizeof(wchar_t)); 1451b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 1452b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 1453b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { 1454b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int j; 1455b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho for(j=0;j>=0&&j<reqLen;j++) { 1456b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(wDest[j]!=uSrc[j]) { 1457b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_verbose("Diff %04X vs %04X @ %d\n", wDest[j],uSrc[j],j); 1458b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho break; 1459b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 1460b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 1461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1462b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 1463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uDestLen = 0; 1464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* pre-flight */ 1465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strFromWCS(uDest, uDestLen,&reqLen,wDest,-1,&status); 1466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(status == U_BUFFER_OVERFLOW_ERROR){ 1467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status =U_ZERO_ERROR; 1468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uDest = (UChar*) malloc(sizeof(UChar) * (reqLen+1)); 1469b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho u_memset(uDest,0xFFFF,reqLen+1); 1470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uDestLen = reqLen + 1; 1471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strFromWCS(uDest, uDestLen,&reqLen,wDest,-1,&status); 1472b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_verbose("Back to %d UChars\n", reqLen); 1473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1474b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#if defined(U_WCHAR_IS_UTF16) 1475b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_verbose("U_WCHAR_IS_UTF16\n"); 1476b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#elif defined(U_WCHAR_IS_UTF32) 1477b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_verbose("U_WCHAR_IS_UTF32\n"); 1478b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#else 1479b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_verbose("U_WCHAR_IS_idunno (not UTF)\n"); 1480b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#endif 1481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1482b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(reqLen!=uSrcLen) { 1483b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err("Error: dest len is %d but expected src len %d\n", reqLen, uSrcLen); 1484b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 1485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i< uSrcLen; i++){ 1487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(uDest[i] != str[i]){ 1488b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_verbose("u_str*WCS() failed for null terminated string expected: \\u%04X got: \\u%04X at index: %i \n", str[i], uDest[i],i); 1489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failed =TRUE; 1490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)){ 1494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failed = TRUE; 1495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(failed){ 1497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strToWCS() failed \n"); 1498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(wDest); 1500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(uDest); 1501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* close the bundle */ 1502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ures_close(theBundle); 1503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 1504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_info("Not testing u_str*WCS because (!UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION) and wchar is neither utf16 nor utf32"); 1505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 1506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 150850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic void Test_strToJavaModifiedUTF8() { 150950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho static const UChar src[]={ 151050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0x61, 0x62, 0x63, 0xe1, 0xe2, 0xe3, 151150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0xe01, 0xe02, 0xe03, 0xe001, 0xe002, 0xe003, 151250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0xd800, 0xdc00, 0xdc00, 0xd800, 0, 151350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0xdbff, 0xdfff, 151450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0xed, 0xe0e, 0x6f 151550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho }; 151650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho static const uint8_t expected[]={ 151750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0x61, 0x62, 0x63, 0xc3, 0xa1, 0xc3, 0xa2, 0xc3, 0xa3, 151850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0xe0, 0xb8, 0x81, 0xe0, 0xb8, 0x82, 0xe0, 0xb8, 0x83, 151950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0xee, 0x80, 0x81, 0xee, 0x80, 0x82, 0xee, 0x80, 0x83, 152050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0xed, 0xa0, 0x80, 0xed, 0xb0, 0x80, 0xed, 0xb0, 0x80, 0xed, 0xa0, 0x80, 0xc0, 0x80, 152150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0xed, 0xaf, 0xbf, 0xed, 0xbf, 0xbf, 152250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0xc3, 0xad, 0xe0, 0xb8, 0x8e, 0x6f 152350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho }; 152450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho static const UChar shortSrc[]={ 152550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0xe01, 0xe1, 0x61 152650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho }; 152750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho static const uint8_t shortExpected[]={ 152850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0xe0, 0xb8, 0x81, 0xc3, 0xa1, 0x61 152950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho }; 153050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho static const UChar asciiNul[]={ 153150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0x61, 0x62, 0x63, 0 153250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho }; 153350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho static const uint8_t asciiNulExpected[]={ 153450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0x61, 0x62, 0x63 153550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho }; 153650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho char dest[200]; 153750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho char *p; 153850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t length, expectedTerminatedLength; 153950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode errorCode; 154050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 154150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho expectedTerminatedLength=(int32_t)(strstr((const char *)expected, "\xc0\x80")- 154250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho (const char *)expected); 154350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 154450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 154550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=-5; 154650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho p=u_strToJavaModifiedUTF8(dest, (int32_t)sizeof(dest), &length, 154750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho src, LENGTHOF(src), &errorCode); 154850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if( U_FAILURE(errorCode) || p!=dest || 154950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length!=LENGTHOF(expected) || 0!=memcmp(dest, expected, length) || 155050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dest[length]!=0 155150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ) { 155250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strToJavaModifiedUTF8(normal) failed - %s\n", u_errorName(errorCode)); 155350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 155450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho memset(dest, 0xff, sizeof(dest)); 155550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 155650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=-5; 155750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho p=u_strToJavaModifiedUTF8(dest, (int32_t)sizeof(dest), NULL, 155850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho src, LENGTHOF(src), &errorCode); 155950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if( U_FAILURE(errorCode) || p!=dest || 156050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0!=memcmp(dest, expected, LENGTHOF(expected)) || 156150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dest[LENGTHOF(expected)]!=0 156250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ) { 156350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strToJavaModifiedUTF8(normal, pLength=NULL) failed - %s\n", u_errorName(errorCode)); 156450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 156550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho memset(dest, 0xff, sizeof(dest)); 156650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 156750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=-5; 156850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho p=u_strToJavaModifiedUTF8(dest, LENGTHOF(expected), &length, 156950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho src, LENGTHOF(src), &errorCode); 157050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if( errorCode!=U_STRING_NOT_TERMINATED_WARNING || p!=dest || 157150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length!=LENGTHOF(expected) || 0!=memcmp(dest, expected, length) || 157250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dest[length]!=(char)0xff 157350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ) { 157450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strToJavaModifiedUTF8(tight) failed - %s\n", u_errorName(errorCode)); 157550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 157650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho memset(dest, 0xff, sizeof(dest)); 157750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 157850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=-5; 157950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho p=u_strToJavaModifiedUTF8(dest, (int32_t)sizeof(dest), &length, src, -1, &errorCode); 158050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if( U_FAILURE(errorCode) || p!=dest || 158150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length!=expectedTerminatedLength || 0!=memcmp(dest, expected, length) || 158250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dest[length]!=0 158350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ) { 158450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strToJavaModifiedUTF8(NUL-terminated) failed - %s\n", u_errorName(errorCode)); 158550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 158650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho memset(dest, 0xff, sizeof(dest)); 158750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 158850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=-5; 158950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho p=u_strToJavaModifiedUTF8(dest, (int32_t)sizeof(dest), NULL, src, -1, &errorCode); 159050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if( U_FAILURE(errorCode) || p!=dest || 159150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0!=memcmp(dest, expected, expectedTerminatedLength) || 159250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dest[expectedTerminatedLength]!=0 159350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ) { 159450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strToJavaModifiedUTF8(NUL-terminated, pLength=NULL) failed - %s\n", u_errorName(errorCode)); 159550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 159650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho memset(dest, 0xff, sizeof(dest)); 159750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 159850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=-5; 159950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho p=u_strToJavaModifiedUTF8(dest, LENGTHOF(expected)/2, &length, 160050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho src, LENGTHOF(src), &errorCode); 160150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if( errorCode!=U_BUFFER_OVERFLOW_ERROR || 160250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length!=LENGTHOF(expected) || dest[LENGTHOF(expected)/2]!=(char)0xff 160350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ) { 160450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strToJavaModifiedUTF8(overflow) failed - %s\n", u_errorName(errorCode)); 160550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 160650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho memset(dest, 0xff, sizeof(dest)); 160750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 160850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=-5; 160950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho p=u_strToJavaModifiedUTF8(NULL, 0, &length, 161050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho src, LENGTHOF(src), &errorCode); 161150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if( errorCode!=U_BUFFER_OVERFLOW_ERROR || 161250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length!=LENGTHOF(expected) || dest[0]!=(char)0xff 161350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ) { 161450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strToJavaModifiedUTF8(pure preflighting) failed - %s\n", u_errorName(errorCode)); 161550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 161650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho memset(dest, 0xff, sizeof(dest)); 161750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 161850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=-5; 161950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho p=u_strToJavaModifiedUTF8(dest, (int32_t)sizeof(dest), &length, 162050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho shortSrc, LENGTHOF(shortSrc), &errorCode); 162150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if( U_FAILURE(errorCode) || p!=dest || 162250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length!=LENGTHOF(shortExpected) || 0!=memcmp(dest, shortExpected, length) || 162350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dest[length]!=0 162450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ) { 162550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strToJavaModifiedUTF8(short) failed - %s\n", u_errorName(errorCode)); 162650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 162750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho memset(dest, 0xff, sizeof(dest)); 162850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 162950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=-5; 163050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho p=u_strToJavaModifiedUTF8(dest, (int32_t)sizeof(dest), &length, 163150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho asciiNul, -1, &errorCode); 163250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if( U_FAILURE(errorCode) || p!=dest || 163350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length!=LENGTHOF(asciiNulExpected) || 0!=memcmp(dest, asciiNulExpected, length) || 163450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dest[length]!=0 163550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ) { 163650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strToJavaModifiedUTF8(asciiNul) failed - %s\n", u_errorName(errorCode)); 163750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 163850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho memset(dest, 0xff, sizeof(dest)); 163950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 164050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=-5; 164150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho p=u_strToJavaModifiedUTF8(dest, (int32_t)sizeof(dest), &length, 164250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho NULL, 0, &errorCode); 164350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if( U_FAILURE(errorCode) || p!=dest || 164450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length!=0 || dest[0]!=0 164550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ) { 164650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strToJavaModifiedUTF8(empty) failed - %s\n", u_errorName(errorCode)); 164750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 164850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 164950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* illegal arguments */ 165050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho memset(dest, 0xff, sizeof(dest)); 165150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 165250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=-5; 165350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho p=u_strToJavaModifiedUTF8(NULL, sizeof(dest), &length, 165450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho src, LENGTHOF(src), &errorCode); 165550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || dest[0]!=(char)0xff) { 165650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strToJavaModifiedUTF8(dest=NULL) failed - %s\n", u_errorName(errorCode)); 165750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 165850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho memset(dest, 0xff, sizeof(dest)); 165950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 166050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=-5; 166150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho p=u_strToJavaModifiedUTF8(dest, -1, &length, 166250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho src, LENGTHOF(src), &errorCode); 166350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || dest[0]!=(char)0xff) { 166450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strToJavaModifiedUTF8(destCapacity<0) failed - %s\n", u_errorName(errorCode)); 166550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 166650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho memset(dest, 0xff, sizeof(dest)); 166750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 166850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=-5; 166950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho p=u_strToJavaModifiedUTF8(dest, sizeof(dest), &length, 167050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho NULL, LENGTHOF(src), &errorCode); 167150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || dest[0]!=(char)0xff) { 167250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strToJavaModifiedUTF8(src=NULL) failed - %s\n", u_errorName(errorCode)); 167350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 167450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho memset(dest, 0xff, sizeof(dest)); 167550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 167650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=-5; 167750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho p=u_strToJavaModifiedUTF8(dest, sizeof(dest), &length, 167850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho NULL, -1, &errorCode); 167950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || dest[0]!=(char)0xff) { 168050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strToJavaModifiedUTF8(src=NULL, srcLength<0) failed - %s\n", u_errorName(errorCode)); 168150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 168250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 168350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 168450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic void Test_strFromJavaModifiedUTF8() { 168550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho static const uint8_t src[]={ 168650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0x61, 0x62, 0x63, 0xc3, 0xa1, 0xc3, 0xa2, 0xc3, 0xa3, 168750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0xe0, 0xb8, 0x81, 0xe0, 0xb8, 0x82, 0xe0, 0xb8, 0x83, 168850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0xee, 0x80, 0x81, 0xee, 0x80, 0x82, 0xee, 0x80, 0x83, 168950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0xed, 0xa0, 0x80, 0xed, 0xb0, 0x80, 0xed, 0xb0, 0x80, 0xed, 0xa0, 0x80, 0, 169050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0xed, 0xaf, 0xbf, 0xed, 0xbf, 0xbf, 169150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0x81, 0xc0, 0xe0, 0xb8, 0xf0, 0x90, 0x80, 0x80, /* invalid sequences */ 169250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 169350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0xe0, 0x81, 0xac, 0xe0, 0x83, 0xad, /* non-shortest forms are allowed */ 169450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0xe0, 0xb8, 0x8e, 0x6f 169550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho }; 169650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho static const UChar expected[]={ 169750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0x61, 0x62, 0x63, 0xe1, 0xe2, 0xe3, 169850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0xe01, 0xe02, 0xe03, 0xe001, 0xe002, 0xe003, 169950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0xd800, 0xdc00, 0xdc00, 0xd800, 0, 170050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0xdbff, 0xdfff, 170150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0xfffd, 0xfffd, 0xfffd, 0xfffd, 170250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 170350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0x6c, 0xed, 170450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0xe0e, 0x6f 170550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho }; 170650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho static const uint8_t shortSrc[]={ 170750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0xe0, 0xb8, 0x81, 0xc3, 0xa1, 0x61 170850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho }; 170950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho static const UChar shortExpected[]={ 171050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0xe01, 0xe1, 0x61 171150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho }; 171250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho static const uint8_t asciiNul[]={ 171350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0x61, 0x62, 0x63, 0 171450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho }; 171550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho static const UChar asciiNulExpected[]={ 171650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0x61, 0x62, 0x63 171750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho }; 171850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho static const uint8_t invalid[]={ 171950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0x81, 0xc0, 0xe0, 0xb8, 0xf0, 0x90, 0x80, 0x80 172050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho }; 172150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho static const UChar invalidExpectedFFFD[]={ 172250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0xfffd, 0xfffd, 0xfffd, 0xfffd 172350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho }; 172450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho static const UChar invalidExpected50000[]={ 172550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0xd900, 0xdc00, 0xd900, 0xdc00, 0xd900, 0xdc00, 0xd900, 0xdc00 172650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho }; 172750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar dest[200]; 172850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar *p; 172950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t length, expectedTerminatedLength; 173050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t numSubstitutions; 173150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode errorCode; 173250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 173350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho expectedTerminatedLength=(int32_t)(u_strchr(expected, 0)-expected); 173450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 173550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 173650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=numSubstitutions=-5; 173750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), &length, 173850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho (const char *)src, LENGTHOF(src), 173950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0xfffd, &numSubstitutions, &errorCode); 174050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if( U_FAILURE(errorCode) || p!=dest || 174150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length!=LENGTHOF(expected) || 0!=memcmp(dest, expected, length) || 174250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dest[length]!=0 || 174350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho numSubstitutions!=LENGTHOF(invalidExpectedFFFD) 174450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ) { 174550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strFromJavaModifiedUTF8WithSub(normal) failed - %s\n", u_errorName(errorCode)); 174650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 174750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho memset(dest, 0xff, sizeof(dest)); 174850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 174950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=numSubstitutions=-5; 175050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), NULL, 175150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho (const char *)src, LENGTHOF(src), 175250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0xfffd, &numSubstitutions, &errorCode); 175350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if( U_FAILURE(errorCode) || p!=dest || 175450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0!=memcmp(dest, expected, LENGTHOF(expected)) || 175550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dest[LENGTHOF(expected)]!=0 || 175650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho numSubstitutions!=LENGTHOF(invalidExpectedFFFD) 175750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ) { 175850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strFromJavaModifiedUTF8WithSub(normal, pLength=NULL) failed - %s\n", u_errorName(errorCode)); 175950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 176050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho memset(dest, 0xff, sizeof(dest)); 176150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 176250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=numSubstitutions=-5; 176350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), &length, 176450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho (const char *)src, LENGTHOF(src), 176550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0xfffd, NULL, &errorCode); 176650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if( U_FAILURE(errorCode) || p!=dest || 176750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length!=LENGTHOF(expected) || 0!=memcmp(dest, expected, length) || 176850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dest[length]!=0 176950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ) { 177050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strFromJavaModifiedUTF8WithSub(normal, pNumSubstitutions=NULL) failed - %s\n", u_errorName(errorCode)); 177150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 177250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho memset(dest, 0xff, sizeof(dest)); 177350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 177450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=numSubstitutions=-5; 177550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho p=u_strFromJavaModifiedUTF8WithSub(dest, LENGTHOF(expected), &length, 177650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho (const char *)src, LENGTHOF(src), 177750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0xfffd, &numSubstitutions, &errorCode); 177850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if( errorCode!=U_STRING_NOT_TERMINATED_WARNING || p!=dest || 177950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length!=LENGTHOF(expected) || 0!=memcmp(dest, expected, length) || 178050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dest[length]!=0xffff || 178150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho numSubstitutions!=LENGTHOF(invalidExpectedFFFD) 178250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ) { 178350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strFromJavaModifiedUTF8WithSub(tight) failed - %s\n", u_errorName(errorCode)); 178450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 178550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho memset(dest, 0xff, sizeof(dest)); 178650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 178750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=numSubstitutions=-5; 178850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), &length, 178950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho (const char *)src, -1, 179050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0xfffd, &numSubstitutions, &errorCode); 179150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if( U_FAILURE(errorCode) || p!=dest || 179250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length!=expectedTerminatedLength || 0!=memcmp(dest, expected, length) || 179350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dest[length]!=0 || 179450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho numSubstitutions!=0 179550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ) { 179650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strFromJavaModifiedUTF8WithSub(NUL-terminated) failed - %s\n", u_errorName(errorCode)); 179750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 179850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho memset(dest, 0xff, sizeof(dest)); 179950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 180050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=numSubstitutions=-5; 180150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), NULL, 180250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho (const char *)src, -1, 180350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0xfffd, &numSubstitutions, &errorCode); 180450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if( U_FAILURE(errorCode) || p!=dest || 180550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0!=memcmp(dest, expected, expectedTerminatedLength) || 180650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dest[expectedTerminatedLength]!=0 || 180750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho numSubstitutions!=0 180850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ) { 180950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strFromJavaModifiedUTF8WithSub(NUL-terminated, pLength=NULL) failed - %s\n", u_errorName(errorCode)); 181050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 181150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho memset(dest, 0xff, sizeof(dest)); 181250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 181350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=numSubstitutions=-5; 181450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), &length, 181550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho (const char *)src, -1, 181650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0xfffd, NULL, &errorCode); 181750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if( U_FAILURE(errorCode) || p!=dest || 181850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length!=expectedTerminatedLength || 0!=memcmp(dest, expected, length) || 181950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dest[length]!=0 182050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ) { 182150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strFromJavaModifiedUTF8WithSub(NUL-terminated, pNumSubstitutions=NULL) failed - %s\n", u_errorName(errorCode)); 182250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 182350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho memset(dest, 0xff, sizeof(dest)); 182450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 182550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=numSubstitutions=-5; 182650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho p=u_strFromJavaModifiedUTF8WithSub(dest, LENGTHOF(expected)/2, &length, 182750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho (const char *)src, LENGTHOF(src), 182850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0xfffd, &numSubstitutions, &errorCode); 182950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if( errorCode!=U_BUFFER_OVERFLOW_ERROR || 183050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length!=LENGTHOF(expected) || dest[LENGTHOF(expected)/2]!=0xffff 183150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ) { 183250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strFromJavaModifiedUTF8WithSub(overflow) failed - %s\n", u_errorName(errorCode)); 183350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 183450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho memset(dest, 0xff, sizeof(dest)); 183550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 183650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=numSubstitutions=-5; 183750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho p=u_strFromJavaModifiedUTF8WithSub(NULL, 0, &length, 183850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho (const char *)src, LENGTHOF(src), 183950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0xfffd, &numSubstitutions, &errorCode); 184050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if( errorCode!=U_BUFFER_OVERFLOW_ERROR || 184150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length!=LENGTHOF(expected) || dest[0]!=0xffff 184250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ) { 184350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strFromJavaModifiedUTF8WithSub(pure preflighting) failed - %s\n", u_errorName(errorCode)); 184450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 184550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho memset(dest, 0xff, sizeof(dest)); 184650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 184750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=numSubstitutions=-5; 184850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), &length, 184950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho (const char *)shortSrc, LENGTHOF(shortSrc), 185050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0xfffd, &numSubstitutions, &errorCode); 185150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if( U_FAILURE(errorCode) || p!=dest || 185250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length!=LENGTHOF(shortExpected) || 0!=memcmp(dest, shortExpected, length) || 185350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dest[length]!=0 || 185450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho numSubstitutions!=0 185550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ) { 185650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strFromJavaModifiedUTF8WithSub(short) failed - %s\n", u_errorName(errorCode)); 185750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 185850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho memset(dest, 0xff, sizeof(dest)); 185950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 186050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=numSubstitutions=-5; 186150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), &length, 186250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho (const char *)asciiNul, -1, 186350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0xfffd, &numSubstitutions, &errorCode); 186450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if( U_FAILURE(errorCode) || p!=dest || 186550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length!=LENGTHOF(asciiNulExpected) || 0!=memcmp(dest, asciiNulExpected, length) || 186650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dest[length]!=0 || 186750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho numSubstitutions!=0 186850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ) { 186950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strFromJavaModifiedUTF8WithSub(asciiNul) failed - %s\n", u_errorName(errorCode)); 187050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 187150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho memset(dest, 0xff, sizeof(dest)); 187250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 187350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=numSubstitutions=-5; 187450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), &length, 187550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho NULL, 0, 0xfffd, &numSubstitutions, &errorCode); 187650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if( U_FAILURE(errorCode) || p!=dest || 187750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length!=0 || dest[0]!=0 || 187850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho numSubstitutions!=0 187950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ) { 188050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strFromJavaModifiedUTF8WithSub(empty) failed - %s\n", u_errorName(errorCode)); 188150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 188250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho memset(dest, 0xff, sizeof(dest)); 188350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 188450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=numSubstitutions=-5; 188550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), &length, 188650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho (const char *)invalid, LENGTHOF(invalid), 188750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0xfffd, &numSubstitutions, &errorCode); 188850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if( U_FAILURE(errorCode) || p!=dest || 188950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length!=LENGTHOF(invalidExpectedFFFD) || 0!=memcmp(dest, invalidExpectedFFFD, length) || 189050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dest[length]!=0 || 189150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho numSubstitutions!=LENGTHOF(invalidExpectedFFFD) 189250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ) { 189350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strFromJavaModifiedUTF8WithSub(invalid->fffd) failed - %s\n", u_errorName(errorCode)); 189450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 189550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho memset(dest, 0xff, sizeof(dest)); 189650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 189750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=numSubstitutions=-5; 189850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), &length, 189950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho (const char *)invalid, LENGTHOF(invalid), 190050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0x50000, &numSubstitutions, &errorCode); 190150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if( U_FAILURE(errorCode) || p!=dest || 190250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length!=LENGTHOF(invalidExpected50000) || 0!=memcmp(dest, invalidExpected50000, length) || 190350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dest[length]!=0 || 190450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho numSubstitutions!=LENGTHOF(invalidExpectedFFFD) /* not ...50000 */ 190550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ) { 190650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strFromJavaModifiedUTF8WithSub(invalid->50000) failed - %s\n", u_errorName(errorCode)); 190750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 190850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho memset(dest, 0xff, sizeof(dest)); 190950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 191050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=numSubstitutions=-5; 191150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), &length, 191250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho (const char *)invalid, LENGTHOF(invalid), 191350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho U_SENTINEL, &numSubstitutions, &errorCode); 191450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(errorCode!=U_INVALID_CHAR_FOUND || dest[0]!=0xffff || numSubstitutions!=0) { 191550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strFromJavaModifiedUTF8WithSub(invalid->error) failed - %s\n", u_errorName(errorCode)); 191650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 191750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho memset(dest, 0xff, sizeof(dest)); 191850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 191950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=numSubstitutions=-5; 192050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), &length, 192150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho (const char *)src, LENGTHOF(src), 192250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho U_SENTINEL, &numSubstitutions, &errorCode); 192350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if( errorCode!=U_INVALID_CHAR_FOUND || 192450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length>=LENGTHOF(expected) || dest[LENGTHOF(expected)-1]!=0xffff || 192550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho numSubstitutions!=0 192650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ) { 192750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strFromJavaModifiedUTF8WithSub(normal->error) failed - %s\n", u_errorName(errorCode)); 192850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 192950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 193050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* illegal arguments */ 193150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho memset(dest, 0xff, sizeof(dest)); 193250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 193350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=numSubstitutions=-5; 193450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho p=u_strFromJavaModifiedUTF8WithSub(NULL, sizeof(dest), &length, 193550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho (const char *)src, LENGTHOF(src), 193650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0xfffd, &numSubstitutions, &errorCode); 193750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || dest[0]!=0xffff) { 193850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strFromJavaModifiedUTF8WithSub(dest=NULL) failed - %s\n", u_errorName(errorCode)); 193950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 194050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho memset(dest, 0xff, sizeof(dest)); 194150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 194250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=numSubstitutions=-5; 194350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho p=u_strFromJavaModifiedUTF8WithSub(dest, -1, &length, 194450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho (const char *)src, LENGTHOF(src), 194550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0xfffd, &numSubstitutions, &errorCode); 194650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || dest[0]!=0xffff) { 194750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strFromJavaModifiedUTF8WithSub(destCapacity<0) failed - %s\n", u_errorName(errorCode)); 194850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 194950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho memset(dest, 0xff, sizeof(dest)); 195050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 195150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=numSubstitutions=-5; 195250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho p=u_strFromJavaModifiedUTF8WithSub(dest, sizeof(dest), &length, 195350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho NULL, LENGTHOF(src), 195450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0xfffd, &numSubstitutions, &errorCode); 195550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || dest[0]!=0xffff) { 195650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strFromJavaModifiedUTF8WithSub(src=NULL) failed - %s\n", u_errorName(errorCode)); 195750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 195850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho memset(dest, 0xff, sizeof(dest)); 195950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 196050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=numSubstitutions=-5; 196150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho p=u_strFromJavaModifiedUTF8WithSub(dest, sizeof(dest), &length, 196250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho NULL, -1, 0xfffd, &numSubstitutions, &errorCode); 196350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || dest[0]!=0xffff) { 196450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strFromJavaModifiedUTF8WithSub(src=NULL, srcLength<0) failed - %s\n", u_errorName(errorCode)); 196550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 196650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho memset(dest, 0xff, sizeof(dest)); 196750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 196850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=numSubstitutions=-5; 196950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho p=u_strFromJavaModifiedUTF8WithSub(dest, sizeof(dest), &length, 197050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho (const char *)src, LENGTHOF(src), 197150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0x110000, &numSubstitutions, &errorCode); 197250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || dest[0]!=0xffff) { 197350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strFromJavaModifiedUTF8WithSub(subchar=U_SENTINEL) failed - %s\n", u_errorName(errorCode)); 197450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 197550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho memset(dest, 0xff, sizeof(dest)); 197650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 197750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=numSubstitutions=-5; 197850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho p=u_strFromJavaModifiedUTF8WithSub(dest, sizeof(dest), &length, 197950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho (const char *)src, LENGTHOF(src), 198050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0xdfff, &numSubstitutions, &errorCode); 198150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || dest[0]!=0xffff) { 198250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strFromJavaModifiedUTF8WithSub(subchar is surrogate) failed - %s\n", u_errorName(errorCode)); 198350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 198450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 198550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 198650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/* test that string transformation functions permit NULL source pointer when source length==0 */ 198750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic void TestNullEmptySource() { 198850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho char dest8[4]={ 3, 3, 3, 3 }; 198950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar dest16[4]={ 3, 3, 3, 3 }; 199050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar32 dest32[4]={ 3, 3, 3, 3 }; 199150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if (defined(U_WCHAR_IS_UTF16) || defined(U_WCHAR_IS_UTF32)) || (!UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION) 199250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho wchar_t destW[4]={ 3, 3, 3, 3 }; 199350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif 199450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 199550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t length; 199650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode errorCode; 199750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 199850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* u_strFromXyz() */ 199950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 200050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dest16[0]=3; 200150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=3; 200250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 200350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho u_strFromUTF8(dest16, LENGTHOF(dest16), &length, NULL, 0, &errorCode); 200450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(errorCode!=U_ZERO_ERROR || length!=0 || dest16[0]!=0 || dest16[1]!=3) { 200550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strFromUTF8(source=NULL, sourceLength=0) failed\n"); 200650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 200750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 200850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dest16[0]=3; 200950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=3; 201050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 201150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho u_strFromUTF8WithSub(dest16, LENGTHOF(dest16), &length, NULL, 0, 0xfffd, NULL, &errorCode); 201250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(errorCode!=U_ZERO_ERROR || length!=0 || dest16[0]!=0 || dest16[1]!=3) { 201350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strFromUTF8WithSub(source=NULL, sourceLength=0) failed\n"); 201450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 201550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 201650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dest16[0]=3; 201750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=3; 201850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 201950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho u_strFromUTF8Lenient(dest16, LENGTHOF(dest16), &length, NULL, 0, &errorCode); 202050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(errorCode!=U_ZERO_ERROR || length!=0 || dest16[0]!=0 || dest16[1]!=3) { 202150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strFromUTF8Lenient(source=NULL, sourceLength=0) failed\n"); 202250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 202350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 202450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dest16[0]=3; 202550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=3; 202650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 202750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho u_strFromUTF32(dest16, LENGTHOF(dest16), &length, NULL, 0, &errorCode); 202850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(errorCode!=U_ZERO_ERROR || length!=0 || dest16[0]!=0 || dest16[1]!=3) { 202950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strFromUTF32(source=NULL, sourceLength=0) failed\n"); 203050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 203150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 203250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dest16[0]=3; 203350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=3; 203450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 203550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho u_strFromUTF32WithSub(dest16, LENGTHOF(dest16), &length, NULL, 0, 0xfffd, NULL, &errorCode); 203650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(errorCode!=U_ZERO_ERROR || length!=0 || dest16[0]!=0 || dest16[1]!=3) { 203750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strFromUTF32WithSub(source=NULL, sourceLength=0) failed\n"); 203850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 203950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 204050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dest16[0]=3; 204150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=3; 204250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 204350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho u_strFromJavaModifiedUTF8WithSub(dest16, LENGTHOF(dest16), &length, NULL, 0, 0xfffd, NULL, &errorCode); 204450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(errorCode!=U_ZERO_ERROR || length!=0 || dest16[0]!=0 || dest16[1]!=3) { 204550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strFromJavaModifiedUTF8WithSub(source=NULL, sourceLength=0) failed\n"); 204650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 204750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 204850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* u_strToXyz() */ 204950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 205050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dest8[0]=3; 205150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=3; 205250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 205350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho u_strToUTF8(dest8, LENGTHOF(dest8), &length, NULL, 0, &errorCode); 205450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(errorCode!=U_ZERO_ERROR || length!=0 || dest8[0]!=0 || dest8[1]!=3) { 205550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strToUTF8(source=NULL, sourceLength=0) failed\n"); 205650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 205750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 205850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dest8[0]=3; 205950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=3; 206050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 206150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho u_strToUTF8WithSub(dest8, LENGTHOF(dest8), &length, NULL, 0, 0xfffd, NULL, &errorCode); 206250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(errorCode!=U_ZERO_ERROR || length!=0 || dest8[0]!=0 || dest8[1]!=3) { 206350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strToUTF8(source=NULL, sourceLength=0) failed\n"); 206450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 206550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 206650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dest32[0]=3; 206750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=3; 206850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 206950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho u_strToUTF32(dest32, LENGTHOF(dest32), &length, NULL, 0, &errorCode); 207050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(errorCode!=U_ZERO_ERROR || length!=0 || dest32[0]!=0 || dest32[1]!=3) { 207150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strToUTF32(source=NULL, sourceLength=0) failed\n"); 207250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 207350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 207450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dest32[0]=3; 207550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=3; 207650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 207750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho u_strToUTF32WithSub(dest32, LENGTHOF(dest32), &length, NULL, 0, 0xfffd, NULL, &errorCode); 207850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(errorCode!=U_ZERO_ERROR || length!=0 || dest32[0]!=0 || dest32[1]!=3) { 207950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strToUTF32WithSub(source=NULL, sourceLength=0) failed\n"); 208050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 208150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 208250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dest8[0]=3; 208350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=3; 208450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 208550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho u_strToJavaModifiedUTF8(dest8, LENGTHOF(dest8), &length, NULL, 0, &errorCode); 208650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(errorCode!=U_ZERO_ERROR || length!=0 || dest8[0]!=0 || dest8[1]!=3) { 208750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strToJavaModifiedUTF8(source=NULL, sourceLength=0) failed\n"); 208850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 208950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 209050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if (defined(U_WCHAR_IS_UTF16) || defined(U_WCHAR_IS_UTF32)) || (!UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION) 209150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 209250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dest16[0]=3; 209350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=3; 209450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 209550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho u_strFromWCS(dest16, LENGTHOF(dest16), &length, NULL, 0, &errorCode); 209650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(errorCode!=U_ZERO_ERROR || length!=0 || dest16[0]!=0 || dest16[1]!=3) { 209750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strFromWCS(source=NULL, sourceLength=0) failed\n"); 209850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 209950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 210050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho destW[0]=3; 210150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho length=3; 210250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errorCode=U_ZERO_ERROR; 210350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho u_strToWCS(destW, LENGTHOF(destW), &length, NULL, 0, &errorCode); 210450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(errorCode!=U_ZERO_ERROR || length!=0 || destW[0]!=0 || destW[1]!=3) { 210550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("u_strToWCS(source=NULL, sourceLength=0) failed\n"); 210650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 210750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 210850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif 210950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 2110