int len;
len = MultiByteToWideChar( fromCP, 0, string, -1, NULL, 0 );
- assert( len > 0 );
- wide = (wchar_t *)malloc (len * sizeof (wchar_t));
- if( wide == NULL )
+ if( len == 0 )
return NULL;
+ wchar_t wide[len];
+
MultiByteToWideChar( fromCP, 0, string, -1, wide, len );
len = WideCharToMultiByte( toCP, 0, wide, -1, NULL, 0, NULL, NULL );
- assert( len > 0 );
+ if( len == 0 )
+ return NULL;
out = malloc( len );
WideCharToMultiByte( toCP, 0, wide, -1, out, len, NULL, NULL );
- free( wide );
return out;
}
#endif
*/
FILE *utf8_fopen( const char *filename, const char *mode )
{
-#if !(defined (WIN32) || defined (UNDER_CE))
+#if defined (WIN32) || defined (UNDER_CE)
+ if( GetVersion() < 0x80000000 )
+ {
+ /* for Windows NT and above */
+ wchar_t wpath[MAX_PATH + 1];
+ size_t len = strlen( mode ) + 1;
+ wchar_t wmode[len];
+
+ if( !MultiByteToWideChar( CP_UTF8, 0, filename, -1, wpath, MAX_PATH )
+ || !MultiByteToWideChar( CP_ACP, 0, mode, len, wmode, len ) )
+ {
+ errno = ENOENT;
+ return NULL;
+ }
+ wpath[MAX_PATH] = L'\0';
+
+ /*
+ * fopen() cannot open files with non-“ANSI” characters on Windows.
+ * We use _wfopen() instead. Same thing for mkdir() and stat().
+ */
+ return _wfopen( wpath, wmode );
+ }
+#endif
const char *local_name = ToLocale( filename );
if( local_name != NULL )
}
else
errno = ENOENT;
- return NULL;
-#else
- wchar_t wpath[MAX_PATH + 1];
- size_t len = strlen( mode ) + 1;
- wchar_t wmode[len];
-
- if( !MultiByteToWideChar( CP_UTF8, 0, filename, -1, wpath, MAX_PATH )
- || !MultiByteToWideChar( CP_ACP, 0, mode, len, wmode, len ) )
- {
- errno = ENOENT;
- return NULL;
- }
- wpath[MAX_PATH] = L'\0';
- /*
- * fopen() cannot open files with non-“ANSI” characters on Windows.
- * We use _wfopen() instead. Same thing for mkdir() and stat().
- */
- return _wfopen( wpath, wmode );
-#endif
+ return NULL;
}
/**
void *utf8_opendir( const char *dirname )
{
+ /* TODO: support for WinNT non-ACP filenames */
const char *local_name = ToLocale( dirname );
if( local_name != NULL )
static int utf8_statEx( const char *filename, void *buf,
vlc_bool_t deref )
{
-#if !(defined (WIN32) || defined (UNDER_CE))
-# ifdef HAVE_SYS_STAT_H
+#if defined (WIN32) || defined (UNDER_CE)
+ /* retrieve Windows OS version */
+ if( GetVersion() < 0x80000000 )
+ {
+ /* for Windows NT and above */
+ wchar_t wpath[MAX_PATH + 1];
+
+ if( !MultiByteToWideChar( CP_UTF8, 0, filename, -1, wpath, MAX_PATH ) )
+ {
+ errno = ENOENT;
+ return -1;
+ }
+ wpath[MAX_PATH] = L'\0';
+
+ return _wstati64( wpath, (struct _stati64 *)buf );
+ }
+#endif
+#ifdef HAVE_SYS_STAT_H
const char *local_name = ToLocale( filename );
if( local_name != NULL )
return res;
}
errno = ENOENT;
-# endif
- return -1;
-#else
- wchar_t wpath[MAX_PATH + 1];
-
- if( !MultiByteToWideChar( CP_UTF8, 0, filename, -1, wpath, MAX_PATH ) )
- {
- errno = ENOENT;
- return -1;
- }
- wpath[MAX_PATH] = L'\0';
-
- return _wstati64( wpath, (struct _stati64 *)buf );
#endif
+ return -1;
}
return res;
}
-static int utf8_vfprintf( FILE *stream, const char *fmt, va_list ap )
+int utf8_vfprintf( FILE *stream, const char *fmt, va_list ap )
{
char *str;
int res = utf8_vasprintf( &str, fmt, ap );
{
unsigned char *ptr, c;
+ assert (str != NULL);
+
ptr = (unsigned char *)str;
while( (c = *ptr) != '\0' )
{