strfuncs.c revision 86441ffc028f11857152c15fe7b0d24ff0874504
02c335c23bf5fa225a467c19f2c063fb0dc7b8c3Timo Sirainen/* Copyright (c) 2002-2012 Dovecot authors, see the included COPYING file */
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen/* @UNSAFE: whole file */
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainenint i_snprintf(char *dest, size_t max_chars, const char *format, ...)
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen ret = vsnprintf(dest, max_chars, printf_format_fix_unsafe(format),
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen return (unsigned int)ret < max_chars ? 0 : -1;
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainenchar *p_strdup_empty(pool_t pool, const char *str)
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainenchar *p_strdup_until(pool_t pool, const void *start, const void *end)
a326f9da3c18a4ccfb28e72f87161eaf3624eaf2Timo Sirainen i_assert((const char *) start <= (const char *) end);
2bc963ea051ddacefe0fa5e26280e8ef853fd6c6Timo Sirainen size = (size_t) ((const char *) end - (const char *) start);
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainenchar *p_strndup(pool_t pool, const void *str, size_t max_chars)
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen while (len < max_chars && ((const char *) str)[len] != '\0')
f24edebe360d3effe584a884aa7d119daf3fd371Aki Tuomichar *p_strdup_printf(pool_t pool, const char *format, ...)
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainenchar *t_noalloc_strdup_vprintf(const char *format, va_list args,
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen unsigned int *size_r)
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen /* the format string is modified only if %m exists in it. it happens
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen only in error conditions, so don't try to t_push() here since it'll
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen just slow down the normal code path. */
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen format = printf_format_fix_get_len(format, &init_size);
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen ret = vsnprintf(tmp, init_size, format, args);
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen /* didn't fit with the first guess. now we know the size,
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen so try again. */
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainenchar *p_strdup_vprintf(pool_t pool, const char *format, va_list args)
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen unsigned int size;
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen tmp = t_noalloc_strdup_vprintf(format, args, &size);
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainenchar *vstrconcat(const char *str1, va_list args, size_t *ret_len)
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen const char *str;
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen /* need more memory */
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen /* next string */
f818f91a2e6ee003aaa83323acd74008aa1276d9Timo Sirainenchar *p_strconcat(pool_t pool, const char *str1, ...)
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen return p_strdup_empty(unsafe_data_stack_pool, str);
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainenconst char *t_strdup_until(const void *start, const void *end)
f818f91a2e6ee003aaa83323acd74008aa1276d9Timo Sirainen return p_strdup_until(unsafe_data_stack_pool, start, end);
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainenconst char *t_strndup(const void *str, size_t max_chars)
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen return p_strndup(unsafe_data_stack_pool, str, max_chars);
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainenconst char *t_strdup_printf(const char *format, ...)
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainen const char *ret;
f818f91a2e6ee003aaa83323acd74008aa1276d9Timo Sirainen ret = p_strdup_vprintf(unsafe_data_stack_pool, format, args);
5ef28f68edef46f69961b19b7c1dcd8ec5a955e8Timo Sirainenconst char *t_strdup_vprintf(const char *format, va_list args)
const char *ret;
return ret;
if (*p == cutchar)
return str;
if (dstsize == 0)
dstsize--;
*p = i_toupper(*p);
return str;
*p = i_tolower(*p);
return str;
int ret;
while (size > 0) {
if (ret != 0)
return ret;
char **array;
char *str;
if (spaces) {
data++;
sizeof(char *) * alloc_count,
if (spaces) {
str++;
str++;
return array;
const char *separators)
const char **array;
char *dest;
if (i >= dest_size) {
array_size++;
dest_size = i;
for (i = 0; i < dest_size; i++) {
return array;
unsigned int count;
count++;
return count;
char *str;
if (pos != 0) {
return str;
const char **dest;
return TRUE;
return FALSE;
return TRUE;
return FALSE;
return TRUE;
return FALSE;
const char **ret;
ret[i] = p;
p += len;
return ret;
char *buffer;
int pos;