changeset 8007:b3dd6db685a4 HEAD

Added str_new_const().
author Timo Sirainen <tss@iki.fi>
date Fri, 18 Jul 2008 01:02:08 +0300
parents 0a3b5ddb0869
children 1d209ee7eead
files src/lib/str.c src/lib/str.h
diffstat 2 files changed, 22 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib/str.c	Sun Jul 13 19:09:55 2008 +0300
+++ b/src/lib/str.c	Fri Jul 18 01:02:08 2008 +0300
@@ -12,6 +12,16 @@
 	return buffer_create_dynamic(pool, initial_size);
 }
 
+string_t *str_new_const(pool_t pool, const char *str, size_t len)
+{
+	string_t *ret;
+
+	i_assert(str[len] == '\0');
+	ret = buffer_create_const_data(pool, str, len + 1);
+	str_truncate(ret, len);
+	return ret;
+}
+
 string_t *t_str_new(size_t initial_size)
 {
 	return str_new(pool_datastack_create(), initial_size);
@@ -24,13 +34,15 @@
 
 static void str_add_nul(string_t *str)
 {
-	size_t len;
+	const unsigned char *data = str_data(str);
+	size_t len = str_len(str);
+	size_t alloc = buffer_get_size(str);
 
-	len = str_len(str);
-	buffer_write(str, len, "", 1);
-
-	/* remove the \0 - we don't want to keep it */
-	buffer_set_used_size(str, len);
+	if (len == alloc || data[len] != '\0') {
+		buffer_write(str, len, "", 1);
+		/* remove the \0 - we don't want to keep it */
+		buffer_set_used_size(str, len);
+	}
 }
 
 char *str_free_without_data(string_t **str)
--- a/src/lib/str.h	Sun Jul 13 19:09:55 2008 +0300
+++ b/src/lib/str.h	Fri Jul 18 01:02:08 2008 +0300
@@ -3,6 +3,10 @@
 
 string_t *str_new(pool_t pool, size_t initial_size);
 string_t *t_str_new(size_t initial_size);
+/* Allocate a constant string using the given str as the input data.
+   str pointer is saved directly, so it must not be freed until the returned
+   string is no longer used. len must contain strlen(str). */
+string_t *str_new_const(pool_t pool, const char *str, size_t len);
 void str_free(string_t **str);
 char *str_free_without_data(string_t **str);