str.c revision d6af1e63bc7824f1cc5b9b73a1c5f8f8789788d6
181c1aff950e6f8e0556f8974e79d0747845ac0fTimo Sirainen/* Copyright (c) 2002-2008 Dovecot authors, see the included COPYING file */
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainenstring_t *str_new(pool_t pool, size_t initial_size)
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen return buffer_create_dynamic(pool, initial_size);
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainenstring_t *str_new_const(pool_t pool, const char *str, size_t len)
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen ret = buffer_create_const_data(pool, str, len + 1);
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainen return str_new(pool_datastack_create(), initial_size);
704efd0b34e3611e3decf1d559fe6a93214b0bd0Timo Sirainen /* remove the \0 - we don't want to keep it */
9d6dec796909384293006e4289436579089d88d5Timo Sirainenconst unsigned char *str_data(const string_t *str)
fc1696e32dd732a5bbabc3c8f64810448e327043Timo Sirainenbool str_equals(const string_t *str1, const string_t *str2)
fc1696e32dd732a5bbabc3c8f64810448e327043Timo Sirainen return memcmp(str1->data, str2->data, str1->used) == 0;
fc1696e32dd732a5bbabc3c8f64810448e327043Timo Sirainenvoid str_append(string_t *str, const char *cstr)
fc1696e32dd732a5bbabc3c8f64810448e327043Timo Sirainenvoid str_append_n(string_t *str, const void *cstr, size_t max_len)
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen while (len < max_len && ((const char *)cstr)[len] != '\0')
fc1696e32dd732a5bbabc3c8f64810448e327043Timo Sirainenvoid str_append_c(string_t *str, unsigned char chr)
fc1696e32dd732a5bbabc3c8f64810448e327043Timo Sirainenvoid str_append_str(string_t *dest, const string_t *src)
fc1696e32dd732a5bbabc3c8f64810448e327043Timo Sirainenvoid str_printfa(string_t *str, const char *fmt, ...)
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainenvoid str_vprintfa(string_t *str, const char *fmt, va_list args)
fc1696e32dd732a5bbabc3c8f64810448e327043Timo Sirainen /* the format string is modified only if %m exists in it. it happens
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen only in error conditions, so don't try to t_push() here since it'll
fc1696e32dd732a5bbabc3c8f64810448e327043Timo Sirainen just slow down the normal code path. */
fc1696e32dd732a5bbabc3c8f64810448e327043Timo Sirainen fmt = printf_format_fix_get_len(fmt, &init_size);
2c7ab05ef98c46eb70c8ba6ea85e49749aafb2a3Timo Sirainen /* @UNSAFE */
2c7ab05ef98c46eb70c8ba6ea85e49749aafb2a3Timo Sirainen tmp = buffer_get_space_unsafe(str, pos, init_size);
2c7ab05ef98c46eb70c8ba6ea85e49749aafb2a3Timo Sirainen /* didn't fit with the first guess. now we know the size,
2c7ab05ef98c46eb70c8ba6ea85e49749aafb2a3Timo Sirainen so try again. */
2c7ab05ef98c46eb70c8ba6ea85e49749aafb2a3Timo Sirainen tmp = buffer_get_space_unsafe(str, pos, ret + 1);
2c7ab05ef98c46eb70c8ba6ea85e49749aafb2a3Timo Sirainen /* drop the unused data, including terminating NUL */
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainenvoid str_insert(string_t *str, size_t pos, const char *cstr)