diff options
Diffstat (limited to '')
-rwxr-xr-x | daemon/string.c | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/daemon/string.c b/daemon/string.c new file mode 100755 index 0000000..6684664 --- /dev/null +++ b/daemon/string.c @@ -0,0 +1,116 @@ +/* + * 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 <stdio.h> +#include <string.h> +#include <windows.h> + +#include <glib.h> +#include <glib/gprintf.h> + +#include <syslog.h> +#include <syslogd.h> + +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; +} + +int string_compare( struct string* s1, struct string* s2 ) +{ + if( s1 == s2 ) + return 0; + return strcmp( s1->gstr->str, s2->gstr->str ); +} |