Include unlocked-io.h.
[gnulib.git] / lib / regex.c
1 /* Extended regular expression matching and search library,
2    version 0.12.
3    (Implements POSIX draft P1003.2/D11.2, except for some of the
4    internationalization features.)
5    Copyright (C) 1993-1999, 2000, 2001 Free Software Foundation, Inc.
6    This file is part of the GNU C Library.
7
8    The GNU C Library is free software; you can redistribute it and/or
9    modify it under the terms of the GNU Lesser General Public
10    License as published by the Free Software Foundation; either
11    version 2.1 of the License, or (at your option) any later version.
12
13    The GNU C Library is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16    Lesser General Public License for more details.
17
18    You should have received a copy of the GNU Lesser General Public
19    License along with the GNU C Library; if not, write to the Free
20    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
21    02111-1307 USA.  */
22
23 /* AIX requires this to be the first thing in the file. */
24 #if defined _AIX && !defined REGEX_MALLOC
25   #pragma alloca
26 #endif
27
28 #undef  _GNU_SOURCE
29 #define _GNU_SOURCE
30
31 #ifdef HAVE_CONFIG_H
32 # include <config.h>
33 #endif
34
35 #ifndef PARAMS
36 # if defined __GNUC__ || (defined __STDC__ && __STDC__)
37 #  define PARAMS(args) args
38 # else
39 #  define PARAMS(args) ()
40 # endif  /* GCC.  */
41 #endif  /* Not PARAMS.  */
42
43 #ifndef INSIDE_RECURSION
44
45 # if defined STDC_HEADERS && !defined emacs
46 #  include <stddef.h>
47 # else
48 /* We need this for `regex.h', and perhaps for the Emacs include files.  */
49 #  include <sys/types.h>
50 # endif
51
52 # define WIDE_CHAR_SUPPORT (HAVE_WCTYPE_H && HAVE_WCHAR_H && HAVE_BTOWC)
53
54 /* For platform which support the ISO C amendement 1 functionality we
55    support user defined character classes.  */
56 # if defined _LIBC || WIDE_CHAR_SUPPORT
57 /* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>.  */
58 #  include <wchar.h>
59 #  include <wctype.h>
60 # endif
61
62 # ifdef _LIBC
63 /* We have to keep the namespace clean.  */
64 #  define regfree(preg) __regfree (preg)
65 #  define regexec(pr, st, nm, pm, ef) __regexec (pr, st, nm, pm, ef)
66 #  define regcomp(preg, pattern, cflags) __regcomp (preg, pattern, cflags)
67 #  define regerror(errcode, preg, errbuf, errbuf_size) \
68         __regerror(errcode, preg, errbuf, errbuf_size)
69 #  define re_set_registers(bu, re, nu, st, en) \
70         __re_set_registers (bu, re, nu, st, en)
71 #  define re_match_2(bufp, string1, size1, string2, size2, pos, regs, stop) \
72         __re_match_2 (bufp, string1, size1, string2, size2, pos, regs, stop)
73 #  define re_match(bufp, string, size, pos, regs) \
74         __re_match (bufp, string, size, pos, regs)
75 #  define re_search(bufp, string, size, startpos, range, regs) \
76         __re_search (bufp, string, size, startpos, range, regs)
77 #  define re_compile_pattern(pattern, length, bufp) \
78         __re_compile_pattern (pattern, length, bufp)
79 #  define re_set_syntax(syntax) __re_set_syntax (syntax)
80 #  define re_search_2(bufp, st1, s1, st2, s2, startpos, range, regs, stop) \
81         __re_search_2 (bufp, st1, s1, st2, s2, startpos, range, regs, stop)
82 #  define re_compile_fastmap(bufp) __re_compile_fastmap (bufp)
83
84 #  define btowc __btowc
85
86 /* We are also using some library internals.  */
87 #  include <locale/localeinfo.h>
88 #  include <locale/elem-hash.h>
89 #  include <langinfo.h>
90 #  include <locale/coll-lookup.h>
91 # endif
92
93 /* This is for other GNU distributions with internationalized messages.  */
94 # if (HAVE_LIBINTL_H && ENABLE_NLS) || defined _LIBC
95 #  include <libintl.h>
96 #  ifdef _LIBC
97 #   undef gettext
98 #   define gettext(msgid) __dcgettext ("libc", msgid, LC_MESSAGES)
99 #  endif
100 # else
101 #  define gettext(msgid) (msgid)
102 # endif
103
104 # ifndef gettext_noop
105 /* This define is so xgettext can find the internationalizable
106    strings.  */
107 #  define gettext_noop(String) String
108 # endif
109
110 /* The `emacs' switch turns on certain matching commands
111    that make sense only in Emacs. */
112 # ifdef emacs
113
114 #  include "lisp.h"
115 #  include "buffer.h"
116 #  include "syntax.h"
117
118 # else  /* not emacs */
119
120 /* If we are not linking with Emacs proper,
121    we can't use the relocating allocator
122    even if config.h says that we can.  */
123 #  undef REL_ALLOC
124
125 #  if defined STDC_HEADERS || defined _LIBC
126 #   include <stdlib.h>
127 #  else
128 char *malloc ();
129 char *realloc ();
130 #  endif
131
132 /* When used in Emacs's lib-src, we need to get bzero and bcopy somehow.
133    If nothing else has been done, use the method below.  */
134 #  ifdef INHIBIT_STRING_HEADER
135 #   if !(defined HAVE_BZERO && defined HAVE_BCOPY)
136 #    if !defined bzero && !defined bcopy
137 #     undef INHIBIT_STRING_HEADER
138 #    endif
139 #   endif
140 #  endif
141
142 /* This is the normal way of making sure we have a bcopy and a bzero.
143    This is used in most programs--a few other programs avoid this
144    by defining INHIBIT_STRING_HEADER.  */
145 #  ifndef INHIBIT_STRING_HEADER
146 #   if defined HAVE_STRING_H || defined STDC_HEADERS || defined _LIBC
147 #    include <string.h>
148 #    ifndef bzero
149 #     ifndef _LIBC
150 #      define bzero(s, n)       (memset (s, '\0', n), (s))
151 #     else
152 #      define bzero(s, n)       __bzero (s, n)
153 #     endif
154 #    endif
155 #   else
156 #    include <strings.h>
157 #    ifndef memcmp
158 #     define memcmp(s1, s2, n)  bcmp (s1, s2, n)
159 #    endif
160 #    ifndef memcpy
161 #     define memcpy(d, s, n)    (bcopy (s, d, n), (d))
162 #    endif
163 #   endif
164 #  endif
165
166 /* Define the syntax stuff for \<, \>, etc.  */
167
168 /* This must be nonzero for the wordchar and notwordchar pattern
169    commands in re_match_2.  */
170 #  ifndef Sword
171 #   define Sword 1
172 #  endif
173
174 #  ifdef SWITCH_ENUM_BUG
175 #   define SWITCH_ENUM_CAST(x) ((int)(x))
176 #  else
177 #   define SWITCH_ENUM_CAST(x) (x)
178 #  endif
179
180 # endif /* not emacs */
181
182 # if defined _LIBC || HAVE_LIMITS_H
183 #  include <limits.h>
184 # endif
185
186 # ifndef MB_LEN_MAX
187 #  define MB_LEN_MAX 1
188 # endif
189 \f
190 /* Get the interface, including the syntax bits.  */
191 # include <regex.h>
192
193 /* isalpha etc. are used for the character classes.  */
194 # include <ctype.h>
195
196 /* Jim Meyering writes:
197
198    "... Some ctype macros are valid only for character codes that
199    isascii says are ASCII (SGI's IRIX-4.0.5 is one such system --when
200    using /bin/cc or gcc but without giving an ansi option).  So, all
201    ctype uses should be through macros like ISPRINT...  If
202    STDC_HEADERS is defined, then autoconf has verified that the ctype
203    macros don't need to be guarded with references to isascii. ...
204    Defining isascii to 1 should let any compiler worth its salt
205    eliminate the && through constant folding."
206    Solaris defines some of these symbols so we must undefine them first.  */
207
208 # if defined STDC_HEADERS || (!defined isascii && !defined HAVE_ISASCII)
209 #  define IN_CTYPE_DOMAIN(c) 1
210 # else
211 #  define IN_CTYPE_DOMAIN(c) isascii(c)
212 # endif
213
214 # ifdef isblank
215 #  define ISBLANK(c) (IN_CTYPE_DOMAIN (c) && isblank (c))
216 # else
217 #  define ISBLANK(c) ((c) == ' ' || (c) == '\t')
218 # endif
219 # ifdef isgraph
220 #  define ISGRAPH(c) (IN_CTYPE_DOMAIN (c) && isgraph (c))
221 # else
222 #  define ISGRAPH(c) (IN_CTYPE_DOMAIN (c) && isprint (c) && !isspace (c))
223 # endif
224
225 # undef ISPRINT
226 # define ISPRINT(c) (IN_CTYPE_DOMAIN (c) && isprint (c))
227 # define ISDIGIT(c) (IN_CTYPE_DOMAIN (c) && isdigit (c))
228 # define ISALNUM(c) (IN_CTYPE_DOMAIN (c) && isalnum (c))
229 # define ISALPHA(c) (IN_CTYPE_DOMAIN (c) && isalpha (c))
230 # define ISCNTRL(c) (IN_CTYPE_DOMAIN (c) && iscntrl (c))
231 # define ISLOWER(c) (IN_CTYPE_DOMAIN (c) && islower (c))
232 # define ISPUNCT(c) (IN_CTYPE_DOMAIN (c) && ispunct (c))
233 # define ISSPACE(c) (IN_CTYPE_DOMAIN (c) && isspace (c))
234 # define ISUPPER(c) (IN_CTYPE_DOMAIN (c) && isupper (c))
235 # define ISXDIGIT(c) (IN_CTYPE_DOMAIN (c) && isxdigit (c))
236
237 # ifdef _tolower
238 #  define TOLOWER(c) _tolower(c)
239 # else
240 #  define TOLOWER(c) tolower(c)
241 # endif
242
243 # ifndef NULL
244 #  define NULL (void *)0
245 # endif
246
247 /* We remove any previous definition of `SIGN_EXTEND_CHAR',
248    since ours (we hope) works properly with all combinations of
249    machines, compilers, `char' and `unsigned char' argument types.
250    (Per Bothner suggested the basic approach.)  */
251 # undef SIGN_EXTEND_CHAR
252 # if __STDC__
253 #  define SIGN_EXTEND_CHAR(c) ((signed char) (c))
254 # else  /* not __STDC__ */
255 /* As in Harbison and Steele.  */
256 #  define SIGN_EXTEND_CHAR(c) ((((unsigned char) (c)) ^ 128) - 128)
257 # endif
258 \f
259 # ifndef emacs
260 /* How many characters in the character set.  */
261 #  define CHAR_SET_SIZE 256
262
263 #  ifdef SYNTAX_TABLE
264
265 extern char *re_syntax_table;
266
267 #  else /* not SYNTAX_TABLE */
268
269 static char re_syntax_table[CHAR_SET_SIZE];
270
271 static void init_syntax_once PARAMS ((void));
272
273 static void
274 init_syntax_once ()
275 {
276    register int c;
277    static int done = 0;
278
279    if (done)
280      return;
281    bzero (re_syntax_table, sizeof re_syntax_table);
282
283    for (c = 0; c < CHAR_SET_SIZE; ++c)
284      if (ISALNUM (c))
285         re_syntax_table[c] = Sword;
286
287    re_syntax_table['_'] = Sword;
288
289    done = 1;
290 }
291
292 #  endif /* not SYNTAX_TABLE */
293
294 #  define SYNTAX(c) re_syntax_table[(unsigned char) (c)]
295
296 # endif /* emacs */
297 \f
298 /* Should we use malloc or alloca?  If REGEX_MALLOC is not defined, we
299    use `alloca' instead of `malloc'.  This is because using malloc in
300    re_search* or re_match* could cause memory leaks when C-g is used in
301    Emacs; also, malloc is slower and causes storage fragmentation.  On
302    the other hand, malloc is more portable, and easier to debug.
303
304    Because we sometimes use alloca, some routines have to be macros,
305    not functions -- `alloca'-allocated space disappears at the end of the
306    function it is called in.  */
307
308 # ifdef REGEX_MALLOC
309
310 #  define REGEX_ALLOCATE malloc
311 #  define REGEX_REALLOCATE(source, osize, nsize) realloc (source, nsize)
312 #  define REGEX_FREE free
313
314 # else /* not REGEX_MALLOC  */
315
316 /* Emacs already defines alloca, sometimes.  */
317 #  ifndef alloca
318
319 /* Make alloca work the best possible way.  */
320 #   ifdef __GNUC__
321 #    define alloca __builtin_alloca
322 #   else /* not __GNUC__ */
323 #    if HAVE_ALLOCA_H
324 #     include <alloca.h>
325 #    endif /* HAVE_ALLOCA_H */
326 #   endif /* not __GNUC__ */
327
328 #  endif /* not alloca */
329
330 #  define REGEX_ALLOCATE alloca
331
332 /* Assumes a `char *destination' variable.  */
333 #  define REGEX_REALLOCATE(source, osize, nsize)                        \
334   (destination = (char *) alloca (nsize),                               \
335    memcpy (destination, source, osize))
336
337 /* No need to do anything to free, after alloca.  */
338 #  define REGEX_FREE(arg) ((void)0) /* Do nothing!  But inhibit gcc warning.  */
339
340 # endif /* not REGEX_MALLOC */
341
342 /* Define how to allocate the failure stack.  */
343
344 # if defined REL_ALLOC && defined REGEX_MALLOC
345
346 #  define REGEX_ALLOCATE_STACK(size)                            \
347   r_alloc (&failure_stack_ptr, (size))
348 #  define REGEX_REALLOCATE_STACK(source, osize, nsize)          \
349   r_re_alloc (&failure_stack_ptr, (nsize))
350 #  define REGEX_FREE_STACK(ptr)                                 \
351   r_alloc_free (&failure_stack_ptr)
352
353 # else /* not using relocating allocator */
354
355 #  ifdef REGEX_MALLOC
356
357 #   define REGEX_ALLOCATE_STACK malloc
358 #   define REGEX_REALLOCATE_STACK(source, osize, nsize) realloc (source, nsize)
359 #   define REGEX_FREE_STACK free
360
361 #  else /* not REGEX_MALLOC */
362
363 #   define REGEX_ALLOCATE_STACK alloca
364
365 #   define REGEX_REALLOCATE_STACK(source, osize, nsize)                 \
366    REGEX_REALLOCATE (source, osize, nsize)
367 /* No need to explicitly free anything.  */
368 #   define REGEX_FREE_STACK(arg)
369
370 #  endif /* not REGEX_MALLOC */
371 # endif /* not using relocating allocator */
372
373
374 /* True if `size1' is non-NULL and PTR is pointing anywhere inside
375    `string1' or just past its end.  This works if PTR is NULL, which is
376    a good thing.  */
377 # define FIRST_STRING_P(ptr)                                    \
378   (size1 && string1 <= (ptr) && (ptr) <= string1 + size1)
379
380 /* (Re)Allocate N items of type T using malloc, or fail.  */
381 # define TALLOC(n, t) ((t *) malloc ((n) * sizeof (t)))
382 # define RETALLOC(addr, n, t) ((addr) = (t *) realloc (addr, (n) * sizeof (t)))
383 # define RETALLOC_IF(addr, n, t) \
384   if (addr) RETALLOC((addr), (n), t); else (addr) = TALLOC ((n), t)
385 # define REGEX_TALLOC(n, t) ((t *) REGEX_ALLOCATE ((n) * sizeof (t)))
386
387 # define BYTEWIDTH 8 /* In bits.  */
388
389 # define STREQ(s1, s2) ((strcmp (s1, s2) == 0))
390
391 # undef MAX
392 # undef MIN
393 # define MAX(a, b) ((a) > (b) ? (a) : (b))
394 # define MIN(a, b) ((a) < (b) ? (a) : (b))
395
396 typedef char boolean;
397 # define false 0
398 # define true 1
399
400 static reg_errcode_t byte_regex_compile _RE_ARGS ((const char *pattern, size_t size,
401                                                    reg_syntax_t syntax,
402                                                    struct re_pattern_buffer *bufp));
403
404 static int byte_re_match_2_internal PARAMS ((struct re_pattern_buffer *bufp,
405                                              const char *string1, int size1,
406                                              const char *string2, int size2,
407                                              int pos,
408                                              struct re_registers *regs,
409                                              int stop));
410 static int byte_re_search_2 PARAMS ((struct re_pattern_buffer *bufp,
411                                      const char *string1, int size1,
412                                      const char *string2, int size2,
413                                      int startpos, int range,
414                                      struct re_registers *regs, int stop));
415 static int byte_re_compile_fastmap PARAMS ((struct re_pattern_buffer *bufp));
416
417 #ifdef MBS_SUPPORT
418 static reg_errcode_t wcs_regex_compile _RE_ARGS ((const char *pattern, size_t size,
419                                                    reg_syntax_t syntax,
420                                                    struct re_pattern_buffer *bufp));
421
422
423 static int wcs_re_match_2_internal PARAMS ((struct re_pattern_buffer *bufp,
424                                             const char *cstring1, int csize1,
425                                             const char *cstring2, int csize2,
426                                             int pos,
427                                             struct re_registers *regs,
428                                             int stop,
429                                             wchar_t *string1, int size1,
430                                             wchar_t *string2, int size2,
431                                             int *mbs_offset1, int *mbs_offset2));
432 static int wcs_re_search_2 PARAMS ((struct re_pattern_buffer *bufp,
433                                     const char *string1, int size1,
434                                     const char *string2, int size2,
435                                     int startpos, int range,
436                                     struct re_registers *regs, int stop));
437 static int wcs_re_compile_fastmap PARAMS ((struct re_pattern_buffer *bufp));
438 #endif
439 \f
440 /* These are the command codes that appear in compiled regular
441    expressions.  Some opcodes are followed by argument bytes.  A
442    command code can specify any interpretation whatsoever for its
443    arguments.  Zero bytes may appear in the compiled regular expression.  */
444
445 typedef enum
446 {
447   no_op = 0,
448
449   /* Succeed right away--no more backtracking.  */
450   succeed,
451
452         /* Followed by one byte giving n, then by n literal bytes.  */
453   exactn,
454
455 # ifdef MBS_SUPPORT
456         /* Same as exactn, but contains binary data.  */
457   exactn_bin,
458 # endif
459
460         /* Matches any (more or less) character.  */
461   anychar,
462
463         /* Matches any one char belonging to specified set.  First
464            following byte is number of bitmap bytes.  Then come bytes
465            for a bitmap saying which chars are in.  Bits in each byte
466            are ordered low-bit-first.  A character is in the set if its
467            bit is 1.  A character too large to have a bit in the map is
468            automatically not in the set.  */
469         /* ifdef MBS_SUPPORT, following element is length of character
470            classes, length of collating symbols, length of equivalence
471            classes, length of character ranges, and length of characters.
472            Next, character class element, collating symbols elements,
473            equivalence class elements, range elements, and character
474            elements follow.
475            See regex_compile function.  */
476   charset,
477
478         /* Same parameters as charset, but match any character that is
479            not one of those specified.  */
480   charset_not,
481
482         /* Start remembering the text that is matched, for storing in a
483            register.  Followed by one byte with the register number, in
484            the range 0 to one less than the pattern buffer's re_nsub
485            field.  Then followed by one byte with the number of groups
486            inner to this one.  (This last has to be part of the
487            start_memory only because we need it in the on_failure_jump
488            of re_match_2.)  */
489   start_memory,
490
491         /* Stop remembering the text that is matched and store it in a
492            memory register.  Followed by one byte with the register
493            number, in the range 0 to one less than `re_nsub' in the
494            pattern buffer, and one byte with the number of inner groups,
495            just like `start_memory'.  (We need the number of inner
496            groups here because we don't have any easy way of finding the
497            corresponding start_memory when we're at a stop_memory.)  */
498   stop_memory,
499
500         /* Match a duplicate of something remembered. Followed by one
501            byte containing the register number.  */
502   duplicate,
503
504         /* Fail unless at beginning of line.  */
505   begline,
506
507         /* Fail unless at end of line.  */
508   endline,
509
510         /* Succeeds if at beginning of buffer (if emacs) or at beginning
511            of string to be matched (if not).  */
512   begbuf,
513
514         /* Analogously, for end of buffer/string.  */
515   endbuf,
516
517         /* Followed by two byte relative address to which to jump.  */
518   jump,
519
520         /* Same as jump, but marks the end of an alternative.  */
521   jump_past_alt,
522
523         /* Followed by two-byte relative address of place to resume at
524            in case of failure.  */
525         /* ifdef MBS_SUPPORT, the size of address is 1.  */
526   on_failure_jump,
527
528         /* Like on_failure_jump, but pushes a placeholder instead of the
529            current string position when executed.  */
530   on_failure_keep_string_jump,
531
532         /* Throw away latest failure point and then jump to following
533            two-byte relative address.  */
534         /* ifdef MBS_SUPPORT, the size of address is 1.  */
535   pop_failure_jump,
536
537         /* Change to pop_failure_jump if know won't have to backtrack to
538            match; otherwise change to jump.  This is used to jump
539            back to the beginning of a repeat.  If what follows this jump
540            clearly won't match what the repeat does, such that we can be
541            sure that there is no use backtracking out of repetitions
542            already matched, then we change it to a pop_failure_jump.
543            Followed by two-byte address.  */
544         /* ifdef MBS_SUPPORT, the size of address is 1.  */
545   maybe_pop_jump,
546
547         /* Jump to following two-byte address, and push a dummy failure
548            point. This failure point will be thrown away if an attempt
549            is made to use it for a failure.  A `+' construct makes this
550            before the first repeat.  Also used as an intermediary kind
551            of jump when compiling an alternative.  */
552         /* ifdef MBS_SUPPORT, the size of address is 1.  */
553   dummy_failure_jump,
554
555         /* Push a dummy failure point and continue.  Used at the end of
556            alternatives.  */
557   push_dummy_failure,
558
559         /* Followed by two-byte relative address and two-byte number n.
560            After matching N times, jump to the address upon failure.  */
561         /* ifdef MBS_SUPPORT, the size of address is 1.  */
562   succeed_n,
563
564         /* Followed by two-byte relative address, and two-byte number n.
565            Jump to the address N times, then fail.  */
566         /* ifdef MBS_SUPPORT, the size of address is 1.  */
567   jump_n,
568
569         /* Set the following two-byte relative address to the
570            subsequent two-byte number.  The address *includes* the two
571            bytes of number.  */
572         /* ifdef MBS_SUPPORT, the size of address is 1.  */
573   set_number_at,
574
575   wordchar,     /* Matches any word-constituent character.  */
576   notwordchar,  /* Matches any char that is not a word-constituent.  */
577
578   wordbeg,      /* Succeeds if at word beginning.  */
579   wordend,      /* Succeeds if at word end.  */
580
581   wordbound,    /* Succeeds if at a word boundary.  */
582   notwordbound  /* Succeeds if not at a word boundary.  */
583
584 # ifdef emacs
585   ,before_dot,  /* Succeeds if before point.  */
586   at_dot,       /* Succeeds if at point.  */
587   after_dot,    /* Succeeds if after point.  */
588
589         /* Matches any character whose syntax is specified.  Followed by
590            a byte which contains a syntax code, e.g., Sword.  */
591   syntaxspec,
592
593         /* Matches any character whose syntax is not that specified.  */
594   notsyntaxspec
595 # endif /* emacs */
596 } re_opcode_t;
597 #endif /* not INSIDE_RECURSION */
598 \f
599
600 #ifdef BYTE
601 # define CHAR_T char
602 # define UCHAR_T unsigned char
603 # define COMPILED_BUFFER_VAR bufp->buffer
604 # define OFFSET_ADDRESS_SIZE 2
605 # define PREFIX(name) byte_##name
606 # define ARG_PREFIX(name) name
607 # define PUT_CHAR(c) putchar (c)
608 #else
609 # ifdef WCHAR
610 #  define CHAR_T wchar_t
611 #  define UCHAR_T wchar_t
612 #  define COMPILED_BUFFER_VAR wc_buffer
613 #  define OFFSET_ADDRESS_SIZE 1 /* the size which STORE_NUMBER macro use */
614 #  define CHAR_CLASS_SIZE ((__alignof__(wctype_t)+sizeof(wctype_t))/sizeof(CHAR_T)+1)
615 #  define PREFIX(name) wcs_##name
616 #  define ARG_PREFIX(name) c##name
617 /* Should we use wide stream??  */
618 #  define PUT_CHAR(c) printf ("%C", c);
619 #  define TRUE 1
620 #  define FALSE 0
621 # else
622 #  ifdef MBS_SUPPORT
623 #   define WCHAR
624 #   define INSIDE_RECURSION
625 #   include "regex.c"
626 #   undef INSIDE_RECURSION
627 #  endif
628 #  define BYTE
629 #  define INSIDE_RECURSION
630 #  include "regex.c"
631 #  undef INSIDE_RECURSION
632 # endif
633 #endif
634 #include "unlocked-io.h"
635
636 #ifdef INSIDE_RECURSION
637 /* Common operations on the compiled pattern.  */
638
639 /* Store NUMBER in two contiguous bytes starting at DESTINATION.  */
640 /* ifdef MBS_SUPPORT, we store NUMBER in 1 element.  */
641
642 # ifdef WCHAR
643 #  define STORE_NUMBER(destination, number)                             \
644   do {                                                                  \
645     *(destination) = (UCHAR_T)(number);                         \
646   } while (0)
647 # else /* BYTE */
648 #  define STORE_NUMBER(destination, number)                             \
649   do {                                                                  \
650     (destination)[0] = (number) & 0377;                                 \
651     (destination)[1] = (number) >> 8;                                   \
652   } while (0)
653 # endif /* WCHAR */
654
655 /* Same as STORE_NUMBER, except increment DESTINATION to
656    the byte after where the number is stored.  Therefore, DESTINATION
657    must be an lvalue.  */
658 /* ifdef MBS_SUPPORT, we store NUMBER in 1 element.  */
659
660 # define STORE_NUMBER_AND_INCR(destination, number)                     \
661   do {                                                                  \
662     STORE_NUMBER (destination, number);                                 \
663     (destination) += OFFSET_ADDRESS_SIZE;                               \
664   } while (0)
665
666 /* Put into DESTINATION a number stored in two contiguous bytes starting
667    at SOURCE.  */
668 /* ifdef MBS_SUPPORT, we store NUMBER in 1 element.  */
669
670 # ifdef WCHAR
671 #  define EXTRACT_NUMBER(destination, source)                           \
672   do {                                                                  \
673     (destination) = *(source);                                          \
674   } while (0)
675 # else /* BYTE */
676 #  define EXTRACT_NUMBER(destination, source)                           \
677   do {                                                                  \
678     (destination) = *(source) & 0377;                                   \
679     (destination) += SIGN_EXTEND_CHAR (*((source) + 1)) << 8;           \
680   } while (0)
681 # endif
682
683 # ifdef DEBUG
684 static void PREFIX(extract_number) _RE_ARGS ((int *dest, UCHAR_T *source));
685 static void
686 PREFIX(extract_number) (dest, source)
687     int *dest;
688     UCHAR_T *source;
689 {
690 #  ifdef WCHAR
691   *dest = *source;
692 #  else /* BYTE */
693   int temp = SIGN_EXTEND_CHAR (*(source + 1));
694   *dest = *source & 0377;
695   *dest += temp << 8;
696 #  endif
697 }
698
699 #  ifndef EXTRACT_MACROS /* To debug the macros.  */
700 #   undef EXTRACT_NUMBER
701 #   define EXTRACT_NUMBER(dest, src) PREFIX(extract_number) (&dest, src)
702 #  endif /* not EXTRACT_MACROS */
703
704 # endif /* DEBUG */
705
706 /* Same as EXTRACT_NUMBER, except increment SOURCE to after the number.
707    SOURCE must be an lvalue.  */
708
709 # define EXTRACT_NUMBER_AND_INCR(destination, source)                   \
710   do {                                                                  \
711     EXTRACT_NUMBER (destination, source);                               \
712     (source) += OFFSET_ADDRESS_SIZE;                                    \
713   } while (0)
714
715 # ifdef DEBUG
716 static void PREFIX(extract_number_and_incr) _RE_ARGS ((int *destination,
717                                                        UCHAR_T **source));
718 static void
719 PREFIX(extract_number_and_incr) (destination, source)
720     int *destination;
721     UCHAR_T **source;
722 {
723   PREFIX(extract_number) (destination, *source);
724   *source += OFFSET_ADDRESS_SIZE;
725 }
726
727 #  ifndef EXTRACT_MACROS
728 #   undef EXTRACT_NUMBER_AND_INCR
729 #   define EXTRACT_NUMBER_AND_INCR(dest, src) \
730   PREFIX(extract_number_and_incr) (&dest, &src)
731 #  endif /* not EXTRACT_MACROS */
732
733 # endif /* DEBUG */
734
735 \f
736
737 /* If DEBUG is defined, Regex prints many voluminous messages about what
738    it is doing (if the variable `debug' is nonzero).  If linked with the
739    main program in `iregex.c', you can enter patterns and strings
740    interactively.  And if linked with the main program in `main.c' and
741    the other test files, you can run the already-written tests.  */
742
743 # ifdef DEBUG
744
745 #  ifndef DEFINED_ONCE
746
747 /* We use standard I/O for debugging.  */
748 #   include <stdio.h>
749
750 /* It is useful to test things that ``must'' be true when debugging.  */
751 #   include <assert.h>
752
753 static int debug;
754
755 #   define DEBUG_STATEMENT(e) e
756 #   define DEBUG_PRINT1(x) if (debug) printf (x)
757 #   define DEBUG_PRINT2(x1, x2) if (debug) printf (x1, x2)
758 #   define DEBUG_PRINT3(x1, x2, x3) if (debug) printf (x1, x2, x3)
759 #   define DEBUG_PRINT4(x1, x2, x3, x4) if (debug) printf (x1, x2, x3, x4)
760 #  endif /* not DEFINED_ONCE */
761
762 #  define DEBUG_PRINT_COMPILED_PATTERN(p, s, e)                         \
763   if (debug) PREFIX(print_partial_compiled_pattern) (s, e)
764 #  define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2)                \
765   if (debug) PREFIX(print_double_string) (w, s1, sz1, s2, sz2)
766
767
768 /* Print the fastmap in human-readable form.  */
769
770 #  ifndef DEFINED_ONCE
771 void
772 print_fastmap (fastmap)
773     char *fastmap;
774 {
775   unsigned was_a_range = 0;
776   unsigned i = 0;
777
778   while (i < (1 << BYTEWIDTH))
779     {
780       if (fastmap[i++])
781         {
782           was_a_range = 0;
783           putchar (i - 1);
784           while (i < (1 << BYTEWIDTH)  &&  fastmap[i])
785             {
786               was_a_range = 1;
787               i++;
788             }
789           if (was_a_range)
790             {
791               printf ("-");
792               putchar (i - 1);
793             }
794         }
795     }
796   putchar ('\n');
797 }
798 #  endif /* not DEFINED_ONCE */
799
800
801 /* Print a compiled pattern string in human-readable form, starting at
802    the START pointer into it and ending just before the pointer END.  */
803
804 void
805 PREFIX(print_partial_compiled_pattern) (start, end)
806     UCHAR_T *start;
807     UCHAR_T *end;
808 {
809   int mcnt, mcnt2;
810   UCHAR_T *p1;
811   UCHAR_T *p = start;
812   UCHAR_T *pend = end;
813
814   if (start == NULL)
815     {
816       printf ("(null)\n");
817       return;
818     }
819
820   /* Loop over pattern commands.  */
821   while (p < pend)
822     {
823 #  ifdef _LIBC
824       printf ("%td:\t", p - start);
825 #  else
826       printf ("%ld:\t", (long int) (p - start));
827 #  endif
828
829       switch ((re_opcode_t) *p++)
830         {
831         case no_op:
832           printf ("/no_op");
833           break;
834
835         case exactn:
836           mcnt = *p++;
837           printf ("/exactn/%d", mcnt);
838           do
839             {
840               putchar ('/');
841               PUT_CHAR (*p++);
842             }
843           while (--mcnt);
844           break;
845
846 #  ifdef MBS_SUPPORT
847         case exactn_bin:
848           mcnt = *p++;
849           printf ("/exactn_bin/%d", mcnt);
850           do
851             {
852               printf("/%lx", (long int) *p++);
853             }
854           while (--mcnt);
855           break;
856 #  endif /* MBS_SUPPORT */
857
858         case start_memory:
859           mcnt = *p++;
860           printf ("/start_memory/%d/%ld", mcnt, (long int) *p++);
861           break;
862
863         case stop_memory:
864           mcnt = *p++;
865           printf ("/stop_memory/%d/%ld", mcnt, (long int) *p++);
866           break;
867
868         case duplicate:
869           printf ("/duplicate/%ld", (long int) *p++);
870           break;
871
872         case anychar:
873           printf ("/anychar");
874           break;
875
876         case charset:
877         case charset_not:
878           {
879 #  ifdef WCHAR
880             int i, length;
881             wchar_t *workp = p;
882             printf ("/charset [%s",
883                     (re_opcode_t) *(workp - 1) == charset_not ? "^" : "");
884             p += 5;
885             length = *workp++; /* the length of char_classes */
886             for (i=0 ; i<length ; i++)
887               printf("[:%lx:]", (long int) *p++);
888             length = *workp++; /* the length of collating_symbol */
889             for (i=0 ; i<length ;)
890               {
891                 printf("[.");
892                 while(*p != 0)
893                   PUT_CHAR((i++,*p++));
894                 i++,p++;
895                 printf(".]");
896               }
897             length = *workp++; /* the length of equivalence_class */
898             for (i=0 ; i<length ;)
899               {
900                 printf("[=");
901                 while(*p != 0)
902                   PUT_CHAR((i++,*p++));
903                 i++,p++;
904                 printf("=]");
905               }
906             length = *workp++; /* the length of char_range */
907             for (i=0 ; i<length ; i++)
908               {
909                 wchar_t range_start = *p++;
910                 wchar_t range_end = *p++;
911                 printf("%C-%C", range_start, range_end);
912               }
913             length = *workp++; /* the length of char */
914             for (i=0 ; i<length ; i++)
915               printf("%C", *p++);
916             putchar (']');
917 #  else
918             register int c, last = -100;
919             register int in_range = 0;
920
921             printf ("/charset [%s",
922                     (re_opcode_t) *(p - 1) == charset_not ? "^" : "");
923
924             assert (p + *p < pend);
925
926             for (c = 0; c < 256; c++)
927               if (c / 8 < *p
928                   && (p[1 + (c/8)] & (1 << (c % 8))))
929                 {
930                   /* Are we starting a range?  */
931                   if (last + 1 == c && ! in_range)
932                     {
933                       putchar ('-');
934                       in_range = 1;
935                     }
936                   /* Have we broken a range?  */
937                   else if (last + 1 != c && in_range)
938               {
939                       putchar (last);
940                       in_range = 0;
941                     }
942
943                   if (! in_range)
944                     putchar (c);
945
946                   last = c;
947               }
948
949             if (in_range)
950               putchar (last);
951
952             putchar (']');
953
954             p += 1 + *p;
955 #  endif /* WCHAR */
956           }
957           break;
958
959         case begline:
960           printf ("/begline");
961           break;
962
963         case endline:
964           printf ("/endline");
965           break;
966
967         case on_failure_jump:
968           PREFIX(extract_number_and_incr) (&mcnt, &p);
969 #  ifdef _LIBC
970           printf ("/on_failure_jump to %td", p + mcnt - start);
971 #  else
972           printf ("/on_failure_jump to %ld", (long int) (p + mcnt - start));
973 #  endif
974           break;
975
976         case on_failure_keep_string_jump:
977           PREFIX(extract_number_and_incr) (&mcnt, &p);
978 #  ifdef _LIBC
979           printf ("/on_failure_keep_string_jump to %td", p + mcnt - start);
980 #  else
981           printf ("/on_failure_keep_string_jump to %ld",
982                   (long int) (p + mcnt - start));
983 #  endif
984           break;
985
986         case dummy_failure_jump:
987           PREFIX(extract_number_and_incr) (&mcnt, &p);
988 #  ifdef _LIBC
989           printf ("/dummy_failure_jump to %td", p + mcnt - start);
990 #  else
991           printf ("/dummy_failure_jump to %ld", (long int) (p + mcnt - start));
992 #  endif
993           break;
994
995         case push_dummy_failure:
996           printf ("/push_dummy_failure");
997           break;
998
999         case maybe_pop_jump:
1000           PREFIX(extract_number_and_incr) (&mcnt, &p);
1001 #  ifdef _LIBC
1002           printf ("/maybe_pop_jump to %td", p + mcnt - start);
1003 #  else
1004           printf ("/maybe_pop_jump to %ld", (long int) (p + mcnt - start));
1005 #  endif
1006           break;
1007
1008         case pop_failure_jump:
1009           PREFIX(extract_number_and_incr) (&mcnt, &p);
1010 #  ifdef _LIBC
1011           printf ("/pop_failure_jump to %td", p + mcnt - start);
1012 #  else
1013           printf ("/pop_failure_jump to %ld", (long int) (p + mcnt - start));
1014 #  endif
1015           break;
1016
1017         case jump_past_alt:
1018           PREFIX(extract_number_and_incr) (&mcnt, &p);
1019 #  ifdef _LIBC
1020           printf ("/jump_past_alt to %td", p + mcnt - start);
1021 #  else
1022           printf ("/jump_past_alt to %ld", (long int) (p + mcnt - start));
1023 #  endif
1024           break;
1025
1026         case jump:
1027           PREFIX(extract_number_and_incr) (&mcnt, &p);
1028 #  ifdef _LIBC
1029           printf ("/jump to %td", p + mcnt - start);
1030 #  else
1031           printf ("/jump to %ld", (long int) (p + mcnt - start));
1032 #  endif
1033           break;
1034
1035         case succeed_n:
1036           PREFIX(extract_number_and_incr) (&mcnt, &p);
1037           p1 = p + mcnt;
1038           PREFIX(extract_number_and_incr) (&mcnt2, &p);
1039 #  ifdef _LIBC
1040           printf ("/succeed_n to %td, %d times", p1 - start, mcnt2);
1041 #  else
1042           printf ("/succeed_n to %ld, %d times",
1043                   (long int) (p1 - start), mcnt2);
1044 #  endif
1045           break;
1046
1047         case jump_n:
1048           PREFIX(extract_number_and_incr) (&mcnt, &p);
1049           p1 = p + mcnt;
1050           PREFIX(extract_number_and_incr) (&mcnt2, &p);
1051           printf ("/jump_n to %d, %d times", p1 - start, mcnt2);
1052           break;
1053
1054         case set_number_at:
1055           PREFIX(extract_number_and_incr) (&mcnt, &p);
1056           p1 = p + mcnt;
1057           PREFIX(extract_number_and_incr) (&mcnt2, &p);
1058 #  ifdef _LIBC
1059           printf ("/set_number_at location %td to %d", p1 - start, mcnt2);
1060 #  else
1061           printf ("/set_number_at location %ld to %d",
1062                   (long int) (p1 - start), mcnt2);
1063 #  endif
1064           break;
1065
1066         case wordbound:
1067           printf ("/wordbound");
1068           break;
1069
1070         case notwordbound:
1071           printf ("/notwordbound");
1072           break;
1073
1074         case wordbeg:
1075           printf ("/wordbeg");
1076           break;
1077
1078         case wordend:
1079           printf ("/wordend");
1080           break;
1081
1082 #  ifdef emacs
1083         case before_dot:
1084           printf ("/before_dot");
1085           break;
1086
1087         case at_dot:
1088           printf ("/at_dot");
1089           break;
1090
1091         case after_dot:
1092           printf ("/after_dot");
1093           break;
1094
1095         case syntaxspec:
1096           printf ("/syntaxspec");
1097           mcnt = *p++;
1098           printf ("/%d", mcnt);
1099           break;
1100
1101         case notsyntaxspec:
1102           printf ("/notsyntaxspec");
1103           mcnt = *p++;
1104           printf ("/%d", mcnt);
1105           break;
1106 #  endif /* emacs */
1107
1108         case wordchar:
1109           printf ("/wordchar");
1110           break;
1111
1112         case notwordchar:
1113           printf ("/notwordchar");
1114           break;
1115
1116         case begbuf:
1117           printf ("/begbuf");
1118           break;
1119
1120         case endbuf:
1121           printf ("/endbuf");
1122           break;
1123
1124         default:
1125           printf ("?%ld", (long int) *(p-1));
1126         }
1127
1128       putchar ('\n');
1129     }
1130
1131 #  ifdef _LIBC
1132   printf ("%td:\tend of pattern.\n", p - start);
1133 #  else
1134   printf ("%ld:\tend of pattern.\n", (long int) (p - start));
1135 #  endif
1136 }
1137
1138
1139 void
1140 PREFIX(print_compiled_pattern) (bufp)
1141     struct re_pattern_buffer *bufp;
1142 {
1143   UCHAR_T *buffer = (UCHAR_T*) bufp->buffer;
1144
1145   PREFIX(print_partial_compiled_pattern) (buffer, buffer
1146                                   + bufp->used / sizeof(UCHAR_T));
1147   printf ("%ld bytes used/%ld bytes allocated.\n",
1148           bufp->used, bufp->allocated);
1149
1150   if (bufp->fastmap_accurate && bufp->fastmap)
1151     {
1152       printf ("fastmap: ");
1153       print_fastmap (bufp->fastmap);
1154     }
1155
1156 #  ifdef _LIBC
1157   printf ("re_nsub: %Zd\t", bufp->re_nsub);
1158 #  else
1159   printf ("re_nsub: %ld\t", (long int) bufp->re_nsub);
1160 #  endif
1161   printf ("regs_alloc: %d\t", bufp->regs_allocated);
1162   printf ("can_be_null: %d\t", bufp->can_be_null);
1163   printf ("newline_anchor: %d\n", bufp->newline_anchor);
1164   printf ("no_sub: %d\t", bufp->no_sub);
1165   printf ("not_bol: %d\t", bufp->not_bol);
1166   printf ("not_eol: %d\t", bufp->not_eol);
1167   printf ("syntax: %lx\n", bufp->syntax);
1168   /* Perhaps we should print the translate table?  */
1169 }
1170
1171
1172 void
1173 PREFIX(print_double_string) (where, string1, size1, string2, size2)
1174     const CHAR_T *where;
1175     const CHAR_T *string1;
1176     const CHAR_T *string2;
1177     int size1;
1178     int size2;
1179 {
1180   int this_char;
1181
1182   if (where == NULL)
1183     printf ("(null)");
1184   else
1185     {
1186       int cnt;
1187
1188       if (FIRST_STRING_P (where))
1189         {
1190           for (this_char = where - string1; this_char < size1; this_char++)
1191             PUT_CHAR (string1[this_char]);
1192
1193           where = string2;
1194         }
1195
1196       cnt = 0;
1197       for (this_char = where - string2; this_char < size2; this_char++)
1198         {
1199           PUT_CHAR (string2[this_char]);
1200           if (++cnt > 100)
1201             {
1202               fputs ("...", stdout);
1203               break;
1204             }
1205         }
1206     }
1207 }
1208
1209 #  ifndef DEFINED_ONCE
1210 void
1211 printchar (c)
1212      int c;
1213 {
1214   putc (c, stderr);
1215 }
1216 #  endif
1217
1218 # else /* not DEBUG */
1219
1220 #  ifndef DEFINED_ONCE
1221 #   undef assert
1222 #   define assert(e)
1223
1224 #   define DEBUG_STATEMENT(e)
1225 #   define DEBUG_PRINT1(x)
1226 #   define DEBUG_PRINT2(x1, x2)
1227 #   define DEBUG_PRINT3(x1, x2, x3)
1228 #   define DEBUG_PRINT4(x1, x2, x3, x4)
1229 #  endif /* not DEFINED_ONCE */
1230 #  define DEBUG_PRINT_COMPILED_PATTERN(p, s, e)
1231 #  define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2)
1232
1233 # endif /* not DEBUG */
1234
1235 \f
1236
1237 # ifdef WCHAR
1238 /* This  convert a multibyte string to a wide character string.
1239    And write their correspondances to offset_buffer(see below)
1240    and write whether each wchar_t is binary data to is_binary.
1241    This assume invalid multibyte sequences as binary data.
1242    We assume offset_buffer and is_binary is already allocated
1243    enough space.  */
1244
1245 static size_t convert_mbs_to_wcs (CHAR_T *dest, const unsigned char* src,
1246                                   size_t len, int *offset_buffer,
1247                                   char *is_binary);
1248 static size_t
1249 convert_mbs_to_wcs (dest, src, len, offset_buffer, is_binary)
1250      CHAR_T *dest;
1251      const unsigned char* src;
1252      size_t len; /* the length of multibyte string.  */
1253
1254      /* It hold correspondances between src(char string) and
1255         dest(wchar_t string) for optimization.
1256         e.g. src  = "xxxyzz"
1257              dest = {'X', 'Y', 'Z'}
1258               (each "xxx", "y" and "zz" represent one multibyte character
1259                corresponding to 'X', 'Y' and 'Z'.)
1260           offset_buffer = {0, 0+3("xxx"), 0+3+1("y"), 0+3+1+2("zz")}
1261                         = {0, 3, 4, 6}
1262      */
1263      int *offset_buffer;
1264      char *is_binary;
1265 {
1266   wchar_t *pdest = dest;
1267   const unsigned char *psrc = src;
1268   size_t wc_count = 0;
1269
1270   mbstate_t mbs;
1271   int i, consumed;
1272   size_t mb_remain = len;
1273   size_t mb_count = 0;
1274
1275   /* Initialize the conversion state.  */
1276   memset (&mbs, 0, sizeof (mbstate_t));
1277
1278   offset_buffer[0] = 0;
1279   for( ; mb_remain > 0 ; ++wc_count, ++pdest, mb_remain -= consumed,
1280          psrc += consumed)
1281     {
1282       consumed = mbrtowc (pdest, psrc, mb_remain, &mbs);
1283
1284       if (consumed <= 0)
1285         /* failed to convert. maybe src contains binary data.
1286            So we consume 1 byte manualy.  */
1287         {
1288           *pdest = *psrc;
1289           consumed = 1;
1290           is_binary[wc_count] = TRUE;
1291         }
1292       else
1293         is_binary[wc_count] = FALSE;
1294       /* In sjis encoding, we use yen sign as escape character in
1295          place of reverse solidus. So we convert 0x5c(yen sign in
1296          sjis) to not 0xa5(yen sign in UCS2) but 0x5c(reverse
1297          solidus in UCS2).  */
1298       if (consumed == 1 && (int) *psrc == 0x5c && (int) *pdest == 0xa5)
1299         *pdest = (wchar_t) *psrc;
1300
1301       offset_buffer[wc_count + 1] = mb_count += consumed;
1302     }
1303
1304   /* Fill remain of the buffer with sentinel.  */
1305   for (i = wc_count + 1 ; i <= len ; i++)
1306     offset_buffer[i] = mb_count + 1;
1307
1308   return wc_count;
1309 }
1310
1311 # endif /* WCHAR */
1312
1313 #else /* not INSIDE_RECURSION */
1314
1315 /* Set by `re_set_syntax' to the current regexp syntax to recognize.  Can
1316    also be assigned to arbitrarily: each pattern buffer stores its own
1317    syntax, so it can be changed between regex compilations.  */
1318 /* This has no initializer because initialized variables in Emacs
1319    become read-only after dumping.  */
1320 reg_syntax_t re_syntax_options;
1321
1322
1323 /* Specify the precise syntax of regexps for compilation.  This provides
1324    for compatibility for various utilities which historically have
1325    different, incompatible syntaxes.
1326
1327    The argument SYNTAX is a bit mask comprised of the various bits
1328    defined in regex.h.  We return the old syntax.  */
1329
1330 reg_syntax_t
1331 re_set_syntax (syntax)
1332     reg_syntax_t syntax;
1333 {
1334   reg_syntax_t ret = re_syntax_options;
1335
1336   re_syntax_options = syntax;
1337 # ifdef DEBUG
1338   if (syntax & RE_DEBUG)
1339     debug = 1;
1340   else if (debug) /* was on but now is not */
1341     debug = 0;
1342 # endif /* DEBUG */
1343   return ret;
1344 }
1345 # ifdef _LIBC
1346 weak_alias (__re_set_syntax, re_set_syntax)
1347 # endif
1348 \f
1349 /* This table gives an error message for each of the error codes listed
1350    in regex.h.  Obviously the order here has to be same as there.
1351    POSIX doesn't require that we do anything for REG_NOERROR,
1352    but why not be nice?  */
1353
1354 static const char re_error_msgid[] =
1355   {
1356 # define REG_NOERROR_IDX        0
1357     gettext_noop ("Success")    /* REG_NOERROR */
1358     "\0"
1359 # define REG_NOMATCH_IDX (REG_NOERROR_IDX + sizeof "Success")
1360     gettext_noop ("No match")   /* REG_NOMATCH */
1361     "\0"
1362 # define REG_BADPAT_IDX (REG_NOMATCH_IDX + sizeof "No match")
1363     gettext_noop ("Invalid regular expression") /* REG_BADPAT */
1364     "\0"
1365 # define REG_ECOLLATE_IDX (REG_BADPAT_IDX + sizeof "Invalid regular expression")
1366     gettext_noop ("Invalid collation character") /* REG_ECOLLATE */
1367     "\0"
1368 # define REG_ECTYPE_IDX (REG_ECOLLATE_IDX + sizeof "Invalid collation character")
1369     gettext_noop ("Invalid character class name") /* REG_ECTYPE */
1370     "\0"
1371 # define REG_EESCAPE_IDX        (REG_ECTYPE_IDX + sizeof "Invalid character class name")
1372     gettext_noop ("Trailing backslash") /* REG_EESCAPE */
1373     "\0"
1374 # define REG_ESUBREG_IDX        (REG_EESCAPE_IDX + sizeof "Trailing backslash")
1375     gettext_noop ("Invalid back reference") /* REG_ESUBREG */
1376     "\0"
1377 # define REG_EBRACK_IDX (REG_ESUBREG_IDX + sizeof "Invalid back reference")
1378     gettext_noop ("Unmatched [ or [^")  /* REG_EBRACK */
1379     "\0"
1380 # define REG_EPAREN_IDX (REG_EBRACK_IDX + sizeof "Unmatched [ or [^")
1381     gettext_noop ("Unmatched ( or \\(") /* REG_EPAREN */
1382     "\0"
1383 # define REG_EBRACE_IDX (REG_EPAREN_IDX + sizeof "Unmatched ( or \\(")
1384     gettext_noop ("Unmatched \\{") /* REG_EBRACE */
1385     "\0"
1386 # define REG_BADBR_IDX  (REG_EBRACE_IDX + sizeof "Unmatched \\{")
1387     gettext_noop ("Invalid content of \\{\\}") /* REG_BADBR */
1388     "\0"
1389 # define REG_ERANGE_IDX (REG_BADBR_IDX + sizeof "Invalid content of \\{\\}")
1390     gettext_noop ("Invalid range end")  /* REG_ERANGE */
1391     "\0"
1392 # define REG_ESPACE_IDX (REG_ERANGE_IDX + sizeof "Invalid range end")
1393     gettext_noop ("Memory exhausted") /* REG_ESPACE */
1394     "\0"
1395 # define REG_BADRPT_IDX (REG_ESPACE_IDX + sizeof "Memory exhausted")
1396     gettext_noop ("Invalid preceding regular expression") /* REG_BADRPT */
1397     "\0"
1398 # define REG_EEND_IDX   (REG_BADRPT_IDX + sizeof "Invalid preceding regular expression")
1399     gettext_noop ("Premature end of regular expression") /* REG_EEND */
1400     "\0"
1401 # define REG_ESIZE_IDX  (REG_EEND_IDX + sizeof "Premature end of regular expression")
1402     gettext_noop ("Regular expression too big") /* REG_ESIZE */
1403     "\0"
1404 # define REG_ERPAREN_IDX        (REG_ESIZE_IDX + sizeof "Regular expression too big")
1405     gettext_noop ("Unmatched ) or \\)") /* REG_ERPAREN */
1406   };
1407
1408 static const size_t re_error_msgid_idx[] =
1409   {
1410     REG_NOERROR_IDX,
1411     REG_NOMATCH_IDX,
1412     REG_BADPAT_IDX,
1413     REG_ECOLLATE_IDX,
1414     REG_ECTYPE_IDX,
1415     REG_EESCAPE_IDX,
1416     REG_ESUBREG_IDX,
1417     REG_EBRACK_IDX,
1418     REG_EPAREN_IDX,
1419     REG_EBRACE_IDX,
1420     REG_BADBR_IDX,
1421     REG_ERANGE_IDX,
1422     REG_ESPACE_IDX,
1423     REG_BADRPT_IDX,
1424     REG_EEND_IDX,
1425     REG_ESIZE_IDX,
1426     REG_ERPAREN_IDX
1427   };
1428 \f
1429 #endif /* INSIDE_RECURSION */
1430
1431 #ifndef DEFINED_ONCE
1432 /* Avoiding alloca during matching, to placate r_alloc.  */
1433
1434 /* Define MATCH_MAY_ALLOCATE unless we need to make sure that the
1435    searching and matching functions should not call alloca.  On some
1436    systems, alloca is implemented in terms of malloc, and if we're
1437    using the relocating allocator routines, then malloc could cause a
1438    relocation, which might (if the strings being searched are in the
1439    ralloc heap) shift the data out from underneath the regexp
1440    routines.
1441
1442    Here's another reason to avoid allocation: Emacs
1443    processes input from X in a signal handler; processing X input may
1444    call malloc; if input arrives while a matching routine is calling
1445    malloc, then we're scrod.  But Emacs can't just block input while
1446    calling matching routines; then we don't notice interrupts when
1447    they come in.  So, Emacs blocks input around all regexp calls
1448    except the matching calls, which it leaves unprotected, in the
1449    faith that they will not malloc.  */
1450
1451 /* Normally, this is fine.  */
1452 # define MATCH_MAY_ALLOCATE
1453
1454 /* When using GNU C, we are not REALLY using the C alloca, no matter
1455    what config.h may say.  So don't take precautions for it.  */
1456 # ifdef __GNUC__
1457 #  undef C_ALLOCA
1458 # endif
1459
1460 /* The match routines may not allocate if (1) they would do it with malloc
1461    and (2) it's not safe for them to use malloc.
1462    Note that if REL_ALLOC is defined, matching would not use malloc for the
1463    failure stack, but we would still use it for the register vectors;
1464    so REL_ALLOC should not affect this.  */
1465 # if (defined C_ALLOCA || defined REGEX_MALLOC) && defined emacs
1466 #  undef MATCH_MAY_ALLOCATE
1467 # endif
1468 #endif /* not DEFINED_ONCE */
1469 \f
1470 #ifdef INSIDE_RECURSION
1471 /* Failure stack declarations and macros; both re_compile_fastmap and
1472    re_match_2 use a failure stack.  These have to be macros because of
1473    REGEX_ALLOCATE_STACK.  */
1474
1475
1476 /* Number of failure points for which to initially allocate space
1477    when matching.  If this number is exceeded, we allocate more
1478    space, so it is not a hard limit.  */
1479 # ifndef INIT_FAILURE_ALLOC
1480 #  define INIT_FAILURE_ALLOC 5
1481 # endif
1482
1483 /* Roughly the maximum number of failure points on the stack.  Would be
1484    exactly that if always used MAX_FAILURE_ITEMS items each time we failed.
1485    This is a variable only so users of regex can assign to it; we never
1486    change it ourselves.  */
1487
1488 # ifdef INT_IS_16BIT
1489
1490 #  ifndef DEFINED_ONCE
1491 #   if defined MATCH_MAY_ALLOCATE
1492 /* 4400 was enough to cause a crash on Alpha OSF/1,
1493    whose default stack limit is 2mb.  */
1494 long int re_max_failures = 4000;
1495 #   else
1496 long int re_max_failures = 2000;
1497 #   endif
1498 #  endif
1499
1500 union PREFIX(fail_stack_elt)
1501 {
1502   UCHAR_T *pointer;
1503   long int integer;
1504 };
1505
1506 typedef union PREFIX(fail_stack_elt) PREFIX(fail_stack_elt_t);
1507
1508 typedef struct
1509 {
1510   PREFIX(fail_stack_elt_t) *stack;
1511   unsigned long int size;
1512   unsigned long int avail;              /* Offset of next open position.  */
1513 } PREFIX(fail_stack_type);
1514
1515 # else /* not INT_IS_16BIT */
1516
1517 #  ifndef DEFINED_ONCE
1518 #   if defined MATCH_MAY_ALLOCATE
1519 /* 4400 was enough to cause a crash on Alpha OSF/1,
1520    whose default stack limit is 2mb.  */
1521 int re_max_failures = 4000;
1522 #   else
1523 int re_max_failures = 2000;
1524 #   endif
1525 #  endif
1526
1527 union PREFIX(fail_stack_elt)
1528 {
1529   UCHAR_T *pointer;
1530   int integer;
1531 };
1532
1533 typedef union PREFIX(fail_stack_elt) PREFIX(fail_stack_elt_t);
1534
1535 typedef struct
1536 {
1537   PREFIX(fail_stack_elt_t) *stack;
1538   unsigned size;
1539   unsigned avail;                       /* Offset of next open position.  */
1540 } PREFIX(fail_stack_type);
1541
1542 # endif /* INT_IS_16BIT */
1543
1544 # ifndef DEFINED_ONCE
1545 #  define FAIL_STACK_EMPTY()     (fail_stack.avail == 0)
1546 #  define FAIL_STACK_PTR_EMPTY() (fail_stack_ptr->avail == 0)
1547 #  define FAIL_STACK_FULL()      (fail_stack.avail == fail_stack.size)
1548 # endif
1549
1550
1551 /* Define macros to initialize and free the failure stack.
1552    Do `return -2' if the alloc fails.  */
1553
1554 # ifdef MATCH_MAY_ALLOCATE
1555 #  define INIT_FAIL_STACK()                                             \
1556   do {                                                                  \
1557     fail_stack.stack = (PREFIX(fail_stack_elt_t) *)             \
1558       REGEX_ALLOCATE_STACK (INIT_FAILURE_ALLOC * sizeof (PREFIX(fail_stack_elt_t))); \
1559                                                                         \
1560     if (fail_stack.stack == NULL)                               \
1561       return -2;                                                        \
1562                                                                         \
1563     fail_stack.size = INIT_FAILURE_ALLOC;                       \
1564     fail_stack.avail = 0;                                       \
1565   } while (0)
1566
1567 #  define RESET_FAIL_STACK()  REGEX_FREE_STACK (fail_stack.stack)
1568 # else
1569 #  define INIT_FAIL_STACK()                                             \
1570   do {                                                                  \
1571     fail_stack.avail = 0;                                       \
1572   } while (0)
1573
1574 #  define RESET_FAIL_STACK()
1575 # endif
1576
1577
1578 /* Double the size of FAIL_STACK, up to approximately `re_max_failures' items.
1579
1580    Return 1 if succeeds, and 0 if either ran out of memory
1581    allocating space for it or it was already too large.
1582
1583    REGEX_REALLOCATE_STACK requires `destination' be declared.   */
1584
1585 # define DOUBLE_FAIL_STACK(fail_stack)                                  \
1586   ((fail_stack).size > (unsigned) (re_max_failures * MAX_FAILURE_ITEMS) \
1587    ? 0                                                                  \
1588    : ((fail_stack).stack = (PREFIX(fail_stack_elt_t) *)                 \
1589         REGEX_REALLOCATE_STACK ((fail_stack).stack,                     \
1590           (fail_stack).size * sizeof (PREFIX(fail_stack_elt_t)),        \
1591           ((fail_stack).size << 1) * sizeof (PREFIX(fail_stack_elt_t))),\
1592                                                                         \
1593       (fail_stack).stack == NULL                                        \
1594       ? 0                                                               \
1595       : ((fail_stack).size <<= 1,                                       \
1596          1)))
1597
1598
1599 /* Push pointer POINTER on FAIL_STACK.
1600    Return 1 if was able to do so and 0 if ran out of memory allocating
1601    space to do so.  */
1602 # define PUSH_PATTERN_OP(POINTER, FAIL_STACK)                           \
1603   ((FAIL_STACK_FULL ()                                                  \
1604     && !DOUBLE_FAIL_STACK (FAIL_STACK))                                 \
1605    ? 0                                                                  \
1606    : ((FAIL_STACK).stack[(FAIL_STACK).avail++].pointer = POINTER,       \
1607       1))
1608
1609 /* Push a pointer value onto the failure stack.
1610    Assumes the variable `fail_stack'.  Probably should only
1611    be called from within `PUSH_FAILURE_POINT'.  */
1612 # define PUSH_FAILURE_POINTER(item)                                     \
1613   fail_stack.stack[fail_stack.avail++].pointer = (UCHAR_T *) (item)
1614
1615 /* This pushes an integer-valued item onto the failure stack.
1616    Assumes the variable `fail_stack'.  Probably should only
1617    be called from within `PUSH_FAILURE_POINT'.  */
1618 # define PUSH_FAILURE_INT(item)                                 \
1619   fail_stack.stack[fail_stack.avail++].integer = (item)
1620
1621 /* Push a fail_stack_elt_t value onto the failure stack.
1622    Assumes the variable `fail_stack'.  Probably should only
1623    be called from within `PUSH_FAILURE_POINT'.  */
1624 # define PUSH_FAILURE_ELT(item)                                 \
1625   fail_stack.stack[fail_stack.avail++] =  (item)
1626
1627 /* These three POP... operations complement the three PUSH... operations.
1628    All assume that `fail_stack' is nonempty.  */
1629 # define POP_FAILURE_POINTER() fail_stack.stack[--fail_stack.avail].pointer
1630 # define POP_FAILURE_INT() fail_stack.stack[--fail_stack.avail].integer
1631 # define POP_FAILURE_ELT() fail_stack.stack[--fail_stack.avail]
1632
1633 /* Used to omit pushing failure point id's when we're not debugging.  */
1634 # ifdef DEBUG
1635 #  define DEBUG_PUSH PUSH_FAILURE_INT
1636 #  define DEBUG_POP(item_addr) *(item_addr) = POP_FAILURE_INT ()
1637 # else
1638 #  define DEBUG_PUSH(item)
1639 #  define DEBUG_POP(item_addr)
1640 # endif
1641
1642
1643 /* Push the information about the state we will need
1644    if we ever fail back to it.
1645
1646    Requires variables fail_stack, regstart, regend, reg_info, and
1647    num_regs_pushed be declared.  DOUBLE_FAIL_STACK requires `destination'
1648    be declared.
1649
1650    Does `return FAILURE_CODE' if runs out of memory.  */
1651
1652 # define PUSH_FAILURE_POINT(pattern_place, string_place, failure_code)  \
1653   do {                                                                  \
1654     char *destination;                                                  \
1655     /* Must be int, so when we don't save any registers, the arithmetic \
1656        of 0 + -1 isn't done as unsigned.  */                            \
1657     /* Can't be int, since there is not a shred of a guarantee that int \
1658        is wide enough to hold a value of something to which pointer can \
1659        be assigned */                                                   \
1660     active_reg_t this_reg;                                              \
1661                                                                         \
1662     DEBUG_STATEMENT (failure_id++);                                     \
1663     DEBUG_STATEMENT (nfailure_points_pushed++);                         \
1664     DEBUG_PRINT2 ("\nPUSH_FAILURE_POINT #%u:\n", failure_id);           \
1665     DEBUG_PRINT2 ("  Before push, next avail: %d\n", (fail_stack).avail);\
1666     DEBUG_PRINT2 ("                     size: %d\n", (fail_stack).size);\
1667                                                                         \
1668     DEBUG_PRINT2 ("  slots needed: %ld\n", NUM_FAILURE_ITEMS);          \
1669     DEBUG_PRINT2 ("     available: %d\n", REMAINING_AVAIL_SLOTS);       \
1670                                                                         \
1671     /* Ensure we have enough space allocated for what we will push.  */ \
1672     while (REMAINING_AVAIL_SLOTS < NUM_FAILURE_ITEMS)                   \
1673       {                                                                 \
1674         if (!DOUBLE_FAIL_STACK (fail_stack))                            \
1675           return failure_code;                                          \
1676                                                                         \
1677         DEBUG_PRINT2 ("\n  Doubled stack; size now: %d\n",              \
1678                        (fail_stack).size);                              \
1679         DEBUG_PRINT2 ("  slots available: %d\n", REMAINING_AVAIL_SLOTS);\
1680       }                                                                 \
1681                                                                         \
1682     /* Push the info, starting with the registers.  */                  \
1683     DEBUG_PRINT1 ("\n");                                                \
1684                                                                         \
1685     if (1)                                                              \
1686       for (this_reg = lowest_active_reg; this_reg <= highest_active_reg; \
1687            this_reg++)                                                  \
1688         {                                                               \
1689           DEBUG_PRINT2 ("  Pushing reg: %lu\n", this_reg);              \
1690           DEBUG_STATEMENT (num_regs_pushed++);                          \
1691                                                                         \
1692           DEBUG_PRINT2 ("    start: %p\n", regstart[this_reg]);         \
1693           PUSH_FAILURE_POINTER (regstart[this_reg]);                    \
1694                                                                         \
1695           DEBUG_PRINT2 ("    end: %p\n", regend[this_reg]);             \
1696           PUSH_FAILURE_POINTER (regend[this_reg]);                      \
1697                                                                         \
1698           DEBUG_PRINT2 ("    info: %p\n      ",                         \
1699                         reg_info[this_reg].word.pointer);               \
1700           DEBUG_PRINT2 (" match_null=%d",                               \
1701                         REG_MATCH_NULL_STRING_P (reg_info[this_reg]));  \
1702           DEBUG_PRINT2 (" active=%d", IS_ACTIVE (reg_info[this_reg]));  \
1703           DEBUG_PRINT2 (" matched_something=%d",                        \
1704                         MATCHED_SOMETHING (reg_info[this_reg]));        \
1705           DEBUG_PRINT2 (" ever_matched=%d",                             \
1706                         EVER_MATCHED_SOMETHING (reg_info[this_reg]));   \
1707           DEBUG_PRINT1 ("\n");                                          \
1708           PUSH_FAILURE_ELT (reg_info[this_reg].word);                   \
1709         }                                                               \
1710                                                                         \
1711     DEBUG_PRINT2 ("  Pushing  low active reg: %ld\n", lowest_active_reg);\
1712     PUSH_FAILURE_INT (lowest_active_reg);                               \
1713                                                                         \
1714     DEBUG_PRINT2 ("  Pushing high active reg: %ld\n", highest_active_reg);\
1715     PUSH_FAILURE_INT (highest_active_reg);                              \
1716                                                                         \
1717     DEBUG_PRINT2 ("  Pushing pattern %p:\n", pattern_place);            \
1718     DEBUG_PRINT_COMPILED_PATTERN (bufp, pattern_place, pend);           \
1719     PUSH_FAILURE_POINTER (pattern_place);                               \
1720                                                                         \
1721     DEBUG_PRINT2 ("  Pushing string %p: `", string_place);              \
1722     DEBUG_PRINT_DOUBLE_STRING (string_place, string1, size1, string2,   \
1723                                  size2);                                \
1724     DEBUG_PRINT1 ("'\n");                                               \
1725     PUSH_FAILURE_POINTER (string_place);                                \
1726                                                                         \
1727     DEBUG_PRINT2 ("  Pushing failure id: %u\n", failure_id);            \
1728     DEBUG_PUSH (failure_id);                                            \
1729   } while (0)
1730
1731 # ifndef DEFINED_ONCE
1732 /* This is the number of items that are pushed and popped on the stack
1733    for each register.  */
1734 #  define NUM_REG_ITEMS  3
1735
1736 /* Individual items aside from the registers.  */
1737 #  ifdef DEBUG
1738 #   define NUM_NONREG_ITEMS 5 /* Includes failure point id.  */
1739 #  else
1740 #   define NUM_NONREG_ITEMS 4
1741 #  endif
1742
1743 /* We push at most this many items on the stack.  */
1744 /* We used to use (num_regs - 1), which is the number of registers
1745    this regexp will save; but that was changed to 5
1746    to avoid stack overflow for a regexp with lots of parens.  */
1747 #  define MAX_FAILURE_ITEMS (5 * NUM_REG_ITEMS + NUM_NONREG_ITEMS)
1748
1749 /* We actually push this many items.  */
1750 #  define NUM_FAILURE_ITEMS                             \
1751   (((0                                                  \
1752      ? 0 : highest_active_reg - lowest_active_reg + 1)  \
1753     * NUM_REG_ITEMS)                                    \
1754    + NUM_NONREG_ITEMS)
1755
1756 /* How many items can still be added to the stack without overflowing it.  */
1757 #  define REMAINING_AVAIL_SLOTS ((fail_stack).size - (fail_stack).avail)
1758 # endif /* not DEFINED_ONCE */
1759
1760
1761 /* Pops what PUSH_FAIL_STACK pushes.
1762
1763    We restore into the parameters, all of which should be lvalues:
1764      STR -- the saved data position.
1765      PAT -- the saved pattern position.
1766      LOW_REG, HIGH_REG -- the highest and lowest active registers.
1767      REGSTART, REGEND -- arrays of string positions.
1768      REG_INFO -- array of information about each subexpression.
1769
1770    Also assumes the variables `fail_stack' and (if debugging), `bufp',
1771    `pend', `string1', `size1', `string2', and `size2'.  */
1772 # define POP_FAILURE_POINT(str, pat, low_reg, high_reg, regstart, regend, reg_info)\
1773 {                                                                       \
1774   DEBUG_STATEMENT (unsigned failure_id;)                                \
1775   active_reg_t this_reg;                                                \
1776   const UCHAR_T *string_temp;                                           \
1777                                                                         \
1778   assert (!FAIL_STACK_EMPTY ());                                        \
1779                                                                         \
1780   /* Remove failure points and point to how many regs pushed.  */       \
1781   DEBUG_PRINT1 ("POP_FAILURE_POINT:\n");                                \
1782   DEBUG_PRINT2 ("  Before pop, next avail: %d\n", fail_stack.avail);    \
1783   DEBUG_PRINT2 ("                    size: %d\n", fail_stack.size);     \
1784                                                                         \
1785   assert (fail_stack.avail >= NUM_NONREG_ITEMS);                        \
1786                                                                         \
1787   DEBUG_POP (&failure_id);                                              \
1788   DEBUG_PRINT2 ("  Popping failure id: %u\n", failure_id);              \
1789                                                                         \
1790   /* If the saved string location is NULL, it came from an              \
1791      on_failure_keep_string_jump opcode, and we want to throw away the  \
1792      saved NULL, thus retaining our current position in the string.  */ \
1793   string_temp = POP_FAILURE_POINTER ();                                 \
1794   if (string_temp != NULL)                                              \
1795     str = (const CHAR_T *) string_temp;                                 \
1796                                                                         \
1797   DEBUG_PRINT2 ("  Popping string %p: `", str);                         \
1798   DEBUG_PRINT_DOUBLE_STRING (str, string1, size1, string2, size2);      \
1799   DEBUG_PRINT1 ("'\n");                                                 \
1800                                                                         \
1801   pat = (UCHAR_T *) POP_FAILURE_POINTER ();                             \
1802   DEBUG_PRINT2 ("  Popping pattern %p:\n", pat);                        \
1803   DEBUG_PRINT_COMPILED_PATTERN (bufp, pat, pend);                       \
1804                                                                         \
1805   /* Restore register info.  */                                         \
1806   high_reg = (active_reg_t) POP_FAILURE_INT ();                         \
1807   DEBUG_PRINT2 ("  Popping high active reg: %ld\n", high_reg);          \
1808                                                                         \
1809   low_reg = (active_reg_t) POP_FAILURE_INT ();                          \
1810   DEBUG_PRINT2 ("  Popping  low active reg: %ld\n", low_reg);           \
1811                                                                         \
1812   if (1)                                                                \
1813     for (this_reg = high_reg; this_reg >= low_reg; this_reg--)          \
1814       {                                                                 \
1815         DEBUG_PRINT2 ("    Popping reg: %ld\n", this_reg);              \
1816                                                                         \
1817         reg_info[this_reg].word = POP_FAILURE_ELT ();                   \
1818         DEBUG_PRINT2 ("      info: %p\n",                               \
1819                       reg_info[this_reg].word.pointer);                 \
1820                                                                         \
1821         regend[this_reg] = (const CHAR_T *) POP_FAILURE_POINTER ();     \
1822         DEBUG_PRINT2 ("      end: %p\n", regend[this_reg]);             \
1823                                                                         \
1824         regstart[this_reg] = (const CHAR_T *) POP_FAILURE_POINTER ();   \
1825         DEBUG_PRINT2 ("      start: %p\n", regstart[this_reg]);         \
1826       }                                                                 \
1827   else                                                                  \
1828     {                                                                   \
1829       for (this_reg = highest_active_reg; this_reg > high_reg; this_reg--) \
1830         {                                                               \
1831           reg_info[this_reg].word.integer = 0;                          \
1832           regend[this_reg] = 0;                                         \
1833           regstart[this_reg] = 0;                                       \
1834         }                                                               \
1835       highest_active_reg = high_reg;                                    \
1836     }                                                                   \
1837                                                                         \
1838   set_regs_matched_done = 0;                                            \
1839   DEBUG_STATEMENT (nfailure_points_popped++);                           \
1840 } /* POP_FAILURE_POINT */
1841 \f
1842 /* Structure for per-register (a.k.a. per-group) information.
1843    Other register information, such as the
1844    starting and ending positions (which are addresses), and the list of
1845    inner groups (which is a bits list) are maintained in separate
1846    variables.
1847
1848    We are making a (strictly speaking) nonportable assumption here: that
1849    the compiler will pack our bit fields into something that fits into
1850    the type of `word', i.e., is something that fits into one item on the
1851    failure stack.  */
1852
1853
1854 /* Declarations and macros for re_match_2.  */
1855
1856 typedef union
1857 {
1858   PREFIX(fail_stack_elt_t) word;
1859   struct
1860   {
1861       /* This field is one if this group can match the empty string,
1862          zero if not.  If not yet determined,  `MATCH_NULL_UNSET_VALUE'.  */
1863 # define MATCH_NULL_UNSET_VALUE 3
1864     unsigned match_null_string_p : 2;
1865     unsigned is_active : 1;
1866     unsigned matched_something : 1;
1867     unsigned ever_matched_something : 1;
1868   } bits;
1869 } PREFIX(register_info_type);
1870
1871 # ifndef DEFINED_ONCE
1872 #  define REG_MATCH_NULL_STRING_P(R)  ((R).bits.match_null_string_p)
1873 #  define IS_ACTIVE(R)  ((R).bits.is_active)
1874 #  define MATCHED_SOMETHING(R)  ((R).bits.matched_something)
1875 #  define EVER_MATCHED_SOMETHING(R)  ((R).bits.ever_matched_something)
1876
1877
1878 /* Call this when have matched a real character; it sets `matched' flags
1879    for the subexpressions which we are currently inside.  Also records
1880    that those subexprs have matched.  */
1881 #  define SET_REGS_MATCHED()                                            \
1882   do                                                                    \
1883     {                                                                   \
1884       if (!set_regs_matched_done)                                       \
1885         {                                                               \
1886           active_reg_t r;                                               \
1887           set_regs_matched_done = 1;                                    \
1888           for (r = lowest_active_reg; r <= highest_active_reg; r++)     \
1889             {                                                           \
1890               MATCHED_SOMETHING (reg_info[r])                           \
1891                 = EVER_MATCHED_SOMETHING (reg_info[r])                  \
1892                 = 1;                                                    \
1893             }                                                           \
1894         }                                                               \
1895     }                                                                   \
1896   while (0)
1897 # endif /* not DEFINED_ONCE */
1898
1899 /* Registers are set to a sentinel when they haven't yet matched.  */
1900 static CHAR_T PREFIX(reg_unset_dummy);
1901 # define REG_UNSET_VALUE (&PREFIX(reg_unset_dummy))
1902 # define REG_UNSET(e) ((e) == REG_UNSET_VALUE)
1903
1904 /* Subroutine declarations and macros for regex_compile.  */
1905 static void PREFIX(store_op1) _RE_ARGS ((re_opcode_t op, UCHAR_T *loc, int arg));
1906 static void PREFIX(store_op2) _RE_ARGS ((re_opcode_t op, UCHAR_T *loc,
1907                                  int arg1, int arg2));
1908 static void PREFIX(insert_op1) _RE_ARGS ((re_opcode_t op, UCHAR_T *loc,
1909                                   int arg, UCHAR_T *end));
1910 static void PREFIX(insert_op2) _RE_ARGS ((re_opcode_t op, UCHAR_T *loc,
1911                                   int arg1, int arg2, UCHAR_T *end));
1912 static boolean PREFIX(at_begline_loc_p) _RE_ARGS ((const CHAR_T *pattern,
1913                                            const CHAR_T *p,
1914                                            reg_syntax_t syntax));
1915 static boolean PREFIX(at_endline_loc_p) _RE_ARGS ((const CHAR_T *p,
1916                                            const CHAR_T *pend,
1917                                            reg_syntax_t syntax));
1918 # ifdef WCHAR
1919 static reg_errcode_t wcs_compile_range _RE_ARGS ((CHAR_T range_start,
1920                                                   const CHAR_T **p_ptr,
1921                                                   const CHAR_T *pend,
1922                                                   char *translate,
1923                                                   reg_syntax_t syntax,
1924                                                   UCHAR_T *b,
1925                                                   CHAR_T *char_set));
1926 static void insert_space _RE_ARGS ((int num, CHAR_T *loc, CHAR_T *end));
1927 # else /* BYTE */
1928 static reg_errcode_t byte_compile_range _RE_ARGS ((unsigned int range_start,
1929                                                    const char **p_ptr,
1930                                                    const char *pend,
1931                                                    char *translate,
1932                                                    reg_syntax_t syntax,
1933                                                    unsigned char *b));
1934 # endif /* WCHAR */
1935
1936 /* Fetch the next character in the uncompiled pattern---translating it
1937    if necessary.  Also cast from a signed character in the constant
1938    string passed to us by the user to an unsigned char that we can use
1939    as an array index (in, e.g., `translate').  */
1940 /* ifdef MBS_SUPPORT, we translate only if character <= 0xff,
1941    because it is impossible to allocate 4GB array for some encodings
1942    which have 4 byte character_set like UCS4.  */
1943 # ifndef PATFETCH
1944 #  ifdef WCHAR
1945 #   define PATFETCH(c)                                                  \
1946   do {if (p == pend) return REG_EEND;                                   \
1947     c = (UCHAR_T) *p++;                                                 \
1948     if (translate && (c <= 0xff)) c = (UCHAR_T) translate[c];           \
1949   } while (0)
1950 #  else /* BYTE */
1951 #   define PATFETCH(c)                                                  \
1952   do {if (p == pend) return REG_EEND;                                   \
1953     c = (unsigned char) *p++;                                           \
1954     if (translate) c = (unsigned char) translate[c];                    \
1955   } while (0)
1956 #  endif /* WCHAR */
1957 # endif
1958
1959 /* Fetch the next character in the uncompiled pattern, with no
1960    translation.  */
1961 # define PATFETCH_RAW(c)                                                \
1962   do {if (p == pend) return REG_EEND;                                   \
1963     c = (UCHAR_T) *p++;                                                 \
1964   } while (0)
1965
1966 /* Go backwards one character in the pattern.  */
1967 # define PATUNFETCH p--
1968
1969
1970 /* If `translate' is non-null, return translate[D], else just D.  We
1971    cast the subscript to translate because some data is declared as
1972    `char *', to avoid warnings when a string constant is passed.  But
1973    when we use a character as a subscript we must make it unsigned.  */
1974 /* ifdef MBS_SUPPORT, we translate only if character <= 0xff,
1975    because it is impossible to allocate 4GB array for some encodings
1976    which have 4 byte character_set like UCS4.  */
1977
1978 # ifndef TRANSLATE
1979 #  ifdef WCHAR
1980 #   define TRANSLATE(d) \
1981   ((translate && ((UCHAR_T) (d)) <= 0xff) \
1982    ? (char) translate[(unsigned char) (d)] : (d))
1983 # else /* BYTE */
1984 #   define TRANSLATE(d) \
1985   (translate ? (char) translate[(unsigned char) (d)] : (d))
1986 #  endif /* WCHAR */
1987 # endif
1988
1989
1990 /* Macros for outputting the compiled pattern into `buffer'.  */
1991
1992 /* If the buffer isn't allocated when it comes in, use this.  */
1993 # define INIT_BUF_SIZE  (32 * sizeof(UCHAR_T))
1994
1995 /* Make sure we have at least N more bytes of space in buffer.  */
1996 # ifdef WCHAR
1997 #  define GET_BUFFER_SPACE(n)                                           \
1998     while (((unsigned long)b - (unsigned long)COMPILED_BUFFER_VAR       \
1999             + (n)*sizeof(CHAR_T)) > bufp->allocated)                    \
2000       EXTEND_BUFFER ()
2001 # else /* BYTE */
2002 #  define GET_BUFFER_SPACE(n)                                           \
2003     while ((unsigned long) (b - bufp->buffer + (n)) > bufp->allocated)  \
2004       EXTEND_BUFFER ()
2005 # endif /* WCHAR */
2006
2007 /* Make sure we have one more byte of buffer space and then add C to it.  */
2008 # define BUF_PUSH(c)                                                    \
2009   do {                                                                  \
2010     GET_BUFFER_SPACE (1);                                               \
2011     *b++ = (UCHAR_T) (c);                                               \
2012   } while (0)
2013
2014
2015 /* Ensure we have two more bytes of buffer space and then append C1 and C2.  */
2016 # define BUF_PUSH_2(c1, c2)                                             \
2017   do {                                                                  \
2018     GET_BUFFER_SPACE (2);                                               \
2019     *b++ = (UCHAR_T) (c1);                                              \
2020     *b++ = (UCHAR_T) (c2);                                              \
2021   } while (0)
2022
2023
2024 /* As with BUF_PUSH_2, except for three bytes.  */
2025 # define BUF_PUSH_3(c1, c2, c3)                                         \
2026   do {                                                                  \
2027     GET_BUFFER_SPACE (3);                                               \
2028     *b++ = (UCHAR_T) (c1);                                              \
2029     *b++ = (UCHAR_T) (c2);                                              \
2030     *b++ = (UCHAR_T) (c3);                                              \
2031   } while (0)
2032
2033 /* Store a jump with opcode OP at LOC to location TO.  We store a
2034    relative address offset by the three bytes the jump itself occupies.  */
2035 # define STORE_JUMP(op, loc, to) \
2036  PREFIX(store_op1) (op, loc, (int) ((to) - (loc) - (1 + OFFSET_ADDRESS_SIZE)))
2037
2038 /* Likewise, for a two-argument jump.  */
2039 # define STORE_JUMP2(op, loc, to, arg) \
2040   PREFIX(store_op2) (op, loc, (int) ((to) - (loc) - (1 + OFFSET_ADDRESS_SIZE)), arg)
2041
2042 /* Like `STORE_JUMP', but for inserting.  Assume `b' is the buffer end.  */
2043 # define INSERT_JUMP(op, loc, to) \
2044   PREFIX(insert_op1) (op, loc, (int) ((to) - (loc) - (1 + OFFSET_ADDRESS_SIZE)), b)
2045
2046 /* Like `STORE_JUMP2', but for inserting.  Assume `b' is the buffer end.  */
2047 # define INSERT_JUMP2(op, loc, to, arg) \
2048   PREFIX(insert_op2) (op, loc, (int) ((to) - (loc) - (1 + OFFSET_ADDRESS_SIZE)),\
2049               arg, b)
2050
2051 /* This is not an arbitrary limit: the arguments which represent offsets
2052    into the pattern are two bytes long.  So if 2^16 bytes turns out to
2053    be too small, many things would have to change.  */
2054 /* Any other compiler which, like MSC, has allocation limit below 2^16
2055    bytes will have to use approach similar to what was done below for
2056    MSC and drop MAX_BUF_SIZE a bit.  Otherwise you may end up
2057    reallocating to 0 bytes.  Such thing is not going to work too well.
2058    You have been warned!!  */
2059 # ifndef DEFINED_ONCE
2060 #  if defined _MSC_VER  && !defined WIN32
2061 /* Microsoft C 16-bit versions limit malloc to approx 65512 bytes.
2062    The REALLOC define eliminates a flurry of conversion warnings,
2063    but is not required. */
2064 #   define MAX_BUF_SIZE  65500L
2065 #   define REALLOC(p,s) realloc ((p), (size_t) (s))
2066 #  else
2067 #   define MAX_BUF_SIZE (1L << 16)
2068 #   define REALLOC(p,s) realloc ((p), (s))
2069 #  endif
2070
2071 /* Extend the buffer by twice its current size via realloc and
2072    reset the pointers that pointed into the old block to point to the
2073    correct places in the new one.  If extending the buffer results in it
2074    being larger than MAX_BUF_SIZE, then flag memory exhausted.  */
2075 #  if __BOUNDED_POINTERS__
2076 #   define SET_HIGH_BOUND(P) (__ptrhigh (P) = __ptrlow (P) + bufp->allocated)
2077 #   define MOVE_BUFFER_POINTER(P) \
2078   (__ptrlow (P) += incr, SET_HIGH_BOUND (P), __ptrvalue (P) += incr)
2079 #   define ELSE_EXTEND_BUFFER_HIGH_BOUND        \
2080   else                                          \
2081     {                                           \
2082       SET_HIGH_BOUND (b);                       \
2083       SET_HIGH_BOUND (begalt);                  \
2084       if (fixup_alt_jump)                       \
2085         SET_HIGH_BOUND (fixup_alt_jump);        \
2086       if (laststart)                            \
2087         SET_HIGH_BOUND (laststart);             \
2088       if (pending_exact)                        \
2089         SET_HIGH_BOUND (pending_exact);         \
2090     }
2091 #  else
2092 #   define MOVE_BUFFER_POINTER(P) (P) += incr
2093 #   define ELSE_EXTEND_BUFFER_HIGH_BOUND
2094 #  endif
2095 # endif /* not DEFINED_ONCE */
2096
2097 # ifdef WCHAR
2098 #  define EXTEND_BUFFER()                                               \
2099   do {                                                                  \
2100     UCHAR_T *old_buffer = COMPILED_BUFFER_VAR;                          \
2101     int wchar_count;                                                    \
2102     if (bufp->allocated + sizeof(UCHAR_T) > MAX_BUF_SIZE)               \
2103       return REG_ESIZE;                                                 \
2104     bufp->allocated <<= 1;                                              \
2105     if (bufp->allocated > MAX_BUF_SIZE)                                 \
2106       bufp->allocated = MAX_BUF_SIZE;                                   \
2107     /* How many characters the new buffer can have?  */                 \
2108     wchar_count = bufp->allocated / sizeof(UCHAR_T);                    \
2109     if (wchar_count == 0) wchar_count = 1;                              \
2110     /* Truncate the buffer to CHAR_T align.  */                 \
2111     bufp->allocated = wchar_count * sizeof(UCHAR_T);                    \
2112     RETALLOC (COMPILED_BUFFER_VAR, wchar_count, UCHAR_T);               \
2113     bufp->buffer = (char*)COMPILED_BUFFER_VAR;                          \
2114     if (COMPILED_BUFFER_VAR == NULL)                                    \
2115       return REG_ESPACE;                                                \
2116     /* If the buffer moved, move all the pointers into it.  */          \
2117     if (old_buffer != COMPILED_BUFFER_VAR)                              \
2118       {                                                                 \
2119         int incr = COMPILED_BUFFER_VAR - old_buffer;                    \
2120         MOVE_BUFFER_POINTER (b);                                        \
2121         MOVE_BUFFER_POINTER (begalt);                                   \
2122         if (fixup_alt_jump)                                             \
2123           MOVE_BUFFER_POINTER (fixup_alt_jump);                         \
2124         if (laststart)                                                  \
2125           MOVE_BUFFER_POINTER (laststart);                              \
2126         if (pending_exact)                                              \
2127           MOVE_BUFFER_POINTER (pending_exact);                          \
2128       }                                                                 \
2129     ELSE_EXTEND_BUFFER_HIGH_BOUND                                       \
2130   } while (0)
2131 # else /* BYTE */
2132 #  define EXTEND_BUFFER()                                               \
2133   do {                                                                  \
2134     UCHAR_T *old_buffer = COMPILED_BUFFER_VAR;                          \
2135     if (bufp->allocated == MAX_BUF_SIZE)                                \
2136       return REG_ESIZE;                                                 \
2137     bufp->allocated <<= 1;                                              \
2138     if (bufp->allocated > MAX_BUF_SIZE)                                 \
2139       bufp->allocated = MAX_BUF_SIZE;                                   \
2140     bufp->buffer = (UCHAR_T *) REALLOC (COMPILED_BUFFER_VAR,            \
2141                                                 bufp->allocated);       \
2142     if (COMPILED_BUFFER_VAR == NULL)                                    \
2143       return REG_ESPACE;                                                \
2144     /* If the buffer moved, move all the pointers into it.  */          \
2145     if (old_buffer != COMPILED_BUFFER_VAR)                              \
2146       {                                                                 \
2147         int incr = COMPILED_BUFFER_VAR - old_buffer;                    \
2148         MOVE_BUFFER_POINTER (b);                                        \
2149         MOVE_BUFFER_POINTER (begalt);                                   \
2150         if (fixup_alt_jump)                                             \
2151           MOVE_BUFFER_POINTER (fixup_alt_jump);                         \
2152         if (laststart)                                                  \
2153           MOVE_BUFFER_POINTER (laststart);                              \
2154         if (pending_exact)                                              \
2155           MOVE_BUFFER_POINTER (pending_exact);                          \
2156       }                                                                 \
2157     ELSE_EXTEND_BUFFER_HIGH_BOUND                                       \
2158   } while (0)
2159 # endif /* WCHAR */
2160
2161 # ifndef DEFINED_ONCE
2162 /* Since we have one byte reserved for the register number argument to
2163    {start,stop}_memory, the maximum number of groups we can report
2164    things about is what fits in that byte.  */
2165 #  define MAX_REGNUM 255
2166
2167 /* But patterns can have more than `MAX_REGNUM' registers.  We just
2168    ignore the excess.  */
2169 typedef unsigned regnum_t;
2170
2171
2172 /* Macros for the compile stack.  */
2173
2174 /* Since offsets can go either forwards or backwards, this type needs to
2175    be able to hold values from -(MAX_BUF_SIZE - 1) to MAX_BUF_SIZE - 1.  */
2176 /* int may be not enough when sizeof(int) == 2.  */
2177 typedef long pattern_offset_t;
2178
2179 typedef struct
2180 {
2181   pattern_offset_t begalt_offset;
2182   pattern_offset_t fixup_alt_jump;
2183   pattern_offset_t inner_group_offset;
2184   pattern_offset_t laststart_offset;
2185   regnum_t regnum;
2186 } compile_stack_elt_t;
2187
2188
2189 typedef struct
2190 {
2191   compile_stack_elt_t *stack;
2192   unsigned size;
2193   unsigned avail;                       /* Offset of next open position.  */
2194 } compile_stack_type;
2195
2196
2197 #  define INIT_COMPILE_STACK_SIZE 32
2198
2199 #  define COMPILE_STACK_EMPTY  (compile_stack.avail == 0)
2200 #  define COMPILE_STACK_FULL  (compile_stack.avail == compile_stack.size)
2201
2202 /* The next available element.  */
2203 #  define COMPILE_STACK_TOP (compile_stack.stack[compile_stack.avail])
2204
2205 # endif /* not DEFINED_ONCE */
2206
2207 /* Set the bit for character C in a list.  */
2208 # ifndef DEFINED_ONCE
2209 #  define SET_LIST_BIT(c)                               \
2210   (b[((unsigned char) (c)) / BYTEWIDTH]               \
2211    |= 1 << (((unsigned char) c) % BYTEWIDTH))
2212 # endif /* DEFINED_ONCE */
2213
2214 /* Get the next unsigned number in the uncompiled pattern.  */
2215 # define GET_UNSIGNED_NUMBER(num) \
2216   {                                                                     \
2217     while (p != pend)                                                   \
2218       {                                                                 \
2219         PATFETCH (c);                                                   \
2220         if (c < '0' || c > '9')                                         \
2221           break;                                                        \
2222         if (num <= RE_DUP_MAX)                                          \
2223           {                                                             \
2224             if (num < 0)                                                \
2225               num = 0;                                                  \
2226             num = num * 10 + c - '0';                                   \
2227           }                                                             \
2228       }                                                                 \
2229   }
2230
2231 # ifndef DEFINED_ONCE
2232 #  if defined _LIBC || WIDE_CHAR_SUPPORT
2233 /* The GNU C library provides support for user-defined character classes
2234    and the functions from ISO C amendement 1.  */
2235 #   ifdef CHARCLASS_NAME_MAX
2236 #    define CHAR_CLASS_MAX_LENGTH CHARCLASS_NAME_MAX
2237 #   else
2238 /* This shouldn't happen but some implementation might still have this
2239    problem.  Use a reasonable default value.  */
2240 #    define CHAR_CLASS_MAX_LENGTH 256
2241 #   endif
2242
2243 #   ifdef _LIBC
2244 #    define IS_CHAR_CLASS(string) __wctype (string)
2245 #   else
2246 #    define IS_CHAR_CLASS(string) wctype (string)
2247 #   endif
2248 #  else
2249 #   define CHAR_CLASS_MAX_LENGTH  6 /* Namely, `xdigit'.  */
2250
2251 #   define IS_CHAR_CLASS(string)                                        \
2252    (STREQ (string, "alpha") || STREQ (string, "upper")                  \
2253     || STREQ (string, "lower") || STREQ (string, "digit")               \
2254     || STREQ (string, "alnum") || STREQ (string, "xdigit")              \
2255     || STREQ (string, "space") || STREQ (string, "print")               \
2256     || STREQ (string, "punct") || STREQ (string, "graph")               \
2257     || STREQ (string, "cntrl") || STREQ (string, "blank"))
2258 #  endif
2259 # endif /* DEFINED_ONCE */
2260 \f
2261 # ifndef MATCH_MAY_ALLOCATE
2262
2263 /* If we cannot allocate large objects within re_match_2_internal,
2264    we make the fail stack and register vectors global.
2265    The fail stack, we grow to the maximum size when a regexp
2266    is compiled.
2267    The register vectors, we adjust in size each time we
2268    compile a regexp, according to the number of registers it needs.  */
2269
2270 static PREFIX(fail_stack_type) fail_stack;
2271
2272 /* Size with which the following vectors are currently allocated.
2273    That is so we can make them bigger as needed,
2274    but never make them smaller.  */
2275 #  ifdef DEFINED_ONCE
2276 static int regs_allocated_size;
2277
2278 static const char **     regstart, **     regend;
2279 static const char ** old_regstart, ** old_regend;
2280 static const char **best_regstart, **best_regend;
2281 static const char **reg_dummy;
2282 #  endif /* DEFINED_ONCE */
2283
2284 static PREFIX(register_info_type) *PREFIX(reg_info);
2285 static PREFIX(register_info_type) *PREFIX(reg_info_dummy);
2286
2287 /* Make the register vectors big enough for NUM_REGS registers,
2288    but don't make them smaller.  */
2289
2290 static void
2291 PREFIX(regex_grow_registers) (num_regs)
2292      int num_regs;
2293 {
2294   if (num_regs > regs_allocated_size)
2295     {
2296       RETALLOC_IF (regstart,     num_regs, const char *);
2297       RETALLOC_IF (regend,       num_regs, const char *);
2298       RETALLOC_IF (old_regstart, num_regs, const char *);
2299       RETALLOC_IF (old_regend,   num_regs, const char *);
2300       RETALLOC_IF (best_regstart, num_regs, const char *);
2301       RETALLOC_IF (best_regend,  num_regs, const char *);
2302       RETALLOC_IF (PREFIX(reg_info), num_regs, PREFIX(register_info_type));
2303       RETALLOC_IF (reg_dummy,    num_regs, const char *);
2304       RETALLOC_IF (PREFIX(reg_info_dummy), num_regs, PREFIX(register_info_type));
2305
2306       regs_allocated_size = num_regs;
2307     }
2308 }
2309
2310 # endif /* not MATCH_MAY_ALLOCATE */
2311 \f
2312 # ifndef DEFINED_ONCE
2313 static boolean group_in_compile_stack _RE_ARGS ((compile_stack_type
2314                                                  compile_stack,
2315                                                  regnum_t regnum));
2316 # endif /* not DEFINED_ONCE */
2317
2318 /* `regex_compile' compiles PATTERN (of length SIZE) according to SYNTAX.
2319    Returns one of error codes defined in `regex.h', or zero for success.
2320
2321    Assumes the `allocated' (and perhaps `buffer') and `translate'
2322    fields are set in BUFP on entry.
2323
2324    If it succeeds, results are put in BUFP (if it returns an error, the
2325    contents of BUFP are undefined):
2326      `buffer' is the compiled pattern;
2327      `syntax' is set to SYNTAX;
2328      `used' is set to the length of the compiled pattern;
2329      `fastmap_accurate' is zero;
2330      `re_nsub' is the number of subexpressions in PATTERN;
2331      `not_bol' and `not_eol' are zero;
2332
2333    The `fastmap' and `newline_anchor' fields are neither
2334    examined nor set.  */
2335
2336 /* Return, freeing storage we allocated.  */
2337 # ifdef WCHAR
2338 #  define FREE_STACK_RETURN(value)              \
2339   return (free(pattern), free(mbs_offset), free(is_binary), free (compile_stack.stack), value)
2340 # else
2341 #  define FREE_STACK_RETURN(value)              \
2342   return (free (compile_stack.stack), value)
2343 # endif /* WCHAR */
2344
2345 static reg_errcode_t
2346 PREFIX(regex_compile) (ARG_PREFIX(pattern), ARG_PREFIX(size), syntax, bufp)
2347      const char *ARG_PREFIX(pattern);
2348      size_t ARG_PREFIX(size);
2349      reg_syntax_t syntax;
2350      struct re_pattern_buffer *bufp;
2351 {
2352   /* We fetch characters from PATTERN here.  Even though PATTERN is
2353      `char *' (i.e., signed), we declare these variables as unsigned, so
2354      they can be reliably used as array indices.  */
2355   register UCHAR_T c, c1;
2356
2357 #ifdef WCHAR
2358   /* A temporary space to keep wchar_t pattern and compiled pattern.  */
2359   CHAR_T *pattern, *COMPILED_BUFFER_VAR;
2360   size_t size;
2361   /* offset buffer for optimization. See convert_mbs_to_wc.  */
2362   int *mbs_offset = NULL;
2363   /* It hold whether each wchar_t is binary data or not.  */
2364   char *is_binary = NULL;
2365   /* A flag whether exactn is handling binary data or not.  */
2366   char is_exactn_bin = FALSE;
2367 #endif /* WCHAR */
2368
2369   /* A random temporary spot in PATTERN.  */
2370   const CHAR_T *p1;
2371
2372   /* Points to the end of the buffer, where we should append.  */
2373   register UCHAR_T *b;
2374
2375   /* Keeps track of unclosed groups.  */
2376   compile_stack_type compile_stack;
2377
2378   /* Points to the current (ending) position in the pattern.  */
2379 #ifdef WCHAR
2380   const CHAR_T *p;
2381   const CHAR_T *pend;
2382 #else /* BYTE */
2383   const CHAR_T *p = pattern;
2384   const CHAR_T *pend = pattern + size;
2385 #endif /* WCHAR */
2386
2387   /* How to translate the characters in the pattern.  */
2388   RE_TRANSLATE_TYPE translate = bufp->translate;
2389
2390   /* Address of the count-byte of the most recently inserted `exactn'
2391      command.  This makes it possible to tell if a new exact-match
2392      character can be added to that command or if the character requires
2393      a new `exactn' command.  */
2394   UCHAR_T *pending_exact = 0;
2395
2396   /* Address of start of the most recently finished expression.
2397      This tells, e.g., postfix * where to find the start of its
2398      operand.  Reset at the beginning of groups and alternatives.  */
2399   UCHAR_T *laststart = 0;
2400
2401   /* Address of beginning of regexp, or inside of last group.  */
2402   UCHAR_T *begalt;
2403
2404   /* Address of the place where a forward jump should go to the end of
2405      the containing expression.  Each alternative of an `or' -- except the
2406      last -- ends with a forward jump of this sort.  */
2407   UCHAR_T *fixup_alt_jump = 0;
2408
2409   /* Counts open-groups as they are encountered.  Remembered for the
2410      matching close-group on the compile stack, so the same register
2411      number is put in the stop_memory as the start_memory.  */
2412   regnum_t regnum = 0;
2413
2414 #ifdef WCHAR
2415   /* Initialize the wchar_t PATTERN and offset_buffer.  */
2416   p = pend = pattern = TALLOC(csize + 1, CHAR_T);
2417   mbs_offset = TALLOC(csize + 1, int);
2418   is_binary = TALLOC(csize + 1, char);
2419   if (pattern == NULL || mbs_offset == NULL || is_binary == NULL)
2420     {
2421       free(pattern);
2422       free(mbs_offset);
2423       free(is_binary);
2424       return REG_ESPACE;
2425     }
2426   pattern[csize] = L'\0';       /* sentinel */
2427   size = convert_mbs_to_wcs(pattern, cpattern, csize, mbs_offset, is_binary);
2428   pend = p + size;
2429   if (size < 0)
2430     {
2431       free(pattern);
2432       free(mbs_offset);
2433       free(is_binary);
2434       return REG_BADPAT;
2435     }
2436 #endif
2437
2438 #ifdef DEBUG
2439   DEBUG_PRINT1 ("\nCompiling pattern: ");
2440   if (debug)
2441     {
2442       unsigned debug_count;
2443
2444       for (debug_count = 0; debug_count < size; debug_count++)
2445         PUT_CHAR (pattern[debug_count]);
2446       putchar ('\n');
2447     }
2448 #endif /* DEBUG */
2449
2450   /* Initialize the compile stack.  */
2451   compile_stack.stack = TALLOC (INIT_COMPILE_STACK_SIZE, compile_stack_elt_t);
2452   if (compile_stack.stack == NULL)
2453     {
2454 #ifdef WCHAR
2455       free(pattern);
2456       free(mbs_offset);
2457       free(is_binary);
2458 #endif
2459       return REG_ESPACE;
2460     }
2461
2462   compile_stack.size = INIT_COMPILE_STACK_SIZE;
2463   compile_stack.avail = 0;
2464
2465   /* Initialize the pattern buffer.  */
2466   bufp->syntax = syntax;
2467   bufp->fastmap_accurate = 0;
2468   bufp->not_bol = bufp->not_eol = 0;
2469
2470   /* Set `used' to zero, so that if we return an error, the pattern
2471      printer (for debugging) will think there's no pattern.  We reset it
2472      at the end.  */
2473   bufp->used = 0;
2474
2475   /* Always count groups, whether or not bufp->no_sub is set.  */
2476   bufp->re_nsub = 0;
2477
2478 #if !defined emacs && !defined SYNTAX_TABLE
2479   /* Initialize the syntax table.  */
2480    init_syntax_once ();
2481 #endif
2482
2483   if (bufp->allocated == 0)
2484     {
2485       if (bufp->buffer)
2486         { /* If zero allocated, but buffer is non-null, try to realloc
2487              enough space.  This loses if buffer's address is bogus, but
2488              that is the user's responsibility.  */
2489 #ifdef WCHAR
2490           /* Free bufp->buffer and allocate an array for wchar_t pattern
2491              buffer.  */
2492           free(bufp->buffer);
2493           COMPILED_BUFFER_VAR = TALLOC (INIT_BUF_SIZE/sizeof(UCHAR_T),
2494                                         UCHAR_T);
2495 #else
2496           RETALLOC (COMPILED_BUFFER_VAR, INIT_BUF_SIZE, UCHAR_T);
2497 #endif /* WCHAR */
2498         }
2499       else
2500         { /* Caller did not allocate a buffer.  Do it for them.  */
2501           COMPILED_BUFFER_VAR = TALLOC (INIT_BUF_SIZE / sizeof(UCHAR_T),
2502                                         UCHAR_T);
2503         }
2504
2505       if (!COMPILED_BUFFER_VAR) FREE_STACK_RETURN (REG_ESPACE);
2506 #ifdef WCHAR
2507       bufp->buffer = (char*)COMPILED_BUFFER_VAR;
2508 #endif /* WCHAR */
2509       bufp->allocated = INIT_BUF_SIZE;
2510     }
2511 #ifdef WCHAR
2512   else
2513     COMPILED_BUFFER_VAR = (UCHAR_T*) bufp->buffer;
2514 #endif
2515
2516   begalt = b = COMPILED_BUFFER_VAR;
2517
2518   /* Loop through the uncompiled pattern until we're at the end.  */
2519   while (p != pend)
2520     {
2521       PATFETCH (c);
2522
2523       switch (c)
2524         {
2525         case '^':
2526           {
2527             if (   /* If at start of pattern, it's an operator.  */
2528                    p == pattern + 1
2529                    /* If context independent, it's an operator.  */
2530                 || syntax & RE_CONTEXT_INDEP_ANCHORS
2531                    /* Otherwise, depends on what's come before.  */
2532                 || PREFIX(at_begline_loc_p) (pattern, p, syntax))
2533               BUF_PUSH (begline);
2534             else
2535               goto normal_char;
2536           }
2537           break;
2538
2539
2540         case '$':
2541           {
2542             if (   /* If at end of pattern, it's an operator.  */
2543                    p == pend
2544                    /* If context independent, it's an operator.  */
2545                 || syntax & RE_CONTEXT_INDEP_ANCHORS
2546                    /* Otherwise, depends on what's next.  */
2547                 || PREFIX(at_endline_loc_p) (p, pend, syntax))
2548                BUF_PUSH (endline);
2549              else
2550                goto normal_char;
2551            }
2552            break;
2553
2554
2555         case '+':
2556         case '?':
2557           if ((syntax & RE_BK_PLUS_QM)
2558               || (syntax & RE_LIMITED_OPS))
2559             goto normal_char;
2560         handle_plus:
2561         case '*':
2562           /* If there is no previous pattern... */
2563           if (!laststart)
2564             {
2565               if (syntax & RE_CONTEXT_INVALID_OPS)
2566                 FREE_STACK_RETURN (REG_BADRPT);
2567               else if (!(syntax & RE_CONTEXT_INDEP_OPS))
2568                 goto normal_char;
2569             }
2570
2571           {
2572             /* Are we optimizing this jump?  */
2573             boolean keep_string_p = false;
2574
2575             /* 1 means zero (many) matches is allowed.  */
2576             char zero_times_ok = 0, many_times_ok = 0;
2577
2578             /* If there is a sequence of repetition chars, collapse it
2579                down to just one (the right one).  We can't combine
2580                interval operators with these because of, e.g., `a{2}*',
2581                which should only match an even number of `a's.  */
2582
2583             for (;;)
2584               {
2585                 zero_times_ok |= c != '+';
2586                 many_times_ok |= c != '?';
2587
2588                 if (p == pend)
2589                   break;
2590
2591                 PATFETCH (c);
2592
2593                 if (c == '*'
2594                     || (!(syntax & RE_BK_PLUS_QM) && (c == '+' || c == '?')))
2595                   ;
2596
2597                 else if (syntax & RE_BK_PLUS_QM  &&  c == '\\')
2598                   {
2599                     if (p == pend) FREE_STACK_RETURN (REG_EESCAPE);
2600
2601                     PATFETCH (c1);
2602                     if (!(c1 == '+' || c1 == '?'))
2603                       {
2604                         PATUNFETCH;
2605                         PATUNFETCH;
2606                         break;
2607                       }
2608
2609                     c = c1;
2610                   }
2611                 else
2612                   {
2613                     PATUNFETCH;
2614                     break;
2615                   }
2616
2617                 /* If we get here, we found another repeat character.  */
2618                }
2619
2620             /* Star, etc. applied to an empty pattern is equivalent
2621                to an empty pattern.  */
2622             if (!laststart)
2623               break;
2624
2625             /* Now we know whether or not zero matches is allowed
2626                and also whether or not two or more matches is allowed.  */
2627             if (many_times_ok)
2628               { /* More than one repetition is allowed, so put in at the
2629                    end a backward relative jump from `b' to before the next
2630                    jump we're going to put in below (which jumps from
2631                    laststart to after this jump).
2632
2633                    But if we are at the `*' in the exact sequence `.*\n',
2634                    insert an unconditional jump backwards to the .,
2635                    instead of the beginning of the loop.  This way we only
2636                    push a failure point once, instead of every time
2637                    through the loop.  */
2638                 assert (p - 1 > pattern);
2639
2640                 /* Allocate the space for the jump.  */
2641                 GET_BUFFER_SPACE (1 + OFFSET_ADDRESS_SIZE);
2642
2643                 /* We know we are not at the first character of the pattern,
2644                    because laststart was nonzero.  And we've already
2645                    incremented `p', by the way, to be the character after
2646                    the `*'.  Do we have to do something analogous here
2647                    for null bytes, because of RE_DOT_NOT_NULL?  */
2648                 if (TRANSLATE (*(p - 2)) == TRANSLATE ('.')
2649                     && zero_times_ok
2650                     && p < pend && TRANSLATE (*p) == TRANSLATE ('\n')
2651                     && !(syntax & RE_DOT_NEWLINE))
2652                   { /* We have .*\n.  */
2653                     STORE_JUMP (jump, b, laststart);
2654                     keep_string_p = true;
2655                   }
2656                 else
2657                   /* Anything else.  */
2658                   STORE_JUMP (maybe_pop_jump, b, laststart -
2659                               (1 + OFFSET_ADDRESS_SIZE));
2660
2661                 /* We've added more stuff to the buffer.  */
2662                 b += 1 + OFFSET_ADDRESS_SIZE;
2663               }
2664
2665             /* On failure, jump from laststart to b + 3, which will be the
2666                end of the buffer after this jump is inserted.  */
2667             /* ifdef WCHAR, 'b + 1 + OFFSET_ADDRESS_SIZE' instead of
2668                'b + 3'.  */
2669             GET_BUFFER_SPACE (1 + OFFSET_ADDRESS_SIZE);
2670             INSERT_JUMP (keep_string_p ? on_failure_keep_string_jump
2671                                        : on_failure_jump,
2672                          laststart, b + 1 + OFFSET_ADDRESS_SIZE);
2673             pending_exact = 0;
2674             b += 1 + OFFSET_ADDRESS_SIZE;
2675
2676             if (!zero_times_ok)
2677               {
2678                 /* At least one repetition is required, so insert a
2679                    `dummy_failure_jump' before the initial
2680                    `on_failure_jump' instruction of the loop. This
2681                    effects a skip over that instruction the first time
2682                    we hit that loop.  */
2683                 GET_BUFFER_SPACE (1 + OFFSET_ADDRESS_SIZE);
2684                 INSERT_JUMP (dummy_failure_jump, laststart, laststart +
2685                              2 + 2 * OFFSET_ADDRESS_SIZE);
2686                 b += 1 + OFFSET_ADDRESS_SIZE;
2687               }
2688             }
2689           break;
2690
2691
2692         case '.':
2693           laststart = b;
2694           BUF_PUSH (anychar);
2695           break;
2696
2697
2698         case '[':
2699           {
2700             boolean had_char_class = false;
2701 #ifdef WCHAR
2702             CHAR_T range_start = 0xffffffff;
2703 #else
2704             unsigned int range_start = 0xffffffff;
2705 #endif
2706             if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
2707
2708 #ifdef WCHAR
2709             /* We assume a charset(_not) structure as a wchar_t array.
2710                charset[0] = (re_opcode_t) charset(_not)
2711                charset[1] = l (= length of char_classes)
2712                charset[2] = m (= length of collating_symbols)
2713                charset[3] = n (= length of equivalence_classes)
2714                charset[4] = o (= length of char_ranges)
2715                charset[5] = p (= length of chars)
2716
2717                charset[6] = char_class (wctype_t)
2718                charset[6+CHAR_CLASS_SIZE] = char_class (wctype_t)
2719                          ...
2720                charset[l+5]  = char_class (wctype_t)
2721
2722                charset[l+6]  = collating_symbol (wchar_t)
2723                             ...
2724                charset[l+m+5]  = collating_symbol (wchar_t)
2725                                         ifdef _LIBC we use the index if
2726                                         _NL_COLLATE_SYMB_EXTRAMB instead of
2727                                         wchar_t string.
2728
2729                charset[l+m+6]  = equivalence_classes (wchar_t)
2730                               ...
2731                charset[l+m+n+5]  = equivalence_classes (wchar_t)
2732                                         ifdef _LIBC we use the index in
2733                                         _NL_COLLATE_WEIGHT instead of
2734                                         wchar_t string.
2735
2736                charset[l+m+n+6] = range_start
2737                charset[l+m+n+7] = range_end
2738                                ...
2739                charset[l+m+n+2o+4] = range_start
2740                charset[l+m+n+2o+5] = range_end
2741                                         ifdef _LIBC we use the value looked up
2742                                         in _NL_COLLATE_COLLSEQ instead of
2743                                         wchar_t character.
2744
2745                charset[l+m+n+2o+6] = char
2746                                   ...
2747                charset[l+m+n+2o+p+5] = char
2748
2749              */
2750
2751             /* We need at least 6 spaces: the opcode, the length of
2752                char_classes, the length of collating_symbols, the length of
2753                equivalence_classes, the length of char_ranges, the length of
2754                chars.  */
2755             GET_BUFFER_SPACE (6);
2756
2757             /* Save b as laststart. And We use laststart as the pointer
2758                to the first element of the charset here.
2759                In other words, laststart[i] indicates charset[i].  */
2760             laststart = b;
2761
2762             /* We test `*p == '^' twice, instead of using an if
2763                statement, so we only need one BUF_PUSH.  */
2764             BUF_PUSH (*p == '^' ? charset_not : charset);
2765             if (*p == '^')
2766               p++;
2767
2768             /* Push the length of char_classes, the length of
2769                collating_symbols, the length of equivalence_classes, the
2770                length of char_ranges and the length of chars.  */
2771             BUF_PUSH_3 (0, 0, 0);
2772             BUF_PUSH_2 (0, 0);
2773
2774             /* Remember the first position in the bracket expression.  */
2775             p1 = p;
2776
2777             /* charset_not matches newline according to a syntax bit.  */
2778             if ((re_opcode_t) b[-6] == charset_not
2779                 && (syntax & RE_HAT_LISTS_NOT_NEWLINE))
2780               {
2781                 BUF_PUSH('\n');
2782                 laststart[5]++; /* Update the length of characters  */
2783               }
2784
2785             /* Read in characters and ranges, setting map bits.  */
2786             for (;;)
2787               {
2788                 if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
2789
2790                 PATFETCH (c);
2791
2792                 /* \ might escape characters inside [...] and [^...].  */
2793                 if ((syntax & RE_BACKSLASH_ESCAPE_IN_LISTS) && c == '\\')
2794                   {
2795                     if (p == pend) FREE_STACK_RETURN (REG_EESCAPE);
2796
2797                     PATFETCH (c1);
2798                     BUF_PUSH(c1);
2799                     laststart[5]++; /* Update the length of chars  */
2800                     range_start = c1;
2801                     continue;
2802                   }
2803
2804                 /* Could be the end of the bracket expression.  If it's
2805                    not (i.e., when the bracket expression is `[]' so
2806                    far), the ']' character bit gets set way below.  */
2807                 if (c == ']' && p != p1 + 1)
2808                   break;
2809
2810                 /* Look ahead to see if it's a range when the last thing
2811                    was a character class.  */
2812                 if (had_char_class && c == '-' && *p != ']')
2813                   FREE_STACK_RETURN (REG_ERANGE);
2814
2815                 /* Look ahead to see if it's a range when the last thing
2816                    was a character: if this is a hyphen not at the
2817                    beginning or the end of a list, then it's the range
2818                    operator.  */
2819                 if (c == '-'
2820                     && !(p - 2 >= pattern && p[-2] == '[')
2821                     && !(p - 3 >= pattern && p[-3] == '[' && p[-2] == '^')
2822                     && *p != ']')
2823                   {
2824                     reg_errcode_t ret;
2825                     /* Allocate the space for range_start and range_end.  */
2826                     GET_BUFFER_SPACE (2);
2827                     /* Update the pointer to indicate end of buffer.  */
2828                     b += 2;
2829                     ret = wcs_compile_range (range_start, &p, pend, translate,
2830                                          syntax, b, laststart);
2831                     if (ret != REG_NOERROR) FREE_STACK_RETURN (ret);
2832                     range_start = 0xffffffff;
2833                   }
2834                 else if (p[0] == '-' && p[1] != ']')
2835                   { /* This handles ranges made up of characters only.  */
2836                     reg_errcode_t ret;
2837
2838                     /* Move past the `-'.  */
2839                     PATFETCH (c1);
2840                     /* Allocate the space for range_start and range_end.  */
2841                     GET_BUFFER_SPACE (2);
2842                     /* Update the pointer to indicate end of buffer.  */
2843                     b += 2;
2844                     ret = wcs_compile_range (c, &p, pend, translate, syntax, b,
2845                                          laststart);
2846                     if (ret != REG_NOERROR) FREE_STACK_RETURN (ret);
2847                     range_start = 0xffffffff;
2848                   }
2849
2850                 /* See if we're at the beginning of a possible character
2851                    class.  */
2852                 else if (syntax & RE_CHAR_CLASSES && c == '[' && *p == ':')
2853                   { /* Leave room for the null.  */
2854                     char str[CHAR_CLASS_MAX_LENGTH + 1];
2855
2856                     PATFETCH (c);
2857                     c1 = 0;
2858
2859                     /* If pattern is `[[:'.  */
2860                     if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
2861
2862                     for (;;)
2863                       {
2864                         PATFETCH (c);
2865                         if ((c == ':' && *p == ']') || p == pend)
2866                           break;
2867                         if (c1 < CHAR_CLASS_MAX_LENGTH)
2868                           str[c1++] = c;
2869                         else
2870                           /* This is in any case an invalid class name.  */
2871                           str[0] = '\0';
2872                       }
2873                     str[c1] = '\0';
2874
2875                     /* If isn't a word bracketed by `[:' and `:]':
2876                        undo the ending character, the letters, and leave
2877                        the leading `:' and `[' (but store them as character).  */
2878                     if (c == ':' && *p == ']')
2879                       {
2880                         wctype_t wt;
2881                         uintptr_t alignedp;
2882
2883                         /* Query the character class as wctype_t.  */
2884                         wt = IS_CHAR_CLASS (str);
2885                         if (wt == 0)
2886                           FREE_STACK_RETURN (REG_ECTYPE);
2887
2888                         /* Throw away the ] at the end of the character
2889                            class.  */
2890                         PATFETCH (c);
2891
2892                         if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
2893
2894                         /* Allocate the space for character class.  */
2895                         GET_BUFFER_SPACE(CHAR_CLASS_SIZE);
2896                         /* Update the pointer to indicate end of buffer.  */
2897                         b += CHAR_CLASS_SIZE;
2898                         /* Move data which follow character classes
2899                             not to violate the data.  */
2900                         insert_space(CHAR_CLASS_SIZE,
2901                                      laststart + 6 + laststart[1],
2902                                      b - 1);
2903                         alignedp = ((uintptr_t)(laststart + 6 + laststart[1])
2904                                     + __alignof__(wctype_t) - 1)
2905                                     & ~(uintptr_t)(__alignof__(wctype_t) - 1);
2906                         /* Store the character class.  */
2907                         *((wctype_t*)alignedp) = wt;
2908                         /* Update length of char_classes */
2909                         laststart[1] += CHAR_CLASS_SIZE;
2910
2911                         had_char_class = true;
2912                       }
2913                     else
2914                       {
2915                         c1++;
2916                         while (c1--)
2917                           PATUNFETCH;
2918                         BUF_PUSH ('[');
2919                         BUF_PUSH (':');
2920                         laststart[5] += 2; /* Update the length of characters  */
2921                         range_start = ':';
2922                         had_char_class = false;
2923                       }
2924                   }
2925                 else if (syntax & RE_CHAR_CLASSES && c == '[' && (*p == '='
2926                                                           || *p == '.'))
2927                   {
2928                     CHAR_T str[128];    /* Should be large enough.  */
2929                     CHAR_T delim = *p; /* '=' or '.'  */
2930 # ifdef _LIBC
2931                     uint32_t nrules =
2932                       _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
2933 # endif
2934                     PATFETCH (c);
2935                     c1 = 0;
2936
2937                     /* If pattern is `[[=' or '[[.'.  */
2938                     if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
2939
2940                     for (;;)
2941                       {
2942                         PATFETCH (c);
2943                         if ((c == delim && *p == ']') || p == pend)
2944                           break;
2945                         if (c1 < sizeof (str) - 1)
2946                           str[c1++] = c;
2947                         else
2948                           /* This is in any case an invalid class name.  */
2949                           str[0] = '\0';
2950                       }
2951                     str[c1] = '\0';
2952
2953                     if (c == delim && *p == ']' && str[0] != '\0')
2954                       {
2955                         unsigned int i, offset;
2956                         /* If we have no collation data we use the default
2957                            collation in which each character is in a class
2958                            by itself.  It also means that ASCII is the
2959                            character set and therefore we cannot have character
2960                            with more than one byte in the multibyte
2961                            representation.  */
2962
2963                         /* If not defined _LIBC, we push the name and
2964                            `\0' for the sake of matching performance.  */
2965                         int datasize = c1 + 1;
2966
2967 # ifdef _LIBC
2968                         int32_t idx = 0;
2969                         if (nrules == 0)
2970 # endif
2971                           {
2972                             if (c1 != 1)
2973                               FREE_STACK_RETURN (REG_ECOLLATE);
2974                           }
2975 # ifdef _LIBC
2976                         else
2977                           {
2978                             const int32_t *table;
2979                             const int32_t *weights;
2980                             const int32_t *extra;
2981                             const int32_t *indirect;
2982                             wint_t *cp;
2983
2984                             /* This #include defines a local function!  */
2985 #  include <locale/weightwc.h>
2986
2987                             if(delim == '=')
2988                               {
2989                                 /* We push the index for equivalence class.  */
2990                                 cp = (wint_t*)str;
2991
2992                                 table = (const int32_t *)
2993                                   _NL_CURRENT (LC_COLLATE,
2994                                                _NL_COLLATE_TABLEWC);
2995                                 weights = (const int32_t *)
2996                                   _NL_CURRENT (LC_COLLATE,
2997                                                _NL_COLLATE_WEIGHTWC);
2998                                 extra = (const int32_t *)
2999                                   _NL_CURRENT (LC_COLLATE,
3000                                                _NL_COLLATE_EXTRAWC);
3001                                 indirect = (const int32_t *)
3002                                   _NL_CURRENT (LC_COLLATE,
3003                                                _NL_COLLATE_INDIRECTWC);
3004
3005                                 idx = findidx ((const wint_t**)&cp);
3006                                 if (idx == 0 || cp < (wint_t*) str + c1)
3007                                   /* This is no valid character.  */
3008                                   FREE_STACK_RETURN (REG_ECOLLATE);
3009
3010                                 str[0] = (wchar_t)idx;
3011                               }
3012                             else /* delim == '.' */
3013                               {
3014                                 /* We push collation sequence value
3015                                    for collating symbol.  */
3016                                 int32_t table_size;
3017                                 const int32_t *symb_table;
3018                                 const unsigned char *extra;
3019                                 int32_t idx;
3020                                 int32_t elem;
3021                                 int32_t second;
3022                                 int32_t hash;
3023                                 char char_str[c1];
3024
3025                                 /* We have to convert the name to a single-byte
3026                                    string.  This is possible since the names
3027                                    consist of ASCII characters and the internal
3028                                    representation is UCS4.  */
3029                                 for (i = 0; i < c1; ++i)
3030                                   char_str[i] = str[i];
3031
3032                                 table_size =
3033                                   _NL_CURRENT_WORD (LC_COLLATE,
3034                                                     _NL_COLLATE_SYMB_HASH_SIZEMB);
3035                                 symb_table = (const int32_t *)
3036                                   _NL_CURRENT (LC_COLLATE,
3037                                                _NL_COLLATE_SYMB_TABLEMB);
3038                                 extra = (const unsigned char *)
3039                                   _NL_CURRENT (LC_COLLATE,
3040                                                _NL_COLLATE_SYMB_EXTRAMB);
3041
3042                                 /* Locate the character in the hashing table.  */
3043                                 hash = elem_hash (char_str, c1);
3044
3045                                 idx = 0;
3046                                 elem = hash % table_size;
3047                                 second = hash % (table_size - 2);
3048                                 while (symb_table[2 * elem] != 0)
3049                                   {
3050                                     /* First compare the hashing value.  */
3051                                     if (symb_table[2 * elem] == hash
3052                                         && c1 == extra[symb_table[2 * elem + 1]]
3053                                         && memcmp (char_str,
3054                                                    &extra[symb_table[2 * elem + 1]
3055                                                          + 1], c1) == 0)
3056                                       {
3057                                         /* Yep, this is the entry.  */
3058                                         idx = symb_table[2 * elem + 1];
3059                                         idx += 1 + extra[idx];
3060                                         break;
3061                                       }
3062
3063                                     /* Next entry.  */
3064                                     elem += second;
3065                                   }
3066
3067                                 if (symb_table[2 * elem] != 0)
3068                                   {
3069                                     /* Compute the index of the byte sequence
3070                                        in the table.  */
3071                                     idx += 1 + extra[idx];
3072                                     /* Adjust for the alignment.  */
3073                                     idx = (idx + 3) & ~3;
3074
3075                                     str[0] = (wchar_t) idx + 4;
3076                                   }
3077                                 else if (symb_table[2 * elem] == 0 && c1 == 1)
3078                                   {
3079                                     /* No valid character.  Match it as a
3080                                        single byte character.  */
3081                                     had_char_class = false;
3082                                     BUF_PUSH(str[0]);
3083                                     /* Update the length of characters  */
3084                                     laststart[5]++;
3085                                     range_start = str[0];
3086
3087                                     /* Throw away the ] at the end of the
3088                                        collating symbol.  */
3089                                     PATFETCH (c);
3090                                     /* exit from the switch block.  */
3091                                     continue;
3092                                   }
3093                                 else
3094                                   FREE_STACK_RETURN (REG_ECOLLATE);
3095                               }
3096                             datasize = 1;
3097                           }
3098 # endif
3099                         /* Throw away the ] at the end of the equivalence
3100                            class (or collating symbol).  */
3101                         PATFETCH (c);
3102
3103                         /* Allocate the space for the equivalence class
3104                            (or collating symbol) (and '\0' if needed).  */
3105                         GET_BUFFER_SPACE(datasize);
3106                         /* Update the pointer to indicate end of buffer.  */
3107                         b += datasize;
3108
3109                         if (delim == '=')
3110                           { /* equivalence class  */
3111                             /* Calculate the offset of char_ranges,
3112                                which is next to equivalence_classes.  */
3113                             offset = laststart[1] + laststart[2]
3114                               + laststart[3] +6;
3115                             /* Insert space.  */
3116                             insert_space(datasize, laststart + offset, b - 1);
3117
3118                             /* Write the equivalence_class and \0.  */
3119                             for (i = 0 ; i < datasize ; i++)
3120                               laststart[offset + i] = str[i];
3121
3122                             /* Update the length of equivalence_classes.  */
3123                             laststart[3] += datasize;
3124                             had_char_class = true;
3125                           }
3126                         else /* delim == '.' */
3127                           { /* collating symbol  */
3128                             /* Calculate the offset of the equivalence_classes,
3129                                which is next to collating_symbols.  */
3130                             offset = laststart[1] + laststart[2] + 6;
3131                             /* Insert space and write the collationg_symbol
3132                                and \0.  */
3133                             insert_space(datasize, laststart + offset, b-1);
3134                             for (i = 0 ; i < datasize ; i++)
3135                               laststart[offset + i] = str[i];
3136
3137                             /* In re_match_2_internal if range_start < -1, we
3138                                assume -range_start is the offset of the
3139                                collating symbol which is specified as
3140                                the character of the range start.  So we assign
3141                                -(laststart[1] + laststart[2] + 6) to
3142                                range_start.  */
3143                             range_start = -(laststart[1] + laststart[2] + 6);
3144                             /* Update the length of collating_symbol.  */
3145                             laststart[2] += datasize;
3146                             had_char_class = false;
3147                           }
3148                       }
3149                     else
3150                       {
3151                         c1++;
3152                         while (c1--)
3153                           PATUNFETCH;
3154                         BUF_PUSH ('[');
3155                         BUF_PUSH (delim);
3156                         laststart[5] += 2; /* Update the length of characters  */
3157                         range_start = delim;
3158                         had_char_class = false;
3159                       }
3160                   }
3161                 else
3162                   {
3163                     had_char_class = false;
3164                     BUF_PUSH(c);
3165                     laststart[5]++;  /* Update the length of characters  */
3166                     range_start = c;
3167                   }
3168               }
3169
3170 #else /* BYTE */
3171             /* Ensure that we have enough space to push a charset: the
3172                opcode, the length count, and the bitset; 34 bytes in all.  */
3173             GET_BUFFER_SPACE (34);
3174
3175             laststart = b;
3176
3177             /* We test `*p == '^' twice, instead of using an if
3178                statement, so we only need one BUF_PUSH.  */
3179             BUF_PUSH (*p == '^' ? charset_not : charset);
3180             if (*p == '^')
3181               p++;
3182
3183             /* Remember the first position in the bracket expression.  */
3184             p1 = p;
3185
3186             /* Push the number of bytes in the bitmap.  */
3187             BUF_PUSH ((1 << BYTEWIDTH) / BYTEWIDTH);
3188
3189             /* Clear the whole map.  */
3190             bzero (b, (1 << BYTEWIDTH) / BYTEWIDTH);
3191
3192             /* charset_not matches newline according to a syntax bit.  */
3193             if ((re_opcode_t) b[-2] == charset_not
3194                 && (syntax & RE_HAT_LISTS_NOT_NEWLINE))
3195               SET_LIST_BIT ('\n');
3196
3197             /* Read in characters and ranges, setting map bits.  */
3198             for (;;)
3199               {
3200                 if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
3201
3202                 PATFETCH (c);
3203
3204                 /* \ might escape characters inside [...] and [^...].  */
3205                 if ((syntax & RE_BACKSLASH_ESCAPE_IN_LISTS) && c == '\\')
3206                   {
3207                     if (p == pend) FREE_STACK_RETURN (REG_EESCAPE);
3208
3209                     PATFETCH (c1);
3210                     SET_LIST_BIT (c1);
3211                     range_start = c1;
3212                     continue;
3213                   }
3214
3215                 /* Could be the end of the bracket expression.  If it's
3216                    not (i.e., when the bracket expression is `[]' so
3217                    far), the ']' character bit gets set way below.  */
3218                 if (c == ']' && p != p1 + 1)
3219                   break;
3220
3221                 /* Look ahead to see if it's a range when the last thing
3222                    was a character class.  */
3223                 if (had_char_class && c == '-' && *p != ']')
3224                   FREE_STACK_RETURN (REG_ERANGE);
3225
3226                 /* Look ahead to see if it's a range when the last thing
3227                    was a character: if this is a hyphen not at the
3228                    beginning or the end of a list, then it's the range
3229                    operator.  */
3230                 if (c == '-'
3231                     && !(p - 2 >= pattern && p[-2] == '[')
3232                     && !(p - 3 >= pattern && p[-3] == '[' && p[-2] == '^')
3233                     && *p != ']')
3234                   {
3235                     reg_errcode_t ret
3236                       = byte_compile_range (range_start, &p, pend, translate,
3237                                             syntax, b);
3238                     if (ret != REG_NOERROR) FREE_STACK_RETURN (ret);
3239                     range_start = 0xffffffff;
3240                   }
3241
3242                 else if (p[0] == '-' && p[1] != ']')
3243                   { /* This handles ranges made up of characters only.  */
3244                     reg_errcode_t ret;
3245
3246                     /* Move past the `-'.  */
3247                     PATFETCH (c1);
3248
3249                     ret = byte_compile_range (c, &p, pend, translate, syntax, b);
3250                     if (ret != REG_NOERROR) FREE_STACK_RETURN (ret);
3251                     range_start = 0xffffffff;
3252                   }
3253
3254                 /* See if we're at the beginning of a possible character
3255                    class.  */
3256
3257                 else if (syntax & RE_CHAR_CLASSES && c == '[' && *p == ':')
3258                   { /* Leave room for the null.  */
3259                     char str[CHAR_CLASS_MAX_LENGTH + 1];
3260
3261                     PATFETCH (c);
3262                     c1 = 0;
3263
3264                     /* If pattern is `[[:'.  */
3265                     if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
3266
3267                     for (;;)
3268                       {
3269                         PATFETCH (c);
3270                         if ((c == ':' && *p == ']') || p == pend)
3271                           break;
3272                         if (c1 < CHAR_CLASS_MAX_LENGTH)
3273                           str[c1++] = c;
3274                         else
3275                           /* This is in any case an invalid class name.  */
3276                           str[0] = '\0';
3277                       }
3278                     str[c1] = '\0';
3279
3280                     /* If isn't a word bracketed by `[:' and `:]':
3281                        undo the ending character, the letters, and leave
3282                        the leading `:' and `[' (but set bits for them).  */
3283                     if (c == ':' && *p == ']')
3284                       {
3285 # if defined _LIBC || WIDE_CHAR_SUPPORT
3286                         boolean is_lower = STREQ (str, "lower");
3287                         boolean is_upper = STREQ (str, "upper");
3288                         wctype_t wt;
3289                         int ch;
3290
3291                         wt = IS_CHAR_CLASS (str);
3292                         if (wt == 0)
3293                           FREE_STACK_RETURN (REG_ECTYPE);
3294
3295                         /* Throw away the ] at the end of the character
3296                            class.  */
3297                         PATFETCH (c);
3298
3299                         if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
3300
3301                         for (ch = 0; ch < 1 << BYTEWIDTH; ++ch)
3302                           {
3303 #  ifdef _LIBC
3304                             if (__iswctype (__btowc (ch), wt))
3305                               SET_LIST_BIT (ch);
3306 #  else
3307                             if (iswctype (btowc (ch), wt))
3308                               SET_LIST_BIT (ch);
3309 #  endif
3310
3311                             if (translate && (is_upper || is_lower)
3312                                 && (ISUPPER (ch) || ISLOWER (ch)))
3313                               SET_LIST_BIT (ch);
3314                           }
3315
3316                         had_char_class = true;
3317 # else
3318                         int ch;
3319                         boolean is_alnum = STREQ (str, "alnum");
3320                         boolean is_alpha = STREQ (str, "alpha");
3321                         boolean is_blank = STREQ (str, "blank");
3322                         boolean is_cntrl = STREQ (str, "cntrl");
3323                         boolean is_digit = STREQ (str, "digit");
3324                         boolean is_graph = STREQ (str, "graph");
3325                         boolean is_lower = STREQ (str, "lower");
3326                         boolean is_print = STREQ (str, "print");
3327                         boolean is_punct = STREQ (str, "punct");
3328                         boolean is_space = STREQ (str, "space");
3329                         boolean is_upper = STREQ (str, "upper");
3330                         boolean is_xdigit = STREQ (str, "xdigit");
3331
3332                         if (!IS_CHAR_CLASS (str))
3333                           FREE_STACK_RETURN (REG_ECTYPE);
3334
3335                         /* Throw away the ] at the end of the character
3336                            class.  */
3337                         PATFETCH (c);
3338
3339                         if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
3340
3341                         for (ch = 0; ch < 1 << BYTEWIDTH; ch++)
3342                           {
3343                             /* This was split into 3 if's to
3344                                avoid an arbitrary limit in some compiler.  */
3345                             if (   (is_alnum  && ISALNUM (ch))
3346                                 || (is_alpha  && ISALPHA (ch))
3347                                 || (is_blank  && ISBLANK (ch))
3348                                 || (is_cntrl  && ISCNTRL (ch)))
3349                               SET_LIST_BIT (ch);
3350                             if (   (is_digit  && ISDIGIT (ch))
3351                                 || (is_graph  && ISGRAPH (ch))
3352                                 || (is_lower  && ISLOWER (ch))
3353                                 || (is_print  && ISPRINT (ch)))
3354                               SET_LIST_BIT (ch);
3355                             if (   (is_punct  && ISPUNCT (ch))
3356                                 || (is_space  && ISSPACE (ch))
3357                                 || (is_upper  && ISUPPER (ch))
3358                                 || (is_xdigit && ISXDIGIT (ch)))
3359                               SET_LIST_BIT (ch);
3360                             if (   translate && (is_upper || is_lower)
3361                                 && (ISUPPER (ch) || ISLOWER (ch)))
3362                               SET_LIST_BIT (ch);
3363                           }
3364                         had_char_class = true;
3365 # endif /* libc || wctype.h */
3366                       }
3367                     else
3368                       {
3369                         c1++;
3370                         while (c1--)
3371                           PATUNFETCH;
3372                         SET_LIST_BIT ('[');
3373                         SET_LIST_BIT (':');
3374                         range_start = ':';
3375                         had_char_class = false;
3376                       }
3377                   }
3378                 else if (syntax & RE_CHAR_CLASSES && c == '[' && *p == '=')
3379                   {
3380                     unsigned char str[MB_LEN_MAX + 1];
3381 # ifdef _LIBC
3382                     uint32_t nrules =
3383                       _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
3384 # endif
3385
3386                     PATFETCH (c);
3387                     c1 = 0;
3388
3389                     /* If pattern is `[[='.  */
3390                     if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
3391
3392                     for (;;)
3393                       {
3394                         PATFETCH (c);
3395                         if ((c == '=' && *p == ']') || p == pend)
3396                           break;
3397                         if (c1 < MB_LEN_MAX)
3398                           str[c1++] = c;
3399                         else
3400                           /* This is in any case an invalid class name.  */
3401                           str[0] = '\0';
3402                       }
3403                     str[c1] = '\0';
3404
3405                     if (c == '=' && *p == ']' && str[0] != '\0')
3406                       {
3407                         /* If we have no collation data we use the default
3408                            collation in which each character is in a class
3409                            by itself.  It also means that ASCII is the
3410                            character set and therefore we cannot have character
3411                            with more than one byte in the multibyte
3412                            representation.  */
3413 # ifdef _LIBC
3414                         if (nrules == 0)
3415 # endif
3416                           {
3417                             if (c1 != 1)
3418                               FREE_STACK_RETURN (REG_ECOLLATE);
3419
3420                             /* Throw away the ] at the end of the equivalence
3421                                class.  */
3422                             PATFETCH (c);
3423
3424                             /* Set the bit for the character.  */
3425                             SET_LIST_BIT (str[0]);
3426                           }
3427 # ifdef _LIBC
3428                         else
3429                           {
3430                             /* Try to match the byte sequence in `str' against
3431                                those known to the collate implementation.
3432                                First find out whether the bytes in `str' are
3433                                actually from exactly one character.  */
3434                             const int32_t *table;
3435                             const unsigned char *weights;
3436                             const unsigned char *extra;
3437                             const int32_t *indirect;
3438                             int32_t idx;
3439                             const unsigned char *cp = str;
3440                             int ch;
3441
3442                             /* This #include defines a local function!  */
3443 #  include <locale/weight.h>
3444
3445                             table = (const int32_t *)
3446                               _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB);
3447                             weights = (const unsigned char *)
3448                               _NL_CURRENT (LC_COLLATE, _NL_COLLATE_WEIGHTMB);
3449                             extra = (const unsigned char *)
3450                               _NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAMB);
3451                             indirect = (const int32_t *)
3452                               _NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTMB);
3453
3454                             idx = findidx (&cp);
3455                             if (idx == 0 || cp < str + c1)
3456                               /* This is no valid character.  */
3457                               FREE_STACK_RETURN (REG_ECOLLATE);
3458
3459                             /* Throw away the ] at the end of the equivalence
3460                                class.  */
3461                             PATFETCH (c);
3462
3463                             /* Now we have to go throught the whole table
3464                                and find all characters which have the same
3465                                first level weight.
3466
3467                                XXX Note that this is not entirely correct.
3468                                we would have to match multibyte sequences
3469                                but this is not possible with the current
3470                                implementation.  */
3471                             for (ch = 1; ch < 256; ++ch)
3472                               /* XXX This test would have to be changed if we
3473                                  would allow matching multibyte sequences.  */
3474                               if (table[ch] > 0)
3475                                 {
3476                                   int32_t idx2 = table[ch];
3477                                   size_t len = weights[idx2];
3478
3479                                   /* Test whether the lenghts match.  */
3480                                   if (weights[idx] == len)
3481                                     {
3482                                       /* They do.  New compare the bytes of
3483                                          the weight.  */
3484                                       size_t cnt = 0;
3485
3486                                       while (cnt < len
3487                                              && (weights[idx + 1 + cnt]
3488                                                  == weights[idx2 + 1 + cnt]))
3489                                         ++cnt;
3490
3491                                       if (cnt == len)
3492                                         /* They match.  Mark the character as
3493                                            acceptable.  */
3494                                         SET_LIST_BIT (ch);
3495                                     }
3496                                 }
3497                           }
3498 # endif
3499                         had_char_class = true;
3500                       }
3501                     else
3502                       {
3503                         c1++;
3504                         while (c1--)
3505                           PATUNFETCH;
3506                         SET_LIST_BIT ('[');
3507                         SET_LIST_BIT ('=');
3508                         range_start = '=';
3509                         had_char_class = false;
3510                       }
3511                   }
3512                 else if (syntax & RE_CHAR_CLASSES && c == '[' && *p == '.')
3513                   {
3514                     unsigned char str[128];     /* Should be large enough.  */
3515 # ifdef _LIBC
3516                     uint32_t nrules =
3517                       _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
3518 # endif
3519
3520                     PATFETCH (c);
3521                     c1 = 0;
3522
3523                     /* If pattern is `[[.'.  */
3524                     if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
3525
3526                     for (;;)
3527                       {
3528                         PATFETCH (c);
3529                         if ((c == '.' && *p == ']') || p == pend)
3530                           break;
3531                         if (c1 < sizeof (str))
3532                           str[c1++] = c;
3533                         else
3534                           /* This is in any case an invalid class name.  */
3535                           str[0] = '\0';
3536                       }
3537                     str[c1] = '\0';
3538
3539                     if (c == '.' && *p == ']' && str[0] != '\0')
3540                       {
3541                         /* If we have no collation data we use the default
3542                            collation in which each character is the name
3543                            for its own class which contains only the one
3544                            character.  It also means that ASCII is the
3545                            character set and therefore we cannot have character
3546                            with more than one byte in the multibyte
3547                            representation.  */
3548 # ifdef _LIBC
3549                         if (nrules == 0)
3550 # endif
3551                           {
3552                             if (c1 != 1)
3553                               FREE_STACK_RETURN (REG_ECOLLATE);
3554
3555                             /* Throw away the ] at the end of the equivalence
3556                                class.  */
3557                             PATFETCH (c);
3558
3559                             /* Set the bit for the character.  */
3560                             SET_LIST_BIT (str[0]);
3561                             range_start = ((const unsigned char *) str)[0];
3562                           }
3563 # ifdef _LIBC
3564                         else
3565                           {
3566                             /* Try to match the byte sequence in `str' against
3567                                those known to the collate implementation.
3568                                First find out whether the bytes in `str' are
3569                                actually from exactly one character.  */
3570                             int32_t table_size;
3571                             const int32_t *symb_table;
3572                             const unsigned char *extra;
3573                             int32_t idx;
3574                             int32_t elem;
3575                             int32_t second;
3576                             int32_t hash;
3577
3578                             table_size =
3579                               _NL_CURRENT_WORD (LC_COLLATE,
3580                                                 _NL_COLLATE_SYMB_HASH_SIZEMB);
3581                             symb_table = (const int32_t *)
3582                               _NL_CURRENT (LC_COLLATE,
3583                                            _NL_COLLATE_SYMB_TABLEMB);
3584                             extra = (const unsigned char *)
3585                               _NL_CURRENT (LC_COLLATE,
3586                                            _NL_COLLATE_SYMB_EXTRAMB);
3587
3588                             /* Locate the character in the hashing table.  */
3589                             hash = elem_hash (str, c1);
3590
3591                             idx = 0;
3592                             elem = hash % table_size;
3593                             second = hash % (table_size - 2);
3594                             while (symb_table[2 * elem] != 0)
3595                               {
3596                                 /* First compare the hashing value.  */
3597                                 if (symb_table[2 * elem] == hash
3598                                     && c1 == extra[symb_table[2 * elem + 1]]
3599                                     && memcmp (str,
3600                                                &extra[symb_table[2 * elem + 1]
3601                                                      + 1],
3602                                                c1) == 0)
3603                                   {
3604                                     /* Yep, this is the entry.  */
3605                                     idx = symb_table[2 * elem + 1];
3606                                     idx += 1 + extra[idx];
3607                                     break;
3608                                   }
3609
3610                                 /* Next entry.  */
3611                                 elem += second;
3612                               }
3613
3614                             if (symb_table[2 * elem] == 0)
3615                               /* This is no valid character.  */
3616                               FREE_STACK_RETURN (REG_ECOLLATE);
3617
3618                             /* Throw away the ] at the end of the equivalence
3619                                class.  */
3620                             PATFETCH (c);
3621
3622                             /* Now add the multibyte character(s) we found
3623                                to the accept list.
3624
3625                                XXX Note that this is not entirely correct.
3626                                we would have to match multibyte sequences
3627                                but this is not possible with the current
3628                                implementation.  Also, we have to match
3629                                collating symbols, which expand to more than
3630                                one file, as a whole and not allow the
3631                                individual bytes.  */
3632                             c1 = extra[idx++];
3633                             if (c1 == 1)
3634                               range_start = extra[idx];
3635                             while (c1-- > 0)
3636                               {
3637                                 SET_LIST_BIT (extra[idx]);
3638                                 ++idx;
3639                               }
3640                           }
3641 # endif
3642                         had_char_class = false;
3643                       }
3644                     else
3645                       {
3646                         c1++;
3647                         while (c1--)
3648                           PATUNFETCH;
3649                         SET_LIST_BIT ('[');
3650                         SET_LIST_BIT ('.');
3651                         range_start = '.';
3652                         had_char_class = false;
3653                       }
3654                   }
3655                 else
3656                   {
3657                     had_char_class = false;
3658                     SET_LIST_BIT (c);
3659                     range_start = c;
3660                   }
3661               }
3662
3663             /* Discard any (non)matching list bytes that are all 0 at the
3664                end of the map.  Decrease the map-length byte too.  */
3665             while ((int) b[-1] > 0 && b[b[-1] - 1] == 0)
3666               b[-1]--;
3667             b += b[-1];
3668 #endif /* WCHAR */
3669           }
3670           break;
3671
3672
3673         case '(':
3674           if (syntax & RE_NO_BK_PARENS)
3675             goto handle_open;
3676           else
3677             goto normal_char;
3678
3679
3680         case ')':
3681           if (syntax & RE_NO_BK_PARENS)
3682             goto handle_close;
3683           else
3684             goto normal_char;
3685
3686
3687         case '\n':
3688           if (syntax & RE_NEWLINE_ALT)
3689             goto handle_alt;
3690           else
3691             goto normal_char;
3692
3693
3694         case '|':
3695           if (syntax & RE_NO_BK_VBAR)
3696             goto handle_alt;
3697           else
3698             goto normal_char;
3699
3700
3701         case '{':
3702            if (syntax & RE_INTERVALS && syntax & RE_NO_BK_BRACES)
3703              goto handle_interval;
3704            else
3705              goto normal_char;
3706
3707
3708         case '\\':
3709           if (p == pend) FREE_STACK_RETURN (REG_EESCAPE);
3710
3711           /* Do not translate the character after the \, so that we can
3712              distinguish, e.g., \B from \b, even if we normally would
3713              translate, e.g., B to b.  */
3714           PATFETCH_RAW (c);
3715
3716           switch (c)
3717             {
3718             case '(':
3719               if (syntax & RE_NO_BK_PARENS)
3720                 goto normal_backslash;
3721
3722             handle_open:
3723               bufp->re_nsub++;
3724               regnum++;
3725
3726               if (COMPILE_STACK_FULL)
3727                 {
3728                   RETALLOC (compile_stack.stack, compile_stack.size << 1,
3729                             compile_stack_elt_t);
3730                   if (compile_stack.stack == NULL) return REG_ESPACE;
3731
3732                   compile_stack.size <<= 1;
3733                 }
3734
3735               /* These are the values to restore when we hit end of this
3736                  group.  They are all relative offsets, so that if the
3737                  whole pattern moves because of realloc, they will still
3738                  be valid.  */
3739               COMPILE_STACK_TOP.begalt_offset = begalt - COMPILED_BUFFER_VAR;
3740               COMPILE_STACK_TOP.fixup_alt_jump
3741                 = fixup_alt_jump ? fixup_alt_jump - COMPILED_BUFFER_VAR + 1 : 0;
3742               COMPILE_STACK_TOP.laststart_offset = b - COMPILED_BUFFER_VAR;
3743               COMPILE_STACK_TOP.regnum = regnum;
3744
3745               /* We will eventually replace the 0 with the number of
3746                  groups inner to this one.  But do not push a
3747                  start_memory for groups beyond the last one we can
3748                  represent in the compiled pattern.  */
3749               if (regnum <= MAX_REGNUM)
3750                 {
3751                   COMPILE_STACK_TOP.inner_group_offset = b
3752                     - COMPILED_BUFFER_VAR + 2;
3753                   BUF_PUSH_3 (start_memory, regnum, 0);
3754                 }
3755
3756               compile_stack.avail++;
3757
3758               fixup_alt_jump = 0;
3759               laststart = 0;
3760               begalt = b;
3761               /* If we've reached MAX_REGNUM groups, then this open
3762                  won't actually generate any code, so we'll have to
3763                  clear pending_exact explicitly.  */
3764               pending_exact = 0;
3765               break;
3766
3767
3768             case ')':
3769               if (syntax & RE_NO_BK_PARENS) goto normal_backslash;
3770
3771               if (COMPILE_STACK_EMPTY)
3772                 {
3773                   if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD)
3774                     goto normal_backslash;
3775                   else
3776                     FREE_STACK_RETURN (REG_ERPAREN);
3777                 }
3778
3779             handle_close:
3780               if (fixup_alt_jump)
3781                 { /* Push a dummy failure point at the end of the
3782                      alternative for a possible future
3783                      `pop_failure_jump' to pop.  See comments at
3784                      `push_dummy_failure' in `re_match_2'.  */
3785                   BUF_PUSH (push_dummy_failure);
3786
3787                   /* We allocated space for this jump when we assigned
3788                      to `fixup_alt_jump', in the `handle_alt' case below.  */
3789                   STORE_JUMP (jump_past_alt, fixup_alt_jump, b - 1);
3790                 }
3791
3792               /* See similar code for backslashed left paren above.  */
3793               if (COMPILE_STACK_EMPTY)
3794                 {
3795                   if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD)
3796                     goto normal_char;
3797                   else
3798                     FREE_STACK_RETURN (REG_ERPAREN);
3799                 }
3800
3801               /* Since we just checked for an empty stack above, this
3802                  ``can't happen''.  */
3803               assert (compile_stack.avail != 0);
3804               {
3805                 /* We don't just want to restore into `regnum', because
3806                    later groups should continue to be numbered higher,
3807                    as in `(ab)c(de)' -- the second group is #2.  */
3808                 regnum_t this_group_regnum;
3809
3810                 compile_stack.avail--;
3811                 begalt = COMPILED_BUFFER_VAR + COMPILE_STACK_TOP.begalt_offset;
3812                 fixup_alt_jump
3813                   = COMPILE_STACK_TOP.fixup_alt_jump
3814                     ? COMPILED_BUFFER_VAR + COMPILE_STACK_TOP.fixup_alt_jump - 1
3815                     : 0;
3816                 laststart = COMPILED_BUFFER_VAR + COMPILE_STACK_TOP.laststart_offset;
3817                 this_group_regnum = COMPILE_STACK_TOP.regnum;
3818                 /* If we've reached MAX_REGNUM groups, then this open
3819                    won't actually generate any code, so we'll have to
3820                    clear pending_exact explicitly.  */
3821                 pending_exact = 0;
3822
3823                 /* We're at the end of the group, so now we know how many
3824                    groups were inside this one.  */
3825                 if (this_group_regnum <= MAX_REGNUM)
3826                   {
3827                     UCHAR_T *inner_group_loc
3828                       = COMPILED_BUFFER_VAR + COMPILE_STACK_TOP.inner_group_offset;
3829
3830                     *inner_group_loc = regnum - this_group_regnum;
3831                     BUF_PUSH_3 (stop_memory, this_group_regnum,
3832                                 regnum - this_group_regnum);
3833                   }
3834               }
3835               break;
3836
3837
3838             case '|':                                   /* `\|'.  */
3839               if (syntax & RE_LIMITED_OPS || syntax & RE_NO_BK_VBAR)
3840                 goto normal_backslash;
3841             handle_alt:
3842               if (syntax & RE_LIMITED_OPS)
3843                 goto normal_char;
3844
3845               /* Insert before the previous alternative a jump which
3846                  jumps to this alternative if the former fails.  */
3847               GET_BUFFER_SPACE (1 + OFFSET_ADDRESS_SIZE);
3848               INSERT_JUMP (on_failure_jump, begalt,
3849                            b + 2 + 2 * OFFSET_ADDRESS_SIZE);
3850               pending_exact = 0;
3851               b += 1 + OFFSET_ADDRESS_SIZE;
3852
3853               /* The alternative before this one has a jump after it
3854                  which gets executed if it gets matched.  Adjust that
3855                  jump so it will jump to this alternative's analogous
3856                  jump (put in below, which in turn will jump to the next
3857                  (if any) alternative's such jump, etc.).  The last such
3858                  jump jumps to the correct final destination.  A picture:
3859                           _____ _____
3860                           |   | |   |
3861                           |   v |   v
3862                          a | b   | c
3863
3864                  If we are at `b', then fixup_alt_jump right now points to a
3865                  three-byte space after `a'.  We'll put in the jump, set
3866                  fixup_alt_jump to right after `b', and leave behind three
3867                  bytes which we'll fill in when we get to after `c'.  */
3868
3869               if (fixup_alt_jump)
3870                 STORE_JUMP (jump_past_alt, fixup_alt_jump, b);
3871
3872               /* Mark and leave space for a jump after this alternative,
3873                  to be filled in later either by next alternative or
3874                  when know we're at the end of a series of alternatives.  */
3875               fixup_alt_jump = b;
3876               GET_BUFFER_SPACE (1 + OFFSET_ADDRESS_SIZE);
3877               b += 1 + OFFSET_ADDRESS_SIZE;
3878
3879               laststart = 0;
3880               begalt = b;
3881               break;
3882
3883
3884             case '{':
3885               /* If \{ is a literal.  */
3886               if (!(syntax & RE_INTERVALS)
3887                      /* If we're at `\{' and it's not the open-interval
3888                         operator.  */
3889                   || (syntax & RE_NO_BK_BRACES))
3890                 goto normal_backslash;
3891
3892             handle_interval:
3893               {
3894                 /* If got here, then the syntax allows intervals.  */
3895
3896                 /* At least (most) this many matches must be made.  */
3897                 int lower_bound = -1, upper_bound = -1;
3898
3899                 /* Place in the uncompiled pattern (i.e., just after
3900                    the '{') to go back to if the interval is invalid.  */
3901                 const CHAR_T *beg_interval = p;
3902
3903                 if (p == pend)
3904                   goto invalid_interval;
3905
3906                 GET_UNSIGNED_NUMBER (lower_bound);
3907
3908                 if (c == ',')
3909                   {
3910                     GET_UNSIGNED_NUMBER (upper_bound);
3911                     if (upper_bound < 0)
3912                       upper_bound = RE_DUP_MAX;
3913                   }
3914                 else
3915                   /* Interval such as `{1}' => match exactly once. */
3916                   upper_bound = lower_bound;
3917
3918                 if (! (0 <= lower_bound && lower_bound <= upper_bound))
3919                   goto invalid_interval;
3920
3921                 if (!(syntax & RE_NO_BK_BRACES))
3922                   {
3923                     if (c != '\\' || p == pend)
3924                       goto invalid_interval;
3925                     PATFETCH (c);
3926                   }
3927
3928                 if (c != '}')
3929                   goto invalid_interval;
3930
3931                 /* If it's invalid to have no preceding re.  */
3932                 if (!laststart)
3933                   {
3934                     if (syntax & RE_CONTEXT_INVALID_OPS
3935                         && !(syntax & RE_INVALID_INTERVAL_ORD))
3936                       FREE_STACK_RETURN (REG_BADRPT);
3937                     else if (syntax & RE_CONTEXT_INDEP_OPS)
3938                       laststart = b;
3939                     else
3940                       goto unfetch_interval;
3941                   }
3942
3943                 /* We just parsed a valid interval.  */
3944
3945                 if (RE_DUP_MAX < upper_bound)
3946                   FREE_STACK_RETURN (REG_BADBR);
3947
3948                 /* If the upper bound is zero, don't want to succeed at
3949                    all; jump from `laststart' to `b + 3', which will be
3950                    the end of the buffer after we insert the jump.  */
3951                 /* ifdef WCHAR, 'b + 1 + OFFSET_ADDRESS_SIZE'
3952                    instead of 'b + 3'.  */
3953                  if (upper_bound == 0)
3954                    {
3955                      GET_BUFFER_SPACE (1 + OFFSET_ADDRESS_SIZE);
3956                      INSERT_JUMP (jump, laststart, b + 1
3957                                   + OFFSET_ADDRESS_SIZE);
3958                      b += 1 + OFFSET_ADDRESS_SIZE;
3959                    }
3960
3961                  /* Otherwise, we have a nontrivial interval.  When
3962                     we're all done, the pattern will look like:
3963                       set_number_at <jump count> <upper bound>
3964                       set_number_at <succeed_n count> <lower bound>
3965                       succeed_n <after jump addr> <succeed_n count>
3966                       <body of loop>
3967                       jump_n <succeed_n addr> <jump count>
3968                     (The upper bound and `jump_n' are omitted if
3969                     `upper_bound' is 1, though.)  */
3970                  else
3971                    { /* If the upper bound is > 1, we need to insert
3972                         more at the end of the loop.  */
3973                      unsigned nbytes = 2 + 4 * OFFSET_ADDRESS_SIZE +
3974                        (upper_bound > 1) * (2 + 4 * OFFSET_ADDRESS_SIZE);
3975
3976                      GET_BUFFER_SPACE (nbytes);
3977
3978                      /* Initialize lower bound of the `succeed_n', even
3979                         though it will be set during matching by its
3980                         attendant `set_number_at' (inserted next),
3981                         because `re_compile_fastmap' needs to know.
3982                         Jump to the `jump_n' we might insert below.  */
3983                      INSERT_JUMP2 (succeed_n, laststart,
3984                                    b + 1 + 2 * OFFSET_ADDRESS_SIZE
3985                                    + (upper_bound > 1) * (1 + 2 * OFFSET_ADDRESS_SIZE)
3986                                    , lower_bound);
3987                      b += 1 + 2 * OFFSET_ADDRESS_SIZE;
3988
3989                      /* Code to initialize the lower bound.  Insert
3990                         before the `succeed_n'.  The `5' is the last two
3991                         bytes of this `set_number_at', plus 3 bytes of
3992                         the following `succeed_n'.  */
3993                      /* ifdef WCHAR, The '1+2*OFFSET_ADDRESS_SIZE'
3994                         is the 'set_number_at', plus '1+OFFSET_ADDRESS_SIZE'
3995                         of the following `succeed_n'.  */
3996                      PREFIX(insert_op2) (set_number_at, laststart, 1
3997                                  + 2 * OFFSET_ADDRESS_SIZE, lower_bound, b);
3998                      b += 1 + 2 * OFFSET_ADDRESS_SIZE;
3999
4000                      if (upper_bound > 1)
4001                        { /* More than one repetition is allowed, so
4002                             append a backward jump to the `succeed_n'
4003                             that starts this interval.
4004
4005                             When we've reached this during matching,
4006                             we'll have matched the interval once, so
4007                             jump back only `upper_bound - 1' times.  */
4008                          STORE_JUMP2 (jump_n, b, laststart
4009                                       + 2 * OFFSET_ADDRESS_SIZE + 1,
4010                                       upper_bound - 1);
4011                          b += 1 + 2 * OFFSET_ADDRESS_SIZE;
4012
4013                          /* The location we want to set is the second
4014                             parameter of the `jump_n'; that is `b-2' as
4015                             an absolute address.  `laststart' will be
4016                             the `set_number_at' we're about to insert;
4017                             `laststart+3' the number to set, the source
4018                             for the relative address.  But we are
4019                             inserting into the middle of the pattern --
4020                             so everything is getting moved up by 5.
4021                             Conclusion: (b - 2) - (laststart + 3) + 5,
4022                             i.e., b - laststart.
4023
4024                             We insert this at the beginning of the loop
4025                             so that if we fail during matching, we'll
4026                             reinitialize the bounds.  */
4027                          PREFIX(insert_op2) (set_number_at, laststart,
4028                                              b - laststart,
4029                                              upper_bound - 1, b);
4030                          b += 1 + 2 * OFFSET_ADDRESS_SIZE;
4031                        }
4032                    }
4033                 pending_exact = 0;
4034                 break;
4035
4036               invalid_interval:
4037                 if (!(syntax & RE_INVALID_INTERVAL_ORD))
4038                   FREE_STACK_RETURN (p == pend ? REG_EBRACE : REG_BADBR);
4039               unfetch_interval:
4040                 /* Match the characters as literals.  */
4041                 p = beg_interval;
4042                 c = '{';
4043                 if (syntax & RE_NO_BK_BRACES)
4044                   goto normal_char;
4045                 else
4046                   goto normal_backslash;
4047               }
4048
4049 #ifdef emacs
4050             /* There is no way to specify the before_dot and after_dot
4051                operators.  rms says this is ok.  --karl  */
4052             case '=':
4053               BUF_PUSH (at_dot);
4054               break;
4055
4056             case 's':
4057               laststart = b;
4058               PATFETCH (c);
4059               BUF_PUSH_2 (syntaxspec, syntax_spec_code[c]);
4060               break;
4061
4062             case 'S':
4063               laststart = b;
4064               PATFETCH (c);
4065               BUF_PUSH_2 (notsyntaxspec, syntax_spec_code[c]);
4066               break;
4067 #endif /* emacs */
4068
4069
4070             case 'w':
4071               if (syntax & RE_NO_GNU_OPS)
4072                 goto normal_char;
4073               laststart = b;
4074               BUF_PUSH (wordchar);
4075               break;
4076
4077
4078             case 'W':
4079               if (syntax & RE_NO_GNU_OPS)
4080                 goto normal_char;
4081               laststart = b;
4082               BUF_PUSH (notwordchar);
4083               break;
4084
4085
4086             case '<':
4087               if (syntax & RE_NO_GNU_OPS)
4088                 goto normal_char;
4089               BUF_PUSH (wordbeg);
4090               break;
4091
4092             case '>':
4093               if (syntax & RE_NO_GNU_OPS)
4094                 goto normal_char;
4095               BUF_PUSH (wordend);
4096               break;
4097
4098             case 'b':
4099               if (syntax & RE_NO_GNU_OPS)
4100                 goto normal_char;
4101               BUF_PUSH (wordbound);
4102               break;
4103
4104             case 'B':
4105               if (syntax & RE_NO_GNU_OPS)
4106                 goto normal_char;
4107               BUF_PUSH (notwordbound);
4108               break;
4109
4110             case '`':
4111               if (syntax & RE_NO_GNU_OPS)
4112                 goto normal_char;
4113               BUF_PUSH (begbuf);
4114               break;
4115
4116             case '\'':
4117               if (syntax & RE_NO_GNU_OPS)
4118                 goto normal_char;
4119               BUF_PUSH (endbuf);
4120               break;
4121
4122             case '1': case '2': case '3': case '4': case '5':
4123             case '6': case '7': case '8': case '9':
4124               if (syntax & RE_NO_BK_REFS)
4125                 goto normal_char;
4126
4127               c1 = c - '0';
4128
4129               if (c1 > regnum)
4130                 FREE_STACK_RETURN (REG_ESUBREG);
4131
4132               /* Can't back reference to a subexpression if inside of it.  */
4133               if (group_in_compile_stack (compile_stack, (regnum_t) c1))
4134                 goto normal_char;
4135
4136               laststart = b;
4137               BUF_PUSH_2 (duplicate, c1);
4138               break;
4139
4140
4141             case '+':
4142             case '?':
4143               if (syntax & RE_BK_PLUS_QM)
4144                 goto handle_plus;
4145               else
4146                 goto normal_backslash;
4147
4148             default:
4149             normal_backslash:
4150               /* You might think it would be useful for \ to mean
4151                  not to translate; but if we don't translate it
4152                  it will never match anything.  */
4153               c = TRANSLATE (c);
4154               goto normal_char;
4155             }
4156           break;
4157
4158
4159         default:
4160         /* Expects the character in `c'.  */
4161         normal_char:
4162               /* If no exactn currently being built.  */
4163           if (!pending_exact
4164 #ifdef WCHAR
4165               /* If last exactn handle binary(or character) and
4166                  new exactn handle character(or binary).  */
4167               || is_exactn_bin != is_binary[p - 1 - pattern]
4168 #endif /* WCHAR */
4169
4170               /* If last exactn not at current position.  */
4171               || pending_exact + *pending_exact + 1 != b
4172
4173               /* We have only one byte following the exactn for the count.  */
4174               || *pending_exact == (1 << BYTEWIDTH) - 1
4175
4176               /* If followed by a repetition operator.  */
4177               || *p == '*' || *p == '^'
4178               || ((syntax & RE_BK_PLUS_QM)
4179                   ? *p == '\\' && (p[1] == '+' || p[1] == '?')
4180                   : (*p == '+' || *p == '?'))
4181               || ((syntax & RE_INTERVALS)
4182                   && ((syntax & RE_NO_BK_BRACES)
4183                       ? *p == '{'
4184                       : (p[0] == '\\' && p[1] == '{'))))
4185             {
4186               /* Start building a new exactn.  */
4187
4188               laststart = b;
4189
4190 #ifdef WCHAR
4191               /* Is this exactn binary data or character? */
4192               is_exactn_bin = is_binary[p - 1 - pattern];
4193               if (is_exactn_bin)
4194                   BUF_PUSH_2 (exactn_bin, 0);
4195               else
4196                   BUF_PUSH_2 (exactn, 0);
4197 #else
4198               BUF_PUSH_2 (exactn, 0);
4199 #endif /* WCHAR */
4200               pending_exact = b - 1;
4201             }
4202
4203           BUF_PUSH (c);
4204           (*pending_exact)++;
4205           break;
4206         } /* switch (c) */
4207     } /* while p != pend */
4208
4209
4210   /* Through the pattern now.  */
4211
4212   if (fixup_alt_jump)
4213     STORE_JUMP (jump_past_alt, fixup_alt_jump, b);
4214
4215   if (!COMPILE_STACK_EMPTY)
4216     FREE_STACK_RETURN (REG_EPAREN);
4217
4218   /* If we don't want backtracking, force success
4219      the first time we reach the end of the compiled pattern.  */
4220   if (syntax & RE_NO_POSIX_BACKTRACKING)
4221     BUF_PUSH (succeed);
4222
4223 #ifdef WCHAR
4224   free (pattern);
4225   free (mbs_offset);
4226   free (is_binary);
4227 #endif
4228   free (compile_stack.stack);
4229
4230   /* We have succeeded; set the length of the buffer.  */
4231 #ifdef WCHAR
4232   bufp->used = (uintptr_t) b - (uintptr_t) COMPILED_BUFFER_VAR;
4233 #else
4234   bufp->used = b - bufp->buffer;
4235 #endif
4236
4237 #ifdef DEBUG
4238   if (debug)
4239     {
4240       DEBUG_PRINT1 ("\nCompiled pattern: \n");
4241       PREFIX(print_compiled_pattern) (bufp);
4242     }
4243 #endif /* DEBUG */
4244
4245 #ifndef MATCH_MAY_ALLOCATE
4246   /* Initialize the failure stack to the largest possible stack.  This
4247      isn't necessary unless we're trying to avoid calling alloca in
4248      the search and match routines.  */
4249   {
4250     int num_regs = bufp->re_nsub + 1;
4251
4252     /* Since DOUBLE_FAIL_STACK refuses to double only if the current size
4253        is strictly greater than re_max_failures, the largest possible stack
4254        is 2 * re_max_failures failure points.  */
4255     if (fail_stack.size < (2 * re_max_failures * MAX_FAILURE_ITEMS))
4256       {
4257         fail_stack.size = (2 * re_max_failures * MAX_FAILURE_ITEMS);
4258
4259 # ifdef emacs
4260         if (! fail_stack.stack)
4261           fail_stack.stack
4262             = (PREFIX(fail_stack_elt_t) *) xmalloc (fail_stack.size
4263                                     * sizeof (PREFIX(fail_stack_elt_t)));
4264         else
4265           fail_stack.stack
4266             = (PREFIX(fail_stack_elt_t) *) xrealloc (fail_stack.stack,
4267                                      (fail_stack.size
4268                                       * sizeof (PREFIX(fail_stack_elt_t))));
4269 # else /* not emacs */
4270         if (! fail_stack.stack)
4271           fail_stack.stack
4272             = (PREFIX(fail_stack_elt_t) *) malloc (fail_stack.size
4273                                    * sizeof (PREFIX(fail_stack_elt_t)));
4274         else
4275           fail_stack.stack
4276             = (PREFIX(fail_stack_elt_t) *) realloc (fail_stack.stack,
4277                                             (fail_stack.size
4278                                      * sizeof (PREFIX(fail_stack_elt_t))));
4279 # endif /* not emacs */
4280       }
4281
4282    PREFIX(regex_grow_registers) (num_regs);
4283   }
4284 #endif /* not MATCH_MAY_ALLOCATE */
4285
4286   return REG_NOERROR;
4287 } /* regex_compile */
4288
4289 /* Subroutines for `regex_compile'.  */
4290
4291 /* Store OP at LOC followed by two-byte integer parameter ARG.  */
4292 /* ifdef WCHAR, integer parameter is 1 wchar_t.  */
4293
4294 static void
4295 PREFIX(store_op1) (op, loc, arg)
4296     re_opcode_t op;
4297     UCHAR_T *loc;
4298     int arg;
4299 {
4300   *loc = (UCHAR_T) op;
4301   STORE_NUMBER (loc + 1, arg);
4302 }
4303
4304
4305 /* Like `store_op1', but for two two-byte parameters ARG1 and ARG2.  */
4306 /* ifdef WCHAR, integer parameter is 1 wchar_t.  */
4307
4308 static void
4309 PREFIX(store_op2) (op, loc, arg1, arg2)
4310     re_opcode_t op;
4311     UCHAR_T *loc;
4312     int arg1, arg2;
4313 {
4314   *loc = (UCHAR_T) op;
4315   STORE_NUMBER (loc + 1, arg1);
4316   STORE_NUMBER (loc + 1 + OFFSET_ADDRESS_SIZE, arg2);
4317 }
4318
4319
4320 /* Copy the bytes from LOC to END to open up three bytes of space at LOC
4321    for OP followed by two-byte integer parameter ARG.  */
4322 /* ifdef WCHAR, integer parameter is 1 wchar_t.  */
4323
4324 static void
4325 PREFIX(insert_op1) (op, loc, arg, end)
4326     re_opcode_t op;
4327     UCHAR_T *loc;
4328     int arg;
4329     UCHAR_T *end;
4330 {
4331   register UCHAR_T *pfrom = end;
4332   register UCHAR_T *pto = end + 1 + OFFSET_ADDRESS_SIZE;
4333
4334   while (pfrom != loc)
4335     *--pto = *--pfrom;
4336
4337   PREFIX(store_op1) (op, loc, arg);
4338 }
4339
4340
4341 /* Like `insert_op1', but for two two-byte parameters ARG1 and ARG2.  */
4342 /* ifdef WCHAR, integer parameter is 1 wchar_t.  */
4343
4344 static void
4345 PREFIX(insert_op2) (op, loc, arg1, arg2, end)
4346     re_opcode_t op;
4347     UCHAR_T *loc;
4348     int arg1, arg2;
4349     UCHAR_T *end;
4350 {
4351   register UCHAR_T *pfrom = end;
4352   register UCHAR_T *pto = end + 1 + 2 * OFFSET_ADDRESS_SIZE;
4353
4354   while (pfrom != loc)
4355     *--pto = *--pfrom;
4356
4357   PREFIX(store_op2) (op, loc, arg1, arg2);
4358 }
4359
4360
4361 /* P points to just after a ^ in PATTERN.  Return true if that ^ comes
4362    after an alternative or a begin-subexpression.  We assume there is at
4363    least one character before the ^.  */
4364
4365 static boolean
4366 PREFIX(at_begline_loc_p) (pattern, p, syntax)
4367     const CHAR_T *pattern, *p;
4368     reg_syntax_t syntax;
4369 {
4370   const CHAR_T *prev = p - 2;
4371   boolean prev_prev_backslash = prev > pattern && prev[-1] == '\\';
4372
4373   return
4374        /* After a subexpression?  */
4375        (*prev == '(' && (syntax & RE_NO_BK_PARENS || prev_prev_backslash))
4376        /* After an alternative?  */
4377     || (*prev == '|' && (syntax & RE_NO_BK_VBAR || prev_prev_backslash));
4378 }
4379
4380
4381 /* The dual of at_begline_loc_p.  This one is for $.  We assume there is
4382    at least one character after the $, i.e., `P < PEND'.  */
4383
4384 static boolean
4385 PREFIX(at_endline_loc_p) (p, pend, syntax)
4386     const CHAR_T *p, *pend;
4387     reg_syntax_t syntax;
4388 {
4389   const CHAR_T *next = p;
4390   boolean next_backslash = *next == '\\';
4391   const CHAR_T *next_next = p + 1 < pend ? p + 1 : 0;
4392
4393   return
4394        /* Before a subexpression?  */
4395        (syntax & RE_NO_BK_PARENS ? *next == ')'
4396         : next_backslash && next_next && *next_next == ')')
4397        /* Before an alternative?  */
4398     || (syntax & RE_NO_BK_VBAR ? *next == '|'
4399         : next_backslash && next_next && *next_next == '|');
4400 }
4401
4402 #else /* not INSIDE_RECURSION */
4403
4404 /* Returns true if REGNUM is in one of COMPILE_STACK's elements and
4405    false if it's not.  */
4406
4407 static boolean
4408 group_in_compile_stack (compile_stack, regnum)
4409     compile_stack_type compile_stack;
4410     regnum_t regnum;
4411 {
4412   int this_element;
4413
4414   for (this_element = compile_stack.avail - 1;
4415        this_element >= 0;
4416        this_element--)
4417     if (compile_stack.stack[this_element].regnum == regnum)
4418       return true;
4419
4420   return false;
4421 }
4422 #endif /* not INSIDE_RECURSION */
4423
4424 #ifdef INSIDE_RECURSION
4425
4426 #ifdef WCHAR
4427 /* This insert space, which size is "num", into the pattern at "loc".
4428    "end" must point the end of the allocated buffer.  */
4429 static void
4430 insert_space (num, loc, end)
4431      int num;
4432      CHAR_T *loc;
4433      CHAR_T *end;
4434 {
4435   register CHAR_T *pto = end;
4436   register CHAR_T *pfrom = end - num;
4437
4438   while (pfrom >= loc)
4439     *pto-- = *pfrom--;
4440 }
4441 #endif /* WCHAR */
4442
4443 #ifdef WCHAR
4444 static reg_errcode_t
4445 wcs_compile_range (range_start_char, p_ptr, pend, translate, syntax, b,
4446                    char_set)
4447      CHAR_T range_start_char;
4448      const CHAR_T **p_ptr, *pend;
4449      CHAR_T *char_set, *b;
4450      RE_TRANSLATE_TYPE translate;
4451      reg_syntax_t syntax;
4452 {
4453   const CHAR_T *p = *p_ptr;
4454   CHAR_T range_start, range_end;
4455   reg_errcode_t ret;
4456 # ifdef _LIBC
4457   uint32_t nrules;
4458   uint32_t start_val, end_val;
4459 # endif
4460   if (p == pend)
4461     return REG_ERANGE;
4462
4463 # ifdef _LIBC
4464   nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
4465   if (nrules != 0)
4466     {
4467       const char *collseq = (const char *) _NL_CURRENT(LC_COLLATE,
4468                                                        _NL_COLLATE_COLLSEQWC);
4469       const unsigned char *extra = (const unsigned char *)
4470         _NL_CURRENT (LC_COLLATE, _NL_COLLATE_SYMB_EXTRAMB);
4471
4472       if (range_start_char < -1)
4473         {
4474           /* range_start is a collating symbol.  */
4475           int32_t *wextra;
4476           /* Retreive the index and get collation sequence value.  */
4477           wextra = (int32_t*)(extra + char_set[-range_start_char]);
4478           start_val = wextra[1 + *wextra];
4479         }
4480       else
4481         start_val = collseq_table_lookup(collseq, TRANSLATE(range_start_char));
4482
4483       end_val = collseq_table_lookup (collseq, TRANSLATE (p[0]));
4484
4485       /* Report an error if the range is empty and the syntax prohibits
4486          this.  */
4487       ret = ((syntax & RE_NO_EMPTY_RANGES)
4488              && (start_val > end_val))? REG_ERANGE : REG_NOERROR;
4489
4490       /* Insert space to the end of the char_ranges.  */
4491       insert_space(2, b - char_set[5] - 2, b - 1);
4492       *(b - char_set[5] - 2) = (wchar_t)start_val;
4493       *(b - char_set[5] - 1) = (wchar_t)end_val;
4494       char_set[4]++; /* ranges_index */
4495     }
4496   else
4497 # endif
4498     {
4499       range_start = (range_start_char >= 0)? TRANSLATE (range_start_char):
4500         range_start_char;
4501       range_end = TRANSLATE (p[0]);
4502       /* Report an error if the range is empty and the syntax prohibits
4503          this.  */
4504       ret = ((syntax & RE_NO_EMPTY_RANGES)
4505              && (range_start > range_end))? REG_ERANGE : REG_NOERROR;
4506
4507       /* Insert space to the end of the char_ranges.  */
4508       insert_space(2, b - char_set[5] - 2, b - 1);
4509       *(b - char_set[5] - 2) = range_start;
4510       *(b - char_set[5] - 1) = range_end;
4511       char_set[4]++; /* ranges_index */
4512     }
4513   /* Have to increment the pointer into the pattern string, so the
4514      caller isn't still at the ending character.  */
4515   (*p_ptr)++;
4516
4517   return ret;
4518 }
4519 #else /* BYTE */
4520 /* Read the ending character of a range (in a bracket expression) from the
4521    uncompiled pattern *P_PTR (which ends at PEND).  We assume the
4522    starting character is in `P[-2]'.  (`P[-1]' is the character `-'.)
4523    Then we set the translation of all bits between the starting and
4524    ending characters (inclusive) in the compiled pattern B.
4525
4526    Return an error code.
4527
4528    We use these short variable names so we can use the same macros as
4529    `regex_compile' itself.  */
4530
4531 static reg_errcode_t
4532 byte_compile_range (range_start_char, p_ptr, pend, translate, syntax, b)
4533      unsigned int range_start_char;
4534      const char **p_ptr, *pend;
4535      RE_TRANSLATE_TYPE translate;
4536      reg_syntax_t syntax;
4537      unsigned char *b;
4538 {
4539   unsigned this_char;
4540   const char *p = *p_ptr;
4541   reg_errcode_t ret;
4542 # if _LIBC
4543   const unsigned char *collseq;
4544   unsigned int start_colseq;
4545   unsigned int end_colseq;
4546 # else
4547   unsigned end_char;
4548 # endif
4549
4550   if (p == pend)
4551     return REG_ERANGE;
4552
4553   /* Have to increment the pointer into the pattern string, so the
4554      caller isn't still at the ending character.  */
4555   (*p_ptr)++;
4556
4557   /* Report an error if the range is empty and the syntax prohibits this.  */
4558   ret = syntax & RE_NO_EMPTY_RANGES ? REG_ERANGE : REG_NOERROR;
4559
4560 # if _LIBC
4561   collseq = (const unsigned char *) _NL_CURRENT (LC_COLLATE,
4562                                                  _NL_COLLATE_COLLSEQMB);
4563
4564   start_colseq = collseq[(unsigned char) TRANSLATE (range_start_char)];
4565   end_colseq = collseq[(unsigned char) TRANSLATE (p[0])];
4566   for (this_char = 0; this_char <= (unsigned char) -1; ++this_char)
4567     {
4568       unsigned int this_colseq = collseq[(unsigned char) TRANSLATE (this_char)];
4569
4570       if (start_colseq <= this_colseq && this_colseq <= end_colseq)
4571         {
4572           SET_LIST_BIT (TRANSLATE (this_char));
4573           ret = REG_NOERROR;
4574         }
4575     }
4576 # else
4577   /* Here we see why `this_char' has to be larger than an `unsigned
4578      char' -- we would otherwise go into an infinite loop, since all
4579      characters <= 0xff.  */
4580   range_start_char = TRANSLATE (range_start_char);
4581   /* TRANSLATE(p[0]) is casted to char (not unsigned char) in TRANSLATE,
4582      and some compilers cast it to int implicitly, so following for_loop
4583      may fall to (almost) infinite loop.
4584      e.g. If translate[p[0]] = 0xff, end_char may equals to 0xffffffff.
4585      To avoid this, we cast p[0] to unsigned int and truncate it.  */
4586   end_char = ((unsigned)TRANSLATE(p[0]) & ((1 << BYTEWIDTH) - 1));
4587
4588   for (this_char = range_start_char; this_char <= end_char; ++this_char)
4589     {
4590       SET_LIST_BIT (TRANSLATE (this_char));
4591       ret = REG_NOERROR;
4592     }
4593 # endif
4594
4595   return ret;
4596 }
4597 #endif /* WCHAR */
4598 \f
4599 /* re_compile_fastmap computes a ``fastmap'' for the compiled pattern in
4600    BUFP.  A fastmap records which of the (1 << BYTEWIDTH) possible
4601    characters can start a string that matches the pattern.  This fastmap
4602    is used by re_search to skip quickly over impossible starting points.
4603
4604    The caller must supply the address of a (1 << BYTEWIDTH)-byte data
4605    area as BUFP->fastmap.
4606
4607    We set the `fastmap', `fastmap_accurate', and `can_be_null' fields in
4608    the pattern buffer.
4609
4610    Returns 0 if we succeed, -2 if an internal error.   */
4611
4612 #ifdef WCHAR
4613 /* local function for re_compile_fastmap.
4614    truncate wchar_t character to char.  */
4615 static unsigned char truncate_wchar (CHAR_T c);
4616
4617 static unsigned char
4618 truncate_wchar (c)
4619      CHAR_T c;
4620 {
4621   unsigned char buf[MB_LEN_MAX];
4622   int retval = wctomb(buf, c);
4623   return retval > 0 ? buf[0] : (unsigned char)c;
4624 }
4625 #endif /* WCHAR */
4626
4627 static int
4628 PREFIX(re_compile_fastmap) (bufp)
4629      struct re_pattern_buffer *bufp;
4630 {
4631   int j, k;
4632 #ifdef MATCH_MAY_ALLOCATE
4633   PREFIX(fail_stack_type) fail_stack;
4634 #endif
4635 #ifndef REGEX_MALLOC
4636   char *destination;
4637 #endif
4638
4639   register char *fastmap = bufp->fastmap;
4640
4641 #ifdef WCHAR
4642   /* We need to cast pattern to (wchar_t*), because we casted this compiled
4643      pattern to (char*) in regex_compile.  */
4644   UCHAR_T *pattern = (UCHAR_T*)bufp->buffer;
4645   register UCHAR_T *pend = (UCHAR_T*) (bufp->buffer + bufp->used);
4646 #else /* BYTE */
4647   UCHAR_T *pattern = bufp->buffer;
4648   register UCHAR_T *pend = pattern + bufp->used;
4649 #endif /* WCHAR */
4650   UCHAR_T *p = pattern;
4651
4652 #ifdef REL_ALLOC
4653   /* This holds the pointer to the failure stack, when
4654      it is allocated relocatably.  */
4655   fail_stack_elt_t *failure_stack_ptr;
4656 #endif
4657
4658   /* Assume that each path through the pattern can be null until
4659      proven otherwise.  We set this false at the bottom of switch
4660      statement, to which we get only if a particular path doesn't
4661      match the empty string.  */
4662   boolean path_can_be_null = true;
4663
4664   /* We aren't doing a `succeed_n' to begin with.  */
4665   boolean succeed_n_p = false;
4666
4667   assert (fastmap != NULL && p != NULL);
4668
4669   INIT_FAIL_STACK ();
4670   bzero (fastmap, 1 << BYTEWIDTH);  /* Assume nothing's valid.  */
4671   bufp->fastmap_accurate = 1;       /* It will be when we're done.  */
4672   bufp->can_be_null = 0;
4673
4674   while (1)
4675     {
4676       if (p == pend || *p == succeed)
4677         {
4678           /* We have reached the (effective) end of pattern.  */
4679           if (!FAIL_STACK_EMPTY ())
4680             {
4681               bufp->can_be_null |= path_can_be_null;
4682
4683               /* Reset for next path.  */
4684               path_can_be_null = true;
4685
4686               p = fail_stack.stack[--fail_stack.avail].pointer;
4687
4688               continue;
4689             }
4690           else
4691             break;
4692         }
4693
4694       /* We should never be about to go beyond the end of the pattern.  */
4695       assert (p < pend);
4696
4697       switch (SWITCH_ENUM_CAST ((re_opcode_t) *p++))
4698         {
4699
4700         /* I guess the idea here is to simply not bother with a fastmap
4701            if a backreference is used, since it's too hard to figure out
4702            the fastmap for the corresponding group.  Setting
4703            `can_be_null' stops `re_search_2' from using the fastmap, so
4704            that is all we do.  */
4705         case duplicate:
4706           bufp->can_be_null = 1;
4707           goto done;
4708
4709
4710       /* Following are the cases which match a character.  These end
4711          with `break'.  */
4712
4713 #ifdef WCHAR
4714         case exactn:
4715           fastmap[truncate_wchar(p[1])] = 1;
4716           break;
4717 #else /* BYTE */
4718         case exactn:
4719           fastmap[p[1]] = 1;
4720           break;
4721 #endif /* WCHAR */
4722 #ifdef MBS_SUPPORT
4723         case exactn_bin:
4724           fastmap[p[1]] = 1;
4725           break;
4726 #endif
4727
4728 #ifdef WCHAR
4729         /* It is hard to distinguish fastmap from (multi byte) characters
4730            which depends on current locale.  */
4731         case charset:
4732         case charset_not:
4733         case wordchar:
4734         case notwordchar:
4735           bufp->can_be_null = 1;
4736           goto done;
4737 #else /* BYTE */
4738         case charset:
4739           for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--)
4740             if (p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH)))
4741               fastmap[j] = 1;
4742           break;
4743
4744
4745         case charset_not:
4746           /* Chars beyond end of map must be allowed.  */
4747           for (j = *p * BYTEWIDTH; j < (1 << BYTEWIDTH); j++)
4748             fastmap[j] = 1;
4749
4750           for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--)
4751             if (!(p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH))))
4752               fastmap[j] = 1;
4753           break;
4754
4755
4756         case wordchar:
4757           for (j = 0; j < (1 << BYTEWIDTH); j++)
4758             if (SYNTAX (j) == Sword)
4759               fastmap[j] = 1;
4760           break;
4761
4762
4763         case notwordchar:
4764           for (j = 0; j < (1 << BYTEWIDTH); j++)
4765             if (SYNTAX (j) != Sword)
4766               fastmap[j] = 1;
4767           break;
4768 #endif /* WCHAR */
4769
4770         case anychar:
4771           {
4772             int fastmap_newline = fastmap['\n'];
4773
4774             /* `.' matches anything ...  */
4775             for (j = 0; j < (1 << BYTEWIDTH); j++)
4776               fastmap[j] = 1;
4777
4778             /* ... except perhaps newline.  */
4779             if (!(bufp->syntax & RE_DOT_NEWLINE))
4780               fastmap['\n'] = fastmap_newline;
4781
4782             /* Return if we have already set `can_be_null'; if we have,
4783                then the fastmap is irrelevant.  Something's wrong here.  */
4784             else if (bufp->can_be_null)
4785               goto done;
4786
4787             /* Otherwise, have to check alternative paths.  */
4788             break;
4789           }
4790
4791 #ifdef emacs
4792         case syntaxspec:
4793           k = *p++;
4794           for (j = 0; j < (1 << BYTEWIDTH); j++)
4795             if (SYNTAX (j) == (enum syntaxcode) k)
4796               fastmap[j] = 1;
4797           break;
4798
4799
4800         case notsyntaxspec:
4801           k = *p++;
4802           for (j = 0; j < (1 << BYTEWIDTH); j++)
4803             if (SYNTAX (j) != (enum syntaxcode) k)
4804               fastmap[j] = 1;
4805           break;
4806
4807
4808       /* All cases after this match the empty string.  These end with
4809          `continue'.  */
4810
4811
4812         case before_dot:
4813         case at_dot:
4814         case after_dot:
4815           continue;
4816 #endif /* emacs */
4817
4818
4819         case no_op:
4820         case begline:
4821         case endline:
4822         case begbuf:
4823         case endbuf:
4824         case wordbound:
4825         case notwordbound:
4826         case wordbeg:
4827         case wordend:
4828         case push_dummy_failure:
4829           continue;
4830
4831
4832         case jump_n:
4833         case pop_failure_jump:
4834         case maybe_pop_jump:
4835         case jump:
4836         case jump_past_alt:
4837         case dummy_failure_jump:
4838           EXTRACT_NUMBER_AND_INCR (j, p);
4839           p += j;
4840           if (j > 0)
4841             continue;
4842
4843           /* Jump backward implies we just went through the body of a
4844              loop and matched nothing.  Opcode jumped to should be
4845              `on_failure_jump' or `succeed_n'.  Just treat it like an
4846              ordinary jump.  For a * loop, it has pushed its failure
4847              point already; if so, discard that as redundant.  */
4848           if ((re_opcode_t) *p != on_failure_jump
4849               && (re_opcode_t) *p != succeed_n)
4850             continue;
4851
4852           p++;
4853           EXTRACT_NUMBER_AND_INCR (j, p);
4854           p += j;
4855
4856           /* If what's on the stack is where we are now, pop it.  */
4857           if (!FAIL_STACK_EMPTY ()
4858               && fail_stack.stack[fail_stack.avail - 1].pointer == p)
4859             fail_stack.avail--;
4860
4861           continue;
4862
4863
4864         case on_failure_jump:
4865         case on_failure_keep_string_jump:
4866         handle_on_failure_jump:
4867           EXTRACT_NUMBER_AND_INCR (j, p);
4868
4869           /* For some patterns, e.g., `(a?)?', `p+j' here points to the
4870              end of the pattern.  We don't want to push such a point,
4871              since when we restore it above, entering the switch will
4872              increment `p' past the end of the pattern.  We don't need
4873              to push such a point since we obviously won't find any more
4874              fastmap entries beyond `pend'.  Such a pattern can match
4875              the null string, though.  */
4876           if (p + j < pend)
4877             {
4878               if (!PUSH_PATTERN_OP (p + j, fail_stack))
4879                 {
4880                   RESET_FAIL_STACK ();
4881                   return -2;
4882                 }
4883             }
4884           else
4885             bufp->can_be_null = 1;
4886
4887           if (succeed_n_p)
4888             {
4889               EXTRACT_NUMBER_AND_INCR (k, p);   /* Skip the n.  */
4890               succeed_n_p = false;
4891             }
4892
4893           continue;
4894
4895
4896         case succeed_n:
4897           /* Get to the number of times to succeed.  */
4898           p += OFFSET_ADDRESS_SIZE;
4899
4900           /* Increment p past the n for when k != 0.  */
4901           EXTRACT_NUMBER_AND_INCR (k, p);
4902           if (k == 0)
4903             {
4904               p -= 2 * OFFSET_ADDRESS_SIZE;
4905               succeed_n_p = true;  /* Spaghetti code alert.  */
4906               goto handle_on_failure_jump;
4907             }
4908           continue;
4909
4910
4911         case set_number_at:
4912           p += 2 * OFFSET_ADDRESS_SIZE;
4913           continue;
4914
4915
4916         case start_memory:
4917         case stop_memory:
4918           p += 2;
4919           continue;
4920
4921
4922         default:
4923           abort (); /* We have listed all the cases.  */
4924         } /* switch *p++ */
4925
4926       /* Getting here means we have found the possible starting
4927          characters for one path of the pattern -- and that the empty
4928          string does not match.  We need not follow this path further.
4929          Instead, look at the next alternative (remembered on the
4930          stack), or quit if no more.  The test at the top of the loop
4931          does these things.  */
4932       path_can_be_null = false;
4933       p = pend;
4934     } /* while p */
4935
4936   /* Set `can_be_null' for the last path (also the first path, if the
4937      pattern is empty).  */
4938   bufp->can_be_null |= path_can_be_null;
4939
4940  done:
4941   RESET_FAIL_STACK ();
4942   return 0;
4943 }
4944
4945 #else /* not INSIDE_RECURSION */
4946
4947 int
4948 re_compile_fastmap (bufp)
4949      struct re_pattern_buffer *bufp;
4950 {
4951 # ifdef MBS_SUPPORT
4952   if (MB_CUR_MAX != 1)
4953     return wcs_re_compile_fastmap(bufp);
4954   else
4955 # endif
4956     return byte_re_compile_fastmap(bufp);
4957 } /* re_compile_fastmap */
4958 #ifdef _LIBC
4959 weak_alias (__re_compile_fastmap, re_compile_fastmap)
4960 #endif
4961 \f
4962
4963 /* Set REGS to hold NUM_REGS registers, storing them in STARTS and
4964    ENDS.  Subsequent matches using PATTERN_BUFFER and REGS will use
4965    this memory for recording register information.  STARTS and ENDS
4966    must be allocated using the malloc library routine, and must each
4967    be at least NUM_REGS * sizeof (regoff_t) bytes long.
4968
4969    If NUM_REGS == 0, then subsequent matches should allocate their own
4970    register data.
4971
4972    Unless this function is called, the first search or match using
4973    PATTERN_BUFFER will allocate its own register data, without
4974    freeing the old data.  */
4975
4976 void
4977 re_set_registers (bufp, regs, num_regs, starts, ends)
4978     struct re_pattern_buffer *bufp;
4979     struct re_registers *regs;
4980     unsigned num_regs;
4981     regoff_t *starts, *ends;
4982 {
4983   if (num_regs)
4984     {
4985       bufp->regs_allocated = REGS_REALLOCATE;
4986       regs->num_regs = num_regs;
4987       regs->start = starts;
4988       regs->end = ends;
4989     }
4990   else
4991     {
4992       bufp->regs_allocated = REGS_UNALLOCATED;
4993       regs->num_regs = 0;
4994       regs->start = regs->end = (regoff_t *) 0;
4995     }
4996 }
4997 #ifdef _LIBC
4998 weak_alias (__re_set_registers, re_set_registers)
4999 #endif
5000 \f
5001 /* Searching routines.  */
5002
5003 /* Like re_search_2, below, but only one string is specified, and
5004    doesn't let you say where to stop matching.  */
5005
5006 int
5007 re_search (bufp, string, size, startpos, range, regs)
5008      struct re_pattern_buffer *bufp;
5009      const char *string;
5010      int size, startpos, range;
5011      struct re_registers *regs;
5012 {
5013   return re_search_2 (bufp, NULL, 0, string, size, startpos, range,
5014                       regs, size);
5015 }
5016 #ifdef _LIBC
5017 weak_alias (__re_search, re_search)
5018 #endif
5019
5020
5021 /* Using the compiled pattern in BUFP->buffer, first tries to match the
5022    virtual concatenation of STRING1 and STRING2, starting first at index
5023    STARTPOS, then at STARTPOS + 1, and so on.
5024
5025    STRING1 and STRING2 have length SIZE1 and SIZE2, respectively.
5026
5027    RANGE is how far to scan while trying to match.  RANGE = 0 means try
5028    only at STARTPOS; in general, the last start tried is STARTPOS +
5029    RANGE.
5030
5031    In REGS, return the indices of the virtual concatenation of STRING1
5032    and STRING2 that matched the entire BUFP->buffer and its contained
5033    subexpressions.
5034
5035    Do not consider matching one past the index STOP in the virtual
5036    concatenation of STRING1 and STRING2.
5037
5038    We return either the position in the strings at which the match was
5039    found, -1 if no match, or -2 if error (such as failure
5040    stack overflow).  */
5041
5042 int
5043 re_search_2 (bufp, string1, size1, string2, size2, startpos, range, regs, stop)
5044      struct re_pattern_buffer *bufp;
5045      const char *string1, *string2;
5046      int size1, size2;
5047      int startpos;
5048      int range;
5049      struct re_registers *regs;
5050      int stop;
5051 {
5052 # ifdef MBS_SUPPORT
5053   if (MB_CUR_MAX != 1)
5054     return wcs_re_search_2 (bufp, string1, size1, string2, size2, startpos,
5055                             range, regs, stop);
5056   else
5057 # endif
5058     return byte_re_search_2 (bufp, string1, size1, string2, size2, startpos,
5059                              range, regs, stop);
5060 } /* re_search_2 */
5061 #ifdef _LIBC
5062 weak_alias (__re_search_2, re_search_2)
5063 #endif
5064
5065 #endif /* not INSIDE_RECURSION */
5066
5067 #ifdef INSIDE_RECURSION
5068
5069 #ifdef MATCH_MAY_ALLOCATE
5070 # define FREE_VAR(var) if (var) REGEX_FREE (var); var = NULL
5071 #else
5072 # define FREE_VAR(var) if (var) free (var); var = NULL
5073 #endif
5074
5075 #ifdef WCHAR
5076 # define MAX_ALLOCA_SIZE        2000
5077
5078 # define FREE_WCS_BUFFERS() \
5079   do {                                                                        \
5080     if (size1 > MAX_ALLOCA_SIZE)                                              \
5081       {                                                                       \
5082         free (wcs_string1);                                                   \
5083         free (mbs_offset1);                                                   \
5084       }                                                                       \
5085     else                                                                      \
5086       {                                                                       \
5087         FREE_VAR (wcs_string1);                                               \
5088         FREE_VAR (mbs_offset1);                                               \
5089       }                                                                       \
5090     if (size2 > MAX_ALLOCA_SIZE)                                              \
5091       {                                                                       \
5092         free (wcs_string2);                                                   \
5093         free (mbs_offset2);                                                   \
5094       }                                                                       \
5095     else                                                                      \
5096       {                                                                       \
5097         FREE_VAR (wcs_string2);                                               \
5098         FREE_VAR (mbs_offset2);                                               \
5099       }                                                                       \
5100   } while (0)
5101
5102 #endif
5103
5104
5105 static int
5106 PREFIX(re_search_2) (bufp, string1, size1, string2, size2, startpos, range,
5107                      regs, stop)
5108      struct re_pattern_buffer *bufp;
5109      const char *string1, *string2;
5110      int size1, size2;
5111      int startpos;
5112      int range;
5113      struct re_registers *regs;
5114      int stop;
5115 {
5116   int val;
5117   register char *fastmap = bufp->fastmap;
5118   register RE_TRANSLATE_TYPE translate = bufp->translate;
5119   int total_size = size1 + size2;
5120   int endpos = startpos + range;
5121 #ifdef WCHAR
5122   /* We need wchar_t* buffers correspond to cstring1, cstring2.  */
5123   wchar_t *wcs_string1 = NULL, *wcs_string2 = NULL;
5124   /* We need the size of wchar_t buffers correspond to csize1, csize2.  */
5125   int wcs_size1 = 0, wcs_size2 = 0;
5126   /* offset buffer for optimizatoin. See convert_mbs_to_wc.  */
5127   int *mbs_offset1 = NULL, *mbs_offset2 = NULL;
5128   /* They hold whether each wchar_t is binary data or not.  */
5129   char *is_binary = NULL;
5130 #endif /* WCHAR */
5131
5132   /* Check for out-of-range STARTPOS.  */
5133   if (startpos < 0 || startpos > total_size)
5134     return -1;
5135
5136   /* Fix up RANGE if it might eventually take us outside
5137      the virtual concatenation of STRING1 and STRING2.
5138      Make sure we won't move STARTPOS below 0 or above TOTAL_SIZE.  */
5139   if (endpos < 0)
5140     range = 0 - startpos;
5141   else if (endpos > total_size)
5142     range = total_size - startpos;
5143
5144   /* If the search isn't to be a backwards one, don't waste time in a
5145      search for a pattern that must be anchored.  */
5146   if (bufp->used > 0 && range > 0
5147       && ((re_opcode_t) bufp->buffer[0] == begbuf
5148           /* `begline' is like `begbuf' if it cannot match at newlines.  */
5149           || ((re_opcode_t) bufp->buffer[0] == begline
5150               && !bufp->newline_anchor)))
5151     {
5152       if (startpos > 0)
5153         return -1;
5154       else
5155         range = 1;
5156     }
5157
5158 #ifdef emacs
5159   /* In a forward search for something that starts with \=.
5160      don't keep searching past point.  */
5161   if (bufp->used > 0 && (re_opcode_t) bufp->buffer[0] == at_dot && range > 0)
5162     {
5163       range = PT - startpos;
5164       if (range <= 0)
5165         return -1;
5166     }
5167 #endif /* emacs */
5168
5169   /* Update the fastmap now if not correct already.  */
5170   if (fastmap && !bufp->fastmap_accurate)
5171     if (re_compile_fastmap (bufp) == -2)
5172       return -2;
5173
5174 #ifdef WCHAR
5175   /* Allocate wchar_t array for wcs_string1 and wcs_string2 and
5176      fill them with converted string.  */
5177   if (size1 != 0)
5178     {
5179       if (size1 > MAX_ALLOCA_SIZE)
5180         {
5181           wcs_string1 = TALLOC (size1 + 1, CHAR_T);
5182           mbs_offset1 = TALLOC (size1 + 1, int);
5183           is_binary = TALLOC (size1 + 1, char);
5184         }
5185       else
5186         {
5187           wcs_string1 = REGEX_TALLOC (size1 + 1, CHAR_T);
5188           mbs_offset1 = REGEX_TALLOC (size1 + 1, int);
5189           is_binary = REGEX_TALLOC (size1 + 1, char);
5190         }
5191       if (!wcs_string1 || !mbs_offset1 || !is_binary)
5192         {
5193           if (size1 > MAX_ALLOCA_SIZE)
5194             {
5195               free (wcs_string1);
5196               free (mbs_offset1);
5197               free (is_binary);
5198             }
5199           else
5200             {
5201               FREE_VAR (wcs_string1);
5202               FREE_VAR (mbs_offset1);
5203               FREE_VAR (is_binary);
5204             }
5205           return -2;
5206         }
5207       wcs_size1 = convert_mbs_to_wcs(wcs_string1, string1, size1,
5208                                      mbs_offset1, is_binary);
5209       wcs_string1[wcs_size1] = L'\0'; /* for a sentinel  */
5210       if (size1 > MAX_ALLOCA_SIZE)
5211         free (is_binary);
5212       else
5213         FREE_VAR (is_binary);
5214     }
5215   if (size2 != 0)
5216     {
5217       if (size2 > MAX_ALLOCA_SIZE)
5218         {
5219           wcs_string2 = TALLOC (size2 + 1, CHAR_T);
5220           mbs_offset2 = TALLOC (size2 + 1, int);
5221           is_binary = TALLOC (size2 + 1, char);
5222         }
5223       else
5224         {
5225           wcs_string2 = REGEX_TALLOC (size2 + 1, CHAR_T);
5226           mbs_offset2 = REGEX_TALLOC (size2 + 1, int);
5227           is_binary = REGEX_TALLOC (size2 + 1, char);
5228         }
5229       if (!wcs_string2 || !mbs_offset2 || !is_binary)
5230         {
5231           FREE_WCS_BUFFERS ();
5232           if (size2 > MAX_ALLOCA_SIZE)
5233             free (is_binary);
5234           else
5235             FREE_VAR (is_binary);
5236           return -2;
5237         }
5238       wcs_size2 = convert_mbs_to_wcs(wcs_string2, string2, size2,
5239                                      mbs_offset2, is_binary);
5240       wcs_string2[wcs_size2] = L'\0'; /* for a sentinel  */
5241       if (size2 > MAX_ALLOCA_SIZE)
5242         free (is_binary);
5243       else
5244         FREE_VAR (is_binary);
5245     }
5246 #endif /* WCHAR */
5247
5248
5249   /* Loop through the string, looking for a place to start matching.  */
5250   for (;;)
5251     {
5252       /* If a fastmap is supplied, skip quickly over characters that
5253          cannot be the start of a match.  If the pattern can match the
5254          null string, however, we don't need to skip characters; we want
5255          the first null string.  */
5256       if (fastmap && startpos < total_size && !bufp->can_be_null)
5257         {
5258           if (range > 0)        /* Searching forwards.  */
5259             {
5260               register const char *d;
5261               register int lim = 0;
5262               int irange = range;
5263
5264               if (startpos < size1 && startpos + range >= size1)
5265                 lim = range - (size1 - startpos);
5266
5267               d = (startpos >= size1 ? string2 - size1 : string1) + startpos;
5268
5269               /* Written out as an if-else to avoid testing `translate'
5270                  inside the loop.  */
5271               if (translate)
5272                 while (range > lim
5273                        && !fastmap[(unsigned char)
5274                                    translate[(unsigned char) *d++]])
5275                   range--;
5276               else
5277                 while (range > lim && !fastmap[(unsigned char) *d++])
5278                   range--;
5279
5280               startpos += irange - range;
5281             }
5282           else                          /* Searching backwards.  */
5283             {
5284               register CHAR_T c = (size1 == 0 || startpos >= size1
5285                                       ? string2[startpos - size1]
5286                                       : string1[startpos]);
5287
5288               if (!fastmap[(unsigned char) TRANSLATE (c)])
5289                 goto advance;
5290             }
5291         }
5292
5293       /* If can't match the null string, and that's all we have left, fail.  */
5294       if (range >= 0 && startpos == total_size && fastmap
5295           && !bufp->can_be_null)
5296        {
5297 #ifdef WCHAR
5298          FREE_WCS_BUFFERS ();
5299 #endif
5300          return -1;
5301        }
5302
5303 #ifdef WCHAR
5304       val = wcs_re_match_2_internal (bufp, string1, size1, string2,
5305                                      size2, startpos, regs, stop,
5306                                      wcs_string1, wcs_size1,
5307                                      wcs_string2, wcs_size2,
5308                                      mbs_offset1, mbs_offset2);
5309 #else /* BYTE */
5310       val = byte_re_match_2_internal (bufp, string1, size1, string2,
5311                                       size2, startpos, regs, stop);
5312 #endif /* BYTE */
5313
5314 #ifndef REGEX_MALLOC
5315 # ifdef C_ALLOCA
5316       alloca (0);
5317 # endif
5318 #endif
5319
5320       if (val >= 0)
5321         {
5322 #ifdef WCHAR
5323           FREE_WCS_BUFFERS ();
5324 #endif
5325           return startpos;
5326         }
5327
5328       if (val == -2)
5329         {
5330 #ifdef WCHAR
5331           FREE_WCS_BUFFERS ();
5332 #endif
5333           return -2;
5334         }
5335
5336     advance:
5337       if (!range)
5338         break;
5339       else if (range > 0)
5340         {
5341           range--;
5342           startpos++;
5343         }
5344       else
5345         {
5346           range++;
5347           startpos--;
5348         }
5349     }
5350 #ifdef WCHAR
5351   FREE_WCS_BUFFERS ();
5352 #endif
5353   return -1;
5354 }
5355
5356 #ifdef WCHAR
5357 /* This converts PTR, a pointer into one of the search wchar_t strings
5358    `string1' and `string2' into an multibyte string offset from the
5359    beginning of that string. We use mbs_offset to optimize.
5360    See convert_mbs_to_wcs.  */
5361 # define POINTER_TO_OFFSET(ptr)                                         \
5362   (FIRST_STRING_P (ptr)                                                 \
5363    ? ((regoff_t)(mbs_offset1 != NULL? mbs_offset1[(ptr)-string1] : 0))  \
5364    : ((regoff_t)((mbs_offset2 != NULL? mbs_offset2[(ptr)-string2] : 0)  \
5365                  + csize1)))
5366 #else /* BYTE */
5367 /* This converts PTR, a pointer into one of the search strings `string1'
5368    and `string2' into an offset from the beginning of that string.  */
5369 # define POINTER_TO_OFFSET(ptr)                 \
5370   (FIRST_STRING_P (ptr)                         \
5371    ? ((regoff_t) ((ptr) - string1))             \
5372    : ((regoff_t) ((ptr) - string2 + size1)))
5373 #endif /* WCHAR */
5374
5375 /* Macros for dealing with the split strings in re_match_2.  */
5376
5377 #define MATCHING_IN_FIRST_STRING  (dend == end_match_1)
5378
5379 /* Call before fetching a character with *d.  This switches over to
5380    string2 if necessary.  */
5381 #define PREFETCH()                                                      \
5382   while (d == dend)                                                     \
5383     {                                                                   \
5384       /* End of string2 => fail.  */                                    \
5385       if (dend == end_match_2)                                          \
5386         goto fail;                                                      \
5387       /* End of string1 => advance to string2.  */                      \
5388       d = string2;                                                      \
5389       dend = end_match_2;                                               \
5390     }
5391
5392 /* Test if at very beginning or at very end of the virtual concatenation
5393    of `string1' and `string2'.  If only one string, it's `string2'.  */
5394 #define AT_STRINGS_BEG(d) ((d) == (size1 ? string1 : string2) || !size2)
5395 #define AT_STRINGS_END(d) ((d) == end2)
5396
5397
5398 /* Test if D points to a character which is word-constituent.  We have
5399    two special cases to check for: if past the end of string1, look at
5400    the first character in string2; and if before the beginning of
5401    string2, look at the last character in string1.  */
5402 #ifdef WCHAR
5403 /* Use internationalized API instead of SYNTAX.  */
5404 # define WORDCHAR_P(d)                                                  \
5405   (iswalnum ((wint_t)((d) == end1 ? *string2                            \
5406            : (d) == string2 - 1 ? *(end1 - 1) : *(d))) != 0             \
5407    || ((d) == end1 ? *string2                                           \
5408        : (d) == string2 - 1 ? *(end1 - 1) : *(d)) == L'_')
5409 #else /* BYTE */
5410 # define WORDCHAR_P(d)                                                  \
5411   (SYNTAX ((d) == end1 ? *string2                                       \
5412            : (d) == string2 - 1 ? *(end1 - 1) : *(d))                   \
5413    == Sword)
5414 #endif /* WCHAR */
5415
5416 /* Disabled due to a compiler bug -- see comment at case wordbound */
5417 #if 0
5418 /* Test if the character before D and the one at D differ with respect
5419    to being word-constituent.  */
5420 #define AT_WORD_BOUNDARY(d)                                             \
5421   (AT_STRINGS_BEG (d) || AT_STRINGS_END (d)                             \
5422    || WORDCHAR_P (d - 1) != WORDCHAR_P (d))
5423 #endif
5424
5425 /* Free everything we malloc.  */
5426 #ifdef MATCH_MAY_ALLOCATE
5427 # ifdef WCHAR
5428 #  define FREE_VARIABLES()                                              \
5429   do {                                                                  \
5430     REGEX_FREE_STACK (fail_stack.stack);                                \
5431     FREE_VAR (regstart);                                                \
5432     FREE_VAR (regend);                                                  \
5433     FREE_VAR (old_regstart);                                            \
5434     FREE_VAR (old_regend);                                              \
5435     FREE_VAR (best_regstart);                                           \
5436     FREE_VAR (best_regend);                                             \
5437     FREE_VAR (reg_info);                                                \
5438     FREE_VAR (reg_dummy);                                               \
5439     FREE_VAR (reg_info_dummy);                                          \
5440     if (!cant_free_wcs_buf)                                             \
5441       {                                                                 \
5442         FREE_VAR (string1);                                             \
5443         FREE_VAR (string2);                                             \
5444         FREE_VAR (mbs_offset1);                                         \
5445         FREE_VAR (mbs_offset2);                                         \
5446       }                                                                 \
5447   } while (0)
5448 # else /* BYTE */
5449 #  define FREE_VARIABLES()                                              \
5450   do {                                                                  \
5451     REGEX_FREE_STACK (fail_stack.stack);                                \
5452     FREE_VAR (regstart);                                                \
5453     FREE_VAR (regend);                                                  \
5454     FREE_VAR (old_regstart);                                            \
5455     FREE_VAR (old_regend);                                              \
5456     FREE_VAR (best_regstart);                                           \
5457     FREE_VAR (best_regend);                                             \
5458     FREE_VAR (reg_info);                                                \
5459     FREE_VAR (reg_dummy);                                               \
5460     FREE_VAR (reg_info_dummy);                                          \
5461   } while (0)
5462 # endif /* WCHAR */
5463 #else
5464 # ifdef WCHAR
5465 #  define FREE_VARIABLES()                                              \
5466   do {                                                                  \
5467     if (!cant_free_wcs_buf)                                             \
5468       {                                                                 \
5469         FREE_VAR (string1);                                             \
5470         FREE_VAR (string2);                                             \
5471         FREE_VAR (mbs_offset1);                                         \
5472         FREE_VAR (mbs_offset2);                                         \
5473       }                                                                 \
5474   } while (0)
5475 # else /* BYTE */
5476 #  define FREE_VARIABLES() ((void)0) /* Do nothing!  But inhibit gcc warning. */
5477 # endif /* WCHAR */
5478 #endif /* not MATCH_MAY_ALLOCATE */
5479
5480 /* These values must meet several constraints.  They must not be valid
5481    register values; since we have a limit of 255 registers (because
5482    we use only one byte in the pattern for the register number), we can
5483    use numbers larger than 255.  They must differ by 1, because of
5484    NUM_FAILURE_ITEMS above.  And the value for the lowest register must
5485    be larger than the value for the highest register, so we do not try
5486    to actually save any registers when none are active.  */
5487 #define NO_HIGHEST_ACTIVE_REG (1 << BYTEWIDTH)
5488 #define NO_LOWEST_ACTIVE_REG (NO_HIGHEST_ACTIVE_REG + 1)
5489 \f
5490 #else /* not INSIDE_RECURSION */
5491 /* Matching routines.  */
5492
5493 #ifndef emacs   /* Emacs never uses this.  */
5494 /* re_match is like re_match_2 except it takes only a single string.  */
5495
5496 int
5497 re_match (bufp, string, size, pos, regs)
5498      struct re_pattern_buffer *bufp;
5499      const char *string;
5500      int size, pos;
5501      struct re_registers *regs;
5502 {
5503   int result;
5504 # ifdef MBS_SUPPORT
5505   if (MB_CUR_MAX != 1)
5506     result = wcs_re_match_2_internal (bufp, NULL, 0, string, size,
5507                                       pos, regs, size,
5508                                       NULL, 0, NULL, 0, NULL, NULL);
5509   else
5510 # endif
5511     result = byte_re_match_2_internal (bufp, NULL, 0, string, size,
5512                                   pos, regs, size);
5513 # ifndef REGEX_MALLOC
5514 #  ifdef C_ALLOCA
5515   alloca (0);
5516 #  endif
5517 # endif
5518   return result;
5519 }
5520 # ifdef _LIBC
5521 weak_alias (__re_match, re_match)
5522 # endif
5523 #endif /* not emacs */
5524
5525 #endif /* not INSIDE_RECURSION */
5526
5527 #ifdef INSIDE_RECURSION
5528 static boolean PREFIX(group_match_null_string_p) _RE_ARGS ((UCHAR_T **p,
5529                                                     UCHAR_T *end,
5530                                         PREFIX(register_info_type) *reg_info));
5531 static boolean PREFIX(alt_match_null_string_p) _RE_ARGS ((UCHAR_T *p,
5532                                                   UCHAR_T *end,
5533                                         PREFIX(register_info_type) *reg_info));
5534 static boolean PREFIX(common_op_match_null_string_p) _RE_ARGS ((UCHAR_T **p,
5535                                                         UCHAR_T *end,
5536                                         PREFIX(register_info_type) *reg_info));
5537 static int PREFIX(bcmp_translate) _RE_ARGS ((const CHAR_T *s1, const CHAR_T *s2,
5538                                      int len, char *translate));
5539 #else /* not INSIDE_RECURSION */
5540
5541 /* re_match_2 matches the compiled pattern in BUFP against the
5542    the (virtual) concatenation of STRING1 and STRING2 (of length SIZE1
5543    and SIZE2, respectively).  We start matching at POS, and stop
5544    matching at STOP.
5545
5546    If REGS is non-null and the `no_sub' field of BUFP is nonzero, we
5547    store offsets for the substring each group matched in REGS.  See the
5548    documentation for exactly how many groups we fill.
5549
5550    We return -1 if no match, -2 if an internal error (such as the
5551    failure stack overflowing).  Otherwise, we return the length of the
5552    matched substring.  */
5553
5554 int
5555 re_match_2 (bufp, string1, size1, string2, size2, pos, regs, stop)
5556      struct re_pattern_buffer *bufp;
5557      const char *string1, *string2;
5558      int size1, size2;
5559      int pos;
5560      struct re_registers *regs;
5561      int stop;
5562 {
5563   int result;
5564 # ifdef MBS_SUPPORT
5565   if (MB_CUR_MAX != 1)
5566     result = wcs_re_match_2_internal (bufp, string1, size1, string2, size2,
5567                                       pos, regs, stop,
5568                                       NULL, 0, NULL, 0, NULL, NULL);
5569   else
5570 # endif
5571     result = byte_re_match_2_internal (bufp, string1, size1, string2, size2,
5572                                   pos, regs, stop);
5573
5574 #ifndef REGEX_MALLOC
5575 # ifdef C_ALLOCA
5576   alloca (0);
5577 # endif
5578 #endif
5579   return result;
5580 }
5581 #ifdef _LIBC
5582 weak_alias (__re_match_2, re_match_2)
5583 #endif
5584
5585 #endif /* not INSIDE_RECURSION */
5586
5587 #ifdef INSIDE_RECURSION
5588
5589 #ifdef WCHAR
5590 static int count_mbs_length PARAMS ((int *, int));
5591
5592 /* This check the substring (from 0, to length) of the multibyte string,
5593    to which offset_buffer correspond. And count how many wchar_t_characters
5594    the substring occupy. We use offset_buffer to optimization.
5595    See convert_mbs_to_wcs.  */
5596
5597 static int
5598 count_mbs_length(offset_buffer, length)
5599      int *offset_buffer;
5600      int length;
5601 {
5602   int upper, lower;
5603
5604   /* Check whether the size is valid.  */
5605   if (length < 0)
5606     return -1;
5607
5608   if (offset_buffer == NULL)
5609     return 0;
5610
5611   /* If there are no multibyte character, offset_buffer[i] == i.
5612    Optmize for this case.  */
5613   if (offset_buffer[length] == length)
5614     return length;
5615
5616   /* Set up upper with length. (because for all i, offset_buffer[i] >= i)  */
5617   upper = length;
5618   lower = 0;
5619
5620   while (true)
5621     {
5622       int middle = (lower + upper) / 2;
5623       if (middle == lower || middle == upper)
5624         break;
5625       if (offset_buffer[middle] > length)
5626         upper = middle;
5627       else if (offset_buffer[middle] < length)
5628         lower = middle;
5629       else
5630         return middle;
5631     }
5632
5633   return -1;
5634 }
5635 #endif /* WCHAR */
5636
5637 /* This is a separate function so that we can force an alloca cleanup
5638    afterwards.  */
5639 #ifdef WCHAR
5640 static int
5641 wcs_re_match_2_internal (bufp, cstring1, csize1, cstring2, csize2, pos,
5642                          regs, stop, string1, size1, string2, size2,
5643                          mbs_offset1, mbs_offset2)
5644      struct re_pattern_buffer *bufp;
5645      const char *cstring1, *cstring2;
5646      int csize1, csize2;
5647      int pos;
5648      struct re_registers *regs;
5649      int stop;
5650      /* string1 == string2 == NULL means string1/2, size1/2 and
5651         mbs_offset1/2 need seting up in this function.  */
5652      /* We need wchar_t* buffers correspond to cstring1, cstring2.  */
5653      wchar_t *string1, *string2;
5654      /* We need the size of wchar_t buffers correspond to csize1, csize2.  */
5655      int size1, size2;
5656      /* offset buffer for optimizatoin. See convert_mbs_to_wc.  */
5657      int *mbs_offset1, *mbs_offset2;
5658 #else /* BYTE */
5659 static int
5660 byte_re_match_2_internal (bufp, string1, size1,string2, size2, pos,
5661                           regs, stop)
5662      struct re_pattern_buffer *bufp;
5663      const char *string1, *string2;
5664      int size1, size2;
5665      int pos;
5666      struct re_registers *regs;
5667      int stop;
5668 #endif /* BYTE */
5669 {
5670   /* General temporaries.  */
5671   int mcnt;
5672   UCHAR_T *p1;
5673 #ifdef WCHAR
5674   /* They hold whether each wchar_t is binary data or not.  */
5675   char *is_binary = NULL;
5676   /* If true, we can't free string1/2, mbs_offset1/2.  */
5677   int cant_free_wcs_buf = 1;
5678 #endif /* WCHAR */
5679
5680   /* Just past the end of the corresponding string.  */
5681   const CHAR_T *end1, *end2;
5682
5683   /* Pointers into string1 and string2, just past the last characters in
5684      each to consider matching.  */
5685   const CHAR_T *end_match_1, *end_match_2;
5686
5687   /* Where we are in the data, and the end of the current string.  */
5688   const CHAR_T *d, *dend;
5689
5690   /* Where we are in the pattern, and the end of the pattern.  */
5691 #ifdef WCHAR
5692   UCHAR_T *pattern, *p;
5693   register UCHAR_T *pend;
5694 #else /* BYTE */
5695   UCHAR_T *p = bufp->buffer;
5696   register UCHAR_T *pend = p + bufp->used;
5697 #endif /* WCHAR */
5698
5699   /* Mark the opcode just after a start_memory, so we can test for an
5700      empty subpattern when we get to the stop_memory.  */
5701   UCHAR_T *just_past_start_mem = 0;
5702
5703   /* We use this to map every character in the string.  */
5704   RE_TRANSLATE_TYPE translate = bufp->translate;
5705
5706   /* Failure point stack.  Each place that can handle a failure further
5707      down the line pushes a failure point on this stack.  It consists of
5708      restart, regend, and reg_info for all registers corresponding to
5709      the subexpressions we're currently inside, plus the number of such
5710      registers, and, finally, two char *'s.  The first char * is where
5711      to resume scanning the pattern; the second one is where to resume
5712      scanning the strings.  If the latter is zero, the failure point is
5713      a ``dummy''; if a failure happens and the failure point is a dummy,
5714      it gets discarded and the next next one is tried.  */
5715 #ifdef MATCH_MAY_ALLOCATE /* otherwise, this is global.  */
5716   PREFIX(fail_stack_type) fail_stack;
5717 #endif
5718 #ifdef DEBUG
5719   static unsigned failure_id;
5720   unsigned nfailure_points_pushed = 0, nfailure_points_popped = 0;
5721 #endif
5722
5723 #ifdef REL_ALLOC
5724   /* This holds the pointer to the failure stack, when
5725      it is allocated relocatably.  */
5726   fail_stack_elt_t *failure_stack_ptr;
5727 #endif
5728
5729   /* We fill all the registers internally, independent of what we
5730      return, for use in backreferences.  The number here includes
5731      an element for register zero.  */
5732   size_t num_regs = bufp->re_nsub + 1;
5733
5734   /* The currently active registers.  */
5735   active_reg_t lowest_active_reg = NO_LOWEST_ACTIVE_REG;
5736   active_reg_t highest_active_reg = NO_HIGHEST_ACTIVE_REG;
5737
5738   /* Information on the contents of registers. These are pointers into
5739      the input strings; they record just what was matched (on this
5740      attempt) by a subexpression part of the pattern, that is, the
5741      regnum-th regstart pointer points to where in the pattern we began
5742      matching and the regnum-th regend points to right after where we
5743      stopped matching the regnum-th subexpression.  (The zeroth register
5744      keeps track of what the whole pattern matches.)  */
5745 #ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global.  */
5746   const CHAR_T **regstart, **regend;
5747 #endif
5748
5749   /* If a group that's operated upon by a repetition operator fails to
5750      match anything, then the register for its start will need to be
5751      restored because it will have been set to wherever in the string we
5752      are when we last see its open-group operator.  Similarly for a
5753      register's end.  */
5754 #ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global.  */
5755   const CHAR_T **old_regstart, **old_regend;
5756 #endif
5757
5758   /* The is_active field of reg_info helps us keep track of which (possibly
5759      nested) subexpressions we are currently in. The matched_something
5760      field of reg_info[reg_num] helps us tell whether or not we have
5761      matched any of the pattern so far this time through the reg_num-th
5762      subexpression.  These two fields get reset each time through any
5763      loop their register is in.  */
5764 #ifdef MATCH_MAY_ALLOCATE /* otherwise, this is global.  */
5765   PREFIX(register_info_type) *reg_info;
5766 #endif
5767
5768   /* The following record the register info as found in the above
5769      variables when we find a match better than any we've seen before.
5770      This happens as we backtrack through the failure points, which in
5771      turn happens only if we have not yet matched the entire string. */
5772   unsigned best_regs_set = false;
5773 #ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global.  */
5774   const CHAR_T **best_regstart, **best_regend;
5775 #endif
5776
5777   /* Logically, this is `best_regend[0]'.  But we don't want to have to
5778      allocate space for that if we're not allocating space for anything
5779      else (see below).  Also, we never need info about register 0 for
5780      any of the other register vectors, and it seems rather a kludge to
5781      treat `best_regend' differently than the rest.  So we keep track of
5782      the end of the best match so far in a separate variable.  We
5783      initialize this to NULL so that when we backtrack the first time
5784      and need to test it, it's not garbage.  */
5785   const CHAR_T *match_end = NULL;
5786
5787   /* This helps SET_REGS_MATCHED avoid doing redundant work.  */
5788   int set_regs_matched_done = 0;
5789
5790   /* Used when we pop values we don't care about.  */
5791 #ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global.  */
5792   const CHAR_T **reg_dummy;
5793   PREFIX(register_info_type) *reg_info_dummy;
5794 #endif
5795
5796 #ifdef DEBUG
5797   /* Counts the total number of registers pushed.  */
5798   unsigned num_regs_pushed = 0;
5799 #endif
5800
5801   DEBUG_PRINT1 ("\n\nEntering re_match_2.\n");
5802
5803   INIT_FAIL_STACK ();
5804
5805 #ifdef MATCH_MAY_ALLOCATE
5806   /* Do not bother to initialize all the register variables if there are
5807      no groups in the pattern, as it takes a fair amount of time.  If
5808      there are groups, we include space for register 0 (the whole
5809      pattern), even though we never use it, since it simplifies the
5810      array indexing.  We should fix this.  */
5811   if (bufp->re_nsub)
5812     {
5813       regstart = REGEX_TALLOC (num_regs, const CHAR_T *);
5814       regend = REGEX_TALLOC (num_regs, const CHAR_T *);
5815       old_regstart = REGEX_TALLOC (num_regs, const CHAR_T *);
5816       old_regend = REGEX_TALLOC (num_regs, const CHAR_T *);
5817       best_regstart = REGEX_TALLOC (num_regs, const CHAR_T *);
5818       best_regend = REGEX_TALLOC (num_regs, const CHAR_T *);
5819       reg_info = REGEX_TALLOC (num_regs, PREFIX(register_info_type));
5820       reg_dummy = REGEX_TALLOC (num_regs, const CHAR_T *);
5821       reg_info_dummy = REGEX_TALLOC (num_regs, PREFIX(register_info_type));
5822
5823       if (!(regstart && regend && old_regstart && old_regend && reg_info
5824             && best_regstart && best_regend && reg_dummy && reg_info_dummy))
5825         {
5826           FREE_VARIABLES ();
5827           return -2;
5828         }
5829     }
5830   else
5831     {
5832       /* We must initialize all our variables to NULL, so that
5833          `FREE_VARIABLES' doesn't try to free them.  */
5834       regstart = regend = old_regstart = old_regend = best_regstart
5835         = best_regend = reg_dummy = NULL;
5836       reg_info = reg_info_dummy = (PREFIX(register_info_type) *) NULL;
5837     }
5838 #endif /* MATCH_MAY_ALLOCATE */
5839
5840   /* The starting position is bogus.  */
5841 #ifdef WCHAR
5842   if (pos < 0 || pos > csize1 + csize2)
5843 #else /* BYTE */
5844   if (pos < 0 || pos > size1 + size2)
5845 #endif
5846     {
5847       FREE_VARIABLES ();
5848       return -1;
5849     }
5850
5851 #ifdef WCHAR
5852   /* Allocate wchar_t array for string1 and string2 and
5853      fill them with converted string.  */
5854   if (string1 == NULL && string2 == NULL)
5855     {
5856       /* We need seting up buffers here.  */
5857
5858       /* We must free wcs buffers in this function.  */
5859       cant_free_wcs_buf = 0;
5860
5861       if (csize1 != 0)
5862         {
5863           string1 = REGEX_TALLOC (csize1 + 1, CHAR_T);
5864           mbs_offset1 = REGEX_TALLOC (csize1 + 1, int);
5865           is_binary = REGEX_TALLOC (csize1 + 1, char);
5866           if (!string1 || !mbs_offset1 || !is_binary)
5867             {
5868               FREE_VAR (string1);
5869               FREE_VAR (mbs_offset1);
5870               FREE_VAR (is_binary);
5871               return -2;
5872             }
5873         }
5874       if (csize2 != 0)
5875         {
5876           string2 = REGEX_TALLOC (csize2 + 1, CHAR_T);
5877           mbs_offset2 = REGEX_TALLOC (csize2 + 1, int);
5878           is_binary = REGEX_TALLOC (csize2 + 1, char);
5879           if (!string2 || !mbs_offset2 || !is_binary)
5880             {
5881               FREE_VAR (string1);
5882               FREE_VAR (mbs_offset1);
5883               FREE_VAR (string2);
5884               FREE_VAR (mbs_offset2);
5885               FREE_VAR (is_binary);
5886               return -2;
5887             }
5888           size2 = convert_mbs_to_wcs(string2, cstring2, csize2,
5889                                      mbs_offset2, is_binary);
5890           string2[size2] = L'\0'; /* for a sentinel  */
5891           FREE_VAR (is_binary);
5892         }
5893     }
5894
5895   /* We need to cast pattern to (wchar_t*), because we casted this compiled
5896      pattern to (char*) in regex_compile.  */
5897   p = pattern = (CHAR_T*)bufp->buffer;
5898   pend = (CHAR_T*)(bufp->buffer + bufp->used);
5899
5900 #endif /* WCHAR */
5901
5902   /* Initialize subexpression text positions to -1 to mark ones that no
5903      start_memory/stop_memory has been seen for. Also initialize the
5904      register information struct.  */
5905   for (mcnt = 1; (unsigned) mcnt < num_regs; mcnt++)
5906     {
5907       regstart[mcnt] = regend[mcnt]
5908         = old_regstart[mcnt] = old_regend[mcnt] = REG_UNSET_VALUE;
5909
5910       REG_MATCH_NULL_STRING_P (reg_info[mcnt]) = MATCH_NULL_UNSET_VALUE;
5911       IS_ACTIVE (reg_info[mcnt]) = 0;
5912       MATCHED_SOMETHING (reg_info[mcnt]) = 0;
5913       EVER_MATCHED_SOMETHING (reg_info[mcnt]) = 0;
5914     }
5915
5916   /* We move `string1' into `string2' if the latter's empty -- but not if
5917      `string1' is null.  */
5918   if (size2 == 0 && string1 != NULL)
5919     {
5920       string2 = string1;
5921       size2 = size1;
5922       string1 = 0;
5923       size1 = 0;
5924 #ifdef WCHAR
5925       mbs_offset2 = mbs_offset1;
5926       csize2 = csize1;
5927       mbs_offset1 = NULL;
5928       csize1 = 0;
5929 #endif
5930     }
5931   end1 = string1 + size1;
5932   end2 = string2 + size2;
5933
5934   /* Compute where to stop matching, within the two strings.  */
5935 #ifdef WCHAR
5936   if (stop <= csize1)
5937     {
5938       mcnt = count_mbs_length(mbs_offset1, stop);
5939       end_match_1 = string1 + mcnt;
5940       end_match_2 = string2;
5941     }
5942   else
5943     {
5944       if (stop > csize1 + csize2)
5945         stop = csize1 + csize2;
5946       end_match_1 = end1;
5947       mcnt = count_mbs_length(mbs_offset2, stop-csize1);
5948       end_match_2 = string2 + mcnt;
5949     }
5950   if (mcnt < 0)
5951     { /* count_mbs_length return error.  */
5952       FREE_VARIABLES ();
5953       return -1;
5954     }
5955 #else
5956   if (stop <= size1)
5957     {
5958       end_match_1 = string1 + stop;
5959       end_match_2 = string2;
5960     }
5961   else
5962     {
5963       end_match_1 = end1;
5964       end_match_2 = string2 + stop - size1;
5965     }
5966 #endif /* WCHAR */
5967
5968   /* `p' scans through the pattern as `d' scans through the data.
5969      `dend' is the end of the input string that `d' points within.  `d'
5970      is advanced into the following input string whenever necessary, but
5971      this happens before fetching; therefore, at the beginning of the
5972      loop, `d' can be pointing at the end of a string, but it cannot
5973      equal `string2'.  */
5974 #ifdef WCHAR
5975   if (size1 > 0 && pos <= csize1)
5976     {
5977       mcnt = count_mbs_length(mbs_offset1, pos);
5978       d = string1 + mcnt;
5979       dend = end_match_1;
5980     }
5981   else
5982     {
5983       mcnt = count_mbs_length(mbs_offset2, pos-csize1);
5984       d = string2 + mcnt;
5985       dend = end_match_2;
5986     }
5987
5988   if (mcnt < 0)
5989     { /* count_mbs_length return error.  */
5990       FREE_VARIABLES ();
5991       return -1;
5992     }
5993 #else
5994   if (size1 > 0 && pos <= size1)
5995     {
5996       d = string1 + pos;
5997       dend = end_match_1;
5998     }
5999   else
6000     {
6001       d = string2 + pos - size1;
6002       dend = end_match_2;
6003     }
6004 #endif /* WCHAR */
6005
6006   DEBUG_PRINT1 ("The compiled pattern is:\n");
6007   DEBUG_PRINT_COMPILED_PATTERN (bufp, p, pend);
6008   DEBUG_PRINT1 ("The string to match is: `");
6009   DEBUG_PRINT_DOUBLE_STRING (d, string1, size1, string2, size2);
6010   DEBUG_PRINT1 ("'\n");
6011
6012   /* This loops over pattern commands.  It exits by returning from the
6013      function if the match is complete, or it drops through if the match
6014      fails at this starting point in the input data.  */
6015   for (;;)
6016     {
6017 #ifdef _LIBC
6018       DEBUG_PRINT2 ("\n%p: ", p);
6019 #else
6020       DEBUG_PRINT2 ("\n0x%x: ", p);
6021 #endif
6022
6023       if (p == pend)
6024         { /* End of pattern means we might have succeeded.  */
6025           DEBUG_PRINT1 ("end of pattern ... ");
6026
6027           /* If we haven't matched the entire string, and we want the
6028              longest match, try backtracking.  */
6029           if (d != end_match_2)
6030             {
6031               /* 1 if this match ends in the same string (string1 or string2)
6032                  as the best previous match.  */
6033               boolean same_str_p = (FIRST_STRING_P (match_end)
6034                                     == MATCHING_IN_FIRST_STRING);
6035               /* 1 if this match is the best seen so far.  */
6036               boolean best_match_p;
6037
6038               /* AIX compiler got confused when this was combined
6039                  with the previous declaration.  */
6040               if (same_str_p)
6041                 best_match_p = d > match_end;
6042               else
6043                 best_match_p = !MATCHING_IN_FIRST_STRING;
6044
6045               DEBUG_PRINT1 ("backtracking.\n");
6046
6047               if (!FAIL_STACK_EMPTY ())
6048                 { /* More failure points to try.  */
6049
6050                   /* If exceeds best match so far, save it.  */
6051                   if (!best_regs_set || best_match_p)
6052                     {
6053                       best_regs_set = true;
6054                       match_end = d;
6055
6056                       DEBUG_PRINT1 ("\nSAVING match as best so far.\n");
6057
6058                       for (mcnt = 1; (unsigned) mcnt < num_regs; mcnt++)
6059                         {
6060                           best_regstart[mcnt] = regstart[mcnt];
6061                           best_regend[mcnt] = regend[mcnt];
6062                         }
6063                     }
6064                   goto fail;
6065                 }
6066
6067               /* If no failure points, don't restore garbage.  And if
6068                  last match is real best match, don't restore second
6069                  best one. */
6070               else if (best_regs_set && !best_match_p)
6071                 {
6072                 restore_best_regs:
6073                   /* Restore best match.  It may happen that `dend ==
6074                      end_match_1' while the restored d is in string2.
6075                      For example, the pattern `x.*y.*z' against the
6076                      strings `x-' and `y-z-', if the two strings are
6077                      not consecutive in memory.  */
6078                   DEBUG_PRINT1 ("Restoring best registers.\n");
6079
6080                   d = match_end;
6081                   dend = ((d >= string1 && d <= end1)
6082                            ? end_match_1 : end_match_2);
6083
6084                   for (mcnt = 1; (unsigned) mcnt < num_regs; mcnt++)
6085                     {
6086                       regstart[mcnt] = best_regstart[mcnt];
6087                       regend[mcnt] = best_regend[mcnt];
6088                     }
6089                 }
6090             } /* d != end_match_2 */
6091
6092         succeed_label:
6093           DEBUG_PRINT1 ("Accepting match.\n");
6094           /* If caller wants register contents data back, do it.  */
6095           if (regs && !bufp->no_sub)
6096             {
6097               /* Have the register data arrays been allocated?  */
6098               if (bufp->regs_allocated == REGS_UNALLOCATED)
6099                 { /* No.  So allocate them with malloc.  We need one
6100                      extra element beyond `num_regs' for the `-1' marker
6101                      GNU code uses.  */
6102                   regs->num_regs = MAX (RE_NREGS, num_regs + 1);
6103                   regs->start = TALLOC (regs->num_regs, regoff_t);
6104                   regs->end = TALLOC (regs->num_regs, regoff_t);
6105                   if (regs->start == NULL || regs->end == NULL)
6106                     {
6107                       FREE_VARIABLES ();
6108                       return -2;
6109                     }
6110                   bufp->regs_allocated = REGS_REALLOCATE;
6111                 }
6112               else if (bufp->regs_allocated == REGS_REALLOCATE)
6113                 { /* Yes.  If we need more elements than were already
6114                      allocated, reallocate them.  If we need fewer, just
6115                      leave it alone.  */
6116                   if (regs->num_regs < num_regs + 1)
6117                     {
6118                       regs->num_regs = num_regs + 1;
6119                       RETALLOC (regs->start, regs->num_regs, regoff_t);
6120                       RETALLOC (regs->end, regs->num_regs, regoff_t);
6121                       if (regs->start == NULL || regs->end == NULL)
6122                         {
6123                           FREE_VARIABLES ();
6124                           return -2;
6125                         }
6126                     }
6127                 }
6128               else
6129                 {
6130                   /* These braces fend off a "empty body in an else-statement"
6131                      warning under GCC when assert expands to nothing.  */
6132                   assert (bufp->regs_allocated == REGS_FIXED);
6133                 }
6134
6135               /* Convert the pointer data in `regstart' and `regend' to
6136                  indices.  Register zero has to be set differently,
6137                  since we haven't kept track of any info for it.  */
6138               if (regs->num_regs > 0)
6139                 {
6140                   regs->start[0] = pos;
6141 #ifdef WCHAR
6142                   if (MATCHING_IN_FIRST_STRING)
6143                     regs->end[0] = mbs_offset1 != NULL ?
6144                                         mbs_offset1[d-string1] : 0;
6145                   else
6146                     regs->end[0] = csize1 + (mbs_offset2 != NULL ?
6147                                              mbs_offset2[d-string2] : 0);
6148 #else
6149                   regs->end[0] = (MATCHING_IN_FIRST_STRING
6150                                   ? ((regoff_t) (d - string1))
6151                                   : ((regoff_t) (d - string2 + size1)));
6152 #endif /* WCHAR */
6153                 }
6154
6155               /* Go through the first `min (num_regs, regs->num_regs)'
6156                  registers, since that is all we initialized.  */
6157               for (mcnt = 1; (unsigned) mcnt < MIN (num_regs, regs->num_regs);
6158                    mcnt++)
6159                 {
6160                   if (REG_UNSET (regstart[mcnt]) || REG_UNSET (regend[mcnt]))
6161                     regs->start[mcnt] = regs->end[mcnt] = -1;
6162                   else
6163                     {
6164                       regs->start[mcnt]
6165                         = (regoff_t) POINTER_TO_OFFSET (regstart[mcnt]);
6166                       regs->end[mcnt]
6167                         = (regoff_t) POINTER_TO_OFFSET (regend[mcnt]);
6168                     }
6169                 }
6170
6171               /* If the regs structure we return has more elements than
6172                  were in the pattern, set the extra elements to -1.  If
6173                  we (re)allocated the registers, this is the case,
6174                  because we always allocate enough to have at least one
6175                  -1 at the end.  */
6176               for (mcnt = num_regs; (unsigned) mcnt < regs->num_regs; mcnt++)
6177                 regs->start[mcnt] = regs->end[mcnt] = -1;
6178             } /* regs && !bufp->no_sub */
6179
6180           DEBUG_PRINT4 ("%u failure points pushed, %u popped (%u remain).\n",
6181                         nfailure_points_pushed, nfailure_points_popped,
6182                         nfailure_points_pushed - nfailure_points_popped);
6183           DEBUG_PRINT2 ("%u registers pushed.\n", num_regs_pushed);
6184
6185 #ifdef WCHAR
6186           if (MATCHING_IN_FIRST_STRING)
6187             mcnt = mbs_offset1 != NULL ? mbs_offset1[d-string1] : 0;
6188           else
6189             mcnt = (mbs_offset2 != NULL ? mbs_offset2[d-string2] : 0) +
6190                         csize1;
6191           mcnt -= pos;
6192 #else
6193           mcnt = d - pos - (MATCHING_IN_FIRST_STRING
6194                             ? string1
6195                             : string2 - size1);
6196 #endif /* WCHAR */
6197
6198           DEBUG_PRINT2 ("Returning %d from re_match_2.\n", mcnt);
6199
6200           FREE_VARIABLES ();
6201           return mcnt;
6202         }
6203
6204       /* Otherwise match next pattern command.  */
6205       switch (SWITCH_ENUM_CAST ((re_opcode_t) *p++))
6206         {
6207         /* Ignore these.  Used to ignore the n of succeed_n's which
6208            currently have n == 0.  */
6209         case no_op:
6210           DEBUG_PRINT1 ("EXECUTING no_op.\n");
6211           break;
6212
6213         case succeed:
6214           DEBUG_PRINT1 ("EXECUTING succeed.\n");
6215           goto succeed_label;
6216
6217         /* Match the next n pattern characters exactly.  The following
6218            byte in the pattern defines n, and the n bytes after that
6219            are the characters to match.  */
6220         case exactn:
6221 #ifdef MBS_SUPPORT
6222         case exactn_bin:
6223 #endif
6224           mcnt = *p++;
6225           DEBUG_PRINT2 ("EXECUTING exactn %d.\n", mcnt);
6226
6227           /* This is written out as an if-else so we don't waste time
6228              testing `translate' inside the loop.  */
6229           if (translate)
6230             {
6231               do
6232                 {
6233                   PREFETCH ();
6234 #ifdef WCHAR
6235                   if (*d <= 0xff)
6236                     {
6237                       if ((UCHAR_T) translate[(unsigned char) *d++]
6238                           != (UCHAR_T) *p++)
6239                         goto fail;
6240                     }
6241                   else
6242                     {
6243                       if (*d++ != (CHAR_T) *p++)
6244                         goto fail;
6245                     }
6246 #else
6247                   if ((UCHAR_T) translate[(unsigned char) *d++]
6248                       != (UCHAR_T) *p++)
6249                     goto fail;
6250 #endif /* WCHAR */
6251                 }
6252               while (--mcnt);
6253             }
6254           else
6255             {
6256               do
6257                 {
6258                   PREFETCH ();
6259                   if (*d++ != (CHAR_T) *p++) goto fail;
6260                 }
6261               while (--mcnt);
6262             }
6263           SET_REGS_MATCHED ();
6264           break;
6265
6266
6267         /* Match any character except possibly a newline or a null.  */
6268         case anychar:
6269           DEBUG_PRINT1 ("EXECUTING anychar.\n");
6270
6271           PREFETCH ();
6272
6273           if ((!(bufp->syntax & RE_DOT_NEWLINE) && TRANSLATE (*d) == '\n')
6274               || (bufp->syntax & RE_DOT_NOT_NULL && TRANSLATE (*d) == '\000'))
6275             goto fail;
6276
6277           SET_REGS_MATCHED ();
6278           DEBUG_PRINT2 ("  Matched `%ld'.\n", (long int) *d);
6279           d++;
6280           break;
6281
6282
6283         case charset:
6284         case charset_not:
6285           {
6286             register UCHAR_T c;
6287 #ifdef WCHAR
6288             unsigned int i, char_class_length, coll_symbol_length,
6289               equiv_class_length, ranges_length, chars_length, length;
6290             CHAR_T *workp, *workp2, *charset_top;
6291 #define WORK_BUFFER_SIZE 128
6292             CHAR_T str_buf[WORK_BUFFER_SIZE];
6293 # ifdef _LIBC
6294             uint32_t nrules;
6295 # endif /* _LIBC */
6296 #endif /* WCHAR */
6297             boolean not = (re_opcode_t) *(p - 1) == charset_not;
6298
6299             DEBUG_PRINT2 ("EXECUTING charset%s.\n", not ? "_not" : "");
6300             PREFETCH ();
6301             c = TRANSLATE (*d); /* The character to match.  */
6302 #ifdef WCHAR
6303 # ifdef _LIBC
6304             nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
6305 # endif /* _LIBC */
6306             charset_top = p - 1;
6307             char_class_length = *p++;
6308             coll_symbol_length = *p++;
6309             equiv_class_length = *p++;
6310             ranges_length = *p++;
6311             chars_length = *p++;
6312             /* p points charset[6], so the address of the next instruction
6313                (charset[l+m+n+2o+k+p']) equals p[l+m+n+2*o+p'],
6314                where l=length of char_classes, m=length of collating_symbol,
6315                n=equivalence_class, o=length of char_range,
6316                p'=length of character.  */
6317             workp = p;
6318             /* Update p to indicate the next instruction.  */
6319             p += char_class_length + coll_symbol_length+ equiv_class_length +
6320               2*ranges_length + chars_length;
6321
6322             /* match with char_class?  */
6323             for (i = 0; i < char_class_length ; i += CHAR_CLASS_SIZE)
6324               {
6325                 wctype_t wctype;
6326                 uintptr_t alignedp = ((uintptr_t)workp
6327                                       + __alignof__(wctype_t) - 1)
6328                                       & ~(uintptr_t)(__alignof__(wctype_t) - 1);
6329                 wctype = *((wctype_t*)alignedp);
6330                 workp += CHAR_CLASS_SIZE;
6331                 if (iswctype((wint_t)c, wctype))
6332                   goto char_set_matched;
6333               }
6334
6335             /* match with collating_symbol?  */
6336 # ifdef _LIBC
6337             if (nrules != 0)
6338               {
6339                 const unsigned char *extra = (const unsigned char *)
6340                   _NL_CURRENT (LC_COLLATE, _NL_COLLATE_SYMB_EXTRAMB);
6341
6342                 for (workp2 = workp + coll_symbol_length ; workp < workp2 ;
6343                      workp++)
6344                   {
6345                     int32_t *wextra;
6346                     wextra = (int32_t*)(extra + *workp++);
6347                     for (i = 0; i < *wextra; ++i)
6348                       if (TRANSLATE(d[i]) != wextra[1 + i])
6349                         break;
6350
6351                     if (i == *wextra)
6352                       {
6353                         /* Update d, however d will be incremented at
6354                            char_set_matched:, we decrement d here.  */
6355                         d += i - 1;
6356                         goto char_set_matched;
6357                       }
6358                   }
6359               }
6360             else /* (nrules == 0) */
6361 # endif
6362               /* If we can't look up collation data, we use wcscoll
6363                  instead.  */
6364               {
6365                 for (workp2 = workp + coll_symbol_length ; workp < workp2 ;)
6366                   {
6367                     const CHAR_T *backup_d = d, *backup_dend = dend;
6368                     length = wcslen(workp);
6369
6370                     /* If wcscoll(the collating symbol, whole string) > 0,
6371                        any substring of the string never match with the
6372                        collating symbol.  */
6373                     if (wcscoll(workp, d) > 0)
6374                       {
6375                         workp += length + 1;
6376                         continue;
6377                       }
6378
6379                     /* First, we compare the collating symbol with
6380                        the first character of the string.
6381                        If it don't match, we add the next character to
6382                        the compare buffer in turn.  */
6383                     for (i = 0 ; i < WORK_BUFFER_SIZE-1 ; i++, d++)
6384                       {
6385                         int match;
6386                         if (d == dend)
6387                           {
6388                             if (dend == end_match_2)
6389                               break;
6390                             d = string2;
6391                             dend = end_match_2;
6392                           }
6393
6394                         /* add next character to the compare buffer.  */
6395                         str_buf[i] = TRANSLATE(*d);
6396                         str_buf[i+1] = '\0';
6397
6398                         match = wcscoll(workp, str_buf);
6399                         if (match == 0)
6400                           goto char_set_matched;
6401
6402                         if (match < 0)
6403                           /* (str_buf > workp) indicate (str_buf + X > workp),
6404                              because for all X (str_buf + X > str_buf).
6405                              So we don't need continue this loop.  */
6406                           break;
6407
6408                         /* Otherwise(str_buf < workp),
6409                            (str_buf+next_character) may equals (workp).
6410                            So we continue this loop.  */
6411                       }
6412                     /* not matched */
6413                     d = backup_d;
6414                     dend = backup_dend;
6415                     workp += length + 1;
6416                   }
6417               }
6418             /* match with equivalence_class?  */
6419 # ifdef _LIBC
6420             if (nrules != 0)
6421               {
6422                 const CHAR_T *backup_d = d, *backup_dend = dend;
6423                 /* Try to match the equivalence class against
6424                    those known to the collate implementation.  */
6425                 const int32_t *table;
6426                 const int32_t *weights;
6427                 const int32_t *extra;
6428                 const int32_t *indirect;
6429                 int32_t idx, idx2;
6430                 wint_t *cp;
6431                 size_t len;
6432
6433                 /* This #include defines a local function!  */
6434 #  include <locale/weightwc.h>
6435
6436                 table = (const int32_t *)
6437                   _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEWC);
6438                 weights = (const wint_t *)
6439                   _NL_CURRENT (LC_COLLATE, _NL_COLLATE_WEIGHTWC);
6440                 extra = (const wint_t *)
6441                   _NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAWC);
6442                 indirect = (const int32_t *)
6443                   _NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTWC);
6444
6445                 /* Write 1 collating element to str_buf, and
6446                    get its index.  */
6447                 idx2 = 0;
6448
6449                 for (i = 0 ; idx2 == 0 && i < WORK_BUFFER_SIZE - 1; i++)
6450                   {
6451                     cp = (wint_t*)str_buf;
6452                     if (d == dend)
6453                       {
6454                         if (dend == end_match_2)
6455                           break;
6456                         d = string2;
6457                         dend = end_match_2;
6458                       }
6459                     str_buf[i] = TRANSLATE(*(d+i));
6460                     str_buf[i+1] = '\0'; /* sentinel */
6461                     idx2 = findidx ((const wint_t**)&cp);
6462                   }
6463
6464                 /* Update d, however d will be incremented at
6465                    char_set_matched:, we decrement d here.  */
6466                 d = backup_d + ((wchar_t*)cp - (wchar_t*)str_buf - 1);
6467                 if (d >= dend)
6468                   {
6469                     if (dend == end_match_2)
6470                         d = dend;
6471                     else
6472                       {
6473                         d = string2;
6474                         dend = end_match_2;
6475                       }
6476                   }
6477
6478                 len = weights[idx2];
6479
6480                 for (workp2 = workp + equiv_class_length ; workp < workp2 ;
6481                      workp++)
6482                   {
6483                     idx = (int32_t)*workp;
6484                     /* We already checked idx != 0 in regex_compile. */
6485
6486                     if (idx2 != 0 && len == weights[idx])
6487                       {
6488                         int cnt = 0;
6489                         while (cnt < len && (weights[idx + 1 + cnt]
6490                                              == weights[idx2 + 1 + cnt]))
6491                           ++cnt;
6492
6493                         if (cnt == len)
6494                           goto char_set_matched;
6495                       }
6496                   }
6497                 /* not matched */
6498                 d = backup_d;
6499                 dend = backup_dend;
6500               }
6501             else /* (nrules == 0) */
6502 # endif
6503               /* If we can't look up collation data, we use wcscoll
6504                  instead.  */
6505               {
6506                 for (workp2 = workp + equiv_class_length ; workp < workp2 ;)
6507                   {
6508                     const CHAR_T *backup_d = d, *backup_dend = dend;
6509                     length = wcslen(workp);
6510
6511                     /* If wcscoll(the collating symbol, whole string) > 0,
6512                        any substring of the string never match with the
6513                        collating symbol.  */
6514                     if (wcscoll(workp, d) > 0)
6515                       {
6516                         workp += length + 1;
6517                         break;
6518                       }
6519
6520                     /* First, we compare the equivalence class with
6521                        the first character of the string.
6522                        If it don't match, we add the next character to
6523                        the compare buffer in turn.  */
6524                     for (i = 0 ; i < WORK_BUFFER_SIZE - 1 ; i++, d++)
6525                       {
6526                         int match;
6527                         if (d == dend)
6528                           {
6529                             if (dend == end_match_2)
6530                               break;
6531                             d = string2;
6532                             dend = end_match_2;
6533                           }
6534
6535                         /* add next character to the compare buffer.  */
6536                         str_buf[i] = TRANSLATE(*d);
6537                         str_buf[i+1] = '\0';
6538
6539                         match = wcscoll(workp, str_buf);
6540
6541                         if (match == 0)
6542                           goto char_set_matched;
6543
6544                         if (match < 0)
6545                         /* (str_buf > workp) indicate (str_buf + X > workp),
6546                            because for all X (str_buf + X > str_buf).
6547                            So we don't need continue this loop.  */
6548                           break;
6549
6550                         /* Otherwise(str_buf < workp),
6551                            (str_buf+next_character) may equals (workp).
6552                            So we continue this loop.  */
6553                       }
6554                     /* not matched */
6555                     d = backup_d;
6556                     dend = backup_dend;
6557                     workp += length + 1;
6558                   }
6559               }
6560
6561             /* match with char_range?  */
6562 #ifdef _LIBC
6563             if (nrules != 0)
6564               {
6565                 uint32_t collseqval;
6566                 const char *collseq = (const char *)
6567                   _NL_CURRENT(LC_COLLATE, _NL_COLLATE_COLLSEQWC);
6568
6569                 collseqval = collseq_table_lookup (collseq, c);
6570
6571                 for (; workp < p - chars_length ;)
6572                   {
6573                     uint32_t start_val, end_val;
6574
6575                     /* We already compute the collation sequence value
6576                        of the characters (or collating symbols).  */
6577                     start_val = (uint32_t) *workp++; /* range_start */
6578                     end_val = (uint32_t) *workp++; /* range_end */
6579
6580                     if (start_val <= collseqval && collseqval <= end_val)
6581                       goto char_set_matched;
6582                   }
6583               }
6584             else
6585 #endif
6586               {
6587                 /* We set range_start_char at str_buf[0], range_end_char
6588                    at str_buf[4], and compared char at str_buf[2].  */
6589                 str_buf[1] = 0;
6590                 str_buf[2] = c;
6591                 str_buf[3] = 0;
6592                 str_buf[5] = 0;
6593                 for (; workp < p - chars_length ;)
6594                   {
6595                     wchar_t *range_start_char, *range_end_char;
6596
6597                     /* match if (range_start_char <= c <= range_end_char).  */
6598
6599                     /* If range_start(or end) < 0, we assume -range_start(end)
6600                        is the offset of the collating symbol which is specified
6601                        as the character of the range start(end).  */
6602
6603                     /* range_start */
6604                     if (*workp < 0)
6605                       range_start_char = charset_top - (*workp++);
6606                     else
6607                       {
6608                         str_buf[0] = *workp++;
6609                         range_start_char = str_buf;
6610                       }
6611
6612                     /* range_end */
6613                     if (*workp < 0)
6614                       range_end_char = charset_top - (*workp++);
6615                     else
6616                       {
6617                         str_buf[4] = *workp++;
6618                         range_end_char = str_buf + 4;
6619                       }
6620
6621                     if (wcscoll(range_start_char, str_buf+2) <= 0 &&
6622                         wcscoll(str_buf+2, range_end_char) <= 0)
6623
6624                       goto char_set_matched;
6625                   }
6626               }
6627
6628             /* match with char?  */
6629             for (; workp < p ; workp++)
6630               if (c == *workp)
6631                 goto char_set_matched;
6632
6633             not = !not;
6634
6635           char_set_matched:
6636             if (not) goto fail;
6637 #else
6638             /* Cast to `unsigned' instead of `unsigned char' in case the
6639                bit list is a full 32 bytes long.  */
6640             if (c < (unsigned) (*p * BYTEWIDTH)
6641                 && p[1 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH)))
6642               not = !not;
6643
6644             p += 1 + *p;
6645
6646             if (!not) goto fail;
6647 #undef WORK_BUFFER_SIZE
6648 #endif /* WCHAR */
6649             SET_REGS_MATCHED ();
6650             d++;
6651             break;
6652           }
6653
6654
6655         /* The beginning of a group is represented by start_memory.
6656            The arguments are the register number in the next byte, and the
6657            number of groups inner to this one in the next.  The text
6658            matched within the group is recorded (in the internal
6659            registers data structure) under the register number.  */
6660         case start_memory:
6661           DEBUG_PRINT3 ("EXECUTING start_memory %ld (%ld):\n",
6662                         (long int) *p, (long int) p[1]);
6663
6664           /* Find out if this group can match the empty string.  */
6665           p1 = p;               /* To send to group_match_null_string_p.  */
6666
6667           if (REG_MATCH_NULL_STRING_P (reg_info[*p]) == MATCH_NULL_UNSET_VALUE)
6668             REG_MATCH_NULL_STRING_P (reg_info[*p])
6669               = PREFIX(group_match_null_string_p) (&p1, pend, reg_info);
6670
6671           /* Save the position in the string where we were the last time
6672              we were at this open-group operator in case the group is
6673              operated upon by a repetition operator, e.g., with `(a*)*b'
6674              against `ab'; then we want to ignore where we are now in
6675              the string in case this attempt to match fails.  */
6676           old_regstart[*p] = REG_MATCH_NULL_STRING_P (reg_info[*p])
6677                              ? REG_UNSET (regstart[*p]) ? d : regstart[*p]
6678                              : regstart[*p];
6679           DEBUG_PRINT2 ("  old_regstart: %d\n",
6680                          POINTER_TO_OFFSET (old_regstart[*p]));
6681
6682           regstart[*p] = d;
6683           DEBUG_PRINT2 ("  regstart: %d\n", POINTER_TO_OFFSET (regstart[*p]));
6684
6685           IS_ACTIVE (reg_info[*p]) = 1;
6686           MATCHED_SOMETHING (reg_info[*p]) = 0;
6687
6688           /* Clear this whenever we change the register activity status.  */
6689           set_regs_matched_done = 0;
6690
6691           /* This is the new highest active register.  */
6692           highest_active_reg = *p;
6693
6694           /* If nothing was active before, this is the new lowest active
6695              register.  */
6696           if (lowest_active_reg == NO_LOWEST_ACTIVE_REG)
6697             lowest_active_reg = *p;
6698
6699           /* Move past the register number and inner group count.  */
6700           p += 2;
6701           just_past_start_mem = p;
6702
6703           break;
6704
6705
6706         /* The stop_memory opcode represents the end of a group.  Its
6707            arguments are the same as start_memory's: the register
6708            number, and the number of inner groups.  */
6709         case stop_memory:
6710           DEBUG_PRINT3 ("EXECUTING stop_memory %ld (%ld):\n",
6711                         (long int) *p, (long int) p[1]);
6712
6713           /* We need to save the string position the last time we were at
6714              this close-group operator in case the group is operated
6715              upon by a repetition operator, e.g., with `((a*)*(b*)*)*'
6716              against `aba'; then we want to ignore where we are now in
6717              the string in case this attempt to match fails.  */
6718           old_regend[*p] = REG_MATCH_NULL_STRING_P (reg_info[*p])
6719                            ? REG_UNSET (regend[*p]) ? d : regend[*p]
6720                            : regend[*p];
6721           DEBUG_PRINT2 ("      old_regend: %d\n",
6722                          POINTER_TO_OFFSET (old_regend[*p]));
6723
6724           regend[*p] = d;
6725           DEBUG_PRINT2 ("      regend: %d\n", POINTER_TO_OFFSET (regend[*p]));
6726
6727           /* This register isn't active anymore.  */
6728           IS_ACTIVE (reg_info[*p]) = 0;
6729
6730           /* Clear this whenever we change the register activity status.  */
6731           set_regs_matched_done = 0;
6732
6733           /* If this was the only register active, nothing is active
6734              anymore.  */
6735           if (lowest_active_reg == highest_active_reg)
6736             {
6737               lowest_active_reg = NO_LOWEST_ACTIVE_REG;
6738               highest_active_reg = NO_HIGHEST_ACTIVE_REG;
6739             }
6740           else
6741             { /* We must scan for the new highest active register, since
6742                  it isn't necessarily one less than now: consider
6743                  (a(b)c(d(e)f)g).  When group 3 ends, after the f), the
6744                  new highest active register is 1.  */
6745               UCHAR_T r = *p - 1;
6746               while (r > 0 && !IS_ACTIVE (reg_info[r]))
6747                 r--;
6748
6749               /* If we end up at register zero, that means that we saved
6750                  the registers as the result of an `on_failure_jump', not
6751                  a `start_memory', and we jumped to past the innermost
6752                  `stop_memory'.  For example, in ((.)*) we save
6753                  registers 1 and 2 as a result of the *, but when we pop
6754                  back to the second ), we are at the stop_memory 1.
6755                  Thus, nothing is active.  */
6756               if (r == 0)
6757                 {
6758                   lowest_active_reg = NO_LOWEST_ACTIVE_REG;
6759                   highest_active_reg = NO_HIGHEST_ACTIVE_REG;
6760                 }
6761               else
6762                 highest_active_reg = r;
6763             }
6764
6765           /* If just failed to match something this time around with a
6766              group that's operated on by a repetition operator, try to
6767              force exit from the ``loop'', and restore the register
6768              information for this group that we had before trying this
6769              last match.  */
6770           if ((!MATCHED_SOMETHING (reg_info[*p])
6771                || just_past_start_mem == p - 1)
6772               && (p + 2) < pend)
6773             {
6774               boolean is_a_jump_n = false;
6775
6776               p1 = p + 2;
6777               mcnt = 0;
6778               switch ((re_opcode_t) *p1++)
6779                 {
6780                   case jump_n:
6781                     is_a_jump_n = true;
6782                   case pop_failure_jump:
6783                   case maybe_pop_jump:
6784                   case jump:
6785                   case dummy_failure_jump:
6786                     EXTRACT_NUMBER_AND_INCR (mcnt, p1);
6787                     if (is_a_jump_n)
6788                       p1 += OFFSET_ADDRESS_SIZE;
6789                     break;
6790
6791                   default:
6792                     /* do nothing */ ;
6793                 }
6794               p1 += mcnt;
6795
6796               /* If the next operation is a jump backwards in the pattern
6797                  to an on_failure_jump right before the start_memory
6798                  corresponding to this stop_memory, exit from the loop
6799                  by forcing a failure after pushing on the stack the
6800                  on_failure_jump's jump in the pattern, and d.  */
6801               if (mcnt < 0 && (re_opcode_t) *p1 == on_failure_jump
6802                   && (re_opcode_t) p1[1+OFFSET_ADDRESS_SIZE] == start_memory
6803                   && p1[2+OFFSET_ADDRESS_SIZE] == *p)
6804                 {
6805                   /* If this group ever matched anything, then restore
6806                      what its registers were before trying this last
6807                      failed match, e.g., with `(a*)*b' against `ab' for
6808                      regstart[1], and, e.g., with `((a*)*(b*)*)*'
6809                      against `aba' for regend[3].
6810
6811                      Also restore the registers for inner groups for,
6812                      e.g., `((a*)(b*))*' against `aba' (register 3 would
6813                      otherwise get trashed).  */
6814
6815                   if (EVER_MATCHED_SOMETHING (reg_info[*p]))
6816                     {
6817                       unsigned r;
6818
6819                       EVER_MATCHED_SOMETHING (reg_info[*p]) = 0;
6820
6821                       /* Restore this and inner groups' (if any) registers.  */
6822                       for (r = *p; r < (unsigned) *p + (unsigned) *(p + 1);
6823                            r++)
6824                         {
6825                           regstart[r] = old_regstart[r];
6826
6827                           /* xx why this test?  */
6828                           if (old_regend[r] >= regstart[r])
6829                             regend[r] = old_regend[r];
6830                         }
6831                     }
6832                   p1++;
6833                   EXTRACT_NUMBER_AND_INCR (mcnt, p1);
6834                   PUSH_FAILURE_POINT (p1 + mcnt, d, -2);
6835
6836                   goto fail;
6837                 }
6838             }
6839
6840           /* Move past the register number and the inner group count.  */
6841           p += 2;
6842           break;
6843
6844
6845         /* \<digit> has been turned into a `duplicate' command which is
6846            followed by the numeric value of <digit> as the register number.  */
6847         case duplicate:
6848           {
6849             register const CHAR_T *d2, *dend2;
6850             int regno = *p++;   /* Get which register to match against.  */
6851             DEBUG_PRINT2 ("EXECUTING duplicate %d.\n", regno);
6852
6853             /* Can't back reference a group which we've never matched.  */
6854             if (REG_UNSET (regstart[regno]) || REG_UNSET (regend[regno]))
6855               goto fail;
6856
6857             /* Where in input to try to start matching.  */
6858             d2 = regstart[regno];
6859
6860             /* Where to stop matching; if both the place to start and
6861                the place to stop matching are in the same string, then
6862                set to the place to stop, otherwise, for now have to use
6863                the end of the first string.  */
6864
6865             dend2 = ((FIRST_STRING_P (regstart[regno])
6866                       == FIRST_STRING_P (regend[regno]))
6867                      ? regend[regno] : end_match_1);
6868             for (;;)
6869               {
6870                 /* If necessary, advance to next segment in register
6871                    contents.  */
6872                 while (d2 == dend2)
6873                   {
6874                     if (dend2 == end_match_2) break;
6875                     if (dend2 == regend[regno]) break;
6876
6877                     /* End of string1 => advance to string2. */
6878                     d2 = string2;
6879                     dend2 = regend[regno];
6880                   }
6881                 /* At end of register contents => success */
6882                 if (d2 == dend2) break;
6883
6884                 /* If necessary, advance to next segment in data.  */
6885                 PREFETCH ();
6886
6887                 /* How many characters left in this segment to match.  */
6888                 mcnt = dend - d;
6889
6890                 /* Want how many consecutive characters we can match in
6891                    one shot, so, if necessary, adjust the count.  */
6892                 if (mcnt > dend2 - d2)
6893                   mcnt = dend2 - d2;
6894
6895                 /* Compare that many; failure if mismatch, else move
6896                    past them.  */
6897                 if (translate
6898                     ? PREFIX(bcmp_translate) (d, d2, mcnt, translate)
6899                     : memcmp (d, d2, mcnt*sizeof(UCHAR_T)))
6900                   goto fail;
6901                 d += mcnt, d2 += mcnt;
6902
6903                 /* Do this because we've match some characters.  */
6904                 SET_REGS_MATCHED ();
6905               }
6906           }
6907           break;
6908
6909
6910         /* begline matches the empty string at the beginning of the string
6911            (unless `not_bol' is set in `bufp'), and, if
6912            `newline_anchor' is set, after newlines.  */
6913         case begline:
6914           DEBUG_PRINT1 ("EXECUTING begline.\n");
6915
6916           if (AT_STRINGS_BEG (d))
6917             {
6918               if (!bufp->not_bol) break;
6919             }
6920           else if (d[-1] == '\n' && bufp->newline_anchor)
6921             {
6922               break;
6923             }
6924           /* In all other cases, we fail.  */
6925           goto fail;
6926
6927
6928         /* endline is the dual of begline.  */
6929         case endline:
6930           DEBUG_PRINT1 ("EXECUTING endline.\n");
6931
6932           if (AT_STRINGS_END (d))
6933             {
6934               if (!bufp->not_eol) break;
6935             }
6936
6937           /* We have to ``prefetch'' the next character.  */
6938           else if ((d == end1 ? *string2 : *d) == '\n'
6939                    && bufp->newline_anchor)
6940             {
6941               break;
6942             }
6943           goto fail;
6944
6945
6946         /* Match at the very beginning of the data.  */
6947         case begbuf:
6948           DEBUG_PRINT1 ("EXECUTING begbuf.\n");
6949           if (AT_STRINGS_BEG (d))
6950             break;
6951           goto fail;
6952
6953
6954         /* Match at the very end of the data.  */
6955         case endbuf:
6956           DEBUG_PRINT1 ("EXECUTING endbuf.\n");
6957           if (AT_STRINGS_END (d))
6958             break;
6959           goto fail;
6960
6961
6962         /* on_failure_keep_string_jump is used to optimize `.*\n'.  It
6963            pushes NULL as the value for the string on the stack.  Then
6964            `pop_failure_point' will keep the current value for the
6965            string, instead of restoring it.  To see why, consider
6966            matching `foo\nbar' against `.*\n'.  The .* matches the foo;
6967            then the . fails against the \n.  But the next thing we want
6968            to do is match the \n against the \n; if we restored the
6969            string value, we would be back at the foo.
6970
6971            Because this is used only in specific cases, we don't need to
6972            check all the things that `on_failure_jump' does, to make
6973            sure the right things get saved on the stack.  Hence we don't
6974            share its code.  The only reason to push anything on the
6975            stack at all is that otherwise we would have to change
6976            `anychar's code to do something besides goto fail in this
6977            case; that seems worse than this.  */
6978         case on_failure_keep_string_jump:
6979           DEBUG_PRINT1 ("EXECUTING on_failure_keep_string_jump");
6980
6981           EXTRACT_NUMBER_AND_INCR (mcnt, p);
6982 #ifdef _LIBC
6983           DEBUG_PRINT3 (" %d (to %p):\n", mcnt, p + mcnt);
6984 #else
6985           DEBUG_PRINT3 (" %d (to 0x%x):\n", mcnt, p + mcnt);
6986 #endif
6987
6988           PUSH_FAILURE_POINT (p + mcnt, NULL, -2);
6989           break;
6990
6991
6992         /* Uses of on_failure_jump:
6993
6994            Each alternative starts with an on_failure_jump that points
6995            to the beginning of the next alternative.  Each alternative
6996            except the last ends with a jump that in effect jumps past
6997            the rest of the alternatives.  (They really jump to the
6998            ending jump of the following alternative, because tensioning
6999            these jumps is a hassle.)
7000
7001            Repeats start with an on_failure_jump that points past both
7002            the repetition text and either the following jump or
7003            pop_failure_jump back to this on_failure_jump.  */
7004         case on_failure_jump:
7005         on_failure:
7006           DEBUG_PRINT1 ("EXECUTING on_failure_jump");
7007
7008           EXTRACT_NUMBER_AND_INCR (mcnt, p);
7009 #ifdef _LIBC
7010           DEBUG_PRINT3 (" %d (to %p)", mcnt, p + mcnt);
7011 #else
7012           DEBUG_PRINT3 (" %d (to 0x%x)", mcnt, p + mcnt);
7013 #endif
7014
7015           /* If this on_failure_jump comes right before a group (i.e.,
7016              the original * applied to a group), save the information
7017              for that group and all inner ones, so that if we fail back
7018              to this point, the group's information will be correct.
7019              For example, in \(a*\)*\1, we need the preceding group,
7020              and in \(zz\(a*\)b*\)\2, we need the inner group.  */
7021
7022           /* We can't use `p' to check ahead because we push
7023              a failure point to `p + mcnt' after we do this.  */
7024           p1 = p;
7025
7026           /* We need to skip no_op's before we look for the
7027              start_memory in case this on_failure_jump is happening as
7028              the result of a completed succeed_n, as in \(a\)\{1,3\}b\1
7029              against aba.  */
7030           while (p1 < pend && (re_opcode_t) *p1 == no_op)
7031             p1++;
7032
7033           if (p1 < pend && (re_opcode_t) *p1 == start_memory)
7034             {
7035               /* We have a new highest active register now.  This will
7036                  get reset at the start_memory we are about to get to,
7037                  but we will have saved all the registers relevant to
7038                  this repetition op, as described above.  */
7039               highest_active_reg = *(p1 + 1) + *(p1 + 2);
7040               if (lowest_active_reg == NO_LOWEST_ACTIVE_REG)
7041                 lowest_active_reg = *(p1 + 1);
7042             }
7043
7044           DEBUG_PRINT1 (":\n");
7045           PUSH_FAILURE_POINT (p + mcnt, d, -2);
7046           break;
7047
7048
7049         /* A smart repeat ends with `maybe_pop_jump'.
7050            We change it to either `pop_failure_jump' or `jump'.  */
7051         case maybe_pop_jump:
7052           EXTRACT_NUMBER_AND_INCR (mcnt, p);
7053           DEBUG_PRINT2 ("EXECUTING maybe_pop_jump %d.\n", mcnt);
7054           {
7055             register UCHAR_T *p2 = p;
7056
7057             /* Compare the beginning of the repeat with what in the
7058                pattern follows its end. If we can establish that there
7059                is nothing that they would both match, i.e., that we
7060                would have to backtrack because of (as in, e.g., `a*a')
7061                then we can change to pop_failure_jump, because we'll
7062                never have to backtrack.
7063
7064                This is not true in the case of alternatives: in
7065                `(a|ab)*' we do need to backtrack to the `ab' alternative
7066                (e.g., if the string was `ab').  But instead of trying to
7067                detect that here, the alternative has put on a dummy
7068                failure point which is what we will end up popping.  */
7069
7070             /* Skip over open/close-group commands.
7071                If what follows this loop is a ...+ construct,
7072                look at what begins its body, since we will have to
7073                match at least one of that.  */
7074             while (1)
7075               {
7076                 if (p2 + 2 < pend
7077                     && ((re_opcode_t) *p2 == stop_memory
7078                         || (re_opcode_t) *p2 == start_memory))
7079                   p2 += 3;
7080                 else if (p2 + 2 + 2 * OFFSET_ADDRESS_SIZE < pend
7081                          && (re_opcode_t) *p2 == dummy_failure_jump)
7082                   p2 += 2 + 2 * OFFSET_ADDRESS_SIZE;
7083                 else
7084                   break;
7085               }
7086
7087             p1 = p + mcnt;
7088             /* p1[0] ... p1[2] are the `on_failure_jump' corresponding
7089                to the `maybe_finalize_jump' of this case.  Examine what
7090                follows.  */
7091
7092             /* If we're at the end of the pattern, we can change.  */
7093             if (p2 == pend)
7094               {
7095                 /* Consider what happens when matching ":\(.*\)"
7096                    against ":/".  I don't really understand this code
7097                    yet.  */
7098                 p[-(1+OFFSET_ADDRESS_SIZE)] = (UCHAR_T)
7099                   pop_failure_jump;
7100                 DEBUG_PRINT1
7101                   ("  End of pattern: change to `pop_failure_jump'.\n");
7102               }
7103
7104             else if ((re_opcode_t) *p2 == exactn
7105 #ifdef MBS_SUPPORT
7106                      || (re_opcode_t) *p2 == exactn_bin
7107 #endif
7108                      || (bufp->newline_anchor && (re_opcode_t) *p2 == endline))
7109               {
7110                 register UCHAR_T c
7111                   = *p2 == (UCHAR_T) endline ? '\n' : p2[2];
7112
7113                 if (((re_opcode_t) p1[1+OFFSET_ADDRESS_SIZE] == exactn
7114 #ifdef MBS_SUPPORT
7115                      || (re_opcode_t) p1[1+OFFSET_ADDRESS_SIZE] == exactn_bin
7116 #endif
7117                     ) && p1[3+OFFSET_ADDRESS_SIZE] != c)
7118                   {
7119                     p[-(1+OFFSET_ADDRESS_SIZE)] = (UCHAR_T)
7120                       pop_failure_jump;
7121 #ifdef WCHAR
7122                       DEBUG_PRINT3 ("  %C != %C => pop_failure_jump.\n",
7123                                     (wint_t) c,
7124                                     (wint_t) p1[3+OFFSET_ADDRESS_SIZE]);
7125 #else
7126                       DEBUG_PRINT3 ("  %c != %c => pop_failure_jump.\n",
7127                                     (char) c,
7128                                     (char) p1[3+OFFSET_ADDRESS_SIZE]);
7129 #endif
7130                   }
7131
7132 #ifndef WCHAR
7133                 else if ((re_opcode_t) p1[3] == charset
7134                          || (re_opcode_t) p1[3] == charset_not)
7135                   {
7136                     int not = (re_opcode_t) p1[3] == charset_not;
7137
7138                     if (c < (unsigned) (p1[4] * BYTEWIDTH)
7139                         && p1[5 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH)))
7140                       not = !not;
7141
7142                     /* `not' is equal to 1 if c would match, which means
7143                         that we can't change to pop_failure_jump.  */
7144                     if (!not)
7145                       {
7146                         p[-3] = (unsigned char) pop_failure_jump;
7147                         DEBUG_PRINT1 ("  No match => pop_failure_jump.\n");
7148                       }
7149                   }
7150 #endif /* not WCHAR */
7151               }
7152 #ifndef WCHAR
7153             else if ((re_opcode_t) *p2 == charset)
7154               {
7155                 /* We win if the first character of the loop is not part
7156                    of the charset.  */
7157                 if ((re_opcode_t) p1[3] == exactn
7158                     && ! ((int) p2[1] * BYTEWIDTH > (int) p1[5]
7159                           && (p2[2 + p1[5] / BYTEWIDTH]
7160                               & (1 << (p1[5] % BYTEWIDTH)))))
7161                   {
7162                     p[-3] = (unsigned char) pop_failure_jump;
7163                     DEBUG_PRINT1 ("  No match => pop_failure_jump.\n");
7164                   }
7165
7166                 else if ((re_opcode_t) p1[3] == charset_not)
7167                   {
7168                     int idx;
7169                     /* We win if the charset_not inside the loop
7170                        lists every character listed in the charset after.  */
7171                     for (idx = 0; idx < (int) p2[1]; idx++)
7172                       if (! (p2[2 + idx] == 0
7173                              || (idx < (int) p1[4]
7174                                  && ((p2[2 + idx] & ~ p1[5 + idx]) == 0))))
7175                         break;
7176
7177                     if (idx == p2[1])
7178                       {
7179                         p[-3] = (unsigned char) pop_failure_jump;
7180                         DEBUG_PRINT1 ("  No match => pop_failure_jump.\n");
7181                       }
7182                   }
7183                 else if ((re_opcode_t) p1[3] == charset)
7184                   {
7185                     int idx;
7186                     /* We win if the charset inside the loop
7187                        has no overlap with the one after the loop.  */
7188                     for (idx = 0;
7189                          idx < (int) p2[1] && idx < (int) p1[4];
7190                          idx++)
7191                       if ((p2[2 + idx] & p1[5 + idx]) != 0)
7192                         break;
7193
7194                     if (idx == p2[1] || idx == p1[4])
7195                       {
7196                         p[-3] = (unsigned char) pop_failure_jump;
7197                         DEBUG_PRINT1 ("  No match => pop_failure_jump.\n");
7198                       }
7199                   }
7200               }
7201 #endif /* not WCHAR */
7202           }
7203           p -= OFFSET_ADDRESS_SIZE;     /* Point at relative address again.  */
7204           if ((re_opcode_t) p[-1] != pop_failure_jump)
7205             {
7206               p[-1] = (UCHAR_T) jump;
7207               DEBUG_PRINT1 ("  Match => jump.\n");
7208               goto unconditional_jump;
7209             }
7210         /* Note fall through.  */
7211
7212
7213         /* The end of a simple repeat has a pop_failure_jump back to
7214            its matching on_failure_jump, where the latter will push a
7215            failure point.  The pop_failure_jump takes off failure
7216            points put on by this pop_failure_jump's matching
7217            on_failure_jump; we got through the pattern to here from the
7218            matching on_failure_jump, so didn't fail.  */
7219         case pop_failure_jump:
7220           {
7221             /* We need to pass separate storage for the lowest and
7222                highest registers, even though we don't care about the
7223                actual values.  Otherwise, we will restore only one
7224                register from the stack, since lowest will == highest in
7225                `pop_failure_point'.  */
7226             active_reg_t dummy_low_reg, dummy_high_reg;
7227             UCHAR_T *pdummy = NULL;
7228             const CHAR_T *sdummy = NULL;
7229
7230             DEBUG_PRINT1 ("EXECUTING pop_failure_jump.\n");
7231             POP_FAILURE_POINT (sdummy, pdummy,
7232                                dummy_low_reg, dummy_high_reg,
7233                                reg_dummy, reg_dummy, reg_info_dummy);
7234           }
7235           /* Note fall through.  */
7236
7237         unconditional_jump:
7238 #ifdef _LIBC
7239           DEBUG_PRINT2 ("\n%p: ", p);
7240 #else
7241           DEBUG_PRINT2 ("\n0x%x: ", p);
7242 #endif
7243           /* Note fall through.  */
7244
7245         /* Unconditionally jump (without popping any failure points).  */
7246         case jump:
7247           EXTRACT_NUMBER_AND_INCR (mcnt, p);    /* Get the amount to jump.  */
7248           DEBUG_PRINT2 ("EXECUTING jump %d ", mcnt);
7249           p += mcnt;                            /* Do the jump.  */
7250 #ifdef _LIBC
7251           DEBUG_PRINT2 ("(to %p).\n", p);
7252 #else
7253           DEBUG_PRINT2 ("(to 0x%x).\n", p);
7254 #endif
7255           break;
7256
7257
7258         /* We need this opcode so we can detect where alternatives end
7259            in `group_match_null_string_p' et al.  */
7260         case jump_past_alt:
7261           DEBUG_PRINT1 ("EXECUTING jump_past_alt.\n");
7262           goto unconditional_jump;
7263
7264
7265         /* Normally, the on_failure_jump pushes a failure point, which
7266            then gets popped at pop_failure_jump.  We will end up at
7267            pop_failure_jump, also, and with a pattern of, say, `a+', we
7268            are skipping over the on_failure_jump, so we have to push
7269            something meaningless for pop_failure_jump to pop.  */
7270         case dummy_failure_jump:
7271           DEBUG_PRINT1 ("EXECUTING dummy_failure_jump.\n");
7272           /* It doesn't matter what we push for the string here.  What
7273              the code at `fail' tests is the value for the pattern.  */
7274           PUSH_FAILURE_POINT (NULL, NULL, -2);
7275           goto unconditional_jump;
7276
7277
7278         /* At the end of an alternative, we need to push a dummy failure
7279            point in case we are followed by a `pop_failure_jump', because
7280            we don't want the failure point for the alternative to be
7281            popped.  For example, matching `(a|ab)*' against `aab'
7282            requires that we match the `ab' alternative.  */
7283         case push_dummy_failure:
7284           DEBUG_PRINT1 ("EXECUTING push_dummy_failure.\n");
7285           /* See comments just above at `dummy_failure_jump' about the
7286              two zeroes.  */
7287           PUSH_FAILURE_POINT (NULL, NULL, -2);
7288           break;
7289
7290         /* Have to succeed matching what follows at least n times.
7291            After that, handle like `on_failure_jump'.  */
7292         case succeed_n:
7293           EXTRACT_NUMBER (mcnt, p + OFFSET_ADDRESS_SIZE);
7294           DEBUG_PRINT2 ("EXECUTING succeed_n %d.\n", mcnt);
7295
7296           assert (mcnt >= 0);
7297           /* Originally, this is how many times we HAVE to succeed.  */
7298           if (mcnt > 0)
7299             {
7300                mcnt--;
7301                p += OFFSET_ADDRESS_SIZE;
7302                STORE_NUMBER_AND_INCR (p, mcnt);
7303 #ifdef _LIBC
7304                DEBUG_PRINT3 ("  Setting %p to %d.\n", p - OFFSET_ADDRESS_SIZE
7305                              , mcnt);
7306 #else
7307                DEBUG_PRINT3 ("  Setting 0x%x to %d.\n", p - OFFSET_ADDRESS_SIZE
7308                              , mcnt);
7309 #endif
7310             }
7311           else if (mcnt == 0)
7312             {
7313 #ifdef _LIBC
7314               DEBUG_PRINT2 ("  Setting two bytes from %p to no_op.\n",
7315                             p + OFFSET_ADDRESS_SIZE);
7316 #else
7317               DEBUG_PRINT2 ("  Setting two bytes from 0x%x to no_op.\n",
7318                             p + OFFSET_ADDRESS_SIZE);
7319 #endif /* _LIBC */
7320
7321 #ifdef WCHAR
7322               p[1] = (UCHAR_T) no_op;
7323 #else
7324               p[2] = (UCHAR_T) no_op;
7325               p[3] = (UCHAR_T) no_op;
7326 #endif /* WCHAR */
7327               goto on_failure;
7328             }
7329           break;
7330
7331         case jump_n:
7332           EXTRACT_NUMBER (mcnt, p + OFFSET_ADDRESS_SIZE);
7333           DEBUG_PRINT2 ("EXECUTING jump_n %d.\n", mcnt);
7334
7335           /* Originally, this is how many times we CAN jump.  */
7336           if (mcnt)
7337             {
7338                mcnt--;
7339                STORE_NUMBER (p + OFFSET_ADDRESS_SIZE, mcnt);
7340
7341 #ifdef _LIBC
7342                DEBUG_PRINT3 ("  Setting %p to %d.\n", p + OFFSET_ADDRESS_SIZE,
7343                              mcnt);
7344 #else
7345                DEBUG_PRINT3 ("  Setting 0x%x to %d.\n", p + OFFSET_ADDRESS_SIZE,
7346                              mcnt);
7347 #endif /* _LIBC */
7348                goto unconditional_jump;
7349             }
7350           /* If don't have to jump any more, skip over the rest of command.  */
7351           else
7352             p += 2 * OFFSET_ADDRESS_SIZE;
7353           break;
7354
7355         case set_number_at:
7356           {
7357             DEBUG_PRINT1 ("EXECUTING set_number_at.\n");
7358
7359             EXTRACT_NUMBER_AND_INCR (mcnt, p);
7360             p1 = p + mcnt;
7361             EXTRACT_NUMBER_AND_INCR (mcnt, p);
7362 #ifdef _LIBC
7363             DEBUG_PRINT3 ("  Setting %p to %d.\n", p1, mcnt);
7364 #else
7365             DEBUG_PRINT3 ("  Setting 0x%x to %d.\n", p1, mcnt);
7366 #endif
7367             STORE_NUMBER (p1, mcnt);
7368             break;
7369           }
7370
7371 #if 0
7372         /* The DEC Alpha C compiler 3.x generates incorrect code for the
7373            test  WORDCHAR_P (d - 1) != WORDCHAR_P (d)  in the expansion of
7374            AT_WORD_BOUNDARY, so this code is disabled.  Expanding the
7375            macro and introducing temporary variables works around the bug.  */
7376
7377         case wordbound:
7378           DEBUG_PRINT1 ("EXECUTING wordbound.\n");
7379           if (AT_WORD_BOUNDARY (d))
7380             break;
7381           goto fail;
7382
7383         case notwordbound:
7384           DEBUG_PRINT1 ("EXECUTING notwordbound.\n");
7385           if (AT_WORD_BOUNDARY (d))
7386             goto fail;
7387           break;
7388 #else
7389         case wordbound:
7390         {
7391           boolean prevchar, thischar;
7392
7393           DEBUG_PRINT1 ("EXECUTING wordbound.\n");
7394           if (AT_STRINGS_BEG (d) || AT_STRINGS_END (d))
7395             break;
7396
7397           prevchar = WORDCHAR_P (d - 1);
7398           thischar = WORDCHAR_P (d);
7399           if (prevchar != thischar)
7400             break;
7401           goto fail;
7402         }
7403
7404       case notwordbound:
7405         {
7406           boolean prevchar, thischar;
7407
7408           DEBUG_PRINT1 ("EXECUTING notwordbound.\n");
7409           if (AT_STRINGS_BEG (d) || AT_STRINGS_END (d))
7410             goto fail;
7411
7412           prevchar = WORDCHAR_P (d - 1);
7413           thischar = WORDCHAR_P (d);
7414           if (prevchar != thischar)
7415             goto fail;
7416           break;
7417         }
7418 #endif
7419
7420         case wordbeg:
7421           DEBUG_PRINT1 ("EXECUTING wordbeg.\n");
7422           if (!AT_STRINGS_END (d) && WORDCHAR_P (d)
7423               && (AT_STRINGS_BEG (d) || !WORDCHAR_P (d - 1)))
7424             break;
7425           goto fail;
7426
7427         case wordend:
7428           DEBUG_PRINT1 ("EXECUTING wordend.\n");
7429           if (!AT_STRINGS_BEG (d) && WORDCHAR_P (d - 1)
7430               && (AT_STRINGS_END (d) || !WORDCHAR_P (d)))
7431             break;
7432           goto fail;
7433
7434 #ifdef emacs
7435         case before_dot:
7436           DEBUG_PRINT1 ("EXECUTING before_dot.\n");
7437           if (PTR_CHAR_POS ((unsigned char *) d) >= point)
7438             goto fail;
7439           break;
7440
7441         case at_dot:
7442           DEBUG_PRINT1 ("EXECUTING at_dot.\n");
7443           if (PTR_CHAR_POS ((unsigned char *) d) != point)
7444             goto fail;
7445           break;
7446
7447         case after_dot:
7448           DEBUG_PRINT1 ("EXECUTING after_dot.\n");
7449           if (PTR_CHAR_POS ((unsigned char *) d) <= point)
7450             goto fail;
7451           break;
7452
7453         case syntaxspec:
7454           DEBUG_PRINT2 ("EXECUTING syntaxspec %d.\n", mcnt);
7455           mcnt = *p++;
7456           goto matchsyntax;
7457
7458         case wordchar:
7459           DEBUG_PRINT1 ("EXECUTING Emacs wordchar.\n");
7460           mcnt = (int) Sword;
7461         matchsyntax:
7462           PREFETCH ();
7463           /* Can't use *d++ here; SYNTAX may be an unsafe macro.  */
7464           d++;
7465           if (SYNTAX (d[-1]) != (enum syntaxcode) mcnt)
7466             goto fail;
7467           SET_REGS_MATCHED ();
7468           break;
7469
7470         case notsyntaxspec:
7471           DEBUG_PRINT2 ("EXECUTING notsyntaxspec %d.\n", mcnt);
7472           mcnt = *p++;
7473           goto matchnotsyntax;
7474
7475         case notwordchar:
7476           DEBUG_PRINT1 ("EXECUTING Emacs notwordchar.\n");
7477           mcnt = (int) Sword;
7478         matchnotsyntax:
7479           PREFETCH ();
7480           /* Can't use *d++ here; SYNTAX may be an unsafe macro.  */
7481           d++;
7482           if (SYNTAX (d[-1]) == (enum syntaxcode) mcnt)
7483             goto fail;
7484           SET_REGS_MATCHED ();
7485           break;
7486
7487 #else /* not emacs */
7488         case wordchar:
7489           DEBUG_PRINT1 ("EXECUTING non-Emacs wordchar.\n");
7490           PREFETCH ();
7491           if (!WORDCHAR_P (d))
7492             goto fail;
7493           SET_REGS_MATCHED ();
7494           d++;
7495           break;
7496
7497         case notwordchar:
7498           DEBUG_PRINT1 ("EXECUTING non-Emacs notwordchar.\n");
7499           PREFETCH ();
7500           if (WORDCHAR_P (d))
7501             goto fail;
7502           SET_REGS_MATCHED ();
7503           d++;
7504           break;
7505 #endif /* not emacs */
7506
7507         default:
7508           abort ();
7509         }
7510       continue;  /* Successfully executed one pattern command; keep going.  */
7511
7512
7513     /* We goto here if a matching operation fails. */
7514     fail:
7515       if (!FAIL_STACK_EMPTY ())
7516         { /* A restart point is known.  Restore to that state.  */
7517           DEBUG_PRINT1 ("\nFAIL:\n");
7518           POP_FAILURE_POINT (d, p,
7519                              lowest_active_reg, highest_active_reg,
7520                              regstart, regend, reg_info);
7521
7522           /* If this failure point is a dummy, try the next one.  */
7523           if (!p)
7524             goto fail;
7525
7526           /* If we failed to the end of the pattern, don't examine *p.  */
7527           assert (p <= pend);
7528           if (p < pend)
7529             {
7530               boolean is_a_jump_n = false;
7531
7532               /* If failed to a backwards jump that's part of a repetition
7533                  loop, need to pop this failure point and use the next one.  */
7534               switch ((re_opcode_t) *p)
7535                 {
7536                 case jump_n:
7537                   is_a_jump_n = true;
7538                 case maybe_pop_jump:
7539                 case pop_failure_jump:
7540                 case jump:
7541                   p1 = p + 1;
7542                   EXTRACT_NUMBER_AND_INCR (mcnt, p1);
7543                   p1 += mcnt;
7544
7545                   if ((is_a_jump_n && (re_opcode_t) *p1 == succeed_n)
7546                       || (!is_a_jump_n
7547                           && (re_opcode_t) *p1 == on_failure_jump))
7548                     goto fail;
7549                   break;
7550                 default:
7551                   /* do nothing */ ;
7552                 }
7553             }
7554
7555           if (d >= string1 && d <= end1)
7556             dend = end_match_1;
7557         }
7558       else
7559         break;   /* Matching at this starting point really fails.  */
7560     } /* for (;;) */
7561
7562   if (best_regs_set)
7563     goto restore_best_regs;
7564
7565   FREE_VARIABLES ();
7566
7567   return -1;                            /* Failure to match.  */
7568 } /* re_match_2 */
7569 \f
7570 /* Subroutine definitions for re_match_2.  */
7571
7572
7573 /* We are passed P pointing to a register number after a start_memory.
7574
7575    Return true if the pattern up to the corresponding stop_memory can
7576    match the empty string, and false otherwise.
7577
7578    If we find the matching stop_memory, sets P to point to one past its number.
7579    Otherwise, sets P to an undefined byte less than or equal to END.
7580
7581    We don't handle duplicates properly (yet).  */
7582
7583 static boolean
7584 PREFIX(group_match_null_string_p) (p, end, reg_info)
7585     UCHAR_T **p, *end;
7586     PREFIX(register_info_type) *reg_info;
7587 {
7588   int mcnt;
7589   /* Point to after the args to the start_memory.  */
7590   UCHAR_T *p1 = *p + 2;
7591
7592   while (p1 < end)
7593     {
7594       /* Skip over opcodes that can match nothing, and return true or
7595          false, as appropriate, when we get to one that can't, or to the
7596          matching stop_memory.  */
7597
7598       switch ((re_opcode_t) *p1)
7599         {
7600         /* Could be either a loop or a series of alternatives.  */
7601         case on_failure_jump:
7602           p1++;
7603           EXTRACT_NUMBER_AND_INCR (mcnt, p1);
7604
7605           /* If the next operation is not a jump backwards in the
7606              pattern.  */
7607
7608           if (mcnt >= 0)
7609             {
7610               /* Go through the on_failure_jumps of the alternatives,
7611                  seeing if any of the alternatives cannot match nothing.
7612                  The last alternative starts with only a jump,
7613                  whereas the rest start with on_failure_jump and end
7614                  with a jump, e.g., here is the pattern for `a|b|c':
7615
7616                  /on_failure_jump/0/6/exactn/1/a/jump_past_alt/0/6
7617                  /on_failure_jump/0/6/exactn/1/b/jump_past_alt/0/3
7618                  /exactn/1/c
7619
7620                  So, we have to first go through the first (n-1)
7621                  alternatives and then deal with the last one separately.  */
7622
7623
7624               /* Deal with the first (n-1) alternatives, which start
7625                  with an on_failure_jump (see above) that jumps to right
7626                  past a jump_past_alt.  */
7627
7628               while ((re_opcode_t) p1[mcnt-(1+OFFSET_ADDRESS_SIZE)] ==
7629                      jump_past_alt)
7630                 {
7631                   /* `mcnt' holds how many bytes long the alternative
7632                      is, including the ending `jump_past_alt' and
7633                      its number.  */
7634
7635                   if (!PREFIX(alt_match_null_string_p) (p1, p1 + mcnt -
7636                                                 (1 + OFFSET_ADDRESS_SIZE),
7637                                                 reg_info))
7638                     return false;
7639
7640                   /* Move to right after this alternative, including the
7641                      jump_past_alt.  */
7642                   p1 += mcnt;
7643
7644                   /* Break if it's the beginning of an n-th alternative
7645                      that doesn't begin with an on_failure_jump.  */
7646                   if ((re_opcode_t) *p1 != on_failure_jump)
7647                     break;
7648
7649                   /* Still have to check that it's not an n-th
7650                      alternative that starts with an on_failure_jump.  */
7651                   p1++;
7652                   EXTRACT_NUMBER_AND_INCR (mcnt, p1);
7653                   if ((re_opcode_t) p1[mcnt-(1+OFFSET_ADDRESS_SIZE)] !=
7654                       jump_past_alt)
7655                     {
7656                       /* Get to the beginning of the n-th alternative.  */
7657                       p1 -= 1 + OFFSET_ADDRESS_SIZE;
7658                       break;
7659                     }
7660                 }
7661
7662               /* Deal with the last alternative: go back and get number
7663                  of the `jump_past_alt' just before it.  `mcnt' contains
7664                  the length of the alternative.  */
7665               EXTRACT_NUMBER (mcnt, p1 - OFFSET_ADDRESS_SIZE);
7666
7667               if (!PREFIX(alt_match_null_string_p) (p1, p1 + mcnt, reg_info))
7668                 return false;
7669
7670               p1 += mcnt;       /* Get past the n-th alternative.  */
7671             } /* if mcnt > 0 */
7672           break;
7673
7674
7675         case stop_memory:
7676           assert (p1[1] == **p);
7677           *p = p1 + 2;
7678           return true;
7679
7680
7681         default:
7682           if (!PREFIX(common_op_match_null_string_p) (&p1, end, reg_info))
7683             return false;
7684         }
7685     } /* while p1 < end */
7686
7687   return false;
7688 } /* group_match_null_string_p */
7689
7690
7691 /* Similar to group_match_null_string_p, but doesn't deal with alternatives:
7692    It expects P to be the first byte of a single alternative and END one
7693    byte past the last. The alternative can contain groups.  */
7694
7695 static boolean
7696 PREFIX(alt_match_null_string_p) (p, end, reg_info)
7697     UCHAR_T *p, *end;
7698     PREFIX(register_info_type) *reg_info;
7699 {
7700   int mcnt;
7701   UCHAR_T *p1 = p;
7702
7703   while (p1 < end)
7704     {
7705       /* Skip over opcodes that can match nothing, and break when we get
7706          to one that can't.  */
7707
7708       switch ((re_opcode_t) *p1)
7709         {
7710         /* It's a loop.  */
7711         case on_failure_jump:
7712           p1++;
7713           EXTRACT_NUMBER_AND_INCR (mcnt, p1);
7714           p1 += mcnt;
7715           break;
7716
7717         default:
7718           if (!PREFIX(common_op_match_null_string_p) (&p1, end, reg_info))
7719             return false;
7720         }
7721     }  /* while p1 < end */
7722
7723   return true;
7724 } /* alt_match_null_string_p */
7725
7726
7727 /* Deals with the ops common to group_match_null_string_p and
7728    alt_match_null_string_p.
7729
7730    Sets P to one after the op and its arguments, if any.  */
7731
7732 static boolean
7733 PREFIX(common_op_match_null_string_p) (p, end, reg_info)
7734     UCHAR_T **p, *end;
7735     PREFIX(register_info_type) *reg_info;
7736 {
7737   int mcnt;
7738   boolean ret;
7739   int reg_no;
7740   UCHAR_T *p1 = *p;
7741
7742   switch ((re_opcode_t) *p1++)
7743     {
7744     case no_op:
7745     case begline:
7746     case endline:
7747     case begbuf:
7748     case endbuf:
7749     case wordbeg:
7750     case wordend:
7751     case wordbound:
7752     case notwordbound:
7753 #ifdef emacs
7754     case before_dot:
7755     case at_dot:
7756     case after_dot:
7757 #endif
7758       break;
7759
7760     case start_memory:
7761       reg_no = *p1;
7762       assert (reg_no > 0 && reg_no <= MAX_REGNUM);
7763       ret = PREFIX(group_match_null_string_p) (&p1, end, reg_info);
7764
7765       /* Have to set this here in case we're checking a group which
7766          contains a group and a back reference to it.  */
7767
7768       if (REG_MATCH_NULL_STRING_P (reg_info[reg_no]) == MATCH_NULL_UNSET_VALUE)
7769         REG_MATCH_NULL_STRING_P (reg_info[reg_no]) = ret;
7770
7771       if (!ret)
7772         return false;
7773       break;
7774
7775     /* If this is an optimized succeed_n for zero times, make the jump.  */
7776     case jump:
7777       EXTRACT_NUMBER_AND_INCR (mcnt, p1);
7778       if (mcnt >= 0)
7779         p1 += mcnt;
7780       else
7781         return false;
7782       break;
7783
7784     case succeed_n:
7785       /* Get to the number of times to succeed.  */
7786       p1 += OFFSET_ADDRESS_SIZE;
7787       EXTRACT_NUMBER_AND_INCR (mcnt, p1);
7788
7789       if (mcnt == 0)
7790         {
7791           p1 -= 2 * OFFSET_ADDRESS_SIZE;
7792           EXTRACT_NUMBER_AND_INCR (mcnt, p1);
7793           p1 += mcnt;
7794         }
7795       else
7796         return false;
7797       break;
7798
7799     case duplicate:
7800       if (!REG_MATCH_NULL_STRING_P (reg_info[*p1]))
7801         return false;
7802       break;
7803
7804     case set_number_at:
7805       p1 += 2 * OFFSET_ADDRESS_SIZE;
7806
7807     default:
7808       /* All other opcodes mean we cannot match the empty string.  */
7809       return false;
7810   }
7811
7812   *p = p1;
7813   return true;
7814 } /* common_op_match_null_string_p */
7815
7816
7817 /* Return zero if TRANSLATE[S1] and TRANSLATE[S2] are identical for LEN
7818    bytes; nonzero otherwise.  */
7819
7820 static int
7821 PREFIX(bcmp_translate) (s1, s2, len, translate)
7822      const CHAR_T *s1, *s2;
7823      register int len;
7824      RE_TRANSLATE_TYPE translate;
7825 {
7826   register const UCHAR_T *p1 = (const UCHAR_T *) s1;
7827   register const UCHAR_T *p2 = (const UCHAR_T *) s2;
7828   while (len)
7829     {
7830 #ifdef WCHAR
7831       if (((*p1<=0xff)?translate[*p1++]:*p1++)
7832           != ((*p2<=0xff)?translate[*p2++]:*p2++))
7833         return 1;
7834 #else /* BYTE */
7835       if (translate[*p1++] != translate[*p2++]) return 1;
7836 #endif /* WCHAR */
7837       len--;
7838     }
7839   return 0;
7840 }
7841 \f
7842
7843 #else /* not INSIDE_RECURSION */
7844
7845 /* Entry points for GNU code.  */
7846
7847 /* re_compile_pattern is the GNU regular expression compiler: it
7848    compiles PATTERN (of length SIZE) and puts the result in BUFP.
7849    Returns 0 if the pattern was valid, otherwise an error string.
7850
7851    Assumes the `allocated' (and perhaps `buffer') and `translate' fields
7852    are set in BUFP on entry.
7853
7854    We call regex_compile to do the actual compilation.  */
7855
7856 const char *
7857 re_compile_pattern (pattern, length, bufp)
7858      const char *pattern;
7859      size_t length;
7860      struct re_pattern_buffer *bufp;
7861 {
7862   reg_errcode_t ret;
7863
7864   /* GNU code is written to assume at least RE_NREGS registers will be set
7865      (and at least one extra will be -1).  */
7866   bufp->regs_allocated = REGS_UNALLOCATED;
7867
7868   /* And GNU code determines whether or not to get register information
7869      by passing null for the REGS argument to re_match, etc., not by
7870      setting no_sub.  */
7871   bufp->no_sub = 0;
7872
7873   /* Match anchors at newline.  */
7874   bufp->newline_anchor = 1;
7875
7876 # ifdef MBS_SUPPORT
7877   if (MB_CUR_MAX != 1)
7878     ret = wcs_regex_compile (pattern, length, re_syntax_options, bufp);
7879   else
7880 # endif
7881     ret = byte_regex_compile (pattern, length, re_syntax_options, bufp);
7882
7883   if (!ret)
7884     return NULL;
7885   return gettext (re_error_msgid + re_error_msgid_idx[(int) ret]);
7886 }
7887 #ifdef _LIBC
7888 weak_alias (__re_compile_pattern, re_compile_pattern)
7889 #endif
7890 \f
7891 /* Entry points compatible with 4.2 BSD regex library.  We don't define
7892    them unless specifically requested.  */
7893
7894 #if defined _REGEX_RE_COMP || defined _LIBC
7895
7896 /* BSD has one and only one pattern buffer.  */
7897 static struct re_pattern_buffer re_comp_buf;
7898
7899 char *
7900 #ifdef _LIBC
7901 /* Make these definitions weak in libc, so POSIX programs can redefine
7902    these names if they don't use our functions, and still use
7903    regcomp/regexec below without link errors.  */
7904 weak_function
7905 #endif
7906 re_comp (s)
7907     const char *s;
7908 {
7909   reg_errcode_t ret;
7910
7911   if (!s)
7912     {
7913       if (!re_comp_buf.buffer)
7914         return gettext ("No previous regular expression");
7915       return 0;
7916     }
7917
7918   if (!re_comp_buf.buffer)
7919     {
7920       re_comp_buf.buffer = (unsigned char *) malloc (200);
7921       if (re_comp_buf.buffer == NULL)
7922         return (char *) gettext (re_error_msgid
7923                                  + re_error_msgid_idx[(int) REG_ESPACE]);
7924       re_comp_buf.allocated = 200;
7925
7926       re_comp_buf.fastmap = (char *) malloc (1 << BYTEWIDTH);
7927       if (re_comp_buf.fastmap == NULL)
7928         return (char *) gettext (re_error_msgid
7929                                  + re_error_msgid_idx[(int) REG_ESPACE]);
7930     }
7931
7932   /* Since `re_exec' always passes NULL for the `regs' argument, we
7933      don't need to initialize the pattern buffer fields which affect it.  */
7934
7935   /* Match anchors at newlines.  */
7936   re_comp_buf.newline_anchor = 1;
7937
7938 # ifdef MBS_SUPPORT
7939   if (MB_CUR_MAX != 1)
7940     ret = wcs_regex_compile (s, strlen (s), re_syntax_options, &re_comp_buf);
7941   else
7942 # endif
7943     ret = byte_regex_compile (s, strlen (s), re_syntax_options, &re_comp_buf);
7944
7945   if (!ret)
7946     return NULL;
7947
7948   /* Yes, we're discarding `const' here if !HAVE_LIBINTL.  */
7949   return (char *) gettext (re_error_msgid + re_error_msgid_idx[(int) ret]);
7950 }
7951
7952
7953 int
7954 #ifdef _LIBC
7955 weak_function
7956 #endif
7957 re_exec (s)
7958     const char *s;
7959 {
7960   const int len = strlen (s);
7961   return
7962     0 <= re_search (&re_comp_buf, s, len, 0, len, (struct re_registers *) 0);
7963 }
7964
7965 #endif /* _REGEX_RE_COMP */
7966 \f
7967 /* POSIX.2 functions.  Don't define these for Emacs.  */
7968
7969 #ifndef emacs
7970
7971 /* regcomp takes a regular expression as a string and compiles it.
7972
7973    PREG is a regex_t *.  We do not expect any fields to be initialized,
7974    since POSIX says we shouldn't.  Thus, we set
7975
7976      `buffer' to the compiled pattern;
7977      `used' to the length of the compiled pattern;
7978      `syntax' to RE_SYNTAX_POSIX_EXTENDED if the
7979        REG_EXTENDED bit in CFLAGS is set; otherwise, to
7980        RE_SYNTAX_POSIX_BASIC;
7981      `newline_anchor' to REG_NEWLINE being set in CFLAGS;
7982      `fastmap' to an allocated space for the fastmap;
7983      `fastmap_accurate' to zero;
7984      `re_nsub' to the number of subexpressions in PATTERN.
7985
7986    PATTERN is the address of the pattern string.
7987
7988    CFLAGS is a series of bits which affect compilation.
7989
7990      If REG_EXTENDED is set, we use POSIX extended syntax; otherwise, we
7991      use POSIX basic syntax.
7992
7993      If REG_NEWLINE is set, then . and [^...] don't match newline.
7994      Also, regexec will try a match beginning after every newline.
7995
7996      If REG_ICASE is set, then we considers upper- and lowercase
7997      versions of letters to be equivalent when matching.
7998
7999      If REG_NOSUB is set, then when PREG is passed to regexec, that
8000      routine will report only success or failure, and nothing about the
8001      registers.
8002
8003    It returns 0 if it succeeds, nonzero if it doesn't.  (See regex.h for
8004    the return codes and their meanings.)  */
8005
8006 int
8007 regcomp (preg, pattern, cflags)
8008     regex_t *preg;
8009     const char *pattern;
8010     int cflags;
8011 {
8012   reg_errcode_t ret;
8013   reg_syntax_t syntax
8014     = (cflags & REG_EXTENDED) ?
8015       RE_SYNTAX_POSIX_EXTENDED : RE_SYNTAX_POSIX_BASIC;
8016
8017   /* regex_compile will allocate the space for the compiled pattern.  */
8018   preg->buffer = 0;
8019   preg->allocated = 0;
8020   preg->used = 0;
8021
8022   /* Try to allocate space for the fastmap.  */
8023   preg->fastmap = (char *) malloc (1 << BYTEWIDTH);
8024
8025   if (cflags & REG_ICASE)
8026     {
8027       unsigned i;
8028
8029       preg->translate
8030         = (RE_TRANSLATE_TYPE) malloc (CHAR_SET_SIZE
8031                                       * sizeof (*(RE_TRANSLATE_TYPE)0));
8032       if (preg->translate == NULL)
8033         return (int) REG_ESPACE;
8034
8035       /* Map uppercase characters to corresponding lowercase ones.  */
8036       for (i = 0; i < CHAR_SET_SIZE; i++)
8037         preg->translate[i] = ISUPPER (i) ? TOLOWER (i) : i;
8038     }
8039   else
8040     preg->translate = NULL;
8041
8042   /* If REG_NEWLINE is set, newlines are treated differently.  */
8043   if (cflags & REG_NEWLINE)
8044     { /* REG_NEWLINE implies neither . nor [^...] match newline.  */
8045       syntax &= ~RE_DOT_NEWLINE;
8046       syntax |= RE_HAT_LISTS_NOT_NEWLINE;
8047       /* It also changes the matching behavior.  */
8048       preg->newline_anchor = 1;
8049     }
8050   else
8051     preg->newline_anchor = 0;
8052
8053   preg->no_sub = !!(cflags & REG_NOSUB);
8054
8055   /* POSIX says a null character in the pattern terminates it, so we
8056      can use strlen here in compiling the pattern.  */
8057 # ifdef MBS_SUPPORT
8058   if (MB_CUR_MAX != 1)
8059     ret = wcs_regex_compile (pattern, strlen (pattern), syntax, preg);
8060   else
8061 # endif
8062     ret = byte_regex_compile (pattern, strlen (pattern), syntax, preg);
8063
8064   /* POSIX doesn't distinguish between an unmatched open-group and an
8065      unmatched close-group: both are REG_EPAREN.  */
8066   if (ret == REG_ERPAREN) ret = REG_EPAREN;
8067
8068   if (ret == REG_NOERROR && preg->fastmap)
8069     {
8070       /* Compute the fastmap now, since regexec cannot modify the pattern
8071          buffer.  */
8072       if (re_compile_fastmap (preg) == -2)
8073         {
8074           /* Some error occurred while computing the fastmap, just forget
8075              about it.  */
8076           free (preg->fastmap);
8077           preg->fastmap = NULL;
8078         }
8079     }
8080
8081   return (int) ret;
8082 }
8083 #ifdef _LIBC
8084 weak_alias (__regcomp, regcomp)
8085 #endif
8086
8087
8088 /* regexec searches for a given pattern, specified by PREG, in the
8089    string STRING.
8090
8091    If NMATCH is zero or REG_NOSUB was set in the cflags argument to
8092    `regcomp', we ignore PMATCH.  Otherwise, we assume PMATCH has at
8093    least NMATCH elements, and we set them to the offsets of the
8094    corresponding matched substrings.
8095
8096    EFLAGS specifies `execution flags' which affect matching: if
8097    REG_NOTBOL is set, then ^ does not match at the beginning of the
8098    string; if REG_NOTEOL is set, then $ does not match at the end.
8099
8100    We return 0 if we find a match and REG_NOMATCH if not.  */
8101
8102 int
8103 regexec (preg, string, nmatch, pmatch, eflags)
8104     const regex_t *preg;
8105     const char *string;
8106     size_t nmatch;
8107     regmatch_t pmatch[];
8108     int eflags;
8109 {
8110   int ret;
8111   struct re_registers regs;
8112   regex_t private_preg;
8113   int len = strlen (string);
8114   boolean want_reg_info = !preg->no_sub && nmatch > 0;
8115
8116   private_preg = *preg;
8117
8118   private_preg.not_bol = !!(eflags & REG_NOTBOL);
8119   private_preg.not_eol = !!(eflags & REG_NOTEOL);
8120
8121   /* The user has told us exactly how many registers to return
8122      information about, via `nmatch'.  We have to pass that on to the
8123      matching routines.  */
8124   private_preg.regs_allocated = REGS_FIXED;
8125
8126   if (want_reg_info)
8127     {
8128       regs.num_regs = nmatch;
8129       regs.start = TALLOC (nmatch * 2, regoff_t);
8130       if (regs.start == NULL)
8131         return (int) REG_NOMATCH;
8132       regs.end = regs.start + nmatch;
8133     }
8134
8135   /* Perform the searching operation.  */
8136   ret = re_search (&private_preg, string, len,
8137                    /* start: */ 0, /* range: */ len,
8138                    want_reg_info ? &regs : (struct re_registers *) 0);
8139
8140   /* Copy the register information to the POSIX structure.  */
8141   if (want_reg_info)
8142     {
8143       if (ret >= 0)
8144         {
8145           unsigned r;
8146
8147           for (r = 0; r < nmatch; r++)
8148             {
8149               pmatch[r].rm_so = regs.start[r];
8150               pmatch[r].rm_eo = regs.end[r];
8151             }
8152         }
8153
8154       /* If we needed the temporary register info, free the space now.  */
8155       free (regs.start);
8156     }
8157
8158   /* We want zero return to mean success, unlike `re_search'.  */
8159   return ret >= 0 ? (int) REG_NOERROR : (int) REG_NOMATCH;
8160 }
8161 #ifdef _LIBC
8162 weak_alias (__regexec, regexec)
8163 #endif
8164
8165
8166 /* Returns a message corresponding to an error code, ERRCODE, returned
8167    from either regcomp or regexec.   We don't use PREG here.  */
8168
8169 size_t
8170 regerror (errcode, preg, errbuf, errbuf_size)
8171     int errcode;
8172     const regex_t *preg;
8173     char *errbuf;
8174     size_t errbuf_size;
8175 {
8176   const char *msg;
8177   size_t msg_size;
8178
8179   if (errcode < 0
8180       || errcode >= (int) (sizeof (re_error_msgid_idx)
8181                            / sizeof (re_error_msgid_idx[0])))
8182     /* Only error codes returned by the rest of the code should be passed
8183        to this routine.  If we are given anything else, or if other regex
8184        code generates an invalid error code, then the program has a bug.
8185        Dump core so we can fix it.  */
8186     abort ();
8187
8188   msg = gettext (re_error_msgid + re_error_msgid_idx[errcode]);
8189
8190   msg_size = strlen (msg) + 1; /* Includes the null.  */
8191
8192   if (errbuf_size != 0)
8193     {
8194       if (msg_size > errbuf_size)
8195         {
8196 #if defined HAVE_MEMPCPY || defined _LIBC
8197           *((char *) __mempcpy (errbuf, msg, errbuf_size - 1)) = '\0';
8198 #else
8199           memcpy (errbuf, msg, errbuf_size - 1);
8200           errbuf[errbuf_size - 1] = 0;
8201 #endif
8202         }
8203       else
8204         memcpy (errbuf, msg, msg_size);
8205     }
8206
8207   return msg_size;
8208 }
8209 #ifdef _LIBC
8210 weak_alias (__regerror, regerror)
8211 #endif
8212
8213
8214 /* Free dynamically allocated space used by PREG.  */
8215
8216 void
8217 regfree (preg)
8218     regex_t *preg;
8219 {
8220   if (preg->buffer != NULL)
8221     free (preg->buffer);
8222   preg->buffer = NULL;
8223
8224   preg->allocated = 0;
8225   preg->used = 0;
8226
8227   if (preg->fastmap != NULL)
8228     free (preg->fastmap);
8229   preg->fastmap = NULL;
8230   preg->fastmap_accurate = 0;
8231
8232   if (preg->translate != NULL)
8233     free (preg->translate);
8234   preg->translate = NULL;
8235 }
8236 #ifdef _LIBC
8237 weak_alias (__regfree, regfree)
8238 #endif
8239
8240 #endif /* not emacs  */
8241
8242 #endif /* not INSIDE_RECURSION */
8243
8244 \f
8245 #undef STORE_NUMBER
8246 #undef STORE_NUMBER_AND_INCR
8247 #undef EXTRACT_NUMBER
8248 #undef EXTRACT_NUMBER_AND_INCR
8249
8250 #undef DEBUG_PRINT_COMPILED_PATTERN
8251 #undef DEBUG_PRINT_DOUBLE_STRING
8252
8253 #undef INIT_FAIL_STACK
8254 #undef RESET_FAIL_STACK
8255 #undef DOUBLE_FAIL_STACK
8256 #undef PUSH_PATTERN_OP
8257 #undef PUSH_FAILURE_POINTER
8258 #undef PUSH_FAILURE_INT
8259 #undef PUSH_FAILURE_ELT
8260 #undef POP_FAILURE_POINTER
8261 #undef POP_FAILURE_INT
8262 #undef POP_FAILURE_ELT
8263 #undef DEBUG_PUSH
8264 #undef DEBUG_POP
8265 #undef PUSH_FAILURE_POINT
8266 #undef POP_FAILURE_POINT
8267
8268 #undef REG_UNSET_VALUE
8269 #undef REG_UNSET
8270
8271 #undef PATFETCH
8272 #undef PATFETCH_RAW
8273 #undef PATUNFETCH
8274 #undef TRANSLATE
8275
8276 #undef INIT_BUF_SIZE
8277 #undef GET_BUFFER_SPACE
8278 #undef BUF_PUSH
8279 #undef BUF_PUSH_2
8280 #undef BUF_PUSH_3
8281 #undef STORE_JUMP
8282 #undef STORE_JUMP2
8283 #undef INSERT_JUMP
8284 #undef INSERT_JUMP2
8285 #undef EXTEND_BUFFER
8286 #undef GET_UNSIGNED_NUMBER
8287 #undef FREE_STACK_RETURN
8288
8289 # undef POINTER_TO_OFFSET
8290 # undef MATCHING_IN_FRST_STRING
8291 # undef PREFETCH
8292 # undef AT_STRINGS_BEG
8293 # undef AT_STRINGS_END
8294 # undef WORDCHAR_P
8295 # undef FREE_VAR
8296 # undef FREE_VARIABLES
8297 # undef NO_HIGHEST_ACTIVE_REG
8298 # undef NO_LOWEST_ACTIVE_REG
8299
8300 # undef CHAR_T
8301 # undef UCHAR_T
8302 # undef COMPILED_BUFFER_VAR
8303 # undef OFFSET_ADDRESS_SIZE
8304 # undef CHAR_CLASS_SIZE
8305 # undef PREFIX
8306 # undef ARG_PREFIX
8307 # undef PUT_CHAR
8308 # undef BYTE
8309 # undef WCHAR
8310
8311 # define DEFINED_ONCE