compat / strtok_r.con commit Merge branch 'ef/maint-rebase-error-message' into maint (06de561)
   1/* Reentrant string tokenizer.  Generic version.
   2   Copyright (C) 1991,1996-1999,2001,2004 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, write to the Free
  17   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
  18   02111-1307 USA.  */
  19
  20#include "../git-compat-util.h"
  21
  22/* Parse S into tokens separated by characters in DELIM.
  23   If S is NULL, the saved pointer in SAVE_PTR is used as
  24   the next starting point.  For example:
  25        char s[] = "-abc-=-def";
  26        char *sp;
  27        x = strtok_r(s, "-", &sp);      // x = "abc", sp = "=-def"
  28        x = strtok_r(NULL, "-=", &sp);  // x = "def", sp = NULL
  29        x = strtok_r(NULL, "=", &sp);   // x = NULL
  30                // s = "abc\0-def\0"
  31*/
  32char *
  33gitstrtok_r (char *s, const char *delim, char **save_ptr)
  34{
  35  char *token;
  36
  37  if (s == NULL)
  38    s = *save_ptr;
  39
  40  /* Scan leading delimiters.  */
  41  s += strspn (s, delim);
  42  if (*s == '\0')
  43    {
  44      *save_ptr = s;
  45      return NULL;
  46    }
  47
  48  /* Find the end of the token.  */
  49  token = s;
  50  s = strpbrk (token, delim);
  51  if (s == NULL)
  52    /* This token finishes the string.  */
  53    *save_ptr = token + strlen (token);
  54  else
  55    {
  56      /* Terminate the token and make *SAVE_PTR point past it.  */
  57      *s = '\0';
  58      *save_ptr = s + 1;
  59    }
  60  return token;
  61}