X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Fstr_talloc%2Fstr_talloc.h;h=c6e6a84bb00d64a496973d5a756ac31d993c9261;hp=50cea2dcb3b4ce6db7d3bcd968b41215a1a475e6;hb=c438ec17d7b2efe76e56e5fc5ab88bd4a02735e8;hpb=1fe7f55b1efc5deefb20815a03b56c8ef0f6dc53;ds=sidebyside diff --git a/ccan/str_talloc/str_talloc.h b/ccan/str_talloc/str_talloc.h index 50cea2dc..c6e6a84b 100644 --- a/ccan/str_talloc/str_talloc.h +++ b/ccan/str_talloc/str_talloc.h @@ -1,3 +1,4 @@ +/* Licensed under LGPLv2.1+ - see LICENSE file for details */ #ifndef CCAN_STR_TALLOC_H #define CCAN_STR_TALLOC_H #include @@ -8,7 +9,6 @@ * @ctx: the context to tallocate from (often NULL) * @string: the string to split * @delims: delimiters where lines should be split. - * @nump: optional pointer to place resulting number of lines * * This function splits a single string into multiple strings. The * original string is untouched: an array is allocated (using talloc) @@ -16,8 +16,9 @@ * in empty substrings. By definition, no delimiters will appear in * the substrings. * - * The final char * in the array will be NULL, so you can use this or - * @nump to find the array length. + * The final char * in the array will be NULL, talloc_array_length() of the + * returned value is 1 greater than the number of valid elements in + * the array. * * Example: * #include @@ -29,7 +30,7 @@ * unsigned int i, long_lines = 0; * * // Can only fail on out-of-memory. - * lines = strsplit(NULL, string, "\n", NULL); + * lines = strsplit(NULL, string, "\n"); * for (i = 0; lines[i] != NULL; i++) * if (strlen(lines[i]) > 80) * long_lines++; @@ -37,8 +38,7 @@ * return long_lines; * } */ -char **strsplit(const void *ctx, const char *string, const char *delims, - unsigned int *nump); +char **strsplit(const void *ctx, const char *string, const char *delims); /** * strjoin - Join an array of substrings into one long string @@ -56,11 +56,54 @@ char **strsplit(const void *ctx, const char *string, const char *delims, * { * char **lines, *ret; * - * lines = strsplit(NULL, string, "\n", NULL); + * lines = strsplit(NULL, string, "\n"); * ret = strjoin(NULL, lines, "-- EOL\n"); * talloc_free(lines); * return ret; * } */ char *strjoin(const void *ctx, char *strings[], const char *delim); + +/** + * strreg - match and extract from a string via (extended) regular expressions. + * @ctx: the context to tallocate from (often NULL) + * @string: the string to try to match. + * @regex: the regular expression to match. + * ...: pointers to strings to allocate for subexpressions. + * + * Returns true if we matched, in which case any parenthesized + * expressions in @regex are allocated and placed in the char ** + * arguments following @regex. NULL arguments mean the match is not + * saved. The order of the strings is the order + * of opening braces in the expression: in the case of repeated + * expressions (eg "([a-z])*") the last one is saved, in the case of + * non-existent matches (eg "([a-z]*)?") the pointer is set to NULL. + * + * Allocation failures or malformed regular expressions return false. + * + * See Also: + * 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!' + * int main(int argc, char *argv[]) + * { + * char *person, *input; + * + * // Join args and trim trailing space. + * input = strjoin(NULL, argv+1, " "); + * if (strlen(input) != 0) + * input[strlen(input)-1] = '\0'; + * + * if (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, ...); #endif /* CCAN_STR_TALLOC_H */