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

📄 yc_string.c

📁 一个类STL的多平台可移植的算法容器库,主要用于嵌入式系统编程时的内存管理等方面
💻 C
📖 第 1 页 / 共 4 页
字号:

    if( index >= len )
        return false;
    else
    {
        size_t i;
        wchar_t *d, *s = wcstr_index( self, index );

        for( ; index < len; ++index,++s )
        {
            for( i = 0; i < count; ++i )
            {
                if( wchars[i] == *s )
                    break;
            }
            if( i != count )
                break;
        }

        if( index < len )
        {
            for( d = s; index < len; ++index )
            {
                for( i = 0; i < count; ++i )
                {
                    if( wchars[i] == *s )
                        break;
                }
                if( i != count )
                    ++s;
                else
                    *d++ = *s++;
            }

            if( true == self->m_dynamic )
                self->strobj.m_dystr.m_finish = d;
            else
                self->strobj.m_wcstr.len = d - self->strobj.m_wcstr.data;
        }
    }

    return true;
}

/******************************************************************************/

static int _wstoi( const wchar_t** ws )
{
    int i = 0;

    while( iswdigit(**ws) )
        i = i * 10 + *((*ws)++) - '0';

    return i;
}

/******************************************************************************/

bool wcstr_format( wcstring* self, const wchar_t* format, ... )
{
    wchar_t* s;
    va_list args, arg;
    const wchar_t* fmt = format;
    size_t count = 0, len = 0;
    int width, precision, qualifier, result;

    if( false == self->m_dynamic )
        self->strobj.m_wcstr.len = 0;
    else
        dymemarr_erase_range( &(self->strobj.m_dystr), 0, SIZE_MAX );

    va_start( args, format );
    arg = args;

    for( ; *fmt; ++fmt )
    {
        if( '%' != *fmt )
        {
            ++count;
            continue;
        }

GET_NEXT:
        switch( *(++fmt) )
        {
            case '-':
                goto GET_NEXT;
            case '0':
                goto GET_NEXT;
            case '+':
                goto GET_NEXT;
            case ' ':
                goto GET_NEXT;
            case '#':
                count += 2;
                goto GET_NEXT;
        }

        width = 0;
        if( iswdigit(*fmt) )
            width = _wstoi( &fmt );
        else if( '*' == *fmt )
        {
            width = va_arg( args, int );
            if( width < 0 )
                width = -width;
        }

        precision = -1;
        if( '.' == *fmt )
        {
            ++fmt;
            if( iswdigit(*fmt) )
                precision = _wstoi( &fmt );
            else if( '*' == *fmt )
                precision = va_arg( args, int );
            if( precision < 0 )
                precision = 0;
        }

        qualifier = 0;
        if( 'h' == *fmt || 'l' == *fmt || 'L' == *fmt )
        {
            qualifier = *fmt;
            ++fmt;
        }

        switch( *fmt )
        {
            case 'c':
                len = width > 1 ? width : 1;
                break;
            case 's':
                s = va_arg( args, wchar_t* );
                len = s ? wcslen(s) : 6;    /* "<null>" */
                if( (int)len > precision )
                    len = precision;
                if( (int)len < width )
                    len = width;
                break;
            case 'd':
            case 'i':
            case 'u':
            case 'o':
                if( 'l' == qualifier )
                    len = sizeof(long) * 3;
                else if( 'h' == qualifier )
                    len = sizeof(short) * 3;
                else
                    len = sizeof(int) * 3;
                if( (int)len < precision)
                    len = precision;
                len += 2;
                break;
            case 'x':
            case 'X':
                if( 'l' == qualifier )
                    len = sizeof(long) * 2;
                else if( 'h' == qualifier )
                    len = sizeof(short) * 2;
                else
                    len = sizeof(int) * 2;
                if( (int)len < precision)
                    len = precision;
                len += 2;
                break;
            case 'p':
                len = sizeof(void*) * 2 + 4;
                break;
            case 'f':
            case 'F':
                len = (size_t)(LDBL_MAX_10_EXP * 2 + 16 + precision);
                break;
            case 'g':
            case 'G':
            case 'e':
            case 'E':
                len = width + precision + 12;
                if( len < 63 )
                    len = 63;
                break;
            case '#':
                len = 1;
            default:
                len = 0;
                break;
        }   /* end switch */

        count += len;
    } /* end for */

    if( false == wcstr_reserve(self, count) )
        return false;

    result = vswprintf( false == self->m_dynamic ? self->strobj.m_wcstr.data
                        : (wchar_t*)(self->strobj.m_dystr.m_start),
                        format, arg );

    if( result < 0 )
        result = 0;

    if( false == self->m_dynamic )
        self->strobj.m_wcstr.len = (wchar_t)result;
    else
        self->strobj.m_dystr.m_finish = (wchar_t*)(self->strobj.m_dystr.m_start)
                                        + result;

    va_end( arg );
    return true;
}

/******************************************************************************/

void wcstr_to_ncstr( wcstring* self )
{
    char* str;
    wchar_t* wstr;
    size_t i, len = wcstr_size( self );

    str = ncstr_begin( self );
    wstr = wcstr_begin( self );

    for( i = 0; i < len; ++i,++str,++wstr )
        *str = (char)(*wstr);

    if( true == self->m_dynamic )
        self->strobj.m_dystr.m_finish = (char*)(self->strobj.m_dystr.m_start)
                                        + len;
}

/******************************************************************************/

#ifdef __MACRO_C_YOUNG_LIBRARY_COMPILER_SUPPORT_INPUT_OUTPUT_SYSTEM__
void wcstr_put( wcstring* self )
{
    size_t len = wcstr_size( self );
    wchar_t* str = wcstr_begin( self );

    for( ; len > 0; --len,++str )
        putwchar( *str );
}

/******************************************************************************/

bool wcstr_getline( wcstring* self, const wchar_t delimiter )
{
    wchar_t wc = 0;
    bool result = true;

    if( false == self->m_dynamic )
        self->strobj.m_wcstr.len = 0;
    else
        dymemarr_erase_range( &(self->strobj.m_dystr), 0, SIZE_MAX );

    while( (wchar_t)WEOF != (wc = (wchar_t)getwchar()) && wc != delimiter )
    {
        if( false == self->m_dynamic )
        {
            if( self->strobj.m_wcstr.len < STATIC_WCSTR_LEN )
            {
                self->strobj.m_wcstr.data[self->strobj.m_wcstr.len] = wc;
                ++( self->strobj.m_wcstr.len );
                continue;
            }
            else
            {
                if( false == static_to_dynamic(self, STATIC_WCSTR_LEN + 1, true) )
                    return false;
            }
        }

        DYMEMARR_PUSH_BACK( self->strobj.m_dystr, wc, wchar_t, result );

        if( false == result )
            return false;
    }

    return true;
}
#endif  /* SUPPORT_IO_SYSTEM */

/******************************************************************************/

#ifdef __MACRO_C_YOUNG_LIBRARY_COMPILER_SUPPORT_FILE_SYSTEM__
bool wcstr_fgetline( wcstring* self, FILE* fp, const wchar_t delimiter )
{
    wchar_t wc = 0;
    bool result = true;

    if( false == self->m_dynamic )
        self->strobj.m_wcstr.len = 0;
    else
        dymemarr_erase_range( &(self->strobj.m_dystr), 0, SIZE_MAX );

    if( feof(fp) )
        return true;

    while( WEOF != (wc = (wchar_t)getwc(fp)) && wc != delimiter )
    {
        if( false == self->m_dynamic )
        {
            if( self->strobj.m_wcstr.len < STATIC_WCSTR_LEN )
            {
                self->strobj.m_wcstr.data[self->strobj.m_wcstr.len] = wc;
                ++( self->strobj.m_wcstr.len );
                continue;
            }
            else
            {
                if( false == static_to_dynamic(self, STATIC_WCSTR_LEN + 1, true) )
                    return false;
            }
        }

        DYMEMARR_PUSH_BACK( self->strobj.m_dystr, wc, wchar_t, result );

        if( false == result )
            return false;
    }

    return true;
}
#endif  /* SUPPORT_FILE_SYSTEM */

/******************************************************************************/

#ifndef __MACRO_C_YOUNG_LIBRARY_COMPILER_SUPPORT_INLINE_FUNCTION__
    size_t wcstr_max_size( void )
    {
        return SIZE_MAX / sizeof(wchar_t) - 1;
    }

/******************************************************************************/

    size_t wcstr_size( wcstring* self )
    {
        return false == self->m_dynamic ? self->strobj.m_wcstr.len
                        : DYMEMARR_SIZE( self->strobj.m_dystr, wchar_t );
    }

/******************************************************************************/

    size_t wcstr_capacity( wcstring* self )
    {
        return false == self->m_dynamic ? STATIC_WCSTR_LEN
                        : DYMEMARR_CAPACITY( self->strobj.m_dystr, wchar_t );
    }

/******************************************************************************/

    size_t wcstr_space( wcstring* self )
    {
        return false == self->m_dynamic
                        ? STATIC_WCSTR_LEN - self->strobj.m_wcstr.len
                        : DYMEMARR_SPACE( self->strobj.m_dystr, wchar_t );
    }

/******************************************************************************/

    wchar_t wcstr_front( wcstring* self )
    {
        return false == self->m_dynamic
                        ? self->strobj.m_wcstr.data[0]
                        : DYMEMARR_FRONT( self->strobj.m_dystr, wchar_t );
    }

/******************************************************************************/

    wchar_t wcstr_back( wcstring* self )
    {
        return false == self->m_dynamic
                        ? self->strobj.m_wcstr.data[self->strobj.m_wcstr.len - 1]
                        : DYMEMARR_BACK( self->strobj.m_dystr, wchar_t );
    }

/******************************************************************************/

    wchar_t* wcstr_begin( wcstring* self )
    {
        return false == self->m_dynamic
                        ? self->strobj.m_wcstr.data
                        : DYMEMARR_BEGIN( self->strobj.m_dystr, wchar_t );
    }

/******************************************************************************/

    wchar_t* wcstr_end( wcstring* self )
    {
        return false == self->m_dynamic
                        ? self->strobj.m_wcstr.data + self->strobj.m_wcstr.len
                        : DYMEMARR_END( self->strobj.m_dystr, wchar_t );
    }

/******************************************************************************/

    wchar_t* wcstr_index( wcstring* self, size_t index )
    {
        return true == self->m_dynamic
                       ? &DYMEMARR_INDEX(self->strobj.m_dystr, index, wchar_t)
                       : self->strobj.m_wcstr.data + index;
    }

/******************************************************************************/

    wchar_t* wcstr_at( wcstring* self, size_t index )
    {
        return index < wcstr_size(self) ? wcstr_index(self, index) : NULL;
    }

/******************************************************************************/

    const wchar_t* wcstr_to_wstring( wcstring* self )
    {
        if( false == self->m_dynamic )
            self->strobj.m_wcstr.data[self->strobj.m_wcstr.len] = 0;
        else
            *( (wchar_t*)(self->strobj.m_dystr.m_finish) ) = 0;

        return true == self->m_dynamic ? (wchar_t*)(self->strobj.m_dystr.m_start)
                                       : self->strobj.m_wcstr.data;
    }

/******************************************************************************/

    void wcstr_pop_back( wcstring* self )
    {
        if( false == self->m_dynamic && self->strobj.m_wcstr.len > 0 )
            --( self->strobj.m_wcstr.len );
        else
        {
            DYMEMARR_POP_BACK( self->strobj.m_dystr, wchar_t );
        }
    }
#endif  /* SUPPORT_INLINE_FUNCTION */
#endif  /* SUPPORT_C95_WIDE_CHARACTER */

/******************************************************************************/
/******************************************************************************/
#ifdef __cplusplus
    }  }
#endif
/******************************************************************************/
/******************************************************************************/

⌨️ 快捷键说明

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