- int sz,len_0 = (int)strlen(filename)+1;
- if ((sz=MultiByteToWideChar(CP_UTF8,0,filename,len_0,
- NULL,0))>0)
- {
- WCHAR wmode[8];
- WCHAR *wfilename = _alloca(sz*sizeof(WCHAR));
-
- if (MultiByteToWideChar(CP_UTF8,0,filename,len_0,
- wfilename,sz) &&
- MultiByteToWideChar(CP_UTF8,0,mode,strlen(mode)+1,
- wmode,sizeof(wmode)/sizeof(wmode[0]))
- )
- file = _wfopen(wfilename,wmode);
- }
+ WCHAR wmode[8];
+ WCHAR *wfilename = _alloca(sz*sizeof(WCHAR));
+
+ if (MultiByteToWideChar(CP_UTF8,MB_ERR_INVALID_CHARS,
+ filename,len_0,wfilename,sz) &&
+ MultiByteToWideChar(CP_UTF8,0,mode,strlen(mode)+1,
+ wmode,sizeof(wmode)/sizeof(wmode[0])) &&
+ (file=_wfopen(wfilename,wmode))==NULL && errno==ENOENT
+ ) /* UTF-8 decode succeeded, but no file, filename
+ * could still have been locale-ized... */
+ file = fopen(filename,mode);
+ }
+ else if (GetLastError()==ERROR_NO_UNICODE_TRANSLATION)
+ {
+ file = fopen(filename,mode);