X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Ftal%2Fstr%2Fstr.h;h=bdcb27ea3f8e18b398e81ba2f876154d6118b092;hb=38ec541c4fd76d971a4959e31cd2a9ff113237ca;hp=7d0a94541e41b10501ca2076ab6536ffa489d7e1;hpb=f103f73ff040a8700a2bbd47948277e7c484baa2;p=ccan diff --git a/ccan/tal/str/str.h b/ccan/tal/str/str.h index 7d0a9454..bdcb27ea 100644 --- a/ccan/tal/str/str.h +++ b/ccan/tal/str/str.h @@ -1,18 +1,92 @@ /* Licensed under BSD-MIT - see LICENSE file for details */ #ifndef CCAN_STR_TAL_H #define CCAN_STR_TAL_H +#ifdef TAL_USE_TALLOC +#include +#else #include -#include +#endif #include #include +/** + * tal_strdup - duplicate a string + * @ctx: NULL, or tal allocated object to be parent. + * @p: the string to copy (can be take()). + */ +#define tal_strdup(ctx, p) tal_strdup_(ctx, p, TAL_LABEL(char, "[]")) +char *tal_strdup_(const tal_t *ctx, const char *p TAKES, const char *label); + +/** + * tal_strndup - duplicate a limited amount of a string. + * @ctx: NULL, or tal allocated object to be parent. + * @p: the string to copy (can be take()). + * @n: the maximum length to copy. + * + * Always gives a nul-terminated string, with strlen() <= @n. + */ +#define tal_strndup(ctx, p, n) tal_strndup_(ctx, p, n, TAL_LABEL(char, "[]")) +char *tal_strndup_(const tal_t *ctx, const char *p TAKES, size_t n, + const char *label); + +/** + * tal_fmt - allocate a formatted string + * @ctx: NULL, or tal allocated object to be parent. + * @fmt: the printf-style format (can be take()). + */ +#define tal_fmt(ctx, ...) \ + tal_fmt_(ctx, TAL_LABEL(char, "[]"), __VA_ARGS__) +char *tal_fmt_(const tal_t *ctx, const char *label, const char *fmt TAKES, + ...) PRINTF_FMT(3,4); + +/** + * tal_vfmt - allocate a formatted string (va_list version) + * @ctx: NULL, or tal allocated object to be parent. + * @fmt: the printf-style format (can be take()). + * @va: the va_list containing the format args. + */ +#define tal_vfmt(ctx, fmt, va) \ + tal_vfmt_(ctx, fmt, va, TAL_LABEL(char, "[]")) +char *tal_vfmt_(const tal_t *ctx, const char *fmt TAKES, va_list ap, + const char *label) + PRINTF_FMT(2,0); + +/** + * tal_append_fmt - append a formatted string to a talloc string. + * @baseptr: a pointer to the tal string to be appended to. + * @fmt: the printf-style format (can be take()). + * + * Returns false on allocation failure. + */ +bool tal_append_fmt(char **baseptr, const char *fmt TAKES, ...) PRINTF_FMT(2,3); + +/** + * tal_append_vfmt - append a formatted string to a talloc string (va_list) + * @baseptr: a pointer to the tal string to be appended to. + * @fmt: the printf-style format (can be take()). + * @va: the va_list containing the format args. + * + * Returns false on allocation failure. + */ +bool tal_append_vfmt(char **baseptr, const char *fmt TAKES, va_list ap); + +/** + * tal_strcat - join two strings together + * @ctx: NULL, or tal allocated object to be parent. + * @s1: the first string (can be take()). + * @s2: the second string (can be take()). + */ +#define tal_strcat(ctx, s1, s2) tal_strcat_(ctx, s1, s2, TAL_LABEL(char, "[]")) +char *tal_strcat_(const tal_t *ctx, const char *s1 TAKES, const char *s2 TAKES, + const char *label); + enum strsplit { STR_EMPTY_OK, STR_NO_EMPTY }; /** - * strsplit - Split string into an array of substrings + * tal_strsplit - Split string into an array of substrings * @ctx: the context to tal from (often NULL). * @string: the string to split (can be take()). * @delims: delimiters where lines should be split (can be take()). @@ -26,7 +100,8 @@ enum strsplit { * Multiple delimiters result in empty substrings. By definition, no * delimiters will appear in the substrings. * - * The final char * in the array will be NULL. + * The final char * in the array will be NULL, and tal_count() will + * return the number of elements plus 1 (for that NULL). * * Example: * #include @@ -37,7 +112,7 @@ enum strsplit { * unsigned int i, long_lines = 0; * * // Can only fail on out-of-memory. - * lines = strsplit(NULL, string, "\n", STR_NO_EMPTY); + * lines = tal_strsplit(NULL, string, "\n", STR_NO_EMPTY); * for (i = 0; lines[i] != NULL; i++) * if (strlen(lines[i]) > 80) * long_lines++; @@ -45,8 +120,13 @@ enum strsplit { * return long_lines; * } */ -char **strsplit(const tal_t *ctx, - const char *string, const char *delims, enum strsplit flags); +#define tal_strsplit(ctx, string, delims, flag) \ + tal_strsplit_(ctx, string, delims, flag, TAL_LABEL(char *, "[]")) +char **tal_strsplit_(const tal_t *ctx, + const char *string TAKES, + const char *delims TAKES, + enum strsplit flag, + const char *label); enum strjoin { STR_TRAIL, @@ -54,7 +134,7 @@ enum strjoin { }; /** - * strjoin - Join an array of substrings into one long string + * tal_strjoin - Join an array of substrings into one long string * @ctx: the context to tal from (often NULL). * @strings: the NULL-terminated array of strings to join (can be take()) * @delim: the delimiter to insert between the strings (can be take()) @@ -70,17 +150,22 @@ enum strjoin { * { * char **lines, *ret; * - * lines = strsplit(NULL, string, "\n", STR_EMPTY_OK); - * ret = strjoin(NULL, lines, "-- EOL\n", STR_TRAIL); + * lines = tal_strsplit(NULL, string, "\n", STR_EMPTY_OK); + * ret = tal_strjoin(NULL, lines, "-- EOL\n", STR_TRAIL); * tal_free(lines); * return ret; * } */ -char *strjoin(const void *ctx, char *strings[], const char *delim, - enum strjoin flags); +#define tal_strjoin(ctx, strings, delim, flags) \ + tal_strjoin_(ctx, strings, delim, flags, TAL_LABEL(char, "[]")) +char *tal_strjoin_(const void *ctx, + char *strings[] TAKES, + const char *delim TAKES, + enum strjoin flags, + const char *label); /** - * strreg - match and extract from a string via (extended) regular expressions. + * tal_strreg - match/extract from a string via (extended) regular expressions. * @ctx: the context to tal from (often NULL) * @string: the string to try to match (can be take()) * @regex: the regular expression to match (can be take()) @@ -100,22 +185,27 @@ char *strjoin(const void *ctx, char *strings[], const char *delim, * regcomp(3), regex(3). * * Example: - * // Given 'My name is Rusty' outputs 'Hello Rusty!' - * // Given 'my first name is Rusty Russell' outputs 'Hello Rusty Russell!' - * // Given 'My name isnt Rusty Russell' outputs 'Hello there!' + * // Given "My name is Rusty" outputs "Hello Rusty!\n" + * // Given "my first name is Rusty Russell" outputs "Hello Rusty Russell!\n" + * // Given "My name isnt Rusty Russell" outputs "Hello there!\n" * int main(int argc, char *argv[]) * { * char *person, *input; * + * (void)argc; * // Join args and trim trailing space. - * input = strjoin(NULL, argv+1, " ", STR_NO_TRAIL); - * if (strreg(NULL, input, "[Mm]y (first )?name is ([A-Za-z ]+)", - * NULL, &person)) + * input = tal_strjoin(NULL, argv+1, " ", STR_NO_TRAIL); + * if (tal_strreg(NULL, input, + * "[Mm]y (first )?name is ([A-Za-z ]+)", + * NULL, &person)) * printf("Hello %s!\n", person); * else * printf("Hello there!\n"); * return 0; * } */ -bool strreg(const void *ctx, const char *string, const char *regex, ...); +#define tal_strreg(ctx, string, ...) \ + tal_strreg_(ctx, string, TAL_LABEL(char, "[]"), __VA_ARGS__) +bool tal_strreg_(const void *ctx, const char *string TAKES, + const char *label, const char *regex, ...); #endif /* CCAN_STR_TAL_H */