From: Timo Sirainen Date: Thu, 17 Jul 2008 22:02:08 +0000 (+0300) Subject: Added str_new_const(). X-Git-Tag: 1.2.alpha1~154 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d6af1e63bc7824f1cc5b9b73a1c5f8f8789788d6;p=thirdparty%2Fdovecot%2Fcore.git Added str_new_const(). --HG-- branch : HEAD --- diff --git a/src/lib/str.c b/src/lib/str.c index 084b6e6389..7d9eead730 100644 --- a/src/lib/str.c +++ b/src/lib/str.c @@ -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) diff --git a/src/lib/str.h b/src/lib/str.h index 1ca51b5a97..2e225f78eb 100644 --- a/src/lib/str.h +++ b/src/lib/str.h @@ -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);