Hi, On 9/9/25 3:18 PM, Tobias Waldekranz wrote: > Add an implementation of libc's standard strtok(3), which is useful > for tokenizing strings.
Nitpick: Only strtokv is implemented, but I think no need to resend, Sascha can fix it up when applying. > > 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> Reviewed-by: Ahmad Fatoum <a.fat...@pengutronix.de> > --- > > 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 -- Pengutronix e.K. | | Steuerwalder Str. 21 | http://www.pengutronix.de/ | 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |