diff --git a/mozilla/widget/src/os2/nsClipboard.cpp b/mozilla/widget/src/os2/nsClipboard.cpp index 24039a05c11..8f063f318fd 100644 --- a/mozilla/widget/src/os2/nsClipboard.cpp +++ b/mozilla/widget/src/os2/nsClipboard.cpp @@ -141,7 +141,8 @@ PRBool nsClipboard::GetClipboardDataByID(ULONG ulFormatID, const char *aFlavor) pTempBuf = nsMemory::Alloc( NumOfBytes + sizeof(UniChar) ); TempBufAllocated = PR_TRUE; - gModuleData.ConvertToUcs( NS_STATIC_CAST(char*, pDataMem), NS_STATIC_CAST(PRUnichar*, pTempBuf), NumOfChars + 1 ); + NumOfChars = gModuleData.ConvertToUcs( NS_STATIC_CAST(char*, pDataMem), NS_STATIC_CAST(PRUnichar*, pTempBuf), NumOfChars + 1 ); + NumOfBytes = NumOfChars * sizeof(UniChar); pDataMem = pTempBuf; } diff --git a/mozilla/widget/src/os2/nsModule.cpp b/mozilla/widget/src/os2/nsModule.cpp index 988a3b9ac8f..a6956d7d9da 100644 --- a/mozilla/widget/src/os2/nsModule.cpp +++ b/mozilla/widget/src/os2/nsModule.cpp @@ -223,9 +223,9 @@ int nsWidgetModuleData::CreateUcsConverter() } // Conversion from appropriate codepage to unicode -PRUnichar *nsWidgetModuleData::ConvertToUcs( const char *szText, - PRUnichar *pBuffer, - ULONG ulSize) +ULONG nsWidgetModuleData::ConvertToUcs( const char *szText, + PRUnichar *pBuffer, + ULONG ulSize) { if( supplantConverter) { @@ -233,19 +233,19 @@ PRUnichar *nsWidgetModuleData::ConvertToUcs( const char *szText, // Note this algorithm is fine for most of most western charsets, but // fails dismally for various glyphs, baltic, points east... ULONG ulCount = 0; - PRUnichar *pSave = pBuffer; + PRUnichar *pTmp = pBuffer; while( *szText && ulCount < ulSize - 1) // (one for terminator) { - *pBuffer = (PRUnichar)((SHORT)*szText & 0x00FF); - pBuffer++; + *pTmp = (PRUnichar)((SHORT)*szText & 0x00FF); + pTmp++; szText++; ulCount++; } // terminate string - *pBuffer = (PRUnichar)0; + *pTmp = (PRUnichar)0; - return pSave; + return ulCount; } if( !converter) @@ -264,8 +264,7 @@ PRUnichar *nsWidgetModuleData::ConvertToUcs( const char *szText, size_t ucsLen = ulSize; size_t cSubs = 0; - // function alters the out pointer - UniChar *tmp = NS_REINTERPRET_CAST(UniChar *,pBuffer); + UniChar *tmp = NS_REINTERPRET_CAST(UniChar *,pBuffer); // function alters the out pointer int unirc = UniUconvToUcs( converter, (void **)&szText, &szLen, &tmp, &ucsLen, &cSubs); @@ -274,16 +273,21 @@ PRUnichar *nsWidgetModuleData::ConvertToUcs( const char *szText, { // terminate output string (truncating) *(pBuffer + ulSize - 1) = (PRUnichar)0; + ucsLen = ulSize - 1; } else if( unirc != ULS_SUCCESS) { printf( "UniUconvToUcs failed, rc %X\n", unirc); supplantConverter = TRUE; - pBuffer = ConvertToUcs( szText, pBuffer, ulSize); + ucsLen = ConvertToUcs( szText, pBuffer, ulSize); supplantConverter = FALSE; } + else + { + *(pBuffer + ucsLen) = (PRUnichar)0; + } - return pBuffer; + return (ULONG)ucsLen; } // Conversion from unicode to appropriate codepage diff --git a/mozilla/widget/src/os2/nsWidgetDefs.h b/mozilla/widget/src/os2/nsWidgetDefs.h index 1e89ab3db3d..d00b4ae0122 100644 --- a/mozilla/widget/src/os2/nsWidgetDefs.h +++ b/mozilla/widget/src/os2/nsWidgetDefs.h @@ -144,7 +144,7 @@ class nsWidgetModuleData HPOINTER GetFrameIcon(); // local->Unicode cp. conversion - PRUnichar *ConvertToUcs( const char *szText, PRUnichar *pBuffer, ULONG ulSize); + ULONG ConvertToUcs( const char *szText, PRUnichar *pBuffer, ULONG ulSize); // Unicode->local cp. conversions char *ConvertFromUcs( const PRUnichar *pText, char *szBuffer, ULONG ulSize);