⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 libc.c

📁 VLC Player Source Code
💻 C
📖 第 1 页 / 共 2 页
字号:
/***************************************************************************** * libc.c: Extra libc function for some systems. ***************************************************************************** * Copyright (C) 2002-2006 the VideoLAN team * $Id: f58f05fe77899f3a59d67608bdb0a739a575fd55 $ * * Authors: Jon Lech Johansen <jon-vl@nanocrew.net> *          Samuel Hocevar <sam@zoy.org> *          Gildas Bazin <gbazin@videolan.org> *          Derk-Jan Hartman <hartman at videolan dot org> *          Christophe Massiot <massiot@via.ecp.fr> *          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. *****************************************************************************/#ifdef HAVE_CONFIG_H# include "config.h"#endif#include <vlc_common.h>#include <ctype.h>#undef iconv_t#undef iconv_open#undef iconv#undef iconv_close#if defined(HAVE_ICONV)#   include <iconv.h>#endif#ifdef HAVE_DIRENT_H#   include <dirent.h>#endif#ifdef HAVE_SIGNAL_H#   include <signal.h>#endif#ifdef HAVE_FORK#   include <sys/time.h>#   include <unistd.h>#   include <errno.h>#   include <sys/wait.h>#   include <fcntl.h>#   include <sys/socket.h>#   include <sys/poll.h>#endif#if defined(WIN32) || defined(UNDER_CE)#   undef _wopendir#   undef _wreaddir#   undef _wclosedir#   undef rewinddir#   define WIN32_LEAN_AND_MEAN#   include <windows.h>#endif/****************************************************************************** * strcasestr: find a substring (little) in another substring (big) * Case sensitive. Return NULL if not found, return big if little == null *****************************************************************************/char * vlc_strcasestr( const char *psz_big, const char *psz_little ){#if defined (HAVE_STRCASESTR) || defined (HAVE_STRISTR)    return strcasestr (psz_big, psz_little);#else    char *p_pos = (char *)psz_big;    if( !psz_big || !psz_little || !*psz_little ) return p_pos;     while( *p_pos )    {        if( toupper( *p_pos ) == toupper( *psz_little ) )        {            char * psz_cur1 = p_pos + 1;            char * psz_cur2 = (char *)psz_little + 1;            while( *psz_cur1 && *psz_cur2 &&                   toupper( *psz_cur1 ) == toupper( *psz_cur2 ) )            {                psz_cur1++;                psz_cur2++;            }            if( !*psz_cur2 ) return p_pos;        }        p_pos++;    }    return NULL;#endif}/***************************************************************************** * strtoll: convert a string to a 64 bits int. *****************************************************************************/long long vlc_strtoll( const char *nptr, char **endptr, int base ){#if defined( HAVE_STRTOLL )    return strtoll( nptr, endptr, base );#else    long long i_value = 0;    int sign = 1, newbase = base ? base : 10;    while( isspace(*nptr) ) nptr++;    if( *nptr == '-' )    {        sign = -1;        nptr++;    }    /* Try to detect base */    if( *nptr == '0' )    {        newbase = 8;        nptr++;        if( *nptr == 'x' )        {            newbase = 16;            nptr++;        }    }    if( base && newbase != base )    {        if( endptr ) *endptr = (char *)nptr;        return i_value;    }    switch( newbase )    {        case 10:            while( *nptr >= '0' && *nptr <= '9' )            {                i_value *= 10;                i_value += ( *nptr++ - '0' );            }            if( endptr ) *endptr = (char *)nptr;            break;        case 16:            while( (*nptr >= '0' && *nptr <= '9') ||                   (*nptr >= 'a' && *nptr <= 'f') ||                   (*nptr >= 'A' && *nptr <= 'F') )            {                int i_valc = 0;                if(*nptr >= '0' && *nptr <= '9') i_valc = *nptr - '0';                else if(*nptr >= 'a' && *nptr <= 'f') i_valc = *nptr - 'a' +10;                else if(*nptr >= 'A' && *nptr <= 'F') i_valc = *nptr - 'A' +10;                i_value *= 16;                i_value += i_valc;                nptr++;            }            if( endptr ) *endptr = (char *)nptr;            break;        default:            i_value = strtol( nptr, endptr, newbase );            break;    }    return i_value * sign;#endif}/** * Copy a string to a sized buffer. The result is always nul-terminated * (contrary to strncpy()). * * @param dest destination buffer * @param src string to be copied * @param len maximum number of characters to be copied plus one for the * terminating nul. * * @return strlen(src) */extern size_t vlc_strlcpy (char *tgt, const char *src, size_t bufsize){#ifdef HAVE_STRLCPY    return strlcpy (tgt, src, bufsize);#else    size_t length;    for (length = 1; (length < bufsize) && *src; length++)        *tgt++ = *src++;    if (bufsize)        *tgt = '\0';    while (*src++)        length++;    return length - 1;#endif}/***************************************************************************** * vlc_*dir_wrapper: wrapper under Windows to return the list of drive letters * when called with an empty argument or just '\' *****************************************************************************/#if defined(WIN32) && !defined(UNDER_CE)#   include <assert.h>typedef struct vlc_DIR{    _WDIR *p_real_dir;    int i_drives;    struct _wdirent dd_dir;    bool b_insert_back;} vlc_DIR;void *vlc_wopendir( const wchar_t *wpath ){    vlc_DIR *p_dir = NULL;    _WDIR *p_real_dir = NULL;    if ( wpath == NULL || wpath[0] == '\0'          || (wcscmp (wpath, L"\\") == 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 = _wopendir( wpath );    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;    assert (wpath[0]); // wpath[1] is defined    p_dir->b_insert_back = !wcscmp (wpath + 1, L":\\");    return (void *)p_dir;}struct _wdirent *vlc_wreaddir( 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 )        {            /* Adds "..", gruik! */            p_dir->dd_dir.d_ino = 0;            p_dir->dd_dir.d_reclen = 0;            p_dir->dd_dir.d_namlen = 2;            wcscpy( p_dir->dd_dir.d_name, L".." );            p_dir->b_insert_back = false;            return &p_dir->dd_dir;        }        return _wreaddir( 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 */    swprintf( p_dir->dd_dir.d_name, L"%c:\\", 'A' + i );    p_dir->dd_dir.d_namlen = wcslen(p_dir->dd_dir.d_name);    p_dir->i_drives &= ~(1UL << i);    return &p_dir->dd_dir;}void vlc_rewinddir( void *_p_dir ){    vlc_DIR *p_dir = (vlc_DIR *)_p_dir;    if ( p_dir->p_real_dir != NULL )        _wrewinddir( p_dir->p_real_dir );}#endif/* This one is in the libvlccore exported symbol list */int vlc_wclosedir( void *_p_dir ){#if defined(WIN32) && !defined(UNDER_CE)    vlc_DIR *p_dir = (vlc_DIR *)_p_dir;    int i_ret = 0;    if ( p_dir->p_real_dir != NULL )        i_ret = _wclosedir( p_dir->p_real_dir );    free( p_dir );    return i_ret;#else    return closedir( _p_dir );#endif}/** * In-tree plugins share their gettext domain with LibVLC. */char *vlc_gettext( const char *msgid ){#ifdef ENABLE_NLS    return dgettext( PACKAGE_NAME, msgid );#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 ){    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++;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -