/* * string.c - syslogd implementation for windows, reference counted strings * * Created by Alexander Yaworsky * * THIS SOFTWARE IS NOT COPYRIGHTED * * This source code is offered for use in the public domain. You may * use, modify or distribute it freely. * * This code is distributed in the hope that it will be useful but * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY * DISCLAIMED. This includes but is not limited to warranties of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * */ #include #include #include #include #include #include #include struct string* string_new( const gchar* init ) { struct string *s = g_malloc( sizeof(struct string) ); s->refcount = 1; s->gstr = g_string_new( init ); return s; } struct string* string_new_len( const gchar* init, gssize len ) { struct string *s = g_malloc( sizeof(struct string) ); s->refcount = 1; s->gstr = g_string_new_len( init, len ); return s; } struct string* string_addref( struct string* s ) { InterlockedIncrement( &s->refcount ); return s; } void string_release( struct string* s ) { if( InterlockedDecrement( &s->refcount ) ) return; g_string_free( s->gstr, TRUE ); g_free( s ); } gsize string_concat( gchar** result, struct string* s, ... ) { va_list args; struct string *str; gsize length = s->gstr->len; gchar *p; va_start( args, s ); while( (str = va_arg( args, struct string* )) ) length += str->gstr->len; va_end( args ); *result = g_malloc( length + 1 ); memcpy( *result, s->gstr->str, s->gstr->len ); p = *result + s->gstr->len; va_start( args, s ); while( (str = va_arg( args, struct string* )) ) { memcpy( p, str->gstr->str, str->gstr->len ); p += str->gstr->len; } *p = 0; va_end( args ); return length; } struct string* string_vprintf( gchar* fmt, va_list args ) { struct string *s; gchar *buf; int len; len = g_vasprintf( &buf, fmt, args ); s = string_new_len( buf, len ); g_free( buf ); return s; } struct string* string_printf( gchar* fmt, ... ) { struct string *s; va_list args; va_start( args, fmt ); s = string_vprintf( fmt, args ); va_end( args ); return s; } gboolean string_equal( struct string* s1, struct string* s2 ) { if( s1 == s2 ) return TRUE; return g_string_equal( s1->gstr, s2->gstr ); }