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))
- const char *local_name = ToLocale( filename );
-
- if( local_name != NULL )
- {
- FILE *stream = fopen( local_name, mode );
- LocaleFree( local_name );
- return stream;
- }
- 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';
-
- /* retrieve OS version */
+#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 );
}
- else
+#endif
+ const char *local_name = ToLocale( filename );
+
+ if( local_name != NULL )
{
- /* for Windows Me/98/95 */
- /* we use GetShortFileNameW to get the DOS 8.3 version of the file we need to open */
- char spath[MAX_PATH + 1];
- if( GetShortPathNameW( wpath, spath, MAX_PATH ) )
- {
- fprintf( stderr, "A fopen path: %s -> %s\n", wpath, spath );
- wfprintf( stderr, "W fopen path: %s -> %s\n", wpath, spath );
- return fopen( spath, wmode );
- }
- fprintf( stderr, "GetShortPathName for %s failed\n", wpath );
- errno = ENOENT;
- return NULL;
+ FILE *stream = fopen( local_name, mode );
+ LocaleFree( local_name );
+ return stream;
}
-#endif
+ else
+ errno = ENOENT;
+
+ 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';
-
- /* retrieve Windows OS version */
- if( GetVersion() < 0x80000000 )
- {
- /* for Windows NT and above */
- return _wstati64( wpath, (struct _stati64 *)buf );
- }
- else
- {
- /* for Windows Me/98/95 */
- /* we use GetShortFileNameW to get the DOS 8.3 version */
- char spath[MAX_PATH + 1];
- if( GetShortPathNameW( wpath, spath, MAX_PATH ) )
- {
- fprintf( stderr, "stati path: %s -> %s\n", wpath, spath );
- return _stati64( spath, (struct _stati64 *)buf );
- }
- fprintf( stderr, "GetShortPathName for %s failed\n", wpath );
- errno = ENOENT;
- return -1;
- }
#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' )
{