[vlc-devel] [PATCH] playlist/directory: ignore case when sorting files
Rémi Denis-Courmont
remi at remlab.net
Thu Aug 20 16:43:10 CEST 2015
Le 2015-08-20 15:48, Thomas Guillem a écrit :
> 4 differents cases when sorting files:
>
> - "collate" option with HAVE_STRCOLL: the case is ignored depending
> of the
> program's LOCAL.
>
> - "collate" option without HAVE_STRCOLL: use strcasecmp instead of
> strcmp to
> ignore the case.
>
> - "version" option with HAVE_STRCOLL: use strxfrm to transform two
> strings into
> a form such that the result of strcmp (or strverscmp for our case)
> on these
> strings is the same result than strcoll. Therefore, the case is
> ignored
> depending of the program's LOCAL.
>
> - "version" option without HAVE_STRCOLL: the case is not ignored.
> ---
> modules/demux/playlist/directory.c | 21 ++++++++++++++++++++-
> 1 file changed, 20 insertions(+), 1 deletion(-)
>
> diff --git a/modules/demux/playlist/directory.c
> b/modules/demux/playlist/directory.c
> index 5c835bb..0ad5913 100644
> --- a/modules/demux/playlist/directory.c
> +++ b/modules/demux/playlist/directory.c
> @@ -129,9 +129,10 @@ static int compar_collate( input_item_t *p1,
> input_item_t *p2 )
> return i_ret;
>
> #ifdef HAVE_STRCOLL
> + /* The program's LOCAL defines if case is ignored */
> return strcoll( p1->psz_name, p2->psz_name );
> #else
> - return strcmp( p1->psz_name, p2->psz_name );
> + return strcasecmp( p1->psz_name, p2->psz_name );
> #endif
> }
>
> @@ -142,7 +143,25 @@ static int compar_version( input_item_t *p1,
> input_item_t *p2 )
> if( i_ret != 0 )
> return i_ret;
>
> +#ifdef HAVE_STRCOLL
> + /* The program's LOCAL defines if case is ignored */
> +
> + /* strxfrm(NULL, src, 0) returns the number of bytes required
> for the
> + * transformation */
> + char *psz_name1 = malloc( strxfrm( NULL, p1->psz_name, 0 ) + 1
> );
> + char *psz_name2 = malloc( strxfrm( NULL, p2->psz_name, 0 ) + 1
> );
> + if( !psz_name1 || !psz_name2 )
> + return 0;
> +
> + strxfrm( psz_name1, p1->psz_name, sizeof(psz_name1) );
> + strxfrm( psz_name2, p2->psz_name, sizeof(psz_name2) );
> + i_ret = strverscmp( psz_name1, psz_name2 );
This does not make any sense.
> + free( psz_name1 );
> + free( psz_name2 );
> + return i_ret;
> +#else
> return strverscmp( p1->psz_name, p2->psz_name );
> +#endif
> }
>
> static int Demux( demux_t *p_demux )
--
Rémi Denis-Courmont
http://www.remlab.net/
More information about the vlc-devel
mailing list