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

📄 libc.c

📁 video linux conference
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -