X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Ftext%2Fstrings.c;h=86b2922206b1fcbb82030404e729b637b0efcf32;hb=f6b77b24afe7f73539125d178712b83b9bb4d771;hp=f6e14237779d4702d2a80ae339e1badfd630ad7f;hpb=e219a0855762a9c0f6f28532d8c60ee2095142a9;p=vlc diff --git a/src/text/strings.c b/src/text/strings.c index f6e1423777..86b2922206 100644 --- a/src/text/strings.c +++ b/src/text/strings.c @@ -36,14 +36,14 @@ #include /* Needed by str_format_meta */ -#include "vlc_input.h" -#include "vlc_meta.h" -#include "vlc_playlist.h" -#include +#include +#include +#include +#include -#include "vlc_strings.h" -#include "vlc_url.h" -#include "charset.h" +#include +#include +#include /** * Unescape URI encoded string @@ -328,10 +328,65 @@ char *convert_xml_special_chars( const char *psz_content ) return psz_temp; } +/* Base64 encoding */ +char *vlc_b64_encode_binary( const uint8_t *src, size_t i_src ) +{ + static const char b64[] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + + char *ret = malloc( ( i_src + 4 ) * 4 / 3 ); + char *dst = ret; + + if( dst == NULL ) + return NULL; + + while( i_src > 0 ) + { + /* pops (up to) 3 bytes of input, push 4 bytes */ + uint32_t v; + + /* 1/3 -> 1/4 */ + v = *src++ << 24; + *dst++ = b64[v >> 26]; + v = v << 6; + + /* 2/3 -> 2/4 */ + if( i_src >= 2 ) + v |= *src++ << 22; + *dst++ = b64[v >> 26]; + v = v << 6; + + /* 3/3 -> 3/4 */ + if( i_src >= 3 ) + v |= *src++ << 20; // 3/3 + *dst++ = ( i_src >= 2 ) ? b64[v >> 26] : '='; // 3/4 + v = v << 6; + + /* -> 4/4 */ + *dst++ = ( i_src >= 3 ) ? b64[v >> 26] : '='; // 4/4 + + if( i_src <= 3 ) + break; + i_src -= 3; + } + + *dst = '\0'; + + return ret; +} + +char *vlc_b64_encode( const char *src ) +{ + if( src ) + return vlc_b64_encode_binary( (const uint8_t*)src, strlen(src) ); + else + return vlc_b64_encode_binary( (const uint8_t*)"", 0 ); +} + /**************************************************************************** * String formating functions ****************************************************************************/ -char *str_format_time(char *tformat ) +char *str_format_time( const char *tformat ) { char buffer[255]; time_t curtime; @@ -369,9 +424,9 @@ char *str_format_time(char *tformat ) *d = '-'; \ d++; \ } -char *__str_format_meta( vlc_object_t *p_object, char *string ) +char *__str_format_meta( vlc_object_t *p_object, const char *string ) { - char *s = string; + const char *s = string; char *dst = malloc( 1000 ); char *d = dst; int b_is_format = 0; @@ -385,7 +440,7 @@ char *__str_format_meta( vlc_object_t *p_object, char *string ) if( p_input ) { vlc_object_yield( p_input ); - p_item = p_input->input.p_item; + p_item = input_GetItem(p_input); if( p_item ) vlc_mutex_lock( &p_item->lock ); } @@ -646,3 +701,69 @@ char *__str_format_meta( vlc_object_t *p_object, char *string ) return dst; } + +/** + * Apply str format time and str format meta + */ +char *__str_format( vlc_object_t *p_this, const char *psz_src ) +{ + char *psz_buf1, *psz_buf2; + psz_buf1 = str_format_time( psz_src ); + psz_buf2 = str_format_meta( p_this, psz_buf1 ); + free( psz_buf1 ); + return psz_buf2; +} + +/** + * Remove forbidden characters from filenames (including slashes) + */ +void filename_sanitize( char *str ) +{ + while( *str ) + { + switch( *str ) + { + case '/': +#ifdef WIN32 + case '*': + case '.': + case '"': + case '\\': + case '[': + case ']': + case ':': + case ';': + case '|': + case '=': +#endif + *str = '_'; + } + str++; + } +} + +/** + * Remove forbidden characters from full paths (leaves slashes) + */ +void path_sanitize( char *str ) +{ + while( *str ) + { + switch( *str ) + { +#ifdef WIN32 + case '*': + case '.': + case '"': + case '[': + case ']': + case ':': + case ';': + case '|': + case '=': +#endif + *str = '_'; + } + str++; + } +}