summaryrefslogtreecommitdiffstats
path: root/strlst.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2005-05-03 23:38:17 +0000
committerLennart Poettering <lennart@poettering.net>2005-05-03 23:38:17 +0000
commitd5f4c6b3b3d0ba7fa0365ea83746530539737a92 (patch)
treed19c78beba7951c530c1bc4f3a1630206ad968ae /strlst.c
parent96c58e8ba51d67d1d90660ba8ff4f597c03688fe (diff)
allow NULL bytes in strlsts
git-svn-id: file:///home/lennart/svn/public/avahi/trunk@39 941a03a8-eaeb-0310-b9a0-b1bbd8fe43fe
Diffstat (limited to 'strlst.c')
-rw-r--r--strlst.c31
1 files changed, 17 insertions, 14 deletions
diff --git a/strlst.c b/strlst.c
index d0507e0..417d423 100644
--- a/strlst.c
+++ b/strlst.c
@@ -3,15 +3,14 @@
#include "strlst.h"
-static flxStringList *string_list_add_internal(flxStringList *l, const gchar *text, guint size) {
+flxStringList *flx_string_list_add_arbitrary(flxStringList *l, const guint8*text, guint size) {
flxStringList *n;
g_assert(text);
n = g_malloc(sizeof(flxStringList) + size);
n->next = l;
- strncpy(n->text, text, size);
- n->text[size] = 0;
+ memcpy(n->text, text, n->size = size);
return n;
}
@@ -19,7 +18,7 @@ static flxStringList *string_list_add_internal(flxStringList *l, const gchar *te
flxStringList *flx_string_list_add(flxStringList *l, const gchar *text) {
g_assert(text);
- return string_list_add_internal(l, text, strlen(text));
+ return flx_string_list_add_arbitrary(l, (const guint8*) text, strlen(text));
}
flxStringList *flx_string_list_parse(gconstpointer data, guint size) {
@@ -35,7 +34,7 @@ flxStringList *flx_string_list_parse(gconstpointer data, guint size) {
break;
k = *(c++);
- r = string_list_add_internal(r, (const gchar*) c, k);
+ r = flx_string_list_add_arbitrary(r, c, k);
c += k;
size -= 1 + k;
@@ -54,7 +53,6 @@ void flx_string_list_free(flxStringList *l) {
}
}
-
static flxStringList* string_list_reverse(flxStringList *l) {
flxStringList *r = NULL, *n;
@@ -79,18 +77,19 @@ gchar* flx_string_list_to_string(flxStringList *l) {
if (n != l)
s ++;
- s += strlen(n->text)+2;
+ s += n->size+3;
}
- t = e = g_new(gchar, s+1);
+ t = e = g_new(gchar, s);
for (n = l; n; n = n->next) {
if (n != l)
*(e++) = ' ';
*(e++) = '"';
- strcpy(e, n->text);
- e += strlen(n->text);
+ strncpy(e, n->text, n->size);
+ e[n->size] = 0;
+ e = strchr(e, 0);
*(e++) = '"';
}
@@ -118,7 +117,7 @@ guint flx_string_list_serialize(flxStringList *l, gpointer data, guint size) {
if (size < 1)
break;
- k = strlen(n->text);
+ k = n->size;
if (k > 255)
k = 255;
@@ -139,7 +138,7 @@ guint flx_string_list_serialize(flxStringList *l, gpointer data, guint size) {
for (n = l; n; n = n->next) {
guint k;
- k = strlen(n->text);
+ k = n->size;
if (k > 255)
k = 255;
@@ -159,7 +158,10 @@ gboolean flx_string_list_equal(flxStringList *a, flxStringList *b) {
if (!a || !b)
return FALSE;
- if (strcmp(a->text, b->text) != 0)
+ if (a->size != b->size)
+ return FALSE;
+
+ if (a->size != 0 && memcmp(a->text, b->text, a->size) != 0)
return FALSE;
a = a->next;
@@ -186,6 +188,7 @@ flxStringList *flx_string_list_add_many_va(flxStringList *r, va_list va) {
return r;
}
+
flxStringList *flx_string_list_new(const gchar *txt, ...) {
va_list va;
flxStringList *r = NULL;
@@ -209,7 +212,7 @@ flxStringList *flx_string_list_copy(flxStringList *l) {
flxStringList *r = NULL;
for (; l; l = l->next)
- r = flx_string_list_add(r, l->text);
+ r = flx_string_list_add_arbitrary(r, l->text, l->size);
return string_list_reverse(r);
}