On Sun, Jul 27, 2025 at 2:57 AM Alec Brown via Grub-devel
<[email protected]> 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 <[email protected]>
> ---
> 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 <[email protected]>, 2005. */
> static inline char *
Otherwise the patch looks good to me.
Frediano
_______________________________________________
Grub-devel mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/grub-devel