This patch works fine for me. Could you please test it too?

--- cvs/wine/controls/edit.c    Fri Jan  5 15:21:35 2001
+++ wine/controls/edit.c        Tue Jan  9 22:13:46 2001
@@ -1482,25 +1482,22 @@
        }
        if (!es->text) {
            CHAR *textA = NULL;
-           INT countA = 0;
+           UINT countA = 0;
            BOOL _16bit = FALSE;
 
            if(es->hloc32W)
            {
-               /*TRACE("Locking 32-bit UNICODE buffer\n");*/
-               es->text = LocalLock(es->hloc32W);
-
                if(es->hloc32A)
                {
                    TRACE("Synchronizing with 32-bit ANSI buffer\n");
-                   countA = LocalSize(es->hloc32A);
                    textA = LocalLock(es->hloc32A);
+                   countA = strlen(textA) + 1;
                }
                else if(es->hloc16)
                {
                    TRACE("Synchronizing with 16-bit ANSI buffer\n");
-                   countA = LOCAL_Size(wnd->hInstance, es->hloc16);
                    textA = LOCAL_Lock(wnd->hInstance, es->hloc16);
+                   countA = strlen(textA) + 1;
                    _16bit = TRUE;
                }
            }
@@ -1511,7 +1508,31 @@
 
            if(textA)
            {
-               MultiByteToWideChar(CP_ACP, 0, textA, countA, es->text, 
es->buffer_size);
+               HLOCAL hloc32W_new;
+               UINT countW_new = MultiByteToWideChar(CP_ACP, 0, textA, countA, NULL, 
+0);
+               TRACE("%d bytes translated to %d WCHARs\n", countA, countW_new);
+               if(countW_new > es->buffer_size + 1)
+               {
+                   UINT alloc_size = (countW_new * sizeof(WCHAR) + GROWLENGTH - 1) & 
+~(GROWLENGTH - 1);
+                   TRACE("Resizing 32-bit UNICODE buffer from %d+1 to %d WCHARs\n", 
+es->buffer_size, countW_new);
+                   hloc32W_new = LocalReAlloc(es->hloc32W, alloc_size, LMEM_MOVEABLE 
+| LMEM_ZEROINIT);
+                   if(hloc32W_new)
+                   {
+                       es->hloc32W = hloc32W_new;
+                       es->buffer_size = LocalSize(hloc32W_new)/sizeof(WCHAR) - 1;
+                       TRACE("Real new size %d+1 WCHARs\n", es->buffer_size);
+                   }
+                   else
+                       WARN("FAILED! Will synchronize partially\n");
+               }
+           }
+
+           /*TRACE("Locking 32-bit UNICODE buffer\n");*/
+           es->text = LocalLock(es->hloc32W);
+
+           if(textA)
+           {
+               MultiByteToWideChar(CP_ACP, 0, textA, countA, es->text, 
+es->buffer_size + 1);
                if(_16bit)
                    LOCAL_Unlock(wnd->hInstance, es->hloc16);
                else
@@ -2140,25 +2161,60 @@
            if (es->hloc32W) {
                CHAR *textA = NULL;
                BOOL _16bit = FALSE;
-               INT countA = 0;
+               UINT countA = 0;
+               UINT countW = strlenW(es->text) + 1;
 
                if(es->hloc32A)
                {
+                   UINT countA_new = WideCharToMultiByte(CP_ACP, 0, es->text, countW, 
+NULL, 0, NULL, NULL);
                    TRACE("Synchronizing with 32-bit ANSI buffer\n");
+                   TRACE("%d WCHARs translated to %d bytes\n", countW, countA_new);
                    countA = LocalSize(es->hloc32A);
+                   if(countA_new > countA)
+                   {
+                       HLOCAL hloc32A_new;
+                       UINT alloc_size = (countA_new + GROWLENGTH - 1) & ~(GROWLENGTH 
+- 1);
+                       TRACE("Resizing 32-bit ANSI buffer from %d to %d bytes\n", 
+countA, alloc_size);
+                       hloc32A_new = LocalReAlloc(es->hloc32A, alloc_size, 
+LMEM_MOVEABLE | LMEM_ZEROINIT);
+                       if(hloc32A_new)
+                       {
+                           es->hloc32A = hloc32A_new;
+                           countA = LocalSize(hloc32A_new);
+                           TRACE("Real new size %d bytes\n", countA);
+                       }
+                       else
+                           WARN("FAILED! Will synchronize partially\n");
+                   }
                    textA = LocalLock(es->hloc32A);
                }
                else if(es->hloc16)
                {
+                   UINT countA_new = WideCharToMultiByte(CP_ACP, 0, es->text, countW, 
+NULL, 0, NULL, NULL);
                    TRACE("Synchronizing with 16-bit ANSI buffer\n");
+                   TRACE("%d WCHARs translated to %d bytes\n", countW, countA_new);
                    countA = LOCAL_Size(wnd->hInstance, es->hloc16);
+                   if(countA_new > countA)
+                   {
+                       HLOCAL16 hloc16_new;
+                       UINT alloc_size = (countA_new + GROWLENGTH - 1) & ~(GROWLENGTH 
+- 1);
+                       TRACE("Resizing 16-bit ANSI buffer from %d to %d bytes\n", 
+countA, alloc_size);
+                       hloc16_new = LOCAL_ReAlloc(wnd->hInstance, es->hloc16, 
+alloc_size, LMEM_MOVEABLE | LMEM_ZEROINIT);
+                       if(hloc16_new)
+                       {
+                           es->hloc16 = hloc16_new;
+                           countA = LOCAL_Size(wnd->hInstance, hloc16_new);
+                           TRACE("Real new size %d bytes\n", countA);
+                       }
+                       else
+                           WARN("FAILED! Will synchronize partially\n");
+                   }
                    textA = LOCAL_Lock(wnd->hInstance, es->hloc16);
                    _16bit = TRUE;
                }
 
                if(textA)
                {
-                   WideCharToMultiByte(CP_ACP, 0, es->text, es->buffer_size, textA, 
countA, NULL, NULL);
+                   WideCharToMultiByte(CP_ACP, 0, es->text, countW, textA, countA, 
+NULL, NULL);
                    if(_16bit)
                        LOCAL_Unlock(wnd->hInstance, es->hloc16);
                    else



Reply via email to