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

Reply via email to