📄 libc.c
字号:
/***************************************************************************** * 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 + -