summaryrefslogtreecommitdiff
path: root/bfd/bfdio.c
diff options
context:
space:
mode:
authorClément Chigot <chigot@adacore.com>2022-06-28 09:42:12 +0200
committerClément Chigot <chigot@adacore.com>2022-06-28 16:55:24 +0200
commit68e80d96a84282d547f3b3c1234c99009521630c (patch)
tree2ed72fc7ad30f012a2c35e5a4b99410c53b8abb2 /bfd/bfdio.c
parentfadaf8f7f99f8fe81aa8403c5d90c95cae5bd2ec (diff)
downloadbinutils-gdb-68e80d96a84282d547f3b3c1234c99009521630c.tar.gz
bfd: handle codepage when opening files on MinGW
Even if MS docs say that CP_UTF8 should always be used on newer applications, forcing it might produce undefined filename if the encoding isn't UTF-8. MinGW seems to call ___lc_codepage_func() in order to retrieve the current thread codepage. bfd/ChangeLog: * bfdio.c (_bfd_real_fopen): Retrieve codepage with ___lc_codepage_func() on MinGW.
Diffstat (limited to 'bfd/bfdio.c')
-rw-r--r--bfd/bfdio.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/bfd/bfdio.c b/bfd/bfdio.c
index dc8d3916509..a7c7d5bd363 100644
--- a/bfd/bfdio.c
+++ b/bfd/bfdio.c
@@ -28,6 +28,7 @@
#include "aout/ar.h"
#if defined (_WIN32)
#include <windows.h>
+#include <locale.h>
#endif
#ifndef S_IXUSR
@@ -120,15 +121,20 @@ _bfd_real_fopen (const char *filename, const char *modes)
wchar_t ** lpFilePart = {NULL};
const wchar_t prefix[] = L"\\\\?\\";
const size_t partPathLen = strlen (filename) + 1;
+#ifdef __MINGW32__
+ const unsigned int cp = ___lc_codepage_func();
+#else
+ const unsigned int cp = CP_UTF8;
+#endif
/* Converting the partial path from ascii to unicode.
1) Get the length: Calling with lpWideCharStr set to null returns the length.
2) Convert the string: Calling with cbMultiByte set to -1 includes the terminating null. */
- size_t partPathWSize = MultiByteToWideChar (CP_UTF8, 0, filename, -1, NULL, 0);
+ size_t partPathWSize = MultiByteToWideChar (cp, 0, filename, -1, NULL, 0);
wchar_t * partPath = calloc (partPathWSize, sizeof(wchar_t));
size_t ix;
- MultiByteToWideChar (CP_UTF8, 0, filename, -1, partPath, partPathWSize);
+ MultiByteToWideChar (cp, 0, filename, -1, partPath, partPathWSize);
/* Convert any UNIX style path separators into the DOS i.e. backslash separator. */
for (ix = 0; ix < partPathLen; ix++)
@@ -152,7 +158,7 @@ _bfd_real_fopen (const char *filename, const char *modes)
/* It is non-standard for modes to exceed 16 characters. */
wchar_t modesW[16];
- MultiByteToWideChar (CP_UTF8, 0, modes, -1, modesW, sizeof(modesW));
+ MultiByteToWideChar (cp, 0, modes, -1, modesW, sizeof(modesW));
FILE * file = _wfopen (fullPath, modesW);
free (fullPath);