📄 yc_string.c
字号:
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 + -