strfuncs.c revision a8319b1f667a808f335447e9fa10ff66b99705c5
02c335c23bf5fa225a467c19f2c063fb0dc7b8c3Timo Sirainen/* Copyright (c) 2002-2015 Dovecot authors, see the included COPYING file */
cf636afb3826f0d8e15c248aa1fc04ce72820e08Timo Sirainen/* @UNSAFE: whole file */
cf636afb3826f0d8e15c248aa1fc04ce72820e08Timo Sirainenint i_snprintf(char *dest, size_t max_chars, const char *format, ...)
2f4f603d4cebab2cc956c72164efb02da83515c5Timo Sirainen ret = vsnprintf(dest, max_chars, printf_format_fix_unsafe(format),
d5e839aea288aceaddae28a1578cebda3c9e3b58Timo Sirainen return (unsigned int)ret < max_chars ? 0 : -1;
cf636afb3826f0d8e15c248aa1fc04ce72820e08Timo Sirainenvoid *p_memdup(pool_t pool, const void *data, size_t size)
cf636afb3826f0d8e15c248aa1fc04ce72820e08Timo Sirainenchar *p_strdup_empty(pool_t pool, const char *str)
46b823ac3bce2c0f9f0fc73911e48d3a77b04fbeTimo Sirainenchar *p_strdup_until(pool_t pool, const void *start, const void *end)
cf636afb3826f0d8e15c248aa1fc04ce72820e08Timo Sirainen i_assert((const char *) start <= (const char *) end);
cf636afb3826f0d8e15c248aa1fc04ce72820e08Timo Sirainen size = (size_t) ((const char *) end - (const char *) start);
cf636afb3826f0d8e15c248aa1fc04ce72820e08Timo Sirainenchar *p_strndup(pool_t pool, const void *str, size_t max_chars)
cf636afb3826f0d8e15c248aa1fc04ce72820e08Timo Sirainen while (len < max_chars && ((const char *) str)[len] != '\0')
cf636afb3826f0d8e15c248aa1fc04ce72820e08Timo Sirainenchar *p_strdup_printf(pool_t pool, const char *format, ...)
25ec868bd8b5375e1c1c4c3331d761667ddfe26cTimo Sirainenchar *t_noalloc_strdup_vprintf(const char *format, va_list args,
25ec868bd8b5375e1c1c4c3331d761667ddfe26cTimo Sirainen unsigned int *size_r)
cf636afb3826f0d8e15c248aa1fc04ce72820e08Timo Sirainen /* the format string is modified only if %m exists in it. it happens
cf636afb3826f0d8e15c248aa1fc04ce72820e08Timo Sirainen only in error conditions, so don't try to t_push() here since it'll
cf636afb3826f0d8e15c248aa1fc04ce72820e08Timo Sirainen just slow down the normal code path. */
cf636afb3826f0d8e15c248aa1fc04ce72820e08Timo Sirainen format = printf_format_fix_get_len(format, &init_size);
cf636afb3826f0d8e15c248aa1fc04ce72820e08Timo Sirainen ret = vsnprintf(tmp, init_size, format, args);
baf346e71ebd7b44fcba4b48f4d39845453b778bTimo Sirainen /* didn't fit with the first guess. now we know the size,
6adf683655750bcb809275cd65dc75fd12214198Timo Sirainen so try again. */
c076ad69e28e7d41af83ada84e12019793ffcfa2Timo Sirainen /* we rely on errno not changing. it shouldn't. */
baf346e71ebd7b44fcba4b48f4d39845453b778bTimo Sirainenchar *p_strdup_vprintf(pool_t pool, const char *format, va_list args)
6adf683655750bcb809275cd65dc75fd12214198Timo Sirainen unsigned int size;
baf346e71ebd7b44fcba4b48f4d39845453b778bTimo Sirainen tmp = t_noalloc_strdup_vprintf(format, args, &size);
baf346e71ebd7b44fcba4b48f4d39845453b778bTimo Sirainenchar *vstrconcat(const char *str1, va_list args, size_t *ret_len)
baf346e71ebd7b44fcba4b48f4d39845453b778bTimo Sirainen const char *str;
baf346e71ebd7b44fcba4b48f4d39845453b778bTimo Sirainen /* need more memory */
6adf683655750bcb809275cd65dc75fd12214198Timo Sirainen /* next string */
baf346e71ebd7b44fcba4b48f4d39845453b778bTimo Sirainenchar *p_strconcat(pool_t pool, const char *str1, ...)
8a8a3b43987b5ade914f22765e51c9e3de8179d3Timo Sirainen return p_strdup_empty(unsafe_data_stack_pool, str);
8a8a3b43987b5ade914f22765e51c9e3de8179d3Timo Sirainenconst char *t_strdup_until(const void *start, const void *end)
8a8a3b43987b5ade914f22765e51c9e3de8179d3Timo Sirainen return p_strdup_until(unsafe_data_stack_pool, start, end);
cf636afb3826f0d8e15c248aa1fc04ce72820e08Timo Sirainenconst char *t_strndup(const void *str, size_t max_chars)
cf636afb3826f0d8e15c248aa1fc04ce72820e08Timo Sirainen return p_strndup(unsafe_data_stack_pool, str, max_chars);
baf346e71ebd7b44fcba4b48f4d39845453b778bTimo Sirainenconst char *t_strdup_printf(const char *format, ...)
cf636afb3826f0d8e15c248aa1fc04ce72820e08Timo Sirainen const char *ret;
8a8a3b43987b5ade914f22765e51c9e3de8179d3Timo Sirainen ret = p_strdup_vprintf(unsafe_data_stack_pool, format, args);
2f4f603d4cebab2cc956c72164efb02da83515c5Timo Sirainenconst char *t_strdup_vprintf(const char *format, va_list args)
2f4f603d4cebab2cc956c72164efb02da83515c5Timo Sirainen return p_strdup_vprintf(unsafe_data_stack_pool, format, args);
cf636afb3826f0d8e15c248aa1fc04ce72820e08Timo Sirainen const char *ret;
baf346e71ebd7b44fcba4b48f4d39845453b778bTimo Sirainenconst char *t_strcut(const char *str, char cutchar)
baf346e71ebd7b44fcba4b48f4d39845453b778bTimo Sirainen const char *p;
baf346e71ebd7b44fcba4b48f4d39845453b778bTimo Sirainenconst char *t_str_replace(const char *str, char from, char to)
baf346e71ebd7b44fcba4b48f4d39845453b778bTimo Sirainen unsigned int i, len;
baf346e71ebd7b44fcba4b48f4d39845453b778bTimo Sirainen for (i = 0; i < len; i++) {
bace943c67e6cd14ce6c994f533d82a3caad5bf1Timo Sirainenint i_strocpy(char *dest, const char *src, size_t dstsize)
*p = i_toupper(*p);
return str;
*p = i_tolower(*p);
return str;
p = str;
begin = p;
if (p <= begin)
p = str;
const char *p, *pend;
if (p <= 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;