delete regex.[ch] (stale wrt emacs for ages)
authorKarl Berry <karl@freefriends.org>
Thu, 9 Sep 2004 23:37:33 +0000 (23:37 +0000)
committerKarl Berry <karl@freefriends.org>
Thu, 9 Sep 2004 23:37:33 +0000 (23:37 +0000)
ChangeLog
regex.c [deleted file]
regex.h [deleted file]

index 774acf8e007e277f411205458f7df58ab35a02ca..39e6b599a58aa4b7343c8621194b5a4e70ee56fd 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2004-09-09  Karl Berry  <karl@gnu.org>
+
+       * regex.[ch]: delete from the root.  These were supposed to be
+               synced with emacs cvs, but this has not happened for about
+               a year, and anyway nothing else uses emacs regex.[ch].
+               bug-gnulib mail from Jeff Bailey, 9 Sep 2004 15:49:24 -0700.
+               lib/regex[.ch] is untouched.
+               
 2004-09-09  Bruno Haible  <bruno@clisp.org>
 
        * modules/vasnprintf (Files): Add m4/eoverflow.m4.
diff --git a/regex.c b/regex.c
deleted file mode 100644 (file)
index a145183..0000000
--- a/regex.c
+++ /dev/null
@@ -1,6335 +0,0 @@
-/* Extended regular expression matching and search library, version
-   0.12.  (Implements POSIX draft P1003.2/D11.2, except for some of the
-   internationalization features.)
-
-   Copyright (C) 1993,94,95,96,97,98,99,2000 Free Software Foundation, Inc.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-   USA.         */
-
-/* TODO:
-   - structure the opcode space into opcode+flag.
-   - merge with glibc's regex.[ch].
-   - replace (succeed_n + jump_n + set_number_at) with something that doesn't
-     need to modify the compiled regexp so that re_match can be reentrant.
-   - get rid of on_failure_jump_smart by doing the optimization in re_comp
-     rather than at run-time, so that re_match can be reentrant.
-*/
-
-/* AIX requires this to be the first thing in the file. */
-#if defined _AIX && !defined REGEX_MALLOC
-  #pragma alloca
-#endif
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#if defined STDC_HEADERS && !defined emacs
-# include <stddef.h>
-#else
-/* We need this for `regex.h', and perhaps for the Emacs include files.  */
-# include <sys/types.h>
-#endif
-
-/* Whether to use ISO C Amendment 1 wide char functions.
-   Those should not be used for Emacs since it uses its own.  */
-#if defined _LIBC
-#define WIDE_CHAR_SUPPORT 1
-#else
-#define WIDE_CHAR_SUPPORT \
-       (HAVE_WCTYPE_H && HAVE_WCHAR_H && HAVE_BTOWC && !emacs)
-#endif
-
-/* For platform which support the ISO C amendement 1 functionality we
-   support user defined character classes.  */
-#if WIDE_CHAR_SUPPORT
-/* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>.  */
-# include <wchar.h>
-# include <wctype.h>
-#endif
-
-#ifdef _LIBC
-/* We have to keep the namespace clean.  */
-# define regfree(preg) __regfree (preg)
-# define regexec(pr, st, nm, pm, ef) __regexec (pr, st, nm, pm, ef)
-# define regcomp(preg, pattern, cflags) __regcomp (preg, pattern, cflags)
-# define regerror(errcode, preg, errbuf, errbuf_size) \
-       __regerror(errcode, preg, errbuf, errbuf_size)
-# define re_set_registers(bu, re, nu, st, en) \
-       __re_set_registers (bu, re, nu, st, en)
-# define re_match_2(bufp, string1, size1, string2, size2, pos, regs, stop) \
-       __re_match_2 (bufp, string1, size1, string2, size2, pos, regs, stop)
-# define re_match(bufp, string, size, pos, regs) \
-       __re_match (bufp, string, size, pos, regs)
-# define re_search(bufp, string, size, startpos, range, regs) \
-       __re_search (bufp, string, size, startpos, range, regs)
-# define re_compile_pattern(pattern, length, bufp) \
-       __re_compile_pattern (pattern, length, bufp)
-# define re_set_syntax(syntax) __re_set_syntax (syntax)
-# define re_search_2(bufp, st1, s1, st2, s2, startpos, range, regs, stop) \
-       __re_search_2 (bufp, st1, s1, st2, s2, startpos, range, regs, stop)
-# define re_compile_fastmap(bufp) __re_compile_fastmap (bufp)
-
-/* Make sure we call libc's function even if the user overrides them.  */
-# define btowc __btowc
-# define iswctype __iswctype
-# define wctype __wctype
-
-# define WEAK_ALIAS(a,b) weak_alias (a, b)
-
-/* We are also using some library internals.  */
-# include <locale/localeinfo.h>
-# include <locale/elem-hash.h>
-# include <langinfo.h>
-#else
-# define WEAK_ALIAS(a,b)
-#endif
-
-/* This is for other GNU distributions with internationalized messages.  */
-#if HAVE_LIBINTL_H || defined _LIBC
-# include <libintl.h>
-#else
-# define gettext(msgid) (msgid)
-#endif
-
-#ifndef gettext_noop
-/* This define is so xgettext can find the internationalizable
-   strings.  */
-# define gettext_noop(String) String
-#endif
-
-/* The `emacs' switch turns on certain matching commands
-   that make sense only in Emacs. */
-#ifdef emacs
-
-# include "lisp.h"
-# include "buffer.h"
-
-/* Make syntax table lookup grant data in gl_state.  */
-# define SYNTAX_ENTRY_VIA_PROPERTY
-
-# include "syntax.h"
-# include "charset.h"
-# include "category.h"
-
-# ifdef malloc
-#  undef malloc
-# endif
-# define malloc xmalloc
-# ifdef realloc
-#  undef realloc
-# endif
-# define realloc xrealloc
-# ifdef free
-#  undef free
-# endif
-# define free xfree
-
-/* Converts the pointer to the char to BEG-based offset from the start.         */
-# define PTR_TO_OFFSET(d) POS_AS_IN_BUFFER (POINTER_TO_OFFSET (d))
-# define POS_AS_IN_BUFFER(p) ((p) + (NILP (re_match_object) || BUFFERP (re_match_object)))
-
-# define RE_MULTIBYTE_P(bufp) ((bufp)->multibyte)
-# define RE_STRING_CHAR(p, s) \
-  (multibyte ? (STRING_CHAR (p, s)) : (*(p)))
-# define RE_STRING_CHAR_AND_LENGTH(p, s, len) \
-  (multibyte ? (STRING_CHAR_AND_LENGTH (p, s, len)) : ((len) = 1, *(p)))
-
-/* Set C a (possibly multibyte) character before P.  P points into a
-   string which is the virtual concatenation of STR1 (which ends at
-   END1) or STR2 (which ends at END2).  */
-# define GET_CHAR_BEFORE_2(c, p, str1, end1, str2, end2)               \
-  do {                                                                 \
-    if (multibyte)                                                     \
-       {                                                               \
-        re_char *dtemp = (p) == (str2) ? (end1) : (p);                 \
-        re_char *dlimit = ((p) > (str2) && (p) <= (end2)) ? (str2) : (str1); \
-        re_char *d0 = dtemp;                                           \
-        PREV_CHAR_BOUNDARY (d0, dlimit);                               \
-        c = STRING_CHAR (d0, dtemp - d0);                              \
-       }                                                               \
-     else                                                              \
-       (c = ((p) == (str2) ? (end1) : (p))[-1]);                       \
-  } while (0)
-
-
-#else  /* not emacs */
-
-/* If we are not linking with Emacs proper,
-   we can't use the relocating allocator
-   even if config.h says that we can.  */
-# undef REL_ALLOC
-
-# if defined STDC_HEADERS || defined _LIBC
-#  include <stdlib.h>
-# else
-char *malloc ();
-char *realloc ();
-# endif
-
-/* When used in Emacs's lib-src, we need to get bzero and bcopy somehow.
-   If nothing else has been done, use the method below.  */
-# ifdef INHIBIT_STRING_HEADER
-#  if !(defined HAVE_BZERO && defined HAVE_BCOPY)
-#   if !defined bzero && !defined bcopy
-#    undef INHIBIT_STRING_HEADER
-#   endif
-#  endif
-# endif
-
-/* This is the normal way of making sure we have memcpy, memcmp and bzero.
-   This is used in most programs--a few other programs avoid this
-   by defining INHIBIT_STRING_HEADER.  */
-# ifndef INHIBIT_STRING_HEADER
-#  if defined HAVE_STRING_H || defined STDC_HEADERS || defined _LIBC
-#   include <string.h>
-#   ifndef bzero
-#    ifndef _LIBC
-#     define bzero(s, n)       (memset (s, '\0', n), (s))
-#    else
-#     define bzero(s, n)       __bzero (s, n)
-#    endif
-#   endif
-#  else
-#   include <strings.h>
-#   ifndef memcmp
-#    define memcmp(s1, s2, n)  bcmp (s1, s2, n)
-#   endif
-#   ifndef memcpy
-#    define memcpy(d, s, n)    (bcopy (s, d, n), (d))
-#   endif
-#  endif
-# endif
-
-/* Define the syntax stuff for \<, \>, etc.  */
-
-/* Sword must be nonzero for the wordchar pattern commands in re_match_2.  */
-enum syntaxcode { Swhitespace = 0, Sword = 1 };
-
-# ifdef SWITCH_ENUM_BUG
-#  define SWITCH_ENUM_CAST(x) ((int)(x))
-# else
-#  define SWITCH_ENUM_CAST(x) (x)
-# endif
-
-/* Dummy macros for non-Emacs environments.  */
-# define BASE_LEADING_CODE_P(c) (0)
-# define CHAR_CHARSET(c) 0
-# define CHARSET_LEADING_CODE_BASE(c) 0
-# define MAX_MULTIBYTE_LENGTH 1
-# define RE_MULTIBYTE_P(x) 0
-# define WORD_BOUNDARY_P(c1, c2) (0)
-# define CHAR_HEAD_P(p) (1)
-# define SINGLE_BYTE_CHAR_P(c) (1)
-# define SAME_CHARSET_P(c1, c2) (1)
-# define MULTIBYTE_FORM_LENGTH(p, s) (1)
-# define PREV_CHAR_BOUNDARY(p, limit) ((p)--)
-# define STRING_CHAR(p, s) (*(p))
-# define RE_STRING_CHAR STRING_CHAR
-# define CHAR_STRING(c, s) (*(s) = (c), 1)
-# define STRING_CHAR_AND_LENGTH(p, s, actual_len) ((actual_len) = 1, *(p))
-# define RE_STRING_CHAR_AND_LENGTH STRING_CHAR_AND_LENGTH
-# define GET_CHAR_BEFORE_2(c, p, str1, end1, str2, end2) \
-  (c = ((p) == (str2) ? *((end1) - 1) : *((p) - 1)))
-# define MAKE_CHAR(charset, c1, c2) (c1)
-#endif /* not emacs */
-
-#ifndef RE_TRANSLATE
-# define RE_TRANSLATE(TBL, C) ((unsigned char)(TBL)[C])
-# define RE_TRANSLATE_P(TBL) (TBL)
-#endif
-\f
-/* Get the interface, including the syntax bits.  */
-#include "regex.h"
-
-/* isalpha etc. are used for the character classes.  */
-#include <ctype.h>
-
-#ifdef emacs
-
-/* 1 if C is an ASCII character.  */
-# define IS_REAL_ASCII(c) ((c) < 0200)
-
-/* 1 if C is a unibyte character.  */
-# define ISUNIBYTE(c) (SINGLE_BYTE_CHAR_P ((c)))
-
-/* The Emacs definitions should not be directly affected by locales.  */
-
-/* In Emacs, these are only used for single-byte characters.  */
-# define ISDIGIT(c) ((c) >= '0' && (c) <= '9')
-# define ISCNTRL(c) ((c) < ' ')
-# define ISXDIGIT(c) (((c) >= '0' && (c) <= '9')               \
-                    || ((c) >= 'a' && (c) <= 'f')      \
-                    || ((c) >= 'A' && (c) <= 'F'))
-
-/* This is only used for single-byte characters.  */
-# define ISBLANK(c) ((c) == ' ' || (c) == '\t')
-
-/* The rest must handle multibyte characters.  */
-
-# define ISGRAPH(c) (SINGLE_BYTE_CHAR_P (c)                            \
-                   ? (c) > ' ' && !((c) >= 0177 && (c) <= 0237)        \
-                   : 1)
-
-# define ISPRINT(c) (SINGLE_BYTE_CHAR_P (c)                            \
-                   ? (c) >= ' ' && !((c) >= 0177 && (c) <= 0237)       \
-                   : 1)
-
-# define ISALNUM(c) (IS_REAL_ASCII (c)                 \
-                   ? (((c) >= 'a' && (c) <= 'z')       \
-                      || ((c) >= 'A' && (c) <= 'Z')    \
-                      || ((c) >= '0' && (c) <= '9'))   \
-                   : SYNTAX (c) == Sword)
-
-# define ISALPHA(c) (IS_REAL_ASCII (c)                 \
-                   ? (((c) >= 'a' && (c) <= 'z')       \
-                      || ((c) >= 'A' && (c) <= 'Z'))   \
-                   : SYNTAX (c) == Sword)
-
-# define ISLOWER(c) (LOWERCASEP (c))
-
-# define ISPUNCT(c) (IS_REAL_ASCII (c)                         \
-                   ? ((c) > ' ' && (c) < 0177                  \
-                      && !(((c) >= 'a' && (c) <= 'z')          \
-                           || ((c) >= 'A' && (c) <= 'Z')       \
-                           || ((c) >= '0' && (c) <= '9')))     \
-                   : SYNTAX (c) != Sword)
-
-# define ISSPACE(c) (SYNTAX (c) == Swhitespace)
-
-# define ISUPPER(c) (UPPERCASEP (c))
-
-# define ISWORD(c) (SYNTAX (c) == Sword)
-
-#else /* not emacs */
-
-/* Jim Meyering writes:
-
-   "... Some ctype macros are valid only for character codes that
-   isascii says are ASCII (SGI's IRIX-4.0.5 is one such system --when
-   using /bin/cc or gcc but without giving an ansi option).  So, all
-   ctype uses should be through macros like ISPRINT...  If
-   STDC_HEADERS is defined, then autoconf has verified that the ctype
-   macros don't need to be guarded with references to isascii. ...
-   Defining isascii to 1 should let any compiler worth its salt
-   eliminate the && through constant folding."
-   Solaris defines some of these symbols so we must undefine them first.  */
-
-# undef ISASCII
-# if defined STDC_HEADERS || (!defined isascii && !defined HAVE_ISASCII)
-#  define ISASCII(c) 1
-# else
-#  define ISASCII(c) isascii(c)
-# endif
-
-/* 1 if C is an ASCII character.  */
-# define IS_REAL_ASCII(c) ((c) < 0200)
-
-/* This distinction is not meaningful, except in Emacs.  */
-# define ISUNIBYTE(c) 1
-
-# ifdef isblank
-#  define ISBLANK(c) (ISASCII (c) && isblank (c))
-# else
-#  define ISBLANK(c) ((c) == ' ' || (c) == '\t')
-# endif
-# ifdef isgraph
-#  define ISGRAPH(c) (ISASCII (c) && isgraph (c))
-# else
-#  define ISGRAPH(c) (ISASCII (c) && isprint (c) && !isspace (c))
-# endif
-
-# undef ISPRINT
-# define ISPRINT(c) (ISASCII (c) && isprint (c))
-# define ISDIGIT(c) (ISASCII (c) && isdigit (c))
-# define ISALNUM(c) (ISASCII (c) && isalnum (c))
-# define ISALPHA(c) (ISASCII (c) && isalpha (c))
-# define ISCNTRL(c) (ISASCII (c) && iscntrl (c))
-# define ISLOWER(c) (ISASCII (c) && islower (c))
-# define ISPUNCT(c) (ISASCII (c) && ispunct (c))
-# define ISSPACE(c) (ISASCII (c) && isspace (c))
-# define ISUPPER(c) (ISASCII (c) && isupper (c))
-# define ISXDIGIT(c) (ISASCII (c) && isxdigit (c))
-
-# define ISWORD(c) ISALPHA(c)
-
-# ifdef _tolower
-#  define TOLOWER(c) _tolower(c)
-# else
-#  define TOLOWER(c) tolower(c)
-# endif
-
-/* How many characters in the character set.  */
-# define CHAR_SET_SIZE 256
-
-# ifdef SYNTAX_TABLE
-
-extern char *re_syntax_table;
-
-# else /* not SYNTAX_TABLE */
-
-static char re_syntax_table[CHAR_SET_SIZE];
-
-static void
-init_syntax_once ()
-{
-   register int c;
-   static int done = 0;
-
-   if (done)
-     return;
-
-   bzero (re_syntax_table, sizeof re_syntax_table);
-
-   for (c = 0; c < CHAR_SET_SIZE; ++c)
-     if (ISALNUM (c))
-       re_syntax_table[c] = Sword;
-
-   re_syntax_table['_'] = Sword;
-
-   done = 1;
-}
-
-# endif /* not SYNTAX_TABLE */
-
-# define SYNTAX(c) re_syntax_table[(c)]
-
-#endif /* not emacs */
-\f
-#ifndef NULL
-# define NULL (void *)0
-#endif
-
-/* We remove any previous definition of `SIGN_EXTEND_CHAR',
-   since ours (we hope) works properly with all combinations of
-   machines, compilers, `char' and `unsigned char' argument types.
-   (Per Bothner suggested the basic approach.)  */
-#undef SIGN_EXTEND_CHAR
-#if __STDC__
-# define SIGN_EXTEND_CHAR(c) ((signed char) (c))
-#else  /* not __STDC__ */
-/* As in Harbison and Steele.  */
-# define SIGN_EXTEND_CHAR(c) ((((unsigned char) (c)) ^ 128) - 128)
-#endif
-\f
-/* Should we use malloc or alloca?  If REGEX_MALLOC is not defined, we
-   use `alloca' instead of `malloc'.  This is because using malloc in
-   re_search* or re_match* could cause memory leaks when C-g is used in
-   Emacs; also, malloc is slower and causes storage fragmentation.  On
-   the other hand, malloc is more portable, and easier to debug.
-
-   Because we sometimes use alloca, some routines have to be macros,
-   not functions -- `alloca'-allocated space disappears at the end of the
-   function it is called in.  */
-
-#ifdef REGEX_MALLOC
-
-# define REGEX_ALLOCATE malloc
-# define REGEX_REALLOCATE(source, osize, nsize) realloc (source, nsize)
-# define REGEX_FREE free
-
-#else /* not REGEX_MALLOC  */
-
-/* Emacs already defines alloca, sometimes.  */
-# ifndef alloca
-
-/* Make alloca work the best possible way.  */
-#  ifdef __GNUC__
-#   define alloca __builtin_alloca
-#  else /* not __GNUC__ */
-#   if HAVE_ALLOCA_H
-#    include <alloca.h>
-#   endif /* HAVE_ALLOCA_H */
-#  endif /* not __GNUC__ */
-
-# endif /* not alloca */
-
-# define REGEX_ALLOCATE alloca
-
-/* Assumes a `char *destination' variable.  */
-# define REGEX_REALLOCATE(source, osize, nsize)                                \
-  (destination = (char *) alloca (nsize),                              \
-   memcpy (destination, source, osize))
-
-/* No need to do anything to free, after alloca.  */
-# define REGEX_FREE(arg) ((void)0) /* Do nothing!  But inhibit gcc warning.  */
-
-#endif /* not REGEX_MALLOC */
-
-/* Define how to allocate the failure stack.  */
-
-#if defined REL_ALLOC && defined REGEX_MALLOC
-
-# define REGEX_ALLOCATE_STACK(size)                            \
-  r_alloc (&failure_stack_ptr, (size))
-# define REGEX_REALLOCATE_STACK(source, osize, nsize)          \
-  r_re_alloc (&failure_stack_ptr, (nsize))
-# define REGEX_FREE_STACK(ptr)                                 \
-  r_alloc_free (&failure_stack_ptr)
-
-#else /* not using relocating allocator */
-
-# ifdef REGEX_MALLOC
-
-#  define REGEX_ALLOCATE_STACK malloc
-#  define REGEX_REALLOCATE_STACK(source, osize, nsize) realloc (source, nsize)
-#  define REGEX_FREE_STACK free
-
-# else /* not REGEX_MALLOC */
-
-#  define REGEX_ALLOCATE_STACK alloca
-
-#  define REGEX_REALLOCATE_STACK(source, osize, nsize)                 \
-   REGEX_REALLOCATE (source, osize, nsize)
-/* No need to explicitly free anything.         */
-#  define REGEX_FREE_STACK(arg) ((void)0)
-
-# endif /* not REGEX_MALLOC */
-#endif /* not using relocating allocator */
-
-
-/* True if `size1' is non-NULL and PTR is pointing anywhere inside
-   `string1' or just past its end.  This works if PTR is NULL, which is
-   a good thing.  */
-#define FIRST_STRING_P(ptr)                                    \
-  (size1 && string1 <= (ptr) && (ptr) <= string1 + size1)
-
-/* (Re)Allocate N items of type T using malloc, or fail.  */
-#define TALLOC(n, t) ((t *) malloc ((n) * sizeof (t)))
-#define RETALLOC(addr, n, t) ((addr) = (t *) realloc (addr, (n) * sizeof (t)))
-#define RETALLOC_IF(addr, n, t) \
-  if (addr) RETALLOC((addr), (n), t); else (addr) = TALLOC ((n), t)
-#define REGEX_TALLOC(n, t) ((t *) REGEX_ALLOCATE ((n) * sizeof (t)))
-
-#define BYTEWIDTH 8 /* In bits.  */
-
-#define STREQ(s1, s2) ((strcmp (s1, s2) == 0))
-
-#undef MAX
-#undef MIN
-#define MAX(a, b) ((a) > (b) ? (a) : (b))
-#define MIN(a, b) ((a) < (b) ? (a) : (b))
-
-/* Type of source-pattern and string chars.  */
-typedef const unsigned char re_char;
-
-typedef char boolean;
-#define false 0
-#define true 1
-
-static int re_match_2_internal _RE_ARGS ((struct re_pattern_buffer *bufp,
-                                       re_char *string1, int size1,
-                                       re_char *string2, int size2,
-                                       int pos,
-                                       struct re_registers *regs,
-                                       int stop));
-\f
-/* These are the command codes that appear in compiled regular
-   expressions.  Some opcodes are followed by argument bytes.  A
-   command code can specify any interpretation whatsoever for its
-   arguments.  Zero bytes may appear in the compiled regular expression.  */
-
-typedef enum
-{
-  no_op = 0,
-
-  /* Succeed right away--no more backtracking.  */
-  succeed,
-
-       /* Followed by one byte giving n, then by n literal bytes.  */
-  exactn,
-
-       /* Matches any (more or less) character.  */
-  anychar,
-
-       /* Matches any one char belonging to specified set.  First
-          following byte is number of bitmap bytes.  Then come bytes
-          for a bitmap saying which chars are in.  Bits in each byte
-          are ordered low-bit-first.  A character is in the set if its
-          bit is 1.  A character too large to have a bit in the map is
-          automatically not in the set.
-
-          If the length byte has the 0x80 bit set, then that stuff
-          is followed by a range table:
-              2 bytes of flags for character sets (low 8 bits, high 8 bits)
-                  See RANGE_TABLE_WORK_BITS below.
-              2 bytes, the number of pairs that follow (upto 32767)
-              pairs, each 2 multibyte characters,
-                  each multibyte character represented as 3 bytes.  */
-  charset,
-
-       /* Same parameters as charset, but match any character that is
-          not one of those specified.  */
-  charset_not,
-
-       /* Start remembering the text that is matched, for storing in a
-          register.  Followed by one byte with the register number, in
-          the range 0 to one less than the pattern buffer's re_nsub
-          field.  */
-  start_memory,
-
-       /* Stop remembering the text that is matched and store it in a
-          memory register.  Followed by one byte with the register
-          number, in the range 0 to one less than `re_nsub' in the
-          pattern buffer.  */
-  stop_memory,
-
-       /* Match a duplicate of something remembered. Followed by one
-          byte containing the register number.  */
-  duplicate,
-
-       /* Fail unless at beginning of line.  */
-  begline,
-
-       /* Fail unless at end of line.  */
-  endline,
-
-       /* Succeeds if at beginning of buffer (if emacs) or at beginning
-          of string to be matched (if not).  */
-  begbuf,
-
-       /* Analogously, for end of buffer/string.  */
-  endbuf,
-
-       /* Followed by two byte relative address to which to jump.  */
-  jump,
-
-       /* Followed by two-byte relative address of place to resume at
-          in case of failure.  */
-  on_failure_jump,
-
-       /* Like on_failure_jump, but pushes a placeholder instead of the
-          current string position when executed.  */
-  on_failure_keep_string_jump,
-
-       /* Just like `on_failure_jump', except that it checks that we
-          don't get stuck in an infinite loop (matching an empty string
-          indefinitely).  */
-  on_failure_jump_loop,
-
-       /* Just like `on_failure_jump_loop', except that it checks for
-          a different kind of loop (the kind that shows up with non-greedy
-          operators).  This operation has to be immediately preceded
-          by a `no_op'.  */
-  on_failure_jump_nastyloop,
-
-       /* A smart `on_failure_jump' used for greedy * and + operators.
-          It analyses the loop before which it is put and if the
-          loop does not require backtracking, it changes itself to
-          `on_failure_keep_string_jump' and short-circuits the loop,
-          else it just defaults to changing itself into `on_failure_jump'.
-          It assumes that it is pointing to just past a `jump'.  */
-  on_failure_jump_smart,
-
-       /* Followed by two-byte relative address and two-byte number n.
-          After matching N times, jump to the address upon failure.
-          Does not work if N starts at 0: use on_failure_jump_loop
-          instead.  */
-  succeed_n,
-
-       /* Followed by two-byte relative address, and two-byte number n.
-          Jump to the address N times, then fail.  */
-  jump_n,
-
-       /* Set the following two-byte relative address to the
-          subsequent two-byte number.  The address *includes* the two
-          bytes of number.  */
-  set_number_at,
-
-  wordbeg,     /* Succeeds if at word beginning.  */
-  wordend,     /* Succeeds if at word end.  */
-
-  wordbound,   /* Succeeds if at a word boundary.  */
-  notwordbound,        /* Succeeds if not at a word boundary.  */
-
-       /* Matches any character whose syntax is specified.  Followed by
-          a byte which contains a syntax code, e.g., Sword.  */
-  syntaxspec,
-
-       /* Matches any character whose syntax is not that specified.  */
-  notsyntaxspec
-
-#ifdef emacs
-  ,before_dot, /* Succeeds if before point.  */
-  at_dot,      /* Succeeds if at point.  */
-  after_dot,   /* Succeeds if after point.  */
-
-  /* Matches any character whose category-set contains the specified
-     category. The operator is followed by a byte which contains a
-     category code (mnemonic ASCII character). */
-  categoryspec,
-
-  /* Matches any character whose category-set does not contain the
-     specified category.  The operator is followed by a byte which
-     contains the category code (mnemonic ASCII character).  */
-  notcategoryspec
-#endif /* emacs */
-} re_opcode_t;
-\f
-/* Common operations on the compiled pattern.  */
-
-/* Store NUMBER in two contiguous bytes starting at DESTINATION.  */
-
-#define STORE_NUMBER(destination, number)                              \
-  do {                                                                 \
-    (destination)[0] = (number) & 0377;                                        \
-    (destination)[1] = (number) >> 8;                                  \
-  } while (0)
-
-/* Same as STORE_NUMBER, except increment DESTINATION to
-   the byte after where the number is stored.  Therefore, DESTINATION
-   must be an lvalue.  */
-
-#define STORE_NUMBER_AND_INCR(destination, number)                     \
-  do {                                                                 \
-    STORE_NUMBER (destination, number);                                        \
-    (destination) += 2;                                                        \
-  } while (0)
-
-/* Put into DESTINATION a number stored in two contiguous bytes starting
-   at SOURCE.  */
-
-#define EXTRACT_NUMBER(destination, source)                            \
-  do {                                                                 \
-    (destination) = *(source) & 0377;                                  \
-    (destination) += SIGN_EXTEND_CHAR (*((source) + 1)) << 8;          \
-  } while (0)
-
-#ifdef DEBUG
-static void extract_number _RE_ARGS ((int *dest, re_char *source));
-static void
-extract_number (dest, source)
-    int *dest;
-    re_char *source;
-{
-  int temp = SIGN_EXTEND_CHAR (*(source + 1));
-  *dest = *source & 0377;
-  *dest += temp << 8;
-}
-
-# ifndef EXTRACT_MACROS /* To debug the macros.  */
-#  undef EXTRACT_NUMBER
-#  define EXTRACT_NUMBER(dest, src) extract_number (&dest, src)
-# endif /* not EXTRACT_MACROS */
-
-#endif /* DEBUG */
-
-/* Same as EXTRACT_NUMBER, except increment SOURCE to after the number.
-   SOURCE must be an lvalue.  */
-
-#define EXTRACT_NUMBER_AND_INCR(destination, source)                   \
-  do {                                                                 \
-    EXTRACT_NUMBER (destination, source);                              \
-    (source) += 2;                                                     \
-  } while (0)
-
-#ifdef DEBUG
-static void extract_number_and_incr _RE_ARGS ((int *destination,
-                                              re_char **source));
-static void
-extract_number_and_incr (destination, source)
-    int *destination;
-    re_char **source;
-{
-  extract_number (destination, *source);
-  *source += 2;
-}
-
-# ifndef EXTRACT_MACROS
-#  undef EXTRACT_NUMBER_AND_INCR
-#  define EXTRACT_NUMBER_AND_INCR(dest, src) \
-  extract_number_and_incr (&dest, &src)
-# endif /* not EXTRACT_MACROS */
-
-#endif /* DEBUG */
-\f
-/* Store a multibyte character in three contiguous bytes starting
-   DESTINATION, and increment DESTINATION to the byte after where the
-   character is stored.         Therefore, DESTINATION must be an lvalue.  */
-
-#define STORE_CHARACTER_AND_INCR(destination, character)       \
-  do {                                                         \
-    (destination)[0] = (character) & 0377;                     \
-    (destination)[1] = ((character) >> 8) & 0377;              \
-    (destination)[2] = (character) >> 16;                      \
-    (destination) += 3;                                                \
-  } while (0)
-
-/* Put into DESTINATION a character stored in three contiguous bytes
-   starting at SOURCE. */
-
-#define EXTRACT_CHARACTER(destination, source) \
-  do {                                         \
-    (destination) = ((source)[0]               \
-                    | ((source)[1] << 8)       \
-                    | ((source)[2] << 16));    \
-  } while (0)
-
-
-/* Macros for charset. */
-
-/* Size of bitmap of charset P in bytes.  P is a start of charset,
-   i.e. *P is (re_opcode_t) charset or (re_opcode_t) charset_not.  */
-#define CHARSET_BITMAP_SIZE(p) ((p)[1] & 0x7F)
-
-/* Nonzero if charset P has range table.  */
-#define CHARSET_RANGE_TABLE_EXISTS_P(p)         ((p)[1] & 0x80)
-
-/* Return the address of range table of charset P.  But not the start
-   of table itself, but the before where the number of ranges is
-   stored.  `2 +' means to skip re_opcode_t and size of bitmap,
-   and the 2 bytes of flags at the start of the range table.  */
-#define CHARSET_RANGE_TABLE(p) (&(p)[4 + CHARSET_BITMAP_SIZE (p)])
-
-/* Extract the bit flags that start a range table.  */
-#define CHARSET_RANGE_TABLE_BITS(p)            \
-  ((p)[2 + CHARSET_BITMAP_SIZE (p)]            \
-   + (p)[3 + CHARSET_BITMAP_SIZE (p)] * 0x100)
-
-/* Test if C is listed in the bitmap of charset P.  */
-#define CHARSET_LOOKUP_BITMAP(p, c)                            \
-  ((c) < CHARSET_BITMAP_SIZE (p) * BYTEWIDTH                   \
-   && (p)[2 + (c) / BYTEWIDTH] & (1 << ((c) % BYTEWIDTH)))
-
-/* Return the address of end of RANGE_TABLE.  COUNT is number of
-   ranges (which is a pair of (start, end)) in the RANGE_TABLE.         `* 2'
-   is start of range and end of range. `* 3' is size of each start
-   and end.  */
-#define CHARSET_RANGE_TABLE_END(range_table, count)    \
-  ((range_table) + (count) * 2 * 3)
-
-/* Test if C is in RANGE_TABLE.         A flag NOT is negated if C is in.
-   COUNT is number of ranges in RANGE_TABLE.  */
-#define CHARSET_LOOKUP_RANGE_TABLE_RAW(not, c, range_table, count)     \
-  do                                                                   \
-    {                                                                  \
-      re_wchar_t range_start, range_end;                               \
-      re_char *p;                                                      \
-      re_char *range_table_end                                         \
-       = CHARSET_RANGE_TABLE_END ((range_table), (count));             \
-                                                                       \
-      for (p = (range_table); p < range_table_end; p += 2 * 3)         \
-       {                                                               \
-         EXTRACT_CHARACTER (range_start, p);                           \
-         EXTRACT_CHARACTER (range_end, p + 3);                         \
-                                                                       \
-         if (range_start <= (c) && (c) <= range_end)                   \
-           {                                                           \
-             (not) = !(not);                                           \
-             break;                                                    \
-           }                                                           \
-       }                                                               \
-    }                                                                  \
-  while (0)
-
-/* Test if C is in range table of CHARSET.  The flag NOT is negated if
-   C is listed in it.  */
-#define CHARSET_LOOKUP_RANGE_TABLE(not, c, charset)                    \
-  do                                                                   \
-    {                                                                  \
-      /* Number of ranges in range table. */                           \
-      int count;                                                       \
-      re_char *range_table = CHARSET_RANGE_TABLE (charset);            \
-                                                                       \
-      EXTRACT_NUMBER_AND_INCR (count, range_table);                    \
-      CHARSET_LOOKUP_RANGE_TABLE_RAW ((not), (c), range_table, count); \
-    }                                                                  \
-  while (0)
-\f
-/* If DEBUG is defined, Regex prints many voluminous messages about what
-   it is doing (if the variable `debug' is nonzero).  If linked with the
-   main program in `iregex.c', you can enter patterns and strings
-   interactively.  And if linked with the main program in `main.c' and
-   the other test files, you can run the already-written tests.  */
-
-#ifdef DEBUG
-
-/* We use standard I/O for debugging.  */
-# include <stdio.h>
-
-/* It is useful to test things that ``must'' be true when debugging.  */
-# include <assert.h>
-
-static int debug = -100000;
-
-# define DEBUG_STATEMENT(e) e
-# define DEBUG_PRINT1(x) if (debug > 0) printf (x)
-# define DEBUG_PRINT2(x1, x2) if (debug > 0) printf (x1, x2)
-# define DEBUG_PRINT3(x1, x2, x3) if (debug > 0) printf (x1, x2, x3)
-# define DEBUG_PRINT4(x1, x2, x3, x4) if (debug > 0) printf (x1, x2, x3, x4)
-# define DEBUG_PRINT_COMPILED_PATTERN(p, s, e)                         \
-  if (debug > 0) print_partial_compiled_pattern (s, e)
-# define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2)                        \
-  if (debug > 0) print_double_string (w, s1, sz1, s2, sz2)
-
-
-/* Print the fastmap in human-readable form.  */
-
-void
-print_fastmap (fastmap)
-    char *fastmap;
-{
-  unsigned was_a_range = 0;
-  unsigned i = 0;
-
-  while (i < (1 << BYTEWIDTH))
-    {
-      if (fastmap[i++])
-       {
-         was_a_range = 0;
-         putchar (i - 1);
-         while (i < (1 << BYTEWIDTH)  &&  fastmap[i])
-           {
-             was_a_range = 1;
-             i++;
-           }
-         if (was_a_range)
-           {
-             printf ("-");
-             putchar (i - 1);
-           }
-       }
-    }
-  putchar ('\n');
-}
-
-
-/* Print a compiled pattern string in human-readable form, starting at
-   the START pointer into it and ending just before the pointer END.  */
-
-void
-print_partial_compiled_pattern (start, end)
-    re_char *start;
-    re_char *end;
-{
-  int mcnt, mcnt2;
-  re_char *p = start;
-  re_char *pend = end;
-
-  if (start == NULL)
-    {
-      fprintf (stderr, "(null)\n");
-      return;
-    }
-
-  /* Loop over pattern commands.  */
-  while (p < pend)
-    {
-      fprintf (stderr, "%d:\t", p - start);
-
-      switch ((re_opcode_t) *p++)
-       {
-       case no_op:
-         fprintf (stderr, "/no_op");
-         break;
-
-       case succeed:
-         fprintf (stderr, "/succeed");
-         break;
-
-       case exactn:
-         mcnt = *p++;
-         fprintf (stderr, "/exactn/%d", mcnt);
-         do
-           {
-             fprintf (stderr, "/%c", *p++);
-           }
-         while (--mcnt);
-         break;
-
-       case start_memory:
-         fprintf (stderr, "/start_memory/%d", *p++);
-         break;
-
-       case stop_memory:
-         fprintf (stderr, "/stop_memory/%d", *p++);
-         break;
-
-       case duplicate:
-         fprintf (stderr, "/duplicate/%d", *p++);
-         break;
-
-       case anychar:
-         fprintf (stderr, "/anychar");
-         break;
-
-       case charset:
-       case charset_not:
-         {
-           register int c, last = -100;
-           register int in_range = 0;
-           int length = CHARSET_BITMAP_SIZE (p - 1);
-           int has_range_table = CHARSET_RANGE_TABLE_EXISTS_P (p - 1);
-
-           fprintf (stderr, "/charset [%s",
-                    (re_opcode_t) *(p - 1) == charset_not ? "^" : "");
-
-           if (p + *p >= pend)
-             fprintf (stderr, " !extends past end of pattern! ");
-
-           for (c = 0; c < 256; c++)
-             if (c / 8 < length
-                 && (p[1 + (c/8)] & (1 << (c % 8))))
-               {
-                 /* Are we starting a range?  */
-                 if (last + 1 == c && ! in_range)
-                   {
-                     fprintf (stderr, "-");
-                     in_range = 1;
-                   }
-                 /* Have we broken a range?  */
-                 else if (last + 1 != c && in_range)
-                   {
-                     fprintf (stderr, "%c", last);
-                     in_range = 0;
-                   }
-
-                 if (! in_range)
-                   fprintf (stderr, "%c", c);
-
-                 last = c;
-             }
-
-           if (in_range)
-             fprintf (stderr, "%c", last);
-
-           fprintf (stderr, "]");
-
-           p += 1 + length;
-
-           if (has_range_table)
-             {
-               int count;
-               fprintf (stderr, "has-range-table");
-
-               /* ??? Should print the range table; for now, just skip it.  */
-               p += 2;         /* skip range table bits */
-               EXTRACT_NUMBER_AND_INCR (count, p);
-               p = CHARSET_RANGE_TABLE_END (p, count);
-             }
-         }
-         break;
-
-       case begline:
-         fprintf (stderr, "/begline");
-         break;
-
-       case endline:
-         fprintf (stderr, "/endline");
-         break;
-
-       case on_failure_jump:
-         extract_number_and_incr (&mcnt, &p);
-         fprintf (stderr, "/on_failure_jump to %d", p + mcnt - start);
-         break;
-
-       case on_failure_keep_string_jump:
-         extract_number_and_incr (&mcnt, &p);
-         fprintf (stderr, "/on_failure_keep_string_jump to %d", p + mcnt - start);
-         break;
-
-       case on_failure_jump_nastyloop:
-         extract_number_and_incr (&mcnt, &p);
-         fprintf (stderr, "/on_failure_jump_nastyloop to %d", p + mcnt - start);
-         break;
-
-       case on_failure_jump_loop:
-         extract_number_and_incr (&mcnt, &p);
-         fprintf (stderr, "/on_failure_jump_loop to %d", p + mcnt - start);
-         break;
-
-       case on_failure_jump_smart:
-         extract_number_and_incr (&mcnt, &p);
-         fprintf (stderr, "/on_failure_jump_smart to %d", p + mcnt - start);
-         break;
-
-       case jump:
-         extract_number_and_incr (&mcnt, &p);
-         fprintf (stderr, "/jump to %d", p + mcnt - start);
-         break;
-
-       case succeed_n:
-         extract_number_and_incr (&mcnt, &p);
-         extract_number_and_incr (&mcnt2, &p);
-         fprintf (stderr, "/succeed_n to %d, %d times", p - 2 + mcnt - start, mcnt2);
-         break;
-
-       case jump_n:
-         extract_number_and_incr (&mcnt, &p);
-         extract_number_and_incr (&mcnt2, &p);
-         fprintf (stderr, "/jump_n to %d, %d times", p - 2 + mcnt - start, mcnt2);
-         break;
-
-       case set_number_at:
-         extract_number_and_incr (&mcnt, &p);
-         extract_number_and_incr (&mcnt2, &p);
-         fprintf (stderr, "/set_number_at location %d to %d", p - 2 + mcnt - start, mcnt2);
-         break;
-
-       case wordbound:
-         fprintf (stderr, "/wordbound");
-         break;
-
-       case notwordbound:
-         fprintf (stderr, "/notwordbound");
-         break;
-
-       case wordbeg:
-         fprintf (stderr, "/wordbeg");
-         break;
-
-       case wordend:
-         fprintf (stderr, "/wordend");
-
-       case syntaxspec:
-         fprintf (stderr, "/syntaxspec");
-         mcnt = *p++;
-         fprintf (stderr, "/%d", mcnt);
-         break;
-
-       case notsyntaxspec:
-         fprintf (stderr, "/notsyntaxspec");
-         mcnt = *p++;
-         fprintf (stderr, "/%d", mcnt);
-         break;
-
-# ifdef emacs
-       case before_dot:
-         fprintf (stderr, "/before_dot");
-         break;
-
-       case at_dot:
-         fprintf (stderr, "/at_dot");
-         break;
-
-       case after_dot:
-         fprintf (stderr, "/after_dot");
-         break;
-
-       case categoryspec:
-         fprintf (stderr, "/categoryspec");
-         mcnt = *p++;
-         fprintf (stderr, "/%d", mcnt);
-         break;
-
-       case notcategoryspec:
-         fprintf (stderr, "/notcategoryspec");
-         mcnt = *p++;
-         fprintf (stderr, "/%d", mcnt);
-         break;
-# endif /* emacs */
-
-       case begbuf:
-         fprintf (stderr, "/begbuf");
-         break;
-
-       case endbuf:
-         fprintf (stderr, "/endbuf");
-         break;
-
-       default:
-         fprintf (stderr, "?%d", *(p-1));
-       }
-
-      fprintf (stderr, "\n");
-    }
-
-  fprintf (stderr, "%d:\tend of pattern.\n", p - start);
-}
-
-
-void
-print_compiled_pattern (bufp)
-    struct re_pattern_buffer *bufp;
-{
-  re_char *buffer = bufp->buffer;
-
-  print_partial_compiled_pattern (buffer, buffer + bufp->used);
-  printf ("%ld bytes used/%ld bytes allocated.\n",
-         bufp->used, bufp->allocated);
-
-  if (bufp->fastmap_accurate && bufp->fastmap)
-    {
-      printf ("fastmap: ");
-      print_fastmap (bufp->fastmap);
-    }
-
-  printf ("re_nsub: %d\t", bufp->re_nsub);
-  printf ("regs_alloc: %d\t", bufp->regs_allocated);
-  printf ("can_be_null: %d\t", bufp->can_be_null);
-  printf ("no_sub: %d\t", bufp->no_sub);
-  printf ("not_bol: %d\t", bufp->not_bol);
-  printf ("not_eol: %d\t", bufp->not_eol);
-  printf ("syntax: %lx\n", bufp->syntax);
-  fflush (stdout);
-  /* Perhaps we should print the translate table?  */
-}
-
-
-void
-print_double_string (where, string1, size1, string2, size2)
-    re_char *where;
-    re_char *string1;
-    re_char *string2;
-    int size1;
-    int size2;
-{
-  int this_char;
-
-  if (where == NULL)
-    printf ("(null)");
-  else
-    {
-      if (FIRST_STRING_P (where))
-       {
-         for (this_char = where - string1; this_char < size1; this_char++)
-           putchar (string1[this_char]);
-
-         where = string2;
-       }
-
-      for (this_char = where - string2; this_char < size2; this_char++)
-       putchar (string2[this_char]);
-    }
-}
-
-#else /* not DEBUG */
-
-# undef assert
-# define assert(e)
-
-# define DEBUG_STATEMENT(e)
-# define DEBUG_PRINT1(x)
-# define DEBUG_PRINT2(x1, x2)
-# define DEBUG_PRINT3(x1, x2, x3)
-# define DEBUG_PRINT4(x1, x2, x3, x4)
-# define DEBUG_PRINT_COMPILED_PATTERN(p, s, e)
-# define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2)
-
-#endif /* not DEBUG */
-\f
-/* Set by `re_set_syntax' to the current regexp syntax to recognize.  Can
-   also be assigned to arbitrarily: each pattern buffer stores its own
-   syntax, so it can be changed between regex compilations.  */
-/* This has no initializer because initialized variables in Emacs
-   become read-only after dumping.  */
-reg_syntax_t re_syntax_options;
-
-
-/* Specify the precise syntax of regexps for compilation.  This provides
-   for compatibility for various utilities which historically have
-   different, incompatible syntaxes.
-
-   The argument SYNTAX is a bit mask comprised of the various bits
-   defined in regex.h.  We return the old syntax.  */
-
-reg_syntax_t
-re_set_syntax (syntax)
-    reg_syntax_t syntax;
-{
-  reg_syntax_t ret = re_syntax_options;
-
-  re_syntax_options = syntax;
-  return ret;
-}
-WEAK_ALIAS (__re_set_syntax, re_set_syntax)
-\f
-/* This table gives an error message for each of the error codes listed
-   in regex.h.  Obviously the order here has to be same as there.
-   POSIX doesn't require that we do anything for REG_NOERROR,
-   but why not be nice?  */
-
-static const char *re_error_msgid[] =
-  {
-    gettext_noop ("Success"),  /* REG_NOERROR */
-    gettext_noop ("No match"), /* REG_NOMATCH */
-    gettext_noop ("Invalid regular expression"), /* REG_BADPAT */
-    gettext_noop ("Invalid collation character"), /* REG_ECOLLATE */
-    gettext_noop ("Invalid character class name"), /* REG_ECTYPE */
-    gettext_noop ("Trailing backslash"), /* REG_EESCAPE */
-    gettext_noop ("Invalid back reference"), /* REG_ESUBREG */
-    gettext_noop ("Unmatched [ or [^"),        /* REG_EBRACK */
-    gettext_noop ("Unmatched ( or \\("), /* REG_EPAREN */
-    gettext_noop ("Unmatched \\{"), /* REG_EBRACE */
-    gettext_noop ("Invalid content of \\{\\}"), /* REG_BADBR */
-    gettext_noop ("Invalid range end"),        /* REG_ERANGE */
-    gettext_noop ("Memory exhausted"), /* REG_ESPACE */
-    gettext_noop ("Invalid preceding regular expression"), /* REG_BADRPT */
-    gettext_noop ("Premature end of regular expression"), /* REG_EEND */
-    gettext_noop ("Regular expression too big"), /* REG_ESIZE */
-    gettext_noop ("Unmatched ) or \\)"), /* REG_ERPAREN */
-  };
-\f
-/* Avoiding alloca during matching, to placate r_alloc.  */
-
-/* Define MATCH_MAY_ALLOCATE unless we need to make sure that the
-   searching and matching functions should not call alloca.  On some
-   systems, alloca is implemented in terms of malloc, and if we're
-   using the relocating allocator routines, then malloc could cause a
-   relocation, which might (if the strings being searched are in the
-   ralloc heap) shift the data out from underneath the regexp
-   routines.
-
-   Here's another reason to avoid allocation: Emacs
-   processes input from X in a signal handler; processing X input may
-   call malloc; if input arrives while a matching routine is calling
-   malloc, then we're scrod.  But Emacs can't just block input while
-   calling matching routines; then we don't notice interrupts when
-   they come in.  So, Emacs blocks input around all regexp calls
-   except the matching calls, which it leaves unprotected, in the
-   faith that they will not malloc.  */
-
-/* Normally, this is fine.  */
-#define MATCH_MAY_ALLOCATE
-
-/* When using GNU C, we are not REALLY using the C alloca, no matter
-   what config.h may say.  So don't take precautions for it.  */
-#ifdef __GNUC__
-# undef C_ALLOCA
-#endif
-
-/* The match routines may not allocate if (1) they would do it with malloc
-   and (2) it's not safe for them to use malloc.
-   Note that if REL_ALLOC is defined, matching would not use malloc for the
-   failure stack, but we would still use it for the register vectors;
-   so REL_ALLOC should not affect this.  */
-#if (defined C_ALLOCA || defined REGEX_MALLOC) && defined emacs
-# undef MATCH_MAY_ALLOCATE
-#endif
-
-\f
-/* Failure stack declarations and macros; both re_compile_fastmap and
-   re_match_2 use a failure stack.  These have to be macros because of
-   REGEX_ALLOCATE_STACK.  */
-
-
-/* Approximate number of failure points for which to initially allocate space
-   when matching.  If this number is exceeded, we allocate more
-   space, so it is not a hard limit.  */
-#ifndef INIT_FAILURE_ALLOC
-# define INIT_FAILURE_ALLOC 20
-#endif
-
-/* Roughly the maximum number of failure points on the stack.  Would be
-   exactly that if always used TYPICAL_FAILURE_SIZE items each time we failed.
-   This is a variable only so users of regex can assign to it; we never
-   change it ourselves.  We always multiply it by TYPICAL_FAILURE_SIZE
-   before using it, so it should probably be a byte-count instead.  */
-# if defined MATCH_MAY_ALLOCATE
-/* Note that 4400 was enough to cause a crash on Alpha OSF/1,
-   whose default stack limit is 2mb.  In order for a larger
-   value to work reliably, you have to try to make it accord
-   with the process stack limit.  */
-size_t re_max_failures = 40000;
-# else
-size_t re_max_failures = 4000;
-# endif
-
-union fail_stack_elt
-{
-  re_char *pointer;
-  /* This should be the biggest `int' that's no bigger than a pointer.  */
-  long integer;
-};
-
-typedef union fail_stack_elt fail_stack_elt_t;
-
-typedef struct
-{
-  fail_stack_elt_t *stack;
-  size_t size;
-  size_t avail;        /* Offset of next open position.  */
-  size_t frame;        /* Offset of the cur constructed frame.  */
-} fail_stack_type;
-
-#define FAIL_STACK_EMPTY()     (fail_stack.frame == 0)
-#define FAIL_STACK_FULL()      (fail_stack.avail == fail_stack.size)
-
-
-/* Define macros to initialize and free the failure stack.
-   Do `return -2' if the alloc fails.  */
-
-#ifdef MATCH_MAY_ALLOCATE
-# define INIT_FAIL_STACK()                                             \
-  do {                                                                 \
-    fail_stack.stack = (fail_stack_elt_t *)                            \
-      REGEX_ALLOCATE_STACK (INIT_FAILURE_ALLOC * TYPICAL_FAILURE_SIZE  \
-                           * sizeof (fail_stack_elt_t));               \
-                                                                       \
-    if (fail_stack.stack == NULL)                                      \
-      return -2;                                                       \
-                                                                       \
-    fail_stack.size = INIT_FAILURE_ALLOC;                              \
-    fail_stack.avail = 0;                                              \
-    fail_stack.frame = 0;                                              \
-  } while (0)
-
-# define RESET_FAIL_STACK()  REGEX_FREE_STACK (fail_stack.stack)
-#else
-# define INIT_FAIL_STACK()                                             \
-  do {                                                                 \
-    fail_stack.avail = 0;                                              \
-    fail_stack.frame = 0;                                              \
-  } while (0)
-
-# define RESET_FAIL_STACK() ((void)0)
-#endif
-
-
-/* Double the size of FAIL_STACK, up to a limit
-   which allows approximately `re_max_failures' items.
-
-   Return 1 if succeeds, and 0 if either ran out of memory
-   allocating space for it or it was already too large.
-
-   REGEX_REALLOCATE_STACK requires `destination' be declared.   */
-
-/* Factor to increase the failure stack size by
-   when we increase it.
-   This used to be 2, but 2 was too wasteful
-   because the old discarded stacks added up to as much space
-   were as ultimate, maximum-size stack.  */
-#define FAIL_STACK_GROWTH_FACTOR 4
-
-#define GROW_FAIL_STACK(fail_stack)                                    \
-  (((fail_stack).size * sizeof (fail_stack_elt_t)                      \
-    >= re_max_failures * TYPICAL_FAILURE_SIZE)                         \
-   ? 0                                                                 \
-   : ((fail_stack).stack                                               \
-      = (fail_stack_elt_t *)                                           \
-       REGEX_REALLOCATE_STACK ((fail_stack).stack,                     \
-         (fail_stack).size * sizeof (fail_stack_elt_t),                \
-         MIN (re_max_failures * TYPICAL_FAILURE_SIZE,                  \
-              ((fail_stack).size * sizeof (fail_stack_elt_t)           \
-               * FAIL_STACK_GROWTH_FACTOR))),                          \
-                                                                       \
-      (fail_stack).stack == NULL                                       \
-      ? 0                                                              \
-      : ((fail_stack).size                                             \
-        = (MIN (re_max_failures * TYPICAL_FAILURE_SIZE,                \
-                ((fail_stack).size * sizeof (fail_stack_elt_t)         \
-                 * FAIL_STACK_GROWTH_FACTOR))                          \
-           / sizeof (fail_stack_elt_t)),                               \
-        1)))
-
-
-/* Push a pointer value onto the failure stack.
-   Assumes the variable `fail_stack'.  Probably should only
-   be called from within `PUSH_FAILURE_POINT'.  */
-#define PUSH_FAILURE_POINTER(item)                                     \
-  fail_stack.stack[fail_stack.avail++].pointer = (item)
-
-/* This pushes an integer-valued item onto the failure stack.
-   Assumes the variable `fail_stack'.  Probably should only
-   be called from within `PUSH_FAILURE_POINT'.  */
-#define PUSH_FAILURE_INT(item)                                 \
-  fail_stack.stack[fail_stack.avail++].integer = (item)
-
-/* Push a fail_stack_elt_t value onto the failure stack.
-   Assumes the variable `fail_stack'.  Probably should only
-   be called from within `PUSH_FAILURE_POINT'.  */
-#define PUSH_FAILURE_ELT(item)                                 \
-  fail_stack.stack[fail_stack.avail++] =  (item)
-
-/* These three POP... operations complement the three PUSH... operations.
-   All assume that `fail_stack' is nonempty.  */
-#define POP_FAILURE_POINTER() fail_stack.stack[--fail_stack.avail].pointer
-#define POP_FAILURE_INT() fail_stack.stack[--fail_stack.avail].integer
-#define POP_FAILURE_ELT() fail_stack.stack[--fail_stack.avail]
-
-/* Individual items aside from the registers.  */
-#define NUM_NONREG_ITEMS 3
-
-/* Used to examine the stack (to detect infinite loops).  */
-#define FAILURE_PAT(h) fail_stack.stack[(h) - 1].pointer
-#define FAILURE_STR(h) (fail_stack.stack[(h) - 2].pointer)
-#define NEXT_FAILURE_HANDLE(h) fail_stack.stack[(h) - 3].integer
-#define TOP_FAILURE_HANDLE() fail_stack.frame
-
-
-#define ENSURE_FAIL_STACK(space)                                       \
-while (REMAINING_AVAIL_SLOTS <= space) {                               \
-  if (!GROW_FAIL_STACK (fail_stack))                                   \
-    return -2;                                                         \
-  DEBUG_PRINT2 ("\n  Doubled stack; size now: %d\n", (fail_stack).size);\
-  DEBUG_PRINT2 ("       slots available: %d\n", REMAINING_AVAIL_SLOTS);\
-}
-
-/* Push register NUM onto the stack.  */
-#define PUSH_FAILURE_REG(num)                                          \
-do {                                                                   \
-  char *destination;                                                   \
-  ENSURE_FAIL_STACK(3);                                                        \
-  DEBUG_PRINT4 ("    Push reg %d (spanning %p -> %p)\n",               \
-               num, regstart[num], regend[num]);                       \
-  PUSH_FAILURE_POINTER (regstart[num]);                                        \
-  PUSH_FAILURE_POINTER (regend[num]);                                  \
-  PUSH_FAILURE_INT (num);                                              \
-} while (0)
-
-/* Change the counter's value to VAL, but make sure that it will
-   be reset when backtracking.  */
-#define PUSH_NUMBER(ptr,val)                                           \
-do {                                                                   \
-  char *destination;                                                   \
-  int c;                                                               \
-  ENSURE_FAIL_STACK(3);                                                        \
-  EXTRACT_NUMBER (c, ptr);                                             \
-  DEBUG_PRINT4 ("    Push number %p = %d -> %d\n", ptr, c, val);       \
-  PUSH_FAILURE_INT (c);                                                        \
-  PUSH_FAILURE_POINTER (ptr);                                          \
-  PUSH_FAILURE_INT (-1);                                               \
-  STORE_NUMBER (ptr, val);                                             \
-} while (0)
-
-/* Pop a saved register off the stack.  */
-#define POP_FAILURE_REG_OR_COUNT()                                     \
-do {                                                                   \
-  int reg = POP_FAILURE_INT ();                                                \
-  if (reg == -1)                                                       \
-    {                                                                  \
-      /* It's a counter.  */                                           \
-      /* Here, we discard `const', making re_match non-reentrant.  */  \
-      unsigned char *ptr = (unsigned char*) POP_FAILURE_POINTER ();    \
-      reg = POP_FAILURE_INT ();                                                \
-      STORE_NUMBER (ptr, reg);                                         \
-      DEBUG_PRINT3 ("     Pop counter %p = %d\n", ptr, reg);           \
-    }                                                                  \
-  else                                                                 \
-    {                                                                  \
-      regend[reg] = POP_FAILURE_POINTER ();                            \
-      regstart[reg] = POP_FAILURE_POINTER ();                          \
-      DEBUG_PRINT4 ("     Pop reg %d (spanning %p -> %p)\n",           \
-                   reg, regstart[reg], regend[reg]);                   \
-    }                                                                  \
-} while (0)
-
-/* Check that we are not stuck in an infinite loop.  */
-#define CHECK_INFINITE_LOOP(pat_cur, string_place)                     \
-do {                                                                   \
-  int failure = TOP_FAILURE_HANDLE ();                                 \
-  /* Check for infinite matching loops */                              \
-  while (failure > 0                                                   \
-        && (FAILURE_STR (failure) == string_place                      \
-            || FAILURE_STR (failure) == NULL))                         \
-    {                                                                  \
-      assert (FAILURE_PAT (failure) >= bufp->buffer                    \
-             && FAILURE_PAT (failure) <= bufp->buffer + bufp->used);   \
-      if (FAILURE_PAT (failure) == pat_cur)                            \
-       {                                                               \
-         cycle = 1;                                                    \
-         break;                                                        \
-       }                                                               \
-      DEBUG_PRINT2 ("  Other pattern: %p\n", FAILURE_PAT (failure));   \
-      failure = NEXT_FAILURE_HANDLE(failure);                          \
-    }                                                                  \
-  DEBUG_PRINT2 ("  Other string: %p\n", FAILURE_STR (failure));                \
-} while (0)
-
-/* Push the information about the state we will need
-   if we ever fail back to it.
-
-   Requires variables fail_stack, regstart, regend and
-   num_regs be declared.  GROW_FAIL_STACK requires `destination' be
-   declared.
-
-   Does `return FAILURE_CODE' if runs out of memory.  */
-
-#define PUSH_FAILURE_POINT(pattern, string_place)                      \
-do {                                                                   \
-  char *destination;                                                   \
-  /* Must be int, so when we don't save any registers, the arithmetic  \
-     of 0 + -1 isn't done as unsigned.  */                             \
-                                                                       \
-  DEBUG_STATEMENT (nfailure_points_pushed++);                          \
-  DEBUG_PRINT1 ("\nPUSH_FAILURE_POINT:\n");                            \
-  DEBUG_PRINT2 ("  Before push, next avail: %d\n", (fail_stack).avail);        \
-  DEBUG_PRINT2 ("                      size: %d\n", (fail_stack).size);\
-                                                                       \
-  ENSURE_FAIL_STACK (NUM_NONREG_ITEMS);                                        \
-                                                                       \
-  DEBUG_PRINT1 ("\n");                                                 \
-                                                                       \
-  DEBUG_PRINT2 ("  Push frame index: %d\n", fail_stack.frame);         \
-  PUSH_FAILURE_INT (fail_stack.frame);                                 \
-                                                                       \
-  DEBUG_PRINT2 ("  Push string %p: `", string_place);                  \
-  DEBUG_PRINT_DOUBLE_STRING (string_place, string1, size1, string2, size2);\
-  DEBUG_PRINT1 ("'\n");                                                        \
-  PUSH_FAILURE_POINTER (string_place);                                 \
-                                                                       \
-  DEBUG_PRINT2 ("  Push pattern %p: ", pattern);                       \
-  DEBUG_PRINT_COMPILED_PATTERN (bufp, pattern, pend);                  \
-  PUSH_FAILURE_POINTER (pattern);                                      \
-                                                                       \
-  /* Close the frame by moving the frame pointer past it.  */          \
-  fail_stack.frame = fail_stack.avail;                                 \
-} while (0)
-
-/* Estimate the size of data pushed by a typical failure stack entry.
-   An estimate is all we need, because all we use this for
-   is to choose a limit for how big to make the failure stack.  */
-/* BEWARE, the value `20' is hard-coded in emacs.c:main().  */
-#define TYPICAL_FAILURE_SIZE 20
-
-/* How many items can still be added to the stack without overflowing it.  */
-#define REMAINING_AVAIL_SLOTS ((fail_stack).size - (fail_stack).avail)
-
-
-/* Pops what PUSH_FAIL_STACK pushes.
-
-   We restore into the parameters, all of which should be lvalues:
-     STR -- the saved data position.
-     PAT -- the saved pattern position.
-     REGSTART, REGEND -- arrays of string positions.
-
-   Also assumes the variables `fail_stack' and (if debugging), `bufp',
-   `pend', `string1', `size1', `string2', and `size2'. */
-
-#define POP_FAILURE_POINT(str, pat)                                     \
-do {                                                                   \
-  assert (!FAIL_STACK_EMPTY ());                                       \
-                                                                       \
-  /* Remove failure points and point to how many regs pushed.  */      \
-  DEBUG_PRINT1 ("POP_FAILURE_POINT:\n");                               \
-  DEBUG_PRINT2 ("  Before pop, next avail: %d\n", fail_stack.avail);   \
-  DEBUG_PRINT2 ("                   size: %d\n", fail_stack.size);     \
-                                                                       \
-  /* Pop the saved registers.  */                                      \
-  while (fail_stack.frame < fail_stack.avail)                          \
-    POP_FAILURE_REG_OR_COUNT ();                                       \
-                                                                       \
-  pat = POP_FAILURE_POINTER ();                                \
-  DEBUG_PRINT2 ("  Popping pattern %p: ", pat);                                \
-  DEBUG_PRINT_COMPILED_PATTERN (bufp, pat, pend);                      \
-                                                                       \
-  /* If the saved string location is NULL, it came from an             \
-     on_failure_keep_string_jump opcode, and we want to throw away the \
-     saved NULL, thus retaining our current position in the string.  */        \
-  str = POP_FAILURE_POINTER ();                                                \
-  DEBUG_PRINT2 ("  Popping string %p: `", str);                                \
-  DEBUG_PRINT_DOUBLE_STRING (str, string1, size1, string2, size2);     \
-  DEBUG_PRINT1 ("'\n");                                                        \
-                                                                       \
-  fail_stack.frame = POP_FAILURE_INT ();                               \
-  DEBUG_PRINT2 ("  Popping  frame index: %d\n", fail_stack.frame);     \
-                                                                       \
-  assert (fail_stack.avail >= 0);                                      \
-  assert (fail_stack.frame <= fail_stack.avail);                       \
-                                                                       \
-  DEBUG_STATEMENT (nfailure_points_popped++);                          \
-} while (0) /* POP_FAILURE_POINT */
-
-
-\f
-/* Registers are set to a sentinel when they haven't yet matched.  */
-#define REG_UNSET(e) ((e) == NULL)
-\f
-/* Subroutine declarations and macros for regex_compile.  */
-
-static reg_errcode_t regex_compile _RE_ARGS ((re_char *pattern, size_t size,
-                                             reg_syntax_t syntax,
-                                             struct re_pattern_buffer *bufp));
-static void store_op1 _RE_ARGS ((re_opcode_t op, unsigned char *loc, int arg));
-static void store_op2 _RE_ARGS ((re_opcode_t op, unsigned char *loc,
-                                int arg1, int arg2));
-static void insert_op1 _RE_ARGS ((re_opcode_t op, unsigned char *loc,
-                                 int arg, unsigned char *end));
-static void insert_op2 _RE_ARGS ((re_opcode_t op, unsigned char *loc,
-                                 int arg1, int arg2, unsigned char *end));
-static boolean at_begline_loc_p _RE_ARGS ((re_char *pattern,
-                                          re_char *p,
-                                          reg_syntax_t syntax));
-static boolean at_endline_loc_p _RE_ARGS ((re_char *p,
-                                          re_char *pend,
-                                          reg_syntax_t syntax));
-static re_char *skip_one_char _RE_ARGS ((re_char *p));
-static int analyse_first _RE_ARGS ((re_char *p, re_char *pend,
-                                   char *fastmap, const int multibyte));
-
-/* Fetch the next character in the uncompiled pattern, with no
-   translation.  */
-#define PATFETCH(c)                                                    \
-  do {                                                                 \
-    int len;                                                           \
-    if (p == pend) return REG_EEND;                                    \
-    c = RE_STRING_CHAR_AND_LENGTH (p, pend - p, len);                  \
-    p += len;                                                          \
-  } while (0)
-
-
-/* If `translate' is non-null, return translate[D], else just D.  We
-   cast the subscript to translate because some data is declared as
-   `char *', to avoid warnings when a string constant is passed.  But
-   when we use a character as a subscript we must make it unsigned.  */
-#ifndef TRANSLATE
-# define TRANSLATE(d) \
-  (RE_TRANSLATE_P (translate) ? RE_TRANSLATE (translate, (d)) : (d))
-#endif
-
-
-/* Macros for outputting the compiled pattern into `buffer'.  */
-
-/* If the buffer isn't allocated when it comes in, use this.  */
-#define INIT_BUF_SIZE  32
-
-/* Make sure we have at least N more bytes of space in buffer.  */
-#define GET_BUFFER_SPACE(n)                                            \
-    while ((size_t) (b - bufp->buffer + (n)) > bufp->allocated)                \
-      EXTEND_BUFFER ()
-
-/* Make sure we have one more byte of buffer space and then add C to it.  */
-#define BUF_PUSH(c)                                                    \
-  do {                                                                 \
-    GET_BUFFER_SPACE (1);                                              \
-    *b++ = (unsigned char) (c);                                                \
-  } while (0)
-
-
-/* Ensure we have two more bytes of buffer space and then append C1 and C2.  */
-#define BUF_PUSH_2(c1, c2)                                             \
-  do {                                                                 \
-    GET_BUFFER_SPACE (2);                                              \
-    *b++ = (unsigned char) (c1);                                       \
-    *b++ = (unsigned char) (c2);                                       \
-  } while (0)
-
-
-/* As with BUF_PUSH_2, except for three bytes.  */
-#define BUF_PUSH_3(c1, c2, c3)                                         \
-  do {                                                                 \
-    GET_BUFFER_SPACE (3);                                              \
-    *b++ = (unsigned char) (c1);                                       \
-    *b++ = (unsigned char) (c2);                                       \
-    *b++ = (unsigned char) (c3);                                       \
-  } while (0)
-
-
-/* Store a jump with opcode OP at LOC to location TO.  We store a
-   relative address offset by the three bytes the jump itself occupies.  */
-#define STORE_JUMP(op, loc, to) \
-  store_op1 (op, loc, (to) - (loc) - 3)
-
-/* Likewise, for a two-argument jump.  */
-#define STORE_JUMP2(op, loc, to, arg) \
-  store_op2 (op, loc, (to) - (loc) - 3, arg)
-
-/* Like `STORE_JUMP', but for inserting.  Assume `b' is the buffer end.  */
-#define INSERT_JUMP(op, loc, to) \
-  insert_op1 (op, loc, (to) - (loc) - 3, b)
-
-/* Like `STORE_JUMP2', but for inserting.  Assume `b' is the buffer end.  */
-#define INSERT_JUMP2(op, loc, to, arg) \
-  insert_op2 (op, loc, (to) - (loc) - 3, arg, b)
-
-
-/* This is not an arbitrary limit: the arguments which represent offsets
-   into the pattern are two bytes long.  So if 2^15 bytes turns out to
-   be too small, many things would have to change.  */
-# define MAX_BUF_SIZE (1L << 15)
-
-#if 0  /* This is when we thought it could be 2^16 bytes.  */
-/* Any other compiler which, like MSC, has allocation limit below 2^16
-   bytes will have to use approach similar to what was done below for
-   MSC and drop MAX_BUF_SIZE a bit.  Otherwise you may end up
-   reallocating to 0 bytes.  Such thing is not going to work too well.
-   You have been warned!!  */
-#if defined _MSC_VER  && !defined WIN32
-/* Microsoft C 16-bit versions limit malloc to approx 65512 bytes.  */
-# define MAX_BUF_SIZE  65500L
-#else
-# define MAX_BUF_SIZE (1L << 16)
-#endif
-#endif /* 0 */
-
-/* Extend the buffer by twice its current size via realloc and
-   reset the pointers that pointed into the old block to point to the
-   correct places in the new one.  If extending the buffer results in it
-   being larger than MAX_BUF_SIZE, then flag memory exhausted.  */
-#if __BOUNDED_POINTERS__
-# define SET_HIGH_BOUND(P) (__ptrhigh (P) = __ptrlow (P) + bufp->allocated)
-# define MOVE_BUFFER_POINTER(P) \
-  (__ptrlow (P) += incr, SET_HIGH_BOUND (P), __ptrvalue (P) += incr)
-# define ELSE_EXTEND_BUFFER_HIGH_BOUND         \
-  else                                         \
-    {                                          \
-      SET_HIGH_BOUND (b);                      \
-      SET_HIGH_BOUND (begalt);                 \
-      if (fixup_alt_jump)                      \
-       SET_HIGH_BOUND (fixup_alt_jump);        \
-      if (laststart)                           \
-       SET_HIGH_BOUND (laststart);             \
-      if (pending_exact)                       \
-       SET_HIGH_BOUND (pending_exact);         \
-    }
-#else
-# define MOVE_BUFFER_POINTER(P) (P) += incr
-# define ELSE_EXTEND_BUFFER_HIGH_BOUND
-#endif
-#define EXTEND_BUFFER()                                                        \
-  do {                                                                 \
-    re_char *old_buffer = bufp->buffer;                                        \
-    if (bufp->allocated == MAX_BUF_SIZE)                               \
-      return REG_ESIZE;                                                        \
-    bufp->allocated <<= 1;                                             \
-    if (bufp->allocated > MAX_BUF_SIZE)                                        \
-      bufp->allocated = MAX_BUF_SIZE;                                  \
-    RETALLOC (bufp->buffer, bufp->allocated, unsigned char);           \
-    if (bufp->buffer == NULL)                                          \
-      return REG_ESPACE;                                               \
-    /* If the buffer moved, move all the pointers into it.  */         \
-    if (old_buffer != bufp->buffer)                                    \
-      {                                                                        \
-       int incr = bufp->buffer - old_buffer;                           \
-       MOVE_BUFFER_POINTER (b);                                        \
-       MOVE_BUFFER_POINTER (begalt);                                   \
-       if (fixup_alt_jump)                                             \
-         MOVE_BUFFER_POINTER (fixup_alt_jump);                         \
-       if (laststart)                                                  \
-         MOVE_BUFFER_POINTER (laststart);                              \
-       if (pending_exact)                                              \
-         MOVE_BUFFER_POINTER (pending_exact);                          \
-      }                                                                        \
-    ELSE_EXTEND_BUFFER_HIGH_BOUND                                      \
-  } while (0)
-
-
-/* Since we have one byte reserved for the register number argument to
-   {start,stop}_memory, the maximum number of groups we can report
-   things about is what fits in that byte.  */
-#define MAX_REGNUM 255
-
-/* But patterns can have more than `MAX_REGNUM' registers.  We just
-   ignore the excess.  */
-typedef int regnum_t;
-
-
-/* Macros for the compile stack.  */
-
-/* Since offsets can go either forwards or backwards, this type needs to
-   be able to hold values from -(MAX_BUF_SIZE - 1) to MAX_BUF_SIZE - 1.  */
-/* int may be not enough when sizeof(int) == 2.  */
-typedef long pattern_offset_t;
-
-typedef struct
-{
-  pattern_offset_t begalt_offset;
-  pattern_offset_t fixup_alt_jump;
-  pattern_offset_t laststart_offset;
-  regnum_t regnum;
-} compile_stack_elt_t;
-
-
-typedef struct
-{
-  compile_stack_elt_t *stack;
-  unsigned size;
-  unsigned avail;                      /* Offset of next open position.  */
-} compile_stack_type;
-
-
-#define INIT_COMPILE_STACK_SIZE 32
-
-#define COMPILE_STACK_EMPTY  (compile_stack.avail == 0)
-#define COMPILE_STACK_FULL  (compile_stack.avail == compile_stack.size)
-
-/* The next available element.  */
-#define COMPILE_STACK_TOP (compile_stack.stack[compile_stack.avail])
-
-/* Explicit quit checking is only used on NTemacs.  */
-#if defined WINDOWSNT && defined emacs && defined QUIT
-extern int immediate_quit;
-# define IMMEDIATE_QUIT_CHECK                  \
-    do {                                       \
-      if (immediate_quit) QUIT;                        \
-    } while (0)
-#else
-# define IMMEDIATE_QUIT_CHECK    ((void)0)
-#endif
-\f
-/* Structure to manage work area for range table.  */
-struct range_table_work_area
-{
-  int *table;                  /* actual work area.  */
-  int allocated;               /* allocated size for work area in bytes.  */
-  int used;                    /* actually used size in words.  */
-  int bits;                    /* flag to record character classes */
-};
-
-/* Make sure that WORK_AREA can hold more N multibyte characters.
-   This is used only in set_image_of_range and set_image_of_range_1.
-   It expects WORK_AREA to be a pointer.
-   If it can't get the space, it returns from the surrounding function.  */
-
-#define EXTEND_RANGE_TABLE(work_area, n)                               \
-  do {                                                                 \
-    if (((work_area)->used + (n)) * sizeof (int) > (work_area)->allocated) \
-      {                                                                        \
-        extend_range_table_work_area (work_area);                      \
-        if ((work_area)->table == 0)                                   \
-          return (REG_ESPACE);                                         \
-      }                                                                        \
-  } while (0)
-
-#define SET_RANGE_TABLE_WORK_AREA_BIT(work_area, bit)          \
-  (work_area).bits |= (bit)
-
-/* Bits used to implement the multibyte-part of the various character classes
-   such as [:alnum:] in a charset's range table.  */
-#define BIT_WORD       0x1
-#define BIT_LOWER      0x2
-#define BIT_PUNCT      0x4
-#define BIT_SPACE      0x8
-#define BIT_UPPER      0x10
-#define BIT_MULTIBYTE  0x20
-
-/* Set a range START..END to WORK_AREA.
-   The range is passed through TRANSLATE, so START and END
-   should be untranslated.  */
-#define SET_RANGE_TABLE_WORK_AREA(work_area, start, end)               \
-  do {                                                                 \
-    int tem;                                                           \
-    tem = set_image_of_range (&work_area, start, end, translate);      \
-    if (tem > 0)                                                       \
-      FREE_STACK_RETURN (tem);                                         \
-  } while (0)
-
-/* Free allocated memory for WORK_AREA.         */
-#define FREE_RANGE_TABLE_WORK_AREA(work_area)  \
-  do {                                         \
-    if ((work_area).table)                     \
-      free ((work_area).table);                        \
-  } while (0)
-
-#define CLEAR_RANGE_TABLE_WORK_USED(work_area) ((work_area).used = 0, (work_area).bits = 0)
-#define RANGE_TABLE_WORK_USED(work_area) ((work_area).used)
-#define RANGE_TABLE_WORK_BITS(work_area) ((work_area).bits)
-#define RANGE_TABLE_WORK_ELT(work_area, i) ((work_area).table[i])
-\f
-
-/* Set the bit for character C in a list.  */
-#define SET_LIST_BIT(c) (b[((c)) / BYTEWIDTH] |= 1 << ((c) % BYTEWIDTH))
-
-
-/* Get the next unsigned number in the uncompiled pattern.  */
-#define GET_UNSIGNED_NUMBER(num)                                       \
- do { if (p != pend)                                                   \
-     {                                                                 \
-       PATFETCH (c);                                                   \
-       if (c == ' ')                                                   \
-        FREE_STACK_RETURN (REG_BADBR);                                 \
-       while ('0' <= c && c <= '9')                                    \
-        {                                                              \
-           int prev;                                                   \
-          if (num < 0)                                                 \
-            num = 0;                                                   \
-          prev = num;                                                  \
-          num = num * 10 + c - '0';                                    \
-          if (num / 10 != prev)                                        \
-            FREE_STACK_RETURN (REG_BADBR);                             \
-          if (p == pend)                                               \
-            break;                                                     \
-          PATFETCH (c);                                                \
-        }                                                              \
-       if (c == ' ')                                                   \
-        FREE_STACK_RETURN (REG_BADBR);                                 \
-       }                                                               \
-    } while (0)
-\f
-#if WIDE_CHAR_SUPPORT
-/* The GNU C library provides support for user-defined character classes
-   and the functions from ISO C amendement 1.  */
-# ifdef CHARCLASS_NAME_MAX
-#  define CHAR_CLASS_MAX_LENGTH CHARCLASS_NAME_MAX
-# else
-/* This shouldn't happen but some implementation might still have this
-   problem.  Use a reasonable default value.  */
-#  define CHAR_CLASS_MAX_LENGTH 256
-# endif
-typedef wctype_t re_wctype_t;
-typedef wchar_t re_wchar_t;
-# define re_wctype wctype
-# define re_iswctype iswctype
-# define re_wctype_to_bit(cc) 0
-#else
-# define CHAR_CLASS_MAX_LENGTH  9 /* Namely, `multibyte'.  */
-# define btowc(c) c
-
-/* Character classes.  */
-typedef enum { RECC_ERROR = 0,
-              RECC_ALNUM, RECC_ALPHA, RECC_WORD,
-              RECC_GRAPH, RECC_PRINT,
-              RECC_LOWER, RECC_UPPER,
-              RECC_PUNCT, RECC_CNTRL,
-              RECC_DIGIT, RECC_XDIGIT,
-              RECC_BLANK, RECC_SPACE,
-              RECC_MULTIBYTE, RECC_NONASCII,
-              RECC_ASCII, RECC_UNIBYTE
-} re_wctype_t;
-
-typedef int re_wchar_t;
-
-/* Map a string to the char class it names (if any).  */
-static re_wctype_t
-re_wctype (str)
-     re_char *str;
-{
-  const char *string = str;
-  if      (STREQ (string, "alnum"))    return RECC_ALNUM;
-  else if (STREQ (string, "alpha"))    return RECC_ALPHA;
-  else if (STREQ (string, "word"))     return RECC_WORD;
-  else if (STREQ (string, "ascii"))    return RECC_ASCII;
-  else if (STREQ (string, "nonascii")) return RECC_NONASCII;
-  else if (STREQ (string, "graph"))    return RECC_GRAPH;
-  else if (STREQ (string, "lower"))    return RECC_LOWER;
-  else if (STREQ (string, "print"))    return RECC_PRINT;
-  else if (STREQ (string, "punct"))    return RECC_PUNCT;
-  else if (STREQ (string, "space"))    return RECC_SPACE;
-  else if (STREQ (string, "upper"))    return RECC_UPPER;
-  else if (STREQ (string, "unibyte"))  return RECC_UNIBYTE;
-  else if (STREQ (string, "multibyte"))        return RECC_MULTIBYTE;
-  else if (STREQ (string, "digit"))    return RECC_DIGIT;
-  else if (STREQ (string, "xdigit"))   return RECC_XDIGIT;
-  else if (STREQ (string, "cntrl"))    return RECC_CNTRL;
-  else if (STREQ (string, "blank"))    return RECC_BLANK;
-  else return 0;
-}
-
-/* True iff CH is in the char class CC.  */
-static boolean
-re_iswctype (ch, cc)
-     int ch;
-     re_wctype_t cc;
-{
-  switch (cc)
-    {
-    case RECC_ALNUM: return ISALNUM (ch);
-    case RECC_ALPHA: return ISALPHA (ch);
-    case RECC_BLANK: return ISBLANK (ch);
-    case RECC_CNTRL: return ISCNTRL (ch);
-    case RECC_DIGIT: return ISDIGIT (ch);
-    case RECC_GRAPH: return ISGRAPH (ch);
-    case RECC_LOWER: return ISLOWER (ch);
-    case RECC_PRINT: return ISPRINT (ch);
-    case RECC_PUNCT: return ISPUNCT (ch);
-    case RECC_SPACE: return ISSPACE (ch);
-    case RECC_UPPER: return ISUPPER (ch);
-    case RECC_XDIGIT: return ISXDIGIT (ch);
-    case RECC_ASCII: return IS_REAL_ASCII (ch);
-    case RECC_NONASCII: return !IS_REAL_ASCII (ch);
-    case RECC_UNIBYTE: return ISUNIBYTE (ch);
-    case RECC_MULTIBYTE: return !ISUNIBYTE (ch);
-    case RECC_WORD: return ISWORD (ch);
-    case RECC_ERROR: return false;
-    default:
-      abort();
-    }
-}
-
-/* Return a bit-pattern to use in the range-table bits to match multibyte
-   chars of class CC.  */
-static int
-re_wctype_to_bit (cc)
-     re_wctype_t cc;
-{
-  switch (cc)
-    {
-    case RECC_NONASCII: case RECC_PRINT: case RECC_GRAPH:
-    case RECC_MULTIBYTE: return BIT_MULTIBYTE;
-    case RECC_ALPHA: case RECC_ALNUM: case RECC_WORD: return BIT_WORD;
-    case RECC_LOWER: return BIT_LOWER;
-    case RECC_UPPER: return BIT_UPPER;
-    case RECC_PUNCT: return BIT_PUNCT;
-    case RECC_SPACE: return BIT_SPACE;
-    case RECC_ASCII: case RECC_DIGIT: case RECC_XDIGIT: case RECC_CNTRL:
-    case RECC_BLANK: case RECC_UNIBYTE: case RECC_ERROR: return 0;
-    default:
-      abort();
-    }
-}
-#endif
-\f
-/* Filling in the work area of a range.  */
-
-/* Actually extend the space in WORK_AREA.  */
-
-static void
-extend_range_table_work_area (work_area)
-     struct range_table_work_area *work_area;
-{
-  work_area->allocated += 16 * sizeof (int);
-  if (work_area->table)
-    work_area->table
-      = (int *) realloc (work_area->table, work_area->allocated);
-  else
-    work_area->table
-      = (int *) malloc (work_area->allocated);
-}
-
-#ifdef emacs
-
-/* Carefully find the ranges of codes that are equivalent
-   under case conversion to the range start..end when passed through
-   TRANSLATE.  Handle the case where non-letters can come in between
-   two upper-case letters (which happens in Latin-1).
-   Also handle the case of groups of more than 2 case-equivalent chars.
-
-   The basic method is to look at consecutive characters and see
-   if they can form a run that can be handled as one.
-
-   Returns -1 if successful, REG_ESPACE if ran out of space.  */
-
-static int
-set_image_of_range_1 (work_area, start, end, translate)
-     RE_TRANSLATE_TYPE translate;
-     struct range_table_work_area *work_area;
-     re_wchar_t start, end;
-{
-  /* `one_case' indicates a character, or a run of characters,
-     each of which is an isolate (no case-equivalents).
-     This includes all ASCII non-letters.
-
-     `two_case' indicates a character, or a run of characters,
-     each of which has two case-equivalent forms.
-     This includes all ASCII letters.
-
-     `strange' indicates a character that has more than one
-     case-equivalent.  */
-
-  enum case_type {one_case, two_case, strange};
-
-  /* Describe the run that is in progress,
-     which the next character can try to extend.
-     If run_type is strange, that means there really is no run.
-     If run_type is one_case, then run_start...run_end is the run.
-     If run_type is two_case, then the run is run_start...run_end,
-     and the case-equivalents end at run_eqv_end.  */
-
-  enum case_type run_type = strange;
-  int run_start, run_end, run_eqv_end;
-
-  Lisp_Object eqv_table;
-
-  if (!RE_TRANSLATE_P (translate))
-    {
-      EXTEND_RANGE_TABLE (work_area, 2);
-      work_area->table[work_area->used++] = (start);
-      work_area->table[work_area->used++] = (end);
-      return -1;
-    }
-
-  eqv_table = XCHAR_TABLE (translate)->extras[2];
-
-  for (; start <= end; start++)
-    {
-      enum case_type this_type;
-      int eqv = RE_TRANSLATE (eqv_table, start);
-      int minchar, maxchar;
-
-      /* Classify this character */
-      if (eqv == start)
-       this_type = one_case;
-      else if (RE_TRANSLATE (eqv_table, eqv) == start)
-       this_type = two_case;
-      else
-       this_type = strange;
-
-      if (start < eqv)
-       minchar = start, maxchar = eqv;
-      else
-       minchar = eqv, maxchar = start;
-
-      /* Can this character extend the run in progress?  */
-      if (this_type == strange || this_type != run_type
-         || !(minchar == run_end + 1
-              && (run_type == two_case
-                  ? maxchar == run_eqv_end + 1 : 1)))
-       {
-         /* No, end the run.
-            Record each of its equivalent ranges.  */
-         if (run_type == one_case)
-           {
-             EXTEND_RANGE_TABLE (work_area, 2);
-             work_area->table[work_area->used++] = run_start;
-             work_area->table[work_area->used++] = run_end;
-           }
-         else if (run_type == two_case)
-           {
-             EXTEND_RANGE_TABLE (work_area, 4);
-             work_area->table[work_area->used++] = run_start;
-             work_area->table[work_area->used++] = run_end;
-             work_area->table[work_area->used++]
-               = RE_TRANSLATE (eqv_table, run_start);
-             work_area->table[work_area->used++]
-               = RE_TRANSLATE (eqv_table, run_end);
-           }
-         run_type = strange;
-       }
-
-      if (this_type == strange)
-       {
-         /* For a strange character, add each of its equivalents, one
-            by one.  Don't start a range.  */
-         do
-           {
-             EXTEND_RANGE_TABLE (work_area, 2);
-             work_area->table[work_area->used++] = eqv;
-             work_area->table[work_area->used++] = eqv;
-             eqv = RE_TRANSLATE (eqv_table, eqv);
-           }
-         while (eqv != start);
-       }
-
-      /* Add this char to the run, or start a new run.  */
-      else if (run_type == strange)
-       {
-         /* Initialize a new range.  */
-         run_type = this_type;
-         run_start = start;
-         run_end = start;
-         run_eqv_end = RE_TRANSLATE (eqv_table, run_end);
-       }
-      else
-       {
-         /* Extend a running range.  */
-         run_end = minchar;
-         run_eqv_end = RE_TRANSLATE (eqv_table, run_end);
-       }
-    }
-
-  /* If a run is still in progress at the end, finish it now
-     by recording its equivalent ranges.  */
-  if (run_type == one_case)
-    {
-      EXTEND_RANGE_TABLE (work_area, 2);
-      work_area->table[work_area->used++] = run_start;
-      work_area->table[work_area->used++] = run_end;
-    }
-  else if (run_type == two_case)
-    {
-      EXTEND_RANGE_TABLE (work_area, 4);
-      work_area->table[work_area->used++] = run_start;
-      work_area->table[work_area->used++] = run_end;
-      work_area->table[work_area->used++]
-       = RE_TRANSLATE (eqv_table, run_start);
-      work_area->table[work_area->used++]
-       = RE_TRANSLATE (eqv_table, run_end);
-    }
-
-  return -1;
-}
-
-#endif /* emacs */
-
-/* Record the the image of the range start..end when passed through
-   TRANSLATE.  This is not necessarily TRANSLATE(start)..TRANSLATE(end)
-   and is not even necessarily contiguous.
-   Normally we approximate it with the smallest contiguous range that contains
-   all the chars we need.  However, for Latin-1 we go to extra effort
-   to do a better job.
-
-   This function is not called for ASCII ranges.
-
-   Returns -1 if successful, REG_ESPACE if ran out of space.  */
-
-static int
-set_image_of_range (work_area, start, end, translate)
-     RE_TRANSLATE_TYPE translate;
-     struct range_table_work_area *work_area;
-     re_wchar_t start, end;
-{
-  re_wchar_t cmin, cmax;
-
-#ifdef emacs
-  /* For Latin-1 ranges, use set_image_of_range_1
-     to get proper handling of ranges that include letters and nonletters.
-     For a range that includes the whole of Latin-1, this is not necessary.
-     For other character sets, we don't bother to get this right.  */
-  if (RE_TRANSLATE_P (translate) && start < 04400
-      && !(start < 04200 && end >= 04377))
-    {
-      int newend;
-      int tem;
-      newend = end;
-      if (newend > 04377)
-       newend = 04377;
-      tem = set_image_of_range_1 (work_area, start, newend, translate);
-      if (tem > 0)
-       return tem;
-
-      start = 04400;
-      if (end < 04400)
-       return -1;
-    }
-#endif
-
-  EXTEND_RANGE_TABLE (work_area, 2);
-  work_area->table[work_area->used++] = (start);
-  work_area->table[work_area->used++] = (end);
-
-  cmin = -1, cmax = -1;
-
-  if (RE_TRANSLATE_P (translate))
-    {
-      int ch;
-
-      for (ch = start; ch <= end; ch++)
-       {
-         re_wchar_t c = TRANSLATE (ch);
-         if (! (start <= c && c <= end))
-           {
-             if (cmin == -1)
-               cmin = c, cmax = c;
-             else
-               {
-                 cmin = MIN (cmin, c);
-                 cmax = MAX (cmax, c);
-               }
-           }
-       }
-
-      if (cmin != -1)
-       {
-         EXTEND_RANGE_TABLE (work_area, 2);
-         work_area->table[work_area->used++] = (cmin);
-         work_area->table[work_area->used++] = (cmax);
-       }
-    }
-
-  return -1;
-}
-\f
-#ifndef MATCH_MAY_ALLOCATE
-
-/* If we cannot allocate large objects within re_match_2_internal,
-   we make the fail stack and register vectors global.
-   The fail stack, we grow to the maximum size when a regexp
-   is compiled.
-   The register vectors, we adjust in size each time we
-   compile a regexp, according to the number of registers it needs.  */
-
-static fail_stack_type fail_stack;
-
-/* Size with which the following vectors are currently allocated.
-   That is so we can make them bigger as needed,
-   but never make them smaller.  */
-static int regs_allocated_size;
-
-static re_char **     regstart, **     regend;
-static re_char **best_regstart, **best_regend;
-
-/* Make the register vectors big enough for NUM_REGS registers,
-   but don't make them smaller.  */
-
-static
-regex_grow_registers (num_regs)
-     int num_regs;
-{
-  if (num_regs > regs_allocated_size)
-    {
-      RETALLOC_IF (regstart,    num_regs, re_char *);
-      RETALLOC_IF (regend,      num_regs, re_char *);
-      RETALLOC_IF (best_regstart, num_regs, re_char *);
-      RETALLOC_IF (best_regend,         num_regs, re_char *);
-
-      regs_allocated_size = num_regs;
-    }
-}
-
-#endif /* not MATCH_MAY_ALLOCATE */
-\f
-static boolean group_in_compile_stack _RE_ARGS ((compile_stack_type
-                                                compile_stack,
-                                                regnum_t regnum));
-
-/* `regex_compile' compiles PATTERN (of length SIZE) according to SYNTAX.
-   Returns one of error codes defined in `regex.h', or zero for success.
-
-   Assumes the `allocated' (and perhaps `buffer') and `translate'
-   fields are set in BUFP on entry.
-
-   If it succeeds, results are put in BUFP (if it returns an error, the
-   contents of BUFP are undefined):
-     `buffer' is the compiled pattern;
-     `syntax' is set to SYNTAX;
-     `used' is set to the length of the compiled pattern;
-     `fastmap_accurate' is zero;
-     `re_nsub' is the number of subexpressions in PATTERN;
-     `not_bol' and `not_eol' are zero;
-
-   The `fastmap' field is neither examined nor set.  */
-
-/* Insert the `jump' from the end of last alternative to "here".
-   The space for the jump has already been allocated. */
-#define FIXUP_ALT_JUMP()                                               \
-do {                                                                   \
-  if (fixup_alt_jump)                                                  \
-    STORE_JUMP (jump, fixup_alt_jump, b);                              \
-} while (0)
-
-
-/* Return, freeing storage we allocated.  */
-#define FREE_STACK_RETURN(value)               \
-  do {                                                 \
-    FREE_RANGE_TABLE_WORK_AREA (range_table_work);     \
-    free (compile_stack.stack);                                \
-    return value;                                      \
-  } while (0)
-
-static reg_errcode_t
-regex_compile (pattern, size, syntax, bufp)
-     re_char *pattern;
-     size_t size;
-     reg_syntax_t syntax;
-     struct re_pattern_buffer *bufp;
-{
-  /* We fetch characters from PATTERN here.  */
-  register re_wchar_t c, c1;
-
-  /* A random temporary spot in PATTERN.  */
-  re_char *p1;
-
-  /* Points to the end of the buffer, where we should append.  */
-  register unsigned char *b;
-
-  /* Keeps track of unclosed groups.  */
-  compile_stack_type compile_stack;
-
-  /* Points to the current (ending) position in the pattern.  */
-#ifdef AIX
-  /* `const' makes AIX compiler fail.  */
-  unsigned char *p = pattern;
-#else
-  re_char *p = pattern;
-#endif
-  re_char *pend = pattern + size;
-
-  /* How to translate the characters in the pattern.  */
-  RE_TRANSLATE_TYPE translate = bufp->translate;
-
-  /* Address of the count-byte of the most recently inserted `exactn'
-     command.  This makes it possible to tell if a new exact-match
-     character can be added to that command or if the character requires
-     a new `exactn' command.  */
-  unsigned char *pending_exact = 0;
-
-  /* Address of start of the most recently finished expression.
-     This tells, e.g., postfix * where to find the start of its
-     operand.  Reset at the beginning of groups and alternatives.  */
-  unsigned char *laststart = 0;
-
-  /* Address of beginning of regexp, or inside of last group.  */
-  unsigned char *begalt;
-
-  /* Place in the uncompiled pattern (i.e., the {) to
-     which to go back if the interval is invalid.  */
-  re_char *beg_interval;
-
-  /* Address of the place where a forward jump should go to the end of
-     the containing expression.         Each alternative of an `or' -- except the
-     last -- ends with a forward jump of this sort.  */
-  unsigned char *fixup_alt_jump = 0;
-
-  /* Counts open-groups as they are encountered.  Remembered for the
-     matching close-group on the compile stack, so the same register
-     number is put in the stop_memory as the start_memory.  */
-  regnum_t regnum = 0;
-
-  /* Work area for range table of charset.  */
-  struct range_table_work_area range_table_work;
-
-  /* If the object matched can contain multibyte characters.  */
-  const boolean multibyte = RE_MULTIBYTE_P (bufp);
-
-#ifdef DEBUG
-  debug++;
-  DEBUG_PRINT1 ("\nCompiling pattern: ");
-  if (debug > 0)
-    {
-      unsigned debug_count;
-
-      for (debug_count = 0; debug_count < size; debug_count++)
-       putchar (pattern[debug_count]);
-      putchar ('\n');
-    }
-#endif /* DEBUG */
-
-  /* Initialize the compile stack.  */
-  compile_stack.stack = TALLOC (INIT_COMPILE_STACK_SIZE, compile_stack_elt_t);
-  if (compile_stack.stack == NULL)
-    return REG_ESPACE;
-
-  compile_stack.size = INIT_COMPILE_STACK_SIZE;
-  compile_stack.avail = 0;
-
-  range_table_work.table = 0;
-  range_table_work.allocated = 0;
-
-  /* Initialize the pattern buffer.  */
-  bufp->syntax = syntax;
-  bufp->fastmap_accurate = 0;
-  bufp->not_bol = bufp->not_eol = 0;
-
-  /* Set `used' to zero, so that if we return an error, the pattern
-     printer (for debugging) will think there's no pattern.  We reset it
-     at the end.  */
-  bufp->used = 0;
-
-  /* Always count groups, whether or not bufp->no_sub is set.  */
-  bufp->re_nsub = 0;
-
-#if !defined emacs && !defined SYNTAX_TABLE
-  /* Initialize the syntax table.  */
-   init_syntax_once ();
-#endif
-
-  if (bufp->allocated == 0)
-    {
-      if (bufp->buffer)
-       { /* If zero allocated, but buffer is non-null, try to realloc
-            enough space.  This loses if buffer's address is bogus, but
-            that is the user's responsibility.  */
-         RETALLOC (bufp->buffer, INIT_BUF_SIZE, unsigned char);
-       }
-      else
-       { /* Caller did not allocate a buffer.  Do it for them.  */
-         bufp->buffer = TALLOC (INIT_BUF_SIZE, unsigned char);
-       }
-      if (!bufp->buffer) FREE_STACK_RETURN (REG_ESPACE);
-
-      bufp->allocated = INIT_BUF_SIZE;
-    }
-
-  begalt = b = bufp->buffer;
-
-  /* Loop through the uncompiled pattern until we're at the end.  */
-  while (p != pend)
-    {
-      PATFETCH (c);
-
-      switch (c)
-       {
-       case '^':
-         {
-           if (   /* If at start of pattern, it's an operator.  */
-                  p == pattern + 1
-                  /* If context independent, it's an operator.  */
-               || syntax & RE_CONTEXT_INDEP_ANCHORS
-                  /* Otherwise, depends on what's come before.  */
-               || at_begline_loc_p (pattern, p, syntax))
-             BUF_PUSH ((syntax & RE_NO_NEWLINE_ANCHOR) ? begbuf : begline);
-           else
-             goto normal_char;
-         }
-         break;
-
-
-       case '$':
-         {
-           if (   /* If at end of pattern, it's an operator.  */
-                  p == pend
-                  /* If context independent, it's an operator.  */
-               || syntax & RE_CONTEXT_INDEP_ANCHORS
-                  /* Otherwise, depends on what's next.  */
-               || at_endline_loc_p (p, pend, syntax))
-              BUF_PUSH ((syntax & RE_NO_NEWLINE_ANCHOR) ? endbuf : endline);
-            else
-              goto normal_char;
-          }
-          break;
-
-
-       case '+':
-       case '?':
-         if ((syntax & RE_BK_PLUS_QM)
-             || (syntax & RE_LIMITED_OPS))
-           goto normal_char;
-       handle_plus:
-       case '*':
-         /* If there is no previous pattern... */
-         if (!laststart)
-           {
-             if (syntax & RE_CONTEXT_INVALID_OPS)
-               FREE_STACK_RETURN (REG_BADRPT);
-             else if (!(syntax & RE_CONTEXT_INDEP_OPS))
-               goto normal_char;
-           }
-
-         {
-           /* 1 means zero (many) matches is allowed.  */
-           boolean zero_times_ok = 0, many_times_ok = 0;
-           boolean greedy = 1;
-
-           /* If there is a sequence of repetition chars, collapse it
-              down to just one (the right one).  We can't combine
-              interval operators with these because of, e.g., `a{2}*',
-              which should only match an even number of `a's.  */
-
-           for (;;)
-             {
-               if ((syntax & RE_FRUGAL)
-                   && c == '?' && (zero_times_ok || many_times_ok))
-                 greedy = 0;
-               else
-                 {
-                   zero_times_ok |= c != '+';
-                   many_times_ok |= c != '?';
-                 }
-
-               if (p == pend)
-                 break;
-               else if (*p == '*'
-                        || (!(syntax & RE_BK_PLUS_QM)
-                            && (*p == '+' || *p == '?')))
-                 ;
-               else if (syntax & RE_BK_PLUS_QM  && *p == '\\')
-                 {
-                   if (p+1 == pend)
-                     FREE_STACK_RETURN (REG_EESCAPE);
-                   if (p[1] == '+' || p[1] == '?')
-                     PATFETCH (c); /* Gobble up the backslash.  */
-                   else
-                     break;
-                 }
-               else
-                 break;
-               /* If we get here, we found another repeat character.  */
-               PATFETCH (c);
-              }
-
-           /* Star, etc. applied to an empty pattern is equivalent
-              to an empty pattern.  */
-           if (!laststart || laststart == b)
-             break;
-
-           /* Now we know whether or not zero matches is allowed
-              and also whether or not two or more matches is allowed.  */
-           if (greedy)
-             {
-               if (many_times_ok)
-                 {
-                   boolean simple = skip_one_char (laststart) == b;
-                   unsigned int startoffset = 0;
-                   re_opcode_t ofj =
-                     /* Check if the loop can match the empty string.  */
-                     (simple || !analyse_first (laststart, b, NULL, 0))
-                     ? on_failure_jump : on_failure_jump_loop;
-                   assert (skip_one_char (laststart) <= b);
-
-                   if (!zero_times_ok && simple)
-                     { /* Since simple * loops can be made faster by using
-                          on_failure_keep_string_jump, we turn simple P+
-                          into PP* if P is simple.  */
-                       unsigned char *p1, *p2;
-                       startoffset = b - laststart;
-                       GET_BUFFER_SPACE (startoffset);
-                       p1 = b; p2 = laststart;
-                       while (p2 < p1)
-                         *b++ = *p2++;
-                       zero_times_ok = 1;
-                     }
-
-                   GET_BUFFER_SPACE (6);
-                   if (!zero_times_ok)
-                     /* A + loop.  */
-                     STORE_JUMP (ofj, b, b + 6);
-                   else
-                     /* Simple * loops can use on_failure_keep_string_jump
-                        depending on what follows.  But since we don't know
-                        that yet, we leave the decision up to
-                        on_failure_jump_smart.  */
-                     INSERT_JUMP (simple ? on_failure_jump_smart : ofj,
-                                  laststart + startoffset, b + 6);
-                   b += 3;
-                   STORE_JUMP (jump, b, laststart + startoffset);
-                   b += 3;
-                 }
-               else
-                 {
-                   /* A simple ? pattern.  */
-                   assert (zero_times_ok);
-                   GET_BUFFER_SPACE (3);
-                   INSERT_JUMP (on_failure_jump, laststart, b + 3);
-                   b += 3;
-                 }
-             }
-           else                /* not greedy */
-             { /* I wish the greedy and non-greedy cases could be merged. */
-
-               GET_BUFFER_SPACE (7); /* We might use less.  */
-               if (many_times_ok)
-                 {
-                   boolean emptyp = analyse_first (laststart, b, NULL, 0);
-
-                   /* The non-greedy multiple match looks like
-                      a repeat..until: we only need a conditional jump
-                      at the end of the loop.  */
-                   if (emptyp) BUF_PUSH (no_op);
-                   STORE_JUMP (emptyp ? on_failure_jump_nastyloop
-                               : on_failure_jump, b, laststart);
-                   b += 3;
-                   if (zero_times_ok)
-                     {
-                       /* The repeat...until naturally matches one or more.
-                          To also match zero times, we need to first jump to
-                          the end of the loop (its conditional jump).  */
-                       INSERT_JUMP (jump, laststart, b);
-                       b += 3;
-                     }
-                 }
-               else
-                 {
-                   /* non-greedy a?? */
-                   INSERT_JUMP (jump, laststart, b + 3);
-                   b += 3;
-                   INSERT_JUMP (on_failure_jump, laststart, laststart + 6);
-                   b += 3;
-                 }
-             }
-         }
-         pending_exact = 0;
-         break;
-
-
-       case '.':
-         laststart = b;
-         BUF_PUSH (anychar);
-         break;
-
-
-       case '[':
-         {
-           CLEAR_RANGE_TABLE_WORK_USED (range_table_work);
-
-           if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
-
-           /* Ensure that we have enough space to push a charset: the
-              opcode, the length count, and the bitset; 34 bytes in all.  */
-           GET_BUFFER_SPACE (34);
-
-           laststart = b;
-
-           /* We test `*p == '^' twice, instead of using an if
-              statement, so we only need one BUF_PUSH.  */
-           BUF_PUSH (*p == '^' ? charset_not : charset);
-           if (*p == '^')
-             p++;
-
-           /* Remember the first position in the bracket expression.  */
-           p1 = p;
-
-           /* Push the number of bytes in the bitmap.  */
-           BUF_PUSH ((1 << BYTEWIDTH) / BYTEWIDTH);
-
-           /* Clear the whole map.  */
-           bzero (b, (1 << BYTEWIDTH) / BYTEWIDTH);
-
-           /* charset_not matches newline according to a syntax bit.  */
-           if ((re_opcode_t) b[-2] == charset_not
-               && (syntax & RE_HAT_LISTS_NOT_NEWLINE))
-             SET_LIST_BIT ('\n');
-
-           /* Read in characters and ranges, setting map bits.  */
-           for (;;)
-             {
-               boolean escaped_char = false;
-               const unsigned char *p2 = p;
-
-               if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
-
-               /* Don't translate yet.  The range TRANSLATE(X..Y) cannot
-                  always be determined from TRANSLATE(X) and TRANSLATE(Y)
-                  So the translation is done later in a loop.  Example:
-                  (let ((case-fold-search t)) (string-match "[A-_]" "A"))  */
-               PATFETCH (c);
-
-               /* \ might escape characters inside [...] and [^...].  */
-               if ((syntax & RE_BACKSLASH_ESCAPE_IN_LISTS) && c == '\\')
-                 {
-                   if (p == pend) FREE_STACK_RETURN (REG_EESCAPE);
-
-                   PATFETCH (c);
-                   escaped_char = true;
-                 }
-               else
-                 {
-                   /* Could be the end of the bracket expression.      If it's
-                      not (i.e., when the bracket expression is `[]' so
-                      far), the ']' character bit gets set way below.  */
-                   if (c == ']' && p2 != p1)
-                     break;
-                 }
-
-               /* What should we do for the character which is
-                  greater than 0x7F, but not BASE_LEADING_CODE_P?
-                  XXX */
-
-               /* See if we're at the beginning of a possible character
-                  class.  */
-
-               if (!escaped_char &&
-                   syntax & RE_CHAR_CLASSES && c == '[' && *p == ':')
-                 {
-                   /* Leave room for the null.  */
-                   unsigned char str[CHAR_CLASS_MAX_LENGTH + 1];
-                   const unsigned char *class_beg;
-
-                   PATFETCH (c);
-                   c1 = 0;
-                   class_beg = p;
-
-                   /* If pattern is `[[:'.  */
-                   if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
-
-                   for (;;)
-                     {
-                       PATFETCH (c);
-                       if ((c == ':' && *p == ']') || p == pend)
-                         break;
-                       if (c1 < CHAR_CLASS_MAX_LENGTH)
-                         str[c1++] = c;
-                       else
-                         /* This is in any case an invalid class name.  */
-                         str[0] = '\0';
-                     }
-                   str[c1] = '\0';
-
-                   /* If isn't a word bracketed by `[:' and `:]':
-                      undo the ending character, the letters, and
-                      leave the leading `:' and `[' (but set bits for
-                      them).  */
-                   if (c == ':' && *p == ']')
-                     {
-                       re_wchar_t ch;
-                       re_wctype_t cc;
-
-                       cc = re_wctype (str);
-
-                       if (cc == 0)
-                         FREE_STACK_RETURN (REG_ECTYPE);
-
-                        /* Throw away the ] at the end of the character
-                           class.  */
-                        PATFETCH (c);
-
-                        if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
-
-                       /* Most character classes in a multibyte match
-                          just set a flag.  Exceptions are is_blank,
-                          is_digit, is_cntrl, and is_xdigit, since
-                          they can only match ASCII characters.  We
-                          don't need to handle them for multibyte.
-                          They are distinguished by a negative wctype.  */
-
-                       if (multibyte)
-                         SET_RANGE_TABLE_WORK_AREA_BIT (range_table_work,
-                                                        re_wctype_to_bit (cc));
-
-                        for (ch = 0; ch < 1 << BYTEWIDTH; ++ch)
-                         {
-                           int translated = TRANSLATE (ch);
-                           if (re_iswctype (btowc (ch), cc))
-                             SET_LIST_BIT (translated);
-                         }
-
-                       /* Repeat the loop. */
-                       continue;
-                     }
-                   else
-                     {
-                       /* Go back to right after the "[:".  */
-                       p = class_beg;
-                       SET_LIST_BIT ('[');
-
-                       /* Because the `:' may starts the range, we
-                          can't simply set bit and repeat the loop.
-                          Instead, just set it to C and handle below.  */
-                       c = ':';
-                     }
-                 }
-
-               if (p < pend && p[0] == '-' && p[1] != ']')
-                 {
-
-                   /* Discard the `-'. */
-                   PATFETCH (c1);
-
-                   /* Fetch the character which ends the range. */
-                   PATFETCH (c1);
-
-                   if (SINGLE_BYTE_CHAR_P (c))
-                     {
-                       if (! SINGLE_BYTE_CHAR_P (c1))
-                         {
-                           /* Handle a range starting with a
-                              character of less than 256, and ending
-                              with a character of not less than 256.
-                              Split that into two ranges, the low one
-                              ending at 0377, and the high one
-                              starting at the smallest character in
-                              the charset of C1 and ending at C1.  */
-                           int charset = CHAR_CHARSET (c1);
-                           re_wchar_t c2 = MAKE_CHAR (charset, 0, 0);
-
-                           SET_RANGE_TABLE_WORK_AREA (range_table_work,
-                                                      c2, c1);
-                           c1 = 0377;
-                         }
-                     }
-                   else if (!SAME_CHARSET_P (c, c1))
-                     FREE_STACK_RETURN (REG_ERANGE);
-                 }
-               else
-                 /* Range from C to C. */
-                 c1 = c;
-
-               /* Set the range ... */
-               if (SINGLE_BYTE_CHAR_P (c))
-                 /* ... into bitmap.  */
-                 {
-                   re_wchar_t this_char;
-                   re_wchar_t range_start = c, range_end = c1;
-
-                   /* If the start is after the end, the range is empty.  */
-                   if (range_start > range_end)
-                     {
-                       if (syntax & RE_NO_EMPTY_RANGES)
-                         FREE_STACK_RETURN (REG_ERANGE);
-                       /* Else, repeat the loop.  */
-                     }
-                   else
-                     {
-                       for (this_char = range_start; this_char <= range_end;
-                            this_char++)
-                         SET_LIST_BIT (TRANSLATE (this_char));
-                     }
-                 }
-               else
-                 /* ... into range table.  */
-                 SET_RANGE_TABLE_WORK_AREA (range_table_work, c, c1);
-             }
-
-           /* Discard any (non)matching list bytes that are all 0 at the
-              end of the map.  Decrease the map-length byte too.  */
-           while ((int) b[-1] > 0 && b[b[-1] - 1] == 0)
-             b[-1]--;
-           b += b[-1];
-
-           /* Build real range table from work area.  */
-           if (RANGE_TABLE_WORK_USED (range_table_work)
-               || RANGE_TABLE_WORK_BITS (range_table_work))
-             {
-               int i;
-               int used = RANGE_TABLE_WORK_USED (range_table_work);
-
-               /* Allocate space for COUNT + RANGE_TABLE.  Needs two
-                  bytes for flags, two for COUNT, and three bytes for
-                  each character. */
-               GET_BUFFER_SPACE (4 + used * 3);
-
-               /* Indicate the existence of range table.  */
-               laststart[1] |= 0x80;
-
-               /* Store the character class flag bits into the range table.
-                  If not in emacs, these flag bits are always 0.  */
-               *b++ = RANGE_TABLE_WORK_BITS (range_table_work) & 0xff;
-               *b++ = RANGE_TABLE_WORK_BITS (range_table_work) >> 8;
-
-               STORE_NUMBER_AND_INCR (b, used / 2);
-               for (i = 0; i < used; i++)
-                 STORE_CHARACTER_AND_INCR
-                   (b, RANGE_TABLE_WORK_ELT (range_table_work, i));
-             }
-         }
-         break;
-
-
-       case '(':
-         if (syntax & RE_NO_BK_PARENS)
-           goto handle_open;
-         else
-           goto normal_char;
-
-
-       case ')':
-         if (syntax & RE_NO_BK_PARENS)
-           goto handle_close;
-         else
-           goto normal_char;
-
-
-       case '\n':
-         if (syntax & RE_NEWLINE_ALT)
-           goto handle_alt;
-         else
-           goto normal_char;
-
-
-       case '|':
-         if (syntax & RE_NO_BK_VBAR)
-           goto handle_alt;
-         else
-           goto normal_char;
-
-
-       case '{':
-          if (syntax & RE_INTERVALS && syntax & RE_NO_BK_BRACES)
-            goto handle_interval;
-          else
-            goto normal_char;
-
-
-       case '\\':
-         if (p == pend) FREE_STACK_RETURN (REG_EESCAPE);
-
-         /* Do not translate the character after the \, so that we can
-            distinguish, e.g., \B from \b, even if we normally would
-            translate, e.g., B to b.  */
-         PATFETCH (c);
-
-         switch (c)
-           {
-           case '(':
-             if (syntax & RE_NO_BK_PARENS)
-               goto normal_backslash;
-
-           handle_open:
-             {
-               int shy = 0;
-               if (p+1 < pend)
-                 {
-                   /* Look for a special (?...) construct */
-                   if ((syntax & RE_SHY_GROUPS) && *p == '?')
-                     {
-                       PATFETCH (c); /* Gobble up the '?'.  */
-                       PATFETCH (c);
-                       switch (c)
-                         {
-                         case ':': shy = 1; break;
-                         default:
-                           /* Only (?:...) is supported right now. */
-                           FREE_STACK_RETURN (REG_BADPAT);
-                         }
-                     }
-                 }
-
-               if (!shy)
-                 {
-                   bufp->re_nsub++;
-                   regnum++;
-                 }
-
-               if (COMPILE_STACK_FULL)
-                 {
-                   RETALLOC (compile_stack.stack, compile_stack.size << 1,
-                             compile_stack_elt_t);
-                   if (compile_stack.stack == NULL) return REG_ESPACE;
-
-                   compile_stack.size <<= 1;
-                 }
-
-               /* These are the values to restore when we hit end of this
-                  group.        They are all relative offsets, so that if the
-                  whole pattern moves because of realloc, they will still
-                  be valid.  */
-               COMPILE_STACK_TOP.begalt_offset = begalt - bufp->buffer;
-               COMPILE_STACK_TOP.fixup_alt_jump
-                 = fixup_alt_jump ? fixup_alt_jump - bufp->buffer + 1 : 0;
-               COMPILE_STACK_TOP.laststart_offset = b - bufp->buffer;
-               COMPILE_STACK_TOP.regnum = shy ? -regnum : regnum;
-
-               /* Do not push a
-                  start_memory for groups beyond the last one we can
-                  represent in the compiled pattern.  */
-               if (regnum <= MAX_REGNUM && !shy)
-                 BUF_PUSH_2 (start_memory, regnum);
-
-               compile_stack.avail++;
-
-               fixup_alt_jump = 0;
-               laststart = 0;
-               begalt = b;
-               /* If we've reached MAX_REGNUM groups, then this open
-                  won't actually generate any code, so we'll have to
-                  clear pending_exact explicitly.  */
-               pending_exact = 0;
-               break;
-             }
-
-           case ')':
-             if (syntax & RE_NO_BK_PARENS) goto normal_backslash;
-
-             if (COMPILE_STACK_EMPTY)
-               {
-                 if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD)
-                   goto normal_backslash;
-                 else
-                   FREE_STACK_RETURN (REG_ERPAREN);
-               }
-
-           handle_close:
-             FIXUP_ALT_JUMP ();
-
-             /* See similar code for backslashed left paren above.  */
-             if (COMPILE_STACK_EMPTY)
-               {
-                 if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD)
-                   goto normal_char;
-                 else
-                   FREE_STACK_RETURN (REG_ERPAREN);
-               }
-
-             /* Since we just checked for an empty stack above, this
-                ``can't happen''.  */
-             assert (compile_stack.avail != 0);
-             {
-               /* We don't just want to restore into `regnum', because
-                  later groups should continue to be numbered higher,
-                  as in `(ab)c(de)' -- the second group is #2.  */
-               regnum_t this_group_regnum;
-
-               compile_stack.avail--;
-               begalt = bufp->buffer + COMPILE_STACK_TOP.begalt_offset;
-               fixup_alt_jump
-                 = COMPILE_STACK_TOP.fixup_alt_jump
-                   ? bufp->buffer + COMPILE_STACK_TOP.fixup_alt_jump - 1
-                   : 0;
-               laststart = bufp->buffer + COMPILE_STACK_TOP.laststart_offset;
-               this_group_regnum = COMPILE_STACK_TOP.regnum;
-               /* If we've reached MAX_REGNUM groups, then this open
-                  won't actually generate any code, so we'll have to
-                  clear pending_exact explicitly.  */
-               pending_exact = 0;
-
-               /* We're at the end of the group, so now we know how many
-                  groups were inside this one.  */
-               if (this_group_regnum <= MAX_REGNUM && this_group_regnum > 0)
-                 BUF_PUSH_2 (stop_memory, this_group_regnum);
-             }
-             break;
-
-
-           case '|':                                   /* `\|'.  */
-             if (syntax & RE_LIMITED_OPS || syntax & RE_NO_BK_VBAR)
-               goto normal_backslash;
-           handle_alt:
-             if (syntax & RE_LIMITED_OPS)
-               goto normal_char;
-
-             /* Insert before the previous alternative a jump which
-                jumps to this alternative if the former fails.  */
-             GET_BUFFER_SPACE (3);
-             INSERT_JUMP (on_failure_jump, begalt, b + 6);
-             pending_exact = 0;
-             b += 3;
-
-             /* The alternative before this one has a jump after it
-                which gets executed if it gets matched.  Adjust that
-                jump so it will jump to this alternative's analogous
-                jump (put in below, which in turn will jump to the next
-                (if any) alternative's such jump, etc.).  The last such
-                jump jumps to the correct final destination.  A picture:
-                         _____ _____
-                         |   | |   |
-                         |   v |   v
-                        a | b   | c
-
-                If we are at `b', then fixup_alt_jump right now points to a
-                three-byte space after `a'.  We'll put in the jump, set
-                fixup_alt_jump to right after `b', and leave behind three
-                bytes which we'll fill in when we get to after `c'.  */
-
-             FIXUP_ALT_JUMP ();
-
-             /* Mark and leave space for a jump after this alternative,
-                to be filled in later either by next alternative or
-                when know we're at the end of a series of alternatives.  */
-             fixup_alt_jump = b;
-             GET_BUFFER_SPACE (3);
-             b += 3;
-
-             laststart = 0;
-             begalt = b;
-             break;
-
-
-           case '{':
-             /* If \{ is a literal.  */
-             if (!(syntax & RE_INTERVALS)
-                    /* If we're at `\{' and it's not the open-interval
-                       operator.  */
-                 || (syntax & RE_NO_BK_BRACES))
-               goto normal_backslash;
-
-           handle_interval:
-             {
-               /* If got here, then the syntax allows intervals.  */
-
-               /* At least (most) this many matches must be made.  */
-               int lower_bound = 0, upper_bound = -1;
-
-               beg_interval = p;
-
-               if (p == pend)
-                 FREE_STACK_RETURN (REG_EBRACE);
-
-               GET_UNSIGNED_NUMBER (lower_bound);
-
-               if (c == ',')
-                 GET_UNSIGNED_NUMBER (upper_bound);
-               else
-                 /* Interval such as `{1}' => match exactly once. */
-                 upper_bound = lower_bound;
-
-               if (lower_bound < 0 || upper_bound > RE_DUP_MAX
-                   || (upper_bound >= 0 && lower_bound > upper_bound))
-                 FREE_STACK_RETURN (REG_BADBR);
-
-               if (!(syntax & RE_NO_BK_BRACES))
-                 {
-                   if (c != '\\')
-                     FREE_STACK_RETURN (REG_BADBR);
-
-                   PATFETCH (c);
-                 }
-
-               if (c != '}')
-                 FREE_STACK_RETURN (REG_BADBR);
-
-               /* We just parsed a valid interval.  */
-
-               /* If it's invalid to have no preceding re.  */
-               if (!laststart)
-                 {
-                   if (syntax & RE_CONTEXT_INVALID_OPS)
-                     FREE_STACK_RETURN (REG_BADRPT);
-                   else if (syntax & RE_CONTEXT_INDEP_OPS)
-                     laststart = b;
-                   else
-                     goto unfetch_interval;
-                 }
-
-               if (upper_bound == 0)
-                 /* If the upper bound is zero, just drop the sub pattern
-                    altogether.  */
-                 b = laststart;
-               else if (lower_bound == 1 && upper_bound == 1)
-                 /* Just match it once: nothing to do here.  */
-                 ;
-
-               /* Otherwise, we have a nontrivial interval.  When
-                  we're all done, the pattern will look like:
-                  set_number_at <jump count> <upper bound>
-                  set_number_at <succeed_n count> <lower bound>
-                  succeed_n <after jump addr> <succeed_n count>
-                  <body of loop>
-                  jump_n <succeed_n addr> <jump count>
-                  (The upper bound and `jump_n' are omitted if
-                  `upper_bound' is 1, though.)  */
-               else
-                 { /* If the upper bound is > 1, we need to insert
-                      more at the end of the loop.  */
-                   unsigned int nbytes = (upper_bound < 0 ? 3
-                                          : upper_bound > 1 ? 5 : 0);
-                   unsigned int startoffset = 0;
-
-                   GET_BUFFER_SPACE (20); /* We might use less.  */
-
-                   if (lower_bound == 0)
-                     {
-                       /* A succeed_n that starts with 0 is really a
-                          a simple on_failure_jump_loop.  */
-                       INSERT_JUMP (on_failure_jump_loop, laststart,
-                                    b + 3 + nbytes);
-                       b += 3;
-                     }
-                   else
-                     {
-                       /* Initialize lower bound of the `succeed_n', even
-                          though it will be set during matching by its
-                          attendant `set_number_at' (inserted next),
-                          because `re_compile_fastmap' needs to know.
-                          Jump to the `jump_n' we might insert below.  */
-                       INSERT_JUMP2 (succeed_n, laststart,
-                                     b + 5 + nbytes,
-                                     lower_bound);
-                       b += 5;
-
-                       /* Code to initialize the lower bound.  Insert
-                          before the `succeed_n'.       The `5' is the last two
-                          bytes of this `set_number_at', plus 3 bytes of
-                          the following `succeed_n'.  */
-                       insert_op2 (set_number_at, laststart, 5, lower_bound, b);
-                       b += 5;
-                       startoffset += 5;
-                     }
-
-                   if (upper_bound < 0)
-                     {
-                       /* A negative upper bound stands for infinity,
-                          in which case it degenerates to a plain jump.  */
-                       STORE_JUMP (jump, b, laststart + startoffset);
-                       b += 3;
-                     }
-                   else if (upper_bound > 1)
-                     { /* More than one repetition is allowed, so
-                          append a backward jump to the `succeed_n'
-                          that starts this interval.
-
-                          When we've reached this during matching,
-                          we'll have matched the interval once, so
-                          jump back only `upper_bound - 1' times.  */
-                       STORE_JUMP2 (jump_n, b, laststart + startoffset,
-                                    upper_bound - 1);
-                       b += 5;
-
-                       /* The location we want to set is the second
-                          parameter of the `jump_n'; that is `b-2' as
-                          an absolute address.  `laststart' will be
-                          the `set_number_at' we're about to insert;
-                          `laststart+3' the number to set, the source
-                          for the relative address.  But we are
-                          inserting into the middle of the pattern --
-                          so everything is getting moved up by 5.
-                          Conclusion: (b - 2) - (laststart + 3) + 5,
-                          i.e., b - laststart.
-
-                          We insert this at the beginning of the loop
-                          so that if we fail during matching, we'll
-                          reinitialize the bounds.  */
-                       insert_op2 (set_number_at, laststart, b - laststart,
-                                   upper_bound - 1, b);
-                       b += 5;
-                     }
-                 }
-               pending_exact = 0;
-               beg_interval = NULL;
-             }
-             break;
-
-           unfetch_interval:
-             /* If an invalid interval, match the characters as literals.  */
-              assert (beg_interval);
-              p = beg_interval;
-              beg_interval = NULL;
-
-              /* normal_char and normal_backslash need `c'.  */
-              c = '{';
-
-              if (!(syntax & RE_NO_BK_BRACES))
-                {
-                  assert (p > pattern && p[-1] == '\\');
-                  goto normal_backslash;
-                }
-              else
-                goto normal_char;
-
-#ifdef emacs
-           /* There is no way to specify the before_dot and after_dot
-              operators.  rms says this is ok.  --karl  */
-           case '=':
-             BUF_PUSH (at_dot);
-             break;
-
-           case 's':
-             laststart = b;
-             PATFETCH (c);
-             BUF_PUSH_2 (syntaxspec, syntax_spec_code[c]);
-             break;
-
-           case 'S':
-             laststart = b;
-             PATFETCH (c);
-             BUF_PUSH_2 (notsyntaxspec, syntax_spec_code[c]);
-             break;
-
-           case 'c':
-             laststart = b;
-             PATFETCH (c);
-             BUF_PUSH_2 (categoryspec, c);
-             break;
-
-           case 'C':
-             laststart = b;
-             PATFETCH (c);
-             BUF_PUSH_2 (notcategoryspec, c);
-             break;
-#endif /* emacs */
-
-
-           case 'w':
-             if (syntax & RE_NO_GNU_OPS)
-               goto normal_char;
-             laststart = b;
-             BUF_PUSH_2 (syntaxspec, Sword);
-             break;
-
-
-           case 'W':
-             if (syntax & RE_NO_GNU_OPS)
-               goto normal_char;
-             laststart = b;
-             BUF_PUSH_2 (notsyntaxspec, Sword);
-             break;
-
-
-           case '<':
-             if (syntax & RE_NO_GNU_OPS)
-               goto normal_char;
-             BUF_PUSH (wordbeg);
-             break;
-
-           case '>':
-             if (syntax & RE_NO_GNU_OPS)
-               goto normal_char;
-             BUF_PUSH (wordend);
-             break;
-
-           case 'b':
-             if (syntax & RE_NO_GNU_OPS)
-               goto normal_char;
-             BUF_PUSH (wordbound);
-             break;
-
-           case 'B':
-             if (syntax & RE_NO_GNU_OPS)
-               goto normal_char;
-             BUF_PUSH (notwordbound);
-             break;
-
-           case '`':
-             if (syntax & RE_NO_GNU_OPS)
-               goto normal_char;
-             BUF_PUSH (begbuf);
-             break;
-
-           case '\'':
-             if (syntax & RE_NO_GNU_OPS)
-               goto normal_char;
-             BUF_PUSH (endbuf);
-             break;
-
-           case '1': case '2': case '3': case '4': case '5':
-           case '6': case '7': case '8': case '9':
-             {
-               regnum_t reg;
-
-               if (syntax & RE_NO_BK_REFS)
-                 goto normal_backslash;
-
-               reg = c - '0';
-
-               /* Can't back reference to a subexpression before its end.  */
-               if (reg > regnum || group_in_compile_stack (compile_stack, reg))
-                 FREE_STACK_RETURN (REG_ESUBREG);
-
-               laststart = b;
-               BUF_PUSH_2 (duplicate, reg);
-             }
-             break;
-
-
-           case '+':
-           case '?':
-             if (syntax & RE_BK_PLUS_QM)
-               goto handle_plus;
-             else
-               goto normal_backslash;
-
-           default:
-           normal_backslash:
-             /* You might think it would be useful for \ to mean
-                not to translate; but if we don't translate it
-                it will never match anything.  */
-             goto normal_char;
-           }
-         break;
-
-
-       default:
-       /* Expects the character in `c'.  */
-       normal_char:
-         /* If no exactn currently being built.  */
-         if (!pending_exact
-
-             /* If last exactn not at current position.  */
-             || pending_exact + *pending_exact + 1 != b
-
-             /* We have only one byte following the exactn for the count.  */
-             || *pending_exact >= (1 << BYTEWIDTH) - MAX_MULTIBYTE_LENGTH
-
-             /* If followed by a repetition operator.  */
-             || (p != pend && (*p == '*' || *p == '^'))
-             || ((syntax & RE_BK_PLUS_QM)
-                 ? p + 1 < pend && *p == '\\' && (p[1] == '+' || p[1] == '?')
-                 : p != pend && (*p == '+' || *p == '?'))
-             || ((syntax & RE_INTERVALS)
-                 && ((syntax & RE_NO_BK_BRACES)
-                     ? p != pend && *p == '{'
-                     : p + 1 < pend && p[0] == '\\' && p[1] == '{')))
-           {
-             /* Start building a new exactn.  */
-
-             laststart = b;
-
-             BUF_PUSH_2 (exactn, 0);
-             pending_exact = b - 1;
-           }
-
-         GET_BUFFER_SPACE (MAX_MULTIBYTE_LENGTH);
-         {
-           int len;
-
-           c = TRANSLATE (c);
-           if (multibyte)
-             len = CHAR_STRING (c, b);
-           else
-             *b = c, len = 1;
-           b += len;
-           (*pending_exact) += len;
-         }
-
-         break;
-       } /* switch (c) */
-    } /* while p != pend */
-
-
-  /* Through the pattern now.  */
-
-  FIXUP_ALT_JUMP ();
-
-  if (!COMPILE_STACK_EMPTY)
-    FREE_STACK_RETURN (REG_EPAREN);
-
-  /* If we don't want backtracking, force success
-     the first time we reach the end of the compiled pattern.  */
-  if (syntax & RE_NO_POSIX_BACKTRACKING)
-    BUF_PUSH (succeed);
-
-  /* We have succeeded; set the length of the buffer.  */
-  bufp->used = b - bufp->buffer;
-
-#ifdef DEBUG
-  if (debug > 0)
-    {
-      re_compile_fastmap (bufp);
-      DEBUG_PRINT1 ("\nCompiled pattern: \n");
-      print_compiled_pattern (bufp);
-    }
-  debug--;
-#endif /* DEBUG */
-
-#ifndef MATCH_MAY_ALLOCATE
-  /* Initialize the failure stack to the largest possible stack.  This
-     isn't necessary unless we're trying to avoid calling alloca in
-     the search and match routines.  */
-  {
-    int num_regs = bufp->re_nsub + 1;
-
-    if (fail_stack.size < re_max_failures * TYPICAL_FAILURE_SIZE)
-      {
-       fail_stack.size = re_max_failures * TYPICAL_FAILURE_SIZE;
-
-       if (! fail_stack.stack)
-         fail_stack.stack
-           = (fail_stack_elt_t *) malloc (fail_stack.size
-                                          * sizeof (fail_stack_elt_t));
-       else
-         fail_stack.stack
-           = (fail_stack_elt_t *) realloc (fail_stack.stack,
-                                           (fail_stack.size
-                                            * sizeof (fail_stack_elt_t)));
-      }
-
-    regex_grow_registers (num_regs);
-  }
-#endif /* not MATCH_MAY_ALLOCATE */
-
-  FREE_STACK_RETURN (REG_NOERROR);
-} /* regex_compile */
-\f
-/* Subroutines for `regex_compile'.  */
-
-/* Store OP at LOC followed by two-byte integer parameter ARG. */
-
-static void
-store_op1 (op, loc, arg)
-    re_opcode_t op;
-    unsigned char *loc;
-    int arg;
-{
-  *loc = (unsigned char) op;
-  STORE_NUMBER (loc + 1, arg);
-}
-
-
-/* Like `store_op1', but for two two-byte parameters ARG1 and ARG2.  */
-
-static void
-store_op2 (op, loc, arg1, arg2)
-    re_opcode_t op;
-    unsigned char *loc;
-    int arg1, arg2;
-{
-  *loc = (unsigned char) op;
-  STORE_NUMBER (loc + 1, arg1);
-  STORE_NUMBER (loc + 3, arg2);
-}
-
-
-/* Copy the bytes from LOC to END to open up three bytes of space at LOC
-   for OP followed by two-byte integer parameter ARG.  */
-
-static void
-insert_op1 (op, loc, arg, end)
-    re_opcode_t op;
-    unsigned char *loc;
-    int arg;
-    unsigned char *end;
-{
-  register unsigned char *pfrom = end;
-  register unsigned char *pto = end + 3;
-
-  while (pfrom != loc)
-    *--pto = *--pfrom;
-
-  store_op1 (op, loc, arg);
-}
-
-
-/* Like `insert_op1', but for two two-byte parameters ARG1 and ARG2.  */
-
-static void
-insert_op2 (op, loc, arg1, arg2, end)
-    re_opcode_t op;
-    unsigned char *loc;
-    int arg1, arg2;
-    unsigned char *end;
-{
-  register unsigned char *pfrom = end;
-  register unsigned char *pto = end + 5;
-
-  while (pfrom != loc)
-    *--pto = *--pfrom;
-
-  store_op2 (op, loc, arg1, arg2);
-}
-
-
-/* P points to just after a ^ in PATTERN.  Return true if that ^ comes
-   after an alternative or a begin-subexpression.  We assume there is at
-   least one character before the ^.  */
-
-static boolean
-at_begline_loc_p (pattern, p, syntax)
-    re_char *pattern, *p;
-    reg_syntax_t syntax;
-{
-  re_char *prev = p - 2;
-  boolean prev_prev_backslash = prev > pattern && prev[-1] == '\\';
-
-  return
-       /* After a subexpression?  */
-       (*prev == '(' && (syntax & RE_NO_BK_PARENS || prev_prev_backslash))
-       /* After an alternative?         */
-    || (*prev == '|' && (syntax & RE_NO_BK_VBAR || prev_prev_backslash))
-       /* After a shy subexpression?  */
-    || ((syntax & RE_SHY_GROUPS) && prev - 2 >= pattern
-       && prev[-1] == '?' && prev[-2] == '('
-       && (syntax & RE_NO_BK_PARENS
-           || (prev - 3 >= pattern && prev[-3] == '\\')));
-}
-
-
-/* The dual of at_begline_loc_p.  This one is for $.  We assume there is
-   at least one character after the $, i.e., `P < PEND'.  */
-
-static boolean
-at_endline_loc_p (p, pend, syntax)
-    re_char *p, *pend;
-    reg_syntax_t syntax;
-{
-  re_char *next = p;
-  boolean next_backslash = *next == '\\';
-  re_char *next_next = p + 1 < pend ? p + 1 : 0;
-
-  return
-       /* Before a subexpression?  */
-       (syntax & RE_NO_BK_PARENS ? *next == ')'
-       : next_backslash && next_next && *next_next == ')')
-       /* Before an alternative?  */
-    || (syntax & RE_NO_BK_VBAR ? *next == '|'
-       : next_backslash && next_next && *next_next == '|');
-}
-
-
-/* Returns true if REGNUM is in one of COMPILE_STACK's elements and
-   false if it's not.  */
-
-static boolean
-group_in_compile_stack (compile_stack, regnum)
-    compile_stack_type compile_stack;
-    regnum_t regnum;
-{
-  int this_element;
-
-  for (this_element = compile_stack.avail - 1;
-       this_element >= 0;
-       this_element--)
-    if (compile_stack.stack[this_element].regnum == regnum)
-      return true;
-
-  return false;
-}
-\f
-/* analyse_first.
-   If fastmap is non-NULL, go through the pattern and fill fastmap
-   with all the possible leading chars.  If fastmap is NULL, don't
-   bother filling it up (obviously) and only return whether the
-   pattern could potentially match the empty string.
-
-   Return 1  if p..pend might match the empty string.
-   Return 0  if p..pend matches at least one char.
-   Return -1 if fastmap was not updated accurately.  */
-
-static int
-analyse_first (p, pend, fastmap, multibyte)
-     re_char *p, *pend;
-     char *fastmap;
-     const int multibyte;
-{
-  int j, k;
-  boolean not;
-
-  /* If all elements for base leading-codes in fastmap is set, this
-     flag is set true. */
-  boolean match_any_multibyte_characters = false;
-
-  assert (p);
-
-  /* The loop below works as follows:
-     - It has a working-list kept in the PATTERN_STACK and which basically
-       starts by only containing a pointer to the first operation.
-     - If the opcode we're looking at is a match against some set of
-       chars, then we add those chars to the fastmap and go on to the
-       next work element from the worklist (done via `break').
-     - If the opcode is a control operator on the other hand, we either
-       ignore it (if it's meaningless at this point, such as `start_memory')
-       or execute it (if it's a jump).  If the jump has several destinations
-       (i.e. `on_failure_jump'), then we push the other destination onto the
-       worklist.
-     We guarantee termination by ignoring backward jumps (more or less),
-     so that `p' is monotonically increasing.  More to the point, we
-     never set `p' (or push) anything `<= p1'.  */
-
-  while (p < pend)
-    {
-      /* `p1' is used as a marker of how far back a `on_failure_jump'
-        can go without being ignored.  It is normally equal to `p'
-        (which prevents any backward `on_failure_jump') except right
-        after a plain `jump', to allow patterns such as:
-           0: jump 10
-           3..9: <body>
-           10: on_failure_jump 3
-        as used for the *? operator.  */
-      re_char *p1 = p;
-
-      switch (SWITCH_ENUM_CAST ((re_opcode_t) *p++))
-       {
-       case succeed:
-         return 1;
-         continue;
-
-       case duplicate:
-         /* If the first character has to match a backreference, that means
-            that the group was empty (since it already matched).  Since this
-            is the only case that interests us here, we can assume that the
-            backreference must match the empty string.  */
-         p++;
-         continue;
-
-
-      /* Following are the cases which match a character.  These end
-        with `break'.  */
-
-       case exactn:
-         if (fastmap)
-           {
-             int c = RE_STRING_CHAR (p + 1, pend - p);
-
-             if (SINGLE_BYTE_CHAR_P (c))
-               fastmap[c] = 1;
-             else
-               fastmap[p[1]] = 1;
-           }
-         break;
-
-
-       case anychar:
-         /* We could put all the chars except for \n (and maybe \0)
-            but we don't bother since it is generally not worth it.  */
-         if (!fastmap) break;
-         return -1;
-
-
-       case charset_not:
-         /* Chars beyond end of bitmap are possible matches.
-            All the single-byte codes can occur in multibyte buffers.
-            So any that are not listed in the charset
-            are possible matches, even in multibyte buffers.  */
-         if (!fastmap) break;
-         for (j = CHARSET_BITMAP_SIZE (&p[-1]) * BYTEWIDTH;
-              j < (1 << BYTEWIDTH); j++)
-           fastmap[j] = 1;
-         /* Fallthrough */
-       case charset:
-         if (!fastmap) break;
-         not = (re_opcode_t) *(p - 1) == charset_not;
-         for (j = CHARSET_BITMAP_SIZE (&p[-1]) * BYTEWIDTH - 1, p++;
-              j >= 0; j--)
-           if (!!(p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH))) ^ not)
-             fastmap[j] = 1;
-
-         if ((not && multibyte)
-             /* Any character set can possibly contain a character
-                which doesn't match the specified set of characters.  */
-             || (CHARSET_RANGE_TABLE_EXISTS_P (&p[-2])
-                 && CHARSET_RANGE_TABLE_BITS (&p[-2]) != 0))
-           /* If we can match a character class, we can match
-              any character set.  */
-           {
-           set_fastmap_for_multibyte_characters:
-             if (match_any_multibyte_characters == false)
-               {
-                 for (j = 0x80; j < 0xA0; j++) /* XXX */
-                   if (BASE_LEADING_CODE_P (j))
-                     fastmap[j] = 1;
-                 match_any_multibyte_characters = true;
-               }
-           }
-
-         else if (!not && CHARSET_RANGE_TABLE_EXISTS_P (&p[-2])
-                  && match_any_multibyte_characters == false)
-           {
-             /* Set fastmap[I] 1 where I is a base leading code of each
-                multibyte character in the range table. */
-             int c, count;
-
-             /* Make P points the range table.  `+ 2' is to skip flag
-                bits for a character class.  */
-             p += CHARSET_BITMAP_SIZE (&p[-2]) + 2;
-
-             /* Extract the number of ranges in range table into COUNT.  */
-             EXTRACT_NUMBER_AND_INCR (count, p);
-             for (; count > 0; count--, p += 2 * 3) /* XXX */
-               {
-                 /* Extract the start of each range.  */
-                 EXTRACT_CHARACTER (c, p);
-                 j = CHAR_CHARSET (c);
-                 fastmap[CHARSET_LEADING_CODE_BASE (j)] = 1;
-               }
-           }
-         break;
-
-       case syntaxspec:
-       case notsyntaxspec:
-         if (!fastmap) break;
-#ifndef emacs
-         not = (re_opcode_t)p[-1] == notsyntaxspec;
-         k = *p++;
-         for (j = 0; j < (1 << BYTEWIDTH); j++)
-           if ((SYNTAX (j) == (enum syntaxcode) k) ^ not)
-             fastmap[j] = 1;
-         break;
-#else  /* emacs */
-         /* This match depends on text properties.  These end with
-            aborting optimizations.  */
-         return -1;
-
-       case categoryspec:
-       case notcategoryspec:
-         if (!fastmap) break;
-         not = (re_opcode_t)p[-1] == notcategoryspec;
-         k = *p++;
-         for (j = 0; j < (1 << BYTEWIDTH); j++)
-           if ((CHAR_HAS_CATEGORY (j, k)) ^ not)
-             fastmap[j] = 1;
-
-         if (multibyte)
-           /* Any character set can possibly contain a character
-              whose category is K (or not).  */
-           goto set_fastmap_for_multibyte_characters;
-         break;
-
-      /* All cases after this match the empty string.  These end with
-        `continue'.  */
-
-       case before_dot:
-       case at_dot:
-       case after_dot:
-#endif /* !emacs */
-       case no_op:
-       case begline:
-       case endline:
-       case begbuf:
-       case endbuf:
-       case wordbound:
-       case notwordbound:
-       case wordbeg:
-       case wordend:
-         continue;
-
-
-       case jump:
-         EXTRACT_NUMBER_AND_INCR (j, p);
-         if (j < 0)
-           /* Backward jumps can only go back to code that we've already
-              visited.  `re_compile' should make sure this is true.  */
-           break;
-         p += j;
-         switch (SWITCH_ENUM_CAST ((re_opcode_t) *p))
-           {
-           case on_failure_jump:
-           case on_failure_keep_string_jump:
-           case on_failure_jump_loop:
-           case on_failure_jump_nastyloop:
-           case on_failure_jump_smart:
-             p++;
-             break;
-           default:
-             continue;
-           };
-         /* Keep `p1' to allow the `on_failure_jump' we are jumping to
-            to jump back to "just after here".  */
-         /* Fallthrough */
-
-       case on_failure_jump:
-       case on_failure_keep_string_jump:
-       case on_failure_jump_nastyloop:
-       case on_failure_jump_loop:
-       case on_failure_jump_smart:
-         EXTRACT_NUMBER_AND_INCR (j, p);
-         if (p + j <= p1)
-           ; /* Backward jump to be ignored.  */
-         else
-           { /* We have to look down both arms.
-                We first go down the "straight" path so as to minimize
-                stack usage when going through alternatives.  */
-             int r = analyse_first (p, pend, fastmap, multibyte);
-             if (r) return r;
-             p += j;
-           }
-         continue;
-
-
-       case jump_n:
-         /* This code simply does not properly handle forward jump_n.  */
-         DEBUG_STATEMENT (EXTRACT_NUMBER (j, p); assert (j < 0));
-         p += 4;
-         /* jump_n can either jump or fall through.  The (backward) jump
-            case has already been handled, so we only need to look at the
-            fallthrough case.  */
-         continue;
-
-       case succeed_n:
-         /* If N == 0, it should be an on_failure_jump_loop instead.  */
-         DEBUG_STATEMENT (EXTRACT_NUMBER (j, p + 2); assert (j > 0));
-         p += 4;
-         /* We only care about one iteration of the loop, so we don't
-            need to consider the case where this behaves like an
-            on_failure_jump.  */
-         continue;
-
-
-       case set_number_at:
-         p += 4;
-         continue;
-
-
-       case start_memory:
-       case stop_memory:
-         p += 1;
-         continue;
-
-
-       default:
-         abort (); /* We have listed all the cases.  */
-       } /* switch *p++ */
-
-      /* Getting here means we have found the possible starting
-        characters for one path of the pattern -- and that the empty
-        string does not match.  We need not follow this path further.  */
-      return 0;
-    } /* while p */
-
-  /* We reached the end without matching anything.  */
-  return 1;
-
-} /* analyse_first */
-\f
-/* re_compile_fastmap computes a ``fastmap'' for the compiled pattern in
-   BUFP.  A fastmap records which of the (1 << BYTEWIDTH) possible
-   characters can start a string that matches the pattern.  This fastmap
-   is used by re_search to skip quickly over impossible starting points.
-
-   Character codes above (1 << BYTEWIDTH) are not represented in the
-   fastmap, but the leading codes are represented.  Thus, the fastmap
-   indicates which character sets could start a match.
-
-   The caller must supply the address of a (1 << BYTEWIDTH)-byte data
-   area as BUFP->fastmap.
-
-   We set the `fastmap', `fastmap_accurate', and `can_be_null' fields in
-   the pattern buffer.
-
-   Returns 0 if we succeed, -2 if an internal error.   */
-
-int
-re_compile_fastmap (bufp)
-     struct re_pattern_buffer *bufp;
-{
-  char *fastmap = bufp->fastmap;
-  int analysis;
-
-  assert (fastmap && bufp->buffer);
-
-  bzero (fastmap, 1 << BYTEWIDTH);  /* Assume nothing's valid. */
-  bufp->fastmap_accurate = 1;      /* It will be when we're done.  */
-
-  analysis = analyse_first (bufp->buffer, bufp->buffer + bufp->used,
-                           fastmap, RE_MULTIBYTE_P (bufp));
-  bufp->can_be_null = (analysis != 0);
-  return 0;
-} /* re_compile_fastmap */
-\f
-/* Set REGS to hold NUM_REGS registers, storing them in STARTS and
-   ENDS.  Subsequent matches using PATTERN_BUFFER and REGS will use
-   this memory for recording register information.  STARTS and ENDS
-   must be allocated using the malloc library routine, and must each
-   be at least NUM_REGS * sizeof (regoff_t) bytes long.
-
-   If NUM_REGS == 0, then subsequent matches should allocate their own
-   register data.
-
-   Unless this function is called, the first search or match using
-   PATTERN_BUFFER will allocate its own register data, without
-   freeing the old data.  */
-
-void
-re_set_registers (bufp, regs, num_regs, starts, ends)
-    struct re_pattern_buffer *bufp;
-    struct re_registers *regs;
-    unsigned num_regs;
-    regoff_t *starts, *ends;
-{
-  if (num_regs)
-    {
-      bufp->regs_allocated = REGS_REALLOCATE;
-      regs->num_regs = num_regs;
-      regs->start = starts;
-      regs->end = ends;
-    }
-  else
-    {
-      bufp->regs_allocated = REGS_UNALLOCATED;
-      regs->num_regs = 0;
-      regs->start = regs->end = (regoff_t *) 0;
-    }
-}
-WEAK_ALIAS (__re_set_registers, re_set_registers)
-\f
-/* Searching routines. */
-
-/* Like re_search_2, below, but only one string is specified, and
-   doesn't let you say where to stop matching. */
-
-int
-re_search (bufp, string, size, startpos, range, regs)
-     struct re_pattern_buffer *bufp;
-     const char *string;
-     int size, startpos, range;
-     struct re_registers *regs;
-{
-  return re_search_2 (bufp, NULL, 0, string, size, startpos, range,
-                     regs, size);
-}
-WEAK_ALIAS (__re_search, re_search)
-
-/* Head address of virtual concatenation of string.  */
-#define HEAD_ADDR_VSTRING(P)           \
-  (((P) >= size1 ? string2 : string1))
-
-/* End address of virtual concatenation of string.  */
-#define STOP_ADDR_VSTRING(P)                           \
-  (((P) >= size1 ? string2 + size2 : string1 + size1))
-
-/* Address of POS in the concatenation of virtual string. */
-#define POS_ADDR_VSTRING(POS)                                  \
-  (((POS) >= size1 ? string2 - size1 : string1) + (POS))
-
-/* Using the compiled pattern in BUFP->buffer, first tries to match the
-   virtual concatenation of STRING1 and STRING2, starting first at index
-   STARTPOS, then at STARTPOS + 1, and so on.
-
-   STRING1 and STRING2 have length SIZE1 and SIZE2, respectively.
-
-   RANGE is how far to scan while trying to match.  RANGE = 0 means try
-   only at STARTPOS; in general, the last start tried is STARTPOS +
-   RANGE.
-
-   In REGS, return the indices of the virtual concatenation of STRING1
-   and STRING2 that matched the entire BUFP->buffer and its contained
-   subexpressions.
-
-   Do not consider matching one past the index STOP in the virtual
-   concatenation of STRING1 and STRING2.
-
-   We return either the position in the strings at which the match was
-   found, -1 if no match, or -2 if error (such as failure
-   stack overflow).  */
-
-int
-re_search_2 (bufp, str1, size1, str2, size2, startpos, range, regs, stop)
-     struct re_pattern_buffer *bufp;
-     const char *str1, *str2;
-     int size1, size2;
-     int startpos;
-     int range;
-     struct re_registers *regs;
-     int stop;
-{
-  int val;
-  re_char *string1 = (re_char*) str1;
-  re_char *string2 = (re_char*) str2;
-  register char *fastmap = bufp->fastmap;
-  register RE_TRANSLATE_TYPE translate = bufp->translate;
-  int total_size = size1 + size2;
-  int endpos = startpos + range;
-  boolean anchored_start;
-
-  /* Nonzero if we have to concern multibyte character.         */
-  const boolean multibyte = RE_MULTIBYTE_P (bufp);
-
-  /* Check for out-of-range STARTPOS.  */
-  if (startpos < 0 || startpos > total_size)
-    return -1;
-
-  /* Fix up RANGE if it might eventually take us outside
-     the virtual concatenation of STRING1 and STRING2.
-     Make sure we won't move STARTPOS below 0 or above TOTAL_SIZE.  */
-  if (endpos < 0)
-    range = 0 - startpos;
-  else if (endpos > total_size)
-    range = total_size - startpos;
-
-  /* If the search isn't to be a backwards one, don't waste time in a
-     search for a pattern anchored at beginning of buffer.  */
-  if (bufp->used > 0 && (re_opcode_t) bufp->buffer[0] == begbuf && range > 0)
-    {
-      if (startpos > 0)
-       return -1;
-      else
-       range = 0;
-    }
-
-#ifdef emacs
-  /* In a forward search for something that starts with \=.
-     don't keep searching past point.  */
-  if (bufp->used > 0 && (re_opcode_t) bufp->buffer[0] == at_dot && range > 0)
-    {
-      range = PT_BYTE - BEGV_BYTE - startpos;
-      if (range < 0)
-       return -1;
-    }
-#endif /* emacs */
-
-  /* Update the fastmap now if not correct already.  */
-  if (fastmap && !bufp->fastmap_accurate)
-    re_compile_fastmap (bufp);
-
-  /* See whether the pattern is anchored.  */
-  anchored_start = (bufp->buffer[0] == begline);
-
-#ifdef emacs
-  gl_state.object = re_match_object;
-  {
-    int charpos = SYNTAX_TABLE_BYTE_TO_CHAR (POS_AS_IN_BUFFER (startpos));
-
-    SETUP_SYNTAX_TABLE_FOR_OBJECT (re_match_object, charpos, 1);
-  }
-#endif
-
-  /* Loop through the string, looking for a place to start matching.  */
-  for (;;)
-    {
-      /* If the pattern is anchored,
-        skip quickly past places we cannot match.
-        We don't bother to treat startpos == 0 specially
-        because that case doesn't repeat.  */
-      if (anchored_start && startpos > 0)
-       {
-         if (! ((startpos <= size1 ? string1[startpos - 1]
-                 : string2[startpos - size1 - 1])
-                == '\n'))
-           goto advance;
-       }
-
-      /* If a fastmap is supplied, skip quickly over characters that
-        cannot be the start of a match.  If the pattern can match the
-        null string, however, we don't need to skip characters; we want
-        the first null string.  */
-      if (fastmap && startpos < total_size && !bufp->can_be_null)
-       {
-         register re_char *d;
-         register re_wchar_t buf_ch;
-
-         d = POS_ADDR_VSTRING (startpos);
-
-         if (range > 0)        /* Searching forwards.  */
-           {
-             register int lim = 0;
-             int irange = range;
-
-             if (startpos < size1 && startpos + range >= size1)
-               lim = range - (size1 - startpos);
-
-             /* Written out as an if-else to avoid testing `translate'
-                inside the loop.  */
-             if (RE_TRANSLATE_P (translate))
-               {
-                 if (multibyte)
-                   while (range > lim)
-                     {
-                       int buf_charlen;
-
-                       buf_ch = STRING_CHAR_AND_LENGTH (d, range - lim,
-                                                        buf_charlen);
-
-                       buf_ch = RE_TRANSLATE (translate, buf_ch);
-                       if (buf_ch >= 0400
-                           || fastmap[buf_ch])
-                         break;
-
-                       range -= buf_charlen;
-                       d += buf_charlen;
-                     }
-                 else
-                   while (range > lim
-                          && !fastmap[RE_TRANSLATE (translate, *d)])
-                     {
-                       d++;
-                       range--;
-                     }
-               }
-             else
-               while (range > lim && !fastmap[*d])
-                 {
-                   d++;
-                   range--;
-                 }
-
-             startpos += irange - range;
-           }
-         else                          /* Searching backwards.  */
-           {
-             int room = (startpos >= size1
-                         ? size2 + size1 - startpos
-                         : size1 - startpos);
-             buf_ch = RE_STRING_CHAR (d, room);
-             buf_ch = TRANSLATE (buf_ch);
-
-             if (! (buf_ch >= 0400
-                    || fastmap[buf_ch]))
-               goto advance;
-           }
-       }
-
-      /* If can't match the null string, and that's all we have left, fail.  */
-      if (range >= 0 && startpos == total_size && fastmap
-         && !bufp->can_be_null)
-       return -1;
-
-      val = re_match_2_internal (bufp, string1, size1, string2, size2,
-                                startpos, regs, stop);
-#ifndef REGEX_MALLOC
-# ifdef C_ALLOCA
-      alloca (0);
-# endif
-#endif
-
-      if (val >= 0)
-       return startpos;
-
-      if (val == -2)
-       return -2;
-
-    advance:
-      if (!range)
-       break;
-      else if (range > 0)
-       {
-         /* Update STARTPOS to the next character boundary.  */
-         if (multibyte)
-           {
-             re_char *p = POS_ADDR_VSTRING (startpos);
-             re_char *pend = STOP_ADDR_VSTRING (startpos);
-             int len = MULTIBYTE_FORM_LENGTH (p, pend - p);
-
-             range -= len;
-             if (range < 0)
-               break;
-             startpos += len;
-           }
-         else
-           {
-             range--;
-             startpos++;
-           }
-       }
-      else
-       {
-         range++;
-         startpos--;
-
-         /* Update STARTPOS to the previous character boundary.  */
-         if (multibyte)
-           {
-             re_char *p = POS_ADDR_VSTRING (startpos) + 1;
-             re_char *p0 = p;
-             re_char *phead = HEAD_ADDR_VSTRING (startpos);
-
-             /* Find the head of multibyte form.  */
-             PREV_CHAR_BOUNDARY (p, phead);
-             range += p0 - 1 - p;
-             if (range > 0)
-               break;
-
-             startpos -= p0 - 1 - p;
-           }
-       }
-    }
-  return -1;
-} /* re_search_2 */
-WEAK_ALIAS (__re_search_2, re_search_2)
-\f
-/* Declarations and macros for re_match_2.  */
-
-static int bcmp_translate _RE_ARGS((re_char *s1, re_char *s2,
-                                   register int len,
-                                   RE_TRANSLATE_TYPE translate,
-                                   const int multibyte));
-
-/* This converts PTR, a pointer into one of the search strings `string1'
-   and `string2' into an offset from the beginning of that string.  */
-#define POINTER_TO_OFFSET(ptr)                 \
-  (FIRST_STRING_P (ptr)                                \
-   ? ((regoff_t) ((ptr) - string1))            \
-   : ((regoff_t) ((ptr) - string2 + size1)))
-
-/* Call before fetching a character with *d.  This switches over to
-   string2 if necessary.
-   Check re_match_2_internal for a discussion of why end_match_2 might
-   not be within string2 (but be equal to end_match_1 instead).  */
-#define PREFETCH()                                                     \
-  while (d == dend)                                                    \
-    {                                                                  \
-      /* End of string2 => fail.  */                                   \
-      if (dend == end_match_2)                                         \
-       goto fail;                                                      \
-      /* End of string1 => advance to string2.  */                     \
-      d = string2;                                                     \
-      dend = end_match_2;                                              \
-    }
-
-/* Call before fetching a char with *d if you already checked other limits.
-   This is meant for use in lookahead operations like wordend, etc..
-   where we might need to look at parts of the string that might be
-   outside of the LIMITs (i.e past `stop').  */
-#define PREFETCH_NOLIMIT()                                             \
-  if (d == end1)                                                       \
-     {                                                                 \
-       d = string2;                                                    \
-       dend = end_match_2;                                             \
-     }                                                                 \
-
-/* Test if at very beginning or at very end of the virtual concatenation
-   of `string1' and `string2'. If only one string, it's `string2'.  */
-#define AT_STRINGS_BEG(d) ((d) == (size1 ? string1 : string2) || !size2)
-#define AT_STRINGS_END(d) ((d) == end2)
-
-
-/* Test if D points to a character which is word-constituent.  We have
-   two special cases to check for: if past the end of string1, look at
-   the first character in string2; and if before the beginning of
-   string2, look at the last character in string1.  */
-#define WORDCHAR_P(d)                                                  \
-  (SYNTAX ((d) == end1 ? *string2                                      \
-          : (d) == string2 - 1 ? *(end1 - 1) : *(d))                   \
-   == Sword)
-
-/* Disabled due to a compiler bug -- see comment at case wordbound */
-
-/* The comment at case wordbound is following one, but we don't use
-   AT_WORD_BOUNDARY anymore to support multibyte form.
-
-   The DEC Alpha C compiler 3.x generates incorrect code for the
-   test         WORDCHAR_P (d - 1) != WORDCHAR_P (d)  in the expansion of
-   AT_WORD_BOUNDARY, so this code is disabled. Expanding the
-   macro and introducing temporary variables works around the bug.  */
-
-#if 0
-/* Test if the character before D and the one at D differ with respect
-   to being word-constituent.  */
-#define AT_WORD_BOUNDARY(d)                                            \
-  (AT_STRINGS_BEG (d) || AT_STRINGS_END (d)                            \
-   || WORDCHAR_P (d - 1) != WORDCHAR_P (d))
-#endif
-
-/* Free everything we malloc.  */
-#ifdef MATCH_MAY_ALLOCATE
-# define FREE_VAR(var) if (var) { REGEX_FREE (var); var = NULL; } else
-# define FREE_VARIABLES()                                              \
-  do {                                                                 \
-    REGEX_FREE_STACK (fail_stack.stack);                               \
-    FREE_VAR (regstart);                                               \
-    FREE_VAR (regend);                                                 \
-    FREE_VAR (best_regstart);                                          \
-    FREE_VAR (best_regend);                                            \
-  } while (0)
-#else
-# define FREE_VARIABLES() ((void)0) /* Do nothing!  But inhibit gcc warning.  */
-#endif /* not MATCH_MAY_ALLOCATE */
-
-\f
-/* Optimization routines.  */
-
-/* If the operation is a match against one or more chars,
-   return a pointer to the next operation, else return NULL.  */
-static re_char *
-skip_one_char (p)
-     re_char *p;
-{
-  switch (SWITCH_ENUM_CAST (*p++))
-    {
-    case anychar:
-      break;
-
-    case exactn:
-      p += *p + 1;
-      break;
-
-    case charset_not:
-    case charset:
-      if (CHARSET_RANGE_TABLE_EXISTS_P (p - 1))
-       {
-         int mcnt;
-         p = CHARSET_RANGE_TABLE (p - 1);
-         EXTRACT_NUMBER_AND_INCR (mcnt, p);
-         p = CHARSET_RANGE_TABLE_END (p, mcnt);
-       }
-      else
-       p += 1 + CHARSET_BITMAP_SIZE (p - 1);
-      break;
-
-    case syntaxspec:
-    case notsyntaxspec:
-#ifdef emacs
-    case categoryspec:
-    case notcategoryspec:
-#endif /* emacs */
-      p++;
-      break;
-
-    default:
-      p = NULL;
-    }
-  return p;
-}
-
-
-/* Jump over non-matching operations.  */
-static re_char *
-skip_noops (p, pend)
-     re_char *p, *pend;
-{
-  int mcnt;
-  while (p < pend)
-    {
-      switch (SWITCH_ENUM_CAST ((re_opcode_t) *p))
-       {
-       case start_memory:
-       case stop_memory:
-         p += 2; break;
-       case no_op:
-         p += 1; break;
-       case jump:
-         p += 1;
-         EXTRACT_NUMBER_AND_INCR (mcnt, p);
-         p += mcnt;
-         break;
-       default:
-         return p;
-       }
-    }
-  assert (p == pend);
-  return p;
-}
-
-/* Non-zero if "p1 matches something" implies "p2 fails".  */
-static int
-mutually_exclusive_p (bufp, p1, p2)
-     struct re_pattern_buffer *bufp;
-     re_char *p1, *p2;
-{
-  re_opcode_t op2;
-  const boolean multibyte = RE_MULTIBYTE_P (bufp);
-  unsigned char *pend = bufp->buffer + bufp->used;
-
-  assert (p1 >= bufp->buffer && p1 < pend
-         && p2 >= bufp->buffer && p2 <= pend);
-
-  /* Skip over open/close-group commands.
-     If what follows this loop is a ...+ construct,
-     look at what begins its body, since we will have to
-     match at least one of that.  */
-  p2 = skip_noops (p2, pend);
-  /* The same skip can be done for p1, except that this function
-     is only used in the case where p1 is a simple match operator.  */
-  /* p1 = skip_noops (p1, pend); */
-
-  assert (p1 >= bufp->buffer && p1 < pend
-         && p2 >= bufp->buffer && p2 <= pend);
-
-  op2 = p2 == pend ? succeed : *p2;
-
-  switch (SWITCH_ENUM_CAST (op2))
-    {
-    case succeed:
-    case endbuf:
-      /* If we're at the end of the pattern, we can change.  */
-      if (skip_one_char (p1))
-       {
-         DEBUG_PRINT1 ("  End of pattern: fast loop.\n");
-         return 1;
-       }
-      break;
-
-    case endline:
-    case exactn:
-      {
-       register re_wchar_t c
-         = (re_opcode_t) *p2 == endline ? '\n'
-         : RE_STRING_CHAR (p2 + 2, pend - p2 - 2);
-
-       if ((re_opcode_t) *p1 == exactn)
-         {
-           if (c != RE_STRING_CHAR (p1 + 2, pend - p1 - 2))
-             {
-               DEBUG_PRINT3 ("  '%c' != '%c' => fast loop.\n", c, p1[2]);
-               return 1;
-             }
-         }
-
-       else if ((re_opcode_t) *p1 == charset
-                || (re_opcode_t) *p1 == charset_not)
-         {
-           int not = (re_opcode_t) *p1 == charset_not;
-
-           /* Test if C is listed in charset (or charset_not)
-              at `p1'.  */
-           if (SINGLE_BYTE_CHAR_P (c))
-             {
-               if (c < CHARSET_BITMAP_SIZE (p1) * BYTEWIDTH
-                   && p1[2 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH)))
-                 not = !not;
-             }
-           else if (CHARSET_RANGE_TABLE_EXISTS_P (p1))
-             CHARSET_LOOKUP_RANGE_TABLE (not, c, p1);
-
-           /* `not' is equal to 1 if c would match, which means
-              that we can't change to pop_failure_jump.  */
-           if (!not)
-             {
-               DEBUG_PRINT1 ("  No match => fast loop.\n");
-               return 1;
-             }
-         }
-       else if ((re_opcode_t) *p1 == anychar
-                && c == '\n')
-         {
-           DEBUG_PRINT1 ("   . != \\n => fast loop.\n");
-           return 1;
-         }
-      }
-      break;
-
-    case charset:
-      {
-       if ((re_opcode_t) *p1 == exactn)
-         /* Reuse the code above.  */
-         return mutually_exclusive_p (bufp, p2, p1);
-
-      /* It is hard to list up all the character in charset
-        P2 if it includes multibyte character.  Give up in
-        such case.  */
-      else if (!multibyte || !CHARSET_RANGE_TABLE_EXISTS_P (p2))
-       {
-         /* Now, we are sure that P2 has no range table.
-            So, for the size of bitmap in P2, `p2[1]' is
-            enough.    But P1 may have range table, so the
-            size of bitmap table of P1 is extracted by
-            using macro `CHARSET_BITMAP_SIZE'.
-
-            Since we know that all the character listed in
-            P2 is ASCII, it is enough to test only bitmap
-            table of P1.  */
-
-         if ((re_opcode_t) *p1 == charset)
-           {
-             int idx;
-             /* We win if the charset inside the loop
-                has no overlap with the one after the loop.  */
-             for (idx = 0;
-                  (idx < (int) p2[1]
-                   && idx < CHARSET_BITMAP_SIZE (p1));
-                  idx++)
-               if ((p2[2 + idx] & p1[2 + idx]) != 0)
-                 break;
-
-             if (idx == p2[1]
-                 || idx == CHARSET_BITMAP_SIZE (p1))
-               {
-                 DEBUG_PRINT1 ("        No match => fast loop.\n");
-                 return 1;
-               }
-           }
-         else if ((re_opcode_t) *p1 == charset_not)
-           {
-             int idx;
-             /* We win if the charset_not inside the loop lists
-                every character listed in the charset after.    */
-             for (idx = 0; idx < (int) p2[1]; idx++)
-               if (! (p2[2 + idx] == 0
-                      || (idx < CHARSET_BITMAP_SIZE (p1)
-                          && ((p2[2 + idx] & ~ p1[2 + idx]) == 0))))
-                 break;
-
-               if (idx == p2[1])
-                 {
-                   DEBUG_PRINT1 ("      No match => fast loop.\n");
-                   return 1;
-                 }
-             }
-         }
-      }
-      break;
-
-    case charset_not:
-      switch (SWITCH_ENUM_CAST (*p1))
-       {
-       case exactn:
-       case charset:
-         /* Reuse the code above.  */
-         return mutually_exclusive_p (bufp, p2, p1);
-       case charset_not:
-         /* When we have two charset_not, it's very unlikely that
-            they don't overlap.  The union of the two sets of excluded
-            chars should cover all possible chars, which, as a matter of
-            fact, is virtually impossible in multibyte buffers.  */
-         break;
-       }
-      break;
-
-    case wordend:
-    case notsyntaxspec:
-      return ((re_opcode_t) *p1 == syntaxspec
-             && p1[1] == (op2 == wordend ? Sword : p2[1]));
-
-    case wordbeg:
-    case syntaxspec:
-      return ((re_opcode_t) *p1 == notsyntaxspec
-             && p1[1] == (op2 == wordend ? Sword : p2[1]));
-
-    case wordbound:
-      return (((re_opcode_t) *p1 == notsyntaxspec
-              || (re_opcode_t) *p1 == syntaxspec)
-             && p1[1] == Sword);
-
-#ifdef emacs
-    case categoryspec:
-      return ((re_opcode_t) *p1 == notcategoryspec && p1[1] == p2[1]);
-    case notcategoryspec:
-      return ((re_opcode_t) *p1 == categoryspec && p1[1] == p2[1]);
-#endif /* emacs */
-
-    default:
-      ;
-    }
-
-  /* Safe default.  */
-  return 0;
-}
-
-\f
-/* Matching routines.  */
-
-#ifndef emacs  /* Emacs never uses this.  */
-/* re_match is like re_match_2 except it takes only a single string.  */
-
-int
-re_match (bufp, string, size, pos, regs)
-     struct re_pattern_buffer *bufp;
-     const char *string;
-     int size, pos;
-     struct re_registers *regs;
-{
-  int result = re_match_2_internal (bufp, NULL, 0, (re_char*) string, size,
-                                   pos, regs, size);
-# if defined C_ALLOCA && !defined REGEX_MALLOC
-  alloca (0);
-# endif
-  return result;
-}
-WEAK_ALIAS (__re_match, re_match)
-#endif /* not emacs */
-
-#ifdef emacs
-/* In Emacs, this is the string or buffer in which we
-   are matching.  It is used for looking up syntax properties. */
-Lisp_Object re_match_object;
-#endif
-
-/* re_match_2 matches the compiled pattern in BUFP against the
-   the (virtual) concatenation of STRING1 and STRING2 (of length SIZE1
-   and SIZE2, respectively).  We start matching at POS, and stop
-   matching at STOP.
-
-   If REGS is non-null and the `no_sub' field of BUFP is nonzero, we
-   store offsets for the substring each group matched in REGS. See the
-   documentation for exactly how many groups we fill.
-
-   We return -1 if no match, -2 if an internal error (such as the
-   failure stack overflowing). Otherwise, we return the length of the
-   matched substring.  */
-
-int
-re_match_2 (bufp, string1, size1, string2, size2, pos, regs, stop)
-     struct re_pattern_buffer *bufp;
-     const char *string1, *string2;
-     int size1, size2;
-     int pos;
-     struct re_registers *regs;
-     int stop;
-{
-  int result;
-
-#ifdef emacs
-  int charpos;
-  gl_state.object = re_match_object;
-  charpos = SYNTAX_TABLE_BYTE_TO_CHAR (POS_AS_IN_BUFFER (pos));
-  SETUP_SYNTAX_TABLE_FOR_OBJECT (re_match_object, charpos, 1);
-#endif
-
-  result = re_match_2_internal (bufp, (re_char*) string1, size1,
-                               (re_char*) string2, size2,
-                               pos, regs, stop);
-#if defined C_ALLOCA && !defined REGEX_MALLOC
-  alloca (0);
-#endif
-  return result;
-}
-WEAK_ALIAS (__re_match_2, re_match_2)
-
-/* This is a separate function so that we can force an alloca cleanup
-   afterwards. */
-static int
-re_match_2_internal (bufp, string1, size1, string2, size2, pos, regs, stop)
-     struct re_pattern_buffer *bufp;
-     re_char *string1, *string2;
-     int size1, size2;
-     int pos;
-     struct re_registers *regs;
-     int stop;
-{
-  /* General temporaries.  */
-  int mcnt;
-  size_t reg;
-  boolean not;
-
-  /* Just past the end of the corresponding string.  */
-  re_char *end1, *end2;
-
-  /* Pointers into string1 and string2, just past the last characters in
-     each to consider matching.         */
-  re_char *end_match_1, *end_match_2;
-
-  /* Where we are in the data, and the end of the current string.  */
-  re_char *d, *dend;
-
-  /* Used sometimes to remember where we were before starting matching
-     an operator so that we can go back in case of failure.  This "atomic"
-     behavior of matching opcodes is indispensable to the correctness
-     of the on_failure_keep_string_jump optimization.  */
-  re_char *dfail;
-
-  /* Where we are in the pattern, and the end of the pattern.  */
-  re_char *p = bufp->buffer;
-  re_char *pend = p + bufp->used;
-
-  /* We use this to map every character in the string. */
-  RE_TRANSLATE_TYPE translate = bufp->translate;
-
-  /* Nonzero if we have to concern multibyte character.         */
-  const boolean multibyte = RE_MULTIBYTE_P (bufp);
-
-  /* Failure point stack.  Each place that can handle a failure further
-     down the line pushes a failure point on this stack.  It consists of
-     regstart, and regend for all registers corresponding to
-     the subexpressions we're currently inside, plus the number of such
-     registers, and, finally, two char *'s.  The first char * is where
-     to resume scanning the pattern; the second one is where to resume
-     scanning the strings.     */
-#ifdef MATCH_MAY_ALLOCATE /* otherwise, this is global.         */
-  fail_stack_type fail_stack;
-#endif
-#ifdef DEBUG
-  unsigned nfailure_points_pushed = 0, nfailure_points_popped = 0;
-#endif
-
-#if defined REL_ALLOC && defined REGEX_MALLOC
-  /* This holds the pointer to the failure stack, when
-     it is allocated relocatably.  */
-  fail_stack_elt_t *failure_stack_ptr;
-#endif
-
-  /* We fill all the registers internally, independent of what we
-     return, for use in backreferences.         The number here includes
-     an element for register zero.  */
-  size_t num_regs = bufp->re_nsub + 1;
-
-  /* Information on the contents of registers. These are pointers into
-     the input strings; they record just what was matched (on this
-     attempt) by a subexpression part of the pattern, that is, the
-     regnum-th regstart pointer points to where in the pattern we began
-     matching and the regnum-th regend points to right after where we
-     stopped matching the regnum-th subexpression.  (The zeroth register
-     keeps track of what the whole pattern matches.)  */
-#ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global.  */
-  re_char **regstart, **regend;
-#endif
-
-  /* The following record the register info as found in the above
-     variables when we find a match better than any we've seen before.
-     This happens as we backtrack through the failure points, which in
-     turn happens only if we have not yet matched the entire string. */
-  unsigned best_regs_set = false;
-#ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global.  */
-  re_char **best_regstart, **best_regend;
-#endif
-
-  /* Logically, this is `best_regend[0]'.  But we don't want to have to
-     allocate space for that if we're not allocating space for anything
-     else (see below). Also, we never need info about register 0 for
-     any of the other register vectors, and it seems rather a kludge to
-     treat `best_regend' differently than the rest.  So we keep track of
-     the end of the best match so far in a separate variable.  We
-     initialize this to NULL so that when we backtrack the first time
-     and need to test it, it's not garbage.  */
-  re_char *match_end = NULL;
-
-#ifdef DEBUG
-  /* Counts the total number of registers pushed.  */
-  unsigned num_regs_pushed = 0;
-#endif
-
-  DEBUG_PRINT1 ("\n\nEntering re_match_2.\n");
-
-  INIT_FAIL_STACK ();
-
-#ifdef MATCH_MAY_ALLOCATE
-  /* Do not bother to initialize all the register variables if there are
-     no groups in the pattern, as it takes a fair amount of time.  If
-     there are groups, we include space for register 0 (the whole
-     pattern), even though we never use it, since it simplifies the
-     array indexing.  We should fix this.  */
-  if (bufp->re_nsub)
-    {
-      regstart = REGEX_TALLOC (num_regs, re_char *);
-      regend = REGEX_TALLOC (num_regs, re_char *);
-      best_regstart = REGEX_TALLOC (num_regs, re_char *);
-      best_regend = REGEX_TALLOC (num_regs, re_char *);
-
-      if (!(regstart && regend && best_regstart && best_regend))
-       {
-         FREE_VARIABLES ();
-         return -2;
-       }
-    }
-  else
-    {
-      /* We must initialize all our variables to NULL, so that
-        `FREE_VARIABLES' doesn't try to free them.  */
-      regstart = regend = best_regstart = best_regend = NULL;
-    }
-#endif /* MATCH_MAY_ALLOCATE */
-
-  /* The starting position is bogus.  */
-  if (pos < 0 || pos > size1 + size2)
-    {
-      FREE_VARIABLES ();
-      return -1;
-    }
-
-  /* Initialize subexpression text positions to -1 to mark ones that no
-     start_memory/stop_memory has been seen for. Also initialize the
-     register information struct.  */
-  for (reg = 1; reg < num_regs; reg++)
-    regstart[reg] = regend[reg] = NULL;
-
-  /* We move `string1' into `string2' if the latter's empty -- but not if
-     `string1' is null.         */
-  if (size2 == 0 && string1 != NULL)
-    {
-      string2 = string1;
-      size2 = size1;
-      string1 = 0;
-      size1 = 0;
-    }
-  end1 = string1 + size1;
-  end2 = string2 + size2;
-
-  /* `p' scans through the pattern as `d' scans through the data.
-     `dend' is the end of the input string that `d' points within.  `d'
-     is advanced into the following input string whenever necessary, but
-     this happens before fetching; therefore, at the beginning of the
-     loop, `d' can be pointing at the end of a string, but it cannot
-     equal `string2'.  */
-  if (pos >= size1)
-    {
-      /* Only match within string2.  */
-      d = string2 + pos - size1;
-      dend = end_match_2 = string2 + stop - size1;
-      end_match_1 = end1;      /* Just to give it a value.  */
-    }
-  else
-    {
-      if (stop < size1)
-       {
-         /* Only match within string1.  */
-         end_match_1 = string1 + stop;
-         /* BEWARE!
-            When we reach end_match_1, PREFETCH normally switches to string2.
-            But in the present case, this means that just doing a PREFETCH
-            makes us jump from `stop' to `gap' within the string.
-            What we really want here is for the search to stop as
-            soon as we hit end_match_1.  That's why we set end_match_2
-            to end_match_1 (since PREFETCH fails as soon as we hit
-            end_match_2).  */
-         end_match_2 = end_match_1;
-       }
-      else
-       { /* It's important to use this code when stop == size so that
-            moving `d' from end1 to string2 will not prevent the d == dend
-            check from catching the end of string.  */
-         end_match_1 = end1;
-         end_match_2 = string2 + stop - size1;
-       }
-      d = string1 + pos;
-      dend = end_match_1;
-    }
-
-  DEBUG_PRINT1 ("The compiled pattern is: ");
-  DEBUG_PRINT_COMPILED_PATTERN (bufp, p, pend);
-  DEBUG_PRINT1 ("The string to match is: `");
-  DEBUG_PRINT_DOUBLE_STRING (d, string1, size1, string2, size2);
-  DEBUG_PRINT1 ("'\n");
-
-  /* This loops over pattern commands. It exits by returning from the
-     function if the match is complete, or it drops through if the match
-     fails at this starting point in the input data.  */
-  for (;;)
-    {
-      DEBUG_PRINT2 ("\n%p: ", p);
-
-      if (p == pend)
-       { /* End of pattern means we might have succeeded.  */
-         DEBUG_PRINT1 ("end of pattern ... ");
-
-         /* If we haven't matched the entire string, and we want the
-            longest match, try backtracking.  */
-         if (d != end_match_2)
-           {
-             /* 1 if this match ends in the same string (string1 or string2)
-                as the best previous match.  */
-             boolean same_str_p = (FIRST_STRING_P (match_end)
-                                   == FIRST_STRING_P (d));
-             /* 1 if this match is the best seen so far.  */
-             boolean best_match_p;
-
-             /* AIX compiler got confused when this was combined
-                with the previous declaration.  */
-             if (same_str_p)
-               best_match_p = d > match_end;
-             else
-               best_match_p = !FIRST_STRING_P (d);
-
-             DEBUG_PRINT1 ("backtracking.\n");
-
-             if (!FAIL_STACK_EMPTY ())
-               { /* More failure points to try.  */
-
-                 /* If exceeds best match so far, save it.  */
-                 if (!best_regs_set || best_match_p)
-                   {
-                     best_regs_set = true;
-                     match_end = d;
-
-                     DEBUG_PRINT1 ("\nSAVING match as best so far.\n");
-
-                     for (reg = 1; reg < num_regs; reg++)
-                       {
-                         best_regstart[reg] = regstart[reg];
-                         best_regend[reg] = regend[reg];
-                       }
-                   }
-                 goto fail;
-               }
-
-             /* If no failure points, don't restore garbage.  And if
-                last match is real best match, don't restore second
-                best one. */
-             else if (best_regs_set && !best_match_p)
-               {
-               restore_best_regs:
-                 /* Restore best match.  It may happen that `dend ==
-                    end_match_1' while the restored d is in string2.
-                    For example, the pattern `x.*y.*z' against the
-                    strings `x-' and `y-z-', if the two strings are
-                    not consecutive in memory.  */
-                 DEBUG_PRINT1 ("Restoring best registers.\n");
-
-                 d = match_end;
-                 dend = ((d >= string1 && d <= end1)
-                          ? end_match_1 : end_match_2);
-
-                 for (reg = 1; reg < num_regs; reg++)
-                   {
-                     regstart[reg] = best_regstart[reg];
-                     regend[reg] = best_regend[reg];
-                   }
-               }
-           } /* d != end_match_2 */
-
-       succeed_label:
-         DEBUG_PRINT1 ("Accepting match.\n");
-
-         /* If caller wants register contents data back, do it.  */
-         if (regs && !bufp->no_sub)
-           {
-             /* Have the register data arrays been allocated?  */
-             if (bufp->regs_allocated == REGS_UNALLOCATED)
-               { /* No.  So allocate them with malloc.  We need one
-                    extra element beyond `num_regs' for the `-1' marker
-                    GNU code uses.  */
-                 regs->num_regs = MAX (RE_NREGS, num_regs + 1);
-                 regs->start = TALLOC (regs->num_regs, regoff_t);
-                 regs->end = TALLOC (regs->num_regs, regoff_t);
-                 if (regs->start == NULL || regs->end == NULL)
-                   {
-                     FREE_VARIABLES ();
-                     return -2;
-                   }
-                 bufp->regs_allocated = REGS_REALLOCATE;
-               }
-             else if (bufp->regs_allocated == REGS_REALLOCATE)
-               { /* Yes.  If we need more elements than were already
-                    allocated, reallocate them.  If we need fewer, just
-                    leave it alone.  */
-                 if (regs->num_regs < num_regs + 1)
-                   {
-                     regs->num_regs = num_regs + 1;
-                     RETALLOC (regs->start, regs->num_regs, regoff_t);
-                     RETALLOC (regs->end, regs->num_regs, regoff_t);
-                     if (regs->start == NULL || regs->end == NULL)
-                       {
-                         FREE_VARIABLES ();
-                         return -2;
-                       }
-                   }
-               }
-             else
-               {
-                 /* These braces fend off a "empty body in an else-statement"
-                    warning under GCC when assert expands to nothing.  */
-                 assert (bufp->regs_allocated == REGS_FIXED);
-               }
-
-             /* Convert the pointer data in `regstart' and `regend' to
-                indices.  Register zero has to be set differently,
-                since we haven't kept track of any info for it.  */
-             if (regs->num_regs > 0)
-               {
-                 regs->start[0] = pos;
-                 regs->end[0] = POINTER_TO_OFFSET (d);
-               }
-
-             /* Go through the first `min (num_regs, regs->num_regs)'
-                registers, since that is all we initialized.  */
-             for (reg = 1; reg < MIN (num_regs, regs->num_regs); reg++)
-               {
-                 if (REG_UNSET (regstart[reg]) || REG_UNSET (regend[reg]))
-                   regs->start[reg] = regs->end[reg] = -1;
-                 else
-                   {
-                     regs->start[reg]
-                       = (regoff_t) POINTER_TO_OFFSET (regstart[reg]);
-                     regs->end[reg]
-                       = (regoff_t) POINTER_TO_OFFSET (regend[reg]);
-                   }
-               }
-
-             /* If the regs structure we return has more elements than
-                were in the pattern, set the extra elements to -1.  If
-                we (re)allocated the registers, this is the case,
-                because we always allocate enough to have at least one
-                -1 at the end.  */
-             for (reg = num_regs; reg < regs->num_regs; reg++)
-               regs->start[reg] = regs->end[reg] = -1;
-           } /* regs && !bufp->no_sub */
-
-         DEBUG_PRINT4 ("%u failure points pushed, %u popped (%u remain).\n",
-                       nfailure_points_pushed, nfailure_points_popped,
-                       nfailure_points_pushed - nfailure_points_popped);
-         DEBUG_PRINT2 ("%u registers pushed.\n", num_regs_pushed);
-
-         mcnt = POINTER_TO_OFFSET (d) - pos;
-
-         DEBUG_PRINT2 ("Returning %d from re_match_2.\n", mcnt);
-
-         FREE_VARIABLES ();
-         return mcnt;
-       }
-
-      /* Otherwise match next pattern command. */
-      switch (SWITCH_ENUM_CAST ((re_opcode_t) *p++))
-       {
-       /* Ignore these.  Used to ignore the n of succeed_n's which
-          currently have n == 0.  */
-       case no_op:
-         DEBUG_PRINT1 ("EXECUTING no_op.\n");
-         break;
-
-       case succeed:
-         DEBUG_PRINT1 ("EXECUTING succeed.\n");
-         goto succeed_label;
-
-       /* Match the next n pattern characters exactly.  The following
-          byte in the pattern defines n, and the n bytes after that
-          are the characters to match.  */
-       case exactn:
-         mcnt = *p++;
-         DEBUG_PRINT2 ("EXECUTING exactn %d.\n", mcnt);
-
-         /* Remember the start point to rollback upon failure.  */
-         dfail = d;
-
-         /* This is written out as an if-else so we don't waste time
-            testing `translate' inside the loop.  */
-         if (RE_TRANSLATE_P (translate))
-           {
-             if (multibyte)
-               do
-                 {
-                   int pat_charlen, buf_charlen;
-                   unsigned int pat_ch, buf_ch;
-
-                   PREFETCH ();
-                   pat_ch = STRING_CHAR_AND_LENGTH (p, pend - p, pat_charlen);
-                   buf_ch = STRING_CHAR_AND_LENGTH (d, dend - d, buf_charlen);
-
-                   if (RE_TRANSLATE (translate, buf_ch)
-                       != pat_ch)
-                     {
-                       d = dfail;
-                       goto fail;
-                     }
-
-                   p += pat_charlen;
-                   d += buf_charlen;
-                   mcnt -= pat_charlen;
-                 }
-               while (mcnt > 0);
-             else
-               do
-                 {
-                   PREFETCH ();
-                   if (RE_TRANSLATE (translate, *d) != *p++)
-                     {
-                       d = dfail;
-                       goto fail;
-                     }
-                   d++;
-                 }
-               while (--mcnt);
-           }
-         else
-           {
-             do
-               {
-                 PREFETCH ();
-                 if (*d++ != *p++)
-                   {
-                     d = dfail;
-                     goto fail;
-                   }
-               }
-             while (--mcnt);
-           }
-         break;
-
-
-       /* Match any character except possibly a newline or a null.  */
-       case anychar:
-         {
-           int buf_charlen;
-           re_wchar_t buf_ch;
-
-           DEBUG_PRINT1 ("EXECUTING anychar.\n");
-
-           PREFETCH ();
-           buf_ch = RE_STRING_CHAR_AND_LENGTH (d, dend - d, buf_charlen);
-           buf_ch = TRANSLATE (buf_ch);
-
-           if ((!(bufp->syntax & RE_DOT_NEWLINE)
-                && buf_ch == '\n')
-               || ((bufp->syntax & RE_DOT_NOT_NULL)
-                   && buf_ch == '\000'))
-             goto fail;
-
-           DEBUG_PRINT2 ("  Matched `%d'.\n", *d);
-           d += buf_charlen;
-         }
-         break;
-
-
-       case charset:
-       case charset_not:
-         {
-           register unsigned int c;
-           boolean not = (re_opcode_t) *(p - 1) == charset_not;
-           int len;
-
-           /* Start of actual range_table, or end of bitmap if there is no
-              range table.  */
-           re_char *range_table;
-
-           /* Nonzero if there is a range table.  */
-           int range_table_exists;
-
-           /* Number of ranges of range table.  This is not included
-              in the initial byte-length of the command.  */
-           int count = 0;
-
-           DEBUG_PRINT2 ("EXECUTING charset%s.\n", not ? "_not" : "");
-
-           range_table_exists = CHARSET_RANGE_TABLE_EXISTS_P (&p[-1]);
-
-           if (range_table_exists)
-             {
-               range_table = CHARSET_RANGE_TABLE (&p[-1]); /* Past the bitmap.  */
-               EXTRACT_NUMBER_AND_INCR (count, range_table);
-             }
-
-           PREFETCH ();
-           c = RE_STRING_CHAR_AND_LENGTH (d, dend - d, len);
-           c = TRANSLATE (c); /* The character to match.  */
-
-           if (SINGLE_BYTE_CHAR_P (c))
-             {                 /* Lookup bitmap.  */
-               /* Cast to `unsigned' instead of `unsigned char' in
-                  case the bit list is a full 32 bytes long.  */
-               if (c < (unsigned) (CHARSET_BITMAP_SIZE (&p[-1]) * BYTEWIDTH)
-                   && p[1 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH)))
-                 not = !not;
-             }
-#ifdef emacs
-           else if (range_table_exists)
-             {
-               int class_bits = CHARSET_RANGE_TABLE_BITS (&p[-1]);
-
-               if (  (class_bits & BIT_LOWER && ISLOWER (c))
-                   | (class_bits & BIT_MULTIBYTE)
-                   | (class_bits & BIT_PUNCT && ISPUNCT (c))
-                   | (class_bits & BIT_SPACE && ISSPACE (c))
-                   | (class_bits & BIT_UPPER && ISUPPER (c))
-                   | (class_bits & BIT_WORD  && ISWORD (c)))
-                 not = !not;
-               else
-                 CHARSET_LOOKUP_RANGE_TABLE_RAW (not, c, range_table, count);
-             }
-#endif /* emacs */
-
-           if (range_table_exists)
-             p = CHARSET_RANGE_TABLE_END (range_table, count);
-           else
-             p += CHARSET_BITMAP_SIZE (&p[-1]) + 1;
-
-           if (!not) goto fail;
-
-           d += len;
-           break;
-         }
-
-
-       /* The beginning of a group is represented by start_memory.
-          The argument is the register number.  The text
-          matched within the group is recorded (in the internal
-          registers data structure) under the register number.  */
-       case start_memory:
-         DEBUG_PRINT2 ("EXECUTING start_memory %d:\n", *p);
-
-         /* In case we need to undo this operation (via backtracking).  */
-         PUSH_FAILURE_REG ((unsigned int)*p);
-
-         regstart[*p] = d;
-         regend[*p] = NULL;    /* probably unnecessary.  -sm  */
-         DEBUG_PRINT2 ("  regstart: %d\n", POINTER_TO_OFFSET (regstart[*p]));
-
-         /* Move past the register number and inner group count.  */
-         p += 1;
-         break;
-
-
-       /* The stop_memory opcode represents the end of a group.  Its
-          argument is the same as start_memory's: the register number.  */
-       case stop_memory:
-         DEBUG_PRINT2 ("EXECUTING stop_memory %d:\n", *p);
-
-         assert (!REG_UNSET (regstart[*p]));
-         /* Strictly speaking, there should be code such as:
-
-               assert (REG_UNSET (regend[*p]));
-               PUSH_FAILURE_REGSTOP ((unsigned int)*p);
-
-            But the only info to be pushed is regend[*p] and it is known to
-            be UNSET, so there really isn't anything to push.
-            Not pushing anything, on the other hand deprives us from the
-            guarantee that regend[*p] is UNSET since undoing this operation
-            will not reset its value properly.  This is not important since
-            the value will only be read on the next start_memory or at
-            the very end and both events can only happen if this stop_memory
-            is *not* undone.  */
-
-         regend[*p] = d;
-         DEBUG_PRINT2 ("      regend: %d\n", POINTER_TO_OFFSET (regend[*p]));
-
-         /* Move past the register number and the inner group count.  */
-         p += 1;
-         break;
-
-
-       /* \<digit> has been turned into a `duplicate' command which is
-          followed by the numeric value of <digit> as the register number.  */
-       case duplicate:
-         {
-           register re_char *d2, *dend2;
-           int regno = *p++;   /* Get which register to match against.  */
-           DEBUG_PRINT2 ("EXECUTING duplicate %d.\n", regno);
-
-           /* Can't back reference a group which we've never matched.  */
-           if (REG_UNSET (regstart[regno]) || REG_UNSET (regend[regno]))
-             goto fail;
-
-           /* Where in input to try to start matching.  */
-           d2 = regstart[regno];
-
-           /* Remember the start point to rollback upon failure.  */
-           dfail = d;
-
-           /* Where to stop matching; if both the place to start and
-              the place to stop matching are in the same string, then
-              set to the place to stop, otherwise, for now have to use
-              the end of the first string.  */
-
-           dend2 = ((FIRST_STRING_P (regstart[regno])
-                     == FIRST_STRING_P (regend[regno]))
-                    ? regend[regno] : end_match_1);
-           for (;;)
-             {
-               /* If necessary, advance to next segment in register
-                  contents.  */
-               while (d2 == dend2)
-                 {
-                   if (dend2 == end_match_2) break;
-                   if (dend2 == regend[regno]) break;
-
-                   /* End of string1 => advance to string2. */
-                   d2 = string2;
-                   dend2 = regend[regno];
-                 }
-               /* At end of register contents => success */
-               if (d2 == dend2) break;
-
-               /* If necessary, advance to next segment in data.  */
-               PREFETCH ();
-
-               /* How many characters left in this segment to match.  */
-               mcnt = dend - d;
-
-               /* Want how many consecutive characters we can match in
-                  one shot, so, if necessary, adjust the count.  */
-               if (mcnt > dend2 - d2)
-                 mcnt = dend2 - d2;
-
-               /* Compare that many; failure if mismatch, else move
-                  past them.  */
-               if (RE_TRANSLATE_P (translate)
-                   ? bcmp_translate (d, d2, mcnt, translate, multibyte)
-                   : memcmp (d, d2, mcnt))
-                 {
-                   d = dfail;
-                   goto fail;
-                 }
-               d += mcnt, d2 += mcnt;
-             }
-         }
-         break;
-
-
-       /* begline matches the empty string at the beginning of the string
-          (unless `not_bol' is set in `bufp'), and after newlines.  */
-       case begline:
-         DEBUG_PRINT1 ("EXECUTING begline.\n");
-
-         if (AT_STRINGS_BEG (d))
-           {
-             if (!bufp->not_bol) break;
-           }
-         else
-           {
-             unsigned char c;
-             GET_CHAR_BEFORE_2 (c, d, string1, end1, string2, end2);
-             if (c == '\n')
-               break;
-           }
-         /* In all other cases, we fail.  */
-         goto fail;
-
-
-       /* endline is the dual of begline.  */
-       case endline:
-         DEBUG_PRINT1 ("EXECUTING endline.\n");
-
-         if (AT_STRINGS_END (d))
-           {
-             if (!bufp->not_eol) break;
-           }
-         else
-           {
-             PREFETCH_NOLIMIT ();
-             if (*d == '\n')
-               break;
-           }
-         goto fail;
-
-
-       /* Match at the very beginning of the data.  */
-       case begbuf:
-         DEBUG_PRINT1 ("EXECUTING begbuf.\n");
-         if (AT_STRINGS_BEG (d))
-           break;
-         goto fail;
-
-
-       /* Match at the very end of the data.  */
-       case endbuf:
-         DEBUG_PRINT1 ("EXECUTING endbuf.\n");
-         if (AT_STRINGS_END (d))
-           break;
-         goto fail;
-
-
-       /* on_failure_keep_string_jump is used to optimize `.*\n'.  It
-          pushes NULL as the value for the string on the stack.  Then
-          `POP_FAILURE_POINT' will keep the current value for the
-          string, instead of restoring it.  To see why, consider
-          matching `foo\nbar' against `.*\n'.  The .* matches the foo;
-          then the . fails against the \n.  But the next thing we want
-          to do is match the \n against the \n; if we restored the
-          string value, we would be back at the foo.
-
-          Because this is used only in specific cases, we don't need to
-          check all the things that `on_failure_jump' does, to make
-          sure the right things get saved on the stack.  Hence we don't
-          share its code.  The only reason to push anything on the
-          stack at all is that otherwise we would have to change
-          `anychar's code to do something besides goto fail in this
-          case; that seems worse than this.  */
-       case on_failure_keep_string_jump:
-         EXTRACT_NUMBER_AND_INCR (mcnt, p);
-         DEBUG_PRINT3 ("EXECUTING on_failure_keep_string_jump %d (to %p):\n",
-                       mcnt, p + mcnt);
-
-         PUSH_FAILURE_POINT (p - 3, NULL);
-         break;
-
-         /* A nasty loop is introduced by the non-greedy *? and +?.
-            With such loops, the stack only ever contains one failure point
-            at a time, so that a plain on_failure_jump_loop kind of
-            cycle detection cannot work.  Worse yet, such a detection
-            can not only fail to detect a cycle, but it can also wrongly
-            detect a cycle (between different instantiations of the same
-            loop).
-            So the method used for those nasty loops is a little different:
-            We use a special cycle-detection-stack-frame which is pushed
-            when the on_failure_jump_nastyloop failure-point is *popped*.
-            This special frame thus marks the beginning of one iteration
-            through the loop and we can hence easily check right here
-            whether something matched between the beginning and the end of
-            the loop.  */
-       case on_failure_jump_nastyloop:
-         EXTRACT_NUMBER_AND_INCR (mcnt, p);
-         DEBUG_PRINT3 ("EXECUTING on_failure_jump_nastyloop %d (to %p):\n",
-                       mcnt, p + mcnt);
-
-         assert ((re_opcode_t)p[-4] == no_op);
-         {
-           int cycle = 0;
-           CHECK_INFINITE_LOOP (p - 4, d);
-           if (!cycle)
-             /* If there's a cycle, just continue without pushing
-                this failure point.  The failure point is the "try again"
-                option, which shouldn't be tried.
-                We want (x?)*?y\1z to match both xxyz and xxyxz.  */
-             PUSH_FAILURE_POINT (p - 3, d);
-         }
-         break;
-
-         /* Simple loop detecting on_failure_jump:  just check on the
-            failure stack if the same spot was already hit earlier.  */
-       case on_failure_jump_loop:
-       on_failure:
-         EXTRACT_NUMBER_AND_INCR (mcnt, p);
-         DEBUG_PRINT3 ("EXECUTING on_failure_jump_loop %d (to %p):\n",
-                       mcnt, p + mcnt);
-         {
-           int cycle = 0;
-           CHECK_INFINITE_LOOP (p - 3, d);
-           if (cycle)
-             /* If there's a cycle, get out of the loop, as if the matching
-                had failed.  We used to just `goto fail' here, but that was
-                aborting the search a bit too early: we want to keep the
-                empty-loop-match and keep matching after the loop.
-                We want (x?)*y\1z to match both xxyz and xxyxz.  */
-             p += mcnt;
-           else
-             PUSH_FAILURE_POINT (p - 3, d);
-         }
-         break;
-
-
-       /* Uses of on_failure_jump:
-
-          Each alternative starts with an on_failure_jump that points
-          to the beginning of the next alternative.  Each alternative
-          except the last ends with a jump that in effect jumps past
-          the rest of the alternatives.  (They really jump to the
-          ending jump of the following alternative, because tensioning
-          these jumps is a hassle.)
-
-          Repeats start with an on_failure_jump that points past both
-          the repetition text and either the following jump or
-          pop_failure_jump back to this on_failure_jump.  */
-       case on_failure_jump:
-         IMMEDIATE_QUIT_CHECK;
-         EXTRACT_NUMBER_AND_INCR (mcnt, p);
-         DEBUG_PRINT3 ("EXECUTING on_failure_jump %d (to %p):\n",
-                       mcnt, p + mcnt);
-
-         PUSH_FAILURE_POINT (p -3, d);
-         break;
-
-       /* This operation is used for greedy *.
-          Compare the beginning of the repeat with what in the
-          pattern follows its end. If we can establish that there
-          is nothing that they would both match, i.e., that we
-          would have to backtrack because of (as in, e.g., `a*a')
-          then we can use a non-backtracking loop based on
-          on_failure_keep_string_jump instead of on_failure_jump.  */
-       case on_failure_jump_smart:
-         IMMEDIATE_QUIT_CHECK;
-         EXTRACT_NUMBER_AND_INCR (mcnt, p);
-         DEBUG_PRINT3 ("EXECUTING on_failure_jump_smart %d (to %p).\n",
-                       mcnt, p + mcnt);
-         {
-           re_char *p1 = p; /* Next operation.  */
-           /* Here, we discard `const', making re_match non-reentrant.  */
-           unsigned char *p2 = (unsigned char*) p + mcnt; /* Jump dest.  */
-           unsigned char *p3 = (unsigned char*) p - 3; /* opcode location.  */
-
-           p -= 3;             /* Reset so that we will re-execute the
-                                  instruction once it's been changed. */
-
-           EXTRACT_NUMBER (mcnt, p2 - 2);
-
-           /* Ensure this is a indeed the trivial kind of loop
-              we are expecting.  */
-           assert (skip_one_char (p1) == p2 - 3);
-           assert ((re_opcode_t) p2[-3] == jump && p2 + mcnt == p);
-           DEBUG_STATEMENT (debug += 2);
-           if (mutually_exclusive_p (bufp, p1, p2))
-             {
-               /* Use a fast `on_failure_keep_string_jump' loop.  */
-               DEBUG_PRINT1 ("  smart exclusive => fast loop.\n");
-               *p3 = (unsigned char) on_failure_keep_string_jump;
-               STORE_NUMBER (p2 - 2, mcnt + 3);
-             }
-           else
-             {
-               /* Default to a safe `on_failure_jump' loop.  */
-               DEBUG_PRINT1 ("  smart default => slow loop.\n");
-               *p3 = (unsigned char) on_failure_jump;
-             }
-           DEBUG_STATEMENT (debug -= 2);
-         }
-         break;
-
-       /* Unconditionally jump (without popping any failure points).  */
-       case jump:
-       unconditional_jump:
-         IMMEDIATE_QUIT_CHECK;
-         EXTRACT_NUMBER_AND_INCR (mcnt, p);    /* Get the amount to jump.  */
-         DEBUG_PRINT2 ("EXECUTING jump %d ", mcnt);
-         p += mcnt;                            /* Do the jump.  */
-         DEBUG_PRINT2 ("(to %p).\n", p);
-         break;
-
-
-       /* Have to succeed matching what follows at least n times.
-          After that, handle like `on_failure_jump'.  */
-       case succeed_n:
-         /* Signedness doesn't matter since we only compare MCNT to 0.  */
-         EXTRACT_NUMBER (mcnt, p + 2);
-         DEBUG_PRINT2 ("EXECUTING succeed_n %d.\n", mcnt);
-
-         /* Originally, mcnt is how many times we HAVE to succeed.  */
-         if (mcnt != 0)
-           {
-             /* Here, we discard `const', making re_match non-reentrant.  */
-             unsigned char *p2 = (unsigned char*) p + 2; /* counter loc.  */
-             mcnt--;
-             p += 4;
-             PUSH_NUMBER (p2, mcnt);
-           }
-         else
-           /* The two bytes encoding mcnt == 0 are two no_op opcodes.  */
-           goto on_failure;
-         break;
-
-       case jump_n:
-         /* Signedness doesn't matter since we only compare MCNT to 0.  */
-         EXTRACT_NUMBER (mcnt, p + 2);
-         DEBUG_PRINT2 ("EXECUTING jump_n %d.\n", mcnt);
-
-         /* Originally, this is how many times we CAN jump.  */
-         if (mcnt != 0)
-           {
-              /* Here, we discard `const', making re_match non-reentrant.  */
-             unsigned char *p2 = (unsigned char*) p + 2; /* counter loc.  */
-             mcnt--;
-             PUSH_NUMBER (p2, mcnt);
-             goto unconditional_jump;
-           }
-         /* If don't have to jump any more, skip over the rest of command.  */
-         else
-           p += 4;
-         break;
-
-       case set_number_at:
-         {
-           unsigned char *p2;  /* Location of the counter.  */
-           DEBUG_PRINT1 ("EXECUTING set_number_at.\n");
-
-           EXTRACT_NUMBER_AND_INCR (mcnt, p);
-           /* Here, we discard `const', making re_match non-reentrant.  */
-           p2 = (unsigned char*) p + mcnt;
-           /* Signedness doesn't matter since we only copy MCNT's bits .  */
-           EXTRACT_NUMBER_AND_INCR (mcnt, p);
-           DEBUG_PRINT3 ("  Setting %p to %d.\n", p2, mcnt);
-           PUSH_NUMBER (p2, mcnt);
-           break;
-         }
-
-       case wordbound:
-       case notwordbound:
-         not = (re_opcode_t) *(p - 1) == notwordbound;
-         DEBUG_PRINT2 ("EXECUTING %swordbound.\n", not?"not":"");
-
-         /* We SUCCEED (or FAIL) in one of the following cases: */
-
-         /* Case 1: D is at the beginning or the end of string.  */
-         if (AT_STRINGS_BEG (d) || AT_STRINGS_END (d))
-           not = !not;
-         else
-           {
-             /* C1 is the character before D, S1 is the syntax of C1, C2
-                is the character at D, and S2 is the syntax of C2.  */
-             re_wchar_t c1, c2;
-             int s1, s2;
-#ifdef emacs
-             int offset = PTR_TO_OFFSET (d - 1);
-             int charpos = SYNTAX_TABLE_BYTE_TO_CHAR (offset);
-             UPDATE_SYNTAX_TABLE (charpos);
-#endif
-             GET_CHAR_BEFORE_2 (c1, d, string1, end1, string2, end2);
-             s1 = SYNTAX (c1);
-#ifdef emacs
-             UPDATE_SYNTAX_TABLE_FORWARD (charpos + 1);
-#endif
-             PREFETCH_NOLIMIT ();
-             c2 = RE_STRING_CHAR (d, dend - d);
-             s2 = SYNTAX (c2);
-
-             if (/* Case 2: Only one of S1 and S2 is Sword.  */
-                 ((s1 == Sword) != (s2 == Sword))
-                 /* Case 3: Both of S1 and S2 are Sword, and macro
-                    WORD_BOUNDARY_P (C1, C2) returns nonzero.  */
-                 || ((s1 == Sword) && WORD_BOUNDARY_P (c1, c2)))
-               not = !not;
-           }
-         if (not)
-           break;
-         else
-           goto fail;
-
-       case wordbeg:
-         DEBUG_PRINT1 ("EXECUTING wordbeg.\n");
-
-         /* We FAIL in one of the following cases: */
-
-         /* Case 1: D is at the end of string.  */
-         if (AT_STRINGS_END (d))
-           goto fail;
-         else
-           {
-             /* C1 is the character before D, S1 is the syntax of C1, C2
-                is the character at D, and S2 is the syntax of C2.  */
-             re_wchar_t c1, c2;
-             int s1, s2;
-#ifdef emacs
-             int offset = PTR_TO_OFFSET (d);
-             int charpos = SYNTAX_TABLE_BYTE_TO_CHAR (offset);
-             UPDATE_SYNTAX_TABLE (charpos);
-#endif
-             PREFETCH ();
-             c2 = RE_STRING_CHAR (d, dend - d);
-             s2 = SYNTAX (c2);
-
-             /* Case 2: S2 is not Sword. */
-             if (s2 != Sword)
-               goto fail;
-
-             /* Case 3: D is not at the beginning of string ... */
-             if (!AT_STRINGS_BEG (d))
-               {
-                 GET_CHAR_BEFORE_2 (c1, d, string1, end1, string2, end2);
-#ifdef emacs
-                 UPDATE_SYNTAX_TABLE_BACKWARD (charpos - 1);
-#endif
-                 s1 = SYNTAX (c1);
-
-                 /* ... and S1 is Sword, and WORD_BOUNDARY_P (C1, C2)
-                    returns 0.  */
-                 if ((s1 == Sword) && !WORD_BOUNDARY_P (c1, c2))
-                   goto fail;
-               }
-           }
-         break;
-
-       case wordend:
-         DEBUG_PRINT1 ("EXECUTING wordend.\n");
-
-         /* We FAIL in one of the following cases: */
-
-         /* Case 1: D is at the beginning of string.  */
-         if (AT_STRINGS_BEG (d))
-           goto fail;
-         else
-           {
-             /* C1 is the character before D, S1 is the syntax of C1, C2
-                is the character at D, and S2 is the syntax of C2.  */
-             re_wchar_t c1, c2;
-             int s1, s2;
-#ifdef emacs
-             int offset = PTR_TO_OFFSET (d) - 1;
-             int charpos = SYNTAX_TABLE_BYTE_TO_CHAR (offset);
-             UPDATE_SYNTAX_TABLE (charpos);
-#endif
-             GET_CHAR_BEFORE_2 (c1, d, string1, end1, string2, end2);
-             s1 = SYNTAX (c1);
-
-             /* Case 2: S1 is not Sword.  */
-             if (s1 != Sword)
-               goto fail;
-
-             /* Case 3: D is not at the end of string ... */
-             if (!AT_STRINGS_END (d))
-               {
-                 PREFETCH_NOLIMIT ();
-                 c2 = RE_STRING_CHAR (d, dend - d);
-#ifdef emacs
-                 UPDATE_SYNTAX_TABLE_FORWARD (charpos);
-#endif
-                 s2 = SYNTAX (c2);
-
-                 /* ... and S2 is Sword, and WORD_BOUNDARY_P (C1, C2)
-                    returns 0.  */
-                 if ((s2 == Sword) && !WORD_BOUNDARY_P (c1, c2))
-         goto fail;
-               }
-           }
-         break;
-
-       case syntaxspec:
-       case notsyntaxspec:
-         not = (re_opcode_t) *(p - 1) == notsyntaxspec;
-         mcnt = *p++;
-         DEBUG_PRINT3 ("EXECUTING %ssyntaxspec %d.\n", not?"not":"", mcnt);
-         PREFETCH ();
-#ifdef emacs
-         {
-           int offset = PTR_TO_OFFSET (d);
-           int pos1 = SYNTAX_TABLE_BYTE_TO_CHAR (offset);
-           UPDATE_SYNTAX_TABLE (pos1);
-         }
-#endif
-         {
-           int len;
-           re_wchar_t c;
-
-           c = RE_STRING_CHAR_AND_LENGTH (d, dend - d, len);
-
-           if ((SYNTAX (c) != (enum syntaxcode) mcnt) ^ not)
-             goto fail;
-           d += len;
-         }
-         break;
-
-#ifdef emacs
-       case before_dot:
-         DEBUG_PRINT1 ("EXECUTING before_dot.\n");
-         if (PTR_BYTE_POS (d) >= PT_BYTE)
-           goto fail;
-         break;
-
-       case at_dot:
-         DEBUG_PRINT1 ("EXECUTING at_dot.\n");
-         if (PTR_BYTE_POS (d) != PT_BYTE)
-           goto fail;
-         break;
-
-       case after_dot:
-         DEBUG_PRINT1 ("EXECUTING after_dot.\n");
-         if (PTR_BYTE_POS (d) <= PT_BYTE)
-           goto fail;
-         break;
-
-       case categoryspec:
-       case notcategoryspec:
-         not = (re_opcode_t) *(p - 1) == notcategoryspec;
-         mcnt = *p++;
-         DEBUG_PRINT3 ("EXECUTING %scategoryspec %d.\n", not?"not":"", mcnt);
-         PREFETCH ();
-         {
-           int len;
-           re_wchar_t c;
-
-           c = RE_STRING_CHAR_AND_LENGTH (d, dend - d, len);
-
-           if ((!CHAR_HAS_CATEGORY (c, mcnt)) ^ not)
-             goto fail;
-           d += len;
-         }
-         break;
-
-#endif /* emacs */
-
-       default:
-         abort ();
-       }
-      continue;  /* Successfully executed one pattern command; keep going.  */
-
-
-    /* We goto here if a matching operation fails. */
-    fail:
-      IMMEDIATE_QUIT_CHECK;
-      if (!FAIL_STACK_EMPTY ())
-       {
-         re_char *str, *pat;
-         /* A restart point is known.  Restore to that state.  */
-         DEBUG_PRINT1 ("\nFAIL:\n");
-         POP_FAILURE_POINT (str, pat);
-         switch (SWITCH_ENUM_CAST ((re_opcode_t) *pat++))
-           {
-           case on_failure_keep_string_jump:
-             assert (str == NULL);
-             goto continue_failure_jump;
-
-           case on_failure_jump_nastyloop:
-             assert ((re_opcode_t)pat[-2] == no_op);
-             PUSH_FAILURE_POINT (pat - 2, str);
-             /* Fallthrough */
-
-           case on_failure_jump_loop:
-           case on_failure_jump:
-           case succeed_n:
-             d = str;
-           continue_failure_jump:
-             EXTRACT_NUMBER_AND_INCR (mcnt, pat);
-             p = pat + mcnt;
-             break;
-
-           case no_op:
-             /* A special frame used for nastyloops. */
-             goto fail;
-
-           default:
-             abort();
-           }
-
-         assert (p >= bufp->buffer && p <= pend);
-
-         if (d >= string1 && d <= end1)
-           dend = end_match_1;
-       }
-      else
-       break;   /* Matching at this starting point really fails.  */
-    } /* for (;;) */
-
-  if (best_regs_set)
-    goto restore_best_regs;
-
-  FREE_VARIABLES ();
-
-  return -1;                           /* Failure to match.  */
-} /* re_match_2 */
-\f
-/* Subroutine definitions for re_match_2.  */
-
-/* Return zero if TRANSLATE[S1] and TRANSLATE[S2] are identical for LEN
-   bytes; nonzero otherwise.  */
-
-static int
-bcmp_translate (s1, s2, len, translate, multibyte)
-     re_char *s1, *s2;
-     register int len;
-     RE_TRANSLATE_TYPE translate;
-     const int multibyte;
-{
-  register re_char *p1 = s1, *p2 = s2;
-  re_char *p1_end = s1 + len;
-  re_char *p2_end = s2 + len;
-
-  /* FIXME: Checking both p1 and p2 presumes that the two strings might have
-     different lengths, but relying on a single `len' would break this. -sm  */
-  while (p1 < p1_end && p2 < p2_end)
-    {
-      int p1_charlen, p2_charlen;
-      re_wchar_t p1_ch, p2_ch;
-
-      p1_ch = RE_STRING_CHAR_AND_LENGTH (p1, p1_end - p1, p1_charlen);
-      p2_ch = RE_STRING_CHAR_AND_LENGTH (p2, p2_end - p2, p2_charlen);
-
-      if (RE_TRANSLATE (translate, p1_ch)
-         != RE_TRANSLATE (translate, p2_ch))
-       return 1;
-
-      p1 += p1_charlen, p2 += p2_charlen;
-    }
-
-  if (p1 != p1_end || p2 != p2_end)
-    return 1;
-
-  return 0;
-}
-\f
-/* Entry points for GNU code.  */
-
-/* re_compile_pattern is the GNU regular expression compiler: it
-   compiles PATTERN (of length SIZE) and puts the result in BUFP.
-   Returns 0 if the pattern was valid, otherwise an error string.
-
-   Assumes the `allocated' (and perhaps `buffer') and `translate' fields
-   are set in BUFP on entry.
-
-   We call regex_compile to do the actual compilation.  */
-
-const char *
-re_compile_pattern (pattern, length, bufp)
-     const char *pattern;
-     size_t length;
-     struct re_pattern_buffer *bufp;
-{
-  reg_errcode_t ret;
-
-  /* GNU code is written to assume at least RE_NREGS registers will be set
-     (and at least one extra will be -1).  */
-  bufp->regs_allocated = REGS_UNALLOCATED;
-
-  /* And GNU code determines whether or not to get register information
-     by passing null for the REGS argument to re_match, etc., not by
-     setting no_sub.  */
-  bufp->no_sub = 0;
-
-  ret = regex_compile ((re_char*) pattern, length, re_syntax_options, bufp);
-
-  if (!ret)
-    return NULL;
-  return gettext (re_error_msgid[(int) ret]);
-}
-WEAK_ALIAS (__re_compile_pattern, re_compile_pattern)
-\f
-/* Entry points compatible with 4.2 BSD regex library.  We don't define
-   them unless specifically requested.  */
-
-#if defined _REGEX_RE_COMP || defined _LIBC
-
-/* BSD has one and only one pattern buffer.  */
-static struct re_pattern_buffer re_comp_buf;
-
-char *
-# ifdef _LIBC
-/* Make these definitions weak in libc, so POSIX programs can redefine
-   these names if they don't use our functions, and still use
-   regcomp/regexec below without link errors.  */
-weak_function
-# endif
-re_comp (s)
-    const char *s;
-{
-  reg_errcode_t ret;
-
-  if (!s)
-    {
-      if (!re_comp_buf.buffer)
-       /* Yes, we're discarding `const' here if !HAVE_LIBINTL.  */
-       return (char *) gettext ("No previous regular expression");
-      return 0;
-    }
-
-  if (!re_comp_buf.buffer)
-    {
-      re_comp_buf.buffer = (unsigned char *) malloc (200);
-      if (re_comp_buf.buffer == NULL)
-       /* Yes, we're discarding `const' here if !HAVE_LIBINTL.  */
-       return (char *) gettext (re_error_msgid[(int) REG_ESPACE]);
-      re_comp_buf.allocated = 200;
-
-      re_comp_buf.fastmap = (char *) malloc (1 << BYTEWIDTH);
-      if (re_comp_buf.fastmap == NULL)
-       /* Yes, we're discarding `const' here if !HAVE_LIBINTL.  */
-       return (char *) gettext (re_error_msgid[(int) REG_ESPACE]);
-    }
-
-  /* Since `re_exec' always passes NULL for the `regs' argument, we
-     don't need to initialize the pattern buffer fields which affect it.  */
-
-  ret = regex_compile (s, strlen (s), re_syntax_options, &re_comp_buf);
-
-  if (!ret)
-    return NULL;
-
-  /* Yes, we're discarding `const' here if !HAVE_LIBINTL.  */
-  return (char *) gettext (re_error_msgid[(int) ret]);
-}
-
-
-int
-# ifdef _LIBC
-weak_function
-# endif
-re_exec (s)
-    const char *s;
-{
-  const int len = strlen (s);
-  return
-    0 <= re_search (&re_comp_buf, s, len, 0, len, (struct re_registers *) 0);
-}
-#endif /* _REGEX_RE_COMP */
-\f
-/* POSIX.2 functions.  Don't define these for Emacs.  */
-
-#ifndef emacs
-
-/* regcomp takes a regular expression as a string and compiles it.
-
-   PREG is a regex_t *.  We do not expect any fields to be initialized,
-   since POSIX says we shouldn't.  Thus, we set
-
-     `buffer' to the compiled pattern;
-     `used' to the length of the compiled pattern;
-     `syntax' to RE_SYNTAX_POSIX_EXTENDED if the
-       REG_EXTENDED bit in CFLAGS is set; otherwise, to
-       RE_SYNTAX_POSIX_BASIC;
-     `fastmap' to an allocated space for the fastmap;
-     `fastmap_accurate' to zero;
-     `re_nsub' to the number of subexpressions in PATTERN.
-
-   PATTERN is the address of the pattern string.
-
-   CFLAGS is a series of bits which affect compilation.
-
-     If REG_EXTENDED is set, we use POSIX extended syntax; otherwise, we
-     use POSIX basic syntax.
-
-     If REG_NEWLINE is set, then . and [^...] don't match newline.
-     Also, regexec will try a match beginning after every newline.
-
-     If REG_ICASE is set, then we considers upper- and lowercase
-     versions of letters to be equivalent when matching.
-
-     If REG_NOSUB is set, then when PREG is passed to regexec, that
-     routine will report only success or failure, and nothing about the
-     registers.
-
-   It returns 0 if it succeeds, nonzero if it doesn't.  (See regex.h for
-   the return codes and their meanings.)  */
-
-int
-regcomp (preg, pattern, cflags)
-    regex_t *__restrict preg;
-    const char *__restrict pattern;
-    int cflags;
-{
-  reg_errcode_t ret;
-  reg_syntax_t syntax
-    = (cflags & REG_EXTENDED) ?
-      RE_SYNTAX_POSIX_EXTENDED : RE_SYNTAX_POSIX_BASIC;
-
-  /* regex_compile will allocate the space for the compiled pattern.  */
-  preg->buffer = 0;
-  preg->allocated = 0;
-  preg->used = 0;
-
-  /* Try to allocate space for the fastmap.  */
-  preg->fastmap = (char *) malloc (1 << BYTEWIDTH);
-
-  if (cflags & REG_ICASE)
-    {
-      unsigned i;
-
-      preg->translate
-       = (RE_TRANSLATE_TYPE) malloc (CHAR_SET_SIZE
-                                     * sizeof (*(RE_TRANSLATE_TYPE)0));
-      if (preg->translate == NULL)
-       return (int) REG_ESPACE;
-
-      /* Map uppercase characters to corresponding lowercase ones.  */
-      for (i = 0; i < CHAR_SET_SIZE; i++)
-       preg->translate[i] = ISUPPER (i) ? TOLOWER (i) : i;
-    }
-  else
-    preg->translate = NULL;
-
-  /* If REG_NEWLINE is set, newlines are treated differently.  */
-  if (cflags & REG_NEWLINE)
-    { /* REG_NEWLINE implies neither . nor [^...] match newline.  */
-      syntax &= ~RE_DOT_NEWLINE;
-      syntax |= RE_HAT_LISTS_NOT_NEWLINE;
-    }
-  else
-    syntax |= RE_NO_NEWLINE_ANCHOR;
-
-  preg->no_sub = !!(cflags & REG_NOSUB);
-
-  /* POSIX says a null character in the pattern terminates it, so we
-     can use strlen here in compiling the pattern.  */
-  ret = regex_compile ((re_char*) pattern, strlen (pattern), syntax, preg);
-
-  /* POSIX doesn't distinguish between an unmatched open-group and an
-     unmatched close-group: both are REG_EPAREN.  */
-  if (ret == REG_ERPAREN)
-    ret = REG_EPAREN;
-
-  if (ret == REG_NOERROR && preg->fastmap)
-    { /* Compute the fastmap now, since regexec cannot modify the pattern
-        buffer.  */
-      re_compile_fastmap (preg);
-      if (preg->can_be_null)
-       { /* The fastmap can't be used anyway.  */
-         free (preg->fastmap);
-         preg->fastmap = NULL;
-       }
-    }
-  return (int) ret;
-}
-WEAK_ALIAS (__regcomp, regcomp)
-
-
-/* regexec searches for a given pattern, specified by PREG, in the
-   string STRING.
-
-   If NMATCH is zero or REG_NOSUB was set in the cflags argument to
-   `regcomp', we ignore PMATCH.  Otherwise, we assume PMATCH has at
-   least NMATCH elements, and we set them to the offsets of the
-   corresponding matched substrings.
-
-   EFLAGS specifies `execution flags' which affect matching: if
-   REG_NOTBOL is set, then ^ does not match at the beginning of the
-   string; if REG_NOTEOL is set, then $ does not match at the end.
-
-   We return 0 if we find a match and REG_NOMATCH if not.  */
-
-int
-regexec (preg, string, nmatch, pmatch, eflags)
-    const regex_t *__restrict preg;
-    const char *__restrict string;
-    size_t nmatch;
-    regmatch_t pmatch[__restrict_arr];
-    int eflags;
-{
-  int ret;
-  struct re_registers regs;
-  regex_t private_preg;
-  int len = strlen (string);
-  boolean want_reg_info = !preg->no_sub && nmatch > 0 && pmatch;
-
-  private_preg = *preg;
-
-  private_preg.not_bol = !!(eflags & REG_NOTBOL);
-  private_preg.not_eol = !!(eflags & REG_NOTEOL);
-
-  /* The user has told us exactly how many registers to return
-     information about, via `nmatch'.  We have to pass that on to the
-     matching routines.  */
-  private_preg.regs_allocated = REGS_FIXED;
-
-  if (want_reg_info)
-    {
-      regs.num_regs = nmatch;
-      regs.start = TALLOC (nmatch * 2, regoff_t);
-      if (regs.start == NULL)
-       return (int) REG_NOMATCH;
-      regs.end = regs.start + nmatch;
-    }
-
-  /* Instead of using not_eol to implement REG_NOTEOL, we could simply
-     pass (&private_preg, string, len + 1, 0, len, ...) pretending the string
-     was a little bit longer but still only matching the real part.
-     This works because the `endline' will check for a '\n' and will find a
-     '\0', correctly deciding that this is not the end of a line.
-     But it doesn't work out so nicely for REG_NOTBOL, since we don't have
-     a convenient '\0' there.  For all we know, the string could be preceded
-     by '\n' which would throw things off.  */
-
-  /* Perform the searching operation.  */
-  ret = re_search (&private_preg, string, len,
-                  /* start: */ 0, /* range: */ len,
-                  want_reg_info ? &regs : (struct re_registers *) 0);
-
-  /* Copy the register information to the POSIX structure.  */
-  if (want_reg_info)
-    {
-      if (ret >= 0)
-       {
-         unsigned r;
-
-         for (r = 0; r < nmatch; r++)
-           {
-             pmatch[r].rm_so = regs.start[r];
-             pmatch[r].rm_eo = regs.end[r];
-           }
-       }
-
-      /* If we needed the temporary register info, free the space now.  */
-      free (regs.start);
-    }
-
-  /* We want zero return to mean success, unlike `re_search'.  */
-  return ret >= 0 ? (int) REG_NOERROR : (int) REG_NOMATCH;
-}
-WEAK_ALIAS (__regexec, regexec)
-
-
-/* Returns a message corresponding to an error code, ERRCODE, returned
-   from either regcomp or regexec.   We don't use PREG here.  */
-
-size_t
-regerror (errcode, preg, errbuf, errbuf_size)
-    int errcode;
-    const regex_t *preg;
-    char *errbuf;
-    size_t errbuf_size;
-{
-  const char *msg;
-  size_t msg_size;
-
-  if (errcode < 0
-      || errcode >= (sizeof (re_error_msgid) / sizeof (re_error_msgid[0])))
-    /* Only error codes returned by the rest of the code should be passed
-       to this routine.  If we are given anything else, or if other regex
-       code generates an invalid error code, then the program has a bug.
-       Dump core so we can fix it.  */
-    abort ();
-
-  msg = gettext (re_error_msgid[errcode]);
-
-  msg_size = strlen (msg) + 1; /* Includes the null.  */
-
-  if (errbuf_size != 0)
-    {
-      if (msg_size > errbuf_size)
-       {
-         strncpy (errbuf, msg, errbuf_size - 1);
-         errbuf[errbuf_size - 1] = 0;
-       }
-      else
-       strcpy (errbuf, msg);
-    }
-
-  return msg_size;
-}
-WEAK_ALIAS (__regerror, regerror)
-
-
-/* Free dynamically allocated space used by PREG.  */
-
-void
-regfree (preg)
-    regex_t *preg;
-{
-  if (preg->buffer != NULL)
-    free (preg->buffer);
-  preg->buffer = NULL;
-
-  preg->allocated = 0;
-  preg->used = 0;
-
-  if (preg->fastmap != NULL)
-    free (preg->fastmap);
-  preg->fastmap = NULL;
-  preg->fastmap_accurate = 0;
-
-  if (preg->translate != NULL)
-    free (preg->translate);
-  preg->translate = NULL;
-}
-WEAK_ALIAS (__regfree, regfree)
-
-#endif /* not emacs  */
-
-/* arch-tag: 4ffd68ba-2a9e-435b-a21a-018990f9eeb2
-   (do not change this comment) */
diff --git a/regex.h b/regex.h
deleted file mode 100644 (file)
index 1818d5f..0000000
--- a/regex.h
+++ /dev/null
@@ -1,576 +0,0 @@
-/* Definitions for data structures and routines for the regular
-   expression library, version 0.12.
-
-   Copyright (C) 1985,89,90,91,92,93,95,2000 Free Software Foundation, Inc.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-   USA.  */
-
-#ifndef _REGEX_H
-#define _REGEX_H 1
-
-/* Allow the use in C++ code.  */
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* POSIX says that <sys/types.h> must be included (by the caller) before
-   <regex.h>.  */
-
-#if !defined _POSIX_C_SOURCE && !defined _POSIX_SOURCE && defined VMS
-/* VMS doesn't have `size_t' in <sys/types.h>, even though POSIX says it
-   should be there.  */
-# include <stddef.h>
-#endif
-
-/* The following bits are used to determine the regexp syntax we
-   recognize.  The set/not-set meanings where historically chosen so
-   that Emacs syntax had the value 0.
-   The bits are given in alphabetical order, and
-   the definitions shifted by one from the previous bit; thus, when we
-   add or remove a bit, only one other definition need change.  */
-typedef unsigned long int reg_syntax_t;
-
-/* If this bit is not set, then \ inside a bracket expression is literal.
-   If set, then such a \ quotes the following character.  */
-#define RE_BACKSLASH_ESCAPE_IN_LISTS ((unsigned long int) 1)
-
-/* If this bit is not set, then + and ? are operators, and \+ and \? are
-     literals.
-   If set, then \+ and \? are operators and + and ? are literals.  */
-#define RE_BK_PLUS_QM (RE_BACKSLASH_ESCAPE_IN_LISTS << 1)
-
-/* If this bit is set, then character classes are supported.  They are:
-     [:alpha:], [:upper:], [:lower:],  [:digit:], [:alnum:], [:xdigit:],
-     [:space:], [:print:], [:punct:], [:graph:], and [:cntrl:].
-   If not set, then character classes are not supported.  */
-#define RE_CHAR_CLASSES (RE_BK_PLUS_QM << 1)
-
-/* If this bit is set, then ^ and $ are always anchors (outside bracket
-     expressions, of course).
-   If this bit is not set, then it depends:
-        ^  is an anchor if it is at the beginning of a regular
-           expression or after an open-group or an alternation operator;
-        $  is an anchor if it is at the end of a regular expression, or
-           before a close-group or an alternation operator.
-
-   This bit could be (re)combined with RE_CONTEXT_INDEP_OPS, because
-   POSIX draft 11.2 says that * etc. in leading positions is undefined.
-   We already implemented a previous draft which made those constructs
-   invalid, though, so we haven't changed the code back.  */
-#define RE_CONTEXT_INDEP_ANCHORS (RE_CHAR_CLASSES << 1)
-
-/* If this bit is set, then special characters are always special
-     regardless of where they are in the pattern.
-   If this bit is not set, then special characters are special only in
-     some contexts; otherwise they are ordinary.  Specifically,
-     * + ? and intervals are only special when not after the beginning,
-     open-group, or alternation operator.  */
-#define RE_CONTEXT_INDEP_OPS (RE_CONTEXT_INDEP_ANCHORS << 1)
-
-/* If this bit is set, then *, +, ?, and { cannot be first in an re or
-     immediately after an alternation or begin-group operator.  */
-#define RE_CONTEXT_INVALID_OPS (RE_CONTEXT_INDEP_OPS << 1)
-
-/* If this bit is set, then . matches newline.
-   If not set, then it doesn't.  */
-#define RE_DOT_NEWLINE (RE_CONTEXT_INVALID_OPS << 1)
-
-/* If this bit is set, then . doesn't match NUL.
-   If not set, then it does.  */
-#define RE_DOT_NOT_NULL (RE_DOT_NEWLINE << 1)
-
-/* If this bit is set, nonmatching lists [^...] do not match newline.
-   If not set, they do.  */
-#define RE_HAT_LISTS_NOT_NEWLINE (RE_DOT_NOT_NULL << 1)
-
-/* If this bit is set, either \{...\} or {...} defines an
-     interval, depending on RE_NO_BK_BRACES.
-   If not set, \{, \}, {, and } are literals.  */
-#define RE_INTERVALS (RE_HAT_LISTS_NOT_NEWLINE << 1)
-
-/* If this bit is set, +, ? and | aren't recognized as operators.
-   If not set, they are.  */
-#define RE_LIMITED_OPS (RE_INTERVALS << 1)
-
-/* If this bit is set, newline is an alternation operator.
-   If not set, newline is literal.  */
-#define RE_NEWLINE_ALT (RE_LIMITED_OPS << 1)
-
-/* If this bit is set, then `{...}' defines an interval, and \{ and \}
-     are literals.
-  If not set, then `\{...\}' defines an interval.  */
-#define RE_NO_BK_BRACES (RE_NEWLINE_ALT << 1)
-
-/* If this bit is set, (...) defines a group, and \( and \) are literals.
-   If not set, \(...\) defines a group, and ( and ) are literals.  */
-#define RE_NO_BK_PARENS (RE_NO_BK_BRACES << 1)
-
-/* If this bit is set, then \<digit> matches <digit>.
-   If not set, then \<digit> is a back-reference.  */
-#define RE_NO_BK_REFS (RE_NO_BK_PARENS << 1)
-
-/* If this bit is set, then | is an alternation operator, and \| is literal.
-   If not set, then \| is an alternation operator, and | is literal.  */
-#define RE_NO_BK_VBAR (RE_NO_BK_REFS << 1)
-
-/* If this bit is set, then an ending range point collating higher
-     than the starting range point, as in [z-a], is invalid.
-   If not set, then when ending range point collates higher than the
-     starting range point, the range is ignored.  */
-#define RE_NO_EMPTY_RANGES (RE_NO_BK_VBAR << 1)
-
-/* If this bit is set, then an unmatched ) is ordinary.
-   If not set, then an unmatched ) is invalid.  */
-#define RE_UNMATCHED_RIGHT_PAREN_ORD (RE_NO_EMPTY_RANGES << 1)
-
-/* If this bit is set, succeed as soon as we match the whole pattern,
-   without further backtracking.  */
-#define RE_NO_POSIX_BACKTRACKING (RE_UNMATCHED_RIGHT_PAREN_ORD << 1)
-
-/* If this bit is set, do not process the GNU regex operators.
-   If not set, then the GNU regex operators are recognized. */
-#define RE_NO_GNU_OPS (RE_NO_POSIX_BACKTRACKING << 1)
-
-/* If this bit is set, then *?, +? and ?? match non greedily. */
-#define RE_FRUGAL (RE_NO_GNU_OPS << 1)
-
-/* If this bit is set, then (?:...) is treated as a shy group.  */
-#define RE_SHY_GROUPS (RE_FRUGAL << 1)
-
-/* If this bit is set, ^ and $ only match at beg/end of buffer.  */
-#define RE_NO_NEWLINE_ANCHOR (RE_SHY_GROUPS << 1)
-
-/* If this bit is set, turn on internal regex debugging.
-   If not set, and debugging was on, turn it off.
-   This only works if regex.c is compiled -DDEBUG.
-   We define this bit always, so that all that's needed to turn on
-   debugging is to recompile regex.c; the calling code can always have
-   this bit set, and it won't affect anything in the normal case. */
-#define RE_DEBUG (RE_NO_NEWLINE_ANCHOR << 1)
-
-/* This global variable defines the particular regexp syntax to use (for
-   some interfaces).  When a regexp is compiled, the syntax used is
-   stored in the pattern buffer, so changing this does not affect
-   already-compiled regexps.  */
-extern reg_syntax_t re_syntax_options;
-
-#ifdef emacs
-/* In Emacs, this is the string or buffer in which we
-   are matching.  It is used for looking up syntax properties.  */
-extern Lisp_Object re_match_object;
-#endif
-
-\f
-/* Define combinations of the above bits for the standard possibilities.
-   (The [[[ comments delimit what gets put into the Texinfo file, so
-   don't delete them!)  */
-/* [[[begin syntaxes]]] */
-#define RE_SYNTAX_EMACS                                                        \
-  (RE_CHAR_CLASSES | RE_INTERVALS | RE_SHY_GROUPS | RE_FRUGAL)
-
-#define RE_SYNTAX_AWK                                                  \
-  (RE_BACKSLASH_ESCAPE_IN_LISTS   | RE_DOT_NOT_NULL                    \
-   | RE_NO_BK_PARENS              | RE_NO_BK_REFS                      \
-   | RE_NO_BK_VBAR                | RE_NO_EMPTY_RANGES                 \
-   | RE_DOT_NEWLINE              | RE_CONTEXT_INDEP_ANCHORS            \
-   | RE_UNMATCHED_RIGHT_PAREN_ORD | RE_NO_GNU_OPS)
-
-#define RE_SYNTAX_GNU_AWK                                              \
-  ((RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DEBUG)        \
-   & ~(RE_DOT_NOT_NULL | RE_INTERVALS | RE_CONTEXT_INDEP_OPS))
-
-#define RE_SYNTAX_POSIX_AWK                                            \
-  (RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS             \
-   | RE_INTERVALS          | RE_NO_GNU_OPS)
-
-#define RE_SYNTAX_GREP                                                 \
-  (RE_BK_PLUS_QM              | RE_CHAR_CLASSES                                \
-   | RE_HAT_LISTS_NOT_NEWLINE | RE_INTERVALS                           \
-   | RE_NEWLINE_ALT)
-
-#define RE_SYNTAX_EGREP                                                        \
-  (RE_CHAR_CLASSES        | RE_CONTEXT_INDEP_ANCHORS                   \
-   | RE_CONTEXT_INDEP_OPS | RE_HAT_LISTS_NOT_NEWLINE                   \
-   | RE_NEWLINE_ALT       | RE_NO_BK_PARENS                            \
-   | RE_NO_BK_VBAR)
-
-#define RE_SYNTAX_POSIX_EGREP                                          \
-  (RE_SYNTAX_EGREP | RE_INTERVALS | RE_NO_BK_BRACES)
-
-/* P1003.2/D11.2, section 4.20.7.1, lines 5078ff.  */
-#define RE_SYNTAX_ED RE_SYNTAX_POSIX_BASIC
-
-#define RE_SYNTAX_SED RE_SYNTAX_POSIX_BASIC
-
-/* Syntax bits common to both basic and extended POSIX regex syntax.  */
-#define _RE_SYNTAX_POSIX_COMMON                                                \
-  (RE_CHAR_CLASSES | RE_DOT_NEWLINE      | RE_DOT_NOT_NULL             \
-   | RE_INTERVALS  | RE_NO_EMPTY_RANGES)
-
-#define RE_SYNTAX_POSIX_BASIC                                          \
-  (_RE_SYNTAX_POSIX_COMMON | RE_BK_PLUS_QM)
-
-/* Differs from ..._POSIX_BASIC only in that RE_BK_PLUS_QM becomes
-   RE_LIMITED_OPS, i.e., \? \+ \| are not recognized.  Actually, this
-   isn't minimal, since other operators, such as \`, aren't disabled.  */
-#define RE_SYNTAX_POSIX_MINIMAL_BASIC                                  \
-  (_RE_SYNTAX_POSIX_COMMON | RE_LIMITED_OPS)
-
-#define RE_SYNTAX_POSIX_EXTENDED                                       \
-  (_RE_SYNTAX_POSIX_COMMON  | RE_CONTEXT_INDEP_ANCHORS                 \
-   | RE_CONTEXT_INDEP_OPS   | RE_NO_BK_BRACES                          \
-   | RE_NO_BK_PARENS        | RE_NO_BK_VBAR                            \
-   | RE_CONTEXT_INVALID_OPS | RE_UNMATCHED_RIGHT_PAREN_ORD)
-
-/* Differs from ..._POSIX_EXTENDED in that RE_CONTEXT_INDEP_OPS is
-   removed and RE_NO_BK_REFS is added.  */
-#define RE_SYNTAX_POSIX_MINIMAL_EXTENDED                               \
-  (_RE_SYNTAX_POSIX_COMMON  | RE_CONTEXT_INDEP_ANCHORS                 \
-   | RE_CONTEXT_INVALID_OPS | RE_NO_BK_BRACES                          \
-   | RE_NO_BK_PARENS        | RE_NO_BK_REFS                            \
-   | RE_NO_BK_VBAR         | RE_UNMATCHED_RIGHT_PAREN_ORD)
-/* [[[end syntaxes]]] */
-\f
-/* Maximum number of duplicates an interval can allow.  Some systems
-   (erroneously) define this in other header files, but we want our
-   value, so remove any previous define.  */
-#ifdef RE_DUP_MAX
-# undef RE_DUP_MAX
-#endif
-/* If sizeof(int) == 2, then ((1 << 15) - 1) overflows.  */
-#define RE_DUP_MAX (0x7fff)
-
-
-/* POSIX `cflags' bits (i.e., information for `regcomp').  */
-
-/* If this bit is set, then use extended regular expression syntax.
-   If not set, then use basic regular expression syntax.  */
-#define REG_EXTENDED 1
-
-/* If this bit is set, then ignore case when matching.
-   If not set, then case is significant.  */
-#define REG_ICASE (REG_EXTENDED << 1)
-
-/* If this bit is set, then anchors do not match at newline
-     characters in the string.
-   If not set, then anchors do match at newlines.  */
-#define REG_NEWLINE (REG_ICASE << 1)
-
-/* If this bit is set, then report only success or fail in regexec.
-   If not set, then returns differ between not matching and errors.  */
-#define REG_NOSUB (REG_NEWLINE << 1)
-
-
-/* POSIX `eflags' bits (i.e., information for regexec).  */
-
-/* If this bit is set, then the beginning-of-line operator doesn't match
-     the beginning of the string (presumably because it's not the
-     beginning of a line).
-   If not set, then the beginning-of-line operator does match the
-     beginning of the string.  */
-#define REG_NOTBOL 1
-
-/* Like REG_NOTBOL, except for the end-of-line.  */
-#define REG_NOTEOL (1 << 1)
-
-
-/* If any error codes are removed, changed, or added, update the
-   `re_error_msg' table in regex.c.  */
-typedef enum
-{
-#ifdef _XOPEN_SOURCE
-  REG_ENOSYS = -1,     /* This will never happen for this implementation.  */
-#endif
-
-  REG_NOERROR = 0,     /* Success.  */
-  REG_NOMATCH,         /* Didn't find a match (for regexec).  */
-
-  /* POSIX regcomp return error codes.  (In the order listed in the
-     standard.)  */
-  REG_BADPAT,          /* Invalid pattern.  */
-  REG_ECOLLATE,                /* Not implemented.  */
-  REG_ECTYPE,          /* Invalid character class name.  */
-  REG_EESCAPE,         /* Trailing backslash.  */
-  REG_ESUBREG,         /* Invalid back reference.  */
-  REG_EBRACK,          /* Unmatched left bracket.  */
-  REG_EPAREN,          /* Parenthesis imbalance.  */
-  REG_EBRACE,          /* Unmatched \{.  */
-  REG_BADBR,           /* Invalid contents of \{\}.  */
-  REG_ERANGE,          /* Invalid range end.  */
-  REG_ESPACE,          /* Ran out of memory.  */
-  REG_BADRPT,          /* No preceding re for repetition op.  */
-
-  /* Error codes we've added.  */
-  REG_EEND,            /* Premature end.  */
-  REG_ESIZE,           /* Compiled pattern bigger than 2^16 bytes.  */
-  REG_ERPAREN          /* Unmatched ) or \); not returned from regcomp.  */
-} reg_errcode_t;
-\f
-/* This data structure represents a compiled pattern.  Before calling
-   the pattern compiler, the fields `buffer', `allocated', `fastmap',
-   `translate', and `no_sub' can be set.  After the pattern has been
-   compiled, the `re_nsub' field is available.  All other fields are
-   private to the regex routines.  */
-
-#ifndef RE_TRANSLATE_TYPE
-# define RE_TRANSLATE_TYPE char *
-#endif
-
-struct re_pattern_buffer
-{
-/* [[[begin pattern_buffer]]] */
-       /* Space that holds the compiled pattern.  It is declared as
-          `unsigned char *' because its elements are
-           sometimes used as array indexes.  */
-  unsigned char *buffer;
-
-       /* Number of bytes to which `buffer' points.  */
-  size_t allocated;
-
-       /* Number of bytes actually used in `buffer'.  */
-  size_t used;
-
-        /* Syntax setting with which the pattern was compiled.  */
-  reg_syntax_t syntax;
-
-        /* Pointer to a fastmap, if any, otherwise zero.  re_search uses
-           the fastmap, if there is one, to skip over impossible
-           starting points for matches.  */
-  char *fastmap;
-
-        /* Either a translate table to apply to all characters before
-           comparing them, or zero for no translation.  The translation
-           is applied to a pattern when it is compiled and to a string
-           when it is matched.  */
-  RE_TRANSLATE_TYPE translate;
-
-       /* Number of subexpressions found by the compiler.  */
-  size_t re_nsub;
-
-        /* Zero if this pattern cannot match the empty string, one else.
-           Well, in truth it's used only in `re_search_2', to see
-           whether or not we should use the fastmap, so we don't set
-           this absolutely perfectly; see `re_compile_fastmap'.  */
-  unsigned can_be_null : 1;
-
-        /* If REGS_UNALLOCATED, allocate space in the `regs' structure
-             for `max (RE_NREGS, re_nsub + 1)' groups.
-           If REGS_REALLOCATE, reallocate space if necessary.
-           If REGS_FIXED, use what's there.  */
-#define REGS_UNALLOCATED 0
-#define REGS_REALLOCATE 1
-#define REGS_FIXED 2
-  unsigned regs_allocated : 2;
-
-        /* Set to zero when `regex_compile' compiles a pattern; set to one
-           by `re_compile_fastmap' if it updates the fastmap.  */
-  unsigned fastmap_accurate : 1;
-
-        /* If set, `re_match_2' does not return information about
-           subexpressions.  */
-  unsigned no_sub : 1;
-
-        /* If set, a beginning-of-line anchor doesn't match at the
-           beginning of the string.  */
-  unsigned not_bol : 1;
-
-        /* Similarly for an end-of-line anchor.  */
-  unsigned not_eol : 1;
-
-#ifdef emacs
-  /* If true, multi-byte form in the `buffer' should be recognized as a
-     multibyte character. */
-  unsigned multibyte : 1;
-#endif
-
-/* [[[end pattern_buffer]]] */
-};
-
-typedef struct re_pattern_buffer regex_t;
-\f
-/* Type for byte offsets within the string.  POSIX mandates this.  */
-typedef int regoff_t;
-
-
-/* This is the structure we store register match data in.  See
-   regex.texinfo for a full description of what registers match.  */
-struct re_registers
-{
-  unsigned num_regs;
-  regoff_t *start;
-  regoff_t *end;
-};
-
-
-/* If `regs_allocated' is REGS_UNALLOCATED in the pattern buffer,
-   `re_match_2' returns information about at least this many registers
-   the first time a `regs' structure is passed.  */
-#ifndef RE_NREGS
-# define RE_NREGS 30
-#endif
-
-
-/* POSIX specification for registers.  Aside from the different names than
-   `re_registers', POSIX uses an array of structures, instead of a
-   structure of arrays.  */
-typedef struct
-{
-  regoff_t rm_so;  /* Byte offset from string's start to substring's start.  */
-  regoff_t rm_eo;  /* Byte offset from string's start to substring's end.  */
-} regmatch_t;
-\f
-/* Declarations for routines.  */
-
-/* To avoid duplicating every routine declaration -- once with a
-   prototype (if we are ANSI), and once without (if we aren't) -- we
-   use the following macro to declare argument types.  This
-   unfortunately clutters up the declarations a bit, but I think it's
-   worth it.  */
-
-#if defined __STDC__ || defined PROTOTYPES
-
-# define _RE_ARGS(args) args
-
-#else /* not __STDC__  || PROTOTYPES */
-
-# define _RE_ARGS(args) ()
-
-#endif /* not __STDC__  || PROTOTYPES */
-
-/* Sets the current default syntax to SYNTAX, and return the old syntax.
-   You can also simply assign to the `re_syntax_options' variable.  */
-extern reg_syntax_t re_set_syntax _RE_ARGS ((reg_syntax_t syntax));
-
-/* Compile the regular expression PATTERN, with length LENGTH
-   and syntax given by the global `re_syntax_options', into the buffer
-   BUFFER.  Return NULL if successful, and an error string if not.  */
-extern const char *re_compile_pattern
-  _RE_ARGS ((const char *pattern, size_t length,
-             struct re_pattern_buffer *buffer));
-
-
-/* Compile a fastmap for the compiled pattern in BUFFER; used to
-   accelerate searches.  Return 0 if successful and -2 if was an
-   internal error.  */
-extern int re_compile_fastmap _RE_ARGS ((struct re_pattern_buffer *buffer));
-
-
-/* Search in the string STRING (with length LENGTH) for the pattern
-   compiled into BUFFER.  Start searching at position START, for RANGE
-   characters.  Return the starting position of the match, -1 for no
-   match, or -2 for an internal error.  Also return register
-   information in REGS (if REGS and BUFFER->no_sub are nonzero).  */
-extern int re_search
-  _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string,
-            int length, int start, int range, struct re_registers *regs));
-
-
-/* Like `re_search', but search in the concatenation of STRING1 and
-   STRING2.  Also, stop searching at index START + STOP.  */
-extern int re_search_2
-  _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string1,
-             int length1, const char *string2, int length2,
-             int start, int range, struct re_registers *regs, int stop));
-
-
-/* Like `re_search', but return how many characters in STRING the regexp
-   in BUFFER matched, starting at position START.  */
-extern int re_match
-  _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string,
-             int length, int start, struct re_registers *regs));
-
-
-/* Relates to `re_match' as `re_search_2' relates to `re_search'.  */
-extern int re_match_2
-  _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string1,
-             int length1, const char *string2, int length2,
-             int start, struct re_registers *regs, int stop));
-
-
-/* Set REGS to hold NUM_REGS registers, storing them in STARTS and
-   ENDS.  Subsequent matches using BUFFER and REGS will use this memory
-   for recording register information.  STARTS and ENDS must be
-   allocated with malloc, and must each be at least `NUM_REGS * sizeof
-   (regoff_t)' bytes long.
-
-   If NUM_REGS == 0, then subsequent matches should allocate their own
-   register data.
-
-   Unless this function is called, the first search or match using
-   PATTERN_BUFFER will allocate its own register data, without
-   freeing the old data.  */
-extern void re_set_registers
-  _RE_ARGS ((struct re_pattern_buffer *buffer, struct re_registers *regs,
-             unsigned num_regs, regoff_t *starts, regoff_t *ends));
-
-#if defined _REGEX_RE_COMP || defined _LIBC
-# ifndef _CRAY
-/* 4.2 bsd compatibility.  */
-extern char *re_comp _RE_ARGS ((const char *));
-extern int re_exec _RE_ARGS ((const char *));
-# endif
-#endif
-
-/* GCC 2.95 and later have "__restrict"; C99 compilers have
-   "restrict", and "configure" may have defined "restrict".  */
-#ifndef __restrict
-# if ! (2 < __GNUC__ || (2 == __GNUC__ && 95 <= __GNUC_MINOR__))
-#  if defined restrict || 199901L <= __STDC_VERSION__
-#   define __restrict restrict
-#  else
-#   define __restrict
-#  endif
-# endif
-#endif
-/* For now conditionally define __restrict_arr to expand to nothing.
-   Ideally we would have a test for the compiler which allows defining
-   it to restrict.  */
-#ifndef __restrict_arr
-# define __restrict_arr
-#endif
-
-/* POSIX compatibility.  */
-extern int regcomp _RE_ARGS ((regex_t *__restrict __preg,
-                             const char *__restrict __pattern,
-                             int __cflags));
-
-extern int regexec _RE_ARGS ((const regex_t *__restrict __preg,
-                             const char *__restrict __string, size_t __nmatch,
-                             regmatch_t __pmatch[__restrict_arr],
-                             int __eflags));
-
-extern size_t regerror _RE_ARGS ((int __errcode, const regex_t *__preg,
-                                 char *__errbuf, size_t __errbuf_size));
-
-extern void regfree _RE_ARGS ((regex_t *__preg));
-
-
-#ifdef __cplusplus
-}
-#endif /* C++ */
-
-#endif /* regex.h */
-\f
-/*
-Local variables:
-make-backup-files: t
-version-control: t
-trim-versions-without-asking: nil
-End:
-*/
-
-/* arch-tag: bda6e3ec-3c02-4237-a55a-01ad2e120083
-   (do not change this comment) */