aboutsummaryrefslogtreecommitdiffstats
path: root/daemon/string.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rwxr-xr-xdaemon/string.c116
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 );
+}