Commit | Line | Data |
---|---|---|
c0c3707f CB |
1 | # strtok_r.m4 serial 15 |
2 | dnl Copyright (C) 2002-2004, 2006-2007, 2009-2019 Free Software Foundation, | |
421693b0 PA |
3 | dnl Inc. |
4 | dnl This file is free software; the Free Software Foundation | |
5 | dnl gives unlimited permission to copy and/or distribute it, | |
6 | dnl with or without modifications, as long as this notice is preserved. | |
7 | ||
8 | AC_DEFUN([gl_FUNC_STRTOK_R], | |
9 | [ | |
10 | dnl The strtok_r() declaration in lib/string.in.h uses 'restrict'. | |
11 | AC_REQUIRE([AC_C_RESTRICT]) | |
12 | ||
13 | AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) | |
14 | AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles | |
15 | AC_CHECK_FUNCS([strtok_r]) | |
16 | if test $ac_cv_func_strtok_r = yes; then | |
17 | HAVE_STRTOK_R=1 | |
18 | dnl glibc 2.7 has a bug in strtok_r that causes a segmentation fault | |
19 | dnl when the second argument to strtok_r is a constant string that has | |
20 | dnl exactly one byte and compiling with optimization. This bug is, for | |
21 | dnl example, present in the glibc 2.7-18 package in Debian "lenny". | |
c0c3707f | 22 | dnl See <https://sourceware.org/bugzilla/show_bug.cgi?id=5614>. |
421693b0 PA |
23 | AC_CACHE_CHECK([whether strtok_r works], [gl_cv_func_strtok_r_works], |
24 | [AC_RUN_IFELSE( | |
25 | [AC_LANG_PROGRAM([[ | |
26 | #ifndef __OPTIMIZE__ | |
27 | # define __OPTIMIZE__ 1 | |
28 | #endif | |
29 | #undef __OPTIMIZE_SIZE__ | |
30 | #undef __NO_INLINE__ | |
31 | #include <stdlib.h> | |
32 | #include <string.h> | |
33 | ]], | |
34 | [[static const char dummy[] = "\177\01a"; | |
35 | char delimiters[] = "xxxxxxxx"; | |
36 | char *save_ptr = (char *) dummy; | |
37 | strtok_r (delimiters, "x", &save_ptr); | |
38 | strtok_r (NULL, "x", &save_ptr); | |
39 | return 0; | |
40 | ]]) | |
41 | ], | |
42 | [gl_cv_func_strtok_r_works=yes], | |
43 | [gl_cv_func_strtok_r_works=no], | |
c0c3707f CB |
44 | [case "$host_os" in |
45 | # Guess no on glibc systems. | |
46 | *-gnu* | gnu*) gl_cv_func_strtok_r_works="guessing no" ;; | |
47 | # Guess yes on native Windows. | |
48 | mingw*) gl_cv_func_strtok_r_works="guessing yes" ;; | |
49 | *) gl_cv_func_strtok_r_works="guessing yes" ;; | |
421693b0 | 50 | esac |
421693b0 PA |
51 | ]) |
52 | ]) | |
53 | case "$gl_cv_func_strtok_r_works" in | |
54 | *no) | |
55 | dnl We could set REPLACE_STRTOK_R=1 here, but it's only the macro | |
56 | dnl version in <bits/string2.h> which is wrong. The code compiled | |
57 | dnl into libc is fine. | |
58 | UNDEFINE_STRTOK_R=1 | |
59 | ;; | |
60 | esac | |
61 | else | |
62 | HAVE_STRTOK_R=0 | |
63 | fi | |
64 | AC_CHECK_DECLS_ONCE([strtok_r]) | |
65 | if test $ac_cv_have_decl_strtok_r = no; then | |
66 | HAVE_DECL_STRTOK_R=0 | |
67 | fi | |
68 | ]) | |
69 | ||
70 | # Prerequisites of lib/strtok_r.c. | |
71 | AC_DEFUN([gl_PREREQ_STRTOK_R], [ | |
72 | : | |
73 | ]) |