Add an implementation of libc's standard strtok(3), which is useful for tokenizing strings.
Also, add a version that will collect all tokens from a string into an array, which is useful in situations where you need to know how many tokens there are, and when a token's relative position in the order is significant. Signed-off-by: Tobias Waldekranz <tob...@waldekranz.com> --- Notes: v1 -> v2: - Tokeinize using strsep()+empty-token-check instead of strtok() - Return array from strtokv() and pass count in an output pointer, rather than the opposite. include/string.h | 1 + lib/string.c | 30 ++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/include/string.h b/include/string.h index 71affe48b6..cb3492ba04 100644 --- a/include/string.h +++ b/include/string.h @@ -8,6 +8,7 @@ void *mempcpy(void *dest, const void *src, size_t count); int strtobool(const char *str, int *val); char *strsep_unescaped(char **, const char *, char *); +char **strtokv(char *str, const char *delim, int *cntp); char *stpcpy(char *dest, const char *src); bool strends(const char *str, const char *postfix); diff --git a/lib/string.c b/lib/string.c index 73637cd971..a55f989900 100644 --- a/lib/string.c +++ b/lib/string.c @@ -593,6 +593,36 @@ char *strsep_unescaped(char **s, const char *ct, char *delim) return sbegin; } +/** + * strtokv - split string into array of tokens based on a delimiter set + * @str: string to split + * @delim: set of delimiter characters + * @cntp: number of tokens + * + * Split @str into non-empty tokens delimited by spans of characters + * from @delim, and store the numbers of tokens in @cntp. + * + * Return: The allocated array of tokens, which the caller is + * responsible for freeing. + */ +char **strtokv(char *str, const char *delim, int *cntp) +{ + char *tok, **vec = NULL; + int cnt = 0; + + while ((tok = strsep(&str, delim))) { + if (*tok == '\0') + continue; + + vec = xrealloc(vec, (cnt + 1) * sizeof(*vec)); + vec[cnt++] = tok; + } + + *cntp = cnt; + return vec; +} +EXPORT_SYMBOL(strtokv); + #ifndef __HAVE_ARCH_STRSWAB /** * strswab - swap adjacent even and odd bytes in %NUL-terminated string -- 2.43.0