xref: /Universal-ctags/m4/regex.m4 (revision 820c1a8d46849a90376d8eb15b319ac05439f656)
1*820c1a8dSHiroo HAYASHI# serial 73
2*820c1a8dSHiroo HAYASHI
3*820c1a8dSHiroo HAYASHI# Copyright (C) 1996-2001, 2003-2021 Free Software Foundation, Inc.
4*820c1a8dSHiroo HAYASHI#
5*820c1a8dSHiroo HAYASHI# This file is free software; the Free Software Foundation
6*820c1a8dSHiroo HAYASHI# gives unlimited permission to copy and/or distribute it,
7*820c1a8dSHiroo HAYASHI# with or without modifications, as long as this notice is preserved.
8*820c1a8dSHiroo HAYASHI
9*820c1a8dSHiroo HAYASHIdnl Initially derived from code in GNU grep.
10*820c1a8dSHiroo HAYASHIdnl Mostly written by Jim Meyering.
11*820c1a8dSHiroo HAYASHI
12*820c1a8dSHiroo HAYASHIAC_PREREQ([2.50])
13*820c1a8dSHiroo HAYASHI
14*820c1a8dSHiroo HAYASHIAC_DEFUN([gl_REGEX],
15*820c1a8dSHiroo HAYASHI[
16*820c1a8dSHiroo HAYASHI  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
17*820c1a8dSHiroo HAYASHI  AC_ARG_WITH([included-regex],
18*820c1a8dSHiroo HAYASHI    [AS_HELP_STRING([--without-included-regex],
19*820c1a8dSHiroo HAYASHI                    [don't compile regex; this is the default on systems
20*820c1a8dSHiroo HAYASHI                     with recent-enough versions of the GNU C Library
21*820c1a8dSHiroo HAYASHI                     (use with caution on other systems).])])
22*820c1a8dSHiroo HAYASHI
23*820c1a8dSHiroo HAYASHI  case $with_included_regex in #(
24*820c1a8dSHiroo HAYASHI  yes|no) ac_use_included_regex=$with_included_regex
25*820c1a8dSHiroo HAYASHI        ;;
26*820c1a8dSHiroo HAYASHI  '')
27*820c1a8dSHiroo HAYASHI    # If the system regex support is good enough that it passes the
28*820c1a8dSHiroo HAYASHI    # following run test, then default to *not* using the included regex.c.
29*820c1a8dSHiroo HAYASHI    # If cross compiling, assume the test would fail and use the included
30*820c1a8dSHiroo HAYASHI    # regex.c.
31*820c1a8dSHiroo HAYASHI    AC_CHECK_DECLS_ONCE([alarm])
32*820c1a8dSHiroo HAYASHI    AC_CHECK_HEADERS_ONCE([malloc.h])
33*820c1a8dSHiroo HAYASHI    AC_CACHE_CHECK([for working re_compile_pattern],
34*820c1a8dSHiroo HAYASHI                   [gl_cv_func_re_compile_pattern_working],
35*820c1a8dSHiroo HAYASHI      [AC_RUN_IFELSE(
36*820c1a8dSHiroo HAYASHI        [AC_LANG_PROGRAM(
37*820c1a8dSHiroo HAYASHI          [[#include <regex.h>
38*820c1a8dSHiroo HAYASHI
39*820c1a8dSHiroo HAYASHI            #include <locale.h>
40*820c1a8dSHiroo HAYASHI            #include <limits.h>
41*820c1a8dSHiroo HAYASHI            #include <string.h>
42*820c1a8dSHiroo HAYASHI
43*820c1a8dSHiroo HAYASHI            #if defined M_CHECK_ACTION || HAVE_DECL_ALARM
44*820c1a8dSHiroo HAYASHI            # include <signal.h>
45*820c1a8dSHiroo HAYASHI            # include <unistd.h>
46*820c1a8dSHiroo HAYASHI            #endif
47*820c1a8dSHiroo HAYASHI
48*820c1a8dSHiroo HAYASHI            #if HAVE_MALLOC_H
49*820c1a8dSHiroo HAYASHI            # include <malloc.h>
50*820c1a8dSHiroo HAYASHI            #endif
51*820c1a8dSHiroo HAYASHI
52*820c1a8dSHiroo HAYASHI            #ifdef M_CHECK_ACTION
53*820c1a8dSHiroo HAYASHI            /* Exit with distinguishable exit code.  */
54*820c1a8dSHiroo HAYASHI            static void sigabrt_no_core (int sig) { raise (SIGTERM); }
55*820c1a8dSHiroo HAYASHI            #endif
56*820c1a8dSHiroo HAYASHI          ]],
57*820c1a8dSHiroo HAYASHI          [[int result = 0;
58*820c1a8dSHiroo HAYASHI            static struct re_pattern_buffer regex;
59*820c1a8dSHiroo HAYASHI            unsigned char folded_chars[UCHAR_MAX + 1];
60*820c1a8dSHiroo HAYASHI            int i;
61*820c1a8dSHiroo HAYASHI            const char *s;
62*820c1a8dSHiroo HAYASHI            struct re_registers regs;
63*820c1a8dSHiroo HAYASHI
64*820c1a8dSHiroo HAYASHI            /* Some builds of glibc go into an infinite loop on this
65*820c1a8dSHiroo HAYASHI               test.  Use alarm to force death, and mallopt to avoid
66*820c1a8dSHiroo HAYASHI               malloc recursion in diagnosing the corrupted heap. */
67*820c1a8dSHiroo HAYASHI#if HAVE_DECL_ALARM
68*820c1a8dSHiroo HAYASHI            signal (SIGALRM, SIG_DFL);
69*820c1a8dSHiroo HAYASHI            alarm (2);
70*820c1a8dSHiroo HAYASHI#endif
71*820c1a8dSHiroo HAYASHI#ifdef M_CHECK_ACTION
72*820c1a8dSHiroo HAYASHI            signal (SIGABRT, sigabrt_no_core);
73*820c1a8dSHiroo HAYASHI            mallopt (M_CHECK_ACTION, 2);
74*820c1a8dSHiroo HAYASHI#endif
75*820c1a8dSHiroo HAYASHI
76*820c1a8dSHiroo HAYASHI            if (setlocale (LC_ALL, "en_US.UTF-8"))
77*820c1a8dSHiroo HAYASHI              {
78*820c1a8dSHiroo HAYASHI                {
79*820c1a8dSHiroo HAYASHI                  /* https://sourceware.org/ml/libc-hacker/2006-09/msg00008.html
80*820c1a8dSHiroo HAYASHI                     This test needs valgrind to catch the bug on Debian
81*820c1a8dSHiroo HAYASHI                     GNU/Linux 3.1 x86, but it might catch the bug better
82*820c1a8dSHiroo HAYASHI                     on other platforms and it shouldn't hurt to try the
83*820c1a8dSHiroo HAYASHI                     test here.  */
84*820c1a8dSHiroo HAYASHI                  static char const pat[] = "insert into";
85*820c1a8dSHiroo HAYASHI                  static char const data[] =
86*820c1a8dSHiroo HAYASHI                    "\xFF\0\x12\xA2\xAA\xC4\xB1,K\x12\xC4\xB1*\xACK";
87*820c1a8dSHiroo HAYASHI                  re_set_syntax (RE_SYNTAX_GREP | RE_HAT_LISTS_NOT_NEWLINE
88*820c1a8dSHiroo HAYASHI                                 | RE_ICASE);
89*820c1a8dSHiroo HAYASHI                  memset (&regex, 0, sizeof regex);
90*820c1a8dSHiroo HAYASHI                  s = re_compile_pattern (pat, sizeof pat - 1, &regex);
91*820c1a8dSHiroo HAYASHI                  if (s)
92*820c1a8dSHiroo HAYASHI                    result |= 1;
93*820c1a8dSHiroo HAYASHI                  else
94*820c1a8dSHiroo HAYASHI                    {
95*820c1a8dSHiroo HAYASHI                      if (re_search (&regex, data, sizeof data - 1,
96*820c1a8dSHiroo HAYASHI                                     0, sizeof data - 1, &regs)
97*820c1a8dSHiroo HAYASHI                          != -1)
98*820c1a8dSHiroo HAYASHI                        result |= 1;
99*820c1a8dSHiroo HAYASHI                      regfree (&regex);
100*820c1a8dSHiroo HAYASHI                    }
101*820c1a8dSHiroo HAYASHI                }
102*820c1a8dSHiroo HAYASHI
103*820c1a8dSHiroo HAYASHI                {
104*820c1a8dSHiroo HAYASHI                  /* This test is from glibc bug 15078.
105*820c1a8dSHiroo HAYASHI                     The test case is from Andreas Schwab in
106*820c1a8dSHiroo HAYASHI                     <https://sourceware.org/ml/libc-alpha/2013-01/msg00967.html>.
107*820c1a8dSHiroo HAYASHI                     */
108*820c1a8dSHiroo HAYASHI                  static char const pat[] = "[^x]x";
109*820c1a8dSHiroo HAYASHI                  static char const data[] =
110*820c1a8dSHiroo HAYASHI                    /* <U1000><U103B><U103D><U1014><U103A><U102F><U1015><U103A> */
111*820c1a8dSHiroo HAYASHI                    "\xe1\x80\x80"
112*820c1a8dSHiroo HAYASHI                    "\xe1\x80\xbb"
113*820c1a8dSHiroo HAYASHI                    "\xe1\x80\xbd"
114*820c1a8dSHiroo HAYASHI                    "\xe1\x80\x94"
115*820c1a8dSHiroo HAYASHI                    "\xe1\x80\xba"
116*820c1a8dSHiroo HAYASHI                    "\xe1\x80\xaf"
117*820c1a8dSHiroo HAYASHI                    "\xe1\x80\x95"
118*820c1a8dSHiroo HAYASHI                    "\xe1\x80\xba"
119*820c1a8dSHiroo HAYASHI                    "x";
120*820c1a8dSHiroo HAYASHI                  re_set_syntax (0);
121*820c1a8dSHiroo HAYASHI                  memset (&regex, 0, sizeof regex);
122*820c1a8dSHiroo HAYASHI                  s = re_compile_pattern (pat, sizeof pat - 1, &regex);
123*820c1a8dSHiroo HAYASHI                  if (s)
124*820c1a8dSHiroo HAYASHI                    result |= 1;
125*820c1a8dSHiroo HAYASHI                  else
126*820c1a8dSHiroo HAYASHI                    {
127*820c1a8dSHiroo HAYASHI                      i = re_search (&regex, data, sizeof data - 1,
128*820c1a8dSHiroo HAYASHI                                     0, sizeof data - 1, 0);
129*820c1a8dSHiroo HAYASHI                      if (i != 0 && i != 21)
130*820c1a8dSHiroo HAYASHI                        result |= 1;
131*820c1a8dSHiroo HAYASHI                      regfree (&regex);
132*820c1a8dSHiroo HAYASHI                    }
133*820c1a8dSHiroo HAYASHI                }
134*820c1a8dSHiroo HAYASHI
135*820c1a8dSHiroo HAYASHI                if (! setlocale (LC_ALL, "C"))
136*820c1a8dSHiroo HAYASHI                  return 1;
137*820c1a8dSHiroo HAYASHI              }
138*820c1a8dSHiroo HAYASHI
139*820c1a8dSHiroo HAYASHI            /* This test is from glibc bug 3957, reported by Andrew Mackey.  */
140*820c1a8dSHiroo HAYASHI            re_set_syntax (RE_SYNTAX_EGREP | RE_HAT_LISTS_NOT_NEWLINE);
141*820c1a8dSHiroo HAYASHI            memset (&regex, 0, sizeof regex);
142*820c1a8dSHiroo HAYASHI            s = re_compile_pattern ("a[^x]b", 6, &regex);
143*820c1a8dSHiroo HAYASHI            if (s)
144*820c1a8dSHiroo HAYASHI              result |= 2;
145*820c1a8dSHiroo HAYASHI            else
146*820c1a8dSHiroo HAYASHI              {
147*820c1a8dSHiroo HAYASHI                /* This should fail, but succeeds for glibc-2.5.  */
148*820c1a8dSHiroo HAYASHI                if (re_search (&regex, "a\nb", 3, 0, 3, &regs) != -1)
149*820c1a8dSHiroo HAYASHI                  result |= 2;
150*820c1a8dSHiroo HAYASHI                regfree (&regex);
151*820c1a8dSHiroo HAYASHI              }
152*820c1a8dSHiroo HAYASHI
153*820c1a8dSHiroo HAYASHI            /* This regular expression is from Spencer ere test number 75
154*820c1a8dSHiroo HAYASHI               in grep-2.3.  */
155*820c1a8dSHiroo HAYASHI            re_set_syntax (RE_SYNTAX_POSIX_EGREP);
156*820c1a8dSHiroo HAYASHI            memset (&regex, 0, sizeof regex);
157*820c1a8dSHiroo HAYASHI            for (i = 0; i <= UCHAR_MAX; i++)
158*820c1a8dSHiroo HAYASHI              folded_chars[i] = i;
159*820c1a8dSHiroo HAYASHI            regex.translate = folded_chars;
160*820c1a8dSHiroo HAYASHI            s = re_compile_pattern ("a[[:@:>@:]]b\n", 11, &regex);
161*820c1a8dSHiroo HAYASHI            /* This should fail with _Invalid character class name_ error.  */
162*820c1a8dSHiroo HAYASHI            if (!s)
163*820c1a8dSHiroo HAYASHI              {
164*820c1a8dSHiroo HAYASHI                result |= 4;
165*820c1a8dSHiroo HAYASHI                regfree (&regex);
166*820c1a8dSHiroo HAYASHI              }
167*820c1a8dSHiroo HAYASHI
168*820c1a8dSHiroo HAYASHI            /* Ensure that [b-a] is diagnosed as invalid, when
169*820c1a8dSHiroo HAYASHI               using RE_NO_EMPTY_RANGES. */
170*820c1a8dSHiroo HAYASHI            re_set_syntax (RE_SYNTAX_POSIX_EGREP | RE_NO_EMPTY_RANGES);
171*820c1a8dSHiroo HAYASHI            memset (&regex, 0, sizeof regex);
172*820c1a8dSHiroo HAYASHI            s = re_compile_pattern ("a[b-a]", 6, &regex);
173*820c1a8dSHiroo HAYASHI            if (s == 0)
174*820c1a8dSHiroo HAYASHI              {
175*820c1a8dSHiroo HAYASHI                result |= 8;
176*820c1a8dSHiroo HAYASHI                regfree (&regex);
177*820c1a8dSHiroo HAYASHI              }
178*820c1a8dSHiroo HAYASHI
179*820c1a8dSHiroo HAYASHI            /* This should succeed, but does not for glibc-2.1.3.  */
180*820c1a8dSHiroo HAYASHI            memset (&regex, 0, sizeof regex);
181*820c1a8dSHiroo HAYASHI            s = re_compile_pattern ("{1", 2, &regex);
182*820c1a8dSHiroo HAYASHI            if (s)
183*820c1a8dSHiroo HAYASHI              result |= 8;
184*820c1a8dSHiroo HAYASHI            else
185*820c1a8dSHiroo HAYASHI              regfree (&regex);
186*820c1a8dSHiroo HAYASHI
187*820c1a8dSHiroo HAYASHI            /* The following example is derived from a problem report
188*820c1a8dSHiroo HAYASHI               against gawk from Jorge Stolfi <stolfi@ic.unicamp.br>.  */
189*820c1a8dSHiroo HAYASHI            memset (&regex, 0, sizeof regex);
190*820c1a8dSHiroo HAYASHI            s = re_compile_pattern ("[an\371]*n", 7, &regex);
191*820c1a8dSHiroo HAYASHI            if (s)
192*820c1a8dSHiroo HAYASHI              result |= 8;
193*820c1a8dSHiroo HAYASHI            else
194*820c1a8dSHiroo HAYASHI              {
195*820c1a8dSHiroo HAYASHI                /* This should match, but does not for glibc-2.2.1.  */
196*820c1a8dSHiroo HAYASHI                if (re_match (&regex, "an", 2, 0, &regs) != 2)
197*820c1a8dSHiroo HAYASHI                  result |= 8;
198*820c1a8dSHiroo HAYASHI                else
199*820c1a8dSHiroo HAYASHI                  {
200*820c1a8dSHiroo HAYASHI                    free (regs.start);
201*820c1a8dSHiroo HAYASHI                    free (regs.end);
202*820c1a8dSHiroo HAYASHI                  }
203*820c1a8dSHiroo HAYASHI                regfree (&regex);
204*820c1a8dSHiroo HAYASHI              }
205*820c1a8dSHiroo HAYASHI
206*820c1a8dSHiroo HAYASHI            memset (&regex, 0, sizeof regex);
207*820c1a8dSHiroo HAYASHI            s = re_compile_pattern ("x", 1, &regex);
208*820c1a8dSHiroo HAYASHI            if (s)
209*820c1a8dSHiroo HAYASHI              result |= 8;
210*820c1a8dSHiroo HAYASHI            else
211*820c1a8dSHiroo HAYASHI              {
212*820c1a8dSHiroo HAYASHI                /* glibc-2.2.93 does not work with a negative RANGE argument.  */
213*820c1a8dSHiroo HAYASHI                if (re_search (&regex, "wxy", 3, 2, -2, &regs) != 1)
214*820c1a8dSHiroo HAYASHI                  result |= 8;
215*820c1a8dSHiroo HAYASHI                else
216*820c1a8dSHiroo HAYASHI                  {
217*820c1a8dSHiroo HAYASHI                    free (regs.start);
218*820c1a8dSHiroo HAYASHI                    free (regs.end);
219*820c1a8dSHiroo HAYASHI                  }
220*820c1a8dSHiroo HAYASHI                regfree (&regex);
221*820c1a8dSHiroo HAYASHI              }
222*820c1a8dSHiroo HAYASHI
223*820c1a8dSHiroo HAYASHI            /* The version of regex.c in older versions of gnulib
224*820c1a8dSHiroo HAYASHI               ignored RE_ICASE.  Detect that problem too.  */
225*820c1a8dSHiroo HAYASHI            re_set_syntax (RE_SYNTAX_EMACS | RE_ICASE);
226*820c1a8dSHiroo HAYASHI            memset (&regex, 0, sizeof regex);
227*820c1a8dSHiroo HAYASHI            s = re_compile_pattern ("x", 1, &regex);
228*820c1a8dSHiroo HAYASHI            if (s)
229*820c1a8dSHiroo HAYASHI              result |= 16;
230*820c1a8dSHiroo HAYASHI            else
231*820c1a8dSHiroo HAYASHI              {
232*820c1a8dSHiroo HAYASHI                if (re_search (&regex, "WXY", 3, 0, 3, &regs) < 0)
233*820c1a8dSHiroo HAYASHI                  result |= 16;
234*820c1a8dSHiroo HAYASHI                else
235*820c1a8dSHiroo HAYASHI                  {
236*820c1a8dSHiroo HAYASHI                    free (regs.start);
237*820c1a8dSHiroo HAYASHI                    free (regs.end);
238*820c1a8dSHiroo HAYASHI                  }
239*820c1a8dSHiroo HAYASHI                regfree (&regex);
240*820c1a8dSHiroo HAYASHI              }
241*820c1a8dSHiroo HAYASHI
242*820c1a8dSHiroo HAYASHI            /* Catch a bug reported by Vin Shelton in
243*820c1a8dSHiroo HAYASHI               https://lists.gnu.org/r/bug-coreutils/2007-06/msg00089.html
244*820c1a8dSHiroo HAYASHI               */
245*820c1a8dSHiroo HAYASHI            re_set_syntax (RE_SYNTAX_POSIX_BASIC
246*820c1a8dSHiroo HAYASHI                           & ~RE_CONTEXT_INVALID_DUP
247*820c1a8dSHiroo HAYASHI                           & ~RE_NO_EMPTY_RANGES);
248*820c1a8dSHiroo HAYASHI            memset (&regex, 0, sizeof regex);
249*820c1a8dSHiroo HAYASHI            s = re_compile_pattern ("[[:alnum:]_-]\\\\+\$", 16, &regex);
250*820c1a8dSHiroo HAYASHI            if (s)
251*820c1a8dSHiroo HAYASHI              result |= 32;
252*820c1a8dSHiroo HAYASHI            else
253*820c1a8dSHiroo HAYASHI              regfree (&regex);
254*820c1a8dSHiroo HAYASHI
255*820c1a8dSHiroo HAYASHI            /* REG_STARTEND was added to glibc on 2004-01-15.
256*820c1a8dSHiroo HAYASHI               Reject older versions.  */
257*820c1a8dSHiroo HAYASHI            if (! REG_STARTEND)
258*820c1a8dSHiroo HAYASHI              result |= 64;
259*820c1a8dSHiroo HAYASHI
260*820c1a8dSHiroo HAYASHI            /* Matching with the compiled form of this regexp would provoke
261*820c1a8dSHiroo HAYASHI               an assertion failure prior to glibc-2.28:
262*820c1a8dSHiroo HAYASHI                 regexec.c:1375: pop_fail_stack: Assertion 'num >= 0' failed
263*820c1a8dSHiroo HAYASHI               With glibc-2.28, compilation fails and reports the invalid
264*820c1a8dSHiroo HAYASHI               back reference.  */
265*820c1a8dSHiroo HAYASHI            re_set_syntax (RE_SYNTAX_POSIX_EGREP);
266*820c1a8dSHiroo HAYASHI            memset (&regex, 0, sizeof regex);
267*820c1a8dSHiroo HAYASHI            s = re_compile_pattern ("0|()0|\\\\1|0", 10, &regex);
268*820c1a8dSHiroo HAYASHI            if (!s)
269*820c1a8dSHiroo HAYASHI              {
270*820c1a8dSHiroo HAYASHI                memset (&regs, 0, sizeof regs);
271*820c1a8dSHiroo HAYASHI                i = re_search (&regex, "x", 1, 0, 1, &regs);
272*820c1a8dSHiroo HAYASHI                if (i != -1)
273*820c1a8dSHiroo HAYASHI                  result |= 64;
274*820c1a8dSHiroo HAYASHI                if (0 <= i)
275*820c1a8dSHiroo HAYASHI                  {
276*820c1a8dSHiroo HAYASHI                    free (regs.start);
277*820c1a8dSHiroo HAYASHI                    free (regs.end);
278*820c1a8dSHiroo HAYASHI                  }
279*820c1a8dSHiroo HAYASHI                regfree (&regex);
280*820c1a8dSHiroo HAYASHI              }
281*820c1a8dSHiroo HAYASHI            else
282*820c1a8dSHiroo HAYASHI              {
283*820c1a8dSHiroo HAYASHI                if (strcmp (s, "Invalid back reference"))
284*820c1a8dSHiroo HAYASHI                  result |= 64;
285*820c1a8dSHiroo HAYASHI              }
286*820c1a8dSHiroo HAYASHI
287*820c1a8dSHiroo HAYASHI            /* glibc bug 11053.  */
288*820c1a8dSHiroo HAYASHI            re_set_syntax (RE_SYNTAX_POSIX_BASIC);
289*820c1a8dSHiroo HAYASHI            memset (&regex, 0, sizeof regex);
290*820c1a8dSHiroo HAYASHI            static char const pat_sub2[] = "\\\\(a*\\\\)*a*\\\\1";
291*820c1a8dSHiroo HAYASHI            s = re_compile_pattern (pat_sub2, sizeof pat_sub2 - 1, &regex);
292*820c1a8dSHiroo HAYASHI            if (s)
293*820c1a8dSHiroo HAYASHI              result |= 64;
294*820c1a8dSHiroo HAYASHI            else
295*820c1a8dSHiroo HAYASHI              {
296*820c1a8dSHiroo HAYASHI                memset (&regs, 0, sizeof regs);
297*820c1a8dSHiroo HAYASHI                static char const data[] = "a";
298*820c1a8dSHiroo HAYASHI                int datalen = sizeof data - 1;
299*820c1a8dSHiroo HAYASHI                i = re_search (&regex, data, datalen, 0, datalen, &regs);
300*820c1a8dSHiroo HAYASHI                if (i != 0)
301*820c1a8dSHiroo HAYASHI                  result |= 64;
302*820c1a8dSHiroo HAYASHI                else if (regs.num_regs < 2)
303*820c1a8dSHiroo HAYASHI                  result |= 64;
304*820c1a8dSHiroo HAYASHI                else if (! (regs.start[0] == 0 && regs.end[0] == 1))
305*820c1a8dSHiroo HAYASHI                  result |= 64;
306*820c1a8dSHiroo HAYASHI                else if (! (regs.start[1] == 0 && regs.end[1] == 0))
307*820c1a8dSHiroo HAYASHI                  result |= 64;
308*820c1a8dSHiroo HAYASHI                regfree (&regex);
309*820c1a8dSHiroo HAYASHI                free (regs.start);
310*820c1a8dSHiroo HAYASHI                free (regs.end);
311*820c1a8dSHiroo HAYASHI              }
312*820c1a8dSHiroo HAYASHI
313*820c1a8dSHiroo HAYASHI#if 0
314*820c1a8dSHiroo HAYASHI            /* It would be nice to reject hosts whose regoff_t values are too
315*820c1a8dSHiroo HAYASHI               narrow (including glibc on hosts with 64-bit ptrdiff_t and
316*820c1a8dSHiroo HAYASHI               32-bit int), but we should wait until glibc implements this
317*820c1a8dSHiroo HAYASHI               feature.  Otherwise, support for equivalence classes and
318*820c1a8dSHiroo HAYASHI               multibyte collation symbols would always be broken except
319*820c1a8dSHiroo HAYASHI               when compiling --without-included-regex.   */
320*820c1a8dSHiroo HAYASHI            if (sizeof (regoff_t) < sizeof (ptrdiff_t)
321*820c1a8dSHiroo HAYASHI                || sizeof (regoff_t) < sizeof (ssize_t))
322*820c1a8dSHiroo HAYASHI              result |= 64;
323*820c1a8dSHiroo HAYASHI#endif
324*820c1a8dSHiroo HAYASHI
325*820c1a8dSHiroo HAYASHI            return result;
326*820c1a8dSHiroo HAYASHI          ]])],
327*820c1a8dSHiroo HAYASHI        [gl_cv_func_re_compile_pattern_working=yes],
328*820c1a8dSHiroo HAYASHI        [gl_cv_func_re_compile_pattern_working=no],
329*820c1a8dSHiroo HAYASHI        [case "$host_os" in
330*820c1a8dSHiroo HAYASHI                   # Guess no on native Windows.
331*820c1a8dSHiroo HAYASHI           mingw*) gl_cv_func_re_compile_pattern_working="guessing no" ;;
332*820c1a8dSHiroo HAYASHI                   # Otherwise obey --enable-cross-guesses.
333*820c1a8dSHiroo HAYASHI           *)      gl_cv_func_re_compile_pattern_working="$gl_cross_guess_normal" ;;
334*820c1a8dSHiroo HAYASHI         esac
335*820c1a8dSHiroo HAYASHI        ])
336*820c1a8dSHiroo HAYASHI      ])
337*820c1a8dSHiroo HAYASHI    case "$gl_cv_func_re_compile_pattern_working" in #(
338*820c1a8dSHiroo HAYASHI      *yes) ac_use_included_regex=no;; #(
339*820c1a8dSHiroo HAYASHI      *no) ac_use_included_regex=yes;;
340*820c1a8dSHiroo HAYASHI    esac
341*820c1a8dSHiroo HAYASHI    ;;
342*820c1a8dSHiroo HAYASHI  *) AC_MSG_ERROR([Invalid value for --with-included-regex: $with_included_regex])
343*820c1a8dSHiroo HAYASHI    ;;
344*820c1a8dSHiroo HAYASHI  esac
345*820c1a8dSHiroo HAYASHI
346*820c1a8dSHiroo HAYASHI  if test $ac_use_included_regex = yes; then
347*820c1a8dSHiroo HAYASHI    AC_DEFINE([_REGEX_INCLUDE_LIMITS_H], [1],
348*820c1a8dSHiroo HAYASHI      [Define if you want <regex.h> to include <limits.h>, so that it
349*820c1a8dSHiroo HAYASHI       consistently overrides <limits.h>'s RE_DUP_MAX.])
350*820c1a8dSHiroo HAYASHI    AC_DEFINE([_REGEX_LARGE_OFFSETS], [1],
351*820c1a8dSHiroo HAYASHI      [Define if you want regoff_t to be at least as wide POSIX requires.])
352*820c1a8dSHiroo HAYASHI    AC_DEFINE([re_syntax_options], [rpl_re_syntax_options],
353*820c1a8dSHiroo HAYASHI      [Define to rpl_re_syntax_options if the replacement should be used.])
354*820c1a8dSHiroo HAYASHI    AC_DEFINE([re_set_syntax], [rpl_re_set_syntax],
355*820c1a8dSHiroo HAYASHI      [Define to rpl_re_set_syntax if the replacement should be used.])
356*820c1a8dSHiroo HAYASHI    AC_DEFINE([re_compile_pattern], [rpl_re_compile_pattern],
357*820c1a8dSHiroo HAYASHI      [Define to rpl_re_compile_pattern if the replacement should be used.])
358*820c1a8dSHiroo HAYASHI    AC_DEFINE([re_compile_fastmap], [rpl_re_compile_fastmap],
359*820c1a8dSHiroo HAYASHI      [Define to rpl_re_compile_fastmap if the replacement should be used.])
360*820c1a8dSHiroo HAYASHI    AC_DEFINE([re_search], [rpl_re_search],
361*820c1a8dSHiroo HAYASHI      [Define to rpl_re_search if the replacement should be used.])
362*820c1a8dSHiroo HAYASHI    AC_DEFINE([re_search_2], [rpl_re_search_2],
363*820c1a8dSHiroo HAYASHI      [Define to rpl_re_search_2 if the replacement should be used.])
364*820c1a8dSHiroo HAYASHI    AC_DEFINE([re_match], [rpl_re_match],
365*820c1a8dSHiroo HAYASHI      [Define to rpl_re_match if the replacement should be used.])
366*820c1a8dSHiroo HAYASHI    AC_DEFINE([re_match_2], [rpl_re_match_2],
367*820c1a8dSHiroo HAYASHI      [Define to rpl_re_match_2 if the replacement should be used.])
368*820c1a8dSHiroo HAYASHI    AC_DEFINE([re_set_registers], [rpl_re_set_registers],
369*820c1a8dSHiroo HAYASHI      [Define to rpl_re_set_registers if the replacement should be used.])
370*820c1a8dSHiroo HAYASHI    AC_DEFINE([re_comp], [rpl_re_comp],
371*820c1a8dSHiroo HAYASHI      [Define to rpl_re_comp if the replacement should be used.])
372*820c1a8dSHiroo HAYASHI    AC_DEFINE([re_exec], [rpl_re_exec],
373*820c1a8dSHiroo HAYASHI      [Define to rpl_re_exec if the replacement should be used.])
374*820c1a8dSHiroo HAYASHI    AC_DEFINE([regcomp], [rpl_regcomp],
375*820c1a8dSHiroo HAYASHI      [Define to rpl_regcomp if the replacement should be used.])
376*820c1a8dSHiroo HAYASHI    AC_DEFINE([regexec], [rpl_regexec],
377*820c1a8dSHiroo HAYASHI      [Define to rpl_regexec if the replacement should be used.])
378*820c1a8dSHiroo HAYASHI    AC_DEFINE([regerror], [rpl_regerror],
379*820c1a8dSHiroo HAYASHI      [Define to rpl_regerror if the replacement should be used.])
380*820c1a8dSHiroo HAYASHI    AC_DEFINE([regfree], [rpl_regfree],
381*820c1a8dSHiroo HAYASHI      [Define to rpl_regfree if the replacement should be used.])
382*820c1a8dSHiroo HAYASHI  fi
383*820c1a8dSHiroo HAYASHI])
384*820c1a8dSHiroo HAYASHI
385*820c1a8dSHiroo HAYASHI# Prerequisites of lib/regex.c and lib/regex_internal.c.
386*820c1a8dSHiroo HAYASHIAC_DEFUN([gl_PREREQ_REGEX],
387*820c1a8dSHiroo HAYASHI[
388*820c1a8dSHiroo HAYASHI  AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
389*820c1a8dSHiroo HAYASHI  AC_REQUIRE([AC_C_INLINE])
390*820c1a8dSHiroo HAYASHI  AC_REQUIRE([AC_C_RESTRICT])
391*820c1a8dSHiroo HAYASHI  AC_REQUIRE([AC_TYPE_MBSTATE_T])
392*820c1a8dSHiroo HAYASHI  AC_REQUIRE([gl_EEMALLOC])
393*820c1a8dSHiroo HAYASHI  AC_CHECK_HEADERS([libintl.h])
394*820c1a8dSHiroo HAYASHI  AC_CHECK_FUNCS_ONCE([isblank iswctype])
395*820c1a8dSHiroo HAYASHI  AC_CHECK_DECLS([isblank], [], [], [[#include <ctype.h>]])
396*820c1a8dSHiroo HAYASHI])
397