]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Added str_new_const().
authorTimo Sirainen <tss@iki.fi>
Thu, 17 Jul 2008 22:02:08 +0000 (01:02 +0300)
committerTimo Sirainen <tss@iki.fi>
Thu, 17 Jul 2008 22:02:08 +0000 (01:02 +0300)
--HG--
branch : HEAD

src/lib/str.c
src/lib/str.h

index 084b6e63895d58e859b821668cae8d30fab67461..7d9eead730915215d9e483ccb01a75bbfa37a84a 100644 (file)
@@ -12,6 +12,16 @@ string_t *str_new(pool_t pool, size_t initial_size)
        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 @@ void str_free(string_t **str)
 
 static void str_add_nul(string_t *str)
 {
-       size_t len;
-
-       len = str_len(str);
-       buffer_write(str, len, "", 1);
+       const unsigned char *data = str_data(str);
+       size_t len = str_len(str);
+       size_t alloc = buffer_get_size(str);
 
-       /* 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)
index 1ca51b5a97b71f777377eb308c84e67e3ff5504b..2e225f78eb88bf721ade236b346f4fad16ab7034 100644 (file)
@@ -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);