📄 libc.c
字号:
#else return (char *)msgid;#endif}/***************************************************************************** * count_utf8_string: returns the number of characters in the string. *****************************************************************************/static int count_utf8_string( const char *psz_string ){ int i = 0, i_count = 0; while( psz_string[ i ] != 0 ) { if( ((unsigned char *)psz_string)[ i ] < 0x80UL ) i_count++; i++; } return i_count;}/***************************************************************************** * wraptext: inserts \n at convenient places to wrap the text. * Returns the modified string in a new buffer. *****************************************************************************/char *vlc_wraptext( const char *psz_text, int i_line, vlc_bool_t b_utf8 ){ int i_len; char *psz_line, *psz_new_text; psz_line = psz_new_text = strdup( psz_text ); if( b_utf8 ) i_len = count_utf8_string( psz_text ); else i_len = strlen( psz_text ); while( i_len > i_line ) { /* Look if there is a newline somewhere. */ char *psz_parser = psz_line; int i_count = 0; while( i_count <= i_line && *psz_parser != '\n' ) { if( b_utf8 ) { while( *((unsigned char *)psz_parser) >= 0x80UL ) psz_parser++; } psz_parser++; i_count++; } if( *psz_parser == '\n' ) { i_len -= (i_count + 1); psz_line = psz_parser + 1; continue; } /* Find the furthest space. */ while( psz_parser > psz_line && *psz_parser != ' ' ) { if( b_utf8 ) { while( *((unsigned char *)psz_parser) >= 0x80UL ) psz_parser--; } psz_parser--; i_count--; } if( *psz_parser == ' ' ) { *psz_parser = '\n'; i_len -= (i_count + 1); psz_line = psz_parser + 1; continue; } /* Wrapping has failed. Find the first space or newline */ while( i_count < i_len && *psz_parser != ' ' && *psz_parser != '\n' ) { if( b_utf8 ) { while( *((unsigned char *)psz_parser) >= 0x80UL ) psz_parser++; } psz_parser++; i_count++; } if( i_count < i_len ) *psz_parser = '\n'; i_len -= (i_count + 1); psz_line = psz_parser + 1; } return psz_new_text;}/***************************************************************************** * iconv wrapper *****************************************************************************/vlc_iconv_t vlc_iconv_open( const char *tocode, const char *fromcode ){#if defined(HAVE_ICONV) return iconv_open( tocode, fromcode );#else return NULL;#endif}size_t vlc_iconv( vlc_iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft ){#if defined(HAVE_ICONV) return iconv( cd, inbuf, inbytesleft, outbuf, outbytesleft );#else int i_bytes = __MIN(*inbytesleft, *outbytesleft); if( !inbuf || !outbuf || !i_bytes ) return (size_t)(-1); memcpy( *outbuf, *inbuf, i_bytes ); inbuf += i_bytes; outbuf += i_bytes; inbytesleft -= i_bytes; outbytesleft -= i_bytes; return i_bytes;#endif}int vlc_iconv_close( vlc_iconv_t cd ){#if defined(HAVE_ICONV) return iconv_close( cd );#else return 0;#endif}/***************************************************************************** * reduce a fraction * (adapted from libavcodec, author Michael Niedermayer <michaelni@gmx.at>) *****************************************************************************/vlc_bool_t vlc_reduce( int *pi_dst_nom, int *pi_dst_den, int64_t i_nom, int64_t i_den, int64_t i_max ){ vlc_bool_t b_exact = 1, b_sign = 0; int64_t i_gcd; if( i_den == 0 ) { *pi_dst_nom = 0; *pi_dst_den = 1; return 1; } if( i_den < 0 ) { i_den = - i_den; i_nom = - i_nom; } if( i_nom < 0 ) { i_nom = - i_nom; b_sign = 1; } i_gcd = GCD( i_nom, i_den ); i_nom /= i_gcd; i_den /= i_gcd; if( i_max == 0 ) i_max = I64C(0xFFFFFFFF); if( i_nom > i_max || i_den > i_max ) { int i_a0_num = 0, i_a0_den = 1, i_a1_num = 1, i_a1_den = 0; b_exact = 0; for( ; ; ) { int64_t i_x = i_nom / i_den; int64_t i_a2n = i_x * i_a1_num + i_a0_num; int64_t i_a2d = i_x * i_a1_den + i_a0_den; if( i_a2n > i_max || i_a2d > i_max ) break; i_nom %= i_den; i_a0_num = i_a1_num; i_a0_den = i_a1_den; i_a1_num = i_a2n; i_a1_den = i_a2d; if( i_nom == 0 ) break; i_x = i_nom; i_nom = i_den; i_den = i_x; } i_nom = i_a1_num; i_den = i_a1_den; } if( b_sign ) i_nom = - i_nom; *pi_dst_nom = i_nom; *pi_dst_den = i_den; return b_exact;}/************************************************************************* * vlc_parse_cmdline: Command line parsing into elements. * * The command line is composed of space/tab separated arguments. * Quotes can be used as argument delimiters and a backslash can be used to * escape a quote. *************************************************************************/static void find_end_quote( char **s, char **ppsz_parser, int i_quote ){ int i_bcount = 0; while( **s ) { if( **s == '\\' ) { **ppsz_parser = **s; (*ppsz_parser)++; (*s)++; i_bcount++; } else if( **s == '"' || **s == '\'' ) { /* Preceeded by a number of '\' which we erase. */ *ppsz_parser -= i_bcount / 2; if( i_bcount & 1 ) { /* '\\' followed by a '"' or '\'' */ *ppsz_parser -= 1; **ppsz_parser = **s; (*ppsz_parser)++; (*s)++; i_bcount = 0; continue; } if( **s == i_quote ) { /* End */ return; } else { /* Different quoting */ int i_quote = **s; **ppsz_parser = **s; (*ppsz_parser)++; (*s)++; find_end_quote( s, ppsz_parser, i_quote ); **ppsz_parser = **s; (*ppsz_parser)++; (*s)++; } i_bcount = 0; } else { /* A regular character */ **ppsz_parser = **s; (*ppsz_parser)++; (*s)++; i_bcount = 0; } }}char **vlc_parse_cmdline( const char *psz_cmdline, int *i_args ){ int argc = 0; char **argv = 0; char *s, *psz_parser, *psz_arg, *psz_orig; int i_bcount = 0; if( !psz_cmdline ) return 0; psz_orig = strdup( psz_cmdline ); psz_arg = psz_parser = s = psz_orig; while( *s ) { if( *s == '\t' || *s == ' ' ) { /* We have a complete argument */ *psz_parser = 0; TAB_APPEND( argc, argv, strdup(psz_arg) ); /* Skip trailing spaces/tabs */ do{ s++; } while( *s == '\t' || *s == ' ' ); /* New argument */ psz_arg = psz_parser = s; i_bcount = 0; } else if( *s == '\\' ) { *psz_parser++ = *s++; i_bcount++; } else if( *s == '"' || *s == '\'' ) { if( ( i_bcount & 1 ) == 0 ) { /* Preceeded by an even number of '\', this is half that * number of '\', plus a quote which we erase. */ int i_quote = *s; psz_parser -= i_bcount / 2; s++; find_end_quote( &s, &psz_parser, i_quote ); s++; } else { /* Preceeded by an odd number of '\', this is half that * number of '\' followed by a '"' */ psz_parser = psz_parser - i_bcount/2 - 1; *psz_parser++ = '"'; s++; } i_bcount = 0; } else { /* A regular character */ *psz_parser++ = *s++; i_bcount = 0; } } /* Take care of the last arg */ if( *psz_arg ) { *psz_parser = '\0'; TAB_APPEND( argc, argv, strdup(psz_arg) ); } if( i_args ) *i_args = argc; free( psz_orig ); return argv;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -