From dfb78a8b886b9bfa743dad9ea8e045c309cb69b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Denis-Courmont?= Date: Sat, 10 Feb 2007 09:49:15 +0000 Subject: [PATCH] De-inline base64 decoder --- include/vlc_strings.h | 2 ++ include/vlc_url.h | 46 ----------------------------------------- src/text/strings.c | 48 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 46 deletions(-) diff --git a/include/vlc_strings.h b/include/vlc_strings.h index 43776ff866..9b67318872 100644 --- a/include/vlc_strings.h +++ b/include/vlc_strings.h @@ -38,6 +38,8 @@ VLC_EXPORT( void, resolve_xml_special_chars, ( char *psz_value ) ); VLC_EXPORT( char *, convert_xml_special_chars, ( const char *psz_content ) ); +VLC_EXPORT( char *, vlc_b64_encode, ( const char * ) ); + VLC_EXPORT( char *, str_format_time, ( const char * ) ); #define str_format_meta( a, b ) __str_format_meta( VLC_OBJECT( a ), b ) VLC_EXPORT( char *, __str_format_meta, ( vlc_object_t *, const char * ) ); diff --git a/include/vlc_url.h b/include/vlc_url.h index 068d970cac..99d280fd20 100644 --- a/include/vlc_url.h +++ b/include/vlc_url.h @@ -211,51 +211,5 @@ static inline int vlc_UrlIsNotEncoded( const char *psz_url ) return 0; /* looks fine - but maybe it is not encoded */ } -/* Base64 encoding */ -static inline char *vlc_b64_encode( const char *src ) -{ - static const char b64[] = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - size_t len = strlen( src ); - const uint8_t *in = (const uint8_t *)src; - - char *ret; - char *dst = (char *)malloc( ( len + 4 ) * 4 / 3 ); - if( dst == NULL ) - return NULL; - - ret = dst; - - while( len > 0 ) - { - /* pops (up to) 3 bytes of input, push 4 bytes */ - uint32_t v = *in++ << 24; // 1/3 - *dst++ = b64[v >> 26]; // 1/4 - v = v << 6; - - if( len >= 2 ) - v |= *in++ << 22; // 2/3 - *dst++ = b64[v >> 26]; // 2/4 - v = v << 6; - - if( len >= 3 ) - v |= *in++ << 20; // 3/3 - *dst++ = ( len >= 2 ) ? b64[v >> 26] : '='; // 3/4 - v = v << 6; - *dst++ = ( len >= 3 ) ? b64[v >> 26] : '='; // 4/4 - - len--; - if( len > 0 ) - { - len--; - if( len > 0 ) - len--; - } - } - - *dst = '\0'; - - return ret; -} #endif diff --git a/src/text/strings.c b/src/text/strings.c index 3084b4f3c6..497c077358 100644 --- a/src/text/strings.c +++ b/src/text/strings.c @@ -328,6 +328,54 @@ char *convert_xml_special_chars( const char *psz_content ) return psz_temp; } +/* Base64 encoding */ +char *vlc_b64_encode( const char *src ) +{ + static const char b64[] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + size_t len = strlen( src ); + const uint8_t *in = (const uint8_t *)src; + + char *ret; + char *dst = (char *)malloc( ( len + 4 ) * 4 / 3 ); + if( dst == NULL ) + return NULL; + + ret = dst; + + while( len > 0 ) + { + /* pops (up to) 3 bytes of input, push 4 bytes */ + uint32_t v = *in++ << 24; // 1/3 + *dst++ = b64[v >> 26]; // 1/4 + v = v << 6; + + if( len >= 2 ) + v |= *in++ << 22; // 2/3 + *dst++ = b64[v >> 26]; // 2/4 + v = v << 6; + + if( len >= 3 ) + v |= *in++ << 20; // 3/3 + *dst++ = ( len >= 2 ) ? b64[v >> 26] : '='; // 3/4 + v = v << 6; + + *dst++ = ( len >= 3 ) ? b64[v >> 26] : '='; // 4/4 + + len--; + if( len > 0 ) + { + len--; + if( len > 0 ) + len--; + } + } + + *dst = '\0'; + + return ret; +} + /**************************************************************************** * String formating functions ****************************************************************************/