custrtrn.c revision b0ac937921a2c196d8b9da665135bf6ba01a1ccf
1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/******************************************************************** 2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * COPYRIGHT: 3b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * Copyright (c) 2001-2009, 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> 20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h" 21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h" 22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ures.h" 23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ustr_imp.h" 24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cintltst.h" 25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cmemory.h" 26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cstring.h" 27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cwchar.h" 28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0])) 30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid addUCharTransformTest(TestNode** root); 32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 33b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void Test_strToUTF32(void); 34b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void Test_strToUTF32_surrogates(void); 35b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void Test_strFromUTF32(void); 36b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void Test_strFromUTF32_surrogates(void); 37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void Test_UChar_UTF8_API(void); 38c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Querustatic void Test_FromUTF8(void); 39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void Test_FromUTF8Lenient(void); 40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void Test_UChar_WCHART_API(void); 41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void Test_widestrs(void); 42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void Test_WCHART_LongString(void); 43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruaddUCharTransformTest(TestNode** root) 46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 47b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru addTest(root, &Test_strToUTF32, "custrtrn/Test_strToUTF32"); 48b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru addTest(root, &Test_strToUTF32_surrogates, "custrtrn/Test_strToUTF32_surrogates"); 49b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru addTest(root, &Test_strFromUTF32, "custrtrn/Test_strFromUTF32"); 50b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru addTest(root, &Test_strFromUTF32_surrogates, "custrtrn/Test_strFromUTF32_surrogates"); 51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, &Test_UChar_UTF8_API, "custrtrn/Test_UChar_UTF8_API"); 52c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru addTest(root, &Test_FromUTF8, "custrtrn/Test_FromUTF8"); 53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, &Test_FromUTF8Lenient, "custrtrn/Test_FromUTF8Lenient"); 54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, &Test_UChar_WCHART_API, "custrtrn/Test_UChar_WCHART_API"); 55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, &Test_widestrs, "custrtrn/Test_widestrs"); 56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, &Test_WCHART_LongString, "custrtrn/Test_WCHART_LongString"); 57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const UChar32 src32[]={ 60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x00A8, 0x3003, 0x3005, 0x2015, 0xFF5E, 0x2016, 0x2026, 0x2018, 0x000D, 0x000A, 61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x2019, 0x201C, 0x201D, 0x3014, 0x3015, 0x3008, 0x3009, 0x300A, 0x000D, 0x000A, 62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x300B, 0x300C, 0x300D, 0x300E, 0x300F, 0x3016, 0x3017, 0x3010, 0x000D, 0x000A, 63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x3011, 0x00B1, 0x00D7, 0x00F7, 0x2236, 0x2227, 0x7FC1, 0x8956, 0x000D, 0x000A, 64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x9D2C, 0x9D0E, 0x9EC4, 0x5CA1, 0x6C96, 0x837B, 0x5104, 0x5C4B, 0x000D, 0x000A, 65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x61B6, 0x81C6, 0x6876, 0x7261, 0x4E59, 0x4FFA, 0x5378, 0x57F7, 0x000D, 0x000A, 66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x57F4, 0x57F9, 0x57FA, 0x57FC, 0x5800, 0x5802, 0x5805, 0x5806, 0x000D, 0x000A, 67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x580A, 0x581E, 0x6BB5, 0x6BB7, 0x6BBA, 0x6BBC, 0x9CE2, 0x977C, 0x000D, 0x000A, 68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x6BBF, 0x6BC1, 0x6BC5, 0x6BC6, 0x6BCB, 0x6BCD, 0x6BCF, 0x6BD2, 0x000D, 0x000A, 69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x6BD3, 0x6BD4, 0x6BD6, 0x6BD7, 0x6BD8, 0x6BDB, 0x6BEB, 0x6BEC, 0x000D, 0x000A, 70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x6C05, 0x6C08, 0x6C0F, 0x6C11, 0x6C13, 0x6C23, 0x6C34, 0x0041, 0x000D, 0x000A, 71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x000D, 0x000A, 72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x000D, 0x000A, 73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x000D, 0x000A, 74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x005B, 0x9792, 0x9CCC, 0x9CCD, 0x9CCE, 0x9CCF, 0x9CD0, 0x9CD3, 0x000D, 0x000A, 75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x9CD4, 0x9CD5, 0x9CD7, 0x9CD8, 0x9CD9, 0x9CDC, 0x9CDD, 0x9CDF, 0x000D, 0x000A, 76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x9785, 0x9791, 0x00BD, 0x0390, 0x0385, 0x0386, 0x0388, 0x0389, 0x000D, 0x000A, 77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x038E, 0x038F, 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x000D, 0x000A, 78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x038A, 0x038C, 0x039C, 0x000D, 0x000A, 79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test non-BMP code points */ 80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0002A699, 81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0002A69C, 0x0002A69D, 0x0002A69E, 0x0002A69F, 0x0002A6A0, 0x0002A6A5, 0x0002A6A6, 0x0002A6A7, 0x0002A6A8, 0x0002A6AB, 82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0002A6AC, 0x0002A6AD, 0x0002A6AE, 0x0002A6AF, 0x0002A6B0, 0x0002A6B1, 0x0002A6B3, 0x0002A6B5, 0x0002A6B6, 0x0002A6B7, 83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0002A6B8, 0x0002A6B9, 0x0002A6BA, 0x0002A6BB, 0x0002A6BC, 0x0002A6BD, 0x0002A6BE, 0x0002A6BF, 0x0002A6C0, 0x0002A6C1, 84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0002A6C2, 0x0002A6C3, 0x0002A6C4, 0x0002A6C8, 0x0002A6CA, 0x0002A6CB, 0x0002A6CD, 0x0002A6CE, 0x0002A6CF, 0x0002A6D0, 85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0002A6D1, 0x0002A6D2, 0x0002A6D3, 0x0002A6D4, 0x0002A6D5, 86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x4DB3, 0x4DB4, 0x4DB5, 0x4E00, 0x4E00, 0x4E01, 0x4E02, 0x4E03, 0x000D, 0x000A, 88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x33E0, 0x33E6, 0x000D, 0x000A, 89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x4E05, 0x4E07, 0x4E04, 0x4E08, 0x4E08, 0x4E09, 0x4E0A, 0x4E0B, 0x000D, 0x000A, 90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x4E0C, 0x0021, 0x0022, 0x0023, 0x0024, 0xFF40, 0xFF41, 0xFF42, 0x000D, 0x000A, 91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0x000D, 0x000A,0x0000 92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const UChar src16[] = { 95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x00A8, 0x3003, 0x3005, 0x2015, 0xFF5E, 0x2016, 0x2026, 0x2018, 0x000D, 0x000A, 96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x2019, 0x201C, 0x201D, 0x3014, 0x3015, 0x3008, 0x3009, 0x300A, 0x000D, 0x000A, 97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x300B, 0x300C, 0x300D, 0x300E, 0x300F, 0x3016, 0x3017, 0x3010, 0x000D, 0x000A, 98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x3011, 0x00B1, 0x00D7, 0x00F7, 0x2236, 0x2227, 0x7FC1, 0x8956, 0x000D, 0x000A, 99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x9D2C, 0x9D0E, 0x9EC4, 0x5CA1, 0x6C96, 0x837B, 0x5104, 0x5C4B, 0x000D, 0x000A, 100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x61B6, 0x81C6, 0x6876, 0x7261, 0x4E59, 0x4FFA, 0x5378, 0x57F7, 0x000D, 0x000A, 101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x57F4, 0x57F9, 0x57FA, 0x57FC, 0x5800, 0x5802, 0x5805, 0x5806, 0x000D, 0x000A, 102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x580A, 0x581E, 0x6BB5, 0x6BB7, 0x6BBA, 0x6BBC, 0x9CE2, 0x977C, 0x000D, 0x000A, 103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x6BBF, 0x6BC1, 0x6BC5, 0x6BC6, 0x6BCB, 0x6BCD, 0x6BCF, 0x6BD2, 0x000D, 0x000A, 104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x6BD3, 0x6BD4, 0x6BD6, 0x6BD7, 0x6BD8, 0x6BDB, 0x6BEB, 0x6BEC, 0x000D, 0x000A, 105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x6C05, 0x6C08, 0x6C0F, 0x6C11, 0x6C13, 0x6C23, 0x6C34, 0x0041, 0x000D, 0x000A, 106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x000D, 0x000A, 107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x000D, 0x000A, 108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x000D, 0x000A, 109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x005B, 0x9792, 0x9CCC, 0x9CCD, 0x9CCE, 0x9CCF, 0x9CD0, 0x9CD3, 0x000D, 0x000A, 110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x9CD4, 0x9CD5, 0x9CD7, 0x9CD8, 0x9CD9, 0x9CDC, 0x9CDD, 0x9CDF, 0x000D, 0x000A, 111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x9785, 0x9791, 0x00BD, 0x0390, 0x0385, 0x0386, 0x0388, 0x0389, 0x000D, 0x000A, 112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x038E, 0x038F, 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x000D, 0x000A, 113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x038A, 0x038C, 0x039C, 0x000D, 0x000A, 114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test non-BMP code points */ 116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xD869, 0xDE99, 0xD869, 0xDE9C, 0xD869, 0xDE9D, 0xD869, 0xDE9E, 0xD869, 0xDE9F, 117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xD869, 0xDEA0, 0xD869, 0xDEA5, 0xD869, 0xDEA6, 0xD869, 0xDEA7, 0xD869, 0xDEA8, 118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xD869, 0xDEAB, 0xD869, 0xDEAC, 0xD869, 0xDEAD, 0xD869, 0xDEAE, 0xD869, 0xDEAF, 119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xD869, 0xDEB0, 0xD869, 0xDEB1, 0xD869, 0xDEB3, 0xD869, 0xDEB5, 0xD869, 0xDEB6, 120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xD869, 0xDEB7, 0xD869, 0xDEB8, 0xD869, 0xDEB9, 0xD869, 0xDEBA, 0xD869, 0xDEBB, 121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xD869, 0xDEBC, 0xD869, 0xDEBD, 0xD869, 0xDEBE, 0xD869, 0xDEBF, 0xD869, 0xDEC0, 122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xD869, 0xDEC1, 0xD869, 0xDEC2, 0xD869, 0xDEC3, 0xD869, 0xDEC4, 0xD869, 0xDEC8, 123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xD869, 0xDECA, 0xD869, 0xDECB, 0xD869, 0xDECD, 0xD869, 0xDECE, 0xD869, 0xDECF, 124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xD869, 0xDED0, 0xD869, 0xDED1, 0xD869, 0xDED2, 0xD869, 0xDED3, 0xD869, 0xDED4, 125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xD869, 0xDED5, 126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x4DB3, 0x4DB4, 0x4DB5, 0x4E00, 0x4E00, 0x4E01, 0x4E02, 0x4E03, 0x000D, 0x000A, 128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x33E0, 0x33E6, 0x000D, 0x000A, 129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x4E05, 0x4E07, 0x4E04, 0x4E08, 0x4E08, 0x4E09, 0x4E0A, 0x4E0B, 0x000D, 0x000A, 130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x4E0C, 0x0021, 0x0022, 0x0023, 0x0024, 0xFF40, 0xFF41, 0xFF42, 0x000D, 0x000A, 131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0x000D, 0x000A,0x0000 132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 135b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void Test_strToUTF32(void){ 136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode err = U_ZERO_ERROR; 137b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UChar32 u32Target[400]; 138b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t u32DestLen; 139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int i= 0; 140b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 141b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* first with length */ 142b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u32DestLen = -2; 143b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strToUTF32(u32Target, 0, &u32DestLen, src16, LENGTHOF(src16),&err); 144b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_BUFFER_OVERFLOW_ERROR || u32DestLen != LENGTHOF(src32)) { 145b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strToUTF32(preflight with length): " 146b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "length %ld != %ld and %s != U_BUFFER_OVERFLOW_ERROR\n", 147b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru (long)u32DestLen, (long)LENGTHOF(src32), u_errorName(err)); 148b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 149b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 150b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 151b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u32DestLen = -2; 152b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strToUTF32(u32Target, LENGTHOF(src32)+1, &u32DestLen, src16, LENGTHOF(src16),&err); 153b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_ZERO_ERROR || u32DestLen != LENGTHOF(src32)) { 154b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strToUTF32(with length): " 155b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "length %ld != %ld and %s != U_ZERO_ERROR\n", 156b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru (long)u32DestLen, (long)LENGTHOF(src32), u_errorName(err)); 157b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 158b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 159b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /*for(i=0; i< u32DestLen; i++){ 160b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru printf("0x%08X, ",uTarget[i]); 161b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(i%10==0){ 162b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru printf("\n"); 163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 164b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru }*/ 165b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru for(i=0; i< LENGTHOF(src32); i++){ 166b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(u32Target[i] != src32[i]){ 167b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_verbose("u_strToUTF32(with length) failed expected: %04X got: %04X at index: %i \n", src32[i], u32Target[i],i); 168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 169b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 170b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(u32Target[i] != 0){ 171b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_verbose("u_strToUTF32(with length) failed expected: %04X got: %04X at index: %i \n", 0, u32Target[i],i); 172b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 173b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 174b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* now NUL-terminated */ 175b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u32DestLen = -2; 176b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strToUTF32(NULL,0, &u32DestLen, src16, -1,&err); 177b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_BUFFER_OVERFLOW_ERROR || u32DestLen != LENGTHOF(src32)-1) { 178b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strToUTF32(preflight with NUL-termination): " 179b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "length %ld != %ld and %s != U_BUFFER_OVERFLOW_ERROR\n", 180b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru (long)u32DestLen, (long)LENGTHOF(src32)-1, u_errorName(err)); 181b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 182b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 183b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 184b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u32DestLen = -2; 185b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strToUTF32(u32Target, LENGTHOF(src32), &u32DestLen, src16, -1,&err); 186b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_ZERO_ERROR || u32DestLen != LENGTHOF(src32)-1) { 187b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strToUTF32(with NUL-termination): " 188b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "length %ld != %ld and %s != U_ZERO_ERROR\n", 189b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru (long)u32DestLen, (long)LENGTHOF(src32)-1, u_errorName(err)); 190b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 191b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 192b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 193b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru for(i=0; i< LENGTHOF(src32); i++){ 194b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(u32Target[i] != src32[i]){ 195b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_verbose("u_strToUTF32(NUL-termination) failed expected: %04X got: %04X \n", src32[i], u32Target[i]); 196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 197b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 198b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 200b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru/* test unpaired surrogates */ 201b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void Test_strToUTF32_surrogates() { 202b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UErrorCode err = U_ZERO_ERROR; 203b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UChar32 u32Target[400]; 204b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t len16, u32DestLen; 205b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t numSubstitutions; 206b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int i; 207b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 208b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru static const UChar surr16[] = { 0x41, 0xd900, 0x61, 0xdc00, 0x5a, 0xd900, 0xdc00, 0x7a, 0 }; 209b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru static const UChar32 expected[] = { 0x5a, 0x50000, 0x7a, 0 }; 210b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru static const UChar32 expected_FFFD[] = { 0x41, 0xfffd, 0x61, 0xfffd, 0x5a, 0x50000, 0x7a, 0 }; 211b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru static const UChar32 expected_12345[] = { 0x41, 0x12345, 0x61, 0x12345, 0x5a, 0x50000, 0x7a, 0 }; 212b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru len16 = LENGTHOF(surr16); 213b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru for(i = 0; i < 4; ++i) { 214b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 215b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strToUTF32(u32Target, 0, &u32DestLen, surr16+i, len16-i, &err); 216b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_INVALID_CHAR_FOUND) { 217b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strToUTF32(preflight surr16+%ld) sets %s != U_INVALID_CHAR_FOUND\n", 218b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru (long)i, u_errorName(err)); 219b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 220b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 222b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 223b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strToUTF32(u32Target, LENGTHOF(u32Target), &u32DestLen, surr16+i, len16-i, &err); 224b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_INVALID_CHAR_FOUND) { 225b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strToUTF32(surr16+%ld) sets %s != U_INVALID_CHAR_FOUND\n", 226b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru (long)i, u_errorName(err)); 227b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 229b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 230b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 231b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strToUTF32(NULL, 0, &u32DestLen, surr16+i, -1, &err); 232b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_INVALID_CHAR_FOUND) { 233b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strToUTF32(preflight surr16+%ld/NUL) sets %s != U_INVALID_CHAR_FOUND\n", 234b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru (long)i, u_errorName(err)); 235b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 237b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 238b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 239b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strToUTF32(u32Target, LENGTHOF(u32Target), &u32DestLen, surr16+i, -1, &err); 240b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_INVALID_CHAR_FOUND) { 241b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strToUTF32(surr16+%ld/NUL) sets %s != U_INVALID_CHAR_FOUND\n", 242b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru (long)i, u_errorName(err)); 243b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 245b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 247b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 248b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strToUTF32(u32Target, 0, &u32DestLen, surr16+4, len16-4-1, &err); 249b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_BUFFER_OVERFLOW_ERROR || u32DestLen != 3) { 250b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strToUTF32(preflight surr16+4) sets %s != U_BUFFER_OVERFLOW_ERROR or an unexpected length\n", 251b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_errorName(err)); 252b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 255b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 256b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strToUTF32(u32Target, LENGTHOF(u32Target), &u32DestLen, surr16+4, len16-4-1, &err); 257b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_ZERO_ERROR || u32DestLen != 3 || uprv_memcmp(u32Target, expected, 4*4)) { 258b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strToUTF32(surr16+4) sets %s != U_ZERO_ERROR or does not produce the expected string\n", 259b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_errorName(err)); 260b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 261b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 262b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 263b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 264b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strToUTF32(NULL, 0, &u32DestLen, surr16+4, -1, &err); 265b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_BUFFER_OVERFLOW_ERROR || u32DestLen != 3) { 266b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strToUTF32(preflight surr16+4/NUL) sets %s != U_BUFFER_OVERFLOW_ERROR or an unexpected length\n", 267b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_errorName(err)); 268b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 269b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 270b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 271b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 272b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strToUTF32(u32Target, LENGTHOF(u32Target), &u32DestLen, surr16+4, -1, &err); 273b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_ZERO_ERROR || u32DestLen != 3 || uprv_memcmp(u32Target, expected, 4*4)) { 274b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strToUTF32(surr16+4/NUL) sets %s != U_ZERO_ERROR or does not produce the expected string\n", 275b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_errorName(err)); 276b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 277b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 278b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 279b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* with substitution character */ 280b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru numSubstitutions = -1; 281b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 282b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strToUTF32WithSub(u32Target, 0, &u32DestLen, surr16, len16-1, 0xfffd, &numSubstitutions, &err); 283b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_BUFFER_OVERFLOW_ERROR || u32DestLen != 7 || numSubstitutions != 2) { 284b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strToUTF32WithSub(preflight surr16) sets %s != U_BUFFER_OVERFLOW_ERROR or an unexpected length\n", 285b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_errorName(err)); 286b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 287b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 288b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 289b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 290b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strToUTF32WithSub(u32Target, LENGTHOF(u32Target), &u32DestLen, surr16, len16-1, 0xfffd, &numSubstitutions, &err); 291b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_ZERO_ERROR || u32DestLen != 7 || numSubstitutions != 2 || uprv_memcmp(u32Target, expected_FFFD, 8*4)) { 292b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strToUTF32WithSub(surr16) sets %s != U_ZERO_ERROR or does not produce the expected string\n", 293b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_errorName(err)); 294b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 295b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 296b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 297b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 298b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strToUTF32WithSub(NULL, 0, &u32DestLen, surr16, -1, 0x12345, &numSubstitutions, &err); 299b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_BUFFER_OVERFLOW_ERROR || u32DestLen != 7 || numSubstitutions != 2) { 300b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strToUTF32WithSub(preflight surr16/NUL) sets %s != U_BUFFER_OVERFLOW_ERROR or an unexpected length\n", 301b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_errorName(err)); 302b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 303b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 304b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 305b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 306b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strToUTF32WithSub(u32Target, LENGTHOF(u32Target), &u32DestLen, surr16, -1, 0x12345, &numSubstitutions, &err); 307b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_ZERO_ERROR || u32DestLen != 7 || numSubstitutions != 2 || uprv_memcmp(u32Target, expected_12345, 8*4)) { 308b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strToUTF32WithSub(surr16/NUL) sets %s != U_ZERO_ERROR or does not produce the expected string\n", 309b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_errorName(err)); 310b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 311b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 312b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 313b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 314b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void Test_strFromUTF32(void){ 315b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UErrorCode err = U_ZERO_ERROR; 316b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UChar uTarget[400]; 317b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t uDestLen; 318b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int i= 0; 319b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 320b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* first with length */ 321b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru uDestLen = -2; 322b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strFromUTF32(uTarget,0,&uDestLen,src32,LENGTHOF(src32),&err); 323b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_BUFFER_OVERFLOW_ERROR || uDestLen != LENGTHOF(src16)) { 324b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strFromUTF32(preflight with length): " 325b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "length %ld != %ld and %s != U_BUFFER_OVERFLOW_ERROR\n", 326b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru (long)uDestLen, (long)LENGTHOF(src16), u_errorName(err)); 327b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 328b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 329b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 330b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru uDestLen = -2; 331b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strFromUTF32(uTarget, LENGTHOF(src16)+1,&uDestLen,src32,LENGTHOF(src32),&err); 332b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_ZERO_ERROR || uDestLen != LENGTHOF(src16)) { 333b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strFromUTF32(with length): " 334b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "length %ld != %ld and %s != U_ZERO_ERROR\n", 335b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru (long)uDestLen, (long)LENGTHOF(src16), u_errorName(err)); 336b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 337b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 338b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /*for(i=0; i< uDestLen; i++){ 339b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru printf("0x%04X, ",uTarget[i]); 340b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(i%10==0){ 341b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru printf("\n"); 342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 343b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru }*/ 344b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 345b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru for(i=0; i< uDestLen; i++){ 346b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(uTarget[i] != src16[i]){ 347b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_verbose("u_strFromUTF32(with length) failed expected: %04X got: %04X at index: %i \n", src16[i] ,uTarget[i],i); 348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 349b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 350b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(uTarget[i] != 0){ 351b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_verbose("u_strFromUTF32(with length) failed expected: %04X got: %04X at index: %i \n", 0,uTarget[i],i); 352b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 354b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* now NUL-terminated */ 355b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru uDestLen = -2; 356b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strFromUTF32(NULL,0,&uDestLen,src32,-1,&err); 357b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_BUFFER_OVERFLOW_ERROR || uDestLen != LENGTHOF(src16)-1) { 358b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strFromUTF32(preflight with NUL-termination): " 359b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "length %ld != %ld and %s != U_BUFFER_OVERFLOW_ERROR\n", 360b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru (long)uDestLen, (long)LENGTHOF(src16)-1, u_errorName(err)); 361b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 362b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 363b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 364b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru uDestLen = -2; 365b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strFromUTF32(uTarget, LENGTHOF(src16),&uDestLen,src32,-1,&err); 366b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_ZERO_ERROR || uDestLen != LENGTHOF(src16)-1) { 367b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strFromUTF32(with NUL-termination): " 368b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "length %ld != %ld and %s != U_ZERO_ERROR\n", 369b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru (long)uDestLen, (long)LENGTHOF(src16)-1, u_errorName(err)); 370b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 371b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 372b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 373b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru for(i=0; i< uDestLen; i++){ 374b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(uTarget[i] != src16[i]){ 375b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_verbose("u_strFromUTF32(with NUL-termination) failed expected: %04X got: %04X \n", src16[i] ,uTarget[i]); 376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 377b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 378b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 380b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru/* test surrogate code points */ 381b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void Test_strFromUTF32_surrogates() { 382b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UErrorCode err = U_ZERO_ERROR; 383b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UChar uTarget[400]; 384b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t len32, uDestLen; 385b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t numSubstitutions; 386b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int i; 387b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 388b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru static const UChar32 surr32[] = { 0x41, 0xd900, 0x61, 0xdc00, -1, 0x110000, 0x5a, 0x50000, 0x7a, 0 }; 389b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru static const UChar expected[] = { 0x5a, 0xd900, 0xdc00, 0x7a, 0 }; 390b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru static const UChar expected_FFFD[] = { 0x41, 0xfffd, 0x61, 0xfffd, 0xfffd, 0xfffd, 0x5a, 0xd900, 0xdc00, 0x7a, 0 }; 391b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru static const UChar expected_12345[] = { 0x41, 0xd808, 0xdf45, 0x61, 0xd808, 0xdf45, 0xd808, 0xdf45, 0xd808, 0xdf45, 392b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 0x5a, 0xd900, 0xdc00, 0x7a, 0 }; 393b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru len32 = LENGTHOF(surr32); 394b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru for(i = 0; i < 6; ++i) { 395b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 396b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strFromUTF32(uTarget, 0, &uDestLen, surr32+i, len32-i, &err); 397b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_INVALID_CHAR_FOUND) { 398b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strFromUTF32(preflight surr32+%ld) sets %s != U_INVALID_CHAR_FOUND\n", 399b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru (long)i, u_errorName(err)); 400b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 401b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 403b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 404b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strFromUTF32(uTarget, LENGTHOF(uTarget), &uDestLen, surr32+i, len32-i, &err); 405b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_INVALID_CHAR_FOUND) { 406b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strFromUTF32(surr32+%ld) sets %s != U_INVALID_CHAR_FOUND\n", 407b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru (long)i, u_errorName(err)); 408b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 410b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 411b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 412b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strFromUTF32(NULL, 0, &uDestLen, surr32+i, -1, &err); 413b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_INVALID_CHAR_FOUND) { 414b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strFromUTF32(preflight surr32+%ld/NUL) sets %s != U_INVALID_CHAR_FOUND\n", 415b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru (long)i, u_errorName(err)); 416b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 418b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 419b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 420b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strFromUTF32(uTarget, LENGTHOF(uTarget), &uDestLen, surr32+i, -1, &err); 421b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_INVALID_CHAR_FOUND) { 422b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strFromUTF32(surr32+%ld/NUL) sets %s != U_INVALID_CHAR_FOUND\n", 423b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru (long)i, u_errorName(err)); 424b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 426b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 428b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 429b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strFromUTF32(uTarget, 0, &uDestLen, surr32+6, len32-6-1, &err); 430b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_BUFFER_OVERFLOW_ERROR || uDestLen != 4) { 431b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strFromUTF32(preflight surr32+6) sets %s != U_BUFFER_OVERFLOW_ERROR or an unexpected length\n", 432b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_errorName(err)); 433b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 434b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 435b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 436b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 437b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strFromUTF32(uTarget, LENGTHOF(uTarget), &uDestLen, surr32+6, len32-6-1, &err); 438b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_ZERO_ERROR || uDestLen != 4 || u_memcmp(uTarget, expected, 5)) { 439b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strFromUTF32(surr32+6) sets %s != U_ZERO_ERROR or does not produce the expected string\n", 440b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_errorName(err)); 441b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 442b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 443b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 444b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 445b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strFromUTF32(NULL, 0, &uDestLen, surr32+6, -1, &err); 446b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_BUFFER_OVERFLOW_ERROR || uDestLen != 4) { 447b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strFromUTF32(preflight surr32+6/NUL) sets %s != U_BUFFER_OVERFLOW_ERROR or an unexpected length\n", 448b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_errorName(err)); 449b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 450b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 451b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 452b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 453b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strFromUTF32(uTarget, LENGTHOF(uTarget), &uDestLen, surr32+6, -1, &err); 454b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_ZERO_ERROR || uDestLen != 4 || u_memcmp(uTarget, expected, 5)) { 455b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strFromUTF32(surr32+6/NUL) sets %s != U_ZERO_ERROR or does not produce the expected string\n", 456b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_errorName(err)); 457b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 458b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 459b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 460b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* with substitution character */ 461b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru numSubstitutions = -1; 462b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 463b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strFromUTF32WithSub(uTarget, 0, &uDestLen, surr32, len32-1, 0xfffd, &numSubstitutions, &err); 464b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_BUFFER_OVERFLOW_ERROR || uDestLen != 10 || numSubstitutions != 4) { 465b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strFromUTF32WithSub(preflight surr32) sets %s != U_BUFFER_OVERFLOW_ERROR or an unexpected length\n", 466b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_errorName(err)); 467b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 470b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 471b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strFromUTF32WithSub(uTarget, LENGTHOF(uTarget), &uDestLen, surr32, len32-1, 0xfffd, &numSubstitutions, &err); 472b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_ZERO_ERROR || uDestLen != 10 || numSubstitutions != 4 || u_memcmp(uTarget, expected_FFFD, 11)) { 473b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strFromUTF32WithSub(surr32) sets %s != U_ZERO_ERROR or does not produce the expected string\n", 474b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_errorName(err)); 475b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 476b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 477b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 478b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 479b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strFromUTF32WithSub(NULL, 0, &uDestLen, surr32, -1, 0x12345, &numSubstitutions, &err); 480b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_BUFFER_OVERFLOW_ERROR || uDestLen != 14 || numSubstitutions != 4) { 481b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strFromUTF32WithSub(preflight surr32/NUL) sets %s != U_BUFFER_OVERFLOW_ERROR or an unexpected length\n", 482b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_errorName(err)); 483b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 484b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 485b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 486b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru err = U_ZERO_ERROR; 487b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_strFromUTF32WithSub(uTarget, LENGTHOF(uTarget), &uDestLen, surr32, -1, 0x12345, &numSubstitutions, &err); 488b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(err != U_ZERO_ERROR || uDestLen != 14 || numSubstitutions != 4 || u_memcmp(uTarget, expected_12345, 15)) { 489b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("u_strFromUTF32WithSub(surr32/NUL) sets %s != U_ZERO_ERROR or does not produce the expected string\n", 490b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_errorName(err)); 491b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 492b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 493b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void Test_UChar_UTF8_API(void){ 496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode err = U_ZERO_ERROR; 498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar uTemp[1]; 499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char u8Temp[1]; 500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar* uTarget=uTemp; 501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* u8Src; 502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t u8SrcLen = 0; 503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t uTargetLength = 0; 504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t uDestLen=0; 505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar* uSrc = src16; 506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t uSrcLen = sizeof(src16)/2; 507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char* u8Target = u8Temp; 508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t u8TargetLength =0; 509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t u8DestLen =0; 510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool failed = FALSE; 511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int i= 0; 512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t numSubstitutions; 513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* preflight */ 516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u8Temp[0] = 0x12; 517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strToUTF8(u8Target,u8TargetLength, &u8DestLen, uSrc, uSrcLen,&err); 518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(err == U_BUFFER_OVERFLOW_ERROR && u8Temp[0] == 0x12){ 519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err = U_ZERO_ERROR; 520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u8Target = (char*) malloc (sizeof(uint8_t) * (u8DestLen+1)); 521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u8TargetLength = u8DestLen; 522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u8Target[u8TargetLength] = (char)0xfe; 524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u8DestLen = -1; 525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strToUTF8(u8Target,u8TargetLength, &u8DestLen, uSrc, uSrcLen,&err); 526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(err) || u8DestLen != u8TargetLength || u8Target[u8TargetLength] != (char)0xfe){ 527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strToUTF8 failed after preflight. Error: %s\n", u_errorName(err)); 528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Should have gotten U_BUFFER_OVERFLOW_ERROR"); 534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failed = FALSE; 536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*for(i=0; i< u8DestLen; i++){ 537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru printf("0x%04X, ",u8Target[i]); 538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(i%10==0){ 539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru printf("\n"); 540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }*/ 542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*for(i=0; i< u8DestLen; i++){ 543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(u8Target[i] != src8[i]){ 544b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_verbose("u_strToUTF8() failed expected: %04X got: %04X \n", src8[i], u8Target[i]); 545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failed =TRUE; 546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(failed){ 549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strToUTF8() failed \n"); 550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }*/ 551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u8Src = u8Target; 552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u8SrcLen = u8DestLen; 553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* preflight */ 555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uTemp[0] = 0x1234; 556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strFromUTF8(uTarget,uTargetLength,&uDestLen,u8Src,u8SrcLen,&err); 557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(err == U_BUFFER_OVERFLOW_ERROR && uTemp[0] == 0x1234){ 558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err = U_ZERO_ERROR; 559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uTarget = (UChar*) malloc( sizeof(UChar) * (uDestLen+1)); 560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uTargetLength = uDestLen; 561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uTarget[uTargetLength] = 0xfff0; 563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uDestLen = -1; 564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strFromUTF8(uTarget,uTargetLength,&uDestLen,u8Src,u8SrcLen,&err); 565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: u_strFromUTF8(preflight) should have gotten U_BUFFER_OVERFLOW_ERROR\n"); 568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*for(i=0; i< uDestLen; i++){ 570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru printf("0x%04X, ",uTarget[i]); 571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(i%10==0){ 572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru printf("\n"); 573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }*/ 575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(err) || uDestLen != uTargetLength || uTarget[uTargetLength] != 0xfff0) { 577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failed = TRUE; 578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i< uSrcLen; i++){ 580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(uTarget[i] != src16[i]){ 581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("u_strFromUTF8() failed expected: \\u%04X got: \\u%04X at index: %i \n", src16[i] ,uTarget[i],i); 582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failed =TRUE; 583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(failed){ 586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: u_strFromUTF8(after preflighting) failed\n"); 587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(u8Target); 590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(uTarget); 591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u8SrcLen = -1; 594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uTargetLength = 0; 595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uSrcLen =-1; 596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u8TargetLength=0; 597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failed = FALSE; 598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* preflight */ 599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strToUTF8(NULL,u8TargetLength, &u8DestLen, uSrc, uSrcLen,&err); 600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(err == U_BUFFER_OVERFLOW_ERROR){ 601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err = U_ZERO_ERROR; 602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u8Target = (char*) malloc (sizeof(uint8_t) * (u8DestLen+1)); 603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u8TargetLength = u8DestLen; 604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strToUTF8(u8Target,u8TargetLength, &u8DestLen, uSrc, uSrcLen,&err); 606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Should have gotten U_BUFFER_OVERFLOW_ERROR"); 610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failed = FALSE; 612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*for(i=0; i< u8DestLen; i++){ 613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru printf("0x%04X, ",u8Target[i]); 614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(i%10==0){ 615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru printf("\n"); 616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }*/ 618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*for(i=0; i< u8DestLen; i++){ 619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(u8Target[i] != src8[i]){ 620b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_verbose("u_strToUTF8() failed expected: %04X got: %04X \n", src8[i], u8Target[i]); 621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failed =TRUE; 622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(failed){ 625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strToUTF8() failed \n"); 626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }*/ 627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u8Src = u8Target; 628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u8SrcLen = u8DestLen; 629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* preflight */ 631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strFromUTF8(NULL,uTargetLength,&uDestLen,u8Src,u8SrcLen,&err); 632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(err == U_BUFFER_OVERFLOW_ERROR){ 633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err = U_ZERO_ERROR; 634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uTarget = (UChar*) malloc( sizeof(UChar) * (uDestLen+1)); 635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uTargetLength = uDestLen; 636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strFromUTF8(uTarget,uTargetLength,&uDestLen,u8Src,u8SrcLen,&err); 638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Should have gotten U_BUFFER_OVERFLOW_ERROR"); 641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*for(i=0; i< uDestLen; i++){ 643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru printf("0x%04X, ",uTarget[i]); 644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(i%10==0){ 645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru printf("\n"); 646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }*/ 648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i< uSrcLen; i++){ 650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(uTarget[i] != src16[i]){ 651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("u_strFromUTF8() failed expected: \\u%04X got: \\u%04X at index: %i \n", src16[i] ,uTarget[i],i); 652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failed =TRUE; 653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(failed){ 656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strToUTF8() failed \n"); 657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(u8Target); 660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(uTarget); 661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test UTF-8 with single surrogates - illegal in Unicode 3.2 */ 664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar 666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru withLead16[]={ 0x1800, 0xd89a, 0x0061 }, 667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru withTrail16[]={ 0x1800, 0xdcba, 0x0061, 0 }, 668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru withTrail16SubFFFD[]={ 0x1800, 0xfffd, 0x0061, 0 }, /* sub==U+FFFD */ 669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru withTrail16Sub50005[]={ 0x1800, 0xd900, 0xdc05, 0x0061, 0 }; /* sub==U+50005 */ 670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const uint8_t 671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru withLead8[]={ 0xe1, 0xa0, 0x80, 0xed, 0xa2, 0x9a, 0x61 }, 672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru withTrail8[]={ 0xe1, 0xa0, 0x80, 0xed, 0xb2, 0xba, 0x61, 0 }, 673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru withTrail8Sub1A[]={ 0xe1, 0xa0, 0x80, 0x1a, 0x61, 0 }, /* sub==U+001A */ 674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru withTrail8SubFFFD[]={ 0xe1, 0xa0, 0x80, 0xef, 0xbf, 0xbd, 0x61, 0 }; /* sub==U+FFFD */ 675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar out16[10]; 676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char out8[10]; 677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( 679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (err=U_ZERO_ERROR, u_strToUTF8(out8, LENGTHOF(out8), NULL, withLead16, LENGTHOF(withLead16), &err), err!=U_INVALID_CHAR_FOUND) || 680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (err=U_ZERO_ERROR, u_strToUTF8(out8, LENGTHOF(out8), NULL, withTrail16, -1, &err), err!=U_INVALID_CHAR_FOUND) || 681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (err=U_ZERO_ERROR, u_strFromUTF8(out16, LENGTHOF(out16), NULL, (const char *)withLead8, LENGTHOF(withLead8), &err), err!=U_INVALID_CHAR_FOUND) || 682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (err=U_ZERO_ERROR, u_strFromUTF8(out16, LENGTHOF(out16), NULL, (const char *)withTrail8, -1, &err), err!=U_INVALID_CHAR_FOUND) 683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: u_strTo/FromUTF8(string with single surrogate) fails to report error\n"); 685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test error handling with substitution characters */ 688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* from UTF-8 with length */ 690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err=U_ZERO_ERROR; 691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numSubstitutions=-1; 692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru out16[0]=0x55aa; 693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uDestLen=0; 694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strFromUTF8WithSub(out16, LENGTHOF(out16), &uDestLen, 695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (const char *)withTrail8, uprv_strlen((const char *)withTrail8), 696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x50005, &numSubstitutions, 697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &err); 698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(err) || uDestLen!=u_strlen(withTrail16Sub50005) || 699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0!=u_memcmp(withTrail16Sub50005, out16, uDestLen+1) || 700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numSubstitutions!=1) { 701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: u_strFromUTF8WithSub(length) failed\n"); 702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* from UTF-8 with NUL termination */ 705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err=U_ZERO_ERROR; 706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numSubstitutions=-1; 707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru out16[0]=0x55aa; 708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uDestLen=0; 709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strFromUTF8WithSub(out16, LENGTHOF(out16), &uDestLen, 710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (const char *)withTrail8, -1, 711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xfffd, &numSubstitutions, 712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &err); 713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(err) || uDestLen!=u_strlen(withTrail16SubFFFD) || 714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0!=u_memcmp(withTrail16SubFFFD, out16, uDestLen+1) || 715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numSubstitutions!=1) { 716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: u_strFromUTF8WithSub(NUL termination) failed\n"); 717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* preflight from UTF-8 with NUL termination */ 720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err=U_ZERO_ERROR; 721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numSubstitutions=-1; 722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru out16[0]=0x55aa; 723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uDestLen=0; 724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strFromUTF8WithSub(out16, 1, &uDestLen, 725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (const char *)withTrail8, -1, 726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x50005, &numSubstitutions, 727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &err); 728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(err!=U_BUFFER_OVERFLOW_ERROR || uDestLen!=u_strlen(withTrail16Sub50005) || numSubstitutions!=1) { 729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: u_strFromUTF8WithSub(preflight/NUL termination) failed\n"); 730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* to UTF-8 with length */ 733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err=U_ZERO_ERROR; 734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numSubstitutions=-1; 735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru out8[0]=(char)0xf5; 736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u8DestLen=0; 737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strToUTF8WithSub(out8, LENGTHOF(out8), &u8DestLen, 738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru withTrail16, u_strlen(withTrail16), 739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xfffd, &numSubstitutions, 740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &err); 741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(err) || u8DestLen!=uprv_strlen((const char *)withTrail8SubFFFD) || 742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0!=uprv_memcmp((const char *)withTrail8SubFFFD, out8, u8DestLen+1) || 743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numSubstitutions!=1) { 744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: u_strToUTF8WithSub(length) failed\n"); 745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* to UTF-8 with NUL termination */ 748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err=U_ZERO_ERROR; 749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numSubstitutions=-1; 750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru out8[0]=(char)0xf5; 751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u8DestLen=0; 752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strToUTF8WithSub(out8, LENGTHOF(out8), &u8DestLen, 753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru withTrail16, -1, 754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x1a, &numSubstitutions, 755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &err); 756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(err) || u8DestLen!=uprv_strlen((const char *)withTrail8Sub1A) || 757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0!=uprv_memcmp((const char *)withTrail8Sub1A, out8, u8DestLen+1) || 758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numSubstitutions!=1) { 759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: u_strToUTF8WithSub(NUL termination) failed\n"); 760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* preflight to UTF-8 with NUL termination */ 763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err=U_ZERO_ERROR; 764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numSubstitutions=-1; 765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru out8[0]=(char)0xf5; 766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u8DestLen=0; 767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strToUTF8WithSub(out8, 1, &u8DestLen, 768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru withTrail16, -1, 769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xfffd, &numSubstitutions, 770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &err); 771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(err!=U_BUFFER_OVERFLOW_ERROR || u8DestLen!=uprv_strlen((const char *)withTrail8SubFFFD) || 772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numSubstitutions!=1) { 773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: u_strToUTF8WithSub(preflight/NUL termination) failed\n"); 774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test that numSubstitutions==0 if there are no substitutions */ 777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* from UTF-8 with length (just first 3 bytes which are valid) */ 779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err=U_ZERO_ERROR; 780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numSubstitutions=-1; 781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru out16[0]=0x55aa; 782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uDestLen=0; 783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strFromUTF8WithSub(out16, LENGTHOF(out16), &uDestLen, 784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (const char *)withTrail8, 3, 785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x50005, &numSubstitutions, 786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &err); 787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(err) || uDestLen!=1 || 788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0!=u_memcmp(withTrail16Sub50005, out16, uDestLen) || 789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numSubstitutions!=0) { 790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: u_strFromUTF8WithSub(no subs) failed\n"); 791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* to UTF-8 with length (just first UChar which is valid) */ 794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err=U_ZERO_ERROR; 795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numSubstitutions=-1; 796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru out8[0]=(char)0xf5; 797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u8DestLen=0; 798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strToUTF8WithSub(out8, LENGTHOF(out8), &u8DestLen, 799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru withTrail16, 1, 800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xfffd, &numSubstitutions, 801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &err); 802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(err) || u8DestLen!=3 || 803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0!=uprv_memcmp((const char *)withTrail8SubFFFD, out8, u8DestLen) || 804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numSubstitutions!=0) { 805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: u_strToUTF8WithSub(no subs) failed\n"); 806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test that numSubstitutions==0 if subchar==U_SENTINEL (no subchar) */ 809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* from UTF-8 with length (just first 3 bytes which are valid) */ 811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err=U_ZERO_ERROR; 812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numSubstitutions=-1; 813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru out16[0]=0x55aa; 814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uDestLen=0; 815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strFromUTF8WithSub(out16, LENGTHOF(out16), &uDestLen, 816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (const char *)withTrail8, 3, 817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SENTINEL, &numSubstitutions, 818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &err); 819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(err) || uDestLen!=1 || 820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0!=u_memcmp(withTrail16Sub50005, out16, uDestLen) || 821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numSubstitutions!=0) { 822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: u_strFromUTF8WithSub(no subchar) failed\n"); 823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* to UTF-8 with length (just first UChar which is valid) */ 826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err=U_ZERO_ERROR; 827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numSubstitutions=-1; 828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru out8[0]=(char)0xf5; 829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u8DestLen=0; 830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strToUTF8WithSub(out8, LENGTHOF(out8), &u8DestLen, 831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru withTrail16, 1, 832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_SENTINEL, &numSubstitutions, 833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &err); 834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(err) || u8DestLen!=3 || 835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0!=uprv_memcmp((const char *)withTrail8SubFFFD, out8, u8DestLen) || 836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numSubstitutions!=0) { 837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error: u_strToUTF8WithSub(no subchar) failed\n"); 838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* compare if two strings are equal, but match 0xfffd in the second string with anything in the first */ 843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool 844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruequalAnyFFFD(const UChar *s, const UChar *t, int32_t length) { 845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar c1, c2; 846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while(length>0) { 848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c1=*s++; 849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c2=*t++; 850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(c1!=c2 && c2!=0xfffd) { 851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru --length; 854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* test u_strFromUTF8Lenient() */ 859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 860c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruTest_FromUTF8(void) { 861c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* 862c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * Test case from icu-support list 20071130 "u_strFromUTF8() returns U_INVALID_CHAR_FOUND(10)" 863c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru */ 864c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru static const uint8_t bytes[]={ 0xe0, 0xa5, 0x9c, 0 }; 865c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UChar dest[64]; 866c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UChar *destPointer; 867c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t destLength; 868c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UErrorCode errorCode; 869c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 870c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* 3 bytes input, one UChar output (U+095C) */ 871c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 872c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru destLength=-99; 873c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru destPointer=u_strFromUTF8(NULL, 0, &destLength, (const char *)bytes, 3, &errorCode); 874c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if(errorCode!=U_BUFFER_OVERFLOW_ERROR || destPointer!=NULL || destLength!=1) { 875c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru log_err("error: u_strFromUTF8(preflight srcLength=3) fails: destLength=%ld - %s\n", 876c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru (long)destLength, u_errorName(errorCode)); 877c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 878c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 879c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* 4 bytes input, two UChars output (U+095C U+0000) */ 880c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 881c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru destLength=-99; 882c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru destPointer=u_strFromUTF8(NULL, 0, &destLength, (const char *)bytes, 4, &errorCode); 883c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if(errorCode!=U_BUFFER_OVERFLOW_ERROR || destPointer!=NULL || destLength!=2) { 884c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru log_err("error: u_strFromUTF8(preflight srcLength=4) fails: destLength=%ld - %s\n", 885c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru (long)destLength, u_errorName(errorCode)); 886c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 887c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 888c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* NUL-terminated 3 bytes input, one UChar output (U+095C) */ 889c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 890c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru destLength=-99; 891c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru destPointer=u_strFromUTF8(NULL, 0, &destLength, (const char *)bytes, -1, &errorCode); 892c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if(errorCode!=U_BUFFER_OVERFLOW_ERROR || destPointer!=NULL || destLength!=1) { 893c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru log_err("error: u_strFromUTF8(preflight srcLength=-1) fails: destLength=%ld - %s\n", 894c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru (long)destLength, u_errorName(errorCode)); 895c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 896c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 897c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* 3 bytes input, one UChar output (U+095C), transform not just preflight */ 898c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 899c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru dest[0]=dest[1]=99; 900c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru destLength=-99; 901c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru destPointer=u_strFromUTF8(dest, LENGTHOF(dest), &destLength, (const char *)bytes, 3, &errorCode); 902c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if(U_FAILURE(errorCode) || destPointer!=dest || destLength!=1 || dest[0]!=0x95c || dest[1]!=0) { 903c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru log_err("error: u_strFromUTF8(transform srcLength=3) fails: destLength=%ld - %s\n", 904c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru (long)destLength, u_errorName(errorCode)); 905c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 906c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 907c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 908c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru/* test u_strFromUTF8Lenient() */ 909c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Querustatic void 910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTest_FromUTF8Lenient(void) { 911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Multiple input strings, each NUL-terminated. 913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Terminate with a string starting with 0xff. 914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const uint8_t bytes[]={ 916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* well-formed UTF-8 */ 917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x61, 0xc3, 0x9f, 0xe0, 0xa0, 0x80, 0xf0, 0xa0, 0x80, 0x80, 918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x62, 0xc3, 0xa0, 0xe0, 0xa0, 0x81, 0xf0, 0xa0, 0x80, 0x81, 0, 919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* various malformed sequences */ 921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xc3, 0xc3, 0x9f, 0xc3, 0xa0, 0xe0, 0x80, 0x8a, 0xf0, 0x41, 0x42, 0x43, 0, 922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* truncated input */ 924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xc3, 0, 925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xe0, 0, 926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xe0, 0xa0, 0, 927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xf0, 0, 928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xf0, 0x90, 0, 929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xf0, 0x90, 0x80, 0, 930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* non-ASCII characters in the last few bytes */ 932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x61, 0xc3, 0x9f, 0xe0, 0xa0, 0x80, 0, 933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x61, 0xe0, 0xa0, 0x80, 0xc3, 0x9f, 0, 934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* empty string */ 936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0, 937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* finish */ 939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xff, 0 940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Multiple output strings, each NUL-terminated. 0xfffd matches anything. */ 943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar uchars[]={ 944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x61, 0xdf, 0x800, 0xd840, 0xdc00, 945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x62, 0xe0, 0x801, 0xd840, 0xdc01, 0, 946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xfffd, 0x9f, 0xe0, 0xa, 0xfffd, 0xfffd, 0, 948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xfffd, 0, 950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xfffd, 0, 951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xfffd, 0, 952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xfffd, 0, 953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xfffd, 0, 954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xfffd, 0, 955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x61, 0xdf, 0x800, 0, 957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x61, 0x800, 0xdf, 0, 958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0, 960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0 962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar dest[64]; 965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *pb; 966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar *pu, *pDest; 967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t srcLength, destLength0, destLength; 968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int number; 969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode; 970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* verify checking for some illegal arguments */ 972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dest[0]=0x1234; 973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLength=-1; 974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pDest=u_strFromUTF8Lenient(dest, 1, &destLength, NULL, -1, &errorCode); 976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || dest[0]!=0x1234) { 977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strFromUTF8Lenient(src=NULL) failed\n"); 978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dest[0]=0x1234; 981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLength=-1; 982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pDest=u_strFromUTF8Lenient(NULL, 1, &destLength, (const char *)bytes, -1, &errorCode); 984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) { 985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strFromUTF8Lenient(dest=NULL[1]) failed\n"); 986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dest[0]=0x1234; 989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLength=-1; 990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_MEMORY_ALLOCATION_ERROR; 991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pDest=u_strFromUTF8Lenient(dest, 1, &destLength, (const char *)bytes, -1, &errorCode); 992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_MEMORY_ALLOCATION_ERROR || dest[0]!=0x1234) { 993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strFromUTF8Lenient(U_MEMORY_ALLOCATION_ERROR) failed\n"); 994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dest[0]=0x1234; 997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLength=-1; 998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_MEMORY_ALLOCATION_ERROR; 999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pDest=u_strFromUTF8Lenient(dest, 1, &destLength, (const char *)bytes, -1, NULL); 1000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(dest[0]!=0x1234) { 1001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strFromUTF8Lenient(pErrorCode=NULL) failed\n"); 1002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test normal behavior */ 1005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru number=0; /* string number for log_err() */ 1006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(pb=(const char *)bytes, pu=uchars; 1008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *pb!=(char)0xff; 1009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pb+=srcLength+1, pu+=destLength0+1, ++number 1010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 1011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcLength=uprv_strlen(pb); 1012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLength0=u_strlen(pu); 1013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* preflighting with NUL-termination */ 1015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dest[0]=0x1234; 1016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLength=-1; 1017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 1018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pDest=u_strFromUTF8Lenient(NULL, 0, &destLength, pb, -1, &errorCode); 1019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (errorCode!= (destLength0==0 ? U_STRING_NOT_TERMINATED_WARNING : U_BUFFER_OVERFLOW_ERROR) || 1020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pDest!=NULL || dest[0]!=0x1234 || destLength!=destLength0 1021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 1022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strFromUTF8Lenient(%d preflighting with NUL-termination) failed\n", number); 1023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* preflighting/some capacity with NUL-termination */ 1026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(srcLength>0) { 1027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dest[destLength0-1]=0x1234; 1028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLength=-1; 1029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 1030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pDest=u_strFromUTF8Lenient(dest, destLength0-1, &destLength, pb, -1, &errorCode); 1031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (errorCode!=U_BUFFER_OVERFLOW_ERROR || 1032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dest[destLength0-1]!=0x1234 || destLength!=destLength0 1033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 1034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strFromUTF8Lenient(%d preflighting/some capacity with NUL-termination) failed\n", number); 1035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* conversion with NUL-termination, much capacity */ 1039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dest[0]=dest[destLength0]=0x1234; 1040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLength=-1; 1041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 1042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pDest=u_strFromUTF8Lenient(dest, LENGTHOF(dest), &destLength, pb, -1, &errorCode); 1043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (errorCode!=U_ZERO_ERROR || 1044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pDest!=dest || dest[destLength0]!=0 || 1045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLength!=destLength0 || !equalAnyFFFD(dest, pu, destLength) 1046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 1047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strFromUTF8Lenient(%d conversion with NUL-termination, much capacity) failed\n", number); 1048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* conversion with NUL-termination, exact capacity */ 1051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dest[0]=dest[destLength0]=0x1234; 1052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLength=-1; 1053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 1054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pDest=u_strFromUTF8Lenient(dest, destLength0, &destLength, pb, -1, &errorCode); 1055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (errorCode!=U_STRING_NOT_TERMINATED_WARNING || 1056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pDest!=dest || dest[destLength0]!=0x1234 || 1057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLength!=destLength0 || !equalAnyFFFD(dest, pu, destLength) 1058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 1059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strFromUTF8Lenient(%d conversion with NUL-termination, exact capacity) failed\n", number); 1060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* preflighting with length */ 1063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dest[0]=0x1234; 1064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLength=-1; 1065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 1066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pDest=u_strFromUTF8Lenient(NULL, 0, &destLength, pb, srcLength, &errorCode); 1067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (errorCode!= (destLength0==0 ? U_STRING_NOT_TERMINATED_WARNING : U_BUFFER_OVERFLOW_ERROR) || 1068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pDest!=NULL || dest[0]!=0x1234 || destLength!=srcLength 1069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 1070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strFromUTF8Lenient(%d preflighting with length) failed\n", number); 1071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* preflighting/some capacity with length */ 1074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(srcLength>0) { 1075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dest[srcLength-1]=0x1234; 1076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLength=-1; 1077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 1078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pDest=u_strFromUTF8Lenient(dest, srcLength-1, &destLength, pb, srcLength, &errorCode); 1079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (errorCode!=U_BUFFER_OVERFLOW_ERROR || 1080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dest[srcLength-1]!=0x1234 || destLength!=srcLength 1081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 1082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strFromUTF8Lenient(%d preflighting/some capacity with length) failed\n", number); 1083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* conversion with length, much capacity */ 1087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dest[0]=dest[destLength0]=0x1234; 1088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLength=-1; 1089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 1090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pDest=u_strFromUTF8Lenient(dest, LENGTHOF(dest), &destLength, pb, srcLength, &errorCode); 1091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (errorCode!=U_ZERO_ERROR || 1092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pDest!=dest || dest[destLength0]!=0 || 1093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLength!=destLength0 || !equalAnyFFFD(dest, pu, destLength) 1094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 1095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strFromUTF8Lenient(%d conversion with length, much capacity) failed\n", number); 1096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* conversion with length, srcLength capacity */ 1099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dest[0]=dest[srcLength]=dest[destLength0]=0x1234; 1100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLength=-1; 1101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 1102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pDest=u_strFromUTF8Lenient(dest, srcLength, &destLength, pb, srcLength, &errorCode); 1103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(srcLength==destLength0) { 1104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (errorCode!=U_STRING_NOT_TERMINATED_WARNING || 1105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pDest!=dest || dest[destLength0]!=0x1234 || 1106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLength!=destLength0 || !equalAnyFFFD(dest, pu, destLength) 1107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 1108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strFromUTF8Lenient(%d conversion with length, srcLength capacity/not terminated) failed\n", number); 1109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (errorCode!=U_ZERO_ERROR || 1112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pDest!=dest || dest[destLength0]!=0 || 1113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destLength!=destLength0 || !equalAnyFFFD(dest, pu, destLength) 1114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 1115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strFromUTF8Lenient(%d conversion with length, srcLength capacity/terminated) failed\n", number); 1116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const uint16_t src16j[] = { 1122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x000D, 0x000A, 1123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x000D, 0x000A, 1124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x000D, 0x000A, 1125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x000D, 0x000A, 1126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0000, 1127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Test only ASCII */ 1128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 1130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const uint16_t src16WithNulls[] = { 1131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0000, 1132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0048, 0x0049, 0x004A, 0x000D, 0x000A, 0x0000, 1133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0000, 1134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0050, 0x0051, 0x0052, 0x000D, 0x000A, 0x0000, 1135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0000, 1136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0058, 0x0059, 0x005A, 0x000D, 0x000A, 0x0000, 1137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0000, 1138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0058, 0x0059, 0x005A, 0x000D, 0x000A, 0x0000, 1139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test only ASCII */ 1140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 1141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 1142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x00AE, 0x00AF, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 1143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, 0x00C0, 0x00C1, 1144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 1145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x00CC, 0x00CD, 0x00CE, 0x00CF, 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 1146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, 1147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 1148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0054, 0x0000 */ 1149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 1151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void Test_UChar_WCHART_API(void){ 1152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if (defined(U_WCHAR_IS_UTF16) || defined(U_WCHAR_IS_UTF32)) || (!UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION) 1153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode err = U_ZERO_ERROR; 1154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar* uSrc = src16j; 1155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t uSrcLen = sizeof(src16j)/2; 1156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wchar_t* wDest = NULL; 1157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t wDestLen = 0; 1158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t reqLen= 0 ; 1159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool failed = FALSE; 1160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar* uDest = NULL; 1161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t uDestLen = 0; 1162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int i =0; 1163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Bad UErrorCode arguments. Make sure that the API doesn't crash, and that Purify doesn't complain. */ 1165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strFromWCS(NULL,0,NULL,NULL,0,NULL) != NULL) { 1166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strFromWCS() should return NULL with a bad argument\n"); 1167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strToWCS(NULL,0,NULL,NULL,0,NULL) != NULL) { 1169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strToWCS() should return NULL with a bad argument\n"); 1170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Bad UErrorCode arguments. */ 1173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err = U_ZERO_ERROR; 1174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strFromWCS(NULL,0,NULL,NULL,0,&err); 1175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (err != U_ILLEGAL_ARGUMENT_ERROR) { 1176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strFromWCS() didn't fail as expected with bad arguments. Error: %s \n", u_errorName(err)); 1177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err = U_ZERO_ERROR; 1179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strToWCS(NULL,0,NULL,NULL,0,&err); 1180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (err != U_ILLEGAL_ARGUMENT_ERROR) { 1181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strToWCS() didn't fail as expected with bad arguments. Error: %s \n", u_errorName(err)); 1182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err = U_ZERO_ERROR; 1184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* pre-flight*/ 1186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strToWCS(wDest,wDestLen,&reqLen,uSrc,uSrcLen-1,&err); 1187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(err == U_BUFFER_OVERFLOW_ERROR){ 1189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err=U_ZERO_ERROR; 1190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wDest =(wchar_t*) malloc(sizeof(wchar_t) * (reqLen+1)); 1191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wDestLen = reqLen+1; 1192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strToWCS(wDest,wDestLen,&reqLen,uSrc,uSrcLen-1,&err); 1193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* pre-flight */ 1196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strFromWCS(uDest, uDestLen,&reqLen,wDest,reqLen,&err); 1197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(err == U_BUFFER_OVERFLOW_ERROR){ 1200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err =U_ZERO_ERROR; 1201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uDest = (UChar*) malloc(sizeof(UChar) * (reqLen+1)); 1202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uDestLen = reqLen + 1; 1203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strFromWCS(uDest, uDestLen,&reqLen,wDest,reqLen,&err); 1204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }else if(U_FAILURE(err)){ 1205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strFromWCS() failed. Error: %s \n", u_errorName(err)); 1207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i< uSrcLen; i++){ 1211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(uDest[i] != src16j[i]){ 1212b13da9df870a61b11249bf741347908dbea0edd8Jean-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); 1213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failed =TRUE; 1214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(err)){ 1218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failed = TRUE; 1219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(failed){ 1221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strToWCS() failed \n"); 1222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(wDest); 1224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(uDest); 1225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test with embeded nulls */ 1228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uSrc = src16WithNulls; 1229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uSrcLen = sizeof(src16WithNulls)/2; 1230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wDestLen =0; 1231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uDestLen =0; 1232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wDest = NULL; 1233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uDest = NULL; 1234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* pre-flight*/ 1235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strToWCS(wDest,wDestLen,&reqLen,uSrc,uSrcLen-1,&err); 1236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(err == U_BUFFER_OVERFLOW_ERROR){ 1238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err=U_ZERO_ERROR; 1239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wDest =(wchar_t*) malloc(sizeof(wchar_t) * (reqLen+1)); 1240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wDestLen = reqLen+1; 1241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strToWCS(wDest,wDestLen,&reqLen,uSrc,uSrcLen-1,&err); 1242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* pre-flight */ 1245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strFromWCS(uDest, uDestLen,&reqLen,wDest,reqLen,&err); 1246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(err == U_BUFFER_OVERFLOW_ERROR){ 1248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err =U_ZERO_ERROR; 1249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uDest = (UChar*) malloc(sizeof(UChar) * (reqLen+1)); 1250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uDestLen = reqLen + 1; 1251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strFromWCS(uDest, uDestLen,&reqLen,wDest,reqLen,&err); 1252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1254b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(!U_FAILURE(err)) { 1255b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru for(i=0; i< uSrcLen; i++){ 1256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(uDest[i] != src16WithNulls[i]){ 1257b13da9df870a61b11249bf741347908dbea0edd8Jean-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); 1258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failed =TRUE; 1259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1260b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(err)){ 1264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failed = TRUE; 1265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(failed){ 1267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strToWCS() failed \n"); 1268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(wDest); 1270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(uDest); 1271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uSrc = src16j; 1277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uSrcLen = sizeof(src16j)/2; 1278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wDestLen =0; 1279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uDestLen =0; 1280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wDest = NULL; 1281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uDest = NULL; 1282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wDestLen = 0; 1283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* pre-flight*/ 1284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strToWCS(wDest,wDestLen,&reqLen,uSrc,-1,&err); 1285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(err == U_BUFFER_OVERFLOW_ERROR){ 1287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err=U_ZERO_ERROR; 1288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wDest =(wchar_t*) malloc(sizeof(wchar_t) * (reqLen+1)); 1289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wDestLen = reqLen+1; 1290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strToWCS(wDest,wDestLen,&reqLen,uSrc,-1,&err); 1291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uDestLen = 0; 1293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* pre-flight */ 1294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strFromWCS(uDest, uDestLen,&reqLen,wDest,-1,&err); 1295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(err == U_BUFFER_OVERFLOW_ERROR){ 1297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err =U_ZERO_ERROR; 1298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uDest = (UChar*) malloc(sizeof(UChar) * (reqLen+1)); 1299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uDestLen = reqLen + 1; 1300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strFromWCS(uDest, uDestLen,&reqLen,wDest,-1,&err); 1301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1304b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(!U_FAILURE(err)) { 1305b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru for(i=0; i< uSrcLen; i++){ 1306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(uDest[i] != src16j[i]){ 1307b13da9df870a61b11249bf741347908dbea0edd8Jean-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); 1308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failed =TRUE; 1309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1310b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(err)){ 1314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failed = TRUE; 1315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(failed){ 1317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strToWCS() failed \n"); 1318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(wDest); 1320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(uDest); 1321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 1324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test u_terminateWChars(). 1325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * All u_terminateXYZ() use the same implementation macro; 1326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * we test this function to improve API coverage. 1327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wchar_t buffer[10]; 1330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err=U_ZERO_ERROR; 1332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer[3]=0x20ac; 1333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wDestLen=u_terminateWChars(buffer, LENGTHOF(buffer), 3, &err); 1334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(err!=U_ZERO_ERROR || wDestLen!=3 || buffer[3]!=0) { 1335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_terminateWChars(buffer, all, 3, zero) failed: %s length %d [3]==U+%04x\n", 1336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_errorName(err), wDestLen, buffer[3]); 1337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err=U_ZERO_ERROR; 1340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer[3]=0x20ac; 1341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wDestLen=u_terminateWChars(buffer, 3, 3, &err); 1342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(err!=U_STRING_NOT_TERMINATED_WARNING || wDestLen!=3 || buffer[3]!=0x20ac) { 1343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_terminateWChars(buffer, 3, 3, zero) failed: %s length %d [3]==U+%04x\n", 1344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_errorName(err), wDestLen, buffer[3]); 1345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err=U_STRING_NOT_TERMINATED_WARNING; 1348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer[3]=0x20ac; 1349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wDestLen=u_terminateWChars(buffer, LENGTHOF(buffer), 3, &err); 1350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(err!=U_ZERO_ERROR || wDestLen!=3 || buffer[3]!=0) { 1351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_terminateWChars(buffer, all, 3, not-terminated) failed: %s length %d [3]==U+%04x\n", 1352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_errorName(err), wDestLen, buffer[3]); 1353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err=U_ZERO_ERROR; 1356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer[3]=0x20ac; 1357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wDestLen=u_terminateWChars(buffer, 2, 3, &err); 1358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(err!=U_BUFFER_OVERFLOW_ERROR || wDestLen!=3 || buffer[3]!=0x20ac) { 1359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_terminateWChars(buffer, 2, 3, zero) failed: %s length %d [3]==U+%04x\n", 1360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_errorName(err), wDestLen, buffer[3]); 1361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 1364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_info("Not testing u_str*WCS because (!UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION) and wchar is neither utf16 nor utf32"); 1365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 1366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void Test_widestrs() 1369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if (defined(U_WCHAR_IS_UTF16) || defined(U_WCHAR_IS_UTF32)) || (!UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION) 1371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wchar_t ws[100]; 1372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar rts[100]; 1373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t wcap = sizeof(ws) / sizeof(*ws); 1374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t wl; 1375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t rtcap = sizeof(rts) / sizeof(*rts); 1376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t rtl; 1377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wchar_t *wcs; 1378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar *cp; 1379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *errname; 1380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar ustr[] = {'h', 'e', 'l', 'l', 'o', 0}; 1381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t ul = sizeof(ustr)/sizeof(*ustr) -1; 1382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char astr[100]; 1383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode err; 1385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err = U_ZERO_ERROR; 1387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wcs = u_strToWCS(ws, wcap, &wl, ustr, ul, &err); 1388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(err)) { 1389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errname = u_errorName(err); 1390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("test_widestrs: u_strToWCS error: %s!\n",errname); 1391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(ul!=wl){ 1393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strToWCS: ustr = %s, ul = %d, ws = %S, wl = %d!\n", u_austrcpy(astr, ustr), ul, ws, wl); 1394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err = U_ZERO_ERROR; 1396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wl = (int32_t)uprv_wcslen(wcs); 1397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru cp = u_strFromWCS(rts, rtcap, &rtl, wcs, wl, &err); 1398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(err)) { 1399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errname = u_errorName(err); 1400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stderr, "test_widestrs: ucnv_wcstombs error: %s!\n",errname); 1401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(wl != rtl){ 1403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strFromWCS: wcs = %S, wl = %d,rts = %s, rtl = %d!\n", wcs, wl, u_austrcpy(astr, rts), rtl); 1404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 1406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_info("Not testing u_str*WCS because (!UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION) and wchar is neither utf16 nor utf32"); 1407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 1408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 1411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTest_WCHART_LongString(){ 1412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if (defined(U_WCHAR_IS_UTF16) || defined(U_WCHAR_IS_UTF32)) || (!UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION) 1413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* testdatapath=loadTestData(&status); 1415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UResourceBundle *theBundle = ures_open(testdatapath, "testtypes", &status); 1416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t strLen =0; 1417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar* str = ures_getStringByKey(theBundle, "testinclude",&strLen,&status); 1418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar* uSrc = str; 1419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t uSrcLen = strLen; 1420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t wDestLen =0, reqLen=0, i=0; 1421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t uDestLen =0; 1422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wchar_t* wDest = NULL; 1423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar* uDest = NULL; 1424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool failed = FALSE; 1425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)){ 1427c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru log_data_err("Could not get testinclude resource from testtypes bundle. Error: %s\n",u_errorName(status)); 1428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* pre-flight*/ 1432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strToWCS(wDest,wDestLen,&reqLen,uSrc,-1,&status); 1433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(status == U_BUFFER_OVERFLOW_ERROR){ 1435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status=U_ZERO_ERROR; 1436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wDest =(wchar_t*) malloc(sizeof(wchar_t) * (reqLen+1)); 1437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wDestLen = reqLen+1; 1438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strToWCS(wDest,wDestLen,&reqLen,uSrc,-1,&status); 1439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uDestLen = 0; 1441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* pre-flight */ 1442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strFromWCS(uDest, uDestLen,&reqLen,wDest,-1,&status); 1443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(status == U_BUFFER_OVERFLOW_ERROR){ 1445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status =U_ZERO_ERROR; 1446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uDest = (UChar*) malloc(sizeof(UChar) * (reqLen+1)); 1447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uDestLen = reqLen + 1; 1448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strFromWCS(uDest, uDestLen,&reqLen,wDest,-1,&status); 1449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; i< uSrcLen; i++){ 1453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(uDest[i] != str[i]){ 1454b13da9df870a61b11249bf741347908dbea0edd8Jean-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); 1455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failed =TRUE; 1456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)){ 1460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failed = TRUE; 1461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(failed){ 1463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("u_strToWCS() failed \n"); 1464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(wDest); 1466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(uDest); 1467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* close the bundle */ 1468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ures_close(theBundle); 1469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 1470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_info("Not testing u_str*WCS because (!UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION) and wchar is neither utf16 nor utf32"); 1471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 1472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1474