61 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
		
		
			
		
	
	
			61 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| 
								 | 
							
								diff --git "a/gettext-runtime/intl/loadmsgcat.c" "b/gettext-runtime/intl/loadmsgcat.c"
							 | 
						||
| 
								 | 
							
								index 63351523..c078de3f 100644
							 | 
						||
| 
								 | 
							
								--- a/gettext-runtime/intl/loadmsgcat.c
							 | 
						||
| 
								 | 
							
								+++ b/gettext-runtime/intl/loadmsgcat.c
							 | 
						||
| 
								 | 
							
								@@ -388,6 +388,55 @@ char *alloca ();
							 | 
						||
| 
								 | 
							
								 # define munmap(addr, len)	__munmap (addr, len)
							 | 
						||
| 
								 | 
							
								 #endif
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								+#ifdef _WIN32
							 | 
						||
| 
								 | 
							
								+/* Provide wrapper of "open" for Windows that supports UTF-8 filenames. */
							 | 
						||
| 
								 | 
							
								+# ifndef WIN32_LEAN_AND_MEAN
							 | 
						||
| 
								 | 
							
								+#  define WIN32_LEAN_AND_MEAN
							 | 
						||
| 
								 | 
							
								+# endif
							 | 
						||
| 
								 | 
							
								+# ifndef WIN32_EXTRA_LEAN
							 | 
						||
| 
								 | 
							
								+#  define WIN32_EXTRA_LEAN
							 | 
						||
| 
								 | 
							
								+# endif
							 | 
						||
| 
								 | 
							
								+# undef NOMINMAX
							 | 
						||
| 
								 | 
							
								+# define NOMINMAX
							 | 
						||
| 
								 | 
							
								+# include <windows.h>	// For: MultiByteToWideChar
							 | 
						||
| 
								 | 
							
								+# include <io.h>
							 | 
						||
| 
								 | 
							
								+# include <wchar.h>
							 | 
						||
| 
								 | 
							
								+
							 | 
						||
| 
								 | 
							
								+int _open_utf8_windows_wrapper(
							 | 
						||
| 
								 | 
							
								+   const char *filename,
							 | 
						||
| 
								 | 
							
								+   int flags
							 | 
						||
| 
								 | 
							
								+)
							 | 
						||
| 
								 | 
							
								+{
							 | 
						||
| 
								 | 
							
								+	int wstr_len = -1;
							 | 
						||
| 
								 | 
							
								+	wchar_t* pUtf16FileName = NULL;
							 | 
						||
| 
								 | 
							
								+	int fh = -1;
							 | 
						||
| 
								 | 
							
								+
							 | 
						||
| 
								 | 
							
								+	// on Windows, convert the filename from UTF-8 to UTF-16
							 | 
						||
| 
								 | 
							
								+	wstr_len = MultiByteToWideChar(CP_UTF8, 0, filename, -1, NULL, 0);
							 | 
						||
| 
								 | 
							
								+	if (wstr_len <= 0)
							 | 
						||
| 
								 | 
							
								+	{
							 | 
						||
| 
								 | 
							
								+		// MultiByteToWideChar failed
							 | 
						||
| 
								 | 
							
								+		errno = ENOENT;
							 | 
						||
| 
								 | 
							
								+		return -1;
							 | 
						||
| 
								 | 
							
								+	}
							 | 
						||
| 
								 | 
							
								+	pUtf16FileName = malloc(wstr_len * sizeof(wchar_t));
							 | 
						||
| 
								 | 
							
								+	if (MultiByteToWideChar(CP_UTF8, 0, filename, -1, pUtf16FileName, wstr_len) == 0)
							 | 
						||
| 
								 | 
							
								+	{
							 | 
						||
| 
								 | 
							
								+		// MultiByteToWideChar failed
							 | 
						||
| 
								 | 
							
								+		free(pUtf16FileName);
							 | 
						||
| 
								 | 
							
								+		errno = ENOENT;
							 | 
						||
| 
								 | 
							
								+		return -1;
							 | 
						||
| 
								 | 
							
								+	}
							 | 
						||
| 
								 | 
							
								+
							 | 
						||
| 
								 | 
							
								+	// and call _wopen
							 | 
						||
| 
								 | 
							
								+	fh = _wopen(pUtf16FileName, flags);
							 | 
						||
| 
								 | 
							
								+
							 | 
						||
| 
								 | 
							
								+	free(pUtf16FileName);
							 | 
						||
| 
								 | 
							
								+	return fh;
							 | 
						||
| 
								 | 
							
								+}
							 | 
						||
| 
								 | 
							
								+# define open(name, flags)	_open_utf8_windows_wrapper(name, flags)
							 | 
						||
| 
								 | 
							
								+#endif // #ifdef _WIN32
							 | 
						||
| 
								 | 
							
								+
							 | 
						||
| 
								 | 
							
								 /* For those losing systems which don't have `alloca' we have to add
							 | 
						||
| 
								 | 
							
								    some additional code emulating it.  */
							 | 
						||
| 
								 | 
							
								 #ifdef HAVE_ALLOCA
							 |