1  /* Reentrant string tokenizer.  Generic version.
       2     Copyright (C) 1991-2023 Free Software Foundation, Inc.
       3     This file is part of the GNU C Library.
       4  
       5     The GNU C Library is free software; you can redistribute it and/or
       6     modify it under the terms of the GNU Lesser General Public
       7     License as published by the Free Software Foundation; either
       8     version 2.1 of the License, or (at your option) any later version.
       9  
      10     The GNU C Library is distributed in the hope that it will be useful,
      11     but WITHOUT ANY WARRANTY; without even the implied warranty of
      12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      13     Lesser General Public License for more details.
      14  
      15     You should have received a copy of the GNU Lesser General Public
      16     License along with the GNU C Library; if not, see
      17     <https://www.gnu.org/licenses/>.  */
      18  
      19  #ifdef HAVE_CONFIG_H
      20  # include <config.h>
      21  #endif
      22  
      23  #include <string.h>
      24  
      25  #ifndef _LIBC
      26  /* Get specification.  */
      27  # include "strtok_r.h"
      28  # define __strtok_r strtok_r
      29  #endif
      30  
      31  /* Parse S into tokens separated by characters in DELIM.
      32     If S is NULL, the saved pointer in SAVE_PTR is used as
      33     the next starting point.  For example:
      34  	char s[] = "-abc-=-def";
      35  	char *sp;
      36  	x = strtok_r(s, "-", &sp);	// x = "abc", sp = "=-def"
      37  	x = strtok_r(NULL, "-=", &sp);	// x = "def", sp = NULL
      38  	x = strtok_r(NULL, "=", &sp);	// x = NULL
      39  		// s = "abc\0-def\0"
      40  */
      41  char *
      42  __strtok_r (char *s, const char *delim, char **save_ptr)
      43  {
      44    char *end;
      45  
      46    if (s == NULL)
      47      s = *save_ptr;
      48  
      49    if (*s == '\0')
      50      {
      51        *save_ptr = s;
      52        return NULL;
      53      }
      54  
      55    /* Scan leading delimiters.  */
      56    s += strspn (s, delim);
      57    if (*s == '\0')
      58      {
      59        *save_ptr = s;
      60        return NULL;
      61      }
      62  
      63    /* Find the end of the token.  */
      64    end = s + strcspn (s, delim);
      65    if (*end == '\0')
      66      {
      67        *save_ptr = end;
      68        return s;
      69      }
      70  
      71    /* Terminate the token and make *SAVE_PTR point past it.  */
      72    *end = '\0';
      73    *save_ptr = end + 1;
      74    return s;
      75  }
      76  #ifdef weak_alias
      77  libc_hidden_def (__strtok_r)
      78  weak_alias (__strtok_r, strtok_r)
      79  #endif