提交 05e4fbf8 编写于 作者: A Andy Polyakov

bss_file.c: refine UTF8 logic.

PR: 2382
上级 ef3026a3
...@@ -123,6 +123,7 @@ BIO *BIO_new_file(const char *filename, const char *mode) ...@@ -123,6 +123,7 @@ BIO *BIO_new_file(const char *filename, const char *mode)
#if defined(_WIN32) && defined(CP_UTF8) #if defined(_WIN32) && defined(CP_UTF8)
int sz, len_0 = (int)strlen(filename)+1; int sz, len_0 = (int)strlen(filename)+1;
DWORD flags;
/* /*
* Basically there are three cases to cover: a) filename is * Basically there are three cases to cover: a) filename is
...@@ -136,17 +137,22 @@ BIO *BIO_new_file(const char *filename, const char *mode) ...@@ -136,17 +137,22 @@ BIO *BIO_new_file(const char *filename, const char *mode)
* ERROR_NO_UNICODE_TRANSLATION, in which case we fall * ERROR_NO_UNICODE_TRANSLATION, in which case we fall
* back to fopen... * back to fopen...
*/ */
if ((sz=MultiByteToWideChar(CP_UTF8,MB_ERR_INVALID_CHARS, if ((sz=MultiByteToWideChar(CP_UTF8,(flags=MB_ERR_INVALID_CHARS),
filename,len_0,NULL,0))>0 ||
(GetLastError()==ERROR_INVALID_FLAGS &&
(sz=MultiByteToWideChar(CP_UTF8,(flags=0),
filename,len_0,NULL,0))>0) filename,len_0,NULL,0))>0)
)
{ {
WCHAR wmode[8]; WCHAR wmode[8];
WCHAR *wfilename = _alloca(sz*sizeof(WCHAR)); WCHAR *wfilename = _alloca(sz*sizeof(WCHAR));
if (MultiByteToWideChar(CP_UTF8,MB_ERR_INVALID_CHARS, if (MultiByteToWideChar(CP_UTF8,flags,
filename,len_0,wfilename,sz) && filename,len_0,wfilename,sz) &&
MultiByteToWideChar(CP_UTF8,0,mode,strlen(mode)+1, MultiByteToWideChar(CP_UTF8,0,mode,strlen(mode)+1,
wmode,sizeof(wmode)/sizeof(wmode[0])) && wmode,sizeof(wmode)/sizeof(wmode[0])) &&
(file=_wfopen(wfilename,wmode))==NULL && errno==ENOENT (file=_wfopen(wfilename,wmode))==NULL &&
(errno==ENOENT || errno==EBADF)
) /* UTF-8 decode succeeded, but no file, filename ) /* UTF-8 decode succeeded, but no file, filename
* could still have been locale-ized... */ * could still have been locale-ized... */
file = fopen(filename,mode); file = fopen(filename,mode);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册