From 798b0d97c4298d4b0efe3bfbda50ba24800212f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Denis-Courmont?= Date: Mon, 27 Mar 2006 11:26:50 +0000 Subject: [PATCH] utf8_scandir: Unicode wrapper for scandir() --- include/charset.h | 1 + include/vlc_symbols.h | 3 +++ src/misc/unicode.c | 61 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 65 insertions(+) diff --git a/include/charset.h b/include/charset.h index c2f8a5783e..9dd24389c6 100644 --- a/include/charset.h +++ b/include/charset.h @@ -37,6 +37,7 @@ VLC_EXPORT( char *, ToLocale, ( const char * ) ); VLC_EXPORT( FILE *, utf8_fopen, ( const char *filename, const char *mode ) ); VLC_EXPORT( void *, utf8_opendir, ( const char *dirname ) ); VLC_EXPORT( const char *, utf8_readdir, ( void *dir ) ); +VLC_EXPORT( int, utf8_scandir, ( const char *dirname, char ***namelist, int (*select)( const char * ), int (*compar)( const char **, const char ** ) ) ); VLC_EXPORT( int, utf8_stat, ( const char *filename, void *buf ) ); VLC_EXPORT( int, utf8_lstat, ( const char *filename, void *buf ) ); VLC_EXPORT( int, utf8_mkdir, ( const char *filename ) ); diff --git a/include/vlc_symbols.h b/include/vlc_symbols.h index 1743db62dc..3c86ce04d3 100644 --- a/include/vlc_symbols.h +++ b/include/vlc_symbols.h @@ -487,6 +487,7 @@ struct module_symbols_t char * (*FromUTF16_inner) (const uint16_t *); const char * (*IsUTF8_inner) (const char *); const char * (*GetFallbackEncoding_inner) (void); + int (*utf8_scandir_inner) (const char *dirname, char ***namelist, int (*select)( const char * ), int (*compar)( const char **, const char ** )); }; # if defined (__PLUGIN__) # define aout_FiltersCreatePipeline (p_symbols)->aout_FiltersCreatePipeline_inner @@ -954,6 +955,7 @@ struct module_symbols_t # define FromUTF16 (p_symbols)->FromUTF16_inner # define IsUTF8 (p_symbols)->IsUTF8_inner # define GetFallbackEncoding (p_symbols)->GetFallbackEncoding_inner +# define utf8_scandir (p_symbols)->utf8_scandir_inner # elif defined (HAVE_DYNAMIC_PLUGINS) && !defined (__BUILTIN__) /****************************************************************** * STORE_SYMBOLS: store VLC APIs into p_symbols for plugin access. @@ -1424,6 +1426,7 @@ struct module_symbols_t ((p_symbols)->FromUTF16_inner) = FromUTF16; \ ((p_symbols)->IsUTF8_inner) = IsUTF8; \ ((p_symbols)->GetFallbackEncoding_inner) = GetFallbackEncoding; \ + ((p_symbols)->utf8_scandir_inner) = utf8_scandir; \ (p_symbols)->net_ConvertIPv4_deprecated = NULL; \ (p_symbols)->__stats_CounterGet_deprecated = NULL; \ (p_symbols)->__stats_TimerDumpAll_deprecated = NULL; \ diff --git a/src/misc/unicode.c b/src/misc/unicode.c index cf3432e24a..0c9f4a8fdc 100644 --- a/src/misc/unicode.c +++ b/src/misc/unicode.c @@ -34,6 +34,7 @@ #include #include +#include #include #include #ifdef HAVE_DIRENT_H @@ -420,6 +421,66 @@ const char *utf8_readdir( void *dir ) return FromLocale( ent->d_name ); } +static int dummy_select( const char *str ) +{ + (void)str; + return 1; +} + +int utf8_scandir( const char *dirname, char ***namelist, + int (*select)( const char * ), + int (*compar)( const char **, const char ** ) ) +{ + DIR *dir = utf8_opendir( dirname ); + + if( select == NULL ) + select = dummy_select; + + if( dir == NULL ) + return -1; + else + { + char **tab = NULL; + const char *entry; + unsigned num = 0; + + while( ( entry = utf8_readdir( dir ) ) != NULL ) + { + char **newtab; + char *utf_entry = strdup( entry ); + LocaleFree( entry ); + if( utf_entry == NULL ) + goto error; + + if( !select( utf_entry ) ) + continue; + + newtab = realloc( tab, sizeof( char * ) * (num + 1) ); + if( newtab == NULL ) + goto error; + tab = newtab; + tab[num++] = utf_entry; + } + closedir( dir ); + + if( compar != NULL ) + qsort( tab, num, sizeof( tab[0] ), + (int (*)( const void *, const void *))compar ); + + *namelist = tab; + return num; + + error:{ + unsigned i; + + for( i = 0; i < num; i++ ) + free( tab[i] ); + if( tab != NULL ) + free( tab ); + return -1;} + } +} + static int utf8_statEx( const char *filename, void *buf, vlc_bool_t deref ) -- GitLab