@matheusbsbs / matheus-bagliano / commits / 78457bc0cc
Fork 0

compat: add strtok_r()

Windows does not have strtok_r (and while it does have an identical strtok_s, but it is not obvious how to use it). Grab an implementation from glibc. The svn-fe tool uses strtok_r to parse paths. Acked-by: Johannes Sixt <j6t@kdbg.org> Helped-by: Jakub Narebski <jnareb@gmail.com> Signed-off-by: Jonathan Nieder <jrnieder@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Jonathan Nieder committed Aug 13, 2010 at 18:59 UTC 78457bc0ccc1af8b9eb776a0b17986ebd50442bc
5 files changed +81
Makefile
+8
@@ -68,6 +68,8 @@ all::
68 #
69 # Define NO_MKSTEMPS if you don't have mkstemps in the C library.
70 #
71 +# Define NO_STRTOK_R if you don't have strtok_r in the C library.
72 +#
73 # Define NO_LIBGEN_H if you don't have libgen.h.
74 #
75 # Define NEEDS_LIBGEN if your libgen needs -lgen when linking
@@ -1041,6 +1043,7 @@ ifeq ($(uname_S),Windows)
1043 NO_UNSETENV = YesPlease
1044 NO_STRCASESTR = YesPlease
1045 NO_STRLCPY = YesPlease
1046 + NO_STRTOK_R = YesPlease
1047 NO_MEMMEM = YesPlease
1048 # NEEDS_LIBICONV = YesPlease
1049 NO_ICONV = YesPlease
@@ -1095,6 +1098,7 @@ ifneq (,$(findstring MINGW,$(uname_S)))
1098 NO_UNSETENV = YesPlease
1099 NO_STRCASESTR = YesPlease
1100 NO_STRLCPY = YesPlease
1101 + NO_STRTOK_R = YesPlease
1102 NO_MEMMEM = YesPlease
1103 NEEDS_LIBICONV = YesPlease
1104 OLD_ICONV = YesPlease
@@ -1325,6 +1329,10 @@ endif
1329 ifdef NO_STRTOULL
1330 COMPAT_CFLAGS += -DNO_STRTOULL
1331 endif
1332 +ifdef NO_STRTOK_R
1333 + COMPAT_CFLAGS += -DNO_STRTOK_R
1334 + COMPAT_OBJS += compat/strtok_r.o
1335 +endif
1336 ifdef NO_SETENV
1337 COMPAT_CFLAGS += -DNO_SETENV
1338 COMPAT_OBJS += compat/setenv.o
compat/strtok_r.c new
+61
@@ -0,0 +1,61 @@
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 +*/
32 +char *
33 +gitstrtok_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 +}
config.mak.in
+1
@@ -46,6 +46,7 @@ NO_IPV6=@NO_IPV6@
46 NO_C99_FORMAT=@NO_C99_FORMAT@
47 NO_HSTRERROR=@NO_HSTRERROR@
48 NO_STRCASESTR=@NO_STRCASESTR@
49 +NO_STRTOK_R=@NO_STRTOK_R@
50 NO_MEMMEM=@NO_MEMMEM@
51 NO_STRLCPY=@NO_STRLCPY@
52 NO_UINTMAX_T=@NO_UINTMAX_T@
configure.ac
+6
@@ -783,6 +783,12 @@ GIT_CHECK_FUNC(strcasestr,
783 [NO_STRCASESTR=YesPlease])
784 AC_SUBST(NO_STRCASESTR)
785 #
786 +# Define NO_STRTOK_R if you don't have strtok_r
787 +GIT_CHECK_FUNC(strtok_r,
788 +[NO_STRTOK_R=],
789 +[NO_STRTOK_R=YesPlease])
790 +AC_SUBST(NO_STRTOK_R)
791 +#
792 # Define NO_MEMMEM if you don't have memmem.
793 GIT_CHECK_FUNC(memmem,
794 [NO_MEMMEM=],
git-compat-util.h
+5
@@ -312,6 +312,11 @@ extern size_t gitstrlcpy(char *, const char *, size_t);
312 extern uintmax_t gitstrtoumax(const char *, char **, int);
313 #endif
314
315 +#ifdef NO_STRTOK_R
316 +#define strtok_r gitstrtok_r
317 +extern char *gitstrtok_r(char *s, const char *delim, char **save_ptr);
318 +#endif
319 +
320 #ifdef NO_HSTRERROR
321 #define hstrerror githstrerror
322 extern const char *githstrerror(int herror);