Changeset 21728 in vbox for trunk/src/VBox/Runtime
- Timestamp:
- Jul 20, 2009 3:11:45 PM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 50300
- Location:
- trunk/src/VBox/Runtime
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/common/string/utf-16.cpp
r21714 r21728 667 667 if (!wc) 668 668 break; 669 else if (wc < 256) 670 ++cch; 669 671 else if (wc < 0xd800 || wc > 0xdfff) 670 672 { 671 673 if (wc < 0xfffe) 672 ++cch; 674 { 675 rc = VERR_NO_TRANSLATION; 676 break; 677 } 673 678 else 674 679 { … … 699 704 break; 700 705 } 701 ++cch; 706 rc = VERR_NO_TRANSLATION; 707 break; 702 708 } 703 709 } … … 745 751 else if (wc < 0xfffe) 746 752 { 747 if (cch < 1) 748 { 749 RTStrAssertMsgFailed(("Buffer overflow! 3\n")); 750 rc = VERR_BUFFER_OVERFLOW; 751 break; 752 } 753 cch--; 754 *pwch++ = '?'; 753 rc = VERR_NO_TRANSLATION; 754 break; 755 755 } 756 756 else … … 782 782 break; 783 783 } 784 if (cch < 1) 785 { 786 RTStrAssertMsgFailed(("Buffer overflow! 4\n")); 787 rc = VERR_BUFFER_OVERFLOW; 788 break; 789 } 790 cch--; 791 *pwch++ = '?'; 784 rc = VERR_NO_TRANSLATION; 785 break; 792 786 } 793 787 } -
trunk/src/VBox/Runtime/testcase/tstUtf8.cpp
r21723 r21728 1016 1016 /* Test Utf16 -> Latin1 */ 1017 1017 size_t cch_szAll = 0; 1018 size_t cbShort = RTUtf16CalcLatin1Len(g_wszAll); 1019 RTTEST_CHECK(hTest, cbShort == 0); 1018 1020 int rc = RTUtf16CalcLatin1LenEx(g_wszAll, 255, &cch_szAll); 1019 1021 RTTEST_CHECK(hTest, (cch_szAll == 255)); 1020 1022 rc = RTUtf16CalcLatin1LenEx(g_wszAll, RTSTR_MAX, &cch_szAll); 1023 RTTEST_CHECK_RC(hTest, rc, VERR_NO_TRANSLATION); 1024 char *psz = NULL; 1025 RTUTF16 wszShort[256] = { 0 }; 1026 for (unsigned i = 0; i < 255; ++i) 1027 wszShort[i] = i + 1; 1028 cbShort = RTUtf16CalcLatin1Len(wszShort); 1029 RTTEST_CHECK(hTest, cbShort == 255); 1030 rc = RTUtf16ToLatin1(wszShort, &psz); 1021 1031 RTTEST_CHECK_RC_OK(hTest, rc); 1022 1032 if (RT_SUCCESS(rc)) 1023 1033 { 1024 RTTEST_CHECK(hTest, (cch_szAll == 0x110000 - 1 - 0x800 - 2)); 1025 RTTEST_CHECK(hTest, (cch_szAll == RTUtf16CalcLatin1Len(g_wszAll))); 1026 } 1027 char *psz = NULL; 1028 rc = RTUtf16ToLatin1(g_wszAll, &psz); 1029 RTTEST_CHECK_RC_OK(hTest, rc); 1030 if (RT_SUCCESS(rc)) 1031 { 1032 RTTEST_CHECK(hTest, (strlen(psz) == cch_szAll)); 1034 RTTEST_CHECK(hTest, (strlen(psz) == 255)); 1033 1035 for (unsigned i = 0, j = 1; psz[i] != '\0'; ++i, ++j) 1034 if ( ((j < 0x100) && (psz[i] != (char) j)) 1035 || ((j > 0xff) && psz[i] != '?')) 1036 if (psz[i] != (char) j) 1036 1037 { 1037 1038 RTTestFailed(hTest, "conversion of g_wszAll to Latin1 failed at position %u\n", i); … … 1039 1040 } 1040 1041 } 1042 RTStrFree(psz); 1043 rc = RTUtf16ToLatin1(g_wszAll, &psz); 1044 RTTEST_CHECK_RC(hTest, rc, VERR_NO_TRANSLATION); 1041 1045 char sz[512]; 1042 1046 char *psz2 = &sz[0]; … … 1044 1048 rc = RTUtf16ToLatin1Ex(g_wszAll, sizeof(sz) - 1, &psz2, sizeof(sz), 1045 1049 &cchActual); 1050 RTTEST_CHECK_RC(hTest, rc, VERR_NO_TRANSLATION); 1051 RTTEST_CHECK_MSG(hTest, cchActual == 0, 1052 (hTest, "cchActual=%lu\n", cchActual)); 1053 rc = RTUtf16ToLatin1Ex(g_wszAll, 255, &psz2, sizeof(sz), 1054 &cchActual); 1046 1055 RTTEST_CHECK_RC_OK(hTest, rc); 1047 1056 if (RT_SUCCESS(rc)) 1048 1057 { 1049 RTTEST_CHECK(hTest, (cchActual == sizeof(sz) - 1));1058 RTTEST_CHECK(hTest, (cchActual == 255)); 1050 1059 RTTEST_CHECK(hTest, (cchActual == strlen(sz))); 1051 for (unsigned i = 0, j = 1; psz[i] != '\0'; ++i, ++j) 1052 if ( ((j < 0x100) && (psz[i] != (char) j)) 1053 || ((j > 0xff) && psz[i] != '?')) 1060 for (unsigned i = 0, j = 1; psz2[i] != '\0'; ++i, ++j) 1061 if (psz2[i] != (char) j) 1054 1062 { 1055 1063 RTTestFailed(hTest, "second conversion of g_wszAll to Latin1 failed at position %u\n", i); … … 1057 1065 } 1058 1066 } 1059 rc = RTUtf16ToLatin1Ex(g_wszAll, sizeof(sz), &psz2, sizeof(sz), 1060 &cchActual); 1067 rc = RTUtf16ToLatin1Ex(g_wszAll, 128, &psz2, 128, &cchActual); 1061 1068 RTTEST_CHECK_RC(hTest, rc, VERR_BUFFER_OVERFLOW); 1062 1069 /** @todo Either fix the documentation or fix the code - cchActual is 1063 1070 * set to the number of bytes actually encoded. */ 1064 RTTEST_CHECK (hTest, (cchActual == sizeof(sz)));1065 RTStrFree(psz);1066 rc = RTUtf16ToLatin1Ex(g_wszAll, 512, &psz, 0, &cchActual);1071 RTTEST_CHECK_MSG(hTest, (cchActual == 128), 1072 (hTest, "cchActual=%lu\n", cchActual)); 1073 rc = RTUtf16ToLatin1Ex(g_wszAll, 255, &psz, 0, &cchActual); 1067 1074 RTTEST_CHECK_RC_OK(hTest, rc); 1068 1075 if (RT_SUCCESS(rc)) 1069 1076 { 1070 RTTEST_CHECK(hTest, (cchActual == 512));1077 RTTEST_CHECK(hTest, (cchActual == 255)); 1071 1078 RTTEST_CHECK(hTest, (cchActual == strlen(psz))); 1072 1079 for (unsigned i = 0, j = 1; psz[i] != '\0'; ++i, ++j) … … 1078 1085 } 1079 1086 } 1080 const char *pszGood = "H\0e\0l\0l\0o\0\0\xD8\0\xDC\0";1081 1087 const char *pszBad = "H\0e\0l\0l\0o\0\0\xDC\0\xD8\0"; 1082 rc = RTUtf16ToLatin1Ex((RTUTF16 *) pszGood, RTSTR_MAX, &psz2, sizeof(sz),1083 &cchActual);1084 RTTEST_CHECK_RC_OK(hTest, rc);1085 RTTEST_CHECK(hTest, (cchActual == 6));1086 RTTEST_CHECK(hTest, (strlen(sz) == 6));1087 rc = RTUtf16ToLatin1Ex((RTUTF16 *) pszGood, RTSTR_MAX, &psz2, sizeof(sz),1088 NULL);1089 RTTEST_CHECK_RC_OK(hTest, rc);1090 1088 rc = RTUtf16ToLatin1Ex((RTUTF16 *) pszBad, RTSTR_MAX, &psz2, sizeof(sz), 1091 1089 &cchActual); 1092 1090 RTTEST_CHECK_RC(hTest, rc, VERR_INVALID_UTF16_ENCODING); 1093 RTStrFree(psz);1094 rc = RTUtf16ToLatin1((RTUTF16 *) pszGood, &psz);1095 RTTEST_CHECK_RC_OK(hTest, rc);1096 RTTEST_CHECK(hTest, (strlen(psz) == 6));1097 1091 RTStrFree(psz); 1098 1092 … … 1189 1183 RTTESTI_CHECK_RC(rc, VERR_NO_TRANSLATION); 1190 1184 1191 RTTestSub(hTest, "VERR_NO_TRANSLATION/RTUtf16ToLatin1");1192 rc = RTUtf16ToLatin1(s_swzTest1, &pszOut);1193 RTTESTI_CHECK_RC(rc, VERR_NO_TRANSLATION);1194 if (RT_SUCCESS(rc))1195 RTStrFree(pszOut);1196 1197 1185 RTStrFree(pszTest1); 1198 1186 RTTestSubDone(hTest);
Note:
See TracChangeset
for help on using the changeset viewer.