[vlc-devel] [PATCH] 'meta_strcasecamp_title' function modified to compare two numericals across the resp. 'title' strings, not lexically but based on their values.

Rémi Denis-Courmont remi at remlab.net
Sat May 9 21:08:46 CEST 2015


	Hello,

Le vendredi 08 mai 2015, 17:40:51 Sandesh C a écrit :
> Tokenized 'title' strings. Comparision between the strings was implemented
> token by token.

Why do you split the strings into tokens?

A fixed list of token separators seems shaky. What about quotes and punctuation 
signs? What about the non-breakable spaces? I fear this turns into a never-
ending chase for The One Complete List...

> Numerical value used for comparison incase of both tokens
> from resp strings are numerics, else lexicographic ordering using
> 'strcasecmp'. Fixes bug #14548.

Proper locale text ordering is achieved strcoll() (or strxfrm() and strcmp()) 
actually. The directory playlist generator is probably a better reference than 
the existing playlist sorting code :-(

> ---
>  src/playlist/sort.c | 84
> ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 83
> insertions(+), 1 deletion(-)
> 
> diff --git a/src/playlist/sort.c b/src/playlist/sort.c
> index 2b91a90..9150f0f 100644
> --- a/src/playlist/sort.c
> +++ b/src/playlist/sort.c
> @@ -33,6 +33,42 @@
>  #include "playlist_internal.h"
> 
> 
> +/**
> + * Tokenize a character array using delimiters
> + * Works similar to 'strtok' function from 'cstdlib'
> + * Ignores all sub-strings which can be generated from characters in
> 'delim' + * @param psz_title: charac. array to be tokenized
> + * @param psz_token_head: pointer to head of the current token
> + * @param psz_delim: list of delimiter ascii characters
> + * @retrun (next token) pointer to a dynamically allocated cstring
> + */
> +char * meta_strtok( const char *psz_title, char **psz_token_head, const
> char *psz_delim ) +{
> +    char *psz_end, *psz_ret;
> +
> +    if( psz_title )
> +        *psz_token_head = psz_title;
> +    else
> +    {
> +        while( **psz_token_head != '\0' && strchr( psz_delim,
> **psz_token_head ) == NULL ) +            *psz_token_head = *psz_token_head
> + 1;
> +        while( **psz_token_head != '\0' && strchr( psz_delim,
> **psz_token_head ) != NULL ) +            *psz_token_head = *psz_token_head
> + 1;
> +    }
> +
> +    if( **psz_token_head == '\0' )
> +        return NULL;
> +
> +    psz_end = *psz_token_head;
> +    while( *psz_end != '\0' && strchr( psz_delim, *psz_end ) == NULL )
> +        psz_end++;
> +
> +    psz_ret = (char *) malloc( (psz_end - *psz_token_head + 1) * sizeof(
> char ) ); +    strncpy( psz_ret, *psz_token_head, psz_end - *psz_token_head
> ); +    psz_ret[ psz_end - *psz_token_head ] = '\0';
> +    return psz_ret;
> +}
> +
>  /* General comparison functions */
>  /**
>   * Compare two items using their title or name
> @@ -47,8 +83,54 @@ static inline int meta_strcasecmp_title( const
> playlist_item_t *first, char *psz_first = input_item_GetTitleFbName(
> first->p_input ); char *psz_second = input_item_GetTitleFbName(
> second->p_input );
> 
> +    char *psz_head_first = NULL, *psz_head_second = NULL;
> +
>      if( psz_first && psz_second )
> -        i_ret = strcasecmp( psz_first, psz_second );
> +    {
> +        /* Get the first token for each of the 'title' */
> +        char *psz_token_first = meta_strtok( psz_first, &psz_head_first, "
> ,/-" ); +        char *psz_token_second = meta_strtok( psz_second,
> &psz_head_second, " ,/-" ); +
> +        do
> +        {
> +            if( !psz_token_first && psz_token_second )
> +                i_ret = 1;
> +            else if( psz_token_first && !psz_token_second )
> +                i_ret = -1;
> +            else
> +            {
> +                i_ret = strcasecmp( psz_token_first, psz_token_second );
> +                if ( !i_ret )
> +                {
> +                    free( psz_token_first );
> +                    free( psz_token_second );
> +
> +                    /* Get the next token(s) */
> +                    psz_token_first = meta_strtok( NULL, &psz_head_first, "
> ,/-" ); +                    psz_token_second = meta_strtok( NULL,
> &psz_head_second, " ,/-" ); +                }
> +                else
> +                {
> +                    /* Check if both the tokens are 'numeric' */
> +                    char psz_buffer_first[10], psz_buffer_second[10];
> +                    sprintf( psz_buffer_first, "%d", atoi( psz_token_first
> ) ); +                    sprintf( psz_buffer_second, "%d", atoi(
> psz_token_second ) ); +
> +                    if( strcmp( psz_buffer_first, psz_token_first ) == 0 &&
> \ +                            strcmp( psz_buffer_second, psz_token_second
> ) == 0 ) +                    {
> +                        /* Both tokens are numeric */
> +                        i_ret = atoi( psz_token_first ) - atoi(
> psz_token_second ); +                    }
> +
> +                    free( psz_token_first );
> +                    free( psz_token_second );
> +                    break;
> +                }
> +            }
> +        }
> +        while( psz_token_first && psz_token_second );
> +    }
>      else if( !psz_first && psz_second )
>          i_ret = 1;
>      else if( psz_first && !psz_second )

-- 
Rémi Denis-Courmont
Remlab T:mi
http://www.remlab.net/




More information about the vlc-devel mailing list