(svn r7468) -Codechange: [win32] Add some comments to MB/WIDE_TO_WIDE/MB_[BUFFER] macros and
authorDarkvater
Sun, 10 Dec 2006 11:46:43 +0000
changeset 5312 884ebccbd847
parent 5311 9a20c2d925da
child 5313 ea491c0b40f1
(svn r7468) -Codechange: [win32] Add some comments to MB/WIDE_TO_WIDE/MB_[BUFFER] macros and
use them some more in win32 code. Also for the clipboard use the convert_from_fs
function instead of calling Win32 API directly. Make the static buffers in OTTD2FS
and FS2OTTD the same size (character-length wise)
win32.c
win32.h
--- a/win32.c	Sun Dec 10 11:40:31 2006 +0000
+++ b/win32.c	Sun Dec 10 11:46:43 2006 +0000
@@ -368,6 +368,8 @@
 	switch (msg) {
 		case WM_INITDIALOG: {
 #if defined(UNICODE)
+			/* We need to put the crash-log in a seperate buffer because the default
+			 * buffer in MB_TO_WIDE is not large enough (256 chars) */
 			wchar_t crash_msgW[8096];
 #endif
 			SetDlgItemText(wnd, 10, _crash_desc);
@@ -863,16 +865,17 @@
 {
 	int argc;
 	char *argv[64]; // max 64 command line arguments
+	char *cmdline;
 
 #if defined(UNICODE)
-	/* We need to backup the command line (arguments) because the pointer
-	 * of FS2OTTD() is only temporary */
-	char cmdline[MAX_PATH];
-	ttd_strlcpy(cmdline, FS2OTTD(GetCommandLine()), sizeof(cmdline));
-#else
-	char *cmdline = GetCommandLine();
+	/* For UNICODE we need to convert the commandline to char* _AND_
+	 * save it because argv[] points into this buffer and thus needs to
+	 * be available between subsequent calls to FS2OTTD() */
+	char cmdlinebuf[MAX_PATH];
 #endif
 
+	cmdline = WIDE_TO_MB_BUFFER(GetCommandLine(), cmdlinebuf, lengthof(cmdlinebuf));
+
 #if defined(_DEBUG)
 	CreateConsole();
 #endif
@@ -954,20 +957,17 @@
 	uint16 width, length;
 
 	if (IsClipboardFormatAvailable(CF_UNICODETEXT)) {
-		int bytec;
+		const char *ret;
 
 		OpenClipboard(NULL);
 		cbuf = GetClipboardData(CF_UNICODETEXT);
 
 		ptr = GlobalLock(cbuf);
-		bytec = WideCharToMultiByte(CP_UTF8, 0, (wchar_t*)ptr, -1, utf8_buf, lengthof(utf8_buf), NULL, NULL);
+		ret = convert_from_fs((wchar_t*)ptr, utf8_buf, lengthof(utf8_buf));
 		GlobalUnlock(cbuf);
 		CloseClipboard();
 
-		if (bytec == 0) {
-			DEBUG(misc, 0) ("[utf8] Error converting '%s'. Errno %d", ptr, GetLastError());
-			return false;
-		}
+		if (*ret == '\0') return false;
 	} else if (IsClipboardFormatAvailable(CF_TEXT)) {
 		OpenClipboard(NULL);
 		cbuf = GetClipboardData(CF_TEXT);
@@ -1056,7 +1056,7 @@
  * @return pointer to the converted string; if failed string is of zero-length */
 const wchar_t *OTTD2FS(const char *name)
 {
-	static wchar_t utf16_buf[MAX_PATH];
+	static wchar_t utf16_buf[512];
 	return convert_to_fs(name, utf16_buf, lengthof(utf16_buf));
 }
 
@@ -1071,7 +1071,7 @@
 {
 	int len = WideCharToMultiByte(CP_UTF8, 0, name, -1, utf8_buf, buflen, NULL, NULL);
 	if (len == 0) {
-		DEBUG(misc, 0) ("[utf8] Error converting string. Errno %d", GetLastError());
+		DEBUG(misc, 0) ("[utf8] Error converting wide-string. Errno %d", GetLastError());
 		utf8_buf[0] = '\0';
 	}
 
--- a/win32.h	Sun Dec 10 11:40:31 2006 +0000
+++ b/win32.h	Sun Dec 10 11:46:43 2006 +0000
@@ -12,6 +12,12 @@
 char *convert_from_fs(const wchar_t *name, char *utf8_buf, size_t buflen);
 wchar_t *convert_to_fs(const char *name, wchar_t *utf16_buf, size_t buflen);
 
+/* Function shortcuts for UTF-8 <> UNICODE conversion. When unicode is not
+ * defined these macros return the string passed to them, with UNICODE
+ * they return a pointer to the converted string. The only difference between
+ * XX_TO_YY and XX_TO_YY_BUFFER is that with the buffer variant you can
+ * specify where to put the converted string (and how long it can be). Without
+ * the buffer and internal buffer is used, of max 512 characters */
 #if defined(UNICODE)
 # define MB_TO_WIDE(str) OTTD2FS(str)
 # define MB_TO_WIDE_BUFFER(str, buffer, buflen) convert_to_fs(str, buffer, buflen)