📄 strings.c
字号:
/***************************************************************************** * strings.c: String related functions ***************************************************************************** * Copyright (C) 2006 the VideoLAN team * $Id: 5d1395782375435cf10a18dedb84537c235b7578 $ * * Authors: Antoine Cellerier <dionoea at videolan dot org> * Daniel Stranger <vlc at schmaller dot de> * Rémi Denis-Courmont <rem # videolan org> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************//***************************************************************************** * Preamble *****************************************************************************/#ifdef HAVE_CONFIG_H# include "config.h"#endif#include <vlc_common.h>#include <assert.h>/* Needed by str_format_time */#include <time.h>/* Needed by str_format_meta */#include <vlc_input.h>#include <vlc_meta.h>#include <vlc_playlist.h>#include <vlc_aout.h>#include <vlc_strings.h>#include <vlc_url.h>#include <vlc_charset.h>/** * Unescape URI encoded string * \return decoded duplicated string */char *unescape_URI_duplicate( const char *psz ){ char *psz_dup = strdup( psz ); unescape_URI( psz_dup ); return psz_dup;}/** * Unescape URI encoded string in place * \return nothing */void unescape_URI( char *psz ){ unsigned char *in = (unsigned char *)psz, *out = in, c; if( psz == NULL ) return; while( ( c = *in++ ) != '\0' ) { switch( c ) { case '%': { char val[5], *pval = val; unsigned long cp; switch( c = *in++ ) { case '\0': return; case 'u': case 'U': if( ( *pval++ = *in++ ) == '\0' ) return; if( ( *pval++ = *in++ ) == '\0' ) return; c = *in++; default: *pval++ = c; if( ( *pval++ = *in++ ) == '\0' ) return; *pval = '\0'; } cp = strtoul( val, NULL, 0x10 ); if( cp < 0x80 ) *out++ = cp; else if( cp < 0x800 ) { *out++ = (( cp >> 6) | 0xc0); *out++ = (( cp & 0x3f) | 0x80); } else { assert( cp < 0x10000 ); *out++ = (( cp >> 12) | 0xe0); *out++ = (((cp >> 6) & 0x3f) | 0x80); *out++ = (( cp & 0x3f) | 0x80); } break; } /* + is not a special case - it means plus, not space. */ default: /* Inserting non-ASCII or non-printable characters is unsafe, * and no sane browser will send these unencoded */ if( ( c < 32 ) || ( c > 127 ) ) *out++ = '?'; else *out++ = c; } } *out = '\0';}/** * Decode encoded URI string * \return decoded duplicated string */char *decode_URI_duplicate( const char *psz ){ char *psz_dup = strdup( psz ); decode_URI( psz_dup ); return psz_dup;}/** * Decode encoded URI string in place * \return nothing */void decode_URI( char *psz ){ unsigned char *in = (unsigned char *)psz, *out = in, c; if( psz == NULL ) return; while( ( c = *in++ ) != '\0' ) { switch( c ) { case '%': { char hex[3]; if( ( ( hex[0] = *in++ ) == 0 ) || ( ( hex[1] = *in++ ) == 0 ) ) return; hex[2] = '\0'; *out++ = (unsigned char)strtoul( hex, NULL, 0x10 ); break; } case '+': *out++ = ' '; break; default: /* Inserting non-ASCII or non-printable characters is unsafe, * and no sane browser will send these unencoded */ if( ( c < 32 ) || ( c > 127 ) ) *out++ = '?'; else *out++ = c; } } *out = '\0'; EnsureUTF8( psz );}static inline int isurlsafe( int c ){ return ( (unsigned char)( c - 'a' ) < 26 ) || ( (unsigned char)( c - 'A' ) < 26 ) || ( (unsigned char)( c - '0' ) < 10 ) /* Hmm, we should not encode character that are allowed in URLs * (even if they are not URL-safe), nor URL-safe characters. * We still encode some of them because of Microsoft's crap browser. */ || ( strchr( "-_.", c ) != NULL );}static inline char url_hexchar( int c ){ return ( c < 10 ) ? c + '0' : c + 'A' - 10;}/** * encode_URI_component * Encodes an URI component. * * @param psz_url nul-terminated UTF-8 representation of the component. * Obviously, you can't pass an URI containing a nul character, but you don't * want to do that, do you? * * @return encoded string (must be free()'d) */char *encode_URI_component( const char *psz_url ){ char psz_enc[3 * strlen( psz_url ) + 1], *out = psz_enc; const uint8_t *in; for( in = (const uint8_t *)psz_url; *in; in++ ) { uint8_t c = *in; if( isurlsafe( c ) ) *out++ = (char)c; else if ( c == ' ') *out++ = '+'; else { *out++ = '%'; *out++ = url_hexchar( c >> 4 ); *out++ = url_hexchar( c & 0xf ); } } *out++ = '\0'; return strdup( psz_enc );}/** * Converts "<", ">" and "&" to "<", ">" and "&" * \param string to convert */void resolve_xml_special_chars( char *psz_value ){ char *p_pos = psz_value; while ( *psz_value ) { if( *psz_value == '&' ) {#define TRY_CHAR( src, len, dst ) \ if( !strncmp( psz_value, src, len ) ) \ { \ *p_pos = dst; \ psz_value += len; \ }#define TRY_LONGCHAR( src, len, dst ) \ if( !strncmp( psz_value, src, len ) ) \ { \ strncpy( p_pos, dst, strlen( dst ) ); \ p_pos += strlen( dst ) - 1; \ psz_value += len; \ } TRY_CHAR( "<", 4, '<' ) else TRY_CHAR( ">", 4, '>' ) else TRY_CHAR( "&", 5, '&' ) else TRY_CHAR( """, 6, '"' ) else TRY_CHAR( "'", 6, '\'' ) else if( psz_value[1] == '#' ) { char *psz_end; int i = strtol( psz_value+2, &psz_end, 10 ); if( *psz_end == ';' ) { if( i >= 32 && i <= 126 ) { *p_pos = (char)i; psz_value = psz_end+1; } else { /* Unhandled code, FIXME */ *p_pos = *psz_value; psz_value++; } } else { /* Invalid entity number */ *p_pos = *psz_value; psz_value++; } } else TRY_LONGCHAR( "À", 8, "À" ) else TRY_LONGCHAR( "Á", 8, "Á" ) else TRY_LONGCHAR( "Â", 7, "Â" ) else TRY_LONGCHAR( "Ã", 8, "Ã" ) else TRY_LONGCHAR( "Ä", 6, "Ä" ) else TRY_LONGCHAR( "Å", 7, "Å" ) else TRY_LONGCHAR( "Æ", 7, "Æ" ) else TRY_LONGCHAR( "Ç", 8, "Ç" ) else TRY_LONGCHAR( "È", 8, "È" ) else TRY_LONGCHAR( "É", 8, "É" ) else TRY_LONGCHAR( "Ê", 7, "Ê" ) else TRY_LONGCHAR( "Ë", 6, "Ë" ) else TRY_LONGCHAR( "Ì", 8, "Ì" ) else TRY_LONGCHAR( "Í", 8, "Í" ) else TRY_LONGCHAR( "Î", 7, "Î" ) else TRY_LONGCHAR( "Ï", 6, "Ï" ) else TRY_LONGCHAR( "Ð", 5, "Ð" ) else TRY_LONGCHAR( "Ñ", 8, "Ñ" ) else TRY_LONGCHAR( "Ò", 8, "Ò" ) else TRY_LONGCHAR( "Ó", 8, "Ó" ) else TRY_LONGCHAR( "Ô", 7, "Ô" ) else TRY_LONGCHAR( "Õ", 8, "Õ" ) else TRY_LONGCHAR( "Ö", 6, "Ö" ) else TRY_LONGCHAR( "Ø", 8, "Ø" ) else TRY_LONGCHAR( "Ù", 8, "Ù" ) else TRY_LONGCHAR( "Ú", 8, "Ú" ) else TRY_LONGCHAR( "Û", 7, "Û" ) else TRY_LONGCHAR( "Ü", 6, "Ü" ) else TRY_LONGCHAR( "Ý", 8, "Ý" ) else TRY_LONGCHAR( "Þ", 7, "Þ" ) else TRY_LONGCHAR( "ß", 7, "ß" ) else TRY_LONGCHAR( "à", 8, "à" ) else TRY_LONGCHAR( "á", 8, "á" ) else TRY_LONGCHAR( "â", 7, "â" ) else TRY_LONGCHAR( "ã", 8, "ã" ) else TRY_LONGCHAR( "ä", 6, "ä" ) else TRY_LONGCHAR( "å", 7, "å" ) else TRY_LONGCHAR( "æ", 7, "æ" ) else TRY_LONGCHAR( "ç", 8, "ç" ) else TRY_LONGCHAR( "è", 8, "è" ) else TRY_LONGCHAR( "é", 8, "é" ) else TRY_LONGCHAR( "ê", 7, "ê" ) else TRY_LONGCHAR( "ë", 6, "ë" ) else TRY_LONGCHAR( "ì", 8, "ì" ) else TRY_LONGCHAR( "í", 8, "í" ) else TRY_LONGCHAR( "î", 7, "î" ) else TRY_LONGCHAR( "ï", 6, "ï" ) else TRY_LONGCHAR( "ð", 5, "ð" ) else TRY_LONGCHAR( "ñ", 8, "ñ" ) else TRY_LONGCHAR( "ò", 8, "ò" ) else TRY_LONGCHAR( "ó", 8, "ó" ) else TRY_LONGCHAR( "ô", 7, "ô" ) else TRY_LONGCHAR( "õ", 8, "õ" ) else TRY_LONGCHAR( "ö", 6, "ö" ) else TRY_LONGCHAR( "ø", 8, "ø" ) else TRY_LONGCHAR( "ù", 8, "ù" ) else TRY_LONGCHAR( "ú", 8, "ú" ) else TRY_LONGCHAR( "û", 7, "û" ) else TRY_LONGCHAR( "ü", 6, "ü" ) else TRY_LONGCHAR( "ý", 8, "ý" ) else TRY_LONGCHAR( "þ", 7, "þ" ) else TRY_LONGCHAR( "ÿ", 6, "ÿ" ) else TRY_LONGCHAR( "¡", 7, "¡" ) else TRY_LONGCHAR( "¤", 8, "¤" ) else TRY_LONGCHAR( "¢", 6, "¢" ) else TRY_LONGCHAR( "£", 7, "£" )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -