On Sun, Jul 27, 2025 at 2:57 AM Alec Brown via Grub-devel <grub-devel@gnu.org> wrote: > > Add the functions grub_strtok() and grub_strtok_r() to help parse strings into > tokens separated by characters in the 'delim' parameter. These functions are > present in gnulib but calling them directly from the gnulib code is quite > challenging since the call "#include <string.h>" would include the header file > grub-core/lib/posix_wrap/string.h instead of grub-core/lib/gnulib/string.h, > where strtok() and strtok_r() are declared. Since this overlap is quite > problematic, the simpler solution was to implement the code in the GRUB based > on gnulib's implementation. For more information on these functions, visit the > Linux Programmer's Manual("man strtok"). > > Signed-off-by: Alec Brown <alec.r.br...@oracle.com> > --- > grub-core/kern/misc.c | 62 +++++++++++++++++++++++++++++++++++++++++++ > include/grub/misc.h | 3 +++ > 2 files changed, 65 insertions(+) > > diff --git a/grub-core/kern/misc.c b/grub-core/kern/misc.c > index 2b7922393..258f91893 100644 > --- a/grub-core/kern/misc.c > +++ b/grub-core/kern/misc.c > @@ -401,6 +401,68 @@ grub_strword (const char *haystack, const char *needle) > return 0; > } > > +char * > +grub_strtok_r (char *s, const char *delim, char **save_ptr) > +{ > + char *token; > + const char *c; > + bool is_delim; > + > + if (s == NULL) > + s = *save_ptr; > + > + /* Scan leading delimiters. */ > + while (*s != '\0') > + { > + is_delim = false; > + for (c = delim; *c != '\0'; c++) > + { > + if (*s == *c) > + { > + is_delim = true; > + break; > + } > + } > + if (is_delim == true) > + s++; > + else > + break;
Would it be sensible to replace the above loop with a for ( ; *s != '\0'; ++s ) if ( grub_strchr(delim, *s) == NULL ) break; > + } > + > + if (*s == '\0') > + { > + *save_ptr = s; > + return NULL; > + } > + > + /* Find the end of the token. */ > + token = s; > + while (*s != '\0') > + { > + for (c = delim; *c != '\0'; c++) > + { > + if (*s == *c) > + { > + *s = '\0'; > + *save_ptr = s + 1; > + return token; > + } > + } > + s++; > + } > + > + *save_ptr = s; > + return token; > +} > + > +char * > +grub_strtok (char *s, const char *delim) > +{ > + static char *last; > + > + return grub_strtok_r (s, delim, &last); > +} > + > int > grub_isspace (int c) > { > diff --git a/include/grub/misc.h b/include/grub/misc.h > index e087e7b3e..9522d7305 100644 > --- a/include/grub/misc.h > +++ b/include/grub/misc.h > @@ -126,6 +126,9 @@ char *EXPORT_FUNC(grub_strchr) (const char *s, int c); > char *EXPORT_FUNC(grub_strrchr) (const char *s, int c); > int EXPORT_FUNC(grub_strword) (const char *s, const char *w); > > +char *EXPORT_FUNC(grub_strtok_r) (char *s, const char *delim, char > **save_ptr); > +char *EXPORT_FUNC(grub_strtok) (char *s, const char *delim); > + > /* Copied from gnulib. > Written by Bruno Haible <br...@clisp.org>, 2005. */ > static inline char * Otherwise the patch looks good to me. Frediano _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel