X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Ftext%2Fstrings.c;h=5d1395782375435cf10a18dedb84537c235b7578;hb=7ca4e3eb624251feb1f97cfc25104cce473e04a0;hp=1f9aea3d99691e078ab2d6e9631f73e83ed24598;hpb=51880eb16eed467a21c34b9e4bb962d1bd6a5be7;p=vlc diff --git a/src/text/strings.c b/src/text/strings.c index 1f9aea3d99..5d13957823 100644 --- a/src/text/strings.c +++ b/src/text/strings.c @@ -26,10 +26,11 @@ /***************************************************************************** * Preamble *****************************************************************************/ -#include -#include -#include -#include +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include #include /* Needed by str_format_time */ @@ -558,7 +559,7 @@ size_t vlc_b64_decode_binary_to_buffer( uint8_t *p_dst, size_t i_dst, const char int i_level; int i_last; - for( i_level = 0, i_last = 0; i_dst > 0 && *p != '\0'; i_dst--, p++ ) + for( i_level = 0, i_last = 0; (size_t)( p_dst - p_start ) < i_dst && *p != '\0'; p++ ) { const int c = b64[(unsigned int)*p]; if( c == -1 ) @@ -617,64 +618,60 @@ char *str_format_time( const char *tformat ) { char buffer[255]; time_t curtime; -#if defined(HAVE_LOCALTIME_R) struct tm loctime; -#else - struct tm *loctime; -#endif /* Get the current time. */ curtime = time( NULL ); /* Convert it to local time representation. */ -#if defined(HAVE_LOCALTIME_R) localtime_r( &curtime, &loctime ); strftime( buffer, 255, tformat, &loctime ); -#else - loctime = localtime( &curtime ); - strftime( buffer, 255, tformat, loctime ); -#endif return strdup( buffer ); } -#define INSERT_STRING( check, string ) \ - if( check && string ) \ +#define INSERT_STRING( string ) \ + if( string != NULL ) \ { \ int len = strlen( string ); \ - dst = realloc( dst, \ - i_size = i_size + len + 1 ); \ - strncpy( d, string, len+1 ); \ + dst = realloc( dst, i_size = i_size + len );\ + memcpy( (dst+d), string, len ); \ d += len; \ + free( string ); \ } \ else \ { \ - *d = '-'; \ + *(dst+d) = '-'; \ d++; \ + } \ + +/* same than INSERT_STRING, except that string won't be freed */ +#define INSERT_STRING_NO_FREE( string ) \ + { \ + int len = strlen( string ); \ + dst = realloc( dst, i_size = i_size + len );\ + memcpy( dst+d, string, len ); \ + d += len; \ } char *__str_format_meta( vlc_object_t *p_object, const char *string ) { const char *s = string; - char *dst = malloc( 1000 ); - char *d = dst; int b_is_format = 0; int b_empty_if_na = 0; char buf[10]; - int i_size = strlen( string ); + int i_size = strlen( string ) + 1; /* +1 to store '\0' */ + char *dst = strdup( string ); + if( !dst ) return NULL; + int d = 0; playlist_t *p_playlist = pl_Yield( p_object ); - input_thread_t *p_input = p_playlist->p_input; + input_thread_t *p_input = playlist_CurrentInput( p_playlist ); input_item_t *p_item = NULL; pl_Release( p_object ); if( p_input ) { - vlc_object_yield( p_input ); p_item = input_GetItem(p_input); - if( p_item ) - vlc_mutex_lock( &p_item->lock ); } - sprintf( dst, string ); - while( *s ) { if( b_is_format ) @@ -682,58 +679,104 @@ char *__str_format_meta( vlc_object_t *p_object, const char *string ) switch( *s ) { case 'a': - INSERT_STRING( p_item, input_item_GetArtist(p_item) ); + if( p_item ) + { + INSERT_STRING( input_item_GetArtist( p_item ) ); + } break; case 'b': - INSERT_STRING( p_item, input_item_GetAlbum(p_item) ); + if( p_item ) + { + INSERT_STRING( input_item_GetAlbum( p_item ) ); + } break; case 'c': - INSERT_STRING( p_item, input_item_GetCopyright(p_item) ); + if( p_item ) + { + INSERT_STRING( input_item_GetCopyright( p_item ) ); + } break; case 'd': - INSERT_STRING( p_item, input_item_GetDescription(p_item) ); + if( p_item ) + { + INSERT_STRING( input_item_GetDescription( p_item ) ); + } break; case 'e': - INSERT_STRING( p_item, input_item_GetEncodedBy(p_item) ); + if( p_item ) + { + INSERT_STRING( input_item_GetEncodedBy( p_item ) ); + } + break; + case 'f': + if( p_item && p_item->p_stats ) + { + snprintf( buf, 10, "%d", + p_item->p_stats->i_displayed_pictures ); + } + else + { + sprintf( buf, b_empty_if_na ? "" : "-" ); + } + INSERT_STRING_NO_FREE( buf ); break; case 'g': - INSERT_STRING( p_item, input_item_GetGenre(p_item) ); + if( p_item ) + { + INSERT_STRING( input_item_GetGenre( p_item ) ); + } break; case 'l': - INSERT_STRING( p_item, input_item_GetLanguage(p_item) ); + if( p_item ) + { + INSERT_STRING( input_item_GetLanguage( p_item ) ); + } break; case 'n': - INSERT_STRING( p_item, input_item_GetTrackNum(p_item) ); + if( p_item ) + { + INSERT_STRING( input_item_GetTrackNum( p_item ) ); + } break; case 'p': - INSERT_STRING( p_item, input_item_GetNowPlaying(p_item) ); + if( p_item ) + { + INSERT_STRING( input_item_GetNowPlaying( p_item ) ); + } break; case 'r': - INSERT_STRING( p_item, input_item_GetRating(p_item) ); + if( p_item ) + { + INSERT_STRING( input_item_GetRating( p_item ) ); + } break; case 's': { - char *lang; + char *lang = NULL; if( p_input ) - { - lang = var_GetString( p_input, "sub-language" ); - } - else - { + lang = var_GetNonEmptyString( p_input, "sub-language" ); + if( lang == NULL ) lang = strdup( b_empty_if_na ? "" : "-" ); - } - INSERT_STRING( 1, lang ); - free( lang ); + INSERT_STRING( lang ); break; } case 't': - INSERT_STRING( p_item, input_item_GetTitle(p_item) ); + if( p_item ) + { + INSERT_STRING( input_item_GetTitle( p_item ) ); + } break; case 'u': - INSERT_STRING( p_item, input_item_GetURL(p_item) ); + if( p_item ) + { + INSERT_STRING( input_item_GetURL( p_item ) ); + } break; case 'A': - INSERT_STRING( p_item, input_item_GetDate(p_item) ); + if( p_item ) + { + INSERT_STRING( input_item_GetDate( p_item ) ); + } break; case 'B': if( p_input ) @@ -745,7 +788,7 @@ char *__str_format_meta( vlc_object_t *p_object, const char *string ) { sprintf( buf, b_empty_if_na ? "" : "-" ); } - INSERT_STRING( 1, buf ); + INSERT_STRING_NO_FREE( buf ); break; case 'C': if( p_input ) @@ -757,24 +800,28 @@ char *__str_format_meta( vlc_object_t *p_object, const char *string ) { sprintf( buf, b_empty_if_na ? "" : "-" ); } - INSERT_STRING( 1, buf ); + INSERT_STRING_NO_FREE( buf ); break; case 'D': if( p_item ) { + mtime_t i_duration = input_item_GetDuration( p_item ); sprintf( buf, "%02d:%02d:%02d", - (int)(p_item->i_duration/(3600000000)), - (int)((p_item->i_duration/(60000000))%60), - (int)((p_item->i_duration/1000000)%60) ); + (int)(i_duration/(3600000000)), + (int)((i_duration/(60000000))%60), + (int)((i_duration/1000000)%60) ); } else { sprintf( buf, b_empty_if_na ? "" : "--:--:--" ); } - INSERT_STRING( 1, buf ); + INSERT_STRING_NO_FREE( buf ); break; case 'F': - INSERT_STRING( p_item, p_item->psz_uri ); + if( p_item ) + { + INSERT_STRING( input_item_GetURI( p_item ) ); + } break; case 'I': if( p_input ) @@ -786,38 +833,39 @@ char *__str_format_meta( vlc_object_t *p_object, const char *string ) { sprintf( buf, b_empty_if_na ? "" : "-" ); } - INSERT_STRING( 1, buf ); + INSERT_STRING_NO_FREE( buf ); break; case 'L': if( p_item && p_input ) { + mtime_t i_duration = input_item_GetDuration( p_item ); + int64_t i_time = p_input->i_time; sprintf( buf, "%02d:%02d:%02d", - (int)((p_item->i_duration-p_input->i_time)/(3600000000)), - (int)(((p_item->i_duration-p_input->i_time)/(60000000))%60), - (int)(((p_item->i_duration-p_input->i_time)/1000000)%60) ); + (int)( ( i_duration - i_time ) / 3600000000 ), + (int)( ( ( i_duration - i_time ) / 60000000 ) % 60 ), + (int)( ( ( i_duration - i_time ) / 1000000 ) % 60 ) ); } else { sprintf( buf, b_empty_if_na ? "" : "--:--:--" ); } - INSERT_STRING( 1, buf ); + INSERT_STRING_NO_FREE( buf ); break; case 'N': - INSERT_STRING( p_item, p_item->psz_name ); + if( p_item ) + { + INSERT_STRING( input_item_GetName( p_item ) ); + } break; case 'O': { - char *lang; + char *lang = NULL; if( p_input ) - { - lang = var_GetString( p_input, "audio-language" ); - } - else - { + lang = var_GetNonEmptyString( p_input, + "audio-language" ); + if( lang == NULL ) lang = strdup( b_empty_if_na ? "" : "-" ); - } - INSERT_STRING( 1, lang ); - free( lang ); + INSERT_STRING( lang ); break; } case 'P': @@ -830,7 +878,7 @@ char *__str_format_meta( vlc_object_t *p_object, const char *string ) { sprintf( buf, b_empty_if_na ? "" : "--.-%%" ); } - INSERT_STRING( 1, buf ); + INSERT_STRING_NO_FREE( buf ); break; case 'R': if( p_input ) @@ -842,7 +890,7 @@ char *__str_format_meta( vlc_object_t *p_object, const char *string ) { sprintf( buf, b_empty_if_na ? "" : "-" ); } - INSERT_STRING( 1, buf ); + INSERT_STRING_NO_FREE( buf ); break; case 'S': if( p_input ) @@ -854,35 +902,38 @@ char *__str_format_meta( vlc_object_t *p_object, const char *string ) { sprintf( buf, b_empty_if_na ? "" : "-" ); } - INSERT_STRING( 1, buf ); + INSERT_STRING_NO_FREE( buf ); break; case 'T': if( p_input ) { sprintf( buf, "%02d:%02d:%02d", - (int)(p_input->i_time/(3600000000)), - (int)((p_input->i_time/(60000000))%60), - (int)((p_input->i_time/1000000)%60) ); + (int)( p_input->i_time / ( 3600000000 ) ), + (int)( ( p_input->i_time / ( 60000000 ) ) % 60 ), + (int)( ( p_input->i_time / 1000000 ) % 60 ) ); } else { sprintf( buf, b_empty_if_na ? "" : "--:--:--" ); } - INSERT_STRING( 1, buf ); + INSERT_STRING_NO_FREE( buf ); break; case 'U': - INSERT_STRING( p_item, input_item_GetPublisher(p_item) ); + if( p_item ) + { + INSERT_STRING( input_item_GetPublisher( p_item ) ); + } break; case 'V': { audio_volume_t volume; aout_VolumeGet( p_object, &volume ); snprintf( buf, 10, "%d", volume ); - INSERT_STRING( 1, buf ); + INSERT_STRING_NO_FREE( buf ); break; } case '_': - *d = '\n'; + *(dst+d) = '\n'; d++; break; @@ -891,7 +942,7 @@ char *__str_format_meta( vlc_object_t *p_object, const char *string ) break; default: - *d = *s; + *(dst+d) = *s; d++; break; } @@ -905,19 +956,15 @@ char *__str_format_meta( vlc_object_t *p_object, const char *string ) } else { - *d = *s; + *(dst+d) = *s; d++; } s++; } - *d = '\0'; + *(dst+d) = '\0'; if( p_input ) - { vlc_object_release( p_input ); - if( p_item ) - vlc_mutex_unlock( &p_item->lock ); - } return dst; } @@ -954,7 +1001,9 @@ void filename_sanitize( char *str ) switch( *str ) { case '/': -#ifdef WIN32 +#if defined( __APPLE__ ) + case ':': +#elif defined( WIN32 ) case '\\': case '*': case '"': @@ -989,7 +1038,10 @@ void path_sanitize( char *str ) #endif while( *str ) { -#ifdef WIN32 +#if defined( __APPLE__ ) + if( *str == ':' ) + *str = '_'; +#elif defined( WIN32 ) switch( *str ) { case '*':