From cc7bf6b4fa2fdee9942a3e1922a79f695c360f37 Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Fri, 2 Dec 2016 21:11:55 -0500 Subject: [PATCH] more unicode fixes --- file_path_special.c | 22 ++++++++++++++++------ gfx/common/win32_common.cpp | 8 +++++--- input/drivers_joypad/dinput_joypad.c | 9 +++++---- input/drivers_joypad/xinput_joypad.c | 1 + input/input_remote.c | 1 + libretro-common/file/retro_dirent.c | 6 ++++-- libretro-common/streams/file_stream.c | 18 +++++++++--------- 7 files changed, 41 insertions(+), 24 deletions(-) diff --git a/file_path_special.c b/file_path_special.c index c4012acb64..32d1ac8be0 100644 --- a/file_path_special.c +++ b/file_path_special.c @@ -15,6 +15,8 @@ #ifdef _WIN32 +#include +#include #include #else #include @@ -207,9 +209,7 @@ void fill_pathname_application_path(char *s, size_t len) #endif #ifdef _WIN32 DWORD ret; -#ifdef UNICODE - wchar_t ws[PATH_MAX_LENGTH] = {0}; -#endif + LPTSTR ws = (LPTSTR)calloc(len, sizeof(TCHAR)); #endif #ifdef __HAIKU__ image_info info; @@ -218,16 +218,26 @@ void fill_pathname_application_path(char *s, size_t len) (void)i; if (!len) + { +#ifdef _WIN32 + if (ws) + free(ws); +#endif return; + } #ifdef _WIN32 + ret = GetModuleFileName(GetModuleHandle(NULL), ws, len - 1); + memset(s, 0, len); #ifdef UNICODE - MultiByteToWideChar(CP_UTF8, 0, s, -1, ws, sizeof(ws) / sizeof(ws[0])); - ret = GetModuleFileNameW(GetModuleHandleW(NULL), ws, sizeof(ws) / sizeof(ws[0])); + utf16_to_char_string(ws, s, len); #else - ret = GetModuleFileName(GetModuleHandle(NULL), s, len - 1); + memcpy(s, ws, len); #endif + if (ws) + free(ws); + s[ret] = '\0'; #elif defined(__APPLE__) if (bundle) diff --git a/gfx/common/win32_common.cpp b/gfx/common/win32_common.cpp index 3d4bda7462..a708d36c34 100644 --- a/gfx/common/win32_common.cpp +++ b/gfx/common/win32_common.cpp @@ -13,6 +13,7 @@ * If not, see . */ +#include #include #include @@ -719,15 +720,16 @@ void win32_set_style(MONITORINFOEX *current_mon, HMONITOR *hm_to_use, } else { - char dev_name[CCHDEVICENAME] = {0}; + WCHAR_TO_CHAR_ALLOC(current_mon->szDevice, dev_name) *style = WS_POPUP | WS_VISIBLE; - utf16_to_char_string((const uint16_t*)current_mon->szDevice, dev_name, sizeof(dev_name)); - if (!win32_monitor_set_fullscreen(*width, *height, refresh, dev_name)) {} + if (dev_name) + free(dev_name); + /* Display settings might have changed, get new coordinates. */ GetMonitorInfo(*hm_to_use, (MONITORINFOEX*)current_mon); *mon_rect = current_mon->rcMonitor; diff --git a/input/drivers_joypad/dinput_joypad.c b/input/drivers_joypad/dinput_joypad.c index 40d542bcc9..8617310477 100644 --- a/input/drivers_joypad/dinput_joypad.c +++ b/input/drivers_joypad/dinput_joypad.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -152,17 +153,17 @@ static bool guid_is_xinput_device(const GUID* product_guid) for (i = 0; i < num_raw_devs; i++) { RID_DEVICE_INFO rdi; - char devName[128] = {0}; + TCHAR devName[128] = {0}; UINT rdiSize = sizeof(rdi); UINT nameSize = sizeof(devName); rdi.cbSize = sizeof (rdi); if ((raw_devs[i].dwType == RIM_TYPEHID) && - (GetRawInputDeviceInfoA(raw_devs[i].hDevice, RIDI_DEVICEINFO, &rdi, &rdiSize) != ((UINT)-1)) && + (GetRawInputDeviceInfo(raw_devs[i].hDevice, RIDI_DEVICEINFO, &rdi, &rdiSize) != ((UINT)-1)) && (MAKELONG(rdi.hid.dwVendorId, rdi.hid.dwProductId) == ((LONG)product_guid->Data1)) && - (GetRawInputDeviceInfoA(raw_devs[i].hDevice, RIDI_DEVICENAME, devName, &nameSize) != ((UINT)-1)) && - (strstr(devName, "IG_") != NULL) ) + (GetRawInputDeviceInfo(raw_devs[i].hDevice, RIDI_DEVICENAME, devName, &nameSize) != ((UINT)-1)) && + (_tcsstr(devName, TEXT("IG_")) != NULL) ) { free(raw_devs); raw_devs = NULL; diff --git a/input/drivers_joypad/xinput_joypad.c b/input/drivers_joypad/xinput_joypad.c index 8959b027ac..8ffb4ef8ce 100644 --- a/input/drivers_joypad/xinput_joypad.c +++ b/input/drivers_joypad/xinput_joypad.c @@ -26,6 +26,7 @@ #include #include +#include #include #include #include diff --git a/input/input_remote.c b/input/input_remote.c index 5523e24dd3..5d27734ed7 100644 --- a/input/input_remote.c +++ b/input/input_remote.c @@ -20,6 +20,7 @@ #include #ifdef _WIN32 +#include #include #else #include diff --git a/libretro-common/file/retro_dirent.c b/libretro-common/file/retro_dirent.c index 4a9a02aeca..eb6cc45adc 100644 --- a/libretro-common/file/retro_dirent.c +++ b/libretro-common/file/retro_dirent.c @@ -103,11 +103,13 @@ int retro_readdir(struct RDIR *rdir) const char *retro_dirent_get_name(struct RDIR *rdir) { #if defined(_WIN32) - memset(rdir->path, 0, sizeof(rdir->path)); #ifdef UNICODE + memset(rdir->path, 0, sizeof(rdir->path)); utf16_to_char_string((const uint16_t*)rdir->entry.cFileName, rdir->path, sizeof(rdir->path)); -#endif return rdir->path; +#else + return rdir->entry.cFileName; +#endif #elif defined(VITA) || defined(PSP) || defined(__CELLOS_LV2__) return rdir->entry.d_name; #else diff --git a/libretro-common/streams/file_stream.c b/libretro-common/streams/file_stream.c index dfa2ef1a96..f88131389a 100644 --- a/libretro-common/streams/file_stream.c +++ b/libretro-common/streams/file_stream.c @@ -76,10 +76,10 @@ struct RFILE #define HAVE_BUFFERED_IO 1 #ifdef _WIN32 -#define MODE_STR_READ L"r" -#define MODE_STR_READ_UNBUF L"rb" -#define MODE_STR_WRITE_UNBUF L"wb" -#define MODE_STR_WRITE_PLUS L"w+" +#define MODE_STR_READ TEXT("r") +#define MODE_STR_READ_UNBUF TEXT("rb") +#define MODE_STR_WRITE_UNBUF TEXT("wb") +#define MODE_STR_WRITE_PLUS TEXT("w+") #else #define MODE_STR_READ "r" #define MODE_STR_READ_UNBUF "rb" @@ -116,10 +116,7 @@ RFILE *filestream_open(const char *path, unsigned mode, ssize_t len) int mode_int = 0; #if defined(HAVE_BUFFERED_IO) #ifdef _WIN32 - const wchar_t *mode_str = NULL; - wchar_t path_wide[PATH_MAX_LENGTH] = {0}; -#else - const char *mode_str = NULL; + const TCHAR *mode_str = NULL; #endif #endif RFILE *stream = (RFILE*)calloc(1, sizeof(*stream)); @@ -212,8 +209,11 @@ RFILE *filestream_open(const char *path, unsigned mode, ssize_t len) if ((stream->hints & RFILE_HINT_UNBUFFERED) == 0) { #ifdef _WIN32 - MultiByteToWideChar(CP_UTF8, 0, path, -1, path_wide, sizeof(path_wide) / sizeof(path_wide[0])); + CHAR_TO_WCHAR_ALLOC(path, path_wide) stream->fp = _wfopen(path_wide, mode_str); + + if (path_wide) + free(path_wide); #else stream->fp = fopen(path, mode_str); #endif