mirror of
https://github.com/fish-shell/fish-shell.git
synced 2026-06-02 05:41:16 -03:00
Remove string_buffer_t (!)
This commit is contained in:
181
util.cpp
181
util.cpp
@@ -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, );
|
||||
|
||||
Reference in New Issue
Block a user