dovecot-1.2: Added str_new_const().
dovecot at dovecot.org
dovecot at dovecot.org
Fri Jul 18 01:02:13 EEST 2008
details: http://hg.dovecot.org/dovecot-1.2/rev/b3dd6db685a4
changeset: 8007:b3dd6db685a4
user: Timo Sirainen <tss at iki.fi>
date: Fri Jul 18 01:02:08 2008 +0300
description:
Added str_new_const().
diffstat:
2 files changed, 22 insertions(+), 6 deletions(-)
src/lib/str.c | 24 ++++++++++++++++++------
src/lib/str.h | 4 ++++
diffs (56 lines):
diff -r 0a3b5ddb0869 -r b3dd6db685a4 src/lib/str.c
--- 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 @@ string_t *str_new(pool_t pool, size_t in
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;
+ 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)
diff -r 0a3b5ddb0869 -r b3dd6db685a4 src/lib/str.h
--- 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);
More information about the dovecot-cvs
mailing list