Fix the behaviour of EM_GETLINE message.
diff --git a/controls/edit.c b/controls/edit.c
index df9d8d9..caec3e8 100644
--- a/controls/edit.c
+++ b/controls/edit.c
@@ -204,7 +204,7 @@
static BOOL EDIT_EM_FmtLines(EDITSTATE *es, BOOL add_eol);
static HLOCAL EDIT_EM_GetHandle(EDITSTATE *es);
static HLOCAL16 EDIT_EM_GetHandle16(WND *wnd, EDITSTATE *es);
-static INT EDIT_EM_GetLine(EDITSTATE *es, INT line, LPWSTR lpch);
+static INT EDIT_EM_GetLine(EDITSTATE *es, INT line, LPARAM lParam, BOOL unicode);
static LRESULT EDIT_EM_GetSel(EDITSTATE *es, LPUINT start, LPUINT end);
static LRESULT EDIT_EM_GetThumb(WND *wnd, EDITSTATE *es);
static INT EDIT_EM_LineFromChar(EDITSTATE *es, INT index);
@@ -661,7 +661,7 @@
/* fall through */
case EM_GETLINE:
DPRINTF_EDIT_MSG32("EM_GETLINE");
- result = (LRESULT)EDIT_EM_GetLine(es, (INT)wParam, (LPWSTR)lParam);
+ result = (LRESULT)EDIT_EM_GetLine(es, (INT)wParam, lParam, unicode);
break;
case EM_LIMITTEXT16:
@@ -2501,10 +2501,10 @@
* EM_GETLINE
*
*/
-static INT EDIT_EM_GetLine(EDITSTATE *es, INT line, LPWSTR lpch)
+static INT EDIT_EM_GetLine(EDITSTATE *es, INT line, LPARAM lParam, BOOL unicode)
{
LPWSTR src;
- INT len;
+ INT line_len, dst_len;
INT i;
if (es->style & ES_MULTILINE) {
@@ -2514,13 +2514,34 @@
line = 0;
i = EDIT_EM_LineIndex(es, line);
src = es->text + i;
- len = min(*(WORD *)lpch, EDIT_EM_LineLength(es, i));
- for (i = 0 ; i < len ; i++) {
- *lpch = *src;
- src++;
- lpch++;
+ line_len = EDIT_EM_LineLength(es, i);
+ dst_len = *(WORD *)lParam;
+ if(unicode)
+ {
+ LPWSTR dst = (LPWSTR)lParam;
+ if(dst_len <= line_len)
+ {
+ memcpy(dst, src, dst_len * sizeof(WCHAR));
+ return dst_len;
+ }
+ else /* Append 0 if enough space */
+ {
+ memcpy(dst, src, line_len * sizeof(WCHAR));
+ dst[line_len] = 0;
+ return line_len;
+ }
}
- return (LRESULT)len;
+ else
+ {
+ LPSTR dst = (LPSTR)lParam;
+ INT ret;
+ ret = WideCharToMultiByte(CP_ACP, 0, src, line_len, dst, dst_len, NULL, NULL);
+ if(!ret) /* Insufficient buffer size */
+ return dst_len;
+ if(ret < dst_len) /* Append 0 if enough space */
+ dst[ret] = 0;
+ return ret;
+ }
}