r=mkaply, a=blizzard
from jkobal - fix pasting on DBCS systems


git-svn-id: svn://10.0.0.236/trunk@85195 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
mkaply%us.ibm.com
2001-01-20 00:27:45 +00:00
parent b48da65907
commit 05b7020a2e
3 changed files with 19 additions and 14 deletions

View File

@@ -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;
}

View File

@@ -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

View File

@@ -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);