Remove string_buffer_t (!)

This commit is contained in:
ridiculousfish
2012-03-03 22:08:34 -08:00
parent a9313fc0c3
commit 8a46931e34
9 changed files with 7 additions and 291 deletions

181
util.cpp
View File

@@ -163,190 +163,9 @@ int wcsfilecmp( const wchar_t *a, const wchar_t *b )
}
}
return res;
}
void sb_init( string_buffer_t * b)
{
wchar_t c=0;
CHECK( b, );
if( !b )
{
return;
}
memset( b, 0, sizeof(string_buffer_t) );
b_append( b, &c, sizeof( wchar_t));
b->used -= sizeof(wchar_t);
}
void sb_append_substring( string_buffer_t *b, const wchar_t *s, size_t l )
{
wchar_t tmp=0;
CHECK( b, );
CHECK( s, );
b_append( b, s, sizeof(wchar_t)*l );
b_append( b, &tmp, sizeof(wchar_t) );
b->used -= sizeof(wchar_t);
}
void sb_append_char( string_buffer_t *b, wchar_t c )
{
wchar_t tmp=0;
CHECK( b, );
b_append( b, &c, sizeof(wchar_t) );
b_append( b, &tmp, sizeof(wchar_t) );
b->used -= sizeof(wchar_t);
}
void sb_append_internal( string_buffer_t *b, ... )
{
va_list va;
wchar_t *arg;
CHECK( b, );
va_start( va, b );
while( (arg=va_arg(va, wchar_t *) )!= 0 )
{
b_append( b, arg, sizeof(wchar_t)*(wcslen(arg)+1) );
b->used -= sizeof(wchar_t);
}
va_end( va );
}
int sb_printf( string_buffer_t *buffer, const wchar_t *format, ... )
{
va_list va;
int res;
CHECK( buffer, -1 );
CHECK( format, -1 );
va_start( va, format );
res = sb_vprintf( buffer, format, va );
va_end( va );
return res;
}
int sb_vprintf( string_buffer_t *buffer, const wchar_t *format, va_list va_orig )
{
int res;
CHECK( buffer, -1 );
CHECK( format, -1 );
if( !buffer->length )
{
buffer->length = MIN_SIZE;
buffer->buff = (char *)malloc( MIN_SIZE );
if( !buffer->buff )
{
oom_handler( buffer );
return -1;
}
}
while( 1 )
{
va_list va;
va_copy( va, va_orig );
res = vswprintf( (wchar_t *)((char *)buffer->buff+buffer->used),
(buffer->length-buffer->used)/sizeof(wchar_t),
format,
va );
va_end( va );
if( res >= 0 )
{
buffer->used+= res*sizeof(wchar_t);
break;
}
/*
As far as I know, there is no way to check if a
vswprintf-call failed because of a badly formated string
option or because the supplied destination string was to
small. In GLIBC, errno seems to be set to EINVAL either way.
Because of this, sb_printf will on failiure try to
increase the buffer size until the free space is
larger than SB_MAX_SIZE, at which point it will
conclude that the error was probably due to a badly
formated string option, and return an error. Make
sure to null terminate string before that, though.
*/
if( buffer->length - buffer->used > SB_MAX_SIZE )
{
wchar_t tmp=0;
b_append( buffer, &tmp, sizeof(wchar_t) );
buffer->used -= sizeof(wchar_t);
break;
}
buffer->buff = (char *)realloc( buffer->buff, 2*buffer->length );
if( !buffer->buff )
{
oom_handler( buffer );
return -1;
}
buffer->length *= 2;
}
return res;
}
void sb_destroy( string_buffer_t * b )
{
CHECK( b, );
free( b->buff );
}
void sb_clear( string_buffer_t * b )
{
sb_truncate( b, 0 );
assert( !wcslen( (wchar_t *)b->buff) );
}
void sb_truncate( string_buffer_t *b, int chars_left )
{
wchar_t *arr;
CHECK( b, );
b->used = (chars_left)*sizeof( wchar_t);
arr = (wchar_t *)b->buff;
arr[chars_left] = 0;
}
ssize_t sb_length( string_buffer_t *b )
{
CHECK( b, -1 );
return (b->used-1)/sizeof( wchar_t);
}
void b_init( buffer_t *b)
{
CHECK( b, );