strfuncs.h revision e2d420dc4bbb06de56ca225c1d9eb79456c792c5
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainen#define MAX_INT_STRLEN ((sizeof(uintmax_t) * CHAR_BIT + 2) / 3 + 1)
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainenextern const unsigned char uchar_nul; /* (const unsigned char *)"" */
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainen/* Returns -1 if dest wasn't large enough, 0 if not. */
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainenint i_snprintf(char *dest, size_t max_chars, const char *format, ...)
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainenchar *p_strdup(pool_t pool, const char *str) ATTR_MALLOC;
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainenvoid *p_memdup(pool_t pool, const void *data, size_t size) ATTR_MALLOC;
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainen/* return NULL if str = "" */
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainenchar *p_strdup_empty(pool_t pool, const char *str) ATTR_MALLOC;
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainen/* *end isn't included */
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainenchar *p_strdup_until(pool_t pool, const void *start, const void *end)
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainenchar *p_strndup(pool_t pool, const void *str, size_t max_chars) ATTR_MALLOC;
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainenchar *p_strdup_printf(pool_t pool, const char *format, ...)
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainen ATTR_FORMAT(2, 3) ATTR_MALLOC ATTR_RETURNS_NONNULL;
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainenchar *p_strdup_vprintf(pool_t pool, const char *format, va_list args)
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainen ATTR_FORMAT(2, 0) ATTR_MALLOC ATTR_RETURNS_NONNULL;
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainenchar *p_strconcat(pool_t pool, const char *str1, ...)
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainen/* same with temporary memory allocations: */
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainenconst char *t_strdup(const char *str) ATTR_MALLOC;
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainenchar *t_strdup_noconst(const char *str) ATTR_MALLOC;
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainen/* return NULL if str = "" */
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainenconst char *t_strdup_empty(const char *str) ATTR_MALLOC;
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainen/* *end isn't included */
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainenconst char *t_strdup_until(const void *start, const void *end)
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainenconst char *t_strndup(const void *str, size_t max_chars) ATTR_MALLOC;
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainenconst char *t_strdup_printf(const char *format, ...)
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainen ATTR_FORMAT(1, 2) ATTR_MALLOC ATTR_RETURNS_NONNULL;
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainenconst char *t_strdup_vprintf(const char *format, va_list args)
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainen ATTR_FORMAT(1, 0) ATTR_MALLOC ATTR_RETURNS_NONNULL;
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainen/* Like t_strdup(), but stop at cutchar. */
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainenconst char *t_strcut(const char *str, char cutchar);
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainen/* Replace all from->to chars in the string. */
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainenconst char *t_str_replace(const char *str, char from, char to);
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainen/* Like strlcpy(), but return -1 if buffer was overflown, 0 if not. */
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainenint i_strocpy(char *dest, const char *src, size_t dstsize);
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainen/* Trim matching chars from either side of the string */
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainenconst char *t_str_trim(const char *str, const char *chars);
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainenconst char *p_str_trim(pool_t pool, const char *str, const char *chars);
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainenconst char *str_ltrim(const char *str, const char *chars);
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainenconst char *t_str_ltrim(const char *str, const char *chars);
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainenconst char *p_str_ltrim(pool_t pool, const char *str, const char *chars);
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainenconst char *t_str_rtrim(const char *str, const char *chars);
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainenconst char *p_str_rtrim(pool_t pool, const char *str, const char *chars);
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainenint null_strcmp(const char *s1, const char *s2) ATTR_PURE;
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainenint bsearch_strcmp(const char *key, const char *const *member) ATTR_PURE;
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainenint bsearch_strcasecmp(const char *key, const char *const *member) ATTR_PURE;
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainenint i_memcasecmp(const void *p1, const void *p2, size_t size) ATTR_PURE;
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainenint i_strcmp_p(const char *const *p1, const char *const *p2) ATTR_PURE;
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainenint i_strcasecmp_p(const char *const *p1, const char *const *p2) ATTR_PURE;
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainen/* separators is an array of separator characters, not a separator string.
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainen an empty data string results in an array containing only NULL. */
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainenchar **p_strsplit(pool_t pool, const char *data, const char *separators)
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainenconst char **t_strsplit(const char *data, const char *separators)
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainen/* like p_strsplit(), but treats multiple adjacent separators as a single
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainen separator. */
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainenchar **p_strsplit_spaces(pool_t pool, const char *data, const char *separators)
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainenconst char **t_strsplit_spaces(const char *data, const char *separators)
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainen/* Optimized version of t_strsplit(data, "\t") */
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainenconst char **t_strsplit_tab(const char *data) ATTR_MALLOC ATTR_RETURNS_NONNULL;
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainen/* Return length of NULL-terminated list string array */
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainenunsigned int str_array_length(const char *const *arr) ATTR_PURE;
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainen/* Return all strings from array joined into one string. */
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainenconst char *t_strarray_join(const char *const *arr, const char *separator)
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainen/* Removes a value from NULL-terminated string array. Returns TRUE if found. */
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainenbool str_array_remove(const char **arr, const char *value);
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainen/* Returns TRUE if value exists in NULL-terminated string array. */
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainenbool str_array_find(const char *const *arr, const char *value);
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainen/* Like str_array_find(), but use strcasecmp(). */
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainenbool str_array_icase_find(const char *const *arr, const char *value);
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainen/* Duplicate array of strings. The memory can be freed by freeing the
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainen return value. */
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainenconst char **p_strarray_dup(pool_t pool, const char *const *arr)
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainen/* Join ARRAY_TYPE(const_string) to a string, similar to t_strarray_join() */
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainenchar *p_array_const_string_join(pool_t pool, const ARRAY_TYPE(const_string) *arr,
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainen#define t_array_const_string_join(arr, separator) \
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainen ((const char *)p_array_const_string_join(unsafe_data_stack_pool, arr, separator))
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainen/* FIXME: v2.3 - sort and search APIs belong into their own header, not here */
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainen#define i_bsearch(key, base, nmemb, size, cmp) \
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainen CALLBACK_TYPECHECK(cmp, int (*)(typeof(const typeof(*key) *), \
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainen (int (*)(const void *, const void *))cmp)
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainen/* INTERNAL */
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainenchar *t_noalloc_strdup_vprintf(const char *format, va_list args,
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainen unsigned int *size_r)
9761e0036c87f459abe040632e1252f794ffe5f7Timo Sirainenchar *vstrconcat(const char *str1, va_list args, size_t *ret_len) ATTR_MALLOC;