libc.c
来自「uclinux 下的vlc播放器源代码」· C语言 代码 · 共 1,191 行 · 第 1/3 页
C
1,191 行
{ DIR *p_real_dir; int i_drives; struct dirent dd_dir; vlc_bool_t b_insert_back;} vlc_DIR;void *vlc_opendir_wrapper( const char *psz_path ){ vlc_DIR *p_dir = NULL; DIR *p_real_dir = NULL; if ( psz_path == NULL || psz_path[0] == '\0' || (psz_path[0] == '\\' && psz_path[1] == '\0') ) { /* Special mode to list drive letters */ p_dir = malloc( sizeof(vlc_DIR) ); if( !p_dir ) return NULL; p_dir->p_real_dir = NULL; p_dir->i_drives = GetLogicalDrives(); return (void *)p_dir; } p_real_dir = opendir( psz_path ); if ( p_real_dir == NULL ) return NULL; p_dir = malloc( sizeof(vlc_DIR) ); if( !p_dir ) { _wclosedir( p_real_dir ); return NULL; } p_dir->p_real_dir = p_real_dir; p_dir->b_insert_back = ( psz_path[1] == ':' && psz_path[2] == '\\' && psz_path[3] =='\0' ); return (void *)p_dir;}struct dirent *vlc_readdir_wrapper( void *_p_dir ){ vlc_DIR *p_dir = (vlc_DIR *)_p_dir; unsigned int i; DWORD i_drives; if ( p_dir->p_real_dir != NULL ) { if ( p_dir->b_insert_back ) { p_dir->dd_dir.d_ino = 0; p_dir->dd_dir.d_reclen = 0; p_dir->dd_dir.d_namlen = 2; strcpy( p_dir->dd_dir.d_name, ".." ); p_dir->b_insert_back = VLC_FALSE; return &p_dir->dd_dir; } return readdir( p_dir->p_real_dir ); } /* Drive letters mode */ i_drives = p_dir->i_drives; if ( !i_drives ) return NULL; /* end */ for ( i = 0; i < sizeof(DWORD)*8; i++, i_drives >>= 1 ) if ( i_drives & 1 ) break; if ( i >= 26 ) return NULL; /* this should not happen */ sprintf( p_dir->dd_dir.d_name, "%c:\\", 'A' + i ); p_dir->dd_dir.d_namlen = strlen(p_dir->dd_dir.d_name); p_dir->i_drives &= ~(1UL << i); return &p_dir->dd_dir;}int vlc_closedir_wrapper( void *_p_dir ){ vlc_DIR *p_dir = (vlc_DIR *)_p_dir; if ( p_dir->p_real_dir != NULL ) { int i_ret = closedir( p_dir->p_real_dir ); free( p_dir ); return i_ret; } free( p_dir ); return 0;}#elsevoid *vlc_opendir_wrapper( const char *psz_path ){ return (void *)opendir( psz_path );}struct dirent *vlc_readdir_wrapper( void *_p_dir ){ return readdir( (DIR *)_p_dir );}int vlc_closedir_wrapper( void *_p_dir ){ return closedir( (DIR *)_p_dir );}#endif/***************************************************************************** * scandir: scan a directory alpha-sorted *****************************************************************************/#if !defined( HAVE_SCANDIR )int vlc_alphasort( const struct dirent **a, const struct dirent **b ){ return strcoll( (*a)->d_name, (*b)->d_name );}int vlc_scandir( const char *name, struct dirent ***namelist, int (*filter) ( const struct dirent * ), int (*compar) ( const struct dirent **, const struct dirent ** ) ){ DIR * p_dir; struct dirent * p_content; struct dirent ** pp_list; int ret, size; if( !namelist || !( p_dir = vlc_opendir_wrapper( name ) ) ) return -1; ret = 0; pp_list = NULL; while( ( p_content = vlc_readdir_wrapper( p_dir ) ) ) { if( filter && !filter( p_content ) ) { continue; } pp_list = realloc( pp_list, ( ret + 1 ) * sizeof( struct dirent * ) ); size = sizeof( struct dirent ) + strlen( p_content->d_name ) + 1; pp_list[ret] = malloc( size ); if( pp_list[ret] ) { memcpy( pp_list[ret], p_content, size ); ret++; } else { /* Continuing is useless when no more memory can be allocted, * so better return what we have found. */ ret = -1; break; } } vlc_closedir_wrapper( p_dir ); if( compar ) { qsort( pp_list, ret, sizeof( struct dirent * ), (int (*)(const void *, const void *)) compar ); } *namelist = pp_list; return ret;}#endif#if defined (WIN32) || !defined (HAVE_SHARED_LIBVLC)/***************************************************************************** * dgettext: gettext for plugins. *****************************************************************************/char *vlc_dgettext( const char *package, const char *msgid ){#if defined( ENABLE_NLS ) \ && ( defined(HAVE_GETTEXT) || defined(HAVE_INCLUDED_GETTEXT) ) return dgettext( package, msgid );#else return (char *)msgid;#endif}#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 ){ int i_len; char *psz_line, *psz_new_text; psz_line = psz_new_text = strdup( psz_text ); i_len = count_utf8_string( 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' ) { 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 != ' ' ) { 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' ) { 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, const char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft ){#if defined(HAVE_ICONV) return iconv( cd, (ICONV_CONST char **)inbuf, inbytesleft, outbuf, outbytesleft );#else int i_bytes; if (inbytesleft == NULL || outbytesleft == NULL) { return 0; } 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_ureduce( unsigned *pi_dst_nom, unsigned *pi_dst_den, uint64_t i_nom, uint64_t i_den, uint64_t i_max ){ vlc_bool_t b_exact = 1; uint64_t i_gcd; if( i_den == 0 ) { *pi_dst_nom = 0; *pi_dst_den = 1; return 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 ) { uint64_t i_a0_num = 0, i_a0_den = 1, i_a1_num = 1, i_a1_den = 0; b_exact = 0; for( ; ; ) { uint64_t i_x = i_nom / i_den; uint64_t i_a2n = i_x * i_a1_num + i_a0_num; uint64_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; } *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 */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?