OLD | NEW |
(Empty) | |
| 1 /******************************************************************** |
| 2 * COPYRIGHT: |
| 3 * Copyright (c) 2001-2010, International Business Machines Corporation and |
| 4 * others. All Rights Reserved. |
| 5 ********************************************************************/ |
| 6 /*******************************************************************************
* |
| 7 * |
| 8 * File custrtrn.C |
| 9 * |
| 10 * Modification History: |
| 11 * Name Description |
| 12 * Ram String transformations test |
| 13 ********************************************************************************
* |
| 14 */ |
| 15 /****************************************************************************/ |
| 16 |
| 17 |
| 18 #include <stdlib.h> |
| 19 #include <stdio.h> |
| 20 #include <string.h> |
| 21 #include "unicode/utypes.h" |
| 22 #include "unicode/ustring.h" |
| 23 #include "unicode/ures.h" |
| 24 #include "ustr_imp.h" |
| 25 #include "cintltst.h" |
| 26 #include "cmemory.h" |
| 27 #include "cstring.h" |
| 28 #include "cwchar.h" |
| 29 |
| 30 #define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0])) |
| 31 |
| 32 void addUCharTransformTest(TestNode** root); |
| 33 |
| 34 static void Test_strToUTF32(void); |
| 35 static void Test_strToUTF32_surrogates(void); |
| 36 static void Test_strFromUTF32(void); |
| 37 static void Test_strFromUTF32_surrogates(void); |
| 38 static void Test_UChar_UTF8_API(void); |
| 39 static void Test_FromUTF8(void); |
| 40 static void Test_FromUTF8Lenient(void); |
| 41 static void Test_UChar_WCHART_API(void); |
| 42 static void Test_widestrs(void); |
| 43 static void Test_WCHART_LongString(void); |
| 44 static void Test_strToJavaModifiedUTF8(void); |
| 45 static void Test_strFromJavaModifiedUTF8(void); |
| 46 static void TestNullEmptySource(void); |
| 47 |
| 48 void |
| 49 addUCharTransformTest(TestNode** root) |
| 50 { |
| 51 addTest(root, &Test_strToUTF32, "custrtrn/Test_strToUTF32"); |
| 52 addTest(root, &Test_strToUTF32_surrogates, "custrtrn/Test_strToUTF32_surrogat
es"); |
| 53 addTest(root, &Test_strFromUTF32, "custrtrn/Test_strFromUTF32"); |
| 54 addTest(root, &Test_strFromUTF32_surrogates, "custrtrn/Test_strFromUTF32_surr
ogates"); |
| 55 addTest(root, &Test_UChar_UTF8_API, "custrtrn/Test_UChar_UTF8_API"); |
| 56 addTest(root, &Test_FromUTF8, "custrtrn/Test_FromUTF8"); |
| 57 addTest(root, &Test_FromUTF8Lenient, "custrtrn/Test_FromUTF8Lenient"); |
| 58 addTest(root, &Test_UChar_WCHART_API, "custrtrn/Test_UChar_WCHART_API"); |
| 59 addTest(root, &Test_widestrs, "custrtrn/Test_widestrs"); |
| 60 #if !UCONFIG_NO_FILE_IO && !UCONFIG_NO_LEGACY_CONVERSION |
| 61 addTest(root, &Test_WCHART_LongString, "custrtrn/Test_WCHART_LongString"); |
| 62 #endif |
| 63 addTest(root, &Test_strToJavaModifiedUTF8, "custrtrn/Test_strToJavaModifiedU
TF8"); |
| 64 addTest(root, &Test_strFromJavaModifiedUTF8, "custrtrn/Test_strFromJavaModif
iedUTF8"); |
| 65 addTest(root, &TestNullEmptySource, "custrtrn/TestNullEmptySource"); |
| 66 } |
| 67 |
| 68 static const UChar32 src32[]={ |
| 69 0x00A8, 0x3003, 0x3005, 0x2015, 0xFF5E, 0x2016, 0x2026, 0x2018, 0x000D, 0x00
0A, |
| 70 0x2019, 0x201C, 0x201D, 0x3014, 0x3015, 0x3008, 0x3009, 0x300A, 0x000D, 0x00
0A, |
| 71 0x300B, 0x300C, 0x300D, 0x300E, 0x300F, 0x3016, 0x3017, 0x3010, 0x000D, 0x00
0A, |
| 72 0x3011, 0x00B1, 0x00D7, 0x00F7, 0x2236, 0x2227, 0x7FC1, 0x8956, 0x000D, 0x00
0A, |
| 73 0x9D2C, 0x9D0E, 0x9EC4, 0x5CA1, 0x6C96, 0x837B, 0x5104, 0x5C4B, 0x000D, 0x00
0A, |
| 74 0x61B6, 0x81C6, 0x6876, 0x7261, 0x4E59, 0x4FFA, 0x5378, 0x57F7, 0x000D, 0x00
0A, |
| 75 0x57F4, 0x57F9, 0x57FA, 0x57FC, 0x5800, 0x5802, 0x5805, 0x5806, 0x000D, 0x00
0A, |
| 76 0x580A, 0x581E, 0x6BB5, 0x6BB7, 0x6BBA, 0x6BBC, 0x9CE2, 0x977C, 0x000D, 0x00
0A, |
| 77 0x6BBF, 0x6BC1, 0x6BC5, 0x6BC6, 0x6BCB, 0x6BCD, 0x6BCF, 0x6BD2, 0x000D, 0x00
0A, |
| 78 0x6BD3, 0x6BD4, 0x6BD6, 0x6BD7, 0x6BD8, 0x6BDB, 0x6BEB, 0x6BEC, 0x000D, 0x00
0A, |
| 79 0x6C05, 0x6C08, 0x6C0F, 0x6C11, 0x6C13, 0x6C23, 0x6C34, 0x0041, 0x000D, 0x00
0A, |
| 80 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x000D, 0x00
0A, |
| 81 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x000D, 0x00
0A, |
| 82 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x000D, 0x00
0A, |
| 83 0x005B, 0x9792, 0x9CCC, 0x9CCD, 0x9CCE, 0x9CCF, 0x9CD0, 0x9CD3, 0x000D, 0x00
0A, |
| 84 0x9CD4, 0x9CD5, 0x9CD7, 0x9CD8, 0x9CD9, 0x9CDC, 0x9CDD, 0x9CDF, 0x000D, 0x00
0A, |
| 85 0x9785, 0x9791, 0x00BD, 0x0390, 0x0385, 0x0386, 0x0388, 0x0389, 0x000D, 0x00
0A, |
| 86 0x038E, 0x038F, 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x000D, 0x00
0A, |
| 87 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x038A, 0x038C, 0x039C, 0x000D, 0x00
0A, |
| 88 /* test non-BMP code points */ |
| 89 0x0002A699, |
| 90 0x0002A69C, 0x0002A69D, 0x0002A69E, 0x0002A69F, 0x0002A6A0, 0x0002A6A5, 0x00
02A6A6, 0x0002A6A7, 0x0002A6A8, 0x0002A6AB, |
| 91 0x0002A6AC, 0x0002A6AD, 0x0002A6AE, 0x0002A6AF, 0x0002A6B0, 0x0002A6B1, 0x00
02A6B3, 0x0002A6B5, 0x0002A6B6, 0x0002A6B7, |
| 92 0x0002A6B8, 0x0002A6B9, 0x0002A6BA, 0x0002A6BB, 0x0002A6BC, 0x0002A6BD, 0x00
02A6BE, 0x0002A6BF, 0x0002A6C0, 0x0002A6C1, |
| 93 0x0002A6C2, 0x0002A6C3, 0x0002A6C4, 0x0002A6C8, 0x0002A6CA, 0x0002A6CB, 0x00
02A6CD, 0x0002A6CE, 0x0002A6CF, 0x0002A6D0, |
| 94 0x0002A6D1, 0x0002A6D2, 0x0002A6D3, 0x0002A6D4, 0x0002A6D5, |
| 95 |
| 96 0x4DB3, 0x4DB4, 0x4DB5, 0x4E00, 0x4E00, 0x4E01, 0x4E02, 0x4E03, 0x000D, 0x00
0A, |
| 97 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x33E0, 0x33E6, 0x000D, 0x00
0A, |
| 98 0x4E05, 0x4E07, 0x4E04, 0x4E08, 0x4E08, 0x4E09, 0x4E0A, 0x4E0B, 0x000D, 0x00
0A, |
| 99 0x4E0C, 0x0021, 0x0022, 0x0023, 0x0024, 0xFF40, 0xFF41, 0xFF42, 0x000D, 0x00
0A, |
| 100 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0x000D, 0x00
0A,0x0000 |
| 101 }; |
| 102 |
| 103 static const UChar src16[] = { |
| 104 0x00A8, 0x3003, 0x3005, 0x2015, 0xFF5E, 0x2016, 0x2026, 0x2018, 0x000D, 0x00
0A, |
| 105 0x2019, 0x201C, 0x201D, 0x3014, 0x3015, 0x3008, 0x3009, 0x300A, 0x000D, 0x00
0A, |
| 106 0x300B, 0x300C, 0x300D, 0x300E, 0x300F, 0x3016, 0x3017, 0x3010, 0x000D, 0x00
0A, |
| 107 0x3011, 0x00B1, 0x00D7, 0x00F7, 0x2236, 0x2227, 0x7FC1, 0x8956, 0x000D, 0x00
0A, |
| 108 0x9D2C, 0x9D0E, 0x9EC4, 0x5CA1, 0x6C96, 0x837B, 0x5104, 0x5C4B, 0x000D, 0x00
0A, |
| 109 0x61B6, 0x81C6, 0x6876, 0x7261, 0x4E59, 0x4FFA, 0x5378, 0x57F7, 0x000D, 0x00
0A, |
| 110 0x57F4, 0x57F9, 0x57FA, 0x57FC, 0x5800, 0x5802, 0x5805, 0x5806, 0x000D, 0x00
0A, |
| 111 0x580A, 0x581E, 0x6BB5, 0x6BB7, 0x6BBA, 0x6BBC, 0x9CE2, 0x977C, 0x000D, 0x00
0A, |
| 112 0x6BBF, 0x6BC1, 0x6BC5, 0x6BC6, 0x6BCB, 0x6BCD, 0x6BCF, 0x6BD2, 0x000D, 0x00
0A, |
| 113 0x6BD3, 0x6BD4, 0x6BD6, 0x6BD7, 0x6BD8, 0x6BDB, 0x6BEB, 0x6BEC, 0x000D, 0x00
0A, |
| 114 0x6C05, 0x6C08, 0x6C0F, 0x6C11, 0x6C13, 0x6C23, 0x6C34, 0x0041, 0x000D, 0x00
0A, |
| 115 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x000D, 0x00
0A, |
| 116 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x000D, 0x00
0A, |
| 117 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x000D, 0x00
0A, |
| 118 0x005B, 0x9792, 0x9CCC, 0x9CCD, 0x9CCE, 0x9CCF, 0x9CD0, 0x9CD3, 0x000D, 0x00
0A, |
| 119 0x9CD4, 0x9CD5, 0x9CD7, 0x9CD8, 0x9CD9, 0x9CDC, 0x9CDD, 0x9CDF, 0x000D, 0x00
0A, |
| 120 0x9785, 0x9791, 0x00BD, 0x0390, 0x0385, 0x0386, 0x0388, 0x0389, 0x000D, 0x00
0A, |
| 121 0x038E, 0x038F, 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x000D, 0x00
0A, |
| 122 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x038A, 0x038C, 0x039C, 0x000D, 0x00
0A, |
| 123 |
| 124 /* test non-BMP code points */ |
| 125 0xD869, 0xDE99, 0xD869, 0xDE9C, 0xD869, 0xDE9D, 0xD869, 0xDE9E, 0xD869, 0xDE
9F, |
| 126 0xD869, 0xDEA0, 0xD869, 0xDEA5, 0xD869, 0xDEA6, 0xD869, 0xDEA7, 0xD869, 0xDE
A8, |
| 127 0xD869, 0xDEAB, 0xD869, 0xDEAC, 0xD869, 0xDEAD, 0xD869, 0xDEAE, 0xD869, 0xDE
AF, |
| 128 0xD869, 0xDEB0, 0xD869, 0xDEB1, 0xD869, 0xDEB3, 0xD869, 0xDEB5, 0xD869, 0xDE
B6, |
| 129 0xD869, 0xDEB7, 0xD869, 0xDEB8, 0xD869, 0xDEB9, 0xD869, 0xDEBA, 0xD869, 0xDE
BB, |
| 130 0xD869, 0xDEBC, 0xD869, 0xDEBD, 0xD869, 0xDEBE, 0xD869, 0xDEBF, 0xD869, 0xDE
C0, |
| 131 0xD869, 0xDEC1, 0xD869, 0xDEC2, 0xD869, 0xDEC3, 0xD869, 0xDEC4, 0xD869, 0xDE
C8, |
| 132 0xD869, 0xDECA, 0xD869, 0xDECB, 0xD869, 0xDECD, 0xD869, 0xDECE, 0xD869, 0xDE
CF, |
| 133 0xD869, 0xDED0, 0xD869, 0xDED1, 0xD869, 0xDED2, 0xD869, 0xDED3, 0xD869, 0xDE
D4, |
| 134 0xD869, 0xDED5, |
| 135 |
| 136 0x4DB3, 0x4DB4, 0x4DB5, 0x4E00, 0x4E00, 0x4E01, 0x4E02, 0x4E03, 0x000D, 0x00
0A, |
| 137 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x33E0, 0x33E6, 0x000D, 0x00
0A, |
| 138 0x4E05, 0x4E07, 0x4E04, 0x4E08, 0x4E08, 0x4E09, 0x4E0A, 0x4E0B, 0x000D, 0x00
0A, |
| 139 0x4E0C, 0x0021, 0x0022, 0x0023, 0x0024, 0xFF40, 0xFF41, 0xFF42, 0x000D, 0x00
0A, |
| 140 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0x000D, 0x00
0A,0x0000 |
| 141 }; |
| 142 |
| 143 |
| 144 static void Test_strToUTF32(void){ |
| 145 UErrorCode err = U_ZERO_ERROR; |
| 146 UChar32 u32Target[400]; |
| 147 int32_t u32DestLen; |
| 148 int i= 0; |
| 149 |
| 150 /* first with length */ |
| 151 u32DestLen = -2; |
| 152 u_strToUTF32(u32Target, 0, &u32DestLen, src16, LENGTHOF(src16),&err); |
| 153 if(err != U_BUFFER_OVERFLOW_ERROR || u32DestLen != LENGTHOF(src32)) { |
| 154 log_err("u_strToUTF32(preflight with length): " |
| 155 "length %ld != %ld and %s != U_BUFFER_OVERFLOW_ERROR\n", |
| 156 (long)u32DestLen, (long)LENGTHOF(src32), u_errorName(err)); |
| 157 return; |
| 158 } |
| 159 err = U_ZERO_ERROR; |
| 160 u32DestLen = -2; |
| 161 u_strToUTF32(u32Target, LENGTHOF(src32)+1, &u32DestLen, src16, LENGTHOF(src1
6),&err); |
| 162 if(err != U_ZERO_ERROR || u32DestLen != LENGTHOF(src32)) { |
| 163 log_err("u_strToUTF32(with length): " |
| 164 "length %ld != %ld and %s != U_ZERO_ERROR\n", |
| 165 (long)u32DestLen, (long)LENGTHOF(src32), u_errorName(err)); |
| 166 return; |
| 167 } |
| 168 /*for(i=0; i< u32DestLen; i++){ |
| 169 printf("0x%08X, ",uTarget[i]); |
| 170 if(i%10==0){ |
| 171 printf("\n"); |
| 172 } |
| 173 }*/ |
| 174 for(i=0; i< LENGTHOF(src32); i++){ |
| 175 if(u32Target[i] != src32[i]){ |
| 176 log_verbose("u_strToUTF32(with length) failed expected: %04X got: %0
4X at index: %i \n", src32[i], u32Target[i],i); |
| 177 } |
| 178 } |
| 179 if(u32Target[i] != 0){ |
| 180 log_verbose("u_strToUTF32(with length) failed expected: %04X got: %04X a
t index: %i \n", 0, u32Target[i],i); |
| 181 } |
| 182 |
| 183 /* now NUL-terminated */ |
| 184 u32DestLen = -2; |
| 185 u_strToUTF32(NULL,0, &u32DestLen, src16, -1,&err); |
| 186 if(err != U_BUFFER_OVERFLOW_ERROR || u32DestLen != LENGTHOF(src32)-1) { |
| 187 log_err("u_strToUTF32(preflight with NUL-termination): " |
| 188 "length %ld != %ld and %s != U_BUFFER_OVERFLOW_ERROR\n", |
| 189 (long)u32DestLen, (long)LENGTHOF(src32)-1, u_errorName(err)); |
| 190 return; |
| 191 } |
| 192 err = U_ZERO_ERROR; |
| 193 u32DestLen = -2; |
| 194 u_strToUTF32(u32Target, LENGTHOF(src32), &u32DestLen, src16, -1,&err); |
| 195 if(err != U_ZERO_ERROR || u32DestLen != LENGTHOF(src32)-1) { |
| 196 log_err("u_strToUTF32(with NUL-termination): " |
| 197 "length %ld != %ld and %s != U_ZERO_ERROR\n", |
| 198 (long)u32DestLen, (long)LENGTHOF(src32)-1, u_errorName(err)); |
| 199 return; |
| 200 } |
| 201 |
| 202 for(i=0; i< LENGTHOF(src32); i++){ |
| 203 if(u32Target[i] != src32[i]){ |
| 204 log_verbose("u_strToUTF32(NUL-termination) failed expected: %04X got
: %04X \n", src32[i], u32Target[i]); |
| 205 } |
| 206 } |
| 207 } |
| 208 |
| 209 /* test unpaired surrogates */ |
| 210 static void Test_strToUTF32_surrogates() { |
| 211 UErrorCode err = U_ZERO_ERROR; |
| 212 UChar32 u32Target[400]; |
| 213 int32_t len16, u32DestLen; |
| 214 int32_t numSubstitutions; |
| 215 int i; |
| 216 |
| 217 static const UChar surr16[] = { 0x41, 0xd900, 0x61, 0xdc00, 0x5a, 0xd900, 0x
dc00, 0x7a, 0 }; |
| 218 static const UChar32 expected[] = { 0x5a, 0x50000, 0x7a, 0 }; |
| 219 static const UChar32 expected_FFFD[] = { 0x41, 0xfffd, 0x61, 0xfffd, 0x5a, 0
x50000, 0x7a, 0 }; |
| 220 static const UChar32 expected_12345[] = { 0x41, 0x12345, 0x61, 0x12345, 0x5a
, 0x50000, 0x7a, 0 }; |
| 221 len16 = LENGTHOF(surr16); |
| 222 for(i = 0; i < 4; ++i) { |
| 223 err = U_ZERO_ERROR; |
| 224 u_strToUTF32(u32Target, 0, &u32DestLen, surr16+i, len16-i, &err); |
| 225 if(err != U_INVALID_CHAR_FOUND) { |
| 226 log_err("u_strToUTF32(preflight surr16+%ld) sets %s != U_INVALID_CHA
R_FOUND\n", |
| 227 (long)i, u_errorName(err)); |
| 228 return; |
| 229 } |
| 230 |
| 231 err = U_ZERO_ERROR; |
| 232 u_strToUTF32(u32Target, LENGTHOF(u32Target), &u32DestLen, surr16+i, len1
6-i, &err); |
| 233 if(err != U_INVALID_CHAR_FOUND) { |
| 234 log_err("u_strToUTF32(surr16+%ld) sets %s != U_INVALID_CHAR_FOUND\n"
, |
| 235 (long)i, u_errorName(err)); |
| 236 return; |
| 237 } |
| 238 |
| 239 err = U_ZERO_ERROR; |
| 240 u_strToUTF32(NULL, 0, &u32DestLen, surr16+i, -1, &err); |
| 241 if(err != U_INVALID_CHAR_FOUND) { |
| 242 log_err("u_strToUTF32(preflight surr16+%ld/NUL) sets %s != U_INVALID
_CHAR_FOUND\n", |
| 243 (long)i, u_errorName(err)); |
| 244 return; |
| 245 } |
| 246 |
| 247 err = U_ZERO_ERROR; |
| 248 u_strToUTF32(u32Target, LENGTHOF(u32Target), &u32DestLen, surr16+i, -1,
&err); |
| 249 if(err != U_INVALID_CHAR_FOUND) { |
| 250 log_err("u_strToUTF32(surr16+%ld/NUL) sets %s != U_INVALID_CHAR_FOUN
D\n", |
| 251 (long)i, u_errorName(err)); |
| 252 return; |
| 253 } |
| 254 } |
| 255 |
| 256 err = U_ZERO_ERROR; |
| 257 u_strToUTF32(u32Target, 0, &u32DestLen, surr16+4, len16-4-1, &err); |
| 258 if(err != U_BUFFER_OVERFLOW_ERROR || u32DestLen != 3) { |
| 259 log_err("u_strToUTF32(preflight surr16+4) sets %s != U_BUFFER_OVERFLOW_E
RROR or an unexpected length\n", |
| 260 u_errorName(err)); |
| 261 return; |
| 262 } |
| 263 |
| 264 err = U_ZERO_ERROR; |
| 265 u_strToUTF32(u32Target, LENGTHOF(u32Target), &u32DestLen, surr16+4, len16-4-
1, &err); |
| 266 if(err != U_ZERO_ERROR || u32DestLen != 3 || uprv_memcmp(u32Target, expected
, 4*4)) { |
| 267 log_err("u_strToUTF32(surr16+4) sets %s != U_ZERO_ERROR or does not prod
uce the expected string\n", |
| 268 u_errorName(err)); |
| 269 return; |
| 270 } |
| 271 |
| 272 err = U_ZERO_ERROR; |
| 273 u_strToUTF32(NULL, 0, &u32DestLen, surr16+4, -1, &err); |
| 274 if(err != U_BUFFER_OVERFLOW_ERROR || u32DestLen != 3) { |
| 275 log_err("u_strToUTF32(preflight surr16+4/NUL) sets %s != U_BUFFER_OVERFL
OW_ERROR or an unexpected length\n", |
| 276 u_errorName(err)); |
| 277 return; |
| 278 } |
| 279 |
| 280 err = U_ZERO_ERROR; |
| 281 u_strToUTF32(u32Target, LENGTHOF(u32Target), &u32DestLen, surr16+4, -1, &err
); |
| 282 if(err != U_ZERO_ERROR || u32DestLen != 3 || uprv_memcmp(u32Target, expected
, 4*4)) { |
| 283 log_err("u_strToUTF32(surr16+4/NUL) sets %s != U_ZERO_ERROR or does not
produce the expected string\n", |
| 284 u_errorName(err)); |
| 285 return; |
| 286 } |
| 287 |
| 288 /* with substitution character */ |
| 289 numSubstitutions = -1; |
| 290 err = U_ZERO_ERROR; |
| 291 u_strToUTF32WithSub(u32Target, 0, &u32DestLen, surr16, len16-1, 0xfffd, &num
Substitutions, &err); |
| 292 if(err != U_BUFFER_OVERFLOW_ERROR || u32DestLen != 7 || numSubstitutions !=
2) { |
| 293 log_err("u_strToUTF32WithSub(preflight surr16) sets %s != U_BUFFER_OVERF
LOW_ERROR or an unexpected length\n", |
| 294 u_errorName(err)); |
| 295 return; |
| 296 } |
| 297 |
| 298 err = U_ZERO_ERROR; |
| 299 u_strToUTF32WithSub(u32Target, LENGTHOF(u32Target), &u32DestLen, surr16, len
16-1, 0xfffd, &numSubstitutions, &err); |
| 300 if(err != U_ZERO_ERROR || u32DestLen != 7 || numSubstitutions != 2 || uprv_m
emcmp(u32Target, expected_FFFD, 8*4)) { |
| 301 log_err("u_strToUTF32WithSub(surr16) sets %s != U_ZERO_ERROR or does not
produce the expected string\n", |
| 302 u_errorName(err)); |
| 303 return; |
| 304 } |
| 305 |
| 306 err = U_ZERO_ERROR; |
| 307 u_strToUTF32WithSub(NULL, 0, &u32DestLen, surr16, -1, 0x12345, &numSubstitut
ions, &err); |
| 308 if(err != U_BUFFER_OVERFLOW_ERROR || u32DestLen != 7 || numSubstitutions !=
2) { |
| 309 log_err("u_strToUTF32WithSub(preflight surr16/NUL) sets %s != U_BUFFER_O
VERFLOW_ERROR or an unexpected length\n", |
| 310 u_errorName(err)); |
| 311 return; |
| 312 } |
| 313 |
| 314 err = U_ZERO_ERROR; |
| 315 u_strToUTF32WithSub(u32Target, LENGTHOF(u32Target), &u32DestLen, surr16, -1,
0x12345, &numSubstitutions, &err); |
| 316 if(err != U_ZERO_ERROR || u32DestLen != 7 || numSubstitutions != 2 || uprv_m
emcmp(u32Target, expected_12345, 8*4)) { |
| 317 log_err("u_strToUTF32WithSub(surr16/NUL) sets %s != U_ZERO_ERROR or does
not produce the expected string\n", |
| 318 u_errorName(err)); |
| 319 return; |
| 320 } |
| 321 } |
| 322 |
| 323 static void Test_strFromUTF32(void){ |
| 324 UErrorCode err = U_ZERO_ERROR; |
| 325 UChar uTarget[400]; |
| 326 int32_t uDestLen; |
| 327 int i= 0; |
| 328 |
| 329 /* first with length */ |
| 330 uDestLen = -2; |
| 331 u_strFromUTF32(uTarget,0,&uDestLen,src32,LENGTHOF(src32),&err); |
| 332 if(err != U_BUFFER_OVERFLOW_ERROR || uDestLen != LENGTHOF(src16)) { |
| 333 log_err("u_strFromUTF32(preflight with length): " |
| 334 "length %ld != %ld and %s != U_BUFFER_OVERFLOW_ERROR\n", |
| 335 (long)uDestLen, (long)LENGTHOF(src16), u_errorName(err)); |
| 336 return; |
| 337 } |
| 338 err = U_ZERO_ERROR; |
| 339 uDestLen = -2; |
| 340 u_strFromUTF32(uTarget, LENGTHOF(src16)+1,&uDestLen,src32,LENGTHOF(src32),&e
rr); |
| 341 if(err != U_ZERO_ERROR || uDestLen != LENGTHOF(src16)) { |
| 342 log_err("u_strFromUTF32(with length): " |
| 343 "length %ld != %ld and %s != U_ZERO_ERROR\n", |
| 344 (long)uDestLen, (long)LENGTHOF(src16), u_errorName(err)); |
| 345 return; |
| 346 } |
| 347 /*for(i=0; i< uDestLen; i++){ |
| 348 printf("0x%04X, ",uTarget[i]); |
| 349 if(i%10==0){ |
| 350 printf("\n"); |
| 351 } |
| 352 }*/ |
| 353 |
| 354 for(i=0; i< uDestLen; i++){ |
| 355 if(uTarget[i] != src16[i]){ |
| 356 log_verbose("u_strFromUTF32(with length) failed expected: %04X got:
%04X at index: %i \n", src16[i] ,uTarget[i],i); |
| 357 } |
| 358 } |
| 359 if(uTarget[i] != 0){ |
| 360 log_verbose("u_strFromUTF32(with length) failed expected: %04X got: %04X
at index: %i \n", 0,uTarget[i],i); |
| 361 } |
| 362 |
| 363 /* now NUL-terminated */ |
| 364 uDestLen = -2; |
| 365 u_strFromUTF32(NULL,0,&uDestLen,src32,-1,&err); |
| 366 if(err != U_BUFFER_OVERFLOW_ERROR || uDestLen != LENGTHOF(src16)-1) { |
| 367 log_err("u_strFromUTF32(preflight with NUL-termination): " |
| 368 "length %ld != %ld and %s != U_BUFFER_OVERFLOW_ERROR\n", |
| 369 (long)uDestLen, (long)LENGTHOF(src16)-1, u_errorName(err)); |
| 370 return; |
| 371 } |
| 372 err = U_ZERO_ERROR; |
| 373 uDestLen = -2; |
| 374 u_strFromUTF32(uTarget, LENGTHOF(src16),&uDestLen,src32,-1,&err); |
| 375 if(err != U_ZERO_ERROR || uDestLen != LENGTHOF(src16)-1) { |
| 376 log_err("u_strFromUTF32(with NUL-termination): " |
| 377 "length %ld != %ld and %s != U_ZERO_ERROR\n", |
| 378 (long)uDestLen, (long)LENGTHOF(src16)-1, u_errorName(err)); |
| 379 return; |
| 380 } |
| 381 |
| 382 for(i=0; i< uDestLen; i++){ |
| 383 if(uTarget[i] != src16[i]){ |
| 384 log_verbose("u_strFromUTF32(with NUL-termination) failed expected: %
04X got: %04X \n", src16[i] ,uTarget[i]); |
| 385 } |
| 386 } |
| 387 } |
| 388 |
| 389 /* test surrogate code points */ |
| 390 static void Test_strFromUTF32_surrogates() { |
| 391 UErrorCode err = U_ZERO_ERROR; |
| 392 UChar uTarget[400]; |
| 393 int32_t len32, uDestLen; |
| 394 int32_t numSubstitutions; |
| 395 int i; |
| 396 |
| 397 static const UChar32 surr32[] = { 0x41, 0xd900, 0x61, 0xdc00, -1, 0x110000,
0x5a, 0x50000, 0x7a, 0 }; |
| 398 static const UChar expected[] = { 0x5a, 0xd900, 0xdc00, 0x7a, 0 }; |
| 399 static const UChar expected_FFFD[] = { 0x41, 0xfffd, 0x61, 0xfffd, 0xfffd, 0
xfffd, 0x5a, 0xd900, 0xdc00, 0x7a, 0 }; |
| 400 static const UChar expected_12345[] = { 0x41, 0xd808, 0xdf45, 0x61, 0xd808,
0xdf45, 0xd808, 0xdf45, 0xd808, 0xdf45, |
| 401 0x5a, 0xd900, 0xdc00, 0x7a, 0 }; |
| 402 len32 = LENGTHOF(surr32); |
| 403 for(i = 0; i < 6; ++i) { |
| 404 err = U_ZERO_ERROR; |
| 405 u_strFromUTF32(uTarget, 0, &uDestLen, surr32+i, len32-i, &err); |
| 406 if(err != U_INVALID_CHAR_FOUND) { |
| 407 log_err("u_strFromUTF32(preflight surr32+%ld) sets %s != U_INVALID_C
HAR_FOUND\n", |
| 408 (long)i, u_errorName(err)); |
| 409 return; |
| 410 } |
| 411 |
| 412 err = U_ZERO_ERROR; |
| 413 u_strFromUTF32(uTarget, LENGTHOF(uTarget), &uDestLen, surr32+i, len32-i,
&err); |
| 414 if(err != U_INVALID_CHAR_FOUND) { |
| 415 log_err("u_strFromUTF32(surr32+%ld) sets %s != U_INVALID_CHAR_FOUND\
n", |
| 416 (long)i, u_errorName(err)); |
| 417 return; |
| 418 } |
| 419 |
| 420 err = U_ZERO_ERROR; |
| 421 u_strFromUTF32(NULL, 0, &uDestLen, surr32+i, -1, &err); |
| 422 if(err != U_INVALID_CHAR_FOUND) { |
| 423 log_err("u_strFromUTF32(preflight surr32+%ld/NUL) sets %s != U_INVAL
ID_CHAR_FOUND\n", |
| 424 (long)i, u_errorName(err)); |
| 425 return; |
| 426 } |
| 427 |
| 428 err = U_ZERO_ERROR; |
| 429 u_strFromUTF32(uTarget, LENGTHOF(uTarget), &uDestLen, surr32+i, -1, &err
); |
| 430 if(err != U_INVALID_CHAR_FOUND) { |
| 431 log_err("u_strFromUTF32(surr32+%ld/NUL) sets %s != U_INVALID_CHAR_FO
UND\n", |
| 432 (long)i, u_errorName(err)); |
| 433 return; |
| 434 } |
| 435 } |
| 436 |
| 437 err = U_ZERO_ERROR; |
| 438 u_strFromUTF32(uTarget, 0, &uDestLen, surr32+6, len32-6-1, &err); |
| 439 if(err != U_BUFFER_OVERFLOW_ERROR || uDestLen != 4) { |
| 440 log_err("u_strFromUTF32(preflight surr32+6) sets %s != U_BUFFER_OVERFLOW
_ERROR or an unexpected length\n", |
| 441 u_errorName(err)); |
| 442 return; |
| 443 } |
| 444 |
| 445 err = U_ZERO_ERROR; |
| 446 u_strFromUTF32(uTarget, LENGTHOF(uTarget), &uDestLen, surr32+6, len32-6-1, &
err); |
| 447 if(err != U_ZERO_ERROR || uDestLen != 4 || u_memcmp(uTarget, expected, 5)) { |
| 448 log_err("u_strFromUTF32(surr32+6) sets %s != U_ZERO_ERROR or does not pr
oduce the expected string\n", |
| 449 u_errorName(err)); |
| 450 return; |
| 451 } |
| 452 |
| 453 err = U_ZERO_ERROR; |
| 454 u_strFromUTF32(NULL, 0, &uDestLen, surr32+6, -1, &err); |
| 455 if(err != U_BUFFER_OVERFLOW_ERROR || uDestLen != 4) { |
| 456 log_err("u_strFromUTF32(preflight surr32+6/NUL) sets %s != U_BUFFER_OVER
FLOW_ERROR or an unexpected length\n", |
| 457 u_errorName(err)); |
| 458 return; |
| 459 } |
| 460 |
| 461 err = U_ZERO_ERROR; |
| 462 u_strFromUTF32(uTarget, LENGTHOF(uTarget), &uDestLen, surr32+6, -1, &err); |
| 463 if(err != U_ZERO_ERROR || uDestLen != 4 || u_memcmp(uTarget, expected, 5)) { |
| 464 log_err("u_strFromUTF32(surr32+6/NUL) sets %s != U_ZERO_ERROR or does no
t produce the expected string\n", |
| 465 u_errorName(err)); |
| 466 return; |
| 467 } |
| 468 |
| 469 /* with substitution character */ |
| 470 numSubstitutions = -1; |
| 471 err = U_ZERO_ERROR; |
| 472 u_strFromUTF32WithSub(uTarget, 0, &uDestLen, surr32, len32-1, 0xfffd, &numSu
bstitutions, &err); |
| 473 if(err != U_BUFFER_OVERFLOW_ERROR || uDestLen != 10 || numSubstitutions != 4
) { |
| 474 log_err("u_strFromUTF32WithSub(preflight surr32) sets %s != U_BUFFER_OVE
RFLOW_ERROR or an unexpected length\n", |
| 475 u_errorName(err)); |
| 476 return; |
| 477 } |
| 478 |
| 479 err = U_ZERO_ERROR; |
| 480 u_strFromUTF32WithSub(uTarget, LENGTHOF(uTarget), &uDestLen, surr32, len32-1
, 0xfffd, &numSubstitutions, &err); |
| 481 if(err != U_ZERO_ERROR || uDestLen != 10 || numSubstitutions != 4 || u_memcm
p(uTarget, expected_FFFD, 11)) { |
| 482 log_err("u_strFromUTF32WithSub(surr32) sets %s != U_ZERO_ERROR or does n
ot produce the expected string\n", |
| 483 u_errorName(err)); |
| 484 return; |
| 485 } |
| 486 |
| 487 err = U_ZERO_ERROR; |
| 488 u_strFromUTF32WithSub(NULL, 0, &uDestLen, surr32, -1, 0x12345, &numSubstitut
ions, &err); |
| 489 if(err != U_BUFFER_OVERFLOW_ERROR || uDestLen != 14 || numSubstitutions != 4
) { |
| 490 log_err("u_strFromUTF32WithSub(preflight surr32/NUL) sets %s != U_BUFFER
_OVERFLOW_ERROR or an unexpected length\n", |
| 491 u_errorName(err)); |
| 492 return; |
| 493 } |
| 494 |
| 495 err = U_ZERO_ERROR; |
| 496 u_strFromUTF32WithSub(uTarget, LENGTHOF(uTarget), &uDestLen, surr32, -1, 0x1
2345, &numSubstitutions, &err); |
| 497 if(err != U_ZERO_ERROR || uDestLen != 14 || numSubstitutions != 4 || u_memcm
p(uTarget, expected_12345, 15)) { |
| 498 log_err("u_strFromUTF32WithSub(surr32/NUL) sets %s != U_ZERO_ERROR or do
es not produce the expected string\n", |
| 499 u_errorName(err)); |
| 500 return; |
| 501 } |
| 502 } |
| 503 |
| 504 static void Test_UChar_UTF8_API(void){ |
| 505 |
| 506 UErrorCode err = U_ZERO_ERROR; |
| 507 UChar uTemp[1]; |
| 508 char u8Temp[1]; |
| 509 UChar* uTarget=uTemp; |
| 510 const char* u8Src; |
| 511 int32_t u8SrcLen = 0; |
| 512 int32_t uTargetLength = 0; |
| 513 int32_t uDestLen=0; |
| 514 const UChar* uSrc = src16; |
| 515 int32_t uSrcLen = sizeof(src16)/2; |
| 516 char* u8Target = u8Temp; |
| 517 int32_t u8TargetLength =0; |
| 518 int32_t u8DestLen =0; |
| 519 UBool failed = FALSE; |
| 520 int i= 0; |
| 521 int32_t numSubstitutions; |
| 522 |
| 523 { |
| 524 /* preflight */ |
| 525 u8Temp[0] = 0x12; |
| 526 u_strToUTF8(u8Target,u8TargetLength, &u8DestLen, uSrc, uSrcLen,&err); |
| 527 if(err == U_BUFFER_OVERFLOW_ERROR && u8Temp[0] == 0x12){ |
| 528 err = U_ZERO_ERROR; |
| 529 u8Target = (char*) malloc (sizeof(uint8_t) * (u8DestLen+1)); |
| 530 u8TargetLength = u8DestLen; |
| 531 |
| 532 u8Target[u8TargetLength] = (char)0xfe; |
| 533 u8DestLen = -1; |
| 534 u_strToUTF8(u8Target,u8TargetLength, &u8DestLen, uSrc, uSrcLen,&err)
; |
| 535 if(U_FAILURE(err) || u8DestLen != u8TargetLength || u8Target[u8Targe
tLength] != (char)0xfe){ |
| 536 log_err("u_strToUTF8 failed after preflight. Error: %s\n", u_err
orName(err)); |
| 537 return; |
| 538 } |
| 539 |
| 540 } |
| 541 else { |
| 542 log_err("Should have gotten U_BUFFER_OVERFLOW_ERROR"); |
| 543 } |
| 544 failed = FALSE; |
| 545 /*for(i=0; i< u8DestLen; i++){ |
| 546 printf("0x%04X, ",u8Target[i]); |
| 547 if(i%10==0){ |
| 548 printf("\n"); |
| 549 } |
| 550 }*/ |
| 551 /*for(i=0; i< u8DestLen; i++){ |
| 552 if(u8Target[i] != src8[i]){ |
| 553 log_verbose("u_strToUTF8() failed expected: %04X got: %04X \n",
src8[i], u8Target[i]); |
| 554 failed =TRUE; |
| 555 } |
| 556 } |
| 557 if(failed){ |
| 558 log_err("u_strToUTF8() failed \n"); |
| 559 }*/ |
| 560 u8Src = u8Target; |
| 561 u8SrcLen = u8DestLen; |
| 562 |
| 563 /* preflight */ |
| 564 uTemp[0] = 0x1234; |
| 565 u_strFromUTF8(uTarget,uTargetLength,&uDestLen,u8Src,u8SrcLen,&err); |
| 566 if(err == U_BUFFER_OVERFLOW_ERROR && uTemp[0] == 0x1234){ |
| 567 err = U_ZERO_ERROR; |
| 568 uTarget = (UChar*) malloc( sizeof(UChar) * (uDestLen+1)); |
| 569 uTargetLength = uDestLen; |
| 570 |
| 571 uTarget[uTargetLength] = 0xfff0; |
| 572 uDestLen = -1; |
| 573 u_strFromUTF8(uTarget,uTargetLength,&uDestLen,u8Src,u8SrcLen,&err); |
| 574 } |
| 575 else { |
| 576 log_err("error: u_strFromUTF8(preflight) should have gotten U_BUFFER
_OVERFLOW_ERROR\n"); |
| 577 } |
| 578 /*for(i=0; i< uDestLen; i++){ |
| 579 printf("0x%04X, ",uTarget[i]); |
| 580 if(i%10==0){ |
| 581 printf("\n"); |
| 582 } |
| 583 }*/ |
| 584 |
| 585 if(U_FAILURE(err) || uDestLen != uTargetLength || uTarget[uTargetLength]
!= 0xfff0) { |
| 586 failed = TRUE; |
| 587 } |
| 588 for(i=0; i< uSrcLen; i++){ |
| 589 if(uTarget[i] != src16[i]){ |
| 590 log_verbose("u_strFromUTF8() failed expected: \\u%04X got: \\u%0
4X at index: %i \n", src16[i] ,uTarget[i],i); |
| 591 failed =TRUE; |
| 592 } |
| 593 } |
| 594 if(failed){ |
| 595 log_err("error: u_strFromUTF8(after preflighting) failed\n"); |
| 596 } |
| 597 |
| 598 free(u8Target); |
| 599 free(uTarget); |
| 600 } |
| 601 { |
| 602 u8SrcLen = -1; |
| 603 uTargetLength = 0; |
| 604 uSrcLen =-1; |
| 605 u8TargetLength=0; |
| 606 failed = FALSE; |
| 607 /* preflight */ |
| 608 u_strToUTF8(NULL,u8TargetLength, &u8DestLen, uSrc, uSrcLen,&err); |
| 609 if(err == U_BUFFER_OVERFLOW_ERROR){ |
| 610 err = U_ZERO_ERROR; |
| 611 u8Target = (char*) malloc (sizeof(uint8_t) * (u8DestLen+1)); |
| 612 u8TargetLength = u8DestLen; |
| 613 |
| 614 u_strToUTF8(u8Target,u8TargetLength, &u8DestLen, uSrc, uSrcLen,&err)
; |
| 615 |
| 616 } |
| 617 else { |
| 618 log_err("Should have gotten U_BUFFER_OVERFLOW_ERROR"); |
| 619 } |
| 620 failed = FALSE; |
| 621 /*for(i=0; i< u8DestLen; i++){ |
| 622 printf("0x%04X, ",u8Target[i]); |
| 623 if(i%10==0){ |
| 624 printf("\n"); |
| 625 } |
| 626 }*/ |
| 627 /*for(i=0; i< u8DestLen; i++){ |
| 628 if(u8Target[i] != src8[i]){ |
| 629 log_verbose("u_strToUTF8() failed expected: %04X got: %04X \n",
src8[i], u8Target[i]); |
| 630 failed =TRUE; |
| 631 } |
| 632 } |
| 633 if(failed){ |
| 634 log_err("u_strToUTF8() failed \n"); |
| 635 }*/ |
| 636 u8Src = u8Target; |
| 637 u8SrcLen = u8DestLen; |
| 638 |
| 639 /* preflight */ |
| 640 u_strFromUTF8(NULL,uTargetLength,&uDestLen,u8Src,u8SrcLen,&err); |
| 641 if(err == U_BUFFER_OVERFLOW_ERROR){ |
| 642 err = U_ZERO_ERROR; |
| 643 uTarget = (UChar*) malloc( sizeof(UChar) * (uDestLen+1)); |
| 644 uTargetLength = uDestLen; |
| 645 |
| 646 u_strFromUTF8(uTarget,uTargetLength,&uDestLen,u8Src,u8SrcLen,&err); |
| 647 } |
| 648 else { |
| 649 log_err("Should have gotten U_BUFFER_OVERFLOW_ERROR"); |
| 650 } |
| 651 /*for(i=0; i< uDestLen; i++){ |
| 652 printf("0x%04X, ",uTarget[i]); |
| 653 if(i%10==0){ |
| 654 printf("\n"); |
| 655 } |
| 656 }*/ |
| 657 |
| 658 for(i=0; i< uSrcLen; i++){ |
| 659 if(uTarget[i] != src16[i]){ |
| 660 log_verbose("u_strFromUTF8() failed expected: \\u%04X got: \\u%0
4X at index: %i \n", src16[i] ,uTarget[i],i); |
| 661 failed =TRUE; |
| 662 } |
| 663 } |
| 664 if(failed){ |
| 665 log_err("u_strToUTF8() failed \n"); |
| 666 } |
| 667 |
| 668 free(u8Target); |
| 669 free(uTarget); |
| 670 } |
| 671 |
| 672 /* test UTF-8 with single surrogates - illegal in Unicode 3.2 */ |
| 673 { |
| 674 static const UChar |
| 675 withLead16[]={ 0x1800, 0xd89a, 0x0061 }, |
| 676 withTrail16[]={ 0x1800, 0xdcba, 0x0061, 0 }, |
| 677 withTrail16SubFFFD[]={ 0x1800, 0xfffd, 0x0061, 0 }, /* sub==U+FFFD *
/ |
| 678 withTrail16Sub50005[]={ 0x1800, 0xd900, 0xdc05, 0x0061, 0 }; /* sub=
=U+50005 */ |
| 679 static const uint8_t |
| 680 withLead8[]={ 0xe1, 0xa0, 0x80, 0xed, 0xa2, 0x9a, 0x61 }, |
| 681 withTrail8[]={ 0xe1, 0xa0, 0x80, 0xed, 0xb2, 0xba, 0x61, 0 }, |
| 682 withTrail8Sub1A[]={ 0xe1, 0xa0, 0x80, 0x1a, 0x61, 0 }, /* sub==U+001
A */ |
| 683 withTrail8SubFFFD[]={ 0xe1, 0xa0, 0x80, 0xef, 0xbf, 0xbd, 0x61, 0 };
/* sub==U+FFFD */ |
| 684 UChar out16[10]; |
| 685 char out8[10]; |
| 686 |
| 687 if( |
| 688 (err=U_ZERO_ERROR, u_strToUTF8(out8, LENGTHOF(out8), NULL, withLead1
6, LENGTHOF(withLead16), &err), err!=U_INVALID_CHAR_FOUND) || |
| 689 (err=U_ZERO_ERROR, u_strToUTF8(out8, LENGTHOF(out8), NULL, withTrail
16, -1, &err), err!=U_INVALID_CHAR_FOUND) || |
| 690 (err=U_ZERO_ERROR, u_strFromUTF8(out16, LENGTHOF(out16), NULL, (cons
t char *)withLead8, LENGTHOF(withLead8), &err), err!=U_INVALID_CHAR_FOUND) || |
| 691 (err=U_ZERO_ERROR, u_strFromUTF8(out16, LENGTHOF(out16), NULL, (cons
t char *)withTrail8, -1, &err), err!=U_INVALID_CHAR_FOUND) |
| 692 ) { |
| 693 log_err("error: u_strTo/FromUTF8(string with single surrogate) fails
to report error\n"); |
| 694 } |
| 695 |
| 696 /* test error handling with substitution characters */ |
| 697 |
| 698 /* from UTF-8 with length */ |
| 699 err=U_ZERO_ERROR; |
| 700 numSubstitutions=-1; |
| 701 out16[0]=0x55aa; |
| 702 uDestLen=0; |
| 703 u_strFromUTF8WithSub(out16, LENGTHOF(out16), &uDestLen, |
| 704 (const char *)withTrail8, uprv_strlen((const char *
)withTrail8), |
| 705 0x50005, &numSubstitutions, |
| 706 &err); |
| 707 if(U_FAILURE(err) || uDestLen!=u_strlen(withTrail16Sub50005) || |
| 708 0!=u_memcmp(withTrail16Sub50005, out16, uDestLen+1)
|| |
| 709 numSubstitutions!=1) { |
| 710 log_err("error: u_strFromUTF8WithSub(length) failed\n"); |
| 711 } |
| 712 |
| 713 /* from UTF-8 with NUL termination */ |
| 714 err=U_ZERO_ERROR; |
| 715 numSubstitutions=-1; |
| 716 out16[0]=0x55aa; |
| 717 uDestLen=0; |
| 718 u_strFromUTF8WithSub(out16, LENGTHOF(out16), &uDestLen, |
| 719 (const char *)withTrail8, -1, |
| 720 0xfffd, &numSubstitutions, |
| 721 &err); |
| 722 if(U_FAILURE(err) || uDestLen!=u_strlen(withTrail16SubFFFD) || |
| 723 0!=u_memcmp(withTrail16SubFFFD, out16, uDestLen+1)
|| |
| 724 numSubstitutions!=1) { |
| 725 log_err("error: u_strFromUTF8WithSub(NUL termination) failed\n"); |
| 726 } |
| 727 |
| 728 /* preflight from UTF-8 with NUL termination */ |
| 729 err=U_ZERO_ERROR; |
| 730 numSubstitutions=-1; |
| 731 out16[0]=0x55aa; |
| 732 uDestLen=0; |
| 733 u_strFromUTF8WithSub(out16, 1, &uDestLen, |
| 734 (const char *)withTrail8, -1, |
| 735 0x50005, &numSubstitutions, |
| 736 &err); |
| 737 if(err!=U_BUFFER_OVERFLOW_ERROR || uDestLen!=u_strlen(withTrail16Sub5000
5) || numSubstitutions!=1) { |
| 738 log_err("error: u_strFromUTF8WithSub(preflight/NUL termination) fail
ed\n"); |
| 739 } |
| 740 |
| 741 /* to UTF-8 with length */ |
| 742 err=U_ZERO_ERROR; |
| 743 numSubstitutions=-1; |
| 744 out8[0]=(char)0xf5; |
| 745 u8DestLen=0; |
| 746 u_strToUTF8WithSub(out8, LENGTHOF(out8), &u8DestLen, |
| 747 withTrail16, u_strlen(withTrail16), |
| 748 0xfffd, &numSubstitutions, |
| 749 &err); |
| 750 if(U_FAILURE(err) || u8DestLen!=uprv_strlen((const char *)withTrail8SubF
FFD) || |
| 751 0!=uprv_memcmp((const char *)withTrail8SubFFFD, out
8, u8DestLen+1) || |
| 752 numSubstitutions!=1) { |
| 753 log_err("error: u_strToUTF8WithSub(length) failed\n"); |
| 754 } |
| 755 |
| 756 /* to UTF-8 with NUL termination */ |
| 757 err=U_ZERO_ERROR; |
| 758 numSubstitutions=-1; |
| 759 out8[0]=(char)0xf5; |
| 760 u8DestLen=0; |
| 761 u_strToUTF8WithSub(out8, LENGTHOF(out8), &u8DestLen, |
| 762 withTrail16, -1, |
| 763 0x1a, &numSubstitutions, |
| 764 &err); |
| 765 if(U_FAILURE(err) || u8DestLen!=uprv_strlen((const char *)withTrail8Sub1
A) || |
| 766 0!=uprv_memcmp((const char *)withTrail8Sub1A, out8,
u8DestLen+1) || |
| 767 numSubstitutions!=1) { |
| 768 log_err("error: u_strToUTF8WithSub(NUL termination) failed\n"); |
| 769 } |
| 770 |
| 771 /* preflight to UTF-8 with NUL termination */ |
| 772 err=U_ZERO_ERROR; |
| 773 numSubstitutions=-1; |
| 774 out8[0]=(char)0xf5; |
| 775 u8DestLen=0; |
| 776 u_strToUTF8WithSub(out8, 1, &u8DestLen, |
| 777 withTrail16, -1, |
| 778 0xfffd, &numSubstitutions, |
| 779 &err); |
| 780 if(err!=U_BUFFER_OVERFLOW_ERROR || u8DestLen!=uprv_strlen((const char *)
withTrail8SubFFFD) || |
| 781 numSubstitutions!=1) { |
| 782 log_err("error: u_strToUTF8WithSub(preflight/NUL termination) failed
\n"); |
| 783 } |
| 784 |
| 785 /* test that numSubstitutions==0 if there are no substitutions */ |
| 786 |
| 787 /* from UTF-8 with length (just first 3 bytes which are valid) */ |
| 788 err=U_ZERO_ERROR; |
| 789 numSubstitutions=-1; |
| 790 out16[0]=0x55aa; |
| 791 uDestLen=0; |
| 792 u_strFromUTF8WithSub(out16, LENGTHOF(out16), &uDestLen, |
| 793 (const char *)withTrail8, 3, |
| 794 0x50005, &numSubstitutions, |
| 795 &err); |
| 796 if(U_FAILURE(err) || uDestLen!=1 || |
| 797 0!=u_memcmp(withTrail16Sub50005, out16, uDestLen) |
| |
| 798 numSubstitutions!=0) { |
| 799 log_err("error: u_strFromUTF8WithSub(no subs) failed\n"); |
| 800 } |
| 801 |
| 802 /* to UTF-8 with length (just first UChar which is valid) */ |
| 803 err=U_ZERO_ERROR; |
| 804 numSubstitutions=-1; |
| 805 out8[0]=(char)0xf5; |
| 806 u8DestLen=0; |
| 807 u_strToUTF8WithSub(out8, LENGTHOF(out8), &u8DestLen, |
| 808 withTrail16, 1, |
| 809 0xfffd, &numSubstitutions, |
| 810 &err); |
| 811 if(U_FAILURE(err) || u8DestLen!=3 || |
| 812 0!=uprv_memcmp((const char *)withTrail8SubFFFD, out
8, u8DestLen) || |
| 813 numSubstitutions!=0) { |
| 814 log_err("error: u_strToUTF8WithSub(no subs) failed\n"); |
| 815 } |
| 816 |
| 817 /* test that numSubstitutions==0 if subchar==U_SENTINEL (no subchar) */ |
| 818 |
| 819 /* from UTF-8 with length (just first 3 bytes which are valid) */ |
| 820 err=U_ZERO_ERROR; |
| 821 numSubstitutions=-1; |
| 822 out16[0]=0x55aa; |
| 823 uDestLen=0; |
| 824 u_strFromUTF8WithSub(out16, LENGTHOF(out16), &uDestLen, |
| 825 (const char *)withTrail8, 3, |
| 826 U_SENTINEL, &numSubstitutions, |
| 827 &err); |
| 828 if(U_FAILURE(err) || uDestLen!=1 || |
| 829 0!=u_memcmp(withTrail16Sub50005, out16, uDestLen) |
| |
| 830 numSubstitutions!=0) { |
| 831 log_err("error: u_strFromUTF8WithSub(no subchar) failed\n"); |
| 832 } |
| 833 |
| 834 /* to UTF-8 with length (just first UChar which is valid) */ |
| 835 err=U_ZERO_ERROR; |
| 836 numSubstitutions=-1; |
| 837 out8[0]=(char)0xf5; |
| 838 u8DestLen=0; |
| 839 u_strToUTF8WithSub(out8, LENGTHOF(out8), &u8DestLen, |
| 840 withTrail16, 1, |
| 841 U_SENTINEL, &numSubstitutions, |
| 842 &err); |
| 843 if(U_FAILURE(err) || u8DestLen!=3 || |
| 844 0!=uprv_memcmp((const char *)withTrail8SubFFFD, out
8, u8DestLen) || |
| 845 numSubstitutions!=0) { |
| 846 log_err("error: u_strToUTF8WithSub(no subchar) failed\n"); |
| 847 } |
| 848 } |
| 849 } |
| 850 |
| 851 /* compare if two strings are equal, but match 0xfffd in the second string with
anything in the first */ |
| 852 static UBool |
| 853 equalAnyFFFD(const UChar *s, const UChar *t, int32_t length) { |
| 854 UChar c1, c2; |
| 855 |
| 856 while(length>0) { |
| 857 c1=*s++; |
| 858 c2=*t++; |
| 859 if(c1!=c2 && c2!=0xfffd) { |
| 860 return FALSE; |
| 861 } |
| 862 --length; |
| 863 } |
| 864 return TRUE; |
| 865 } |
| 866 |
| 867 /* test u_strFromUTF8Lenient() */ |
| 868 static void |
| 869 Test_FromUTF8(void) { |
| 870 /* |
| 871 * Test case from icu-support list 20071130 "u_strFromUTF8() returns U_INVAL
ID_CHAR_FOUND(10)" |
| 872 */ |
| 873 static const uint8_t bytes[]={ 0xe0, 0xa5, 0x9c, 0 }; |
| 874 UChar dest[64]; |
| 875 UChar *destPointer; |
| 876 int32_t destLength; |
| 877 UErrorCode errorCode; |
| 878 |
| 879 /* 3 bytes input, one UChar output (U+095C) */ |
| 880 errorCode=U_ZERO_ERROR; |
| 881 destLength=-99; |
| 882 destPointer=u_strFromUTF8(NULL, 0, &destLength, (const char *)bytes, 3, &err
orCode); |
| 883 if(errorCode!=U_BUFFER_OVERFLOW_ERROR || destPointer!=NULL || destLength!=1)
{ |
| 884 log_err("error: u_strFromUTF8(preflight srcLength=3) fails: destLength=%
ld - %s\n", |
| 885 (long)destLength, u_errorName(errorCode)); |
| 886 } |
| 887 |
| 888 /* 4 bytes input, two UChars output (U+095C U+0000) */ |
| 889 errorCode=U_ZERO_ERROR; |
| 890 destLength=-99; |
| 891 destPointer=u_strFromUTF8(NULL, 0, &destLength, (const char *)bytes, 4, &err
orCode); |
| 892 if(errorCode!=U_BUFFER_OVERFLOW_ERROR || destPointer!=NULL || destLength!=2)
{ |
| 893 log_err("error: u_strFromUTF8(preflight srcLength=4) fails: destLength=%
ld - %s\n", |
| 894 (long)destLength, u_errorName(errorCode)); |
| 895 } |
| 896 |
| 897 /* NUL-terminated 3 bytes input, one UChar output (U+095C) */ |
| 898 errorCode=U_ZERO_ERROR; |
| 899 destLength=-99; |
| 900 destPointer=u_strFromUTF8(NULL, 0, &destLength, (const char *)bytes, -1, &er
rorCode); |
| 901 if(errorCode!=U_BUFFER_OVERFLOW_ERROR || destPointer!=NULL || destLength!=1)
{ |
| 902 log_err("error: u_strFromUTF8(preflight srcLength=-1) fails: destLength=
%ld - %s\n", |
| 903 (long)destLength, u_errorName(errorCode)); |
| 904 } |
| 905 |
| 906 /* 3 bytes input, one UChar output (U+095C), transform not just preflight */ |
| 907 errorCode=U_ZERO_ERROR; |
| 908 dest[0]=dest[1]=99; |
| 909 destLength=-99; |
| 910 destPointer=u_strFromUTF8(dest, LENGTHOF(dest), &destLength, (const char *)b
ytes, 3, &errorCode); |
| 911 if(U_FAILURE(errorCode) || destPointer!=dest || destLength!=1 || dest[0]!=0x
95c || dest[1]!=0) { |
| 912 log_err("error: u_strFromUTF8(transform srcLength=3) fails: destLength=%
ld - %s\n", |
| 913 (long)destLength, u_errorName(errorCode)); |
| 914 } |
| 915 } |
| 916 |
| 917 /* test u_strFromUTF8Lenient() */ |
| 918 static void |
| 919 Test_FromUTF8Lenient(void) { |
| 920 /* |
| 921 * Multiple input strings, each NUL-terminated. |
| 922 * Terminate with a string starting with 0xff. |
| 923 */ |
| 924 static const uint8_t bytes[]={ |
| 925 /* well-formed UTF-8 */ |
| 926 0x61, 0xc3, 0x9f, 0xe0, 0xa0, 0x80, 0xf0, 0xa0, 0x80, 0x80, |
| 927 0x62, 0xc3, 0xa0, 0xe0, 0xa0, 0x81, 0xf0, 0xa0, 0x80, 0x81, 0, |
| 928 |
| 929 /* various malformed sequences */ |
| 930 0xc3, 0xc3, 0x9f, 0xc3, 0xa0, 0xe0, 0x80, 0x8a, 0xf0, 0x41, 0x42, 0x4
3, 0, |
| 931 |
| 932 /* truncated input */ |
| 933 0xc3, 0, |
| 934 0xe0, 0, |
| 935 0xe0, 0xa0, 0, |
| 936 0xf0, 0, |
| 937 0xf0, 0x90, 0, |
| 938 0xf0, 0x90, 0x80, 0, |
| 939 |
| 940 /* non-ASCII characters in the last few bytes */ |
| 941 0x61, 0xc3, 0x9f, 0xe0, 0xa0, 0x80, 0, |
| 942 0x61, 0xe0, 0xa0, 0x80, 0xc3, 0x9f, 0, |
| 943 |
| 944 /* empty string */ |
| 945 0, |
| 946 |
| 947 /* finish */ |
| 948 0xff, 0 |
| 949 }; |
| 950 |
| 951 /* Multiple output strings, each NUL-terminated. 0xfffd matches anything. */ |
| 952 static const UChar uchars[]={ |
| 953 0x61, 0xdf, 0x800, 0xd840, 0xdc00, |
| 954 0x62, 0xe0, 0x801, 0xd840, 0xdc01, 0, |
| 955 |
| 956 0xfffd, 0x9f, 0xe0, 0xa, 0xfffd, 0xfffd, 0, |
| 957 |
| 958 0xfffd, 0, |
| 959 0xfffd, 0, |
| 960 0xfffd, 0, |
| 961 0xfffd, 0, |
| 962 0xfffd, 0, |
| 963 0xfffd, 0, |
| 964 |
| 965 0x61, 0xdf, 0x800, 0, |
| 966 0x61, 0x800, 0xdf, 0, |
| 967 |
| 968 0, |
| 969 |
| 970 0 |
| 971 }; |
| 972 |
| 973 UChar dest[64]; |
| 974 const char *pb; |
| 975 const UChar *pu, *pDest; |
| 976 int32_t srcLength, destLength0, destLength; |
| 977 int number; |
| 978 UErrorCode errorCode; |
| 979 |
| 980 /* verify checking for some illegal arguments */ |
| 981 dest[0]=0x1234; |
| 982 destLength=-1; |
| 983 errorCode=U_ZERO_ERROR; |
| 984 pDest=u_strFromUTF8Lenient(dest, 1, &destLength, NULL, -1, &errorCode); |
| 985 if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || dest[0]!=0x1234) { |
| 986 log_err("u_strFromUTF8Lenient(src=NULL) failed\n"); |
| 987 } |
| 988 |
| 989 dest[0]=0x1234; |
| 990 destLength=-1; |
| 991 errorCode=U_ZERO_ERROR; |
| 992 pDest=u_strFromUTF8Lenient(NULL, 1, &destLength, (const char *)bytes, -1, &e
rrorCode); |
| 993 if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) { |
| 994 log_err("u_strFromUTF8Lenient(dest=NULL[1]) failed\n"); |
| 995 } |
| 996 |
| 997 dest[0]=0x1234; |
| 998 destLength=-1; |
| 999 errorCode=U_MEMORY_ALLOCATION_ERROR; |
| 1000 pDest=u_strFromUTF8Lenient(dest, 1, &destLength, (const char *)bytes, -1, &e
rrorCode); |
| 1001 if(errorCode!=U_MEMORY_ALLOCATION_ERROR || dest[0]!=0x1234) { |
| 1002 log_err("u_strFromUTF8Lenient(U_MEMORY_ALLOCATION_ERROR) failed\n"); |
| 1003 } |
| 1004 |
| 1005 dest[0]=0x1234; |
| 1006 destLength=-1; |
| 1007 errorCode=U_MEMORY_ALLOCATION_ERROR; |
| 1008 pDest=u_strFromUTF8Lenient(dest, 1, &destLength, (const char *)bytes, -1, NU
LL); |
| 1009 if(dest[0]!=0x1234) { |
| 1010 log_err("u_strFromUTF8Lenient(pErrorCode=NULL) failed\n"); |
| 1011 } |
| 1012 |
| 1013 /* test normal behavior */ |
| 1014 number=0; /* string number for log_err() */ |
| 1015 |
| 1016 for(pb=(const char *)bytes, pu=uchars; |
| 1017 *pb!=(char)0xff; |
| 1018 pb+=srcLength+1, pu+=destLength0+1, ++number |
| 1019 ) { |
| 1020 srcLength=uprv_strlen(pb); |
| 1021 destLength0=u_strlen(pu); |
| 1022 |
| 1023 /* preflighting with NUL-termination */ |
| 1024 dest[0]=0x1234; |
| 1025 destLength=-1; |
| 1026 errorCode=U_ZERO_ERROR; |
| 1027 pDest=u_strFromUTF8Lenient(NULL, 0, &destLength, pb, -1, &errorCode); |
| 1028 if (errorCode!= (destLength0==0 ? U_STRING_NOT_TERMINATED_WARNING : U_BU
FFER_OVERFLOW_ERROR) || |
| 1029 pDest!=NULL || dest[0]!=0x1234 || destLength!=destLength0 |
| 1030 ) { |
| 1031 log_err("u_strFromUTF8Lenient(%d preflighting with NUL-termination)
failed\n", number); |
| 1032 } |
| 1033 |
| 1034 /* preflighting/some capacity with NUL-termination */ |
| 1035 if(srcLength>0) { |
| 1036 dest[destLength0-1]=0x1234; |
| 1037 destLength=-1; |
| 1038 errorCode=U_ZERO_ERROR; |
| 1039 pDest=u_strFromUTF8Lenient(dest, destLength0-1, &destLength, pb, -1,
&errorCode); |
| 1040 if (errorCode!=U_BUFFER_OVERFLOW_ERROR || |
| 1041 dest[destLength0-1]!=0x1234 || destLength!=destLength0 |
| 1042 ) { |
| 1043 log_err("u_strFromUTF8Lenient(%d preflighting/some capacity with
NUL-termination) failed\n", number); |
| 1044 } |
| 1045 } |
| 1046 |
| 1047 /* conversion with NUL-termination, much capacity */ |
| 1048 dest[0]=dest[destLength0]=0x1234; |
| 1049 destLength=-1; |
| 1050 errorCode=U_ZERO_ERROR; |
| 1051 pDest=u_strFromUTF8Lenient(dest, LENGTHOF(dest), &destLength, pb, -1, &e
rrorCode); |
| 1052 if (errorCode!=U_ZERO_ERROR || |
| 1053 pDest!=dest || dest[destLength0]!=0 || |
| 1054 destLength!=destLength0 || !equalAnyFFFD(dest, pu, destLength) |
| 1055 ) { |
| 1056 log_err("u_strFromUTF8Lenient(%d conversion with NUL-termination, mu
ch capacity) failed\n", number); |
| 1057 } |
| 1058 |
| 1059 /* conversion with NUL-termination, exact capacity */ |
| 1060 dest[0]=dest[destLength0]=0x1234; |
| 1061 destLength=-1; |
| 1062 errorCode=U_ZERO_ERROR; |
| 1063 pDest=u_strFromUTF8Lenient(dest, destLength0, &destLength, pb, -1, &erro
rCode); |
| 1064 if (errorCode!=U_STRING_NOT_TERMINATED_WARNING || |
| 1065 pDest!=dest || dest[destLength0]!=0x1234 || |
| 1066 destLength!=destLength0 || !equalAnyFFFD(dest, pu, destLength) |
| 1067 ) { |
| 1068 log_err("u_strFromUTF8Lenient(%d conversion with NUL-termination, ex
act capacity) failed\n", number); |
| 1069 } |
| 1070 |
| 1071 /* preflighting with length */ |
| 1072 dest[0]=0x1234; |
| 1073 destLength=-1; |
| 1074 errorCode=U_ZERO_ERROR; |
| 1075 pDest=u_strFromUTF8Lenient(NULL, 0, &destLength, pb, srcLength, &errorCo
de); |
| 1076 if (errorCode!= (destLength0==0 ? U_STRING_NOT_TERMINATED_WARNING : U_BU
FFER_OVERFLOW_ERROR) || |
| 1077 pDest!=NULL || dest[0]!=0x1234 || destLength!=srcLength |
| 1078 ) { |
| 1079 log_err("u_strFromUTF8Lenient(%d preflighting with length) failed\n"
, number); |
| 1080 } |
| 1081 |
| 1082 /* preflighting/some capacity with length */ |
| 1083 if(srcLength>0) { |
| 1084 dest[srcLength-1]=0x1234; |
| 1085 destLength=-1; |
| 1086 errorCode=U_ZERO_ERROR; |
| 1087 pDest=u_strFromUTF8Lenient(dest, srcLength-1, &destLength, pb, srcLe
ngth, &errorCode); |
| 1088 if (errorCode!=U_BUFFER_OVERFLOW_ERROR || |
| 1089 dest[srcLength-1]!=0x1234 || destLength!=srcLength |
| 1090 ) { |
| 1091 log_err("u_strFromUTF8Lenient(%d preflighting/some capacity with
length) failed\n", number); |
| 1092 } |
| 1093 } |
| 1094 |
| 1095 /* conversion with length, much capacity */ |
| 1096 dest[0]=dest[destLength0]=0x1234; |
| 1097 destLength=-1; |
| 1098 errorCode=U_ZERO_ERROR; |
| 1099 pDest=u_strFromUTF8Lenient(dest, LENGTHOF(dest), &destLength, pb, srcLen
gth, &errorCode); |
| 1100 if (errorCode!=U_ZERO_ERROR || |
| 1101 pDest!=dest || dest[destLength0]!=0 || |
| 1102 destLength!=destLength0 || !equalAnyFFFD(dest, pu, destLength) |
| 1103 ) { |
| 1104 log_err("u_strFromUTF8Lenient(%d conversion with length, much capaci
ty) failed\n", number); |
| 1105 } |
| 1106 |
| 1107 /* conversion with length, srcLength capacity */ |
| 1108 dest[0]=dest[srcLength]=dest[destLength0]=0x1234; |
| 1109 destLength=-1; |
| 1110 errorCode=U_ZERO_ERROR; |
| 1111 pDest=u_strFromUTF8Lenient(dest, srcLength, &destLength, pb, srcLength,
&errorCode); |
| 1112 if(srcLength==destLength0) { |
| 1113 if (errorCode!=U_STRING_NOT_TERMINATED_WARNING || |
| 1114 pDest!=dest || dest[destLength0]!=0x1234 || |
| 1115 destLength!=destLength0 || !equalAnyFFFD(dest, pu, destLength) |
| 1116 ) { |
| 1117 log_err("u_strFromUTF8Lenient(%d conversion with length, srcLeng
th capacity/not terminated) failed\n", number); |
| 1118 } |
| 1119 } else { |
| 1120 if (errorCode!=U_ZERO_ERROR || |
| 1121 pDest!=dest || dest[destLength0]!=0 || |
| 1122 destLength!=destLength0 || !equalAnyFFFD(dest, pu, destLength) |
| 1123 ) { |
| 1124 log_err("u_strFromUTF8Lenient(%d conversion with length, srcLeng
th capacity/terminated) failed\n", number); |
| 1125 } |
| 1126 } |
| 1127 } |
| 1128 } |
| 1129 |
| 1130 static const uint16_t src16j[] = { |
| 1131 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x000D, 0x00
0A, |
| 1132 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x000D, 0x00
0A, |
| 1133 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x000D, 0x00
0A, |
| 1134 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x000D, 0x00
0A, |
| 1135 0x0000, |
| 1136 /* Test only ASCII */ |
| 1137 |
| 1138 }; |
| 1139 static const uint16_t src16WithNulls[] = { |
| 1140 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0000, |
| 1141 0x0048, 0x0049, 0x004A, 0x000D, 0x000A, 0x0000, |
| 1142 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0000, |
| 1143 0x0050, 0x0051, 0x0052, 0x000D, 0x000A, 0x0000, |
| 1144 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0000, |
| 1145 0x0058, 0x0059, 0x005A, 0x000D, 0x000A, 0x0000, |
| 1146 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0000, |
| 1147 0x0058, 0x0059, 0x005A, 0x000D, 0x000A, 0x0000, |
| 1148 /* test only ASCII */ |
| 1149 /* |
| 1150 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, |
| 1151 0x00AE, 0x00AF, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00
B7, |
| 1152 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, 0x00C0, 0x00
C1, |
| 1153 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00
CB, |
| 1154 0x00CC, 0x00CD, 0x00CE, 0x00CF, 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00
D5, |
| 1155 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00
DF, |
| 1156 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00
E9, |
| 1157 0x0054, 0x0000 */ |
| 1158 |
| 1159 }; |
| 1160 static void Test_UChar_WCHART_API(void){ |
| 1161 #if (defined(U_WCHAR_IS_UTF16) || defined(U_WCHAR_IS_UTF32)) || (!UCONFIG_NO_CON
VERSION && !UCONFIG_NO_LEGACY_CONVERSION) |
| 1162 UErrorCode err = U_ZERO_ERROR; |
| 1163 const UChar* uSrc = src16j; |
| 1164 int32_t uSrcLen = sizeof(src16j)/2; |
| 1165 wchar_t* wDest = NULL; |
| 1166 int32_t wDestLen = 0; |
| 1167 int32_t reqLen= 0 ; |
| 1168 UBool failed = FALSE; |
| 1169 UChar* uDest = NULL; |
| 1170 int32_t uDestLen = 0; |
| 1171 int i =0; |
| 1172 { |
| 1173 /* Bad UErrorCode arguments. Make sure that the API doesn't crash, and t
hat Purify doesn't complain. */ |
| 1174 if (u_strFromWCS(NULL,0,NULL,NULL,0,NULL) != NULL) { |
| 1175 log_err("u_strFromWCS() should return NULL with a bad argument\n"); |
| 1176 } |
| 1177 if (u_strToWCS(NULL,0,NULL,NULL,0,NULL) != NULL) { |
| 1178 log_err("u_strToWCS() should return NULL with a bad argument\n"); |
| 1179 } |
| 1180 |
| 1181 /* NULL source & destination. */ |
| 1182 err = U_ZERO_ERROR; |
| 1183 u_strFromWCS(NULL,0,NULL,NULL,0,&err); |
| 1184 if (err != U_STRING_NOT_TERMINATED_WARNING) { |
| 1185 log_err("u_strFromWCS(NULL, NULL) failed. Error: %s \n", u_errorName
(err)); |
| 1186 } |
| 1187 err = U_ZERO_ERROR; |
| 1188 u_strToWCS(NULL,0,NULL,NULL,0,&err); |
| 1189 if (err != U_STRING_NOT_TERMINATED_WARNING) { |
| 1190 log_err("u_strToWCS(NULL, NULL) failed. Error: %s \n", u_errorName(e
rr)); |
| 1191 } |
| 1192 err = U_ZERO_ERROR; |
| 1193 |
| 1194 /* pre-flight*/ |
| 1195 u_strToWCS(wDest,wDestLen,&reqLen,uSrc,uSrcLen-1,&err); |
| 1196 |
| 1197 if(err == U_BUFFER_OVERFLOW_ERROR){ |
| 1198 err=U_ZERO_ERROR; |
| 1199 wDest =(wchar_t*) malloc(sizeof(wchar_t) * (reqLen+1)); |
| 1200 wDestLen = reqLen+1; |
| 1201 u_strToWCS(wDest,wDestLen,&reqLen,uSrc,uSrcLen-1,&err); |
| 1202 } |
| 1203 |
| 1204 /* pre-flight */ |
| 1205 u_strFromWCS(uDest, uDestLen,&reqLen,wDest,reqLen,&err); |
| 1206 |
| 1207 |
| 1208 if(err == U_BUFFER_OVERFLOW_ERROR){ |
| 1209 err =U_ZERO_ERROR; |
| 1210 uDest = (UChar*) malloc(sizeof(UChar) * (reqLen+1)); |
| 1211 uDestLen = reqLen + 1; |
| 1212 u_strFromWCS(uDest, uDestLen,&reqLen,wDest,reqLen,&err); |
| 1213 }else if(U_FAILURE(err)){ |
| 1214 |
| 1215 log_err("u_strFromWCS() failed. Error: %s \n", u_errorName(err)); |
| 1216 return; |
| 1217 } |
| 1218 |
| 1219 for(i=0; i< uSrcLen; i++){ |
| 1220 if(uDest[i] != src16j[i]){ |
| 1221 log_verbose("u_str*WCS() failed for unterminated string expected
: \\u%04X got: \\u%04X at index: %i \n", src16j[i] ,uDest[i],i); |
| 1222 failed =TRUE; |
| 1223 } |
| 1224 } |
| 1225 |
| 1226 if(U_FAILURE(err)){ |
| 1227 failed = TRUE; |
| 1228 } |
| 1229 if(failed){ |
| 1230 log_err("u_strToWCS() failed \n"); |
| 1231 } |
| 1232 free(wDest); |
| 1233 free(uDest); |
| 1234 |
| 1235 |
| 1236 /* test with embeded nulls */ |
| 1237 uSrc = src16WithNulls; |
| 1238 uSrcLen = sizeof(src16WithNulls)/2; |
| 1239 wDestLen =0; |
| 1240 uDestLen =0; |
| 1241 wDest = NULL; |
| 1242 uDest = NULL; |
| 1243 /* pre-flight*/ |
| 1244 u_strToWCS(wDest,wDestLen,&reqLen,uSrc,uSrcLen-1,&err); |
| 1245 |
| 1246 if(err == U_BUFFER_OVERFLOW_ERROR){ |
| 1247 err=U_ZERO_ERROR; |
| 1248 wDest =(wchar_t*) malloc(sizeof(wchar_t) * (reqLen+1)); |
| 1249 wDestLen = reqLen+1; |
| 1250 u_strToWCS(wDest,wDestLen,&reqLen,uSrc,uSrcLen-1,&err); |
| 1251 } |
| 1252 |
| 1253 /* pre-flight */ |
| 1254 u_strFromWCS(uDest, uDestLen,&reqLen,wDest,reqLen,&err); |
| 1255 |
| 1256 if(err == U_BUFFER_OVERFLOW_ERROR){ |
| 1257 err =U_ZERO_ERROR; |
| 1258 uDest = (UChar*) malloc(sizeof(UChar) * (reqLen+1)); |
| 1259 uDestLen = reqLen + 1; |
| 1260 u_strFromWCS(uDest, uDestLen,&reqLen,wDest,reqLen,&err); |
| 1261 } |
| 1262 |
| 1263 if(!U_FAILURE(err)) { |
| 1264 for(i=0; i< uSrcLen; i++){ |
| 1265 if(uDest[i] != src16WithNulls[i]){ |
| 1266 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); |
| 1267 failed =TRUE; |
| 1268 } |
| 1269 } |
| 1270 } |
| 1271 |
| 1272 if(U_FAILURE(err)){ |
| 1273 failed = TRUE; |
| 1274 } |
| 1275 if(failed){ |
| 1276 log_err("u_strToWCS() failed \n"); |
| 1277 } |
| 1278 free(wDest); |
| 1279 free(uDest); |
| 1280 |
| 1281 } |
| 1282 |
| 1283 { |
| 1284 |
| 1285 uSrc = src16j; |
| 1286 uSrcLen = sizeof(src16j)/2; |
| 1287 wDestLen =0; |
| 1288 uDestLen =0; |
| 1289 wDest = NULL; |
| 1290 uDest = NULL; |
| 1291 wDestLen = 0; |
| 1292 /* pre-flight*/ |
| 1293 u_strToWCS(wDest,wDestLen,&reqLen,uSrc,-1,&err); |
| 1294 |
| 1295 if(err == U_BUFFER_OVERFLOW_ERROR){ |
| 1296 err=U_ZERO_ERROR; |
| 1297 wDest =(wchar_t*) malloc(sizeof(wchar_t) * (reqLen+1)); |
| 1298 wDestLen = reqLen+1; |
| 1299 u_strToWCS(wDest,wDestLen,&reqLen,uSrc,-1,&err); |
| 1300 } |
| 1301 uDestLen = 0; |
| 1302 /* pre-flight */ |
| 1303 u_strFromWCS(uDest, uDestLen,&reqLen,wDest,-1,&err); |
| 1304 |
| 1305 if(err == U_BUFFER_OVERFLOW_ERROR){ |
| 1306 err =U_ZERO_ERROR; |
| 1307 uDest = (UChar*) malloc(sizeof(UChar) * (reqLen+1)); |
| 1308 uDestLen = reqLen + 1; |
| 1309 u_strFromWCS(uDest, uDestLen,&reqLen,wDest,-1,&err); |
| 1310 } |
| 1311 |
| 1312 |
| 1313 if(!U_FAILURE(err)) { |
| 1314 for(i=0; i< uSrcLen; i++){ |
| 1315 if(uDest[i] != src16j[i]){ |
| 1316 log_verbose("u_str*WCS() failed for null terminated string expec
ted: \\u%04X got: \\u%04X at index: %i \n", src16j[i] ,uDest[i],i); |
| 1317 failed =TRUE; |
| 1318 } |
| 1319 } |
| 1320 } |
| 1321 |
| 1322 if(U_FAILURE(err)){ |
| 1323 failed = TRUE; |
| 1324 } |
| 1325 if(failed){ |
| 1326 log_err("u_strToWCS() failed \n"); |
| 1327 } |
| 1328 free(wDest); |
| 1329 free(uDest); |
| 1330 } |
| 1331 |
| 1332 /* |
| 1333 * Test u_terminateWChars(). |
| 1334 * All u_terminateXYZ() use the same implementation macro; |
| 1335 * we test this function to improve API coverage. |
| 1336 */ |
| 1337 { |
| 1338 wchar_t buffer[10]; |
| 1339 |
| 1340 err=U_ZERO_ERROR; |
| 1341 buffer[3]=0x20ac; |
| 1342 wDestLen=u_terminateWChars(buffer, LENGTHOF(buffer), 3, &err); |
| 1343 if(err!=U_ZERO_ERROR || wDestLen!=3 || buffer[3]!=0) { |
| 1344 log_err("u_terminateWChars(buffer, all, 3, zero) failed: %s length %
d [3]==U+%04x\n", |
| 1345 u_errorName(err), wDestLen, buffer[3]); |
| 1346 } |
| 1347 |
| 1348 err=U_ZERO_ERROR; |
| 1349 buffer[3]=0x20ac; |
| 1350 wDestLen=u_terminateWChars(buffer, 3, 3, &err); |
| 1351 if(err!=U_STRING_NOT_TERMINATED_WARNING || wDestLen!=3 || buffer[3]!=0x2
0ac) { |
| 1352 log_err("u_terminateWChars(buffer, 3, 3, zero) failed: %s length %d
[3]==U+%04x\n", |
| 1353 u_errorName(err), wDestLen, buffer[3]); |
| 1354 } |
| 1355 |
| 1356 err=U_STRING_NOT_TERMINATED_WARNING; |
| 1357 buffer[3]=0x20ac; |
| 1358 wDestLen=u_terminateWChars(buffer, LENGTHOF(buffer), 3, &err); |
| 1359 if(err!=U_ZERO_ERROR || wDestLen!=3 || buffer[3]!=0) { |
| 1360 log_err("u_terminateWChars(buffer, all, 3, not-terminated) failed: %
s length %d [3]==U+%04x\n", |
| 1361 u_errorName(err), wDestLen, buffer[3]); |
| 1362 } |
| 1363 |
| 1364 err=U_ZERO_ERROR; |
| 1365 buffer[3]=0x20ac; |
| 1366 wDestLen=u_terminateWChars(buffer, 2, 3, &err); |
| 1367 if(err!=U_BUFFER_OVERFLOW_ERROR || wDestLen!=3 || buffer[3]!=0x20ac) { |
| 1368 log_err("u_terminateWChars(buffer, 2, 3, zero) failed: %s length %d
[3]==U+%04x\n", |
| 1369 u_errorName(err), wDestLen, buffer[3]); |
| 1370 } |
| 1371 } |
| 1372 #else |
| 1373 log_info("Not testing u_str*WCS because (!UCONFIG_NO_CONVERSION && !UCONFIG_
NO_LEGACY_CONVERSION) and wchar is neither utf16 nor utf32"); |
| 1374 #endif |
| 1375 } |
| 1376 |
| 1377 static void Test_widestrs() |
| 1378 { |
| 1379 #if (defined(U_WCHAR_IS_UTF16) || defined(U_WCHAR_IS_UTF32)) || (!UCONFIG_NO_CON
VERSION && !UCONFIG_NO_LEGACY_CONVERSION) |
| 1380 wchar_t ws[100]; |
| 1381 UChar rts[100]; |
| 1382 int32_t wcap = sizeof(ws) / sizeof(*ws); |
| 1383 int32_t wl; |
| 1384 int32_t rtcap = sizeof(rts) / sizeof(*rts); |
| 1385 int32_t rtl; |
| 1386 wchar_t *wcs; |
| 1387 UChar *cp; |
| 1388 const char *errname; |
| 1389 UChar ustr[] = {'h', 'e', 'l', 'l', 'o', 0}; |
| 1390 int32_t ul = sizeof(ustr)/sizeof(*ustr) -1; |
| 1391 char astr[100]; |
| 1392 |
| 1393 UErrorCode err; |
| 1394 |
| 1395 err = U_ZERO_ERROR; |
| 1396 wcs = u_strToWCS(ws, wcap, &wl, ustr, ul, &err); |
| 1397 if (U_FAILURE(err)) { |
| 1398 errname = u_errorName(err); |
| 1399 log_err("test_widestrs: u_strToWCS error: %s!\n",errname); |
| 1400 } |
| 1401 if(ul!=wl){ |
| 1402 log_err("u_strToWCS: ustr = %s, ul = %d, ws = %S, wl = %d!\n", u_aus
trcpy(astr, ustr), ul, ws, wl); |
| 1403 } |
| 1404 err = U_ZERO_ERROR; |
| 1405 wl = (int32_t)uprv_wcslen(wcs); |
| 1406 cp = u_strFromWCS(rts, rtcap, &rtl, wcs, wl, &err); |
| 1407 if (U_FAILURE(err)) { |
| 1408 errname = u_errorName(err); |
| 1409 fprintf(stderr, "test_widestrs: ucnv_wcstombs error: %s!\n",errn
ame); |
| 1410 } |
| 1411 if(wl != rtl){ |
| 1412 log_err("u_strFromWCS: wcs = %S, wl = %d,rts = %s, rtl = %d!\n", wcs
, wl, u_austrcpy(astr, rts), rtl); |
| 1413 } |
| 1414 #else |
| 1415 log_info("Not testing u_str*WCS because (!UCONFIG_NO_CONVERSION && !UCONFIG_
NO_LEGACY_CONVERSION) and wchar is neither utf16 nor utf32"); |
| 1416 #endif |
| 1417 } |
| 1418 |
| 1419 static void |
| 1420 Test_WCHART_LongString(){ |
| 1421 #if (defined(U_WCHAR_IS_UTF16) || defined(U_WCHAR_IS_UTF32)) || (!UCONFIG_NO_CON
VERSION && !UCONFIG_NO_LEGACY_CONVERSION) |
| 1422 UErrorCode status = U_ZERO_ERROR; |
| 1423 const char* testdatapath=loadTestData(&status); |
| 1424 UResourceBundle *theBundle = ures_open(testdatapath, "testtypes", &status); |
| 1425 int32_t strLen =0; |
| 1426 const UChar* str = ures_getStringByKey(theBundle, "testinclude",&strLen,&sta
tus); |
| 1427 const UChar* uSrc = str; |
| 1428 int32_t uSrcLen = strLen; |
| 1429 int32_t wDestLen =0, reqLen=0, i=0; |
| 1430 int32_t uDestLen =0; |
| 1431 wchar_t* wDest = NULL; |
| 1432 UChar* uDest = NULL; |
| 1433 UBool failed = FALSE; |
| 1434 |
| 1435 if(U_FAILURE(status)){ |
| 1436 log_data_err("Could not get testinclude resource from testtypes bundle.
Error: %s\n",u_errorName(status)); |
| 1437 return; |
| 1438 } |
| 1439 |
| 1440 /* pre-flight*/ |
| 1441 u_strToWCS(wDest,wDestLen,&reqLen,uSrc,-1,&status); |
| 1442 |
| 1443 if(status == U_BUFFER_OVERFLOW_ERROR){ |
| 1444 status=U_ZERO_ERROR; |
| 1445 wDest =(wchar_t*) malloc(sizeof(wchar_t) * (reqLen+1)); |
| 1446 wDestLen = reqLen+1; |
| 1447 u_strToWCS(wDest,wDestLen,&reqLen,uSrc,-1,&status); |
| 1448 } |
| 1449 uDestLen = 0; |
| 1450 /* pre-flight */ |
| 1451 u_strFromWCS(uDest, uDestLen,&reqLen,wDest,-1,&status); |
| 1452 |
| 1453 if(status == U_BUFFER_OVERFLOW_ERROR){ |
| 1454 status =U_ZERO_ERROR; |
| 1455 uDest = (UChar*) malloc(sizeof(UChar) * (reqLen+1)); |
| 1456 uDestLen = reqLen + 1; |
| 1457 u_strFromWCS(uDest, uDestLen,&reqLen,wDest,-1,&status); |
| 1458 } |
| 1459 |
| 1460 |
| 1461 for(i=0; i< uSrcLen; i++){ |
| 1462 if(uDest[i] != str[i]){ |
| 1463 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); |
| 1464 failed =TRUE; |
| 1465 } |
| 1466 } |
| 1467 |
| 1468 if(U_FAILURE(status)){ |
| 1469 failed = TRUE; |
| 1470 } |
| 1471 if(failed){ |
| 1472 log_err("u_strToWCS() failed \n"); |
| 1473 } |
| 1474 free(wDest); |
| 1475 free(uDest); |
| 1476 /* close the bundle */ |
| 1477 ures_close(theBundle); |
| 1478 #else |
| 1479 log_info("Not testing u_str*WCS because (!UCONFIG_NO_CONVERSION && !UCONFIG_
NO_LEGACY_CONVERSION) and wchar is neither utf16 nor utf32"); |
| 1480 #endif |
| 1481 } |
| 1482 |
| 1483 static void Test_strToJavaModifiedUTF8() { |
| 1484 static const UChar src[]={ |
| 1485 0x61, 0x62, 0x63, 0xe1, 0xe2, 0xe3, |
| 1486 0xe01, 0xe02, 0xe03, 0xe001, 0xe002, 0xe003, |
| 1487 0xd800, 0xdc00, 0xdc00, 0xd800, 0, |
| 1488 0xdbff, 0xdfff, |
| 1489 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0xed, 0xe0e, 0x6f |
| 1490 }; |
| 1491 static const uint8_t expected[]={ |
| 1492 0x61, 0x62, 0x63, 0xc3, 0xa1, 0xc3, 0xa2, 0xc3, 0xa3, |
| 1493 0xe0, 0xb8, 0x81, 0xe0, 0xb8, 0x82, 0xe0, 0xb8, 0x83, |
| 1494 0xee, 0x80, 0x81, 0xee, 0x80, 0x82, 0xee, 0x80, 0x83, |
| 1495 0xed, 0xa0, 0x80, 0xed, 0xb0, 0x80, 0xed, 0xb0, 0x80, 0xed, 0xa0, 0x80,
0xc0, 0x80, |
| 1496 0xed, 0xaf, 0xbf, 0xed, 0xbf, 0xbf, |
| 1497 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0xc3, 0xad, 0xe0,
0xb8, 0x8e, 0x6f |
| 1498 }; |
| 1499 static const UChar shortSrc[]={ |
| 1500 0xe01, 0xe1, 0x61 |
| 1501 }; |
| 1502 static const uint8_t shortExpected[]={ |
| 1503 0xe0, 0xb8, 0x81, 0xc3, 0xa1, 0x61 |
| 1504 }; |
| 1505 static const UChar asciiNul[]={ |
| 1506 0x61, 0x62, 0x63, 0 |
| 1507 }; |
| 1508 static const uint8_t asciiNulExpected[]={ |
| 1509 0x61, 0x62, 0x63 |
| 1510 }; |
| 1511 char dest[200]; |
| 1512 char *p; |
| 1513 int32_t length, expectedTerminatedLength; |
| 1514 UErrorCode errorCode; |
| 1515 |
| 1516 expectedTerminatedLength=(int32_t)(strstr((const char *)expected, "\xc0\x80"
)- |
| 1517 (const char *)expected); |
| 1518 |
| 1519 errorCode=U_ZERO_ERROR; |
| 1520 length=-5; |
| 1521 p=u_strToJavaModifiedUTF8(dest, (int32_t)sizeof(dest), &length, |
| 1522 src, LENGTHOF(src), &errorCode); |
| 1523 if( U_FAILURE(errorCode) || p!=dest || |
| 1524 length!=LENGTHOF(expected) || 0!=memcmp(dest, expected, length) || |
| 1525 dest[length]!=0 |
| 1526 ) { |
| 1527 log_err("u_strToJavaModifiedUTF8(normal) failed - %s\n", u_errorName(err
orCode)); |
| 1528 } |
| 1529 memset(dest, 0xff, sizeof(dest)); |
| 1530 errorCode=U_ZERO_ERROR; |
| 1531 length=-5; |
| 1532 p=u_strToJavaModifiedUTF8(dest, (int32_t)sizeof(dest), NULL, |
| 1533 src, LENGTHOF(src), &errorCode); |
| 1534 if( U_FAILURE(errorCode) || p!=dest || |
| 1535 0!=memcmp(dest, expected, LENGTHOF(expected)) || |
| 1536 dest[LENGTHOF(expected)]!=0 |
| 1537 ) { |
| 1538 log_err("u_strToJavaModifiedUTF8(normal, pLength=NULL) failed - %s\n", u
_errorName(errorCode)); |
| 1539 } |
| 1540 memset(dest, 0xff, sizeof(dest)); |
| 1541 errorCode=U_ZERO_ERROR; |
| 1542 length=-5; |
| 1543 p=u_strToJavaModifiedUTF8(dest, LENGTHOF(expected), &length, |
| 1544 src, LENGTHOF(src), &errorCode); |
| 1545 if( errorCode!=U_STRING_NOT_TERMINATED_WARNING || p!=dest || |
| 1546 length!=LENGTHOF(expected) || 0!=memcmp(dest, expected, length) || |
| 1547 dest[length]!=(char)0xff |
| 1548 ) { |
| 1549 log_err("u_strToJavaModifiedUTF8(tight) failed - %s\n", u_errorName(erro
rCode)); |
| 1550 } |
| 1551 memset(dest, 0xff, sizeof(dest)); |
| 1552 errorCode=U_ZERO_ERROR; |
| 1553 length=-5; |
| 1554 p=u_strToJavaModifiedUTF8(dest, (int32_t)sizeof(dest), &length, src, -1, &er
rorCode); |
| 1555 if( U_FAILURE(errorCode) || p!=dest || |
| 1556 length!=expectedTerminatedLength || 0!=memcmp(dest, expected, length) || |
| 1557 dest[length]!=0 |
| 1558 ) { |
| 1559 log_err("u_strToJavaModifiedUTF8(NUL-terminated) failed - %s\n", u_error
Name(errorCode)); |
| 1560 } |
| 1561 memset(dest, 0xff, sizeof(dest)); |
| 1562 errorCode=U_ZERO_ERROR; |
| 1563 length=-5; |
| 1564 p=u_strToJavaModifiedUTF8(dest, (int32_t)sizeof(dest), NULL, src, -1, &error
Code); |
| 1565 if( U_FAILURE(errorCode) || p!=dest || |
| 1566 0!=memcmp(dest, expected, expectedTerminatedLength) || |
| 1567 dest[expectedTerminatedLength]!=0 |
| 1568 ) { |
| 1569 log_err("u_strToJavaModifiedUTF8(NUL-terminated, pLength=NULL) failed -
%s\n", u_errorName(errorCode)); |
| 1570 } |
| 1571 memset(dest, 0xff, sizeof(dest)); |
| 1572 errorCode=U_ZERO_ERROR; |
| 1573 length=-5; |
| 1574 p=u_strToJavaModifiedUTF8(dest, LENGTHOF(expected)/2, &length, |
| 1575 src, LENGTHOF(src), &errorCode); |
| 1576 if( errorCode!=U_BUFFER_OVERFLOW_ERROR || |
| 1577 length!=LENGTHOF(expected) || dest[LENGTHOF(expected)/2]!=(char)0xff |
| 1578 ) { |
| 1579 log_err("u_strToJavaModifiedUTF8(overflow) failed - %s\n", u_errorName(e
rrorCode)); |
| 1580 } |
| 1581 memset(dest, 0xff, sizeof(dest)); |
| 1582 errorCode=U_ZERO_ERROR; |
| 1583 length=-5; |
| 1584 p=u_strToJavaModifiedUTF8(NULL, 0, &length, |
| 1585 src, LENGTHOF(src), &errorCode); |
| 1586 if( errorCode!=U_BUFFER_OVERFLOW_ERROR || |
| 1587 length!=LENGTHOF(expected) || dest[0]!=(char)0xff |
| 1588 ) { |
| 1589 log_err("u_strToJavaModifiedUTF8(pure preflighting) failed - %s\n", u_er
rorName(errorCode)); |
| 1590 } |
| 1591 memset(dest, 0xff, sizeof(dest)); |
| 1592 errorCode=U_ZERO_ERROR; |
| 1593 length=-5; |
| 1594 p=u_strToJavaModifiedUTF8(dest, (int32_t)sizeof(dest), &length, |
| 1595 shortSrc, LENGTHOF(shortSrc), &errorCode); |
| 1596 if( U_FAILURE(errorCode) || p!=dest || |
| 1597 length!=LENGTHOF(shortExpected) || 0!=memcmp(dest, shortExpected, length
) || |
| 1598 dest[length]!=0 |
| 1599 ) { |
| 1600 log_err("u_strToJavaModifiedUTF8(short) failed - %s\n", u_errorName(erro
rCode)); |
| 1601 } |
| 1602 memset(dest, 0xff, sizeof(dest)); |
| 1603 errorCode=U_ZERO_ERROR; |
| 1604 length=-5; |
| 1605 p=u_strToJavaModifiedUTF8(dest, (int32_t)sizeof(dest), &length, |
| 1606 asciiNul, -1, &errorCode); |
| 1607 if( U_FAILURE(errorCode) || p!=dest || |
| 1608 length!=LENGTHOF(asciiNulExpected) || 0!=memcmp(dest, asciiNulExpected,
length) || |
| 1609 dest[length]!=0 |
| 1610 ) { |
| 1611 log_err("u_strToJavaModifiedUTF8(asciiNul) failed - %s\n", u_errorName(e
rrorCode)); |
| 1612 } |
| 1613 memset(dest, 0xff, sizeof(dest)); |
| 1614 errorCode=U_ZERO_ERROR; |
| 1615 length=-5; |
| 1616 p=u_strToJavaModifiedUTF8(dest, (int32_t)sizeof(dest), &length, |
| 1617 NULL, 0, &errorCode); |
| 1618 if( U_FAILURE(errorCode) || p!=dest || |
| 1619 length!=0 || dest[0]!=0 |
| 1620 ) { |
| 1621 log_err("u_strToJavaModifiedUTF8(empty) failed - %s\n", u_errorName(erro
rCode)); |
| 1622 } |
| 1623 |
| 1624 /* illegal arguments */ |
| 1625 memset(dest, 0xff, sizeof(dest)); |
| 1626 errorCode=U_ZERO_ERROR; |
| 1627 length=-5; |
| 1628 p=u_strToJavaModifiedUTF8(NULL, sizeof(dest), &length, |
| 1629 src, LENGTHOF(src), &errorCode); |
| 1630 if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || dest[0]!=(char)0xff) { |
| 1631 log_err("u_strToJavaModifiedUTF8(dest=NULL) failed - %s\n", u_errorName(
errorCode)); |
| 1632 } |
| 1633 memset(dest, 0xff, sizeof(dest)); |
| 1634 errorCode=U_ZERO_ERROR; |
| 1635 length=-5; |
| 1636 p=u_strToJavaModifiedUTF8(dest, -1, &length, |
| 1637 src, LENGTHOF(src), &errorCode); |
| 1638 if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || dest[0]!=(char)0xff) { |
| 1639 log_err("u_strToJavaModifiedUTF8(destCapacity<0) failed - %s\n", u_error
Name(errorCode)); |
| 1640 } |
| 1641 memset(dest, 0xff, sizeof(dest)); |
| 1642 errorCode=U_ZERO_ERROR; |
| 1643 length=-5; |
| 1644 p=u_strToJavaModifiedUTF8(dest, sizeof(dest), &length, |
| 1645 NULL, LENGTHOF(src), &errorCode); |
| 1646 if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || dest[0]!=(char)0xff) { |
| 1647 log_err("u_strToJavaModifiedUTF8(src=NULL) failed - %s\n", u_errorName(e
rrorCode)); |
| 1648 } |
| 1649 memset(dest, 0xff, sizeof(dest)); |
| 1650 errorCode=U_ZERO_ERROR; |
| 1651 length=-5; |
| 1652 p=u_strToJavaModifiedUTF8(dest, sizeof(dest), &length, |
| 1653 NULL, -1, &errorCode); |
| 1654 if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || dest[0]!=(char)0xff) { |
| 1655 log_err("u_strToJavaModifiedUTF8(src=NULL, srcLength<0) failed - %s\n",
u_errorName(errorCode)); |
| 1656 } |
| 1657 } |
| 1658 |
| 1659 static void Test_strFromJavaModifiedUTF8() { |
| 1660 static const uint8_t src[]={ |
| 1661 0x61, 0x62, 0x63, 0xc3, 0xa1, 0xc3, 0xa2, 0xc3, 0xa3, |
| 1662 0xe0, 0xb8, 0x81, 0xe0, 0xb8, 0x82, 0xe0, 0xb8, 0x83, |
| 1663 0xee, 0x80, 0x81, 0xee, 0x80, 0x82, 0xee, 0x80, 0x83, |
| 1664 0xed, 0xa0, 0x80, 0xed, 0xb0, 0x80, 0xed, 0xb0, 0x80, 0xed, 0xa0, 0x80,
0, |
| 1665 0xed, 0xaf, 0xbf, 0xed, 0xbf, 0xbf, |
| 1666 0x81, 0xc0, 0xe0, 0xb8, 0xf0, 0x90, 0x80, 0x80, /* invalid sequences */ |
| 1667 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, |
| 1668 0xe0, 0x81, 0xac, 0xe0, 0x83, 0xad, /* non-shortest forms are allowed *
/ |
| 1669 0xe0, 0xb8, 0x8e, 0x6f |
| 1670 }; |
| 1671 static const UChar expected[]={ |
| 1672 0x61, 0x62, 0x63, 0xe1, 0xe2, 0xe3, |
| 1673 0xe01, 0xe02, 0xe03, 0xe001, 0xe002, 0xe003, |
| 1674 0xd800, 0xdc00, 0xdc00, 0xd800, 0, |
| 1675 0xdbff, 0xdfff, |
| 1676 0xfffd, 0xfffd, 0xfffd, 0xfffd, |
| 1677 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, |
| 1678 0x6c, 0xed, |
| 1679 0xe0e, 0x6f |
| 1680 }; |
| 1681 static const uint8_t shortSrc[]={ |
| 1682 0xe0, 0xb8, 0x81, 0xc3, 0xa1, 0x61 |
| 1683 }; |
| 1684 static const UChar shortExpected[]={ |
| 1685 0xe01, 0xe1, 0x61 |
| 1686 }; |
| 1687 static const uint8_t asciiNul[]={ |
| 1688 0x61, 0x62, 0x63, 0 |
| 1689 }; |
| 1690 static const UChar asciiNulExpected[]={ |
| 1691 0x61, 0x62, 0x63 |
| 1692 }; |
| 1693 static const uint8_t invalid[]={ |
| 1694 0x81, 0xc0, 0xe0, 0xb8, 0xf0, 0x90, 0x80, 0x80 |
| 1695 }; |
| 1696 static const UChar invalidExpectedFFFD[]={ |
| 1697 0xfffd, 0xfffd, 0xfffd, 0xfffd |
| 1698 }; |
| 1699 static const UChar invalidExpected50000[]={ |
| 1700 0xd900, 0xdc00, 0xd900, 0xdc00, 0xd900, 0xdc00, 0xd900, 0xdc00 |
| 1701 }; |
| 1702 UChar dest[200]; |
| 1703 UChar *p; |
| 1704 int32_t length, expectedTerminatedLength; |
| 1705 int32_t numSubstitutions; |
| 1706 UErrorCode errorCode; |
| 1707 |
| 1708 expectedTerminatedLength=(int32_t)(u_strchr(expected, 0)-expected); |
| 1709 |
| 1710 errorCode=U_ZERO_ERROR; |
| 1711 length=numSubstitutions=-5; |
| 1712 p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), &length, |
| 1713 (const char *)src, LENGTHOF(src), |
| 1714 0xfffd, &numSubstitutions, &errorCode); |
| 1715 if( U_FAILURE(errorCode) || p!=dest || |
| 1716 length!=LENGTHOF(expected) || 0!=memcmp(dest, expected, length) || |
| 1717 dest[length]!=0 || |
| 1718 numSubstitutions!=LENGTHOF(invalidExpectedFFFD) |
| 1719 ) { |
| 1720 log_err("u_strFromJavaModifiedUTF8WithSub(normal) failed - %s\n", u_erro
rName(errorCode)); |
| 1721 } |
| 1722 memset(dest, 0xff, sizeof(dest)); |
| 1723 errorCode=U_ZERO_ERROR; |
| 1724 length=numSubstitutions=-5; |
| 1725 p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), NULL, |
| 1726 (const char *)src, LENGTHOF(src), |
| 1727 0xfffd, &numSubstitutions, &errorCode); |
| 1728 if( U_FAILURE(errorCode) || p!=dest || |
| 1729 0!=memcmp(dest, expected, LENGTHOF(expected)) || |
| 1730 dest[LENGTHOF(expected)]!=0 || |
| 1731 numSubstitutions!=LENGTHOF(invalidExpectedFFFD) |
| 1732 ) { |
| 1733 log_err("u_strFromJavaModifiedUTF8WithSub(normal, pLength=NULL) failed -
%s\n", u_errorName(errorCode)); |
| 1734 } |
| 1735 memset(dest, 0xff, sizeof(dest)); |
| 1736 errorCode=U_ZERO_ERROR; |
| 1737 length=numSubstitutions=-5; |
| 1738 p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), &length, |
| 1739 (const char *)src, LENGTHOF(src), |
| 1740 0xfffd, NULL, &errorCode); |
| 1741 if( U_FAILURE(errorCode) || p!=dest || |
| 1742 length!=LENGTHOF(expected) || 0!=memcmp(dest, expected, length) || |
| 1743 dest[length]!=0 |
| 1744 ) { |
| 1745 log_err("u_strFromJavaModifiedUTF8WithSub(normal, pNumSubstitutions=NULL
) failed - %s\n", u_errorName(errorCode)); |
| 1746 } |
| 1747 memset(dest, 0xff, sizeof(dest)); |
| 1748 errorCode=U_ZERO_ERROR; |
| 1749 length=numSubstitutions=-5; |
| 1750 p=u_strFromJavaModifiedUTF8WithSub(dest, LENGTHOF(expected), &length, |
| 1751 (const char *)src, LENGTHOF(src), |
| 1752 0xfffd, &numSubstitutions, &errorCode); |
| 1753 if( errorCode!=U_STRING_NOT_TERMINATED_WARNING || p!=dest || |
| 1754 length!=LENGTHOF(expected) || 0!=memcmp(dest, expected, length) || |
| 1755 dest[length]!=0xffff || |
| 1756 numSubstitutions!=LENGTHOF(invalidExpectedFFFD) |
| 1757 ) { |
| 1758 log_err("u_strFromJavaModifiedUTF8WithSub(tight) failed - %s\n", u_error
Name(errorCode)); |
| 1759 } |
| 1760 memset(dest, 0xff, sizeof(dest)); |
| 1761 errorCode=U_ZERO_ERROR; |
| 1762 length=numSubstitutions=-5; |
| 1763 p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), &length, |
| 1764 (const char *)src, -1, |
| 1765 0xfffd, &numSubstitutions, &errorCode); |
| 1766 if( U_FAILURE(errorCode) || p!=dest || |
| 1767 length!=expectedTerminatedLength || 0!=memcmp(dest, expected, length) || |
| 1768 dest[length]!=0 || |
| 1769 numSubstitutions!=0 |
| 1770 ) { |
| 1771 log_err("u_strFromJavaModifiedUTF8WithSub(NUL-terminated) failed - %s\n"
, u_errorName(errorCode)); |
| 1772 } |
| 1773 memset(dest, 0xff, sizeof(dest)); |
| 1774 errorCode=U_ZERO_ERROR; |
| 1775 length=numSubstitutions=-5; |
| 1776 p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), NULL, |
| 1777 (const char *)src, -1, |
| 1778 0xfffd, &numSubstitutions, &errorCode); |
| 1779 if( U_FAILURE(errorCode) || p!=dest || |
| 1780 0!=memcmp(dest, expected, expectedTerminatedLength) || |
| 1781 dest[expectedTerminatedLength]!=0 || |
| 1782 numSubstitutions!=0 |
| 1783 ) { |
| 1784 log_err("u_strFromJavaModifiedUTF8WithSub(NUL-terminated, pLength=NULL)
failed - %s\n", u_errorName(errorCode)); |
| 1785 } |
| 1786 memset(dest, 0xff, sizeof(dest)); |
| 1787 errorCode=U_ZERO_ERROR; |
| 1788 length=numSubstitutions=-5; |
| 1789 p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), &length, |
| 1790 (const char *)src, -1, |
| 1791 0xfffd, NULL, &errorCode); |
| 1792 if( U_FAILURE(errorCode) || p!=dest || |
| 1793 length!=expectedTerminatedLength || 0!=memcmp(dest, expected, length) || |
| 1794 dest[length]!=0 |
| 1795 ) { |
| 1796 log_err("u_strFromJavaModifiedUTF8WithSub(NUL-terminated, pNumSubstituti
ons=NULL) failed - %s\n", u_errorName(errorCode)); |
| 1797 } |
| 1798 memset(dest, 0xff, sizeof(dest)); |
| 1799 errorCode=U_ZERO_ERROR; |
| 1800 length=numSubstitutions=-5; |
| 1801 p=u_strFromJavaModifiedUTF8WithSub(dest, LENGTHOF(expected)/2, &length, |
| 1802 (const char *)src, LENGTHOF(src), |
| 1803 0xfffd, &numSubstitutions, &errorCode); |
| 1804 if( errorCode!=U_BUFFER_OVERFLOW_ERROR || |
| 1805 length!=LENGTHOF(expected) || dest[LENGTHOF(expected)/2]!=0xffff |
| 1806 ) { |
| 1807 log_err("u_strFromJavaModifiedUTF8WithSub(overflow) failed - %s\n", u_er
rorName(errorCode)); |
| 1808 } |
| 1809 memset(dest, 0xff, sizeof(dest)); |
| 1810 errorCode=U_ZERO_ERROR; |
| 1811 length=numSubstitutions=-5; |
| 1812 p=u_strFromJavaModifiedUTF8WithSub(NULL, 0, &length, |
| 1813 (const char *)src, LENGTHOF(src), |
| 1814 0xfffd, &numSubstitutions, &errorCode); |
| 1815 if( errorCode!=U_BUFFER_OVERFLOW_ERROR || |
| 1816 length!=LENGTHOF(expected) || dest[0]!=0xffff |
| 1817 ) { |
| 1818 log_err("u_strFromJavaModifiedUTF8WithSub(pure preflighting) failed - %s
\n", u_errorName(errorCode)); |
| 1819 } |
| 1820 memset(dest, 0xff, sizeof(dest)); |
| 1821 errorCode=U_ZERO_ERROR; |
| 1822 length=numSubstitutions=-5; |
| 1823 p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), &length, |
| 1824 (const char *)shortSrc, LENGTHOF(shortSrc
), |
| 1825 0xfffd, &numSubstitutions, &errorCode); |
| 1826 if( U_FAILURE(errorCode) || p!=dest || |
| 1827 length!=LENGTHOF(shortExpected) || 0!=memcmp(dest, shortExpected, length
) || |
| 1828 dest[length]!=0 || |
| 1829 numSubstitutions!=0 |
| 1830 ) { |
| 1831 log_err("u_strFromJavaModifiedUTF8WithSub(short) failed - %s\n", u_error
Name(errorCode)); |
| 1832 } |
| 1833 memset(dest, 0xff, sizeof(dest)); |
| 1834 errorCode=U_ZERO_ERROR; |
| 1835 length=numSubstitutions=-5; |
| 1836 p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), &length, |
| 1837 (const char *)asciiNul, -1, |
| 1838 0xfffd, &numSubstitutions, &errorCode); |
| 1839 if( U_FAILURE(errorCode) || p!=dest || |
| 1840 length!=LENGTHOF(asciiNulExpected) || 0!=memcmp(dest, asciiNulExpected,
length) || |
| 1841 dest[length]!=0 || |
| 1842 numSubstitutions!=0 |
| 1843 ) { |
| 1844 log_err("u_strFromJavaModifiedUTF8WithSub(asciiNul) failed - %s\n", u_er
rorName(errorCode)); |
| 1845 } |
| 1846 memset(dest, 0xff, sizeof(dest)); |
| 1847 errorCode=U_ZERO_ERROR; |
| 1848 length=numSubstitutions=-5; |
| 1849 p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), &length, |
| 1850 NULL, 0, 0xfffd, &numSubstitutions, &erro
rCode); |
| 1851 if( U_FAILURE(errorCode) || p!=dest || |
| 1852 length!=0 || dest[0]!=0 || |
| 1853 numSubstitutions!=0 |
| 1854 ) { |
| 1855 log_err("u_strFromJavaModifiedUTF8WithSub(empty) failed - %s\n", u_error
Name(errorCode)); |
| 1856 } |
| 1857 memset(dest, 0xff, sizeof(dest)); |
| 1858 errorCode=U_ZERO_ERROR; |
| 1859 length=numSubstitutions=-5; |
| 1860 p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), &length, |
| 1861 (const char *)invalid, LENGTHOF(invalid), |
| 1862 0xfffd, &numSubstitutions, &errorCode); |
| 1863 if( U_FAILURE(errorCode) || p!=dest || |
| 1864 length!=LENGTHOF(invalidExpectedFFFD) || 0!=memcmp(dest, invalidExpected
FFFD, length) || |
| 1865 dest[length]!=0 || |
| 1866 numSubstitutions!=LENGTHOF(invalidExpectedFFFD) |
| 1867 ) { |
| 1868 log_err("u_strFromJavaModifiedUTF8WithSub(invalid->fffd) failed - %s\n",
u_errorName(errorCode)); |
| 1869 } |
| 1870 memset(dest, 0xff, sizeof(dest)); |
| 1871 errorCode=U_ZERO_ERROR; |
| 1872 length=numSubstitutions=-5; |
| 1873 p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), &length, |
| 1874 (const char *)invalid, LENGTHOF(invalid), |
| 1875 0x50000, &numSubstitutions, &errorCode); |
| 1876 if( U_FAILURE(errorCode) || p!=dest || |
| 1877 length!=LENGTHOF(invalidExpected50000) || 0!=memcmp(dest, invalidExpecte
d50000, length) || |
| 1878 dest[length]!=0 || |
| 1879 numSubstitutions!=LENGTHOF(invalidExpectedFFFD) /* not ...50000 */ |
| 1880 ) { |
| 1881 log_err("u_strFromJavaModifiedUTF8WithSub(invalid->50000) failed - %s\n"
, u_errorName(errorCode)); |
| 1882 } |
| 1883 memset(dest, 0xff, sizeof(dest)); |
| 1884 errorCode=U_ZERO_ERROR; |
| 1885 length=numSubstitutions=-5; |
| 1886 p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), &length, |
| 1887 (const char *)invalid, LENGTHOF(invalid), |
| 1888 U_SENTINEL, &numSubstitutions, &errorCode
); |
| 1889 if(errorCode!=U_INVALID_CHAR_FOUND || dest[0]!=0xffff || numSubstitutions!=0
) { |
| 1890 log_err("u_strFromJavaModifiedUTF8WithSub(invalid->error) failed - %s\n"
, u_errorName(errorCode)); |
| 1891 } |
| 1892 memset(dest, 0xff, sizeof(dest)); |
| 1893 errorCode=U_ZERO_ERROR; |
| 1894 length=numSubstitutions=-5; |
| 1895 p=u_strFromJavaModifiedUTF8WithSub(dest, (int32_t)sizeof(dest), &length, |
| 1896 (const char *)src, LENGTHOF(src), |
| 1897 U_SENTINEL, &numSubstitutions, &errorCode
); |
| 1898 if( errorCode!=U_INVALID_CHAR_FOUND || |
| 1899 length>=LENGTHOF(expected) || dest[LENGTHOF(expected)-1]!=0xffff || |
| 1900 numSubstitutions!=0 |
| 1901 ) { |
| 1902 log_err("u_strFromJavaModifiedUTF8WithSub(normal->error) failed - %s\n",
u_errorName(errorCode)); |
| 1903 } |
| 1904 |
| 1905 /* illegal arguments */ |
| 1906 memset(dest, 0xff, sizeof(dest)); |
| 1907 errorCode=U_ZERO_ERROR; |
| 1908 length=numSubstitutions=-5; |
| 1909 p=u_strFromJavaModifiedUTF8WithSub(NULL, sizeof(dest), &length, |
| 1910 (const char *)src, LENGTHOF(src), |
| 1911 0xfffd, &numSubstitutions, &errorCode); |
| 1912 if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || dest[0]!=0xffff) { |
| 1913 log_err("u_strFromJavaModifiedUTF8WithSub(dest=NULL) failed - %s\n", u_e
rrorName(errorCode)); |
| 1914 } |
| 1915 memset(dest, 0xff, sizeof(dest)); |
| 1916 errorCode=U_ZERO_ERROR; |
| 1917 length=numSubstitutions=-5; |
| 1918 p=u_strFromJavaModifiedUTF8WithSub(dest, -1, &length, |
| 1919 (const char *)src, LENGTHOF(src), |
| 1920 0xfffd, &numSubstitutions, &errorCode); |
| 1921 if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || dest[0]!=0xffff) { |
| 1922 log_err("u_strFromJavaModifiedUTF8WithSub(destCapacity<0) failed - %s\n"
, u_errorName(errorCode)); |
| 1923 } |
| 1924 memset(dest, 0xff, sizeof(dest)); |
| 1925 errorCode=U_ZERO_ERROR; |
| 1926 length=numSubstitutions=-5; |
| 1927 p=u_strFromJavaModifiedUTF8WithSub(dest, sizeof(dest), &length, |
| 1928 NULL, LENGTHOF(src), |
| 1929 0xfffd, &numSubstitutions, &errorCode); |
| 1930 if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || dest[0]!=0xffff) { |
| 1931 log_err("u_strFromJavaModifiedUTF8WithSub(src=NULL) failed - %s\n", u_er
rorName(errorCode)); |
| 1932 } |
| 1933 memset(dest, 0xff, sizeof(dest)); |
| 1934 errorCode=U_ZERO_ERROR; |
| 1935 length=numSubstitutions=-5; |
| 1936 p=u_strFromJavaModifiedUTF8WithSub(dest, sizeof(dest), &length, |
| 1937 NULL, -1, 0xfffd, &numSubstitutions, &err
orCode); |
| 1938 if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || dest[0]!=0xffff) { |
| 1939 log_err("u_strFromJavaModifiedUTF8WithSub(src=NULL, srcLength<0) failed
- %s\n", u_errorName(errorCode)); |
| 1940 } |
| 1941 memset(dest, 0xff, sizeof(dest)); |
| 1942 errorCode=U_ZERO_ERROR; |
| 1943 length=numSubstitutions=-5; |
| 1944 p=u_strFromJavaModifiedUTF8WithSub(dest, sizeof(dest), &length, |
| 1945 (const char *)src, LENGTHOF(src), |
| 1946 0x110000, &numSubstitutions, &errorCode); |
| 1947 if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || dest[0]!=0xffff) { |
| 1948 log_err("u_strFromJavaModifiedUTF8WithSub(subchar=U_SENTINEL) failed - %
s\n", u_errorName(errorCode)); |
| 1949 } |
| 1950 memset(dest, 0xff, sizeof(dest)); |
| 1951 errorCode=U_ZERO_ERROR; |
| 1952 length=numSubstitutions=-5; |
| 1953 p=u_strFromJavaModifiedUTF8WithSub(dest, sizeof(dest), &length, |
| 1954 (const char *)src, LENGTHOF(src), |
| 1955 0xdfff, &numSubstitutions, &errorCode); |
| 1956 if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || dest[0]!=0xffff) { |
| 1957 log_err("u_strFromJavaModifiedUTF8WithSub(subchar is surrogate) failed -
%s\n", u_errorName(errorCode)); |
| 1958 } |
| 1959 } |
| 1960 |
| 1961 /* test that string transformation functions permit NULL source pointer when sou
rce length==0 */ |
| 1962 static void TestNullEmptySource() { |
| 1963 char dest8[4]={ 3, 3, 3, 3 }; |
| 1964 UChar dest16[4]={ 3, 3, 3, 3 }; |
| 1965 UChar32 dest32[4]={ 3, 3, 3, 3 }; |
| 1966 #if (defined(U_WCHAR_IS_UTF16) || defined(U_WCHAR_IS_UTF32)) || (!UCONFIG_NO_CON
VERSION && !UCONFIG_NO_LEGACY_CONVERSION) |
| 1967 wchar_t destW[4]={ 3, 3, 3, 3 }; |
| 1968 #endif |
| 1969 |
| 1970 int32_t length; |
| 1971 UErrorCode errorCode; |
| 1972 |
| 1973 /* u_strFromXyz() */ |
| 1974 |
| 1975 dest16[0]=3; |
| 1976 length=3; |
| 1977 errorCode=U_ZERO_ERROR; |
| 1978 u_strFromUTF8(dest16, LENGTHOF(dest16), &length, NULL, 0, &errorCode); |
| 1979 if(errorCode!=U_ZERO_ERROR || length!=0 || dest16[0]!=0 || dest16[1]!=3) { |
| 1980 log_err("u_strFromUTF8(source=NULL, sourceLength=0) failed\n"); |
| 1981 } |
| 1982 |
| 1983 dest16[0]=3; |
| 1984 length=3; |
| 1985 errorCode=U_ZERO_ERROR; |
| 1986 u_strFromUTF8WithSub(dest16, LENGTHOF(dest16), &length, NULL, 0, 0xfffd, NUL
L, &errorCode); |
| 1987 if(errorCode!=U_ZERO_ERROR || length!=0 || dest16[0]!=0 || dest16[1]!=3) { |
| 1988 log_err("u_strFromUTF8WithSub(source=NULL, sourceLength=0) failed\n"); |
| 1989 } |
| 1990 |
| 1991 dest16[0]=3; |
| 1992 length=3; |
| 1993 errorCode=U_ZERO_ERROR; |
| 1994 u_strFromUTF8Lenient(dest16, LENGTHOF(dest16), &length, NULL, 0, &errorCode)
; |
| 1995 if(errorCode!=U_ZERO_ERROR || length!=0 || dest16[0]!=0 || dest16[1]!=3) { |
| 1996 log_err("u_strFromUTF8Lenient(source=NULL, sourceLength=0) failed\n"); |
| 1997 } |
| 1998 |
| 1999 dest16[0]=3; |
| 2000 length=3; |
| 2001 errorCode=U_ZERO_ERROR; |
| 2002 u_strFromUTF32(dest16, LENGTHOF(dest16), &length, NULL, 0, &errorCode); |
| 2003 if(errorCode!=U_ZERO_ERROR || length!=0 || dest16[0]!=0 || dest16[1]!=3) { |
| 2004 log_err("u_strFromUTF32(source=NULL, sourceLength=0) failed\n"); |
| 2005 } |
| 2006 |
| 2007 dest16[0]=3; |
| 2008 length=3; |
| 2009 errorCode=U_ZERO_ERROR; |
| 2010 u_strFromUTF32WithSub(dest16, LENGTHOF(dest16), &length, NULL, 0, 0xfffd, NU
LL, &errorCode); |
| 2011 if(errorCode!=U_ZERO_ERROR || length!=0 || dest16[0]!=0 || dest16[1]!=3) { |
| 2012 log_err("u_strFromUTF32WithSub(source=NULL, sourceLength=0) failed\n"); |
| 2013 } |
| 2014 |
| 2015 dest16[0]=3; |
| 2016 length=3; |
| 2017 errorCode=U_ZERO_ERROR; |
| 2018 u_strFromJavaModifiedUTF8WithSub(dest16, LENGTHOF(dest16), &length, NULL, 0,
0xfffd, NULL, &errorCode); |
| 2019 if(errorCode!=U_ZERO_ERROR || length!=0 || dest16[0]!=0 || dest16[1]!=3) { |
| 2020 log_err("u_strFromJavaModifiedUTF8WithSub(source=NULL, sourceLength=0) f
ailed\n"); |
| 2021 } |
| 2022 |
| 2023 /* u_strToXyz() */ |
| 2024 |
| 2025 dest8[0]=3; |
| 2026 length=3; |
| 2027 errorCode=U_ZERO_ERROR; |
| 2028 u_strToUTF8(dest8, LENGTHOF(dest8), &length, NULL, 0, &errorCode); |
| 2029 if(errorCode!=U_ZERO_ERROR || length!=0 || dest8[0]!=0 || dest8[1]!=3) { |
| 2030 log_err("u_strToUTF8(source=NULL, sourceLength=0) failed\n"); |
| 2031 } |
| 2032 |
| 2033 dest8[0]=3; |
| 2034 length=3; |
| 2035 errorCode=U_ZERO_ERROR; |
| 2036 u_strToUTF8WithSub(dest8, LENGTHOF(dest8), &length, NULL, 0, 0xfffd, NULL, &
errorCode); |
| 2037 if(errorCode!=U_ZERO_ERROR || length!=0 || dest8[0]!=0 || dest8[1]!=3) { |
| 2038 log_err("u_strToUTF8(source=NULL, sourceLength=0) failed\n"); |
| 2039 } |
| 2040 |
| 2041 dest32[0]=3; |
| 2042 length=3; |
| 2043 errorCode=U_ZERO_ERROR; |
| 2044 u_strToUTF32(dest32, LENGTHOF(dest32), &length, NULL, 0, &errorCode); |
| 2045 if(errorCode!=U_ZERO_ERROR || length!=0 || dest32[0]!=0 || dest32[1]!=3) { |
| 2046 log_err("u_strToUTF32(source=NULL, sourceLength=0) failed\n"); |
| 2047 } |
| 2048 |
| 2049 dest32[0]=3; |
| 2050 length=3; |
| 2051 errorCode=U_ZERO_ERROR; |
| 2052 u_strToUTF32WithSub(dest32, LENGTHOF(dest32), &length, NULL, 0, 0xfffd, NULL
, &errorCode); |
| 2053 if(errorCode!=U_ZERO_ERROR || length!=0 || dest32[0]!=0 || dest32[1]!=3) { |
| 2054 log_err("u_strToUTF32WithSub(source=NULL, sourceLength=0) failed\n"); |
| 2055 } |
| 2056 |
| 2057 dest8[0]=3; |
| 2058 length=3; |
| 2059 errorCode=U_ZERO_ERROR; |
| 2060 u_strToJavaModifiedUTF8(dest8, LENGTHOF(dest8), &length, NULL, 0, &errorCode
); |
| 2061 if(errorCode!=U_ZERO_ERROR || length!=0 || dest8[0]!=0 || dest8[1]!=3) { |
| 2062 log_err("u_strToJavaModifiedUTF8(source=NULL, sourceLength=0) failed\n")
; |
| 2063 } |
| 2064 |
| 2065 #if (defined(U_WCHAR_IS_UTF16) || defined(U_WCHAR_IS_UTF32)) || (!UCONFIG_NO_CON
VERSION && !UCONFIG_NO_LEGACY_CONVERSION) |
| 2066 |
| 2067 dest16[0]=3; |
| 2068 length=3; |
| 2069 errorCode=U_ZERO_ERROR; |
| 2070 u_strFromWCS(dest16, LENGTHOF(dest16), &length, NULL, 0, &errorCode); |
| 2071 if(errorCode!=U_ZERO_ERROR || length!=0 || dest16[0]!=0 || dest16[1]!=3) { |
| 2072 log_err("u_strFromWCS(source=NULL, sourceLength=0) failed\n"); |
| 2073 } |
| 2074 |
| 2075 destW[0]=3; |
| 2076 length=3; |
| 2077 errorCode=U_ZERO_ERROR; |
| 2078 u_strToWCS(destW, LENGTHOF(destW), &length, NULL, 0, &errorCode); |
| 2079 if(errorCode!=U_ZERO_ERROR || length!=0 || destW[0]!=0 || destW[1]!=3) { |
| 2080 log_err("u_strToWCS(source=NULL, sourceLength=0) failed\n"); |
| 2081 } |
| 2082 |
| 2083 #endif |
| 2084 } |
OLD | NEW |