str.c revision bcb4e51a409d94ae670de96afb8483a4f7855294
5a580c3a38ced62d4bcc95b8ac7c4f2935b5d294Timo Sirainen/* Copyright (c) 2002-2018 Dovecot authors, see the included COPYING file */
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainenstring_t *str_new(pool_t pool, size_t initial_size)
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen /* never allocate a 0 byte size buffer. this is especially important
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen when str_c() is called on an empty string from a different stack
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen frame (see the comment in buffer.c about this). */
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen return buffer_create_dynamic(pool, I_MAX(initial_size, 1));
0db42260be85e797aa9909a29b20296996f52e75Timo Sirainenstring_t *str_new_const(pool_t pool, const char *str, size_t len)
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen buffer_create_from_const_data(ret, str, len + 1);
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen return str_new(pool_datastack_create(), initial_size);
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainenstring_t *t_str_new_const(const char *str, size_t len)
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen return str_new_const(pool_datastack_create(), str, len);
16cb5d65265dd0b216542803fd80c4b999ae118eTimo Sirainen /* remove the \0 - we don't want to keep it */
16cb5d65265dd0b216542803fd80c4b999ae118eTimo Sirainenbool str_equals(const string_t *str1, const string_t *str2)
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen return memcmp(str1->data, str2->data, str1->used) == 0;
16cb5d65265dd0b216542803fd80c4b999ae118eTimo Sirainenvoid str_append_n(string_t *str, const void *cstr, size_t max_len)
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen const char *p;
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainenvoid str_printfa(string_t *str, const char *fmt, ...)
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainenvoid str_vprintfa(string_t *str, const char *fmt, va_list args)
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen /* the format string is modified only if %m exists in it. it happens
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen only in error conditions, so don't try to t_push() here since it'll
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen just slow down the normal code path. */
8c909e451d14075c05d90382cf8eebc4e354f569Timo Sirainen fmt = printf_format_fix_get_len(fmt, &init_size);
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen /* @UNSAFE */
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen if (pos+init_size > buffer_get_writable_size(str) &&
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen /* avoid growing buffer larger if possible. this is also
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen required if buffer isn't dynamically growing. */
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen init_size = buffer_get_writable_size(str)-pos;
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen tmp = buffer_get_space_unsafe(str, pos, init_size);
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen /* didn't fit with the first guess. now we know the size,
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen so try again. */
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen tmp = buffer_get_space_unsafe(str, pos, ret + 1);
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen /* drop the unused data, including terminating NUL */