annotate src/regex.c @ 16945:d6cd00b2e214

(isnan): Define even if LISP_FLOAT_TYPE is not defined, since fmod might need it. (fmod): Ensure that the magnitude of the result does not exceed that of the divisor, and that the sign of the result does not disagree with that of the dividend. This does not yield a particularly accurate result, but at least it will be in the range promised by fmod.
author Paul Eggert <eggert@twinsun.com>
date Tue, 28 Jan 1997 04:51:45 +0000
parents f47030b411f9
children a642c99198ec
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1 /* Extended regular expression matching and search library, version
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2 0.12. (Implements POSIX draft P10003.2/D11.2, except for
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
3 internationalization features.)
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
4
15285
c2b4f8533c55 Tue May 21 19:18:05 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
Roland McGrath <roland@gnu.org>
parents: 15224
diff changeset
5 Copyright (C) 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
1155
e356f6701b9e Initial revision
Karl Berry <karl@gnu.org>
parents:
diff changeset
6
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
7 This program is free software; you can redistribute it and/or modify
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
8 it under the terms of the GNU General Public License as published by
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
9 the Free Software Foundation; either version 2, or (at your option)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
10 any later version.
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
11
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
12 This program is distributed in the hope that it will be useful,
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
15 GNU General Public License for more details.
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
16
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
17 You should have received a copy of the GNU General Public License
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
18 along with this program; if not, write to the Free Software
14414
6e7bb4bd5010 Update FSF address in comment.
Karl Heuer <kwzh@gnu.org>
parents: 13722
diff changeset
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
20 USA. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
21
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
22 /* AIX requires this to be the first thing in the file. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
23 #if defined (_AIX) && !defined (REGEX_MALLOC)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
24 #pragma alloca
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
25 #endif
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
26
13517
e50cebfd1d7a (NUM_FAILURE_ITEMS, POP_FAILURE_POINT, PUSH_FAILURE_POINT):
Richard M. Stallman <rms@gnu.org>
parents: 13323
diff changeset
27 #undef _GNU_SOURCE
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
28 #define _GNU_SOURCE
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
29
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
30 #ifdef HAVE_CONFIG_H
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
31 #include <config.h>
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
32 #endif
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
33
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
34 /* We need this for `regex.h', and perhaps for the Emacs include files. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
35 #include <sys/types.h>
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
36
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
37 /* This is for other GNU distributions with internationalized messages. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
38 #if HAVE_LIBINTL_H || defined (_LIBC)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
39 # include <libintl.h>
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
40 #else
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
41 # define gettext(msgid) (msgid)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
42 #endif
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
43
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
44 #ifndef gettext_noop
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
45 /* This define is so xgettext can find the internationalizable
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
46 strings. */
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
47 #define gettext_noop(String) String
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
48 #endif
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
49
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
50 /* The `emacs' switch turns on certain matching commands
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
51 that make sense only in Emacs. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
52 #ifdef emacs
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
53
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
54 #include "lisp.h"
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
55 #include "buffer.h"
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
56 #include "syntax.h"
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
57
16537
f47030b411f9 [emacs] (malloc, free): Define as xmalloc, and xfree.
Richard M. Stallman <rms@gnu.org>
parents: 16239
diff changeset
58 #define malloc xmalloc
f47030b411f9 [emacs] (malloc, free): Define as xmalloc, and xfree.
Richard M. Stallman <rms@gnu.org>
parents: 16239
diff changeset
59 #define free xfree
f47030b411f9 [emacs] (malloc, free): Define as xmalloc, and xfree.
Richard M. Stallman <rms@gnu.org>
parents: 16239
diff changeset
60
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
61 #else /* not emacs */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
62
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
63 /* If we are not linking with Emacs proper,
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
64 we can't use the relocating allocator
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
65 even if config.h says that we can. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
66 #undef REL_ALLOC
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
67
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
68 #if defined (STDC_HEADERS) || defined (_LIBC)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
69 #include <stdlib.h>
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
70 #else
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
71 char *malloc ();
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
72 char *realloc ();
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
73 #endif
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
74
12065
094636c759bf Undefined INHIBIT_STRING_HEADER when we have no
Karl Heuer <kwzh@gnu.org>
parents: 11974
diff changeset
75 /* When used in Emacs's lib-src, we need to get bzero and bcopy somehow.
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
76 If nothing else has been done, use the method below. */
12065
094636c759bf Undefined INHIBIT_STRING_HEADER when we have no
Karl Heuer <kwzh@gnu.org>
parents: 11974
diff changeset
77 #ifdef INHIBIT_STRING_HEADER
094636c759bf Undefined INHIBIT_STRING_HEADER when we have no
Karl Heuer <kwzh@gnu.org>
parents: 11974
diff changeset
78 #if !(defined (HAVE_BZERO) && defined (HAVE_BCOPY))
094636c759bf Undefined INHIBIT_STRING_HEADER when we have no
Karl Heuer <kwzh@gnu.org>
parents: 11974
diff changeset
79 #if !defined (bzero) && !defined (bcopy)
094636c759bf Undefined INHIBIT_STRING_HEADER when we have no
Karl Heuer <kwzh@gnu.org>
parents: 11974
diff changeset
80 #undef INHIBIT_STRING_HEADER
094636c759bf Undefined INHIBIT_STRING_HEADER when we have no
Karl Heuer <kwzh@gnu.org>
parents: 11974
diff changeset
81 #endif
094636c759bf Undefined INHIBIT_STRING_HEADER when we have no
Karl Heuer <kwzh@gnu.org>
parents: 11974
diff changeset
82 #endif
094636c759bf Undefined INHIBIT_STRING_HEADER when we have no
Karl Heuer <kwzh@gnu.org>
parents: 11974
diff changeset
83 #endif
094636c759bf Undefined INHIBIT_STRING_HEADER when we have no
Karl Heuer <kwzh@gnu.org>
parents: 11974
diff changeset
84
094636c759bf Undefined INHIBIT_STRING_HEADER when we have no
Karl Heuer <kwzh@gnu.org>
parents: 11974
diff changeset
85 /* This is the normal way of making sure we have a bcopy and a bzero.
094636c759bf Undefined INHIBIT_STRING_HEADER when we have no
Karl Heuer <kwzh@gnu.org>
parents: 11974
diff changeset
86 This is used in most programs--a few other programs avoid this
094636c759bf Undefined INHIBIT_STRING_HEADER when we have no
Karl Heuer <kwzh@gnu.org>
parents: 11974
diff changeset
87 by defining INHIBIT_STRING_HEADER. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
88 #ifndef INHIBIT_STRING_HEADER
12331
444c5079cb22 Use `defined' to test HAVE_STRING_H and STDC_HEADERS.
Richard M. Stallman <rms@gnu.org>
parents: 12065
diff changeset
89 #if defined (HAVE_STRING_H) || defined (STDC_HEADERS) || defined (_LIBC)
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
90 #include <string.h>
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
91 #ifndef bcmp
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
92 #define bcmp(s1, s2, n) memcmp ((s1), (s2), (n))
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
93 #endif
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
94 #ifndef bcopy
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
95 #define bcopy(s, d, n) memcpy ((d), (s), (n))
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
96 #endif
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
97 #ifndef bzero
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
98 #define bzero(s, n) memset ((s), 0, (n))
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
99 #endif
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
100 #else
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
101 #include <strings.h>
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
102 #endif
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
103 #endif
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
104
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
105 /* Define the syntax stuff for \<, \>, etc. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
106
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
107 /* This must be nonzero for the wordchar and notwordchar pattern
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
108 commands in re_match_2. */
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
109 #ifndef Sword
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
110 #define Sword 1
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
111 #endif
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
112
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
113 #ifdef SWITCH_ENUM_BUG
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
114 #define SWITCH_ENUM_CAST(x) ((int)(x))
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
115 #else
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
116 #define SWITCH_ENUM_CAST(x) (x)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
117 #endif
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
118
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
119 #ifdef SYNTAX_TABLE
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
120
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
121 extern char *re_syntax_table;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
122
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
123 #else /* not SYNTAX_TABLE */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
124
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
125 /* How many characters in the character set. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
126 #define CHAR_SET_SIZE 256
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
127
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
128 static char re_syntax_table[CHAR_SET_SIZE];
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
129
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
130 static void
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
131 init_syntax_once ()
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
132 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
133 register int c;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
134 static int done = 0;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
135
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
136 if (done)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
137 return;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
138
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
139 bzero (re_syntax_table, sizeof re_syntax_table);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
140
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
141 for (c = 'a'; c <= 'z'; c++)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
142 re_syntax_table[c] = Sword;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
143
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
144 for (c = 'A'; c <= 'Z'; c++)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
145 re_syntax_table[c] = Sword;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
146
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
147 for (c = '0'; c <= '9'; c++)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
148 re_syntax_table[c] = Sword;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
149
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
150 re_syntax_table['_'] = Sword;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
151
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
152 done = 1;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
153 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
154
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
155 #endif /* not SYNTAX_TABLE */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
156
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
157 #define SYNTAX(c) re_syntax_table[c]
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
158
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
159 #endif /* not emacs */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
160
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
161 /* Get the interface, including the syntax bits. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
162 #include "regex.h"
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
163
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
164 /* isalpha etc. are used for the character classes. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
165 #include <ctype.h>
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
166
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
167 /* Jim Meyering writes:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
168
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
169 "... Some ctype macros are valid only for character codes that
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
170 isascii says are ASCII (SGI's IRIX-4.0.5 is one such system --when
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
171 using /bin/cc or gcc but without giving an ansi option). So, all
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
172 ctype uses should be through macros like ISPRINT... If
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
173 STDC_HEADERS is defined, then autoconf has verified that the ctype
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
174 macros don't need to be guarded with references to isascii. ...
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
175 Defining isascii to 1 should let any compiler worth its salt
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
176 eliminate the && through constant folding." */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
177
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
178 #if defined (STDC_HEADERS) || (!defined (isascii) && !defined (HAVE_ISASCII))
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
179 #define ISASCII(c) 1
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
180 #else
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
181 #define ISASCII(c) isascii(c)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
182 #endif
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
183
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
184 #ifdef isblank
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
185 #define ISBLANK(c) (ISASCII (c) && isblank (c))
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
186 #else
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
187 #define ISBLANK(c) ((c) == ' ' || (c) == '\t')
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
188 #endif
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
189 #ifdef isgraph
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
190 #define ISGRAPH(c) (ISASCII (c) && isgraph (c))
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
191 #else
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
192 #define ISGRAPH(c) (ISASCII (c) && isprint (c) && !isspace (c))
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
193 #endif
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
194
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
195 #define ISPRINT(c) (ISASCII (c) && isprint (c))
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
196 #define ISDIGIT(c) (ISASCII (c) && isdigit (c))
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
197 #define ISALNUM(c) (ISASCII (c) && isalnum (c))
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
198 #define ISALPHA(c) (ISASCII (c) && isalpha (c))
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
199 #define ISCNTRL(c) (ISASCII (c) && iscntrl (c))
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
200 #define ISLOWER(c) (ISASCII (c) && islower (c))
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
201 #define ISPUNCT(c) (ISASCII (c) && ispunct (c))
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
202 #define ISSPACE(c) (ISASCII (c) && isspace (c))
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
203 #define ISUPPER(c) (ISASCII (c) && isupper (c))
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
204 #define ISXDIGIT(c) (ISASCII (c) && isxdigit (c))
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
205
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
206 #ifndef NULL
11952
655dd1479452 (NULL): Use explicit cast.
Karl Heuer <kwzh@gnu.org>
parents: 11865
diff changeset
207 #define NULL (void *)0
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
208 #endif
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
209
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
210 /* We remove any previous definition of `SIGN_EXTEND_CHAR',
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
211 since ours (we hope) works properly with all combinations of
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
212 machines, compilers, `char' and `unsigned char' argument types.
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
213 (Per Bothner suggested the basic approach.) */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
214 #undef SIGN_EXTEND_CHAR
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
215 #if __STDC__
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
216 #define SIGN_EXTEND_CHAR(c) ((signed char) (c))
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
217 #else /* not __STDC__ */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
218 /* As in Harbison and Steele. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
219 #define SIGN_EXTEND_CHAR(c) ((((unsigned char) (c)) ^ 128) - 128)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
220 #endif
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
221
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
222 /* Should we use malloc or alloca? If REGEX_MALLOC is not defined, we
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
223 use `alloca' instead of `malloc'. This is because using malloc in
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
224 re_search* or re_match* could cause memory leaks when C-g is used in
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
225 Emacs; also, malloc is slower and causes storage fragmentation. On
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
226 the other hand, malloc is more portable, and easier to debug.
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
227
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
228 Because we sometimes use alloca, some routines have to be macros,
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
229 not functions -- `alloca'-allocated space disappears at the end of the
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
230 function it is called in. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
231
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
232 #ifdef REGEX_MALLOC
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
233
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
234 #define REGEX_ALLOCATE malloc
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
235 #define REGEX_REALLOCATE(source, osize, nsize) realloc (source, nsize)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
236 #define REGEX_FREE free
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
237
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
238 #else /* not REGEX_MALLOC */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
239
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
240 /* Emacs already defines alloca, sometimes. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
241 #ifndef alloca
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
242
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
243 /* Make alloca work the best possible way. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
244 #ifdef __GNUC__
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
245 #define alloca __builtin_alloca
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
246 #else /* not __GNUC__ */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
247 #if HAVE_ALLOCA_H
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
248 #include <alloca.h>
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
249 #else /* not __GNUC__ or HAVE_ALLOCA_H */
13273
335d844a2f05 Don't declare alloca.
Richard M. Stallman <rms@gnu.org>
parents: 13250
diff changeset
250 #if 0 /* It is a bad idea to declare alloca. We always cast the result. */
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
251 #ifndef _AIX /* Already did AIX, up at the top. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
252 char *alloca ();
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
253 #endif /* not _AIX */
13273
335d844a2f05 Don't declare alloca.
Richard M. Stallman <rms@gnu.org>
parents: 13250
diff changeset
254 #endif
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
255 #endif /* not HAVE_ALLOCA_H */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
256 #endif /* not __GNUC__ */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
257
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
258 #endif /* not alloca */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
259
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
260 #define REGEX_ALLOCATE alloca
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
261
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
262 /* Assumes a `char *destination' variable. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
263 #define REGEX_REALLOCATE(source, osize, nsize) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
264 (destination = (char *) alloca (nsize), \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
265 bcopy (source, destination, osize), \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
266 destination)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
267
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
268 /* No need to do anything to free, after alloca. */
11865
5e83aee9e412 [REGEX_FREE]: Use ((void)0) instead of just (0).
Jim Meyering <jim@meyering.net>
parents: 11864
diff changeset
269 #define REGEX_FREE(arg) ((void)0) /* Do nothing! But inhibit gcc warning. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
270
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
271 #endif /* not REGEX_MALLOC */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
272
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
273 /* Define how to allocate the failure stack. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
274
12570
5e531668336e Fix conditional.
Karl Heuer <kwzh@gnu.org>
parents: 12478
diff changeset
275 #if defined (REL_ALLOC) && defined (REGEX_MALLOC)
12478
533b6d02cf04 Don't use relocatable allocator.
Richard M. Stallman <rms@gnu.org>
parents: 12331
diff changeset
276
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
277 #define REGEX_ALLOCATE_STACK(size) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
278 r_alloc (&failure_stack_ptr, (size))
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
279 #define REGEX_REALLOCATE_STACK(source, osize, nsize) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
280 r_re_alloc (&failure_stack_ptr, (nsize))
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
281 #define REGEX_FREE_STACK(ptr) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
282 r_alloc_free (&failure_stack_ptr)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
283
12478
533b6d02cf04 Don't use relocatable allocator.
Richard M. Stallman <rms@gnu.org>
parents: 12331
diff changeset
284 #else /* not using relocating allocator */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
285
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
286 #ifdef REGEX_MALLOC
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
287
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
288 #define REGEX_ALLOCATE_STACK malloc
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
289 #define REGEX_REALLOCATE_STACK(source, osize, nsize) realloc (source, nsize)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
290 #define REGEX_FREE_STACK free
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
291
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
292 #else /* not REGEX_MALLOC */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
293
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
294 #define REGEX_ALLOCATE_STACK alloca
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
295
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
296 #define REGEX_REALLOCATE_STACK(source, osize, nsize) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
297 REGEX_REALLOCATE (source, osize, nsize)
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
298 /* No need to explicitly free anything. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
299 #define REGEX_FREE_STACK(arg)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
300
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
301 #endif /* not REGEX_MALLOC */
12478
533b6d02cf04 Don't use relocatable allocator.
Richard M. Stallman <rms@gnu.org>
parents: 12331
diff changeset
302 #endif /* not using relocating allocator */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
303
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
304
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
305 /* True if `size1' is non-NULL and PTR is pointing anywhere inside
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
306 `string1' or just past its end. This works if PTR is NULL, which is
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
307 a good thing. */
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
308 #define FIRST_STRING_P(ptr) \
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
309 (size1 && string1 <= (ptr) && (ptr) <= string1 + size1)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
310
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
311 /* (Re)Allocate N items of type T using malloc, or fail. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
312 #define TALLOC(n, t) ((t *) malloc ((n) * sizeof (t)))
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
313 #define RETALLOC(addr, n, t) ((addr) = (t *) realloc (addr, (n) * sizeof (t)))
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
314 #define RETALLOC_IF(addr, n, t) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
315 if (addr) RETALLOC((addr), (n), t); else (addr) = TALLOC ((n), t)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
316 #define REGEX_TALLOC(n, t) ((t *) REGEX_ALLOCATE ((n) * sizeof (t)))
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
317
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
318 #define BYTEWIDTH 8 /* In bits. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
319
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
320 #define STREQ(s1, s2) ((strcmp (s1, s2) == 0))
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
321
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
322 #undef MAX
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
323 #undef MIN
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
324 #define MAX(a, b) ((a) > (b) ? (a) : (b))
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
325 #define MIN(a, b) ((a) < (b) ? (a) : (b))
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
326
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
327 typedef char boolean;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
328 #define false 0
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
329 #define true 1
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
330
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
331 static int re_match_2_internal ();
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
332
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
333 /* These are the command codes that appear in compiled regular
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
334 expressions. Some opcodes are followed by argument bytes. A
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
335 command code can specify any interpretation whatsoever for its
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
336 arguments. Zero bytes may appear in the compiled regular expression. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
337
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
338 typedef enum
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
339 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
340 no_op = 0,
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
341
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
342 /* Succeed right away--no more backtracking. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
343 succeed,
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
344
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
345 /* Followed by one byte giving n, then by n literal bytes. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
346 exactn,
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
347
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
348 /* Matches any (more or less) character. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
349 anychar,
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
350
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
351 /* Matches any one char belonging to specified set. First
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
352 following byte is number of bitmap bytes. Then come bytes
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
353 for a bitmap saying which chars are in. Bits in each byte
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
354 are ordered low-bit-first. A character is in the set if its
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
355 bit is 1. A character too large to have a bit in the map is
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
356 automatically not in the set. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
357 charset,
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
358
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
359 /* Same parameters as charset, but match any character that is
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
360 not one of those specified. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
361 charset_not,
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
362
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
363 /* Start remembering the text that is matched, for storing in a
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
364 register. Followed by one byte with the register number, in
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
365 the range 0 to one less than the pattern buffer's re_nsub
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
366 field. Then followed by one byte with the number of groups
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
367 inner to this one. (This last has to be part of the
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
368 start_memory only because we need it in the on_failure_jump
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
369 of re_match_2.) */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
370 start_memory,
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
371
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
372 /* Stop remembering the text that is matched and store it in a
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
373 memory register. Followed by one byte with the register
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
374 number, in the range 0 to one less than `re_nsub' in the
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
375 pattern buffer, and one byte with the number of inner groups,
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
376 just like `start_memory'. (We need the number of inner
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
377 groups here because we don't have any easy way of finding the
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
378 corresponding start_memory when we're at a stop_memory.) */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
379 stop_memory,
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
380
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
381 /* Match a duplicate of something remembered. Followed by one
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
382 byte containing the register number. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
383 duplicate,
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
384
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
385 /* Fail unless at beginning of line. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
386 begline,
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
387
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
388 /* Fail unless at end of line. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
389 endline,
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
390
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
391 /* Succeeds if at beginning of buffer (if emacs) or at beginning
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
392 of string to be matched (if not). */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
393 begbuf,
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
394
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
395 /* Analogously, for end of buffer/string. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
396 endbuf,
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
397
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
398 /* Followed by two byte relative address to which to jump. */
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
399 jump,
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
400
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
401 /* Same as jump, but marks the end of an alternative. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
402 jump_past_alt,
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
403
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
404 /* Followed by two-byte relative address of place to resume at
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
405 in case of failure. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
406 on_failure_jump,
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
407
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
408 /* Like on_failure_jump, but pushes a placeholder instead of the
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
409 current string position when executed. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
410 on_failure_keep_string_jump,
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
411
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
412 /* Throw away latest failure point and then jump to following
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
413 two-byte relative address. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
414 pop_failure_jump,
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
415
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
416 /* Change to pop_failure_jump if know won't have to backtrack to
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
417 match; otherwise change to jump. This is used to jump
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
418 back to the beginning of a repeat. If what follows this jump
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
419 clearly won't match what the repeat does, such that we can be
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
420 sure that there is no use backtracking out of repetitions
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
421 already matched, then we change it to a pop_failure_jump.
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
422 Followed by two-byte address. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
423 maybe_pop_jump,
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
424
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
425 /* Jump to following two-byte address, and push a dummy failure
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
426 point. This failure point will be thrown away if an attempt
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
427 is made to use it for a failure. A `+' construct makes this
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
428 before the first repeat. Also used as an intermediary kind
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
429 of jump when compiling an alternative. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
430 dummy_failure_jump,
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
431
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
432 /* Push a dummy failure point and continue. Used at the end of
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
433 alternatives. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
434 push_dummy_failure,
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
435
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
436 /* Followed by two-byte relative address and two-byte number n.
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
437 After matching N times, jump to the address upon failure. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
438 succeed_n,
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
439
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
440 /* Followed by two-byte relative address, and two-byte number n.
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
441 Jump to the address N times, then fail. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
442 jump_n,
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
443
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
444 /* Set the following two-byte relative address to the
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
445 subsequent two-byte number. The address *includes* the two
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
446 bytes of number. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
447 set_number_at,
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
448
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
449 wordchar, /* Matches any word-constituent character. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
450 notwordchar, /* Matches any char that is not a word-constituent. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
451
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
452 wordbeg, /* Succeeds if at word beginning. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
453 wordend, /* Succeeds if at word end. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
454
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
455 wordbound, /* Succeeds if at a word boundary. */
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
456 notwordbound /* Succeeds if not at a word boundary. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
457
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
458 #ifdef emacs
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
459 ,before_dot, /* Succeeds if before point. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
460 at_dot, /* Succeeds if at point. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
461 after_dot, /* Succeeds if after point. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
462
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
463 /* Matches any character whose syntax is specified. Followed by
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
464 a byte which contains a syntax code, e.g., Sword. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
465 syntaxspec,
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
466
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
467 /* Matches any character whose syntax is not that specified. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
468 notsyntaxspec
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
469 #endif /* emacs */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
470 } re_opcode_t;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
471
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
472 /* Common operations on the compiled pattern. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
473
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
474 /* Store NUMBER in two contiguous bytes starting at DESTINATION. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
475
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
476 #define STORE_NUMBER(destination, number) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
477 do { \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
478 (destination)[0] = (number) & 0377; \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
479 (destination)[1] = (number) >> 8; \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
480 } while (0)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
481
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
482 /* Same as STORE_NUMBER, except increment DESTINATION to
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
483 the byte after where the number is stored. Therefore, DESTINATION
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
484 must be an lvalue. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
485
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
486 #define STORE_NUMBER_AND_INCR(destination, number) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
487 do { \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
488 STORE_NUMBER (destination, number); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
489 (destination) += 2; \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
490 } while (0)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
491
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
492 /* Put into DESTINATION a number stored in two contiguous bytes starting
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
493 at SOURCE. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
494
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
495 #define EXTRACT_NUMBER(destination, source) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
496 do { \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
497 (destination) = *(source) & 0377; \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
498 (destination) += SIGN_EXTEND_CHAR (*((source) + 1)) << 8; \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
499 } while (0)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
500
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
501 #ifdef DEBUG
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
502 static void
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
503 extract_number (dest, source)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
504 int *dest;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
505 unsigned char *source;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
506 {
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
507 int temp = SIGN_EXTEND_CHAR (*(source + 1));
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
508 *dest = *source & 0377;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
509 *dest += temp << 8;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
510 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
511
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
512 #ifndef EXTRACT_MACROS /* To debug the macros. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
513 #undef EXTRACT_NUMBER
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
514 #define EXTRACT_NUMBER(dest, src) extract_number (&dest, src)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
515 #endif /* not EXTRACT_MACROS */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
516
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
517 #endif /* DEBUG */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
518
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
519 /* Same as EXTRACT_NUMBER, except increment SOURCE to after the number.
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
520 SOURCE must be an lvalue. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
521
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
522 #define EXTRACT_NUMBER_AND_INCR(destination, source) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
523 do { \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
524 EXTRACT_NUMBER (destination, source); \
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
525 (source) += 2; \
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
526 } while (0)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
527
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
528 #ifdef DEBUG
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
529 static void
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
530 extract_number_and_incr (destination, source)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
531 int *destination;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
532 unsigned char **source;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
533 {
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
534 extract_number (destination, *source);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
535 *source += 2;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
536 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
537
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
538 #ifndef EXTRACT_MACROS
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
539 #undef EXTRACT_NUMBER_AND_INCR
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
540 #define EXTRACT_NUMBER_AND_INCR(dest, src) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
541 extract_number_and_incr (&dest, &src)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
542 #endif /* not EXTRACT_MACROS */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
543
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
544 #endif /* DEBUG */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
545
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
546 /* If DEBUG is defined, Regex prints many voluminous messages about what
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
547 it is doing (if the variable `debug' is nonzero). If linked with the
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
548 main program in `iregex.c', you can enter patterns and strings
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
549 interactively. And if linked with the main program in `main.c' and
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
550 the other test files, you can run the already-written tests. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
551
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
552 #ifdef DEBUG
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
553
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
554 /* We use standard I/O for debugging. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
555 #include <stdio.h>
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
556
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
557 /* It is useful to test things that ``must'' be true when debugging. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
558 #include <assert.h>
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
559
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
560 static int debug = 0;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
561
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
562 #define DEBUG_STATEMENT(e) e
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
563 #define DEBUG_PRINT1(x) if (debug) printf (x)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
564 #define DEBUG_PRINT2(x1, x2) if (debug) printf (x1, x2)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
565 #define DEBUG_PRINT3(x1, x2, x3) if (debug) printf (x1, x2, x3)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
566 #define DEBUG_PRINT4(x1, x2, x3, x4) if (debug) printf (x1, x2, x3, x4)
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
567 #define DEBUG_PRINT_COMPILED_PATTERN(p, s, e) \
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
568 if (debug) print_partial_compiled_pattern (s, e)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
569 #define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
570 if (debug) print_double_string (w, s1, sz1, s2, sz2)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
571
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
572
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
573 /* Print the fastmap in human-readable form. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
574
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
575 void
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
576 print_fastmap (fastmap)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
577 char *fastmap;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
578 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
579 unsigned was_a_range = 0;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
580 unsigned i = 0;
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
581
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
582 while (i < (1 << BYTEWIDTH))
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
583 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
584 if (fastmap[i++])
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
585 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
586 was_a_range = 0;
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
587 putchar (i - 1);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
588 while (i < (1 << BYTEWIDTH) && fastmap[i])
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
589 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
590 was_a_range = 1;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
591 i++;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
592 }
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
593 if (was_a_range)
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
594 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
595 printf ("-");
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
596 putchar (i - 1);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
597 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
598 }
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
599 }
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
600 putchar ('\n');
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
601 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
602
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
603
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
604 /* Print a compiled pattern string in human-readable form, starting at
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
605 the START pointer into it and ending just before the pointer END. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
606
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
607 void
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
608 print_partial_compiled_pattern (start, end)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
609 unsigned char *start;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
610 unsigned char *end;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
611 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
612 int mcnt, mcnt2;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
613 unsigned char *p = start;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
614 unsigned char *pend = end;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
615
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
616 if (start == NULL)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
617 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
618 printf ("(null)\n");
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
619 return;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
620 }
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
621
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
622 /* Loop over pattern commands. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
623 while (p < pend)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
624 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
625 printf ("%d:\t", p - start);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
626
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
627 switch ((re_opcode_t) *p++)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
628 {
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
629 case no_op:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
630 printf ("/no_op");
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
631 break;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
632
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
633 case exactn:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
634 mcnt = *p++;
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
635 printf ("/exactn/%d", mcnt);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
636 do
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
637 {
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
638 putchar ('/');
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
639 putchar (*p++);
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
640 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
641 while (--mcnt);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
642 break;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
643
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
644 case start_memory:
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
645 mcnt = *p++;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
646 printf ("/start_memory/%d/%d", mcnt, *p++);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
647 break;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
648
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
649 case stop_memory:
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
650 mcnt = *p++;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
651 printf ("/stop_memory/%d/%d", mcnt, *p++);
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
652 break;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
653
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
654 case duplicate:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
655 printf ("/duplicate/%d", *p++);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
656 break;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
657
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
658 case anychar:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
659 printf ("/anychar");
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
660 break;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
661
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
662 case charset:
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
663 case charset_not:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
664 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
665 register int c, last = -100;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
666 register int in_range = 0;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
667
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
668 printf ("/charset [%s",
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
669 (re_opcode_t) *(p - 1) == charset_not ? "^" : "");
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
670
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
671 assert (p + *p < pend);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
672
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
673 for (c = 0; c < 256; c++)
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
674 if (c / 8 < *p
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
675 && (p[1 + (c/8)] & (1 << (c % 8))))
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
676 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
677 /* Are we starting a range? */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
678 if (last + 1 == c && ! in_range)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
679 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
680 putchar ('-');
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
681 in_range = 1;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
682 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
683 /* Have we broken a range? */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
684 else if (last + 1 != c && in_range)
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
685 {
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
686 putchar (last);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
687 in_range = 0;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
688 }
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
689
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
690 if (! in_range)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
691 putchar (c);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
692
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
693 last = c;
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
694 }
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
695
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
696 if (in_range)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
697 putchar (last);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
698
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
699 putchar (']');
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
700
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
701 p += 1 + *p;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
702 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
703 break;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
704
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
705 case begline:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
706 printf ("/begline");
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
707 break;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
708
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
709 case endline:
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
710 printf ("/endline");
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
711 break;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
712
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
713 case on_failure_jump:
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
714 extract_number_and_incr (&mcnt, &p);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
715 printf ("/on_failure_jump to %d", p + mcnt - start);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
716 break;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
717
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
718 case on_failure_keep_string_jump:
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
719 extract_number_and_incr (&mcnt, &p);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
720 printf ("/on_failure_keep_string_jump to %d", p + mcnt - start);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
721 break;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
722
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
723 case dummy_failure_jump:
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
724 extract_number_and_incr (&mcnt, &p);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
725 printf ("/dummy_failure_jump to %d", p + mcnt - start);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
726 break;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
727
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
728 case push_dummy_failure:
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
729 printf ("/push_dummy_failure");
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
730 break;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
731
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
732 case maybe_pop_jump:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
733 extract_number_and_incr (&mcnt, &p);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
734 printf ("/maybe_pop_jump to %d", p + mcnt - start);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
735 break;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
736
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
737 case pop_failure_jump:
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
738 extract_number_and_incr (&mcnt, &p);
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
739 printf ("/pop_failure_jump to %d", p + mcnt - start);
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
740 break;
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
741
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
742 case jump_past_alt:
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
743 extract_number_and_incr (&mcnt, &p);
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
744 printf ("/jump_past_alt to %d", p + mcnt - start);
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
745 break;
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
746
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
747 case jump:
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
748 extract_number_and_incr (&mcnt, &p);
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
749 printf ("/jump to %d", p + mcnt - start);
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
750 break;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
751
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
752 case succeed_n:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
753 extract_number_and_incr (&mcnt, &p);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
754 extract_number_and_incr (&mcnt2, &p);
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
755 printf ("/succeed_n to %d, %d times", p + mcnt - start, mcnt2);
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
756 break;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
757
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
758 case jump_n:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
759 extract_number_and_incr (&mcnt, &p);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
760 extract_number_and_incr (&mcnt2, &p);
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
761 printf ("/jump_n to %d, %d times", p + mcnt - start, mcnt2);
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
762 break;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
763
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
764 case set_number_at:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
765 extract_number_and_incr (&mcnt, &p);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
766 extract_number_and_incr (&mcnt2, &p);
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
767 printf ("/set_number_at location %d to %d", p + mcnt - start, mcnt2);
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
768 break;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
769
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
770 case wordbound:
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
771 printf ("/wordbound");
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
772 break;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
773
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
774 case notwordbound:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
775 printf ("/notwordbound");
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
776 break;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
777
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
778 case wordbeg:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
779 printf ("/wordbeg");
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
780 break;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
781
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
782 case wordend:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
783 printf ("/wordend");
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
784
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
785 #ifdef emacs
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
786 case before_dot:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
787 printf ("/before_dot");
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
788 break;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
789
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
790 case at_dot:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
791 printf ("/at_dot");
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
792 break;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
793
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
794 case after_dot:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
795 printf ("/after_dot");
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
796 break;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
797
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
798 case syntaxspec:
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
799 printf ("/syntaxspec");
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
800 mcnt = *p++;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
801 printf ("/%d", mcnt);
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
802 break;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
803
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
804 case notsyntaxspec:
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
805 printf ("/notsyntaxspec");
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
806 mcnt = *p++;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
807 printf ("/%d", mcnt);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
808 break;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
809 #endif /* emacs */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
810
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
811 case wordchar:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
812 printf ("/wordchar");
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
813 break;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
814
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
815 case notwordchar:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
816 printf ("/notwordchar");
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
817 break;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
818
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
819 case begbuf:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
820 printf ("/begbuf");
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
821 break;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
822
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
823 case endbuf:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
824 printf ("/endbuf");
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
825 break;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
826
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
827 default:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
828 printf ("?%d", *(p-1));
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
829 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
830
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
831 putchar ('\n');
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
832 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
833
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
834 printf ("%d:\tend of pattern.\n", p - start);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
835 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
836
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
837
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
838 void
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
839 print_compiled_pattern (bufp)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
840 struct re_pattern_buffer *bufp;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
841 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
842 unsigned char *buffer = bufp->buffer;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
843
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
844 print_partial_compiled_pattern (buffer, buffer + bufp->used);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
845 printf ("%d bytes used/%d bytes allocated.\n", bufp->used, bufp->allocated);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
846
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
847 if (bufp->fastmap_accurate && bufp->fastmap)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
848 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
849 printf ("fastmap: ");
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
850 print_fastmap (bufp->fastmap);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
851 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
852
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
853 printf ("re_nsub: %d\t", bufp->re_nsub);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
854 printf ("regs_alloc: %d\t", bufp->regs_allocated);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
855 printf ("can_be_null: %d\t", bufp->can_be_null);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
856 printf ("newline_anchor: %d\n", bufp->newline_anchor);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
857 printf ("no_sub: %d\t", bufp->no_sub);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
858 printf ("not_bol: %d\t", bufp->not_bol);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
859 printf ("not_eol: %d\t", bufp->not_eol);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
860 printf ("syntax: %d\n", bufp->syntax);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
861 /* Perhaps we should print the translate table? */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
862 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
863
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
865 void
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
866 print_double_string (where, string1, size1, string2, size2)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
867 const char *where;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
868 const char *string1;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
869 const char *string2;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
870 int size1;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
871 int size2;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
872 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
873 unsigned this_char;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
874
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
875 if (where == NULL)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
876 printf ("(null)");
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
877 else
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
878 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
879 if (FIRST_STRING_P (where))
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
880 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
881 for (this_char = where - string1; this_char < size1; this_char++)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
882 putchar (string1[this_char]);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
883
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
884 where = string2;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
885 }
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
886
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
887 for (this_char = where - string2; this_char < size2; this_char++)
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
888 putchar (string2[this_char]);
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
889 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
890 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
891
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
892 #else /* not DEBUG */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
893
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
894 #undef assert
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
895 #define assert(e)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
896
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
897 #define DEBUG_STATEMENT(e)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
898 #define DEBUG_PRINT1(x)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
899 #define DEBUG_PRINT2(x1, x2)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
900 #define DEBUG_PRINT3(x1, x2, x3)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
901 #define DEBUG_PRINT4(x1, x2, x3, x4)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
902 #define DEBUG_PRINT_COMPILED_PATTERN(p, s, e)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
903 #define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
904
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
905 #endif /* not DEBUG */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
906
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
907 /* Set by `re_set_syntax' to the current regexp syntax to recognize. Can
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
908 also be assigned to arbitrarily: each pattern buffer stores its own
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
909 syntax, so it can be changed between regex compilations. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
910 /* This has no initializer because initialized variables in Emacs
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
911 become read-only after dumping. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
912 reg_syntax_t re_syntax_options;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
913
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
914
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
915 /* Specify the precise syntax of regexps for compilation. This provides
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
916 for compatibility for various utilities which historically have
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
917 different, incompatible syntaxes.
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
918
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
919 The argument SYNTAX is a bit mask comprised of the various bits
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
920 defined in regex.h. We return the old syntax. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
921
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
922 reg_syntax_t
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
923 re_set_syntax (syntax)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
924 reg_syntax_t syntax;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
925 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
926 reg_syntax_t ret = re_syntax_options;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
927
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
928 re_syntax_options = syntax;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
929 return ret;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
930 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
931
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
932 /* This table gives an error message for each of the error codes listed
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
933 in regex.h. Obviously the order here has to be same as there.
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
934 POSIX doesn't require that we do anything for REG_NOERROR,
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
935 but why not be nice? */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
936
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
937 static const char *re_error_msgid[] =
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
938 {
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
939 gettext_noop ("Success"), /* REG_NOERROR */
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
940 gettext_noop ("No match"), /* REG_NOMATCH */
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
941 gettext_noop ("Invalid regular expression"), /* REG_BADPAT */
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
942 gettext_noop ("Invalid collation character"), /* REG_ECOLLATE */
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
943 gettext_noop ("Invalid character class name"), /* REG_ECTYPE */
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
944 gettext_noop ("Trailing backslash"), /* REG_EESCAPE */
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
945 gettext_noop ("Invalid back reference"), /* REG_ESUBREG */
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
946 gettext_noop ("Unmatched [ or [^"), /* REG_EBRACK */
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
947 gettext_noop ("Unmatched ( or \\("), /* REG_EPAREN */
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
948 gettext_noop ("Unmatched \\{"), /* REG_EBRACE */
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
949 gettext_noop ("Invalid content of \\{\\}"), /* REG_BADBR */
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
950 gettext_noop ("Invalid range end"), /* REG_ERANGE */
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
951 gettext_noop ("Memory exhausted"), /* REG_ESPACE */
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
952 gettext_noop ("Invalid preceding regular expression"), /* REG_BADRPT */
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
953 gettext_noop ("Premature end of regular expression"), /* REG_EEND */
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
954 gettext_noop ("Regular expression too big"), /* REG_ESIZE */
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
955 gettext_noop ("Unmatched ) or \\)"), /* REG_ERPAREN */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
956 };
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
957
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
958 /* Avoiding alloca during matching, to placate r_alloc. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
959
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
960 /* Define MATCH_MAY_ALLOCATE unless we need to make sure that the
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
961 searching and matching functions should not call alloca. On some
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
962 systems, alloca is implemented in terms of malloc, and if we're
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
963 using the relocating allocator routines, then malloc could cause a
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
964 relocation, which might (if the strings being searched are in the
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
965 ralloc heap) shift the data out from underneath the regexp
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
966 routines.
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
967
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
968 Here's another reason to avoid allocation: Emacs
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
969 processes input from X in a signal handler; processing X input may
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
970 call malloc; if input arrives while a matching routine is calling
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
971 malloc, then we're scrod. But Emacs can't just block input while
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
972 calling matching routines; then we don't notice interrupts when
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
973 they come in. So, Emacs blocks input around all regexp calls
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
974 except the matching calls, which it leaves unprotected, in the
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
975 faith that they will not malloc. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
976
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
977 /* Normally, this is fine. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
978 #define MATCH_MAY_ALLOCATE
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
979
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
980 /* When using GNU C, we are not REALLY using the C alloca, no matter
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
981 what config.h may say. So don't take precautions for it. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
982 #ifdef __GNUC__
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
983 #undef C_ALLOCA
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
984 #endif
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
985
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
986 /* The match routines may not allocate if (1) they would do it with malloc
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
987 and (2) it's not safe for them to use malloc.
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
988 Note that if REL_ALLOC is defined, matching would not use malloc for the
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
989 failure stack, but we would still use it for the register vectors;
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
990 so REL_ALLOC should not affect this. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
991 #if (defined (C_ALLOCA) || defined (REGEX_MALLOC)) && defined (emacs)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
992 #undef MATCH_MAY_ALLOCATE
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
993 #endif
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
994
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
995
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
996 /* Failure stack declarations and macros; both re_compile_fastmap and
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
997 re_match_2 use a failure stack. These have to be macros because of
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
998 REGEX_ALLOCATE_STACK. */
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
999
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1000
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1001 /* Number of failure points for which to initially allocate space
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1002 when matching. If this number is exceeded, we allocate more
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1003 space, so it is not a hard limit. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1004 #ifndef INIT_FAILURE_ALLOC
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1005 #define INIT_FAILURE_ALLOC 5
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1006 #endif
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1007
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1008 /* Roughly the maximum number of failure points on the stack. Would be
15011
994f5cef3de6 (MAX_FAILURE_ITEMS): Use 5 instead of actual number of regs.
Richard M. Stallman <rms@gnu.org>
parents: 14414
diff changeset
1009 exactly that if always used MAX_FAILURE_ITEMS items each time we failed.
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1010 This is a variable only so users of regex can assign to it; we never
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1011 change it ourselves. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1012 #if defined (MATCH_MAY_ALLOCATE)
15516
f8e362279cbb (re_max_failures): Reduce to 4000.
Richard M. Stallman <rms@gnu.org>
parents: 15316
diff changeset
1013 /* 4400 was enough to cause a crash on Alpha OSF/1,
15316
b8fe384dbeee (re_max_failures): Reduce to 8000.
Richard M. Stallman <rms@gnu.org>
parents: 15285
diff changeset
1014 whose default stack limit is 2mb. */
15847
2054791aefc6 (re_max_failures): Increase to 20000 again.
Richard M. Stallman <rms@gnu.org>
parents: 15635
diff changeset
1015 int re_max_failures = 20000;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1016 #else
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1017 int re_max_failures = 2000;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1018 #endif
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1019
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1020 union fail_stack_elt
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1021 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1022 unsigned char *pointer;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1023 int integer;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1024 };
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1025
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1026 typedef union fail_stack_elt fail_stack_elt_t;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1027
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1028 typedef struct
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1029 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1030 fail_stack_elt_t *stack;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1031 unsigned size;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1032 unsigned avail; /* Offset of next open position. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1033 } fail_stack_type;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1034
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1035 #define FAIL_STACK_EMPTY() (fail_stack.avail == 0)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1036 #define FAIL_STACK_PTR_EMPTY() (fail_stack_ptr->avail == 0)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1037 #define FAIL_STACK_FULL() (fail_stack.avail == fail_stack.size)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1038
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1039
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1040 /* Define macros to initialize and free the failure stack.
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1041 Do `return -2' if the alloc fails. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1042
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1043 #ifdef MATCH_MAY_ALLOCATE
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1044 #define INIT_FAIL_STACK() \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1045 do { \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1046 fail_stack.stack = (fail_stack_elt_t *) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1047 REGEX_ALLOCATE_STACK (INIT_FAILURE_ALLOC * sizeof (fail_stack_elt_t)); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1048 \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1049 if (fail_stack.stack == NULL) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1050 return -2; \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1051 \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1052 fail_stack.size = INIT_FAILURE_ALLOC; \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1053 fail_stack.avail = 0; \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1054 } while (0)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1055
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1056 #define RESET_FAIL_STACK() REGEX_FREE_STACK (fail_stack.stack)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1057 #else
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1058 #define INIT_FAIL_STACK() \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1059 do { \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1060 fail_stack.avail = 0; \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1061 } while (0)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1062
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1063 #define RESET_FAIL_STACK()
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1064 #endif
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1065
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1066
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1067 /* Double the size of FAIL_STACK, up to approximately `re_max_failures' items.
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1068
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1069 Return 1 if succeeds, and 0 if either ran out of memory
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
1070 allocating space for it or it was already too large.
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
1071
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1072 REGEX_REALLOCATE_STACK requires `destination' be declared. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1073
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1074 #define DOUBLE_FAIL_STACK(fail_stack) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1075 ((fail_stack).size > re_max_failures * MAX_FAILURE_ITEMS \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1076 ? 0 \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1077 : ((fail_stack).stack = (fail_stack_elt_t *) \
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1078 REGEX_REALLOCATE_STACK ((fail_stack).stack, \
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1079 (fail_stack).size * sizeof (fail_stack_elt_t), \
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1080 ((fail_stack).size << 1) * sizeof (fail_stack_elt_t)), \
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1081 \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1082 (fail_stack).stack == NULL \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1083 ? 0 \
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1084 : ((fail_stack).size <<= 1, \
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1085 1)))
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1086
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1087
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
1088 /* Push pointer POINTER on FAIL_STACK.
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1089 Return 1 if was able to do so and 0 if ran out of memory allocating
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1090 space to do so. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1091 #define PUSH_PATTERN_OP(POINTER, FAIL_STACK) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1092 ((FAIL_STACK_FULL () \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1093 && !DOUBLE_FAIL_STACK (FAIL_STACK)) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1094 ? 0 \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1095 : ((FAIL_STACK).stack[(FAIL_STACK).avail++].pointer = POINTER, \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1096 1))
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1097
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1098 /* Push a pointer value onto the failure stack.
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1099 Assumes the variable `fail_stack'. Probably should only
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1100 be called from within `PUSH_FAILURE_POINT'. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1101 #define PUSH_FAILURE_POINTER(item) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1102 fail_stack.stack[fail_stack.avail++].pointer = (unsigned char *) (item)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1103
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1104 /* This pushes an integer-valued item onto the failure stack.
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1105 Assumes the variable `fail_stack'. Probably should only
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1106 be called from within `PUSH_FAILURE_POINT'. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1107 #define PUSH_FAILURE_INT(item) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1108 fail_stack.stack[fail_stack.avail++].integer = (item)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1109
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1110 /* Push a fail_stack_elt_t value onto the failure stack.
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1111 Assumes the variable `fail_stack'. Probably should only
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1112 be called from within `PUSH_FAILURE_POINT'. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1113 #define PUSH_FAILURE_ELT(item) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1114 fail_stack.stack[fail_stack.avail++] = (item)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1115
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1116 /* These three POP... operations complement the three PUSH... operations.
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1117 All assume that `fail_stack' is nonempty. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1118 #define POP_FAILURE_POINTER() fail_stack.stack[--fail_stack.avail].pointer
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1119 #define POP_FAILURE_INT() fail_stack.stack[--fail_stack.avail].integer
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1120 #define POP_FAILURE_ELT() fail_stack.stack[--fail_stack.avail]
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1121
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1122 /* Used to omit pushing failure point id's when we're not debugging. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1123 #ifdef DEBUG
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1124 #define DEBUG_PUSH PUSH_FAILURE_INT
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1125 #define DEBUG_POP(item_addr) *(item_addr) = POP_FAILURE_INT ()
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1126 #else
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1127 #define DEBUG_PUSH(item)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1128 #define DEBUG_POP(item_addr)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1129 #endif
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1130
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1131
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1132 /* Push the information about the state we will need
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
1133 if we ever fail back to it.
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
1134
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1135 Requires variables fail_stack, regstart, regend, reg_info, and
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1136 num_regs be declared. DOUBLE_FAIL_STACK requires `destination' be
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1137 declared.
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
1138
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1139 Does `return FAILURE_CODE' if runs out of memory. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1140
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1141 #define PUSH_FAILURE_POINT(pattern_place, string_place, failure_code) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1142 do { \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1143 char *destination; \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1144 /* Must be int, so when we don't save any registers, the arithmetic \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1145 of 0 + -1 isn't done as unsigned. */ \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1146 int this_reg; \
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1147 \
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1148 DEBUG_STATEMENT (failure_id++); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1149 DEBUG_STATEMENT (nfailure_points_pushed++); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1150 DEBUG_PRINT2 ("\nPUSH_FAILURE_POINT #%u:\n", failure_id); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1151 DEBUG_PRINT2 (" Before push, next avail: %d\n", (fail_stack).avail);\
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1152 DEBUG_PRINT2 (" size: %d\n", (fail_stack).size);\
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1153 \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1154 DEBUG_PRINT2 (" slots needed: %d\n", NUM_FAILURE_ITEMS); \
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1155 DEBUG_PRINT2 (" available: %d\n", REMAINING_AVAIL_SLOTS); \
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1156 \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1157 /* Ensure we have enough space allocated for what we will push. */ \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1158 while (REMAINING_AVAIL_SLOTS < NUM_FAILURE_ITEMS) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1159 { \
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1160 if (!DOUBLE_FAIL_STACK (fail_stack)) \
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1161 return failure_code; \
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1162 \
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1163 DEBUG_PRINT2 ("\n Doubled stack; size now: %d\n", \
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1164 (fail_stack).size); \
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1165 DEBUG_PRINT2 (" slots available: %d\n", REMAINING_AVAIL_SLOTS);\
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1166 } \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1167 \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1168 /* Push the info, starting with the registers. */ \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1169 DEBUG_PRINT1 ("\n"); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1170 \
13517
e50cebfd1d7a (NUM_FAILURE_ITEMS, POP_FAILURE_POINT, PUSH_FAILURE_POINT):
Richard M. Stallman <rms@gnu.org>
parents: 13323
diff changeset
1171 if (1) \
12931
30dad6bfce63 (PUSH_FAILURE_POINT, POP_FAILURE_POINT): Don't push or pop
Richard M. Stallman <rms@gnu.org>
parents: 12570
diff changeset
1172 for (this_reg = lowest_active_reg; this_reg <= highest_active_reg; \
30dad6bfce63 (PUSH_FAILURE_POINT, POP_FAILURE_POINT): Don't push or pop
Richard M. Stallman <rms@gnu.org>
parents: 12570
diff changeset
1173 this_reg++) \
30dad6bfce63 (PUSH_FAILURE_POINT, POP_FAILURE_POINT): Don't push or pop
Richard M. Stallman <rms@gnu.org>
parents: 12570
diff changeset
1174 { \
30dad6bfce63 (PUSH_FAILURE_POINT, POP_FAILURE_POINT): Don't push or pop
Richard M. Stallman <rms@gnu.org>
parents: 12570
diff changeset
1175 DEBUG_PRINT2 (" Pushing reg: %d\n", this_reg); \
30dad6bfce63 (PUSH_FAILURE_POINT, POP_FAILURE_POINT): Don't push or pop
Richard M. Stallman <rms@gnu.org>
parents: 12570
diff changeset
1176 DEBUG_STATEMENT (num_regs_pushed++); \
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1177 \
12931
30dad6bfce63 (PUSH_FAILURE_POINT, POP_FAILURE_POINT): Don't push or pop
Richard M. Stallman <rms@gnu.org>
parents: 12570
diff changeset
1178 DEBUG_PRINT2 (" start: 0x%x\n", regstart[this_reg]); \
30dad6bfce63 (PUSH_FAILURE_POINT, POP_FAILURE_POINT): Don't push or pop
Richard M. Stallman <rms@gnu.org>
parents: 12570
diff changeset
1179 PUSH_FAILURE_POINTER (regstart[this_reg]); \
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1180 \
12931
30dad6bfce63 (PUSH_FAILURE_POINT, POP_FAILURE_POINT): Don't push or pop
Richard M. Stallman <rms@gnu.org>
parents: 12570
diff changeset
1181 DEBUG_PRINT2 (" end: 0x%x\n", regend[this_reg]); \
30dad6bfce63 (PUSH_FAILURE_POINT, POP_FAILURE_POINT): Don't push or pop
Richard M. Stallman <rms@gnu.org>
parents: 12570
diff changeset
1182 PUSH_FAILURE_POINTER (regend[this_reg]); \
30dad6bfce63 (PUSH_FAILURE_POINT, POP_FAILURE_POINT): Don't push or pop
Richard M. Stallman <rms@gnu.org>
parents: 12570
diff changeset
1183 \
30dad6bfce63 (PUSH_FAILURE_POINT, POP_FAILURE_POINT): Don't push or pop
Richard M. Stallman <rms@gnu.org>
parents: 12570
diff changeset
1184 DEBUG_PRINT2 (" info: 0x%x\n ", reg_info[this_reg]); \
30dad6bfce63 (PUSH_FAILURE_POINT, POP_FAILURE_POINT): Don't push or pop
Richard M. Stallman <rms@gnu.org>
parents: 12570
diff changeset
1185 DEBUG_PRINT2 (" match_null=%d", \
30dad6bfce63 (PUSH_FAILURE_POINT, POP_FAILURE_POINT): Don't push or pop
Richard M. Stallman <rms@gnu.org>
parents: 12570
diff changeset
1186 REG_MATCH_NULL_STRING_P (reg_info[this_reg])); \
30dad6bfce63 (PUSH_FAILURE_POINT, POP_FAILURE_POINT): Don't push or pop
Richard M. Stallman <rms@gnu.org>
parents: 12570
diff changeset
1187 DEBUG_PRINT2 (" active=%d", IS_ACTIVE (reg_info[this_reg])); \
30dad6bfce63 (PUSH_FAILURE_POINT, POP_FAILURE_POINT): Don't push or pop
Richard M. Stallman <rms@gnu.org>
parents: 12570
diff changeset
1188 DEBUG_PRINT2 (" matched_something=%d", \
30dad6bfce63 (PUSH_FAILURE_POINT, POP_FAILURE_POINT): Don't push or pop
Richard M. Stallman <rms@gnu.org>
parents: 12570
diff changeset
1189 MATCHED_SOMETHING (reg_info[this_reg])); \
30dad6bfce63 (PUSH_FAILURE_POINT, POP_FAILURE_POINT): Don't push or pop
Richard M. Stallman <rms@gnu.org>
parents: 12570
diff changeset
1190 DEBUG_PRINT2 (" ever_matched=%d", \
30dad6bfce63 (PUSH_FAILURE_POINT, POP_FAILURE_POINT): Don't push or pop
Richard M. Stallman <rms@gnu.org>
parents: 12570
diff changeset
1191 EVER_MATCHED_SOMETHING (reg_info[this_reg])); \
30dad6bfce63 (PUSH_FAILURE_POINT, POP_FAILURE_POINT): Don't push or pop
Richard M. Stallman <rms@gnu.org>
parents: 12570
diff changeset
1192 DEBUG_PRINT1 ("\n"); \
30dad6bfce63 (PUSH_FAILURE_POINT, POP_FAILURE_POINT): Don't push or pop
Richard M. Stallman <rms@gnu.org>
parents: 12570
diff changeset
1193 PUSH_FAILURE_ELT (reg_info[this_reg].word); \
30dad6bfce63 (PUSH_FAILURE_POINT, POP_FAILURE_POINT): Don't push or pop
Richard M. Stallman <rms@gnu.org>
parents: 12570
diff changeset
1194 } \
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1195 \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1196 DEBUG_PRINT2 (" Pushing low active reg: %d\n", lowest_active_reg);\
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1197 PUSH_FAILURE_INT (lowest_active_reg); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1198 \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1199 DEBUG_PRINT2 (" Pushing high active reg: %d\n", highest_active_reg);\
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1200 PUSH_FAILURE_INT (highest_active_reg); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1201 \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1202 DEBUG_PRINT2 (" Pushing pattern 0x%x: ", pattern_place); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1203 DEBUG_PRINT_COMPILED_PATTERN (bufp, pattern_place, pend); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1204 PUSH_FAILURE_POINTER (pattern_place); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1205 \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1206 DEBUG_PRINT2 (" Pushing string 0x%x: `", string_place); \
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1207 DEBUG_PRINT_DOUBLE_STRING (string_place, string1, size1, string2, \
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1208 size2); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1209 DEBUG_PRINT1 ("'\n"); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1210 PUSH_FAILURE_POINTER (string_place); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1211 \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1212 DEBUG_PRINT2 (" Pushing failure id: %u\n", failure_id); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1213 DEBUG_PUSH (failure_id); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1214 } while (0)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1215
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1216 /* This is the number of items that are pushed and popped on the stack
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1217 for each register. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1218 #define NUM_REG_ITEMS 3
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1219
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1220 /* Individual items aside from the registers. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1221 #ifdef DEBUG
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1222 #define NUM_NONREG_ITEMS 5 /* Includes failure point id. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1223 #else
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1224 #define NUM_NONREG_ITEMS 4
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1225 #endif
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1226
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1227 /* We push at most this many items on the stack. */
15011
994f5cef3de6 (MAX_FAILURE_ITEMS): Use 5 instead of actual number of regs.
Richard M. Stallman <rms@gnu.org>
parents: 14414
diff changeset
1228 /* We used to use (num_regs - 1), which is the number of registers
994f5cef3de6 (MAX_FAILURE_ITEMS): Use 5 instead of actual number of regs.
Richard M. Stallman <rms@gnu.org>
parents: 14414
diff changeset
1229 this regexp will save; but that was changed to 5
994f5cef3de6 (MAX_FAILURE_ITEMS): Use 5 instead of actual number of regs.
Richard M. Stallman <rms@gnu.org>
parents: 14414
diff changeset
1230 to avoid stack overflow for a regexp with lots of parens. */
994f5cef3de6 (MAX_FAILURE_ITEMS): Use 5 instead of actual number of regs.
Richard M. Stallman <rms@gnu.org>
parents: 14414
diff changeset
1231 #define MAX_FAILURE_ITEMS (5 * NUM_REG_ITEMS + NUM_NONREG_ITEMS)
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1232
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1233 /* We actually push this many items. */
12931
30dad6bfce63 (PUSH_FAILURE_POINT, POP_FAILURE_POINT): Don't push or pop
Richard M. Stallman <rms@gnu.org>
parents: 12570
diff changeset
1234 #define NUM_FAILURE_ITEMS \
13517
e50cebfd1d7a (NUM_FAILURE_ITEMS, POP_FAILURE_POINT, PUSH_FAILURE_POINT):
Richard M. Stallman <rms@gnu.org>
parents: 13323
diff changeset
1235 (((0 \
12931
30dad6bfce63 (PUSH_FAILURE_POINT, POP_FAILURE_POINT): Don't push or pop
Richard M. Stallman <rms@gnu.org>
parents: 12570
diff changeset
1236 ? 0 : highest_active_reg - lowest_active_reg + 1) \
30dad6bfce63 (PUSH_FAILURE_POINT, POP_FAILURE_POINT): Don't push or pop
Richard M. Stallman <rms@gnu.org>
parents: 12570
diff changeset
1237 * NUM_REG_ITEMS) \
30dad6bfce63 (PUSH_FAILURE_POINT, POP_FAILURE_POINT): Don't push or pop
Richard M. Stallman <rms@gnu.org>
parents: 12570
diff changeset
1238 + NUM_NONREG_ITEMS)
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1239
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1240 /* How many items can still be added to the stack without overflowing it. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1241 #define REMAINING_AVAIL_SLOTS ((fail_stack).size - (fail_stack).avail)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1242
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1243
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1244 /* Pops what PUSH_FAIL_STACK pushes.
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1245
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1246 We restore into the parameters, all of which should be lvalues:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1247 STR -- the saved data position.
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1248 PAT -- the saved pattern position.
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1249 LOW_REG, HIGH_REG -- the highest and lowest active registers.
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1250 REGSTART, REGEND -- arrays of string positions.
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1251 REG_INFO -- array of information about each subexpression.
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
1252
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1253 Also assumes the variables `fail_stack' and (if debugging), `bufp',
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1254 `pend', `string1', `size1', `string2', and `size2'. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1255
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1256 #define POP_FAILURE_POINT(str, pat, low_reg, high_reg, regstart, regend, reg_info)\
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1257 { \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1258 DEBUG_STATEMENT (fail_stack_elt_t failure_id;) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1259 int this_reg; \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1260 const unsigned char *string_temp; \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1261 \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1262 assert (!FAIL_STACK_EMPTY ()); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1263 \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1264 /* Remove failure points and point to how many regs pushed. */ \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1265 DEBUG_PRINT1 ("POP_FAILURE_POINT:\n"); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1266 DEBUG_PRINT2 (" Before pop, next avail: %d\n", fail_stack.avail); \
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1267 DEBUG_PRINT2 (" size: %d\n", fail_stack.size); \
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1268 \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1269 assert (fail_stack.avail >= NUM_NONREG_ITEMS); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1270 \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1271 DEBUG_POP (&failure_id); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1272 DEBUG_PRINT2 (" Popping failure id: %u\n", failure_id); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1273 \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1274 /* If the saved string location is NULL, it came from an \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1275 on_failure_keep_string_jump opcode, and we want to throw away the \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1276 saved NULL, thus retaining our current position in the string. */ \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1277 string_temp = POP_FAILURE_POINTER (); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1278 if (string_temp != NULL) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1279 str = (const char *) string_temp; \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1280 \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1281 DEBUG_PRINT2 (" Popping string 0x%x: `", str); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1282 DEBUG_PRINT_DOUBLE_STRING (str, string1, size1, string2, size2); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1283 DEBUG_PRINT1 ("'\n"); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1284 \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1285 pat = (unsigned char *) POP_FAILURE_POINTER (); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1286 DEBUG_PRINT2 (" Popping pattern 0x%x: ", pat); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1287 DEBUG_PRINT_COMPILED_PATTERN (bufp, pat, pend); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1288 \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1289 /* Restore register info. */ \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1290 high_reg = (unsigned) POP_FAILURE_INT (); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1291 DEBUG_PRINT2 (" Popping high active reg: %d\n", high_reg); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1292 \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1293 low_reg = (unsigned) POP_FAILURE_INT (); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1294 DEBUG_PRINT2 (" Popping low active reg: %d\n", low_reg); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1295 \
13517
e50cebfd1d7a (NUM_FAILURE_ITEMS, POP_FAILURE_POINT, PUSH_FAILURE_POINT):
Richard M. Stallman <rms@gnu.org>
parents: 13323
diff changeset
1296 if (1) \
12931
30dad6bfce63 (PUSH_FAILURE_POINT, POP_FAILURE_POINT): Don't push or pop
Richard M. Stallman <rms@gnu.org>
parents: 12570
diff changeset
1297 for (this_reg = high_reg; this_reg >= low_reg; this_reg--) \
30dad6bfce63 (PUSH_FAILURE_POINT, POP_FAILURE_POINT): Don't push or pop
Richard M. Stallman <rms@gnu.org>
parents: 12570
diff changeset
1298 { \
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1299 DEBUG_PRINT2 (" Popping reg: %d\n", this_reg); \
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1300 \
12931
30dad6bfce63 (PUSH_FAILURE_POINT, POP_FAILURE_POINT): Don't push or pop
Richard M. Stallman <rms@gnu.org>
parents: 12570
diff changeset
1301 reg_info[this_reg].word = POP_FAILURE_ELT (); \
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1302 DEBUG_PRINT2 (" info: 0x%x\n", reg_info[this_reg]); \
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1303 \
12931
30dad6bfce63 (PUSH_FAILURE_POINT, POP_FAILURE_POINT): Don't push or pop
Richard M. Stallman <rms@gnu.org>
parents: 12570
diff changeset
1304 regend[this_reg] = (const char *) POP_FAILURE_POINTER (); \
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1305 DEBUG_PRINT2 (" end: 0x%x\n", regend[this_reg]); \
12931
30dad6bfce63 (PUSH_FAILURE_POINT, POP_FAILURE_POINT): Don't push or pop
Richard M. Stallman <rms@gnu.org>
parents: 12570
diff changeset
1306 \
30dad6bfce63 (PUSH_FAILURE_POINT, POP_FAILURE_POINT): Don't push or pop
Richard M. Stallman <rms@gnu.org>
parents: 12570
diff changeset
1307 regstart[this_reg] = (const char *) POP_FAILURE_POINTER (); \
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1308 DEBUG_PRINT2 (" start: 0x%x\n", regstart[this_reg]); \
12931
30dad6bfce63 (PUSH_FAILURE_POINT, POP_FAILURE_POINT): Don't push or pop
Richard M. Stallman <rms@gnu.org>
parents: 12570
diff changeset
1309 } \
13250
52e053f46f76 (TRANSLATE, PATFETCH): Cast elt of `translate'.
Richard M. Stallman <rms@gnu.org>
parents: 13100
diff changeset
1310 else \
52e053f46f76 (TRANSLATE, PATFETCH): Cast elt of `translate'.
Richard M. Stallman <rms@gnu.org>
parents: 13100
diff changeset
1311 { \
52e053f46f76 (TRANSLATE, PATFETCH): Cast elt of `translate'.
Richard M. Stallman <rms@gnu.org>
parents: 13100
diff changeset
1312 for (this_reg = highest_active_reg; this_reg > high_reg; this_reg--) \
52e053f46f76 (TRANSLATE, PATFETCH): Cast elt of `translate'.
Richard M. Stallman <rms@gnu.org>
parents: 13100
diff changeset
1313 { \
13323
679c9edb12c5 (POP_FAILURE_POINT): Use .word.integer.
Richard M. Stallman <rms@gnu.org>
parents: 13273
diff changeset
1314 reg_info[this_reg].word.integer = 0; \
13250
52e053f46f76 (TRANSLATE, PATFETCH): Cast elt of `translate'.
Richard M. Stallman <rms@gnu.org>
parents: 13100
diff changeset
1315 regend[this_reg] = 0; \
52e053f46f76 (TRANSLATE, PATFETCH): Cast elt of `translate'.
Richard M. Stallman <rms@gnu.org>
parents: 13100
diff changeset
1316 regstart[this_reg] = 0; \
52e053f46f76 (TRANSLATE, PATFETCH): Cast elt of `translate'.
Richard M. Stallman <rms@gnu.org>
parents: 13100
diff changeset
1317 } \
52e053f46f76 (TRANSLATE, PATFETCH): Cast elt of `translate'.
Richard M. Stallman <rms@gnu.org>
parents: 13100
diff changeset
1318 highest_active_reg = high_reg; \
52e053f46f76 (TRANSLATE, PATFETCH): Cast elt of `translate'.
Richard M. Stallman <rms@gnu.org>
parents: 13100
diff changeset
1319 } \
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1320 \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1321 set_regs_matched_done = 0; \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1322 DEBUG_STATEMENT (nfailure_points_popped++); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1323 } /* POP_FAILURE_POINT */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1324
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1325
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1326
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1327 /* Structure for per-register (a.k.a. per-group) information.
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1328 Other register information, such as the
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1329 starting and ending positions (which are addresses), and the list of
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1330 inner groups (which is a bits list) are maintained in separate
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
1331 variables.
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
1332
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1333 We are making a (strictly speaking) nonportable assumption here: that
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1334 the compiler will pack our bit fields into something that fits into
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1335 the type of `word', i.e., is something that fits into one item on the
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1336 failure stack. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1337
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1338 typedef union
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1339 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1340 fail_stack_elt_t word;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1341 struct
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1342 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1343 /* This field is one if this group can match the empty string,
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1344 zero if not. If not yet determined, `MATCH_NULL_UNSET_VALUE'. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1345 #define MATCH_NULL_UNSET_VALUE 3
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1346 unsigned match_null_string_p : 2;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1347 unsigned is_active : 1;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1348 unsigned matched_something : 1;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1349 unsigned ever_matched_something : 1;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1350 } bits;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1351 } register_info_type;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1352
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1353 #define REG_MATCH_NULL_STRING_P(R) ((R).bits.match_null_string_p)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1354 #define IS_ACTIVE(R) ((R).bits.is_active)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1355 #define MATCHED_SOMETHING(R) ((R).bits.matched_something)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1356 #define EVER_MATCHED_SOMETHING(R) ((R).bits.ever_matched_something)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1357
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1358
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1359 /* Call this when have matched a real character; it sets `matched' flags
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1360 for the subexpressions which we are currently inside. Also records
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1361 that those subexprs have matched. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1362 #define SET_REGS_MATCHED() \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1363 do \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1364 { \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1365 if (!set_regs_matched_done) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1366 { \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1367 unsigned r; \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1368 set_regs_matched_done = 1; \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1369 for (r = lowest_active_reg; r <= highest_active_reg; r++) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1370 { \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1371 MATCHED_SOMETHING (reg_info[r]) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1372 = EVER_MATCHED_SOMETHING (reg_info[r]) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1373 = 1; \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1374 } \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1375 } \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1376 } \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1377 while (0)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1378
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1379 /* Registers are set to a sentinel when they haven't yet matched. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1380 static char reg_unset_dummy;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1381 #define REG_UNSET_VALUE (&reg_unset_dummy)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1382 #define REG_UNSET(e) ((e) == REG_UNSET_VALUE)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1383
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1384 /* Subroutine declarations and macros for regex_compile. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1385
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1386 static void store_op1 (), store_op2 ();
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1387 static void insert_op1 (), insert_op2 ();
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1388 static boolean at_begline_loc_p (), at_endline_loc_p ();
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1389 static boolean group_in_compile_stack ();
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1390 static reg_errcode_t compile_range ();
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1391
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
1392 /* Fetch the next character in the uncompiled pattern---translating it
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1393 if necessary. Also cast from a signed character in the constant
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1394 string passed to us by the user to an unsigned char that we can use
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1395 as an array index (in, e.g., `translate'). */
13250
52e053f46f76 (TRANSLATE, PATFETCH): Cast elt of `translate'.
Richard M. Stallman <rms@gnu.org>
parents: 13100
diff changeset
1396 #ifndef PATFETCH
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1397 #define PATFETCH(c) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1398 do {if (p == pend) return REG_EEND; \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1399 c = (unsigned char) *p++; \
13250
52e053f46f76 (TRANSLATE, PATFETCH): Cast elt of `translate'.
Richard M. Stallman <rms@gnu.org>
parents: 13100
diff changeset
1400 if (translate) c = (unsigned char) translate[c]; \
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1401 } while (0)
13250
52e053f46f76 (TRANSLATE, PATFETCH): Cast elt of `translate'.
Richard M. Stallman <rms@gnu.org>
parents: 13100
diff changeset
1402 #endif
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1403
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1404 /* Fetch the next character in the uncompiled pattern, with no
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1405 translation. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1406 #define PATFETCH_RAW(c) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1407 do {if (p == pend) return REG_EEND; \
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1408 c = (unsigned char) *p++; \
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1409 } while (0)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1410
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1411 /* Go backwards one character in the pattern. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1412 #define PATUNFETCH p--
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1413
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1414
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1415 /* If `translate' is non-null, return translate[D], else just D. We
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1416 cast the subscript to translate because some data is declared as
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1417 `char *', to avoid warnings when a string constant is passed. But
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1418 when we use a character as a subscript we must make it unsigned. */
13250
52e053f46f76 (TRANSLATE, PATFETCH): Cast elt of `translate'.
Richard M. Stallman <rms@gnu.org>
parents: 13100
diff changeset
1419 #ifndef TRANSLATE
52e053f46f76 (TRANSLATE, PATFETCH): Cast elt of `translate'.
Richard M. Stallman <rms@gnu.org>
parents: 13100
diff changeset
1420 #define TRANSLATE(d) \
52e053f46f76 (TRANSLATE, PATFETCH): Cast elt of `translate'.
Richard M. Stallman <rms@gnu.org>
parents: 13100
diff changeset
1421 (translate ? (char) translate[(unsigned char) (d)] : (d))
52e053f46f76 (TRANSLATE, PATFETCH): Cast elt of `translate'.
Richard M. Stallman <rms@gnu.org>
parents: 13100
diff changeset
1422 #endif
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1423
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1424
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1425 /* Macros for outputting the compiled pattern into `buffer'. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1426
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1427 /* If the buffer isn't allocated when it comes in, use this. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1428 #define INIT_BUF_SIZE 32
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1429
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1430 /* Make sure we have at least N more bytes of space in buffer. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1431 #define GET_BUFFER_SPACE(n) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1432 while (b - bufp->buffer + (n) > bufp->allocated) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1433 EXTEND_BUFFER ()
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1434
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1435 /* Make sure we have one more byte of buffer space and then add C to it. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1436 #define BUF_PUSH(c) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1437 do { \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1438 GET_BUFFER_SPACE (1); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1439 *b++ = (unsigned char) (c); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1440 } while (0)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1441
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1442
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1443 /* Ensure we have two more bytes of buffer space and then append C1 and C2. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1444 #define BUF_PUSH_2(c1, c2) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1445 do { \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1446 GET_BUFFER_SPACE (2); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1447 *b++ = (unsigned char) (c1); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1448 *b++ = (unsigned char) (c2); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1449 } while (0)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1450
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1451
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1452 /* As with BUF_PUSH_2, except for three bytes. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1453 #define BUF_PUSH_3(c1, c2, c3) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1454 do { \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1455 GET_BUFFER_SPACE (3); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1456 *b++ = (unsigned char) (c1); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1457 *b++ = (unsigned char) (c2); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1458 *b++ = (unsigned char) (c3); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1459 } while (0)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1460
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1461
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1462 /* Store a jump with opcode OP at LOC to location TO. We store a
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1463 relative address offset by the three bytes the jump itself occupies. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1464 #define STORE_JUMP(op, loc, to) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1465 store_op1 (op, loc, (to) - (loc) - 3)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1466
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1467 /* Likewise, for a two-argument jump. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1468 #define STORE_JUMP2(op, loc, to, arg) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1469 store_op2 (op, loc, (to) - (loc) - 3, arg)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1470
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1471 /* Like `STORE_JUMP', but for inserting. Assume `b' is the buffer end. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1472 #define INSERT_JUMP(op, loc, to) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1473 insert_op1 (op, loc, (to) - (loc) - 3, b)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1474
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1475 /* Like `STORE_JUMP2', but for inserting. Assume `b' is the buffer end. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1476 #define INSERT_JUMP2(op, loc, to, arg) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1477 insert_op2 (op, loc, (to) - (loc) - 3, arg, b)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1478
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1479
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1480 /* This is not an arbitrary limit: the arguments which represent offsets
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1481 into the pattern are two bytes long. So if 2^16 bytes turns out to
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1482 be too small, many things would have to change. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1483 #define MAX_BUF_SIZE (1L << 16)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1484
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1485
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1486 /* Extend the buffer by twice its current size via realloc and
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1487 reset the pointers that pointed into the old block to point to the
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1488 correct places in the new one. If extending the buffer results in it
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1489 being larger than MAX_BUF_SIZE, then flag memory exhausted. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1490 #define EXTEND_BUFFER() \
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1491 do { \
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1492 unsigned char *old_buffer = bufp->buffer; \
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1493 if (bufp->allocated == MAX_BUF_SIZE) \
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1494 return REG_ESIZE; \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1495 bufp->allocated <<= 1; \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1496 if (bufp->allocated > MAX_BUF_SIZE) \
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1497 bufp->allocated = MAX_BUF_SIZE; \
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1498 bufp->buffer = (unsigned char *) realloc (bufp->buffer, bufp->allocated);\
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1499 if (bufp->buffer == NULL) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1500 return REG_ESPACE; \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1501 /* If the buffer moved, move all the pointers into it. */ \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1502 if (old_buffer != bufp->buffer) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1503 { \
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1504 b = (b - old_buffer) + bufp->buffer; \
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1505 begalt = (begalt - old_buffer) + bufp->buffer; \
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1506 if (fixup_alt_jump) \
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1507 fixup_alt_jump = (fixup_alt_jump - old_buffer) + bufp->buffer;\
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1508 if (laststart) \
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1509 laststart = (laststart - old_buffer) + bufp->buffer; \
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1510 if (pending_exact) \
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1511 pending_exact = (pending_exact - old_buffer) + bufp->buffer; \
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1512 } \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1513 } while (0)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1514
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1515
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1516 /* Since we have one byte reserved for the register number argument to
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1517 {start,stop}_memory, the maximum number of groups we can report
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1518 things about is what fits in that byte. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1519 #define MAX_REGNUM 255
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1520
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1521 /* But patterns can have more than `MAX_REGNUM' registers. We just
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1522 ignore the excess. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1523 typedef unsigned regnum_t;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1524
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1525
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1526 /* Macros for the compile stack. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1527
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1528 /* Since offsets can go either forwards or backwards, this type needs to
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1529 be able to hold values from -(MAX_BUF_SIZE - 1) to MAX_BUF_SIZE - 1. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1530 typedef int pattern_offset_t;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1531
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1532 typedef struct
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1533 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1534 pattern_offset_t begalt_offset;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1535 pattern_offset_t fixup_alt_jump;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1536 pattern_offset_t inner_group_offset;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
1537 pattern_offset_t laststart_offset;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1538 regnum_t regnum;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1539 } compile_stack_elt_t;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1540
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1541
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1542 typedef struct
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1543 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1544 compile_stack_elt_t *stack;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1545 unsigned size;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1546 unsigned avail; /* Offset of next open position. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1547 } compile_stack_type;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1548
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1549
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1550 #define INIT_COMPILE_STACK_SIZE 32
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1551
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1552 #define COMPILE_STACK_EMPTY (compile_stack.avail == 0)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1553 #define COMPILE_STACK_FULL (compile_stack.avail == compile_stack.size)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1554
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1555 /* The next available element. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1556 #define COMPILE_STACK_TOP (compile_stack.stack[compile_stack.avail])
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1557
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1558
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1559 /* Set the bit for character C in a list. */
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1560 #define SET_LIST_BIT(c) \
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1561 (b[((unsigned char) (c)) / BYTEWIDTH] \
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1562 |= 1 << (((unsigned char) c) % BYTEWIDTH))
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1563
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1564
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1565 /* Get the next unsigned number in the uncompiled pattern. */
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1566 #define GET_UNSIGNED_NUMBER(num) \
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1567 { if (p != pend) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1568 { \
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1569 PATFETCH (c); \
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1570 while (ISDIGIT (c)) \
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1571 { \
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1572 if (num < 0) \
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1573 num = 0; \
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1574 num = num * 10 + c - '0'; \
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1575 if (p == pend) \
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1576 break; \
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1577 PATFETCH (c); \
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1578 } \
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1579 } \
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
1580 }
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1581
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1582 #define CHAR_CLASS_MAX_LENGTH 6 /* Namely, `xdigit'. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1583
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1584 #define IS_CHAR_CLASS(string) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1585 (STREQ (string, "alpha") || STREQ (string, "upper") \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1586 || STREQ (string, "lower") || STREQ (string, "digit") \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1587 || STREQ (string, "alnum") || STREQ (string, "xdigit") \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1588 || STREQ (string, "space") || STREQ (string, "print") \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1589 || STREQ (string, "punct") || STREQ (string, "graph") \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1590 || STREQ (string, "cntrl") || STREQ (string, "blank"))
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1591
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1592 #ifndef MATCH_MAY_ALLOCATE
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1593
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1594 /* If we cannot allocate large objects within re_match_2_internal,
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1595 we make the fail stack and register vectors global.
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1596 The fail stack, we grow to the maximum size when a regexp
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1597 is compiled.
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1598 The register vectors, we adjust in size each time we
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1599 compile a regexp, according to the number of registers it needs. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1600
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1601 static fail_stack_type fail_stack;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1602
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1603 /* Size with which the following vectors are currently allocated.
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1604 That is so we can make them bigger as needed,
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1605 but never make them smaller. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1606 static int regs_allocated_size;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1607
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1608 static const char ** regstart, ** regend;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1609 static const char ** old_regstart, ** old_regend;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1610 static const char **best_regstart, **best_regend;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
1611 static register_info_type *reg_info;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1612 static const char **reg_dummy;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1613 static register_info_type *reg_info_dummy;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1614
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1615 /* Make the register vectors big enough for NUM_REGS registers,
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1616 but don't make them smaller. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1617
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1618 static
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1619 regex_grow_registers (num_regs)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1620 int num_regs;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1621 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1622 if (num_regs > regs_allocated_size)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1623 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1624 RETALLOC_IF (regstart, num_regs, const char *);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1625 RETALLOC_IF (regend, num_regs, const char *);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1626 RETALLOC_IF (old_regstart, num_regs, const char *);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1627 RETALLOC_IF (old_regend, num_regs, const char *);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1628 RETALLOC_IF (best_regstart, num_regs, const char *);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1629 RETALLOC_IF (best_regend, num_regs, const char *);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1630 RETALLOC_IF (reg_info, num_regs, register_info_type);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1631 RETALLOC_IF (reg_dummy, num_regs, const char *);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1632 RETALLOC_IF (reg_info_dummy, num_regs, register_info_type);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1633
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1634 regs_allocated_size = num_regs;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1635 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1636 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1637
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1638 #endif /* not MATCH_MAY_ALLOCATE */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1639
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1640 /* `regex_compile' compiles PATTERN (of length SIZE) according to SYNTAX.
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1641 Returns one of error codes defined in `regex.h', or zero for success.
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1642
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1643 Assumes the `allocated' (and perhaps `buffer') and `translate'
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1644 fields are set in BUFP on entry.
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1645
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1646 If it succeeds, results are put in BUFP (if it returns an error, the
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1647 contents of BUFP are undefined):
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1648 `buffer' is the compiled pattern;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1649 `syntax' is set to SYNTAX;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1650 `used' is set to the length of the compiled pattern;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1651 `fastmap_accurate' is zero;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1652 `re_nsub' is the number of subexpressions in PATTERN;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1653 `not_bol' and `not_eol' are zero;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
1654
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1655 The `fastmap' and `newline_anchor' fields are neither
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1656 examined nor set. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1657
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1658 /* Return, freeing storage we allocated. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1659 #define FREE_STACK_RETURN(value) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1660 return (free (compile_stack.stack), value)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1661
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1662 static reg_errcode_t
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1663 regex_compile (pattern, size, syntax, bufp)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1664 const char *pattern;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1665 int size;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1666 reg_syntax_t syntax;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1667 struct re_pattern_buffer *bufp;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1668 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1669 /* We fetch characters from PATTERN here. Even though PATTERN is
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1670 `char *' (i.e., signed), we declare these variables as unsigned, so
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1671 they can be reliably used as array indices. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1672 register unsigned char c, c1;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
1673
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1674 /* A random temporary spot in PATTERN. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1675 const char *p1;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1676
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1677 /* Points to the end of the buffer, where we should append. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1678 register unsigned char *b;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
1679
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1680 /* Keeps track of unclosed groups. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1681 compile_stack_type compile_stack;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1682
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1683 /* Points to the current (ending) position in the pattern. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1684 const char *p = pattern;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1685 const char *pend = pattern + size;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
1686
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1687 /* How to translate the characters in the pattern. */
13250
52e053f46f76 (TRANSLATE, PATFETCH): Cast elt of `translate'.
Richard M. Stallman <rms@gnu.org>
parents: 13100
diff changeset
1688 RE_TRANSLATE_TYPE translate = bufp->translate;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1689
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1690 /* Address of the count-byte of the most recently inserted `exactn'
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1691 command. This makes it possible to tell if a new exact-match
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1692 character can be added to that command or if the character requires
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1693 a new `exactn' command. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1694 unsigned char *pending_exact = 0;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1695
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1696 /* Address of start of the most recently finished expression.
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1697 This tells, e.g., postfix * where to find the start of its
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1698 operand. Reset at the beginning of groups and alternatives. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1699 unsigned char *laststart = 0;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1700
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1701 /* Address of beginning of regexp, or inside of last group. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1702 unsigned char *begalt;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1703
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1704 /* Place in the uncompiled pattern (i.e., the {) to
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1705 which to go back if the interval is invalid. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1706 const char *beg_interval;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
1707
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1708 /* Address of the place where a forward jump should go to the end of
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1709 the containing expression. Each alternative of an `or' -- except the
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1710 last -- ends with a forward jump of this sort. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1711 unsigned char *fixup_alt_jump = 0;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1712
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1713 /* Counts open-groups as they are encountered. Remembered for the
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1714 matching close-group on the compile stack, so the same register
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1715 number is put in the stop_memory as the start_memory. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1716 regnum_t regnum = 0;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1717
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1718 #ifdef DEBUG
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1719 DEBUG_PRINT1 ("\nCompiling pattern: ");
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1720 if (debug)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1721 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1722 unsigned debug_count;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
1723
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1724 for (debug_count = 0; debug_count < size; debug_count++)
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1725 putchar (pattern[debug_count]);
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1726 putchar ('\n');
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1727 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1728 #endif /* DEBUG */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1729
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1730 /* Initialize the compile stack. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1731 compile_stack.stack = TALLOC (INIT_COMPILE_STACK_SIZE, compile_stack_elt_t);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1732 if (compile_stack.stack == NULL)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1733 return REG_ESPACE;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1734
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1735 compile_stack.size = INIT_COMPILE_STACK_SIZE;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1736 compile_stack.avail = 0;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1737
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1738 /* Initialize the pattern buffer. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1739 bufp->syntax = syntax;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1740 bufp->fastmap_accurate = 0;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1741 bufp->not_bol = bufp->not_eol = 0;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1742
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1743 /* Set `used' to zero, so that if we return an error, the pattern
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1744 printer (for debugging) will think there's no pattern. We reset it
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1745 at the end. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1746 bufp->used = 0;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
1747
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1748 /* Always count groups, whether or not bufp->no_sub is set. */
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
1749 bufp->re_nsub = 0;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1750
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1751 #if !defined (emacs) && !defined (SYNTAX_TABLE)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1752 /* Initialize the syntax table. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1753 init_syntax_once ();
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1754 #endif
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1755
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1756 if (bufp->allocated == 0)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1757 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1758 if (bufp->buffer)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1759 { /* If zero allocated, but buffer is non-null, try to realloc
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1760 enough space. This loses if buffer's address is bogus, but
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1761 that is the user's responsibility. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1762 RETALLOC (bufp->buffer, INIT_BUF_SIZE, unsigned char);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1763 }
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1764 else
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1765 { /* Caller did not allocate a buffer. Do it for them. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1766 bufp->buffer = TALLOC (INIT_BUF_SIZE, unsigned char);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1767 }
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1768 if (!bufp->buffer) FREE_STACK_RETURN (REG_ESPACE);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1769
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1770 bufp->allocated = INIT_BUF_SIZE;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1771 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1772
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1773 begalt = b = bufp->buffer;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1774
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1775 /* Loop through the uncompiled pattern until we're at the end. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1776 while (p != pend)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1777 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1778 PATFETCH (c);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1779
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1780 switch (c)
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1781 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1782 case '^':
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1783 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1784 if ( /* If at start of pattern, it's an operator. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1785 p == pattern + 1
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1786 /* If context independent, it's an operator. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1787 || syntax & RE_CONTEXT_INDEP_ANCHORS
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1788 /* Otherwise, depends on what's come before. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1789 || at_begline_loc_p (pattern, p, syntax))
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1790 BUF_PUSH (begline);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1791 else
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1792 goto normal_char;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1793 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1794 break;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1795
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1796
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1797 case '$':
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1798 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1799 if ( /* If at end of pattern, it's an operator. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1800 p == pend
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1801 /* If context independent, it's an operator. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1802 || syntax & RE_CONTEXT_INDEP_ANCHORS
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1803 /* Otherwise, depends on what's next. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1804 || at_endline_loc_p (p, pend, syntax))
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1805 BUF_PUSH (endline);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1806 else
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1807 goto normal_char;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1808 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1809 break;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1810
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1811
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1812 case '+':
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1813 case '?':
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1814 if ((syntax & RE_BK_PLUS_QM)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1815 || (syntax & RE_LIMITED_OPS))
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1816 goto normal_char;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1817 handle_plus:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1818 case '*':
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1819 /* If there is no previous pattern... */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1820 if (!laststart)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1821 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1822 if (syntax & RE_CONTEXT_INVALID_OPS)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1823 FREE_STACK_RETURN (REG_BADRPT);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1824 else if (!(syntax & RE_CONTEXT_INDEP_OPS))
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1825 goto normal_char;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1826 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1827
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1828 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1829 /* Are we optimizing this jump? */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1830 boolean keep_string_p = false;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1831
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1832 /* 1 means zero (many) matches is allowed. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1833 char zero_times_ok = 0, many_times_ok = 0;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1834
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1835 /* If there is a sequence of repetition chars, collapse it
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1836 down to just one (the right one). We can't combine
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1837 interval operators with these because of, e.g., `a{2}*',
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1838 which should only match an even number of `a's. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1839
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1840 for (;;)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1841 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1842 zero_times_ok |= c != '+';
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1843 many_times_ok |= c != '?';
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1844
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1845 if (p == pend)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1846 break;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1847
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1848 PATFETCH (c);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1849
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1850 if (c == '*'
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1851 || (!(syntax & RE_BK_PLUS_QM) && (c == '+' || c == '?')))
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1852 ;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1853
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1854 else if (syntax & RE_BK_PLUS_QM && c == '\\')
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1855 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1856 if (p == pend) FREE_STACK_RETURN (REG_EESCAPE);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1857
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1858 PATFETCH (c1);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1859 if (!(c1 == '+' || c1 == '?'))
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1860 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1861 PATUNFETCH;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1862 PATUNFETCH;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1863 break;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1864 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1865
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1866 c = c1;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1867 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1868 else
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1869 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1870 PATUNFETCH;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1871 break;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1872 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1873
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1874 /* If we get here, we found another repeat character. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1875 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1876
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1877 /* Star, etc. applied to an empty pattern is equivalent
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1878 to an empty pattern. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1879 if (!laststart)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1880 break;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1881
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1882 /* Now we know whether or not zero matches is allowed
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1883 and also whether or not two or more matches is allowed. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1884 if (many_times_ok)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1885 { /* More than one repetition is allowed, so put in at the
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1886 end a backward relative jump from `b' to before the next
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1887 jump we're going to put in below (which jumps from
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1888 laststart to after this jump).
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1889
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1890 But if we are at the `*' in the exact sequence `.*\n',
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1891 insert an unconditional jump backwards to the .,
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1892 instead of the beginning of the loop. This way we only
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1893 push a failure point once, instead of every time
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1894 through the loop. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1895 assert (p - 1 > pattern);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1896
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1897 /* Allocate the space for the jump. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1898 GET_BUFFER_SPACE (3);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1899
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1900 /* We know we are not at the first character of the pattern,
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1901 because laststart was nonzero. And we've already
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1902 incremented `p', by the way, to be the character after
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1903 the `*'. Do we have to do something analogous here
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1904 for null bytes, because of RE_DOT_NOT_NULL? */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1905 if (TRANSLATE (*(p - 2)) == TRANSLATE ('.')
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1906 && zero_times_ok
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1907 && p < pend && TRANSLATE (*p) == TRANSLATE ('\n')
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1908 && !(syntax & RE_DOT_NEWLINE))
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1909 { /* We have .*\n. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1910 STORE_JUMP (jump, b, laststart);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1911 keep_string_p = true;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1912 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1913 else
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1914 /* Anything else. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1915 STORE_JUMP (maybe_pop_jump, b, laststart - 3);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1916
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1917 /* We've added more stuff to the buffer. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1918 b += 3;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1919 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1920
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1921 /* On failure, jump from laststart to b + 3, which will be the
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1922 end of the buffer after this jump is inserted. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1923 GET_BUFFER_SPACE (3);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1924 INSERT_JUMP (keep_string_p ? on_failure_keep_string_jump
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1925 : on_failure_jump,
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1926 laststart, b + 3);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1927 pending_exact = 0;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1928 b += 3;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1929
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1930 if (!zero_times_ok)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1931 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1932 /* At least one repetition is required, so insert a
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1933 `dummy_failure_jump' before the initial
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1934 `on_failure_jump' instruction of the loop. This
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1935 effects a skip over that instruction the first time
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1936 we hit that loop. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1937 GET_BUFFER_SPACE (3);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1938 INSERT_JUMP (dummy_failure_jump, laststart, laststart + 6);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1939 b += 3;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1940 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1941 }
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1942 break;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1943
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1944
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1945 case '.':
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1946 laststart = b;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1947 BUF_PUSH (anychar);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1948 break;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1949
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1950
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1951 case '[':
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1952 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1953 boolean had_char_class = false;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1954
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1955 if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1956
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1957 /* Ensure that we have enough space to push a charset: the
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1958 opcode, the length count, and the bitset; 34 bytes in all. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1959 GET_BUFFER_SPACE (34);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
1960
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1961 laststart = b;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1962
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1963 /* We test `*p == '^' twice, instead of using an if
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1964 statement, so we only need one BUF_PUSH. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1965 BUF_PUSH (*p == '^' ? charset_not : charset);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1966 if (*p == '^')
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1967 p++;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1968
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1969 /* Remember the first position in the bracket expression. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1970 p1 = p;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1971
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1972 /* Push the number of bytes in the bitmap. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1973 BUF_PUSH ((1 << BYTEWIDTH) / BYTEWIDTH);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1974
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1975 /* Clear the whole map. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1976 bzero (b, (1 << BYTEWIDTH) / BYTEWIDTH);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1977
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1978 /* charset_not matches newline according to a syntax bit. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1979 if ((re_opcode_t) b[-2] == charset_not
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1980 && (syntax & RE_HAT_LISTS_NOT_NEWLINE))
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1981 SET_LIST_BIT ('\n');
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1982
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1983 /* Read in characters and ranges, setting map bits. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1984 for (;;)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1985 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1986 if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1987
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1988 PATFETCH (c);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1989
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1990 /* \ might escape characters inside [...] and [^...]. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1991 if ((syntax & RE_BACKSLASH_ESCAPE_IN_LISTS) && c == '\\')
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1992 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1993 if (p == pend) FREE_STACK_RETURN (REG_EESCAPE);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1994
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1995 PATFETCH (c1);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1996 SET_LIST_BIT (c1);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1997 continue;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1998 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
1999
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2000 /* Could be the end of the bracket expression. If it's
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2001 not (i.e., when the bracket expression is `[]' so
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2002 far), the ']' character bit gets set way below. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2003 if (c == ']' && p != p1 + 1)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2004 break;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2005
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2006 /* Look ahead to see if it's a range when the last thing
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2007 was a character class. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2008 if (had_char_class && c == '-' && *p != ']')
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2009 FREE_STACK_RETURN (REG_ERANGE);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2011 /* Look ahead to see if it's a range when the last thing
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2012 was a character: if this is a hyphen not at the
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2013 beginning or the end of a list, then it's the range
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2014 operator. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2015 if (c == '-'
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2016 && !(p - 2 >= pattern && p[-2] == '[')
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2017 && !(p - 3 >= pattern && p[-3] == '[' && p[-2] == '^')
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2018 && *p != ']')
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2019 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2020 reg_errcode_t ret
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2021 = compile_range (&p, pend, translate, syntax, b);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2022 if (ret != REG_NOERROR) FREE_STACK_RETURN (ret);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2023 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2024
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2025 else if (p[0] == '-' && p[1] != ']')
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2026 { /* This handles ranges made up of characters only. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2027 reg_errcode_t ret;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2028
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2029 /* Move past the `-'. */
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2030 PATFETCH (c1);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2031
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2032 ret = compile_range (&p, pend, translate, syntax, b);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2033 if (ret != REG_NOERROR) FREE_STACK_RETURN (ret);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2034 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2035
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2036 /* See if we're at the beginning of a possible character
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2037 class. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2038
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2039 else if (syntax & RE_CHAR_CLASSES && c == '[' && *p == ':')
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2040 { /* Leave room for the null. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2041 char str[CHAR_CLASS_MAX_LENGTH + 1];
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2042
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2043 PATFETCH (c);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2044 c1 = 0;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2045
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2046 /* If pattern is `[[:'. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2047 if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2048
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2049 for (;;)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2050 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2051 PATFETCH (c);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2052 if (c == ':' || c == ']' || p == pend
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2053 || c1 == CHAR_CLASS_MAX_LENGTH)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2054 break;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2055 str[c1++] = c;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2056 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2057 str[c1] = '\0';
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2058
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2059 /* If isn't a word bracketed by `[:' and:`]':
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2060 undo the ending character, the letters, and leave
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2061 the leading `:' and `[' (but set bits for them). */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2062 if (c == ':' && *p == ']')
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2063 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2064 int ch;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2065 boolean is_alnum = STREQ (str, "alnum");
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2066 boolean is_alpha = STREQ (str, "alpha");
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2067 boolean is_blank = STREQ (str, "blank");
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2068 boolean is_cntrl = STREQ (str, "cntrl");
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2069 boolean is_digit = STREQ (str, "digit");
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2070 boolean is_graph = STREQ (str, "graph");
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2071 boolean is_lower = STREQ (str, "lower");
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2072 boolean is_print = STREQ (str, "print");
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2073 boolean is_punct = STREQ (str, "punct");
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2074 boolean is_space = STREQ (str, "space");
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2075 boolean is_upper = STREQ (str, "upper");
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2076 boolean is_xdigit = STREQ (str, "xdigit");
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2077
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2078 if (!IS_CHAR_CLASS (str))
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2079 FREE_STACK_RETURN (REG_ECTYPE);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2080
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2081 /* Throw away the ] at the end of the character
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2082 class. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2083 PATFETCH (c);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2084
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2085 if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2086
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2087 for (ch = 0; ch < 1 << BYTEWIDTH; ch++)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2088 {
16239
c196d1ded35c (regex_compile): Use TRANSLATE before calling SET_LIST_BIT.
Richard M. Stallman <rms@gnu.org>
parents: 16034
diff changeset
2089 int translated = TRANSLATE (ch);
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2090 /* This was split into 3 if's to
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2091 avoid an arbitrary limit in some compiler. */
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2092 if ( (is_alnum && ISALNUM (ch))
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2093 || (is_alpha && ISALPHA (ch))
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2094 || (is_blank && ISBLANK (ch))
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2095 || (is_cntrl && ISCNTRL (ch)))
16239
c196d1ded35c (regex_compile): Use TRANSLATE before calling SET_LIST_BIT.
Richard M. Stallman <rms@gnu.org>
parents: 16034
diff changeset
2096 SET_LIST_BIT (translated);
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2097 if ( (is_digit && ISDIGIT (ch))
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2098 || (is_graph && ISGRAPH (ch))
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2099 || (is_lower && ISLOWER (ch))
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2100 || (is_print && ISPRINT (ch)))
16239
c196d1ded35c (regex_compile): Use TRANSLATE before calling SET_LIST_BIT.
Richard M. Stallman <rms@gnu.org>
parents: 16034
diff changeset
2101 SET_LIST_BIT (translated);
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2102 if ( (is_punct && ISPUNCT (ch))
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2103 || (is_space && ISSPACE (ch))
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2104 || (is_upper && ISUPPER (ch))
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2105 || (is_xdigit && ISXDIGIT (ch)))
16239
c196d1ded35c (regex_compile): Use TRANSLATE before calling SET_LIST_BIT.
Richard M. Stallman <rms@gnu.org>
parents: 16034
diff changeset
2106 SET_LIST_BIT (translated);
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2107 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2108 had_char_class = true;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2109 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2110 else
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2111 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2112 c1++;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2113 while (c1--)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2114 PATUNFETCH;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2115 SET_LIST_BIT ('[');
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2116 SET_LIST_BIT (':');
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2117 had_char_class = false;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2118 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2119 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2120 else
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2121 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2122 had_char_class = false;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2123 SET_LIST_BIT (c);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2124 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2125 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2126
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2127 /* Discard any (non)matching list bytes that are all 0 at the
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2128 end of the map. Decrease the map-length byte too. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2129 while ((int) b[-1] > 0 && b[b[-1] - 1] == 0)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2130 b[-1]--;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2131 b += b[-1];
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2132 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2133 break;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2134
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2135
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2136 case '(':
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2137 if (syntax & RE_NO_BK_PARENS)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2138 goto handle_open;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2139 else
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2140 goto normal_char;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2141
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2142
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2143 case ')':
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2144 if (syntax & RE_NO_BK_PARENS)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2145 goto handle_close;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2146 else
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2147 goto normal_char;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2148
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2149
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2150 case '\n':
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2151 if (syntax & RE_NEWLINE_ALT)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2152 goto handle_alt;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2153 else
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2154 goto normal_char;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2155
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2156
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2157 case '|':
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2158 if (syntax & RE_NO_BK_VBAR)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2159 goto handle_alt;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2160 else
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2161 goto normal_char;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2162
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2163
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2164 case '{':
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2165 if (syntax & RE_INTERVALS && syntax & RE_NO_BK_BRACES)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2166 goto handle_interval;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2167 else
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2168 goto normal_char;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2169
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2170
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2171 case '\\':
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2172 if (p == pend) FREE_STACK_RETURN (REG_EESCAPE);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2173
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2174 /* Do not translate the character after the \, so that we can
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2175 distinguish, e.g., \B from \b, even if we normally would
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2176 translate, e.g., B to b. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2177 PATFETCH_RAW (c);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2178
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2179 switch (c)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2180 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2181 case '(':
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2182 if (syntax & RE_NO_BK_PARENS)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2183 goto normal_backslash;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2184
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2185 handle_open:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2186 bufp->re_nsub++;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2187 regnum++;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2188
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2189 if (COMPILE_STACK_FULL)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2190 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2191 RETALLOC (compile_stack.stack, compile_stack.size << 1,
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2192 compile_stack_elt_t);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2193 if (compile_stack.stack == NULL) return REG_ESPACE;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2194
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2195 compile_stack.size <<= 1;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2196 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2197
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2198 /* These are the values to restore when we hit end of this
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2199 group. They are all relative offsets, so that if the
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2200 whole pattern moves because of realloc, they will still
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2201 be valid. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2202 COMPILE_STACK_TOP.begalt_offset = begalt - bufp->buffer;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2203 COMPILE_STACK_TOP.fixup_alt_jump
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2204 = fixup_alt_jump ? fixup_alt_jump - bufp->buffer + 1 : 0;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2205 COMPILE_STACK_TOP.laststart_offset = b - bufp->buffer;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2206 COMPILE_STACK_TOP.regnum = regnum;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2207
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2208 /* We will eventually replace the 0 with the number of
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2209 groups inner to this one. But do not push a
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2210 start_memory for groups beyond the last one we can
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2211 represent in the compiled pattern. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2212 if (regnum <= MAX_REGNUM)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2213 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2214 COMPILE_STACK_TOP.inner_group_offset = b - bufp->buffer + 2;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2215 BUF_PUSH_3 (start_memory, regnum, 0);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2216 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2217
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2218 compile_stack.avail++;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2219
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2220 fixup_alt_jump = 0;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2221 laststart = 0;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2222 begalt = b;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2223 /* If we've reached MAX_REGNUM groups, then this open
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2224 won't actually generate any code, so we'll have to
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2225 clear pending_exact explicitly. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2226 pending_exact = 0;
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2227 break;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2228
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2229
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2230 case ')':
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2231 if (syntax & RE_NO_BK_PARENS) goto normal_backslash;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2232
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2233 if (COMPILE_STACK_EMPTY)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2234 if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2235 goto normal_backslash;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2236 else
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2237 FREE_STACK_RETURN (REG_ERPAREN);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2238
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2239 handle_close:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2240 if (fixup_alt_jump)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2241 { /* Push a dummy failure point at the end of the
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2242 alternative for a possible future
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2243 `pop_failure_jump' to pop. See comments at
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2244 `push_dummy_failure' in `re_match_2'. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2245 BUF_PUSH (push_dummy_failure);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2246
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2247 /* We allocated space for this jump when we assigned
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2248 to `fixup_alt_jump', in the `handle_alt' case below. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2249 STORE_JUMP (jump_past_alt, fixup_alt_jump, b - 1);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2250 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2251
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2252 /* See similar code for backslashed left paren above. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2253 if (COMPILE_STACK_EMPTY)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2254 if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2255 goto normal_char;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2256 else
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2257 FREE_STACK_RETURN (REG_ERPAREN);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2258
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2259 /* Since we just checked for an empty stack above, this
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2260 ``can't happen''. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2261 assert (compile_stack.avail != 0);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2262 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2263 /* We don't just want to restore into `regnum', because
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2264 later groups should continue to be numbered higher,
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2265 as in `(ab)c(de)' -- the second group is #2. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2266 regnum_t this_group_regnum;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2267
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2268 compile_stack.avail--;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2269 begalt = bufp->buffer + COMPILE_STACK_TOP.begalt_offset;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2270 fixup_alt_jump
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2271 = COMPILE_STACK_TOP.fixup_alt_jump
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2272 ? bufp->buffer + COMPILE_STACK_TOP.fixup_alt_jump - 1
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2273 : 0;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2274 laststart = bufp->buffer + COMPILE_STACK_TOP.laststart_offset;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2275 this_group_regnum = COMPILE_STACK_TOP.regnum;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2276 /* If we've reached MAX_REGNUM groups, then this open
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2277 won't actually generate any code, so we'll have to
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2278 clear pending_exact explicitly. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2279 pending_exact = 0;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2280
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2281 /* We're at the end of the group, so now we know how many
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2282 groups were inside this one. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2283 if (this_group_regnum <= MAX_REGNUM)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2284 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2285 unsigned char *inner_group_loc
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2286 = bufp->buffer + COMPILE_STACK_TOP.inner_group_offset;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2287
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2288 *inner_group_loc = regnum - this_group_regnum;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2289 BUF_PUSH_3 (stop_memory, this_group_regnum,
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2290 regnum - this_group_regnum);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2291 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2292 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2293 break;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2294
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2295
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2296 case '|': /* `\|'. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2297 if (syntax & RE_LIMITED_OPS || syntax & RE_NO_BK_VBAR)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2298 goto normal_backslash;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2299 handle_alt:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2300 if (syntax & RE_LIMITED_OPS)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2301 goto normal_char;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2302
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2303 /* Insert before the previous alternative a jump which
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2304 jumps to this alternative if the former fails. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2305 GET_BUFFER_SPACE (3);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2306 INSERT_JUMP (on_failure_jump, begalt, b + 6);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2307 pending_exact = 0;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2308 b += 3;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2309
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2310 /* The alternative before this one has a jump after it
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2311 which gets executed if it gets matched. Adjust that
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2312 jump so it will jump to this alternative's analogous
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2313 jump (put in below, which in turn will jump to the next
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2314 (if any) alternative's such jump, etc.). The last such
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2315 jump jumps to the correct final destination. A picture:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2316 _____ _____
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2317 | | | |
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2318 | v | v
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2319 a | b | c
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2320
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2321 If we are at `b', then fixup_alt_jump right now points to a
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2322 three-byte space after `a'. We'll put in the jump, set
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2323 fixup_alt_jump to right after `b', and leave behind three
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2324 bytes which we'll fill in when we get to after `c'. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2325
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2326 if (fixup_alt_jump)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2327 STORE_JUMP (jump_past_alt, fixup_alt_jump, b);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2328
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2329 /* Mark and leave space for a jump after this alternative,
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2330 to be filled in later either by next alternative or
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2331 when know we're at the end of a series of alternatives. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2332 fixup_alt_jump = b;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2333 GET_BUFFER_SPACE (3);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2334 b += 3;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2335
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2336 laststart = 0;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2337 begalt = b;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2338 break;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2339
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2340
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2341 case '{':
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2342 /* If \{ is a literal. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2343 if (!(syntax & RE_INTERVALS)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2344 /* If we're at `\{' and it's not the open-interval
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2345 operator. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2346 || ((syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES))
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2347 || (p - 2 == pattern && p == pend))
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2348 goto normal_backslash;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2349
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2350 handle_interval:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2351 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2352 /* If got here, then the syntax allows intervals. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2353
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2354 /* At least (most) this many matches must be made. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2355 int lower_bound = -1, upper_bound = -1;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2356
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2357 beg_interval = p - 1;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2358
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2359 if (p == pend)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2360 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2361 if (syntax & RE_NO_BK_BRACES)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2362 goto unfetch_interval;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2363 else
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2364 FREE_STACK_RETURN (REG_EBRACE);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2365 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2366
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2367 GET_UNSIGNED_NUMBER (lower_bound);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2368
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2369 if (c == ',')
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2370 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2371 GET_UNSIGNED_NUMBER (upper_bound);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2372 if (upper_bound < 0) upper_bound = RE_DUP_MAX;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2373 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2374 else
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2375 /* Interval such as `{1}' => match exactly once. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2376 upper_bound = lower_bound;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2377
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2378 if (lower_bound < 0 || upper_bound > RE_DUP_MAX
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2379 || lower_bound > upper_bound)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2380 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2381 if (syntax & RE_NO_BK_BRACES)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2382 goto unfetch_interval;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2383 else
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2384 FREE_STACK_RETURN (REG_BADBR);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2385 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2386
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2387 if (!(syntax & RE_NO_BK_BRACES))
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2388 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2389 if (c != '\\') FREE_STACK_RETURN (REG_EBRACE);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2390
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2391 PATFETCH (c);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2392 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2393
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2394 if (c != '}')
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2395 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2396 if (syntax & RE_NO_BK_BRACES)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2397 goto unfetch_interval;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2398 else
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2399 FREE_STACK_RETURN (REG_BADBR);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2400 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2401
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2402 /* We just parsed a valid interval. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2403
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2404 /* If it's invalid to have no preceding re. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2405 if (!laststart)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2406 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2407 if (syntax & RE_CONTEXT_INVALID_OPS)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2408 FREE_STACK_RETURN (REG_BADRPT);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2409 else if (syntax & RE_CONTEXT_INDEP_OPS)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2410 laststart = b;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2411 else
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2412 goto unfetch_interval;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2413 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2414
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2415 /* If the upper bound is zero, don't want to succeed at
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2416 all; jump from `laststart' to `b + 3', which will be
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2417 the end of the buffer after we insert the jump. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2418 if (upper_bound == 0)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2419 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2420 GET_BUFFER_SPACE (3);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2421 INSERT_JUMP (jump, laststart, b + 3);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2422 b += 3;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2423 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2424
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2425 /* Otherwise, we have a nontrivial interval. When
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2426 we're all done, the pattern will look like:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2427 set_number_at <jump count> <upper bound>
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2428 set_number_at <succeed_n count> <lower bound>
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2429 succeed_n <after jump addr> <succeed_n count>
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2430 <body of loop>
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2431 jump_n <succeed_n addr> <jump count>
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2432 (The upper bound and `jump_n' are omitted if
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2433 `upper_bound' is 1, though.) */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2434 else
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2435 { /* If the upper bound is > 1, we need to insert
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2436 more at the end of the loop. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2437 unsigned nbytes = 10 + (upper_bound > 1) * 10;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2438
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2439 GET_BUFFER_SPACE (nbytes);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2440
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2441 /* Initialize lower bound of the `succeed_n', even
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2442 though it will be set during matching by its
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2443 attendant `set_number_at' (inserted next),
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2444 because `re_compile_fastmap' needs to know.
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2445 Jump to the `jump_n' we might insert below. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2446 INSERT_JUMP2 (succeed_n, laststart,
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2447 b + 5 + (upper_bound > 1) * 5,
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2448 lower_bound);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2449 b += 5;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2450
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2451 /* Code to initialize the lower bound. Insert
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2452 before the `succeed_n'. The `5' is the last two
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2453 bytes of this `set_number_at', plus 3 bytes of
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2454 the following `succeed_n'. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2455 insert_op2 (set_number_at, laststart, 5, lower_bound, b);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2456 b += 5;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2457
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2458 if (upper_bound > 1)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2459 { /* More than one repetition is allowed, so
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2460 append a backward jump to the `succeed_n'
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2461 that starts this interval.
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2462
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2463 When we've reached this during matching,
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2464 we'll have matched the interval once, so
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2465 jump back only `upper_bound - 1' times. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2466 STORE_JUMP2 (jump_n, b, laststart + 5,
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2467 upper_bound - 1);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2468 b += 5;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2469
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2470 /* The location we want to set is the second
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2471 parameter of the `jump_n'; that is `b-2' as
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2472 an absolute address. `laststart' will be
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2473 the `set_number_at' we're about to insert;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2474 `laststart+3' the number to set, the source
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2475 for the relative address. But we are
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2476 inserting into the middle of the pattern --
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2477 so everything is getting moved up by 5.
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2478 Conclusion: (b - 2) - (laststart + 3) + 5,
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2479 i.e., b - laststart.
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2480
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2481 We insert this at the beginning of the loop
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2482 so that if we fail during matching, we'll
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2483 reinitialize the bounds. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2484 insert_op2 (set_number_at, laststart, b - laststart,
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2485 upper_bound - 1, b);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2486 b += 5;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2487 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2488 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2489 pending_exact = 0;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2490 beg_interval = NULL;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2491 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2492 break;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2493
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2494 unfetch_interval:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2495 /* If an invalid interval, match the characters as literals. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2496 assert (beg_interval);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2497 p = beg_interval;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2498 beg_interval = NULL;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2499
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2500 /* normal_char and normal_backslash need `c'. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2501 PATFETCH (c);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2502
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2503 if (!(syntax & RE_NO_BK_BRACES))
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2504 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2505 if (p > pattern && p[-1] == '\\')
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2506 goto normal_backslash;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2507 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2508 goto normal_char;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2509
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2510 #ifdef emacs
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2511 /* There is no way to specify the before_dot and after_dot
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2512 operators. rms says this is ok. --karl */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2513 case '=':
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2514 BUF_PUSH (at_dot);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2515 break;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2516
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2517 case 's':
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2518 laststart = b;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2519 PATFETCH (c);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2520 BUF_PUSH_2 (syntaxspec, syntax_spec_code[c]);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2521 break;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2522
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2523 case 'S':
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2524 laststart = b;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2525 PATFETCH (c);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2526 BUF_PUSH_2 (notsyntaxspec, syntax_spec_code[c]);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2527 break;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2528 #endif /* emacs */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2529
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2530
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2531 case 'w':
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2532 laststart = b;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2533 BUF_PUSH (wordchar);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2534 break;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2535
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2536
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2537 case 'W':
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2538 laststart = b;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2539 BUF_PUSH (notwordchar);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2540 break;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2541
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2542
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2543 case '<':
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2544 BUF_PUSH (wordbeg);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2545 break;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2546
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2547 case '>':
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2548 BUF_PUSH (wordend);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2549 break;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2550
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2551 case 'b':
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2552 BUF_PUSH (wordbound);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2553 break;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2554
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2555 case 'B':
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2556 BUF_PUSH (notwordbound);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2557 break;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2558
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2559 case '`':
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2560 BUF_PUSH (begbuf);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2561 break;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2562
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2563 case '\'':
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2564 BUF_PUSH (endbuf);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2565 break;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2566
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2567 case '1': case '2': case '3': case '4': case '5':
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2568 case '6': case '7': case '8': case '9':
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2569 if (syntax & RE_NO_BK_REFS)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2570 goto normal_char;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2571
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2572 c1 = c - '0';
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2573
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2574 if (c1 > regnum)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2575 FREE_STACK_RETURN (REG_ESUBREG);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2576
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2577 /* Can't back reference to a subexpression if inside of it. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2578 if (group_in_compile_stack (compile_stack, c1))
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2579 goto normal_char;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2580
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2581 laststart = b;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2582 BUF_PUSH_2 (duplicate, c1);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2583 break;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2584
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2585
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2586 case '+':
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2587 case '?':
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2588 if (syntax & RE_BK_PLUS_QM)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2589 goto handle_plus;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2590 else
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2591 goto normal_backslash;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2592
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2593 default:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2594 normal_backslash:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2595 /* You might think it would be useful for \ to mean
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2596 not to translate; but if we don't translate it
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2597 it will never match anything. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2598 c = TRANSLATE (c);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2599 goto normal_char;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2600 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2601 break;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2602
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2603
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2604 default:
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2605 /* Expects the character in `c'. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2606 normal_char:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2607 /* If no exactn currently being built. */
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2608 if (!pending_exact
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2609
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2610 /* If last exactn not at current position. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2611 || pending_exact + *pending_exact + 1 != b
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2612
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2613 /* We have only one byte following the exactn for the count. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2614 || *pending_exact == (1 << BYTEWIDTH) - 1
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2615
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2616 /* If followed by a repetition operator. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2617 || *p == '*' || *p == '^'
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2618 || ((syntax & RE_BK_PLUS_QM)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2619 ? *p == '\\' && (p[1] == '+' || p[1] == '?')
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2620 : (*p == '+' || *p == '?'))
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2621 || ((syntax & RE_INTERVALS)
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2622 && ((syntax & RE_NO_BK_BRACES)
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2623 ? *p == '{'
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2624 : (p[0] == '\\' && p[1] == '{'))))
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2625 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2626 /* Start building a new exactn. */
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
2627
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2628 laststart = b;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2629
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2630 BUF_PUSH_2 (exactn, 0);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2631 pending_exact = b - 1;
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2632 }
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
2633
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2634 BUF_PUSH (c);
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2635 (*pending_exact)++;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2636 break;
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2637 } /* switch (c) */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2638 } /* while p != pend */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2639
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
2640
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2641 /* Through the pattern now. */
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
2642
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2643 if (fixup_alt_jump)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2644 STORE_JUMP (jump_past_alt, fixup_alt_jump, b);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2645
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
2646 if (!COMPILE_STACK_EMPTY)
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2647 FREE_STACK_RETURN (REG_EPAREN);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2648
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2649 /* If we don't want backtracking, force success
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2650 the first time we reach the end of the compiled pattern. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2651 if (syntax & RE_NO_POSIX_BACKTRACKING)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2652 BUF_PUSH (succeed);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2653
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2654 free (compile_stack.stack);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2655
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2656 /* We have succeeded; set the length of the buffer. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2657 bufp->used = b - bufp->buffer;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2658
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2659 #ifdef DEBUG
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2660 if (debug)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2661 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2662 DEBUG_PRINT1 ("\nCompiled pattern: \n");
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2663 print_compiled_pattern (bufp);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2664 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2665 #endif /* DEBUG */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2666
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2667 #ifndef MATCH_MAY_ALLOCATE
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2668 /* Initialize the failure stack to the largest possible stack. This
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2669 isn't necessary unless we're trying to avoid calling alloca in
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2670 the search and match routines. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2671 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2672 int num_regs = bufp->re_nsub + 1;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2673
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2674 /* Since DOUBLE_FAIL_STACK refuses to double only if the current size
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2675 is strictly greater than re_max_failures, the largest possible stack
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2676 is 2 * re_max_failures failure points. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2677 if (fail_stack.size < (2 * re_max_failures * MAX_FAILURE_ITEMS))
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2678 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2679 fail_stack.size = (2 * re_max_failures * MAX_FAILURE_ITEMS);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2680
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2681 #ifdef emacs
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2682 if (! fail_stack.stack)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2683 fail_stack.stack
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
2684 = (fail_stack_elt_t *) xmalloc (fail_stack.size
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2685 * sizeof (fail_stack_elt_t));
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2686 else
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2687 fail_stack.stack
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2688 = (fail_stack_elt_t *) xrealloc (fail_stack.stack,
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2689 (fail_stack.size
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2690 * sizeof (fail_stack_elt_t)));
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2691 #else /* not emacs */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2692 if (! fail_stack.stack)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2693 fail_stack.stack
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
2694 = (fail_stack_elt_t *) malloc (fail_stack.size
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2695 * sizeof (fail_stack_elt_t));
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2696 else
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2697 fail_stack.stack
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2698 = (fail_stack_elt_t *) realloc (fail_stack.stack,
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2699 (fail_stack.size
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2700 * sizeof (fail_stack_elt_t)));
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2701 #endif /* not emacs */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2702 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2703
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2704 regex_grow_registers (num_regs);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2705 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2706 #endif /* not MATCH_MAY_ALLOCATE */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2707
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2708 return REG_NOERROR;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2709 } /* regex_compile */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2710
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2711 /* Subroutines for `regex_compile'. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2712
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2713 /* Store OP at LOC followed by two-byte integer parameter ARG. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2714
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2715 static void
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2716 store_op1 (op, loc, arg)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2717 re_opcode_t op;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2718 unsigned char *loc;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2719 int arg;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2720 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2721 *loc = (unsigned char) op;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2722 STORE_NUMBER (loc + 1, arg);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2723 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2724
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2725
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2726 /* Like `store_op1', but for two two-byte parameters ARG1 and ARG2. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2727
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2728 static void
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2729 store_op2 (op, loc, arg1, arg2)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2730 re_opcode_t op;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2731 unsigned char *loc;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2732 int arg1, arg2;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2733 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2734 *loc = (unsigned char) op;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2735 STORE_NUMBER (loc + 1, arg1);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2736 STORE_NUMBER (loc + 3, arg2);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2737 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2738
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2739
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2740 /* Copy the bytes from LOC to END to open up three bytes of space at LOC
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2741 for OP followed by two-byte integer parameter ARG. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2742
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2743 static void
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2744 insert_op1 (op, loc, arg, end)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2745 re_opcode_t op;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2746 unsigned char *loc;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2747 int arg;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
2748 unsigned char *end;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2749 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2750 register unsigned char *pfrom = end;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2751 register unsigned char *pto = end + 3;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2752
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2753 while (pfrom != loc)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2754 *--pto = *--pfrom;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
2755
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2756 store_op1 (op, loc, arg);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2757 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2758
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2759
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2760 /* Like `insert_op1', but for two two-byte parameters ARG1 and ARG2. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2761
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2762 static void
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2763 insert_op2 (op, loc, arg1, arg2, end)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2764 re_opcode_t op;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2765 unsigned char *loc;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2766 int arg1, arg2;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
2767 unsigned char *end;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2768 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2769 register unsigned char *pfrom = end;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2770 register unsigned char *pto = end + 5;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2771
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2772 while (pfrom != loc)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2773 *--pto = *--pfrom;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
2774
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2775 store_op2 (op, loc, arg1, arg2);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2776 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2777
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2778
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2779 /* P points to just after a ^ in PATTERN. Return true if that ^ comes
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2780 after an alternative or a begin-subexpression. We assume there is at
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2781 least one character before the ^. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2782
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2783 static boolean
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2784 at_begline_loc_p (pattern, p, syntax)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2785 const char *pattern, *p;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2786 reg_syntax_t syntax;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2787 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2788 const char *prev = p - 2;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2789 boolean prev_prev_backslash = prev > pattern && prev[-1] == '\\';
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
2790
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2791 return
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2792 /* After a subexpression? */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2793 (*prev == '(' && (syntax & RE_NO_BK_PARENS || prev_prev_backslash))
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2794 /* After an alternative? */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2795 || (*prev == '|' && (syntax & RE_NO_BK_VBAR || prev_prev_backslash));
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2796 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2797
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2798
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2799 /* The dual of at_begline_loc_p. This one is for $. We assume there is
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2800 at least one character after the $, i.e., `P < PEND'. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2801
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2802 static boolean
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2803 at_endline_loc_p (p, pend, syntax)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2804 const char *p, *pend;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2805 int syntax;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2806 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2807 const char *next = p;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2808 boolean next_backslash = *next == '\\';
11974
1a038aa90ad6 (at_endline_loc_p): Use 0, not NULL, in ?: for next_next.
Karl Heuer <kwzh@gnu.org>
parents: 11952
diff changeset
2809 const char *next_next = p + 1 < pend ? p + 1 : 0;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
2810
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2811 return
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2812 /* Before a subexpression? */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2813 (syntax & RE_NO_BK_PARENS ? *next == ')'
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2814 : next_backslash && next_next && *next_next == ')')
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2815 /* Before an alternative? */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2816 || (syntax & RE_NO_BK_VBAR ? *next == '|'
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2817 : next_backslash && next_next && *next_next == '|');
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2818 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2819
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2820
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
2821 /* Returns true if REGNUM is in one of COMPILE_STACK's elements and
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2822 false if it's not. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2823
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2824 static boolean
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2825 group_in_compile_stack (compile_stack, regnum)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2826 compile_stack_type compile_stack;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2827 regnum_t regnum;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2828 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2829 int this_element;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2830
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
2831 for (this_element = compile_stack.avail - 1;
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
2832 this_element >= 0;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2833 this_element--)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2834 if (compile_stack.stack[this_element].regnum == regnum)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2835 return true;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2836
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2837 return false;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2838 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2839
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2840
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2841 /* Read the ending character of a range (in a bracket expression) from the
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2842 uncompiled pattern *P_PTR (which ends at PEND). We assume the
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2843 starting character is in `P[-2]'. (`P[-1]' is the character `-'.)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2844 Then we set the translation of all bits between the starting and
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2845 ending characters (inclusive) in the compiled pattern B.
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
2846
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2847 Return an error code.
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
2848
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2849 We use these short variable names so we can use the same macros as
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2850 `regex_compile' itself. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2851
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2852 static reg_errcode_t
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2853 compile_range (p_ptr, pend, translate, syntax, b)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2854 const char **p_ptr, *pend;
13250
52e053f46f76 (TRANSLATE, PATFETCH): Cast elt of `translate'.
Richard M. Stallman <rms@gnu.org>
parents: 13100
diff changeset
2855 RE_TRANSLATE_TYPE translate;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2856 reg_syntax_t syntax;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2857 unsigned char *b;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2858 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2859 unsigned this_char;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2860
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2861 const char *p = *p_ptr;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2862 int range_start, range_end;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
2863
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2864 if (p == pend)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2865 return REG_ERANGE;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2866
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2867 /* Even though the pattern is a signed `char *', we need to fetch
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2868 with unsigned char *'s; if the high bit of the pattern character
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2869 is set, the range endpoints will be negative if we fetch using a
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2870 signed char *.
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2871
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
2872 We also want to fetch the endpoints without translating them; the
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2873 appropriate translation is done in the bit-setting loop below. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2874 /* The SVR4 compiler on the 3B2 had trouble with unsigned const char *. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2875 range_start = ((const unsigned char *) p)[-2];
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2876 range_end = ((const unsigned char *) p)[0];
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2877
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2878 /* Have to increment the pointer into the pattern string, so the
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2879 caller isn't still at the ending character. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2880 (*p_ptr)++;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2881
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2882 /* If the start is after the end, the range is empty. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2883 if (range_start > range_end)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2884 return syntax & RE_NO_EMPTY_RANGES ? REG_ERANGE : REG_NOERROR;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2885
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2886 /* Here we see why `this_char' has to be larger than an `unsigned
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2887 char' -- the range is inclusive, so if `range_end' == 0xff
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2888 (assuming 8-bit characters), we would otherwise go into an infinite
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2889 loop, since all characters <= 0xff. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2890 for (this_char = range_start; this_char <= range_end; this_char++)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2891 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2892 SET_LIST_BIT (TRANSLATE (this_char));
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2893 }
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
2894
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2895 return REG_NOERROR;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2896 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2897
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2898 /* re_compile_fastmap computes a ``fastmap'' for the compiled pattern in
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2899 BUFP. A fastmap records which of the (1 << BYTEWIDTH) possible
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2900 characters can start a string that matches the pattern. This fastmap
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2901 is used by re_search to skip quickly over impossible starting points.
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2902
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2903 The caller must supply the address of a (1 << BYTEWIDTH)-byte data
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2904 area as BUFP->fastmap.
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
2905
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2906 We set the `fastmap', `fastmap_accurate', and `can_be_null' fields in
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2907 the pattern buffer.
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2908
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2909 Returns 0 if we succeed, -2 if an internal error. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2910
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2911 int
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2912 re_compile_fastmap (bufp)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2913 struct re_pattern_buffer *bufp;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2914 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2915 int j, k;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2916 #ifdef MATCH_MAY_ALLOCATE
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2917 fail_stack_type fail_stack;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2918 #endif
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2919 #ifndef REGEX_MALLOC
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2920 char *destination;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2921 #endif
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2922 /* We don't push any register information onto the failure stack. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2923 unsigned num_regs = 0;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
2924
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2925 register char *fastmap = bufp->fastmap;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2926 unsigned char *pattern = bufp->buffer;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2927 unsigned long size = bufp->used;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2928 unsigned char *p = pattern;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2929 register unsigned char *pend = pattern + size;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2930
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2931 /* This holds the pointer to the failure stack, when
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2932 it is allocated relocatably. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2933 fail_stack_elt_t *failure_stack_ptr;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2934
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2935 /* Assume that each path through the pattern can be null until
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2936 proven otherwise. We set this false at the bottom of switch
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2937 statement, to which we get only if a particular path doesn't
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2938 match the empty string. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2939 boolean path_can_be_null = true;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2940
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2941 /* We aren't doing a `succeed_n' to begin with. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2942 boolean succeed_n_p = false;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2943
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2944 assert (fastmap != NULL && p != NULL);
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
2945
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2946 INIT_FAIL_STACK ();
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2947 bzero (fastmap, 1 << BYTEWIDTH); /* Assume nothing's valid. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2948 bufp->fastmap_accurate = 1; /* It will be when we're done. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2949 bufp->can_be_null = 0;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
2950
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2951 while (1)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2952 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2953 if (p == pend || *p == succeed)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2954 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2955 /* We have reached the (effective) end of pattern. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2956 if (!FAIL_STACK_EMPTY ())
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2957 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2958 bufp->can_be_null |= path_can_be_null;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2959
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2960 /* Reset for next path. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2961 path_can_be_null = true;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2962
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2963 p = fail_stack.stack[--fail_stack.avail].pointer;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2964
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2965 continue;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2966 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2967 else
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2968 break;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2969 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2970
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2971 /* We should never be about to go beyond the end of the pattern. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2972 assert (p < pend);
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
2973
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2974 switch (SWITCH_ENUM_CAST ((re_opcode_t) *p++))
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2975 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2976
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2977 /* I guess the idea here is to simply not bother with a fastmap
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2978 if a backreference is used, since it's too hard to figure out
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2979 the fastmap for the corresponding group. Setting
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2980 `can_be_null' stops `re_search_2' from using the fastmap, so
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2981 that is all we do. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2982 case duplicate:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2983 bufp->can_be_null = 1;
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2984 goto done;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2985
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2986
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2987 /* Following are the cases which match a character. These end
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2988 with `break'. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2989
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2990 case exactn:
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2991 fastmap[p[1]] = 1;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2992 break;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2993
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2994
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2995 case charset:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2996 for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--)
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2997 if (p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH)))
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
2998 fastmap[j] = 1;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
2999 break;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3000
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3001
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3002 case charset_not:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3003 /* Chars beyond end of map must be allowed. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3004 for (j = *p * BYTEWIDTH; j < (1 << BYTEWIDTH); j++)
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3005 fastmap[j] = 1;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3006
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3007 for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3008 if (!(p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH))))
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3009 fastmap[j] = 1;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3010 break;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3011
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3012
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3013 case wordchar:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3014 for (j = 0; j < (1 << BYTEWIDTH); j++)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3015 if (SYNTAX (j) == Sword)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3016 fastmap[j] = 1;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3017 break;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3018
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3019
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3020 case notwordchar:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3021 for (j = 0; j < (1 << BYTEWIDTH); j++)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3022 if (SYNTAX (j) != Sword)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3023 fastmap[j] = 1;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3024 break;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3025
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3026
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3027 case anychar:
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3028 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3029 int fastmap_newline = fastmap['\n'];
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3030
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3031 /* `.' matches anything ... */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3032 for (j = 0; j < (1 << BYTEWIDTH); j++)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3033 fastmap[j] = 1;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3034
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3035 /* ... except perhaps newline. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3036 if (!(bufp->syntax & RE_DOT_NEWLINE))
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3037 fastmap['\n'] = fastmap_newline;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3038
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3039 /* Return if we have already set `can_be_null'; if we have,
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3040 then the fastmap is irrelevant. Something's wrong here. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3041 else if (bufp->can_be_null)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3042 goto done;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3043
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3044 /* Otherwise, have to check alternative paths. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3045 break;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3046 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3047
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3048 #ifdef emacs
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3049 case syntaxspec:
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3050 k = *p++;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3051 for (j = 0; j < (1 << BYTEWIDTH); j++)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3052 if (SYNTAX (j) == (enum syntaxcode) k)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3053 fastmap[j] = 1;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3054 break;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3055
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3056
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3057 case notsyntaxspec:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3058 k = *p++;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3059 for (j = 0; j < (1 << BYTEWIDTH); j++)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3060 if (SYNTAX (j) != (enum syntaxcode) k)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3061 fastmap[j] = 1;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3062 break;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3063
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3064
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3065 /* All cases after this match the empty string. These end with
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3066 `continue'. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3067
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3068
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3069 case before_dot:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3070 case at_dot:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3071 case after_dot:
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3072 continue;
12983
ed39ba26313b (re_search_2): If pattern starts with \=, optimize search.
Richard M. Stallman <rms@gnu.org>
parents: 12931
diff changeset
3073 #endif /* emacs */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3074
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3075
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3076 case no_op:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3077 case begline:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3078 case endline:
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3079 case begbuf:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3080 case endbuf:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3081 case wordbound:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3082 case notwordbound:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3083 case wordbeg:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3084 case wordend:
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3085 case push_dummy_failure:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3086 continue;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3087
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3088
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3089 case jump_n:
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3090 case pop_failure_jump:
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3091 case maybe_pop_jump:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3092 case jump:
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3093 case jump_past_alt:
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3094 case dummy_failure_jump:
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3095 EXTRACT_NUMBER_AND_INCR (j, p);
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
3096 p += j;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3097 if (j > 0)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3098 continue;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
3099
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3100 /* Jump backward implies we just went through the body of a
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3101 loop and matched nothing. Opcode jumped to should be
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3102 `on_failure_jump' or `succeed_n'. Just treat it like an
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3103 ordinary jump. For a * loop, it has pushed its failure
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3104 point already; if so, discard that as redundant. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3105 if ((re_opcode_t) *p != on_failure_jump
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3106 && (re_opcode_t) *p != succeed_n)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3107 continue;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3108
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3109 p++;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3110 EXTRACT_NUMBER_AND_INCR (j, p);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3111 p += j;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3112
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3113 /* If what's on the stack is where we are now, pop it. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3114 if (!FAIL_STACK_EMPTY ()
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3115 && fail_stack.stack[fail_stack.avail - 1].pointer == p)
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3116 fail_stack.avail--;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3117
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3118 continue;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3119
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3120
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3121 case on_failure_jump:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3122 case on_failure_keep_string_jump:
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3123 handle_on_failure_jump:
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3124 EXTRACT_NUMBER_AND_INCR (j, p);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3125
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3126 /* For some patterns, e.g., `(a?)?', `p+j' here points to the
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3127 end of the pattern. We don't want to push such a point,
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3128 since when we restore it above, entering the switch will
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3129 increment `p' past the end of the pattern. We don't need
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3130 to push such a point since we obviously won't find any more
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3131 fastmap entries beyond `pend'. Such a pattern can match
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3132 the null string, though. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3133 if (p + j < pend)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3134 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3135 if (!PUSH_PATTERN_OP (p + j, fail_stack))
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3136 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3137 RESET_FAIL_STACK ();
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3138 return -2;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3139 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3140 }
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3141 else
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3142 bufp->can_be_null = 1;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3143
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3144 if (succeed_n_p)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3145 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3146 EXTRACT_NUMBER_AND_INCR (k, p); /* Skip the n. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3147 succeed_n_p = false;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3148 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3149
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3150 continue;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3151
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3152
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3153 case succeed_n:
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3154 /* Get to the number of times to succeed. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3155 p += 2;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3156
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3157 /* Increment p past the n for when k != 0. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3158 EXTRACT_NUMBER_AND_INCR (k, p);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3159 if (k == 0)
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3160 {
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3161 p -= 4;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3162 succeed_n_p = true; /* Spaghetti code alert. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3163 goto handle_on_failure_jump;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3164 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3165 continue;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3166
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3167
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3168 case set_number_at:
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3169 p += 4;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3170 continue;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3171
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3172
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3173 case start_memory:
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3174 case stop_memory:
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3175 p += 2;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3176 continue;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3177
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3178
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3179 default:
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3180 abort (); /* We have listed all the cases. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3181 } /* switch *p++ */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3182
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3183 /* Getting here means we have found the possible starting
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3184 characters for one path of the pattern -- and that the empty
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3185 string does not match. We need not follow this path further.
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3186 Instead, look at the next alternative (remembered on the
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3187 stack), or quit if no more. The test at the top of the loop
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3188 does these things. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3189 path_can_be_null = false;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3190 p = pend;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3191 } /* while p */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3192
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3193 /* Set `can_be_null' for the last path (also the first path, if the
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3194 pattern is empty). */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3195 bufp->can_be_null |= path_can_be_null;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3196
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3197 done:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3198 RESET_FAIL_STACK ();
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3199 return 0;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3200 } /* re_compile_fastmap */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3201
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3202 /* Set REGS to hold NUM_REGS registers, storing them in STARTS and
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3203 ENDS. Subsequent matches using PATTERN_BUFFER and REGS will use
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3204 this memory for recording register information. STARTS and ENDS
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3205 must be allocated using the malloc library routine, and must each
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3206 be at least NUM_REGS * sizeof (regoff_t) bytes long.
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3207
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3208 If NUM_REGS == 0, then subsequent matches should allocate their own
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3209 register data.
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3210
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3211 Unless this function is called, the first search or match using
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3212 PATTERN_BUFFER will allocate its own register data, without
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3213 freeing the old data. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3214
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3215 void
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3216 re_set_registers (bufp, regs, num_regs, starts, ends)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3217 struct re_pattern_buffer *bufp;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3218 struct re_registers *regs;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3219 unsigned num_regs;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3220 regoff_t *starts, *ends;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3221 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3222 if (num_regs)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3223 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3224 bufp->regs_allocated = REGS_REALLOCATE;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3225 regs->num_regs = num_regs;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3226 regs->start = starts;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3227 regs->end = ends;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3228 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3229 else
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3230 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3231 bufp->regs_allocated = REGS_UNALLOCATED;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3232 regs->num_regs = 0;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3233 regs->start = regs->end = (regoff_t *) 0;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3234 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3235 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3236
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3237 /* Searching routines. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3238
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3239 /* Like re_search_2, below, but only one string is specified, and
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3240 doesn't let you say where to stop matching. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3241
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3242 int
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3243 re_search (bufp, string, size, startpos, range, regs)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3244 struct re_pattern_buffer *bufp;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3245 const char *string;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3246 int size, startpos, range;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3247 struct re_registers *regs;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3248 {
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
3249 return re_search_2 (bufp, NULL, 0, string, size, startpos, range,
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3250 regs, size);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3251 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3252
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3253
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3254 /* Using the compiled pattern in BUFP->buffer, first tries to match the
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3255 virtual concatenation of STRING1 and STRING2, starting first at index
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3256 STARTPOS, then at STARTPOS + 1, and so on.
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
3257
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3258 STRING1 and STRING2 have length SIZE1 and SIZE2, respectively.
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
3259
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3260 RANGE is how far to scan while trying to match. RANGE = 0 means try
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3261 only at STARTPOS; in general, the last start tried is STARTPOS +
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3262 RANGE.
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
3263
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3264 In REGS, return the indices of the virtual concatenation of STRING1
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3265 and STRING2 that matched the entire BUFP->buffer and its contained
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3266 subexpressions.
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
3267
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3268 Do not consider matching one past the index STOP in the virtual
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3269 concatenation of STRING1 and STRING2.
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3270
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3271 We return either the position in the strings at which the match was
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3272 found, -1 if no match, or -2 if error (such as failure
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3273 stack overflow). */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3274
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3275 int
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3276 re_search_2 (bufp, string1, size1, string2, size2, startpos, range, regs, stop)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3277 struct re_pattern_buffer *bufp;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3278 const char *string1, *string2;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3279 int size1, size2;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3280 int startpos;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3281 int range;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3282 struct re_registers *regs;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3283 int stop;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3284 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3285 int val;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3286 register char *fastmap = bufp->fastmap;
13250
52e053f46f76 (TRANSLATE, PATFETCH): Cast elt of `translate'.
Richard M. Stallman <rms@gnu.org>
parents: 13100
diff changeset
3287 register RE_TRANSLATE_TYPE translate = bufp->translate;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3288 int total_size = size1 + size2;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3289 int endpos = startpos + range;
16009
2a4da819f152 (re_search_2): Optimize regexp that starts with ^.
Richard M. Stallman <rms@gnu.org>
parents: 16008
diff changeset
3290 int anchored_start = 0;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3291
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3292 /* Check for out-of-range STARTPOS. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3293 if (startpos < 0 || startpos > total_size)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3294 return -1;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
3295
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3296 /* Fix up RANGE if it might eventually take us outside
13100
4f0f50fc3aaf (re_search_2): Use 0, not -1, as the lower bound
Richard M. Stallman <rms@gnu.org>
parents: 12983
diff changeset
3297 the virtual concatenation of STRING1 and STRING2.
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
3298 Make sure we won't move STARTPOS below 0 or above TOTAL_SIZE. */
13100
4f0f50fc3aaf (re_search_2): Use 0, not -1, as the lower bound
Richard M. Stallman <rms@gnu.org>
parents: 12983
diff changeset
3299 if (endpos < 0)
4f0f50fc3aaf (re_search_2): Use 0, not -1, as the lower bound
Richard M. Stallman <rms@gnu.org>
parents: 12983
diff changeset
3300 range = 0 - startpos;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3301 else if (endpos > total_size)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3302 range = total_size - startpos;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3303
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3304 /* If the search isn't to be a backwards one, don't waste time in a
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3305 search for a pattern that must be anchored. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3306 if (bufp->used > 0 && (re_opcode_t) bufp->buffer[0] == begbuf && range > 0)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3307 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3308 if (startpos > 0)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3309 return -1;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3310 else
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3311 range = 1;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3312 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3313
12983
ed39ba26313b (re_search_2): If pattern starts with \=, optimize search.
Richard M. Stallman <rms@gnu.org>
parents: 12931
diff changeset
3314 #ifdef emacs
ed39ba26313b (re_search_2): If pattern starts with \=, optimize search.
Richard M. Stallman <rms@gnu.org>
parents: 12931
diff changeset
3315 /* In a forward search for something that starts with \=.
ed39ba26313b (re_search_2): If pattern starts with \=, optimize search.
Richard M. Stallman <rms@gnu.org>
parents: 12931
diff changeset
3316 don't keep searching past point. */
ed39ba26313b (re_search_2): If pattern starts with \=, optimize search.
Richard M. Stallman <rms@gnu.org>
parents: 12931
diff changeset
3317 if (bufp->used > 0 && (re_opcode_t) bufp->buffer[0] == at_dot && range > 0)
ed39ba26313b (re_search_2): If pattern starts with \=, optimize search.
Richard M. Stallman <rms@gnu.org>
parents: 12931
diff changeset
3318 {
ed39ba26313b (re_search_2): If pattern starts with \=, optimize search.
Richard M. Stallman <rms@gnu.org>
parents: 12931
diff changeset
3319 range = PT - startpos;
ed39ba26313b (re_search_2): If pattern starts with \=, optimize search.
Richard M. Stallman <rms@gnu.org>
parents: 12931
diff changeset
3320 if (range <= 0)
ed39ba26313b (re_search_2): If pattern starts with \=, optimize search.
Richard M. Stallman <rms@gnu.org>
parents: 12931
diff changeset
3321 return -1;
ed39ba26313b (re_search_2): If pattern starts with \=, optimize search.
Richard M. Stallman <rms@gnu.org>
parents: 12931
diff changeset
3322 }
ed39ba26313b (re_search_2): If pattern starts with \=, optimize search.
Richard M. Stallman <rms@gnu.org>
parents: 12931
diff changeset
3323 #endif /* emacs */
ed39ba26313b (re_search_2): If pattern starts with \=, optimize search.
Richard M. Stallman <rms@gnu.org>
parents: 12931
diff changeset
3324
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3325 /* Update the fastmap now if not correct already. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3326 if (fastmap && !bufp->fastmap_accurate)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3327 if (re_compile_fastmap (bufp) == -2)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3328 return -2;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
3329
16009
2a4da819f152 (re_search_2): Optimize regexp that starts with ^.
Richard M. Stallman <rms@gnu.org>
parents: 16008
diff changeset
3330 /* See whether the pattern is anchored. */
2a4da819f152 (re_search_2): Optimize regexp that starts with ^.
Richard M. Stallman <rms@gnu.org>
parents: 16008
diff changeset
3331 if (bufp->buffer[0] == begline)
2a4da819f152 (re_search_2): Optimize regexp that starts with ^.
Richard M. Stallman <rms@gnu.org>
parents: 16008
diff changeset
3332 anchored_start = 1;
2a4da819f152 (re_search_2): Optimize regexp that starts with ^.
Richard M. Stallman <rms@gnu.org>
parents: 16008
diff changeset
3333
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3334 /* Loop through the string, looking for a place to start matching. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3335 for (;;)
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
3336 {
16009
2a4da819f152 (re_search_2): Optimize regexp that starts with ^.
Richard M. Stallman <rms@gnu.org>
parents: 16008
diff changeset
3337 /* If the pattern is anchored,
2a4da819f152 (re_search_2): Optimize regexp that starts with ^.
Richard M. Stallman <rms@gnu.org>
parents: 16008
diff changeset
3338 skip quickly past places we cannot match.
2a4da819f152 (re_search_2): Optimize regexp that starts with ^.
Richard M. Stallman <rms@gnu.org>
parents: 16008
diff changeset
3339 We don't bother to treat startpos == 0 specially
2a4da819f152 (re_search_2): Optimize regexp that starts with ^.
Richard M. Stallman <rms@gnu.org>
parents: 16008
diff changeset
3340 because that case doesn't repeat. */
2a4da819f152 (re_search_2): Optimize regexp that starts with ^.
Richard M. Stallman <rms@gnu.org>
parents: 16008
diff changeset
3341 if (anchored_start && startpos > 0)
2a4da819f152 (re_search_2): Optimize regexp that starts with ^.
Richard M. Stallman <rms@gnu.org>
parents: 16008
diff changeset
3342 {
2a4da819f152 (re_search_2): Optimize regexp that starts with ^.
Richard M. Stallman <rms@gnu.org>
parents: 16008
diff changeset
3343 if (! (bufp->newline_anchor
2a4da819f152 (re_search_2): Optimize regexp that starts with ^.
Richard M. Stallman <rms@gnu.org>
parents: 16008
diff changeset
3344 && ((startpos <= size1 ? string1[startpos - 1]
2a4da819f152 (re_search_2): Optimize regexp that starts with ^.
Richard M. Stallman <rms@gnu.org>
parents: 16008
diff changeset
3345 : string2[startpos - size1 - 1])
2a4da819f152 (re_search_2): Optimize regexp that starts with ^.
Richard M. Stallman <rms@gnu.org>
parents: 16008
diff changeset
3346 == '\n')))
2a4da819f152 (re_search_2): Optimize regexp that starts with ^.
Richard M. Stallman <rms@gnu.org>
parents: 16008
diff changeset
3347 goto advance;
2a4da819f152 (re_search_2): Optimize regexp that starts with ^.
Richard M. Stallman <rms@gnu.org>
parents: 16008
diff changeset
3348 }
2a4da819f152 (re_search_2): Optimize regexp that starts with ^.
Richard M. Stallman <rms@gnu.org>
parents: 16008
diff changeset
3349
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3350 /* If a fastmap is supplied, skip quickly over characters that
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3351 cannot be the start of a match. If the pattern can match the
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3352 null string, however, we don't need to skip characters; we want
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3353 the first null string. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3354 if (fastmap && startpos < total_size && !bufp->can_be_null)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3355 {
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3356 if (range > 0) /* Searching forwards. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3357 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3358 register const char *d;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3359 register int lim = 0;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3360 int irange = range;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3361
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3362 if (startpos < size1 && startpos + range >= size1)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3363 lim = range - (size1 - startpos);
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3364
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3365 d = (startpos >= size1 ? string2 - size1 : string1) + startpos;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
3366
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3367 /* Written out as an if-else to avoid testing `translate'
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3368 inside the loop. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3369 if (translate)
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3370 while (range > lim
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3371 && !fastmap[(unsigned char)
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3372 translate[(unsigned char) *d++]])
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3373 range--;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3374 else
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3375 while (range > lim && !fastmap[(unsigned char) *d++])
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3376 range--;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3377
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3378 startpos += irange - range;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3379 }
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3380 else /* Searching backwards. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3381 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3382 register char c = (size1 == 0 || startpos >= size1
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3383 ? string2[startpos - size1]
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3384 : string1[startpos]);
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3385
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3386 if (!fastmap[(unsigned char) TRANSLATE (c)])
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3387 goto advance;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3388 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3389 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3390
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3391 /* If can't match the null string, and that's all we have left, fail. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3392 if (range >= 0 && startpos == total_size && fastmap
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3393 && !bufp->can_be_null)
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3394 return -1;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3395
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3396 val = re_match_2_internal (bufp, string1, size1, string2, size2,
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3397 startpos, regs, stop);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3398 #ifndef REGEX_MALLOC
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3399 #ifdef C_ALLOCA
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3400 alloca (0);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3401 #endif
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3402 #endif
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3403
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3404 if (val >= 0)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3405 return startpos;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
3406
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3407 if (val == -2)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3408 return -2;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3409
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3410 advance:
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
3411 if (!range)
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3412 break;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
3413 else if (range > 0)
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3414 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3415 range--;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3416 startpos++;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3417 }
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3418 else
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3419 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3420 range++;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3421 startpos--;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3422 }
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3423 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3424 return -1;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3425 } /* re_search_2 */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3426
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3427 /* Declarations and macros for re_match_2. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3428
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3429 static int bcmp_translate ();
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3430 static boolean alt_match_null_string_p (),
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3431 common_op_match_null_string_p (),
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3432 group_match_null_string_p ();
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3433
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3434 /* This converts PTR, a pointer into one of the search strings `string1'
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3435 and `string2' into an offset from the beginning of that string. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3436 #define POINTER_TO_OFFSET(ptr) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3437 (FIRST_STRING_P (ptr) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3438 ? ((regoff_t) ((ptr) - string1)) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3439 : ((regoff_t) ((ptr) - string2 + size1)))
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3440
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3441 /* Macros for dealing with the split strings in re_match_2. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3442
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3443 #define MATCHING_IN_FIRST_STRING (dend == end_match_1)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3444
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3445 /* Call before fetching a character with *d. This switches over to
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3446 string2 if necessary. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3447 #define PREFETCH() \
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3448 while (d == dend) \
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3449 { \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3450 /* End of string2 => fail. */ \
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3451 if (dend == end_match_2) \
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3452 goto fail; \
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3453 /* End of string1 => advance to string2. */ \
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3454 d = string2; \
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3455 dend = end_match_2; \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3456 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3457
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3458
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3459 /* Test if at very beginning or at very end of the virtual concatenation
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3460 of `string1' and `string2'. If only one string, it's `string2'. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3461 #define AT_STRINGS_BEG(d) ((d) == (size1 ? string1 : string2) || !size2)
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
3462 #define AT_STRINGS_END(d) ((d) == end2)
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3463
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3464
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3465 /* Test if D points to a character which is word-constituent. We have
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3466 two special cases to check for: if past the end of string1, look at
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3467 the first character in string2; and if before the beginning of
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3468 string2, look at the last character in string1. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3469 #define WORDCHAR_P(d) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3470 (SYNTAX ((d) == end1 ? *string2 \
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3471 : (d) == string2 - 1 ? *(end1 - 1) : *(d)) \
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3472 == Sword)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3473
13722
e2669b8a46e2 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 13565
diff changeset
3474 /* Disabled due to a compiler bug -- see comment at case wordbound */
e2669b8a46e2 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 13565
diff changeset
3475 #if 0
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3476 /* Test if the character before D and the one at D differ with respect
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3477 to being word-constituent. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3478 #define AT_WORD_BOUNDARY(d) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3479 (AT_STRINGS_BEG (d) || AT_STRINGS_END (d) \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3480 || WORDCHAR_P (d - 1) != WORDCHAR_P (d))
13722
e2669b8a46e2 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 13565
diff changeset
3481 #endif
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3482
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3483 /* Free everything we malloc. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3484 #ifdef MATCH_MAY_ALLOCATE
16009
2a4da819f152 (re_search_2): Optimize regexp that starts with ^.
Richard M. Stallman <rms@gnu.org>
parents: 16008
diff changeset
3485 #define FREE_VAR(var) if (var) { REGEX_FREE (var); var = NULL; } else
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3486 #define FREE_VARIABLES() \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3487 do { \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3488 REGEX_FREE_STACK (fail_stack.stack); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3489 FREE_VAR (regstart); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3490 FREE_VAR (regend); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3491 FREE_VAR (old_regstart); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3492 FREE_VAR (old_regend); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3493 FREE_VAR (best_regstart); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3494 FREE_VAR (best_regend); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3495 FREE_VAR (reg_info); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3496 FREE_VAR (reg_dummy); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3497 FREE_VAR (reg_info_dummy); \
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3498 } while (0)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3499 #else
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3500 #define FREE_VARIABLES() ((void)0) /* Do nothing! But inhibit gcc warning. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3501 #endif /* not MATCH_MAY_ALLOCATE */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3502
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3503 /* These values must meet several constraints. They must not be valid
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3504 register values; since we have a limit of 255 registers (because
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3505 we use only one byte in the pattern for the register number), we can
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3506 use numbers larger than 255. They must differ by 1, because of
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3507 NUM_FAILURE_ITEMS above. And the value for the lowest register must
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3508 be larger than the value for the highest register, so we do not try
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3509 to actually save any registers when none are active. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3510 #define NO_HIGHEST_ACTIVE_REG (1 << BYTEWIDTH)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3511 #define NO_LOWEST_ACTIVE_REG (NO_HIGHEST_ACTIVE_REG + 1)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3512
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3513 /* Matching routines. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3514
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3515 #ifndef emacs /* Emacs never uses this. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3516 /* re_match is like re_match_2 except it takes only a single string. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3517
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3518 int
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3519 re_match (bufp, string, size, pos, regs)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3520 struct re_pattern_buffer *bufp;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3521 const char *string;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3522 int size, pos;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3523 struct re_registers *regs;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3524 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3525 int result = re_match_2_internal (bufp, NULL, 0, string, size,
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3526 pos, regs, size);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3527 alloca (0);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3528 return result;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3529 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3530 #endif /* not emacs */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3531
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3532
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3533 /* re_match_2 matches the compiled pattern in BUFP against the
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3534 the (virtual) concatenation of STRING1 and STRING2 (of length SIZE1
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3535 and SIZE2, respectively). We start matching at POS, and stop
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3536 matching at STOP.
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
3537
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3538 If REGS is non-null and the `no_sub' field of BUFP is nonzero, we
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3539 store offsets for the substring each group matched in REGS. See the
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3540 documentation for exactly how many groups we fill.
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3541
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3542 We return -1 if no match, -2 if an internal error (such as the
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3543 failure stack overflowing). Otherwise, we return the length of the
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3544 matched substring. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3545
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3546 int
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3547 re_match_2 (bufp, string1, size1, string2, size2, pos, regs, stop)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3548 struct re_pattern_buffer *bufp;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3549 const char *string1, *string2;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3550 int size1, size2;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3551 int pos;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3552 struct re_registers *regs;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3553 int stop;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3554 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3555 int result = re_match_2_internal (bufp, string1, size1, string2, size2,
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3556 pos, regs, stop);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3557 alloca (0);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3558 return result;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3559 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3560
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3561 /* This is a separate function so that we can force an alloca cleanup
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3562 afterwards. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3563 static int
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3564 re_match_2_internal (bufp, string1, size1, string2, size2, pos, regs, stop)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3565 struct re_pattern_buffer *bufp;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3566 const char *string1, *string2;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3567 int size1, size2;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3568 int pos;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3569 struct re_registers *regs;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3570 int stop;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3571 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3572 /* General temporaries. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3573 int mcnt;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3574 unsigned char *p1;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3575
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3576 /* Just past the end of the corresponding string. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3577 const char *end1, *end2;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3578
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3579 /* Pointers into string1 and string2, just past the last characters in
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3580 each to consider matching. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3581 const char *end_match_1, *end_match_2;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3582
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3583 /* Where we are in the data, and the end of the current string. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3584 const char *d, *dend;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
3585
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3586 /* Where we are in the pattern, and the end of the pattern. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3587 unsigned char *p = bufp->buffer;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3588 register unsigned char *pend = p + bufp->used;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3589
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3590 /* Mark the opcode just after a start_memory, so we can test for an
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3591 empty subpattern when we get to the stop_memory. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3592 unsigned char *just_past_start_mem = 0;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3593
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3594 /* We use this to map every character in the string. */
13250
52e053f46f76 (TRANSLATE, PATFETCH): Cast elt of `translate'.
Richard M. Stallman <rms@gnu.org>
parents: 13100
diff changeset
3595 RE_TRANSLATE_TYPE translate = bufp->translate;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3596
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3597 /* Failure point stack. Each place that can handle a failure further
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3598 down the line pushes a failure point on this stack. It consists of
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3599 restart, regend, and reg_info for all registers corresponding to
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3600 the subexpressions we're currently inside, plus the number of such
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3601 registers, and, finally, two char *'s. The first char * is where
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3602 to resume scanning the pattern; the second one is where to resume
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3603 scanning the strings. If the latter is zero, the failure point is
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3604 a ``dummy''; if a failure happens and the failure point is a dummy,
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3605 it gets discarded and the next next one is tried. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3606 #ifdef MATCH_MAY_ALLOCATE /* otherwise, this is global. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3607 fail_stack_type fail_stack;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3608 #endif
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3609 #ifdef DEBUG
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3610 static unsigned failure_id = 0;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3611 unsigned nfailure_points_pushed = 0, nfailure_points_popped = 0;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3612 #endif
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3613
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3614 /* This holds the pointer to the failure stack, when
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3615 it is allocated relocatably. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3616 fail_stack_elt_t *failure_stack_ptr;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3617
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3618 /* We fill all the registers internally, independent of what we
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3619 return, for use in backreferences. The number here includes
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3620 an element for register zero. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3621 unsigned num_regs = bufp->re_nsub + 1;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
3622
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3623 /* The currently active registers. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3624 unsigned lowest_active_reg = NO_LOWEST_ACTIVE_REG;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3625 unsigned highest_active_reg = NO_HIGHEST_ACTIVE_REG;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3626
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3627 /* Information on the contents of registers. These are pointers into
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3628 the input strings; they record just what was matched (on this
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3629 attempt) by a subexpression part of the pattern, that is, the
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3630 regnum-th regstart pointer points to where in the pattern we began
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3631 matching and the regnum-th regend points to right after where we
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3632 stopped matching the regnum-th subexpression. (The zeroth register
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3633 keeps track of what the whole pattern matches.) */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3634 #ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3635 const char **regstart, **regend;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3636 #endif
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3637
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3638 /* If a group that's operated upon by a repetition operator fails to
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3639 match anything, then the register for its start will need to be
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3640 restored because it will have been set to wherever in the string we
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3641 are when we last see its open-group operator. Similarly for a
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3642 register's end. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3643 #ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3644 const char **old_regstart, **old_regend;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3645 #endif
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3646
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3647 /* The is_active field of reg_info helps us keep track of which (possibly
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3648 nested) subexpressions we are currently in. The matched_something
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3649 field of reg_info[reg_num] helps us tell whether or not we have
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3650 matched any of the pattern so far this time through the reg_num-th
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3651 subexpression. These two fields get reset each time through any
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3652 loop their register is in. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3653 #ifdef MATCH_MAY_ALLOCATE /* otherwise, this is global. */
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
3654 register_info_type *reg_info;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3655 #endif
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3656
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3657 /* The following record the register info as found in the above
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
3658 variables when we find a match better than any we've seen before.
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3659 This happens as we backtrack through the failure points, which in
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3660 turn happens only if we have not yet matched the entire string. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3661 unsigned best_regs_set = false;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3662 #ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3663 const char **best_regstart, **best_regend;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3664 #endif
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
3665
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3666 /* Logically, this is `best_regend[0]'. But we don't want to have to
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3667 allocate space for that if we're not allocating space for anything
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3668 else (see below). Also, we never need info about register 0 for
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3669 any of the other register vectors, and it seems rather a kludge to
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3670 treat `best_regend' differently than the rest. So we keep track of
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3671 the end of the best match so far in a separate variable. We
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3672 initialize this to NULL so that when we backtrack the first time
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3673 and need to test it, it's not garbage. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3674 const char *match_end = NULL;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3675
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3676 /* This helps SET_REGS_MATCHED avoid doing redundant work. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3677 int set_regs_matched_done = 0;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3678
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3679 /* Used when we pop values we don't care about. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3680 #ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3681 const char **reg_dummy;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3682 register_info_type *reg_info_dummy;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3683 #endif
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3684
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3685 #ifdef DEBUG
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3686 /* Counts the total number of registers pushed. */
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
3687 unsigned num_regs_pushed = 0;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3688 #endif
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3689
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3690 DEBUG_PRINT1 ("\n\nEntering re_match_2.\n");
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
3691
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3692 INIT_FAIL_STACK ();
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
3693
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3694 #ifdef MATCH_MAY_ALLOCATE
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3695 /* Do not bother to initialize all the register variables if there are
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3696 no groups in the pattern, as it takes a fair amount of time. If
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3697 there are groups, we include space for register 0 (the whole
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3698 pattern), even though we never use it, since it simplifies the
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3699 array indexing. We should fix this. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3700 if (bufp->re_nsub)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3701 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3702 regstart = REGEX_TALLOC (num_regs, const char *);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3703 regend = REGEX_TALLOC (num_regs, const char *);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3704 old_regstart = REGEX_TALLOC (num_regs, const char *);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3705 old_regend = REGEX_TALLOC (num_regs, const char *);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3706 best_regstart = REGEX_TALLOC (num_regs, const char *);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3707 best_regend = REGEX_TALLOC (num_regs, const char *);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3708 reg_info = REGEX_TALLOC (num_regs, register_info_type);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3709 reg_dummy = REGEX_TALLOC (num_regs, const char *);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3710 reg_info_dummy = REGEX_TALLOC (num_regs, register_info_type);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3711
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
3712 if (!(regstart && regend && old_regstart && old_regend && reg_info
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3713 && best_regstart && best_regend && reg_dummy && reg_info_dummy))
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3714 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3715 FREE_VARIABLES ();
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3716 return -2;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3717 }
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3718 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3719 else
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3720 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3721 /* We must initialize all our variables to NULL, so that
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3722 `FREE_VARIABLES' doesn't try to free them. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3723 regstart = regend = old_regstart = old_regend = best_regstart
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3724 = best_regend = reg_dummy = NULL;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3725 reg_info = reg_info_dummy = (register_info_type *) NULL;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3726 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3727 #endif /* MATCH_MAY_ALLOCATE */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3728
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3729 /* The starting position is bogus. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3730 if (pos < 0 || pos > size1 + size2)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3731 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3732 FREE_VARIABLES ();
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3733 return -1;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3734 }
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
3735
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3736 /* Initialize subexpression text positions to -1 to mark ones that no
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3737 start_memory/stop_memory has been seen for. Also initialize the
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3738 register information struct. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3739 for (mcnt = 1; mcnt < num_regs; mcnt++)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3740 {
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
3741 regstart[mcnt] = regend[mcnt]
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3742 = old_regstart[mcnt] = old_regend[mcnt] = REG_UNSET_VALUE;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
3743
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3744 REG_MATCH_NULL_STRING_P (reg_info[mcnt]) = MATCH_NULL_UNSET_VALUE;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3745 IS_ACTIVE (reg_info[mcnt]) = 0;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3746 MATCHED_SOMETHING (reg_info[mcnt]) = 0;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3747 EVER_MATCHED_SOMETHING (reg_info[mcnt]) = 0;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3748 }
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
3749
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3750 /* We move `string1' into `string2' if the latter's empty -- but not if
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3751 `string1' is null. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3752 if (size2 == 0 && string1 != NULL)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3753 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3754 string2 = string1;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3755 size2 = size1;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3756 string1 = 0;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3757 size1 = 0;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3758 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3759 end1 = string1 + size1;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3760 end2 = string2 + size2;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3761
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3762 /* Compute where to stop matching, within the two strings. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3763 if (stop <= size1)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3764 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3765 end_match_1 = string1 + stop;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3766 end_match_2 = string2;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3767 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3768 else
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3769 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3770 end_match_1 = end1;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3771 end_match_2 = string2 + stop - size1;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3772 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3773
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
3774 /* `p' scans through the pattern as `d' scans through the data.
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3775 `dend' is the end of the input string that `d' points within. `d'
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3776 is advanced into the following input string whenever necessary, but
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3777 this happens before fetching; therefore, at the beginning of the
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3778 loop, `d' can be pointing at the end of a string, but it cannot
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3779 equal `string2'. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3780 if (size1 > 0 && pos <= size1)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3781 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3782 d = string1 + pos;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3783 dend = end_match_1;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3784 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3785 else
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3786 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3787 d = string2 + pos - size1;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3788 dend = end_match_2;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3789 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3790
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3791 DEBUG_PRINT1 ("The compiled pattern is: ");
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3792 DEBUG_PRINT_COMPILED_PATTERN (bufp, p, pend);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3793 DEBUG_PRINT1 ("The string to match is: `");
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3794 DEBUG_PRINT_DOUBLE_STRING (d, string1, size1, string2, size2);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3795 DEBUG_PRINT1 ("'\n");
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
3796
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3797 /* This loops over pattern commands. It exits by returning from the
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3798 function if the match is complete, or it drops through if the match
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3799 fails at this starting point in the input data. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3800 for (;;)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3801 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3802 DEBUG_PRINT2 ("\n0x%x: ", p);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3803
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3804 if (p == pend)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3805 { /* End of pattern means we might have succeeded. */
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3806 DEBUG_PRINT1 ("end of pattern ... ");
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
3807
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3808 /* If we haven't matched the entire string, and we want the
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3809 longest match, try backtracking. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3810 if (d != end_match_2)
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3811 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3812 /* 1 if this match ends in the same string (string1 or string2)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3813 as the best previous match. */
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
3814 boolean same_str_p = (FIRST_STRING_P (match_end)
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3815 == MATCHING_IN_FIRST_STRING);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3816 /* 1 if this match is the best seen so far. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3817 boolean best_match_p;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3818
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3819 /* AIX compiler got confused when this was combined
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3820 with the previous declaration. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3821 if (same_str_p)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3822 best_match_p = d > match_end;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3823 else
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3824 best_match_p = !MATCHING_IN_FIRST_STRING;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3825
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3826 DEBUG_PRINT1 ("backtracking.\n");
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3827
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3828 if (!FAIL_STACK_EMPTY ())
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3829 { /* More failure points to try. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3830
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3831 /* If exceeds best match so far, save it. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3832 if (!best_regs_set || best_match_p)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3833 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3834 best_regs_set = true;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3835 match_end = d;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3836
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3837 DEBUG_PRINT1 ("\nSAVING match as best so far.\n");
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3838
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3839 for (mcnt = 1; mcnt < num_regs; mcnt++)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3840 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3841 best_regstart[mcnt] = regstart[mcnt];
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3842 best_regend[mcnt] = regend[mcnt];
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3843 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3844 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3845 goto fail;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3846 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3847
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3848 /* If no failure points, don't restore garbage. And if
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3849 last match is real best match, don't restore second
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3850 best one. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3851 else if (best_regs_set && !best_match_p)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3852 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3853 restore_best_regs:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3854 /* Restore best match. It may happen that `dend ==
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3855 end_match_1' while the restored d is in string2.
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3856 For example, the pattern `x.*y.*z' against the
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3857 strings `x-' and `y-z-', if the two strings are
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3858 not consecutive in memory. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3859 DEBUG_PRINT1 ("Restoring best registers.\n");
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3860
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3861 d = match_end;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3862 dend = ((d >= string1 && d <= end1)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3863 ? end_match_1 : end_match_2);
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3865 for (mcnt = 1; mcnt < num_regs; mcnt++)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3866 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3867 regstart[mcnt] = best_regstart[mcnt];
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3868 regend[mcnt] = best_regend[mcnt];
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3869 }
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3870 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3871 } /* d != end_match_2 */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3872
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3873 succeed_label:
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3874 DEBUG_PRINT1 ("Accepting match.\n");
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3875
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3876 /* If caller wants register contents data back, do it. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3877 if (regs && !bufp->no_sub)
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3878 {
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3879 /* Have the register data arrays been allocated? */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3880 if (bufp->regs_allocated == REGS_UNALLOCATED)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3881 { /* No. So allocate them with malloc. We need one
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3882 extra element beyond `num_regs' for the `-1' marker
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3883 GNU code uses. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3884 regs->num_regs = MAX (RE_NREGS, num_regs + 1);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3885 regs->start = TALLOC (regs->num_regs, regoff_t);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3886 regs->end = TALLOC (regs->num_regs, regoff_t);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3887 if (regs->start == NULL || regs->end == NULL)
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3888 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3889 FREE_VARIABLES ();
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3890 return -2;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3891 }
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3892 bufp->regs_allocated = REGS_REALLOCATE;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3893 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3894 else if (bufp->regs_allocated == REGS_REALLOCATE)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3895 { /* Yes. If we need more elements than were already
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3896 allocated, reallocate them. If we need fewer, just
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3897 leave it alone. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3898 if (regs->num_regs < num_regs + 1)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3899 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3900 regs->num_regs = num_regs + 1;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3901 RETALLOC (regs->start, regs->num_regs, regoff_t);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3902 RETALLOC (regs->end, regs->num_regs, regoff_t);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3903 if (regs->start == NULL || regs->end == NULL)
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3904 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3905 FREE_VARIABLES ();
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3906 return -2;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3907 }
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3908 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3909 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3910 else
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3911 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3912 /* These braces fend off a "empty body in an else-statement"
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3913 warning under GCC when assert expands to nothing. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3914 assert (bufp->regs_allocated == REGS_FIXED);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3915 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3916
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3917 /* Convert the pointer data in `regstart' and `regend' to
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3918 indices. Register zero has to be set differently,
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3919 since we haven't kept track of any info for it. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3920 if (regs->num_regs > 0)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3921 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3922 regs->start[0] = pos;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3923 regs->end[0] = (MATCHING_IN_FIRST_STRING
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3924 ? ((regoff_t) (d - string1))
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3925 : ((regoff_t) (d - string2 + size1)));
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3926 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3927
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3928 /* Go through the first `min (num_regs, regs->num_regs)'
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3929 registers, since that is all we initialized. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3930 for (mcnt = 1; mcnt < MIN (num_regs, regs->num_regs); mcnt++)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3931 {
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3932 if (REG_UNSET (regstart[mcnt]) || REG_UNSET (regend[mcnt]))
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3933 regs->start[mcnt] = regs->end[mcnt] = -1;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3934 else
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3935 {
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3936 regs->start[mcnt]
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3937 = (regoff_t) POINTER_TO_OFFSET (regstart[mcnt]);
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3938 regs->end[mcnt]
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3939 = (regoff_t) POINTER_TO_OFFSET (regend[mcnt]);
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3940 }
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3941 }
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
3942
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3943 /* If the regs structure we return has more elements than
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3944 were in the pattern, set the extra elements to -1. If
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3945 we (re)allocated the registers, this is the case,
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3946 because we always allocate enough to have at least one
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3947 -1 at the end. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3948 for (mcnt = num_regs; mcnt < regs->num_regs; mcnt++)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3949 regs->start[mcnt] = regs->end[mcnt] = -1;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3950 } /* regs && !bufp->no_sub */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3951
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3952 DEBUG_PRINT4 ("%u failure points pushed, %u popped (%u remain).\n",
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3953 nfailure_points_pushed, nfailure_points_popped,
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3954 nfailure_points_pushed - nfailure_points_popped);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3955 DEBUG_PRINT2 ("%u registers pushed.\n", num_regs_pushed);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3956
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3957 mcnt = d - pos - (MATCHING_IN_FIRST_STRING
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
3958 ? string1
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3959 : string2 - size1);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3960
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3961 DEBUG_PRINT2 ("Returning %d from re_match_2.\n", mcnt);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3962
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3963 FREE_VARIABLES ();
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3964 return mcnt;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3965 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3966
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3967 /* Otherwise match next pattern command. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3968 switch (SWITCH_ENUM_CAST ((re_opcode_t) *p++))
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3969 {
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3970 /* Ignore these. Used to ignore the n of succeed_n's which
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3971 currently have n == 0. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3972 case no_op:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3973 DEBUG_PRINT1 ("EXECUTING no_op.\n");
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3974 break;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3975
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3976 case succeed:
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3977 DEBUG_PRINT1 ("EXECUTING succeed.\n");
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3978 goto succeed_label;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3979
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3980 /* Match the next n pattern characters exactly. The following
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3981 byte in the pattern defines n, and the n bytes after that
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3982 are the characters to match. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3983 case exactn:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3984 mcnt = *p++;
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3985 DEBUG_PRINT2 ("EXECUTING exactn %d.\n", mcnt);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3986
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3987 /* This is written out as an if-else so we don't waste time
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3988 testing `translate' inside the loop. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3989 if (translate)
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3990 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3991 do
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3992 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3993 PREFETCH ();
13250
52e053f46f76 (TRANSLATE, PATFETCH): Cast elt of `translate'.
Richard M. Stallman <rms@gnu.org>
parents: 13100
diff changeset
3994 if ((unsigned char) translate[(unsigned char) *d++]
52e053f46f76 (TRANSLATE, PATFETCH): Cast elt of `translate'.
Richard M. Stallman <rms@gnu.org>
parents: 13100
diff changeset
3995 != (unsigned char) *p++)
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
3996 goto fail;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3997 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3998 while (--mcnt);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
3999 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4000 else
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4001 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4002 do
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4003 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4004 PREFETCH ();
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4005 if (*d++ != (char) *p++) goto fail;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4006 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4007 while (--mcnt);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4008 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4009 SET_REGS_MATCHED ();
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4010 break;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4011
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4012
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4013 /* Match any character except possibly a newline or a null. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4014 case anychar:
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4015 DEBUG_PRINT1 ("EXECUTING anychar.\n");
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4016
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4017 PREFETCH ();
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4018
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4019 if ((!(bufp->syntax & RE_DOT_NEWLINE) && TRANSLATE (*d) == '\n')
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4020 || (bufp->syntax & RE_DOT_NOT_NULL && TRANSLATE (*d) == '\000'))
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4021 goto fail;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4022
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4023 SET_REGS_MATCHED ();
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4024 DEBUG_PRINT2 (" Matched `%d'.\n", *d);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4025 d++;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4026 break;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4027
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4028
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4029 case charset:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4030 case charset_not:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4031 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4032 register unsigned char c;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4033 boolean not = (re_opcode_t) *(p - 1) == charset_not;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4034
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4035 DEBUG_PRINT2 ("EXECUTING charset%s.\n", not ? "_not" : "");
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4036
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4037 PREFETCH ();
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4038 c = TRANSLATE (*d); /* The character to match. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4039
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4040 /* Cast to `unsigned' instead of `unsigned char' in case the
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4041 bit list is a full 32 bytes long. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4042 if (c < (unsigned) (*p * BYTEWIDTH)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4043 && p[1 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH)))
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4044 not = !not;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4045
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4046 p += 1 + *p;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4047
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4048 if (!not) goto fail;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
4049
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4050 SET_REGS_MATCHED ();
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4051 d++;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4052 break;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4053 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4054
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4055
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4056 /* The beginning of a group is represented by start_memory.
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4057 The arguments are the register number in the next byte, and the
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4058 number of groups inner to this one in the next. The text
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4059 matched within the group is recorded (in the internal
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4060 registers data structure) under the register number. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4061 case start_memory:
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4062 DEBUG_PRINT3 ("EXECUTING start_memory %d (%d):\n", *p, p[1]);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4063
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4064 /* Find out if this group can match the empty string. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4065 p1 = p; /* To send to group_match_null_string_p. */
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
4066
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4067 if (REG_MATCH_NULL_STRING_P (reg_info[*p]) == MATCH_NULL_UNSET_VALUE)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4068 REG_MATCH_NULL_STRING_P (reg_info[*p])
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4069 = group_match_null_string_p (&p1, pend, reg_info);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4070
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4071 /* Save the position in the string where we were the last time
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4072 we were at this open-group operator in case the group is
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4073 operated upon by a repetition operator, e.g., with `(a*)*b'
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4074 against `ab'; then we want to ignore where we are now in
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4075 the string in case this attempt to match fails. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4076 old_regstart[*p] = REG_MATCH_NULL_STRING_P (reg_info[*p])
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4077 ? REG_UNSET (regstart[*p]) ? d : regstart[*p]
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4078 : regstart[*p];
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
4079 DEBUG_PRINT2 (" old_regstart: %d\n",
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4080 POINTER_TO_OFFSET (old_regstart[*p]));
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4081
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4082 regstart[*p] = d;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4083 DEBUG_PRINT2 (" regstart: %d\n", POINTER_TO_OFFSET (regstart[*p]));
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4084
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4085 IS_ACTIVE (reg_info[*p]) = 1;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4086 MATCHED_SOMETHING (reg_info[*p]) = 0;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4087
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4088 /* Clear this whenever we change the register activity status. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4089 set_regs_matched_done = 0;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
4090
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4091 /* This is the new highest active register. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4092 highest_active_reg = *p;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4093
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4094 /* If nothing was active before, this is the new lowest active
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4095 register. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4096 if (lowest_active_reg == NO_LOWEST_ACTIVE_REG)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4097 lowest_active_reg = *p;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4098
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4099 /* Move past the register number and inner group count. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4100 p += 2;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4101 just_past_start_mem = p;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4102
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4103 break;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4104
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4105
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4106 /* The stop_memory opcode represents the end of a group. Its
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4107 arguments are the same as start_memory's: the register
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4108 number, and the number of inner groups. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4109 case stop_memory:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4110 DEBUG_PRINT3 ("EXECUTING stop_memory %d (%d):\n", *p, p[1]);
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
4111
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4112 /* We need to save the string position the last time we were at
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4113 this close-group operator in case the group is operated
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4114 upon by a repetition operator, e.g., with `((a*)*(b*)*)*'
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4115 against `aba'; then we want to ignore where we are now in
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4116 the string in case this attempt to match fails. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4117 old_regend[*p] = REG_MATCH_NULL_STRING_P (reg_info[*p])
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4118 ? REG_UNSET (regend[*p]) ? d : regend[*p]
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4119 : regend[*p];
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
4120 DEBUG_PRINT2 (" old_regend: %d\n",
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4121 POINTER_TO_OFFSET (old_regend[*p]));
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4122
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4123 regend[*p] = d;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4124 DEBUG_PRINT2 (" regend: %d\n", POINTER_TO_OFFSET (regend[*p]));
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4125
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4126 /* This register isn't active anymore. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4127 IS_ACTIVE (reg_info[*p]) = 0;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4128
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4129 /* Clear this whenever we change the register activity status. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4130 set_regs_matched_done = 0;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4131
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4132 /* If this was the only register active, nothing is active
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4133 anymore. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4134 if (lowest_active_reg == highest_active_reg)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4135 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4136 lowest_active_reg = NO_LOWEST_ACTIVE_REG;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4137 highest_active_reg = NO_HIGHEST_ACTIVE_REG;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4138 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4139 else
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4140 { /* We must scan for the new highest active register, since
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4141 it isn't necessarily one less than now: consider
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4142 (a(b)c(d(e)f)g). When group 3 ends, after the f), the
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4143 new highest active register is 1. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4144 unsigned char r = *p - 1;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4145 while (r > 0 && !IS_ACTIVE (reg_info[r]))
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4146 r--;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4147
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4148 /* If we end up at register zero, that means that we saved
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4149 the registers as the result of an `on_failure_jump', not
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4150 a `start_memory', and we jumped to past the innermost
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4151 `stop_memory'. For example, in ((.)*) we save
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4152 registers 1 and 2 as a result of the *, but when we pop
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4153 back to the second ), we are at the stop_memory 1.
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4154 Thus, nothing is active. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4155 if (r == 0)
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4156 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4157 lowest_active_reg = NO_LOWEST_ACTIVE_REG;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4158 highest_active_reg = NO_HIGHEST_ACTIVE_REG;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4159 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4160 else
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4161 highest_active_reg = r;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4162 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4163
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4164 /* If just failed to match something this time around with a
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4165 group that's operated on by a repetition operator, try to
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4166 force exit from the ``loop'', and restore the register
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4167 information for this group that we had before trying this
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4168 last match. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4169 if ((!MATCHED_SOMETHING (reg_info[*p])
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4170 || just_past_start_mem == p - 1)
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
4171 && (p + 2) < pend)
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4172 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4173 boolean is_a_jump_n = false;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4174
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4175 p1 = p + 2;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4176 mcnt = 0;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4177 switch ((re_opcode_t) *p1++)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4178 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4179 case jump_n:
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4180 is_a_jump_n = true;
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4181 case pop_failure_jump:
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4182 case maybe_pop_jump:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4183 case jump:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4184 case dummy_failure_jump:
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4185 EXTRACT_NUMBER_AND_INCR (mcnt, p1);
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4186 if (is_a_jump_n)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4187 p1 += 2;
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4188 break;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4189
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4190 default:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4191 /* do nothing */ ;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4192 }
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4193 p1 += mcnt;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
4194
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4195 /* If the next operation is a jump backwards in the pattern
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4196 to an on_failure_jump right before the start_memory
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4197 corresponding to this stop_memory, exit from the loop
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4198 by forcing a failure after pushing on the stack the
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4199 on_failure_jump's jump in the pattern, and d. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4200 if (mcnt < 0 && (re_opcode_t) *p1 == on_failure_jump
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4201 && (re_opcode_t) p1[3] == start_memory && p1[4] == *p)
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4202 {
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4203 /* If this group ever matched anything, then restore
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4204 what its registers were before trying this last
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4205 failed match, e.g., with `(a*)*b' against `ab' for
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4206 regstart[1], and, e.g., with `((a*)*(b*)*)*'
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4207 against `aba' for regend[3].
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4208
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4209 Also restore the registers for inner groups for,
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4210 e.g., `((a*)(b*))*' against `aba' (register 3 would
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4211 otherwise get trashed). */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4212
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4213 if (EVER_MATCHED_SOMETHING (reg_info[*p]))
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4214 {
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
4215 unsigned r;
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
4216
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4217 EVER_MATCHED_SOMETHING (reg_info[*p]) = 0;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
4218
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4219 /* Restore this and inner groups' (if any) registers. */
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4220 for (r = *p; r < *p + *(p + 1); r++)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4221 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4222 regstart[r] = old_regstart[r];
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4223
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4224 /* xx why this test? */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4225 if (old_regend[r] >= regstart[r])
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4226 regend[r] = old_regend[r];
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4227 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4228 }
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4229 p1++;
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4230 EXTRACT_NUMBER_AND_INCR (mcnt, p1);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4231 PUSH_FAILURE_POINT (p1 + mcnt, d, -2);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4232
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4233 goto fail;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4234 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4235 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4236
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4237 /* Move past the register number and the inner group count. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4238 p += 2;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4239 break;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4240
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4241
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4242 /* \<digit> has been turned into a `duplicate' command which is
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4243 followed by the numeric value of <digit> as the register number. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4244 case duplicate:
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4245 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4246 register const char *d2, *dend2;
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4247 int regno = *p++; /* Get which register to match against. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4248 DEBUG_PRINT2 ("EXECUTING duplicate %d.\n", regno);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4249
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4250 /* Can't back reference a group which we've never matched. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4251 if (REG_UNSET (regstart[regno]) || REG_UNSET (regend[regno]))
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4252 goto fail;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4253
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4254 /* Where in input to try to start matching. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4255 d2 = regstart[regno];
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4256
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4257 /* Where to stop matching; if both the place to start and
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4258 the place to stop matching are in the same string, then
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4259 set to the place to stop, otherwise, for now have to use
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4260 the end of the first string. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4261
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4262 dend2 = ((FIRST_STRING_P (regstart[regno])
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4263 == FIRST_STRING_P (regend[regno]))
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4264 ? regend[regno] : end_match_1);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4265 for (;;)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4266 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4267 /* If necessary, advance to next segment in register
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4268 contents. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4269 while (d2 == dend2)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4270 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4271 if (dend2 == end_match_2) break;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4272 if (dend2 == regend[regno]) break;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4273
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4274 /* End of string1 => advance to string2. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4275 d2 = string2;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4276 dend2 = regend[regno];
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4277 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4278 /* At end of register contents => success */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4279 if (d2 == dend2) break;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4280
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4281 /* If necessary, advance to next segment in data. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4282 PREFETCH ();
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4283
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4284 /* How many characters left in this segment to match. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4285 mcnt = dend - d;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
4286
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4287 /* Want how many consecutive characters we can match in
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4288 one shot, so, if necessary, adjust the count. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4289 if (mcnt > dend2 - d2)
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4290 mcnt = dend2 - d2;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
4291
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4292 /* Compare that many; failure if mismatch, else move
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4293 past them. */
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
4294 if (translate
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4295 ? bcmp_translate (d, d2, mcnt, translate)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4296 : bcmp (d, d2, mcnt))
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4297 goto fail;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4298 d += mcnt, d2 += mcnt;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4299
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4300 /* Do this because we've match some characters. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4301 SET_REGS_MATCHED ();
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4302 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4303 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4304 break;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4305
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4306
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4307 /* begline matches the empty string at the beginning of the string
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4308 (unless `not_bol' is set in `bufp'), and, if
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4309 `newline_anchor' is set, after newlines. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4310 case begline:
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4311 DEBUG_PRINT1 ("EXECUTING begline.\n");
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4312
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4313 if (AT_STRINGS_BEG (d))
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4314 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4315 if (!bufp->not_bol) break;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4316 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4317 else if (d[-1] == '\n' && bufp->newline_anchor)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4318 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4319 break;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4320 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4321 /* In all other cases, we fail. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4322 goto fail;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4323
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4324
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4325 /* endline is the dual of begline. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4326 case endline:
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4327 DEBUG_PRINT1 ("EXECUTING endline.\n");
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4328
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4329 if (AT_STRINGS_END (d))
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4330 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4331 if (!bufp->not_eol) break;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4332 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4333
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4334 /* We have to ``prefetch'' the next character. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4335 else if ((d == end1 ? *string2 : *d) == '\n'
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4336 && bufp->newline_anchor)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4337 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4338 break;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4339 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4340 goto fail;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4341
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4342
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4343 /* Match at the very beginning of the data. */
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4344 case begbuf:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4345 DEBUG_PRINT1 ("EXECUTING begbuf.\n");
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4346 if (AT_STRINGS_BEG (d))
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4347 break;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4348 goto fail;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4349
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4350
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4351 /* Match at the very end of the data. */
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4352 case endbuf:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4353 DEBUG_PRINT1 ("EXECUTING endbuf.\n");
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4354 if (AT_STRINGS_END (d))
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4355 break;
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4356 goto fail;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4357
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4358
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4359 /* on_failure_keep_string_jump is used to optimize `.*\n'. It
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4360 pushes NULL as the value for the string on the stack. Then
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4361 `pop_failure_point' will keep the current value for the
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4362 string, instead of restoring it. To see why, consider
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4363 matching `foo\nbar' against `.*\n'. The .* matches the foo;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4364 then the . fails against the \n. But the next thing we want
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4365 to do is match the \n against the \n; if we restored the
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4366 string value, we would be back at the foo.
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4367
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4368 Because this is used only in specific cases, we don't need to
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4369 check all the things that `on_failure_jump' does, to make
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4370 sure the right things get saved on the stack. Hence we don't
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4371 share its code. The only reason to push anything on the
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4372 stack at all is that otherwise we would have to change
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4373 `anychar's code to do something besides goto fail in this
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4374 case; that seems worse than this. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4375 case on_failure_keep_string_jump:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4376 DEBUG_PRINT1 ("EXECUTING on_failure_keep_string_jump");
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4377
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4378 EXTRACT_NUMBER_AND_INCR (mcnt, p);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4379 DEBUG_PRINT3 (" %d (to 0x%x):\n", mcnt, p + mcnt);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4380
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4381 PUSH_FAILURE_POINT (p + mcnt, NULL, -2);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4382 break;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4383
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4384
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4385 /* Uses of on_failure_jump:
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
4386
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4387 Each alternative starts with an on_failure_jump that points
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4388 to the beginning of the next alternative. Each alternative
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4389 except the last ends with a jump that in effect jumps past
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4390 the rest of the alternatives. (They really jump to the
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4391 ending jump of the following alternative, because tensioning
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4392 these jumps is a hassle.)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4393
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4394 Repeats start with an on_failure_jump that points past both
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4395 the repetition text and either the following jump or
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4396 pop_failure_jump back to this on_failure_jump. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4397 case on_failure_jump:
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4398 on_failure:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4399 DEBUG_PRINT1 ("EXECUTING on_failure_jump");
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4400
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4401 EXTRACT_NUMBER_AND_INCR (mcnt, p);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4402 DEBUG_PRINT3 (" %d (to 0x%x)", mcnt, p + mcnt);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4403
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4404 /* If this on_failure_jump comes right before a group (i.e.,
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4405 the original * applied to a group), save the information
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4406 for that group and all inner ones, so that if we fail back
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4407 to this point, the group's information will be correct.
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4408 For example, in \(a*\)*\1, we need the preceding group,
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4409 and in \(zz\(a*\)b*\)\2, we need the inner group. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4410
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4411 /* We can't use `p' to check ahead because we push
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4412 a failure point to `p + mcnt' after we do this. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4413 p1 = p;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4414
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4415 /* We need to skip no_op's before we look for the
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4416 start_memory in case this on_failure_jump is happening as
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4417 the result of a completed succeed_n, as in \(a\)\{1,3\}b\1
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4418 against aba. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4419 while (p1 < pend && (re_opcode_t) *p1 == no_op)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4420 p1++;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4421
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4422 if (p1 < pend && (re_opcode_t) *p1 == start_memory)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4423 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4424 /* We have a new highest active register now. This will
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4425 get reset at the start_memory we are about to get to,
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4426 but we will have saved all the registers relevant to
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4427 this repetition op, as described above. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4428 highest_active_reg = *(p1 + 1) + *(p1 + 2);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4429 if (lowest_active_reg == NO_LOWEST_ACTIVE_REG)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4430 lowest_active_reg = *(p1 + 1);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4431 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4432
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4433 DEBUG_PRINT1 (":\n");
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4434 PUSH_FAILURE_POINT (p + mcnt, d, -2);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4435 break;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4436
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4437
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4438 /* A smart repeat ends with `maybe_pop_jump'.
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4439 We change it to either `pop_failure_jump' or `jump'. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4440 case maybe_pop_jump:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4441 EXTRACT_NUMBER_AND_INCR (mcnt, p);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4442 DEBUG_PRINT2 ("EXECUTING maybe_pop_jump %d.\n", mcnt);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4443 {
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4444 register unsigned char *p2 = p;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4445
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4446 /* Compare the beginning of the repeat with what in the
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4447 pattern follows its end. If we can establish that there
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4448 is nothing that they would both match, i.e., that we
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4449 would have to backtrack because of (as in, e.g., `a*a')
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4450 then we can change to pop_failure_jump, because we'll
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4451 never have to backtrack.
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4452
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4453 This is not true in the case of alternatives: in
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4454 `(a|ab)*' we do need to backtrack to the `ab' alternative
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4455 (e.g., if the string was `ab'). But instead of trying to
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4456 detect that here, the alternative has put on a dummy
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4457 failure point which is what we will end up popping. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4458
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4459 /* Skip over open/close-group commands.
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4460 If what follows this loop is a ...+ construct,
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4461 look at what begins its body, since we will have to
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4462 match at least one of that. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4463 while (1)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4464 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4465 if (p2 + 2 < pend
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4466 && ((re_opcode_t) *p2 == stop_memory
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4467 || (re_opcode_t) *p2 == start_memory))
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4468 p2 += 3;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4469 else if (p2 + 6 < pend
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4470 && (re_opcode_t) *p2 == dummy_failure_jump)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4471 p2 += 6;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4472 else
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4473 break;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4474 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4475
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4476 p1 = p + mcnt;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4477 /* p1[0] ... p1[2] are the `on_failure_jump' corresponding
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
4478 to the `maybe_finalize_jump' of this case. Examine what
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4479 follows. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4480
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4481 /* If we're at the end of the pattern, we can change. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4482 if (p2 == pend)
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4483 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4484 /* Consider what happens when matching ":\(.*\)"
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4485 against ":/". I don't really understand this code
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4486 yet. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4487 p[-3] = (unsigned char) pop_failure_jump;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4488 DEBUG_PRINT1
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4489 (" End of pattern: change to `pop_failure_jump'.\n");
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4490 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4491
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4492 else if ((re_opcode_t) *p2 == exactn
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4493 || (bufp->newline_anchor && (re_opcode_t) *p2 == endline))
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4494 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4495 register unsigned char c
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4496 = *p2 == (unsigned char) endline ? '\n' : p2[2];
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4497
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4498 if ((re_opcode_t) p1[3] == exactn && p1[5] != c)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4499 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4500 p[-3] = (unsigned char) pop_failure_jump;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4501 DEBUG_PRINT3 (" %c != %c => pop_failure_jump.\n",
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4502 c, p1[5]);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4503 }
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
4504
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4505 else if ((re_opcode_t) p1[3] == charset
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4506 || (re_opcode_t) p1[3] == charset_not)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4507 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4508 int not = (re_opcode_t) p1[3] == charset_not;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
4509
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4510 if (c < (unsigned char) (p1[4] * BYTEWIDTH)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4511 && p1[5 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH)))
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4512 not = !not;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4513
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4514 /* `not' is equal to 1 if c would match, which means
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4515 that we can't change to pop_failure_jump. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4516 if (!not)
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4517 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4518 p[-3] = (unsigned char) pop_failure_jump;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4519 DEBUG_PRINT1 (" No match => pop_failure_jump.\n");
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4520 }
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4521 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4522 }
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4523 else if ((re_opcode_t) *p2 == charset)
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4524 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4525 #ifdef DEBUG
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4526 register unsigned char c
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4527 = *p2 == (unsigned char) endline ? '\n' : p2[2];
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4528 #endif
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4529
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4530 if ((re_opcode_t) p1[3] == exactn
15214
308abb9a57f4 (re_match_2_internal): Fix off-by-one error; don't use
Richard M. Stallman <rms@gnu.org>
parents: 15011
diff changeset
4531 && ! ((int) p2[1] * BYTEWIDTH > (int) p1[5]
308abb9a57f4 (re_match_2_internal): Fix off-by-one error; don't use
Richard M. Stallman <rms@gnu.org>
parents: 15011
diff changeset
4532 && (p2[2 + p1[5] / BYTEWIDTH]
308abb9a57f4 (re_match_2_internal): Fix off-by-one error; don't use
Richard M. Stallman <rms@gnu.org>
parents: 15011
diff changeset
4533 & (1 << (p1[5] % BYTEWIDTH)))))
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4534 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4535 p[-3] = (unsigned char) pop_failure_jump;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4536 DEBUG_PRINT3 (" %c != %c => pop_failure_jump.\n",
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4537 c, p1[5]);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4538 }
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
4539
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4540 else if ((re_opcode_t) p1[3] == charset_not)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4541 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4542 int idx;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4543 /* We win if the charset_not inside the loop
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4544 lists every character listed in the charset after. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4545 for (idx = 0; idx < (int) p2[1]; idx++)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4546 if (! (p2[2 + idx] == 0
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4547 || (idx < (int) p1[4]
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4548 && ((p2[2 + idx] & ~ p1[5 + idx]) == 0))))
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4549 break;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4550
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4551 if (idx == p2[1])
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4552 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4553 p[-3] = (unsigned char) pop_failure_jump;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4554 DEBUG_PRINT1 (" No match => pop_failure_jump.\n");
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4555 }
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4556 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4557 else if ((re_opcode_t) p1[3] == charset)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4558 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4559 int idx;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4560 /* We win if the charset inside the loop
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4561 has no overlap with the one after the loop. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4562 for (idx = 0;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4563 idx < (int) p2[1] && idx < (int) p1[4];
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4564 idx++)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4565 if ((p2[2 + idx] & p1[5 + idx]) != 0)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4566 break;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4567
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4568 if (idx == p2[1] || idx == p1[4])
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4569 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4570 p[-3] = (unsigned char) pop_failure_jump;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4571 DEBUG_PRINT1 (" No match => pop_failure_jump.\n");
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4572 }
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4573 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4574 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4575 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4576 p -= 2; /* Point at relative address again. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4577 if ((re_opcode_t) p[-1] != pop_failure_jump)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4578 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4579 p[-1] = (unsigned char) jump;
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4580 DEBUG_PRINT1 (" Match => jump.\n");
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4581 goto unconditional_jump;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4582 }
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4583 /* Note fall through. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4584
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4585
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4586 /* The end of a simple repeat has a pop_failure_jump back to
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4587 its matching on_failure_jump, where the latter will push a
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4588 failure point. The pop_failure_jump takes off failure
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4589 points put on by this pop_failure_jump's matching
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4590 on_failure_jump; we got through the pattern to here from the
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4591 matching on_failure_jump, so didn't fail. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4592 case pop_failure_jump:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4593 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4594 /* We need to pass separate storage for the lowest and
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4595 highest registers, even though we don't care about the
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4596 actual values. Otherwise, we will restore only one
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4597 register from the stack, since lowest will == highest in
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4598 `pop_failure_point'. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4599 unsigned dummy_low_reg, dummy_high_reg;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4600 unsigned char *pdummy;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4601 const char *sdummy;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4602
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4603 DEBUG_PRINT1 ("EXECUTING pop_failure_jump.\n");
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4604 POP_FAILURE_POINT (sdummy, pdummy,
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4605 dummy_low_reg, dummy_high_reg,
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4606 reg_dummy, reg_dummy, reg_info_dummy);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4607 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4608 /* Note fall through. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4609
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4610
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4611 /* Unconditionally jump (without popping any failure points). */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4612 case jump:
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4613 unconditional_jump:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4614 EXTRACT_NUMBER_AND_INCR (mcnt, p); /* Get the amount to jump. */
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4615 DEBUG_PRINT2 ("EXECUTING jump %d ", mcnt);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4616 p += mcnt; /* Do the jump. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4617 DEBUG_PRINT2 ("(to 0x%x).\n", p);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4618 break;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4619
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4620
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4621 /* We need this opcode so we can detect where alternatives end
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4622 in `group_match_null_string_p' et al. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4623 case jump_past_alt:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4624 DEBUG_PRINT1 ("EXECUTING jump_past_alt.\n");
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4625 goto unconditional_jump;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4626
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4627
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4628 /* Normally, the on_failure_jump pushes a failure point, which
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4629 then gets popped at pop_failure_jump. We will end up at
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4630 pop_failure_jump, also, and with a pattern of, say, `a+', we
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4631 are skipping over the on_failure_jump, so we have to push
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4632 something meaningless for pop_failure_jump to pop. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4633 case dummy_failure_jump:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4634 DEBUG_PRINT1 ("EXECUTING dummy_failure_jump.\n");
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4635 /* It doesn't matter what we push for the string here. What
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4636 the code at `fail' tests is the value for the pattern. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4637 PUSH_FAILURE_POINT (0, 0, -2);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4638 goto unconditional_jump;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4639
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4640
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4641 /* At the end of an alternative, we need to push a dummy failure
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4642 point in case we are followed by a `pop_failure_jump', because
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4643 we don't want the failure point for the alternative to be
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4644 popped. For example, matching `(a|ab)*' against `aab'
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4645 requires that we match the `ab' alternative. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4646 case push_dummy_failure:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4647 DEBUG_PRINT1 ("EXECUTING push_dummy_failure.\n");
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4648 /* See comments just above at `dummy_failure_jump' about the
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4649 two zeroes. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4650 PUSH_FAILURE_POINT (0, 0, -2);
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4651 break;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4652
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4653 /* Have to succeed matching what follows at least n times.
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4654 After that, handle like `on_failure_jump'. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4655 case succeed_n:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4656 EXTRACT_NUMBER (mcnt, p + 2);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4657 DEBUG_PRINT2 ("EXECUTING succeed_n %d.\n", mcnt);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4658
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4659 assert (mcnt >= 0);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4660 /* Originally, this is how many times we HAVE to succeed. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4661 if (mcnt > 0)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4662 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4663 mcnt--;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4664 p += 2;
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4665 STORE_NUMBER_AND_INCR (p, mcnt);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4666 DEBUG_PRINT3 (" Setting 0x%x to %d.\n", p, mcnt);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4667 }
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4668 else if (mcnt == 0)
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4669 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4670 DEBUG_PRINT2 (" Setting two bytes from 0x%x to no_op.\n", p+2);
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4671 p[2] = (unsigned char) no_op;
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4672 p[3] = (unsigned char) no_op;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4673 goto on_failure;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4674 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4675 break;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4676
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4677 case jump_n:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4678 EXTRACT_NUMBER (mcnt, p + 2);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4679 DEBUG_PRINT2 ("EXECUTING jump_n %d.\n", mcnt);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4680
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4681 /* Originally, this is how many times we CAN jump. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4682 if (mcnt)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4683 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4684 mcnt--;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4685 STORE_NUMBER (p + 2, mcnt);
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
4686 goto unconditional_jump;
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4687 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4688 /* If don't have to jump any more, skip over the rest of command. */
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
4689 else
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
4690 p += 4;
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4691 break;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
4692
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4693 case set_number_at:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4694 {
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4695 DEBUG_PRINT1 ("EXECUTING set_number_at.\n");
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4696
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4697 EXTRACT_NUMBER_AND_INCR (mcnt, p);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4698 p1 = p + mcnt;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4699 EXTRACT_NUMBER_AND_INCR (mcnt, p);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4700 DEBUG_PRINT3 (" Setting 0x%x to %d.\n", p1, mcnt);
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4701 STORE_NUMBER (p1, mcnt);
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4702 break;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4703 }
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4704
13722
e2669b8a46e2 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 13565
diff changeset
4705 #if 0
e2669b8a46e2 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 13565
diff changeset
4706 /* The DEC Alpha C compiler 3.x generates incorrect code for the
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4707 test WORDCHAR_P (d - 1) != WORDCHAR_P (d) in the expansion of
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4708 AT_WORD_BOUNDARY, so this code is disabled. Expanding the
13722
e2669b8a46e2 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 13565
diff changeset
4709 macro and introducing temporary variables works around the bug. */
e2669b8a46e2 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 13565
diff changeset
4710
e2669b8a46e2 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 13565
diff changeset
4711 case wordbound:
e2669b8a46e2 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 13565
diff changeset
4712 DEBUG_PRINT1 ("EXECUTING wordbound.\n");
e2669b8a46e2 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 13565
diff changeset
4713 if (AT_WORD_BOUNDARY (d))
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4714 break;
13722
e2669b8a46e2 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 13565
diff changeset
4715 goto fail;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4716
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4717 case notwordbound:
13722
e2669b8a46e2 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 13565
diff changeset
4718 DEBUG_PRINT1 ("EXECUTING notwordbound.\n");
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4719 if (AT_WORD_BOUNDARY (d))
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4720 goto fail;
13722
e2669b8a46e2 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 13565
diff changeset
4721 break;
e2669b8a46e2 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 13565
diff changeset
4722 #else
e2669b8a46e2 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 13565
diff changeset
4723 case wordbound:
e2669b8a46e2 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 13565
diff changeset
4724 {
e2669b8a46e2 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 13565
diff changeset
4725 boolean prevchar, thischar;
e2669b8a46e2 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 13565
diff changeset
4726
e2669b8a46e2 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 13565
diff changeset
4727 DEBUG_PRINT1 ("EXECUTING wordbound.\n");
e2669b8a46e2 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 13565
diff changeset
4728 if (AT_STRINGS_BEG (d) || AT_STRINGS_END (d))
e2669b8a46e2 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 13565
diff changeset
4729 break;
e2669b8a46e2 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 13565
diff changeset
4730
e2669b8a46e2 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 13565
diff changeset
4731 prevchar = WORDCHAR_P (d - 1);
e2669b8a46e2 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 13565
diff changeset
4732 thischar = WORDCHAR_P (d);
e2669b8a46e2 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 13565
diff changeset
4733 if (prevchar != thischar)
e2669b8a46e2 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 13565
diff changeset
4734 break;
e2669b8a46e2 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 13565
diff changeset
4735 goto fail;
e2669b8a46e2 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 13565
diff changeset
4736 }
e2669b8a46e2 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 13565
diff changeset
4737
e2669b8a46e2 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 13565
diff changeset
4738 case notwordbound:
e2669b8a46e2 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 13565
diff changeset
4739 {
e2669b8a46e2 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 13565
diff changeset
4740 boolean prevchar, thischar;
e2669b8a46e2 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 13565
diff changeset
4741
e2669b8a46e2 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 13565
diff changeset
4742 DEBUG_PRINT1 ("EXECUTING notwordbound.\n");
e2669b8a46e2 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 13565
diff changeset
4743 if (AT_STRINGS_BEG (d) || AT_STRINGS_END (d))
e2669b8a46e2 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 13565
diff changeset
4744 goto fail;
e2669b8a46e2 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 13565
diff changeset
4745
e2669b8a46e2 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 13565
diff changeset
4746 prevchar = WORDCHAR_P (d - 1);
e2669b8a46e2 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 13565
diff changeset
4747 thischar = WORDCHAR_P (d);
e2669b8a46e2 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 13565
diff changeset
4748 if (prevchar != thischar)
e2669b8a46e2 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 13565
diff changeset
4749 goto fail;
e2669b8a46e2 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 13565
diff changeset
4750 break;
e2669b8a46e2 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 13565
diff changeset
4751 }
e2669b8a46e2 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 13565
diff changeset
4752 #endif
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4753
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4754 case wordbeg:
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4755 DEBUG_PRINT1 ("EXECUTING wordbeg.\n");
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4756 if (WORDCHAR_P (d) && (AT_STRINGS_BEG (d) || !WORDCHAR_P (d - 1)))
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4757 break;
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4758 goto fail;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4759
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4760 case wordend:
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4761 DEBUG_PRINT1 ("EXECUTING wordend.\n");
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4762 if (!AT_STRINGS_BEG (d) && WORDCHAR_P (d - 1)
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4763 && (!WORDCHAR_P (d) || AT_STRINGS_END (d)))
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4764 break;
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4765 goto fail;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4766
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4767 #ifdef emacs
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4768 case before_dot:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4769 DEBUG_PRINT1 ("EXECUTING before_dot.\n");
16034
d255e64c9e69 (re_match_2_internal) [emacs]: Use PT, not point.
Karl Heuer <kwzh@gnu.org>
parents: 16010
diff changeset
4770 if (PTR_CHAR_POS ((unsigned char *) d) >= PT)
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4771 goto fail;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4772 break;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4773
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4774 case at_dot:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4775 DEBUG_PRINT1 ("EXECUTING at_dot.\n");
16034
d255e64c9e69 (re_match_2_internal) [emacs]: Use PT, not point.
Karl Heuer <kwzh@gnu.org>
parents: 16010
diff changeset
4776 if (PTR_CHAR_POS ((unsigned char *) d) != PT)
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4777 goto fail;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4778 break;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4779
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4780 case after_dot:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4781 DEBUG_PRINT1 ("EXECUTING after_dot.\n");
16034
d255e64c9e69 (re_match_2_internal) [emacs]: Use PT, not point.
Karl Heuer <kwzh@gnu.org>
parents: 16010
diff changeset
4782 if (PTR_CHAR_POS ((unsigned char *) d) <= PT)
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4783 goto fail;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4784 break;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4785
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4786 case syntaxspec:
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4787 DEBUG_PRINT2 ("EXECUTING syntaxspec %d.\n", mcnt);
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4788 mcnt = *p++;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4789 goto matchsyntax;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4790
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4791 case wordchar:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4792 DEBUG_PRINT1 ("EXECUTING Emacs wordchar.\n");
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4793 mcnt = (int) Sword;
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4794 matchsyntax:
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4795 PREFETCH ();
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4796 /* Can't use *d++ here; SYNTAX may be an unsafe macro. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4797 d++;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4798 if (SYNTAX (d[-1]) != (enum syntaxcode) mcnt)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4799 goto fail;
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4800 SET_REGS_MATCHED ();
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4801 break;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4802
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4803 case notsyntaxspec:
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4804 DEBUG_PRINT2 ("EXECUTING notsyntaxspec %d.\n", mcnt);
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4805 mcnt = *p++;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4806 goto matchnotsyntax;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4807
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4808 case notwordchar:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4809 DEBUG_PRINT1 ("EXECUTING Emacs notwordchar.\n");
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4810 mcnt = (int) Sword;
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4811 matchnotsyntax:
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4812 PREFETCH ();
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4813 /* Can't use *d++ here; SYNTAX may be an unsafe macro. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4814 d++;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4815 if (SYNTAX (d[-1]) == (enum syntaxcode) mcnt)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4816 goto fail;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4817 SET_REGS_MATCHED ();
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4818 break;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4819
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4820 #else /* not emacs */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4821 case wordchar:
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4822 DEBUG_PRINT1 ("EXECUTING non-Emacs wordchar.\n");
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4823 PREFETCH ();
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4824 if (!WORDCHAR_P (d))
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4825 goto fail;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4826 SET_REGS_MATCHED ();
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4827 d++;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4828 break;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
4829
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4830 case notwordchar:
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4831 DEBUG_PRINT1 ("EXECUTING non-Emacs notwordchar.\n");
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4832 PREFETCH ();
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4833 if (WORDCHAR_P (d))
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4834 goto fail;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4835 SET_REGS_MATCHED ();
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4836 d++;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4837 break;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4838 #endif /* not emacs */
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
4839
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4840 default:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4841 abort ();
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4842 }
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4843 continue; /* Successfully executed one pattern command; keep going. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4844
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4845
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4846 /* We goto here if a matching operation fails. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4847 fail:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4848 if (!FAIL_STACK_EMPTY ())
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4849 { /* A restart point is known. Restore to that state. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4850 DEBUG_PRINT1 ("\nFAIL:\n");
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4851 POP_FAILURE_POINT (d, p,
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4852 lowest_active_reg, highest_active_reg,
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4853 regstart, regend, reg_info);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4854
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4855 /* If this failure point is a dummy, try the next one. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4856 if (!p)
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4857 goto fail;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4858
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4859 /* If we failed to the end of the pattern, don't examine *p. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4860 assert (p <= pend);
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4861 if (p < pend)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4862 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4863 boolean is_a_jump_n = false;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4864
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4865 /* If failed to a backwards jump that's part of a repetition
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4866 loop, need to pop this failure point and use the next one. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4867 switch ((re_opcode_t) *p)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4868 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4869 case jump_n:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4870 is_a_jump_n = true;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4871 case maybe_pop_jump:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4872 case pop_failure_jump:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4873 case jump:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4874 p1 = p + 1;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4875 EXTRACT_NUMBER_AND_INCR (mcnt, p1);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4876 p1 += mcnt;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4877
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4878 if ((is_a_jump_n && (re_opcode_t) *p1 == succeed_n)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4879 || (!is_a_jump_n
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4880 && (re_opcode_t) *p1 == on_failure_jump))
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4881 goto fail;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4882 break;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4883 default:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4884 /* do nothing */ ;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4885 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4886 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4887
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4888 if (d >= string1 && d <= end1)
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4889 dend = end_match_1;
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4890 }
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4891 else
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4892 break; /* Matching at this starting point really fails. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4893 } /* for (;;) */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4894
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4895 if (best_regs_set)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4896 goto restore_best_regs;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4897
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4898 FREE_VARIABLES ();
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4899
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4900 return -1; /* Failure to match. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4901 } /* re_match_2 */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4902
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4903 /* Subroutine definitions for re_match_2. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4904
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4905
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4906 /* We are passed P pointing to a register number after a start_memory.
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
4907
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4908 Return true if the pattern up to the corresponding stop_memory can
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4909 match the empty string, and false otherwise.
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
4910
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4911 If we find the matching stop_memory, sets P to point to one past its number.
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4912 Otherwise, sets P to an undefined byte less than or equal to END.
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4913
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4914 We don't handle duplicates properly (yet). */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4915
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4916 static boolean
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4917 group_match_null_string_p (p, end, reg_info)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4918 unsigned char **p, *end;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4919 register_info_type *reg_info;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4920 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4921 int mcnt;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4922 /* Point to after the args to the start_memory. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4923 unsigned char *p1 = *p + 2;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
4924
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4925 while (p1 < end)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4926 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4927 /* Skip over opcodes that can match nothing, and return true or
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4928 false, as appropriate, when we get to one that can't, or to the
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4929 matching stop_memory. */
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
4930
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4931 switch ((re_opcode_t) *p1)
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4932 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4933 /* Could be either a loop or a series of alternatives. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4934 case on_failure_jump:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4935 p1++;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4936 EXTRACT_NUMBER_AND_INCR (mcnt, p1);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4937
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4938 /* If the next operation is not a jump backwards in the
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4939 pattern. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4940
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4941 if (mcnt >= 0)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4942 {
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4943 /* Go through the on_failure_jumps of the alternatives,
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4944 seeing if any of the alternatives cannot match nothing.
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4945 The last alternative starts with only a jump,
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4946 whereas the rest start with on_failure_jump and end
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4947 with a jump, e.g., here is the pattern for `a|b|c':
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4948
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4949 /on_failure_jump/0/6/exactn/1/a/jump_past_alt/0/6
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4950 /on_failure_jump/0/6/exactn/1/b/jump_past_alt/0/3
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4951 /exactn/1/c
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4952
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4953 So, we have to first go through the first (n-1)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4954 alternatives and then deal with the last one separately. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4955
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4956
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4957 /* Deal with the first (n-1) alternatives, which start
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4958 with an on_failure_jump (see above) that jumps to right
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4959 past a jump_past_alt. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4960
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4961 while ((re_opcode_t) p1[mcnt-3] == jump_past_alt)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4962 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4963 /* `mcnt' holds how many bytes long the alternative
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4964 is, including the ending `jump_past_alt' and
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4965 its number. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4966
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4967 if (!alt_match_null_string_p (p1, p1 + mcnt - 3,
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4968 reg_info))
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4969 return false;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4970
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4971 /* Move to right after this alternative, including the
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4972 jump_past_alt. */
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4973 p1 += mcnt;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4974
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4975 /* Break if it's the beginning of an n-th alternative
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4976 that doesn't begin with an on_failure_jump. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4977 if ((re_opcode_t) *p1 != on_failure_jump)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4978 break;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
4979
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4980 /* Still have to check that it's not an n-th
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4981 alternative that starts with an on_failure_jump. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
4982 p1++;
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4983 EXTRACT_NUMBER_AND_INCR (mcnt, p1);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4984 if ((re_opcode_t) p1[mcnt-3] != jump_past_alt)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4985 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4986 /* Get to the beginning of the n-th alternative. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4987 p1 -= 3;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4988 break;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4989 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4990 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4991
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4992 /* Deal with the last alternative: go back and get number
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4993 of the `jump_past_alt' just before it. `mcnt' contains
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4994 the length of the alternative. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4995 EXTRACT_NUMBER (mcnt, p1 - 2);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4996
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4997 if (!alt_match_null_string_p (p1, p1 + mcnt, reg_info))
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4998 return false;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
4999
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5000 p1 += mcnt; /* Get past the n-th alternative. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5001 } /* if mcnt > 0 */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5002 break;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5003
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5004
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5005 case stop_memory:
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5006 assert (p1[1] == **p);
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5007 *p = p1 + 2;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5008 return true;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5009
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5011 default:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5012 if (!common_op_match_null_string_p (&p1, end, reg_info))
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5013 return false;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5014 }
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5015 } /* while p1 < end */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5016
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5017 return false;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5018 } /* group_match_null_string_p */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5019
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5020
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5021 /* Similar to group_match_null_string_p, but doesn't deal with alternatives:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5022 It expects P to be the first byte of a single alternative and END one
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5023 byte past the last. The alternative can contain groups. */
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
5024
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5025 static boolean
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5026 alt_match_null_string_p (p, end, reg_info)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5027 unsigned char *p, *end;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5028 register_info_type *reg_info;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5029 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5030 int mcnt;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5031 unsigned char *p1 = p;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
5032
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5033 while (p1 < end)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5034 {
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
5035 /* Skip over opcodes that can match nothing, and break when we get
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5036 to one that can't. */
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
5037
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5038 switch ((re_opcode_t) *p1)
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5039 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5040 /* It's a loop. */
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5041 case on_failure_jump:
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5042 p1++;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5043 EXTRACT_NUMBER_AND_INCR (mcnt, p1);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5044 p1 += mcnt;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5045 break;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
5046
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
5047 default:
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5048 if (!common_op_match_null_string_p (&p1, end, reg_info))
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5049 return false;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5050 }
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5051 } /* while p1 < end */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5052
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5053 return true;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5054 } /* alt_match_null_string_p */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5055
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5056
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5057 /* Deals with the ops common to group_match_null_string_p and
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
5058 alt_match_null_string_p.
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
5059
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5060 Sets P to one after the op and its arguments, if any. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5061
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5062 static boolean
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5063 common_op_match_null_string_p (p, end, reg_info)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5064 unsigned char **p, *end;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5065 register_info_type *reg_info;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5066 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5067 int mcnt;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5068 boolean ret;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5069 int reg_no;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5070 unsigned char *p1 = *p;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5071
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5072 switch ((re_opcode_t) *p1++)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5073 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5074 case no_op:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5075 case begline:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5076 case endline:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5077 case begbuf:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5078 case endbuf:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5079 case wordbeg:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5080 case wordend:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5081 case wordbound:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5082 case notwordbound:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5083 #ifdef emacs
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5084 case before_dot:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5085 case at_dot:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5086 case after_dot:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5087 #endif
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5088 break;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5089
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5090 case start_memory:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5091 reg_no = *p1;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5092 assert (reg_no > 0 && reg_no <= MAX_REGNUM);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5093 ret = group_match_null_string_p (&p1, end, reg_info);
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
5094
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5095 /* Have to set this here in case we're checking a group which
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5096 contains a group and a back reference to it. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5097
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5098 if (REG_MATCH_NULL_STRING_P (reg_info[reg_no]) == MATCH_NULL_UNSET_VALUE)
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5099 REG_MATCH_NULL_STRING_P (reg_info[reg_no]) = ret;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5100
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5101 if (!ret)
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5102 return false;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5103 break;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
5104
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5105 /* If this is an optimized succeed_n for zero times, make the jump. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5106 case jump:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5107 EXTRACT_NUMBER_AND_INCR (mcnt, p1);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5108 if (mcnt >= 0)
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5109 p1 += mcnt;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5110 else
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5111 return false;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5112 break;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5113
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5114 case succeed_n:
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5115 /* Get to the number of times to succeed. */
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
5116 p1 += 2;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5117 EXTRACT_NUMBER_AND_INCR (mcnt, p1);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5118
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5119 if (mcnt == 0)
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5120 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5121 p1 -= 4;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5122 EXTRACT_NUMBER_AND_INCR (mcnt, p1);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5123 p1 += mcnt;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5124 }
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5125 else
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5126 return false;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5127 break;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5128
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
5129 case duplicate:
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5130 if (!REG_MATCH_NULL_STRING_P (reg_info[*p1]))
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5131 return false;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5132 break;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5133
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5134 case set_number_at:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5135 p1 += 4;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5136
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5137 default:
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5138 /* All other opcodes mean we cannot match the empty string. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5139 return false;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5140 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5141
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5142 *p = p1;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5143 return true;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5144 } /* common_op_match_null_string_p */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5145
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5146
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5147 /* Return zero if TRANSLATE[S1] and TRANSLATE[S2] are identical for LEN
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5148 bytes; nonzero otherwise. */
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
5149
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5150 static int
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5151 bcmp_translate (s1, s2, len, translate)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5152 unsigned char *s1, *s2;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5153 register int len;
13250
52e053f46f76 (TRANSLATE, PATFETCH): Cast elt of `translate'.
Richard M. Stallman <rms@gnu.org>
parents: 13100
diff changeset
5154 RE_TRANSLATE_TYPE translate;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5155 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5156 register unsigned char *p1 = s1, *p2 = s2;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5157 while (len)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5158 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5159 if (translate[*p1++] != translate[*p2++]) return 1;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5160 len--;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5161 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5162 return 0;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5163 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5164
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5165 /* Entry points for GNU code. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5166
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5167 /* re_compile_pattern is the GNU regular expression compiler: it
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5168 compiles PATTERN (of length SIZE) and puts the result in BUFP.
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5169 Returns 0 if the pattern was valid, otherwise an error string.
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
5170
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5171 Assumes the `allocated' (and perhaps `buffer') and `translate' fields
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5172 are set in BUFP on entry.
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
5173
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5174 We call regex_compile to do the actual compilation. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5175
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5176 const char *
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5177 re_compile_pattern (pattern, length, bufp)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5178 const char *pattern;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5179 int length;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5180 struct re_pattern_buffer *bufp;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5181 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5182 reg_errcode_t ret;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
5183
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5184 /* GNU code is written to assume at least RE_NREGS registers will be set
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5185 (and at least one extra will be -1). */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5186 bufp->regs_allocated = REGS_UNALLOCATED;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
5187
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5188 /* And GNU code determines whether or not to get register information
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5189 by passing null for the REGS argument to re_match, etc., not by
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5190 setting no_sub. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5191 bufp->no_sub = 0;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
5192
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5193 /* Match anchors at newline. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5194 bufp->newline_anchor = 1;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
5195
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5196 ret = regex_compile (pattern, length, re_syntax_options, bufp);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5197
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5198 if (!ret)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5199 return NULL;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5200 return gettext (re_error_msgid[(int) ret]);
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
5201 }
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5202
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5203 /* Entry points compatible with 4.2 BSD regex library. We don't define
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5204 them unless specifically requested. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5205
15285
c2b4f8533c55 Tue May 21 19:18:05 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
Roland McGrath <roland@gnu.org>
parents: 15224
diff changeset
5206 #if defined (_REGEX_RE_COMP) || defined (_LIBC)
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5207
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5208 /* BSD has one and only one pattern buffer. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5209 static struct re_pattern_buffer re_comp_buf;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5210
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5211 char *
15635
89f7ba4ccd22 [_LIBC] (re_comp, re_exec): Use `weak_function' keyword in defn instead of
Roland McGrath <roland@gnu.org>
parents: 15516
diff changeset
5212 #ifdef _LIBC
89f7ba4ccd22 [_LIBC] (re_comp, re_exec): Use `weak_function' keyword in defn instead of
Roland McGrath <roland@gnu.org>
parents: 15516
diff changeset
5213 /* Make these definitions weak in libc, so POSIX programs can redefine
89f7ba4ccd22 [_LIBC] (re_comp, re_exec): Use `weak_function' keyword in defn instead of
Roland McGrath <roland@gnu.org>
parents: 15516
diff changeset
5214 these names if they don't use our functions, and still use
89f7ba4ccd22 [_LIBC] (re_comp, re_exec): Use `weak_function' keyword in defn instead of
Roland McGrath <roland@gnu.org>
parents: 15516
diff changeset
5215 regcomp/regexec below without link errors. */
89f7ba4ccd22 [_LIBC] (re_comp, re_exec): Use `weak_function' keyword in defn instead of
Roland McGrath <roland@gnu.org>
parents: 15516
diff changeset
5216 weak_function
89f7ba4ccd22 [_LIBC] (re_comp, re_exec): Use `weak_function' keyword in defn instead of
Roland McGrath <roland@gnu.org>
parents: 15516
diff changeset
5217 #endif
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5218 re_comp (s)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5219 const char *s;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5220 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5221 reg_errcode_t ret;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
5222
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5223 if (!s)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5224 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5225 if (!re_comp_buf.buffer)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5226 return gettext ("No previous regular expression");
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5227 return 0;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5228 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5229
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5230 if (!re_comp_buf.buffer)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5231 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5232 re_comp_buf.buffer = (unsigned char *) malloc (200);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5233 if (re_comp_buf.buffer == NULL)
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5234 return gettext (re_error_msgid[(int) REG_ESPACE]);
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5235 re_comp_buf.allocated = 200;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5236
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5237 re_comp_buf.fastmap = (char *) malloc (1 << BYTEWIDTH);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5238 if (re_comp_buf.fastmap == NULL)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5239 return gettext (re_error_msgid[(int) REG_ESPACE]);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5240 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5241
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5242 /* Since `re_exec' always passes NULL for the `regs' argument, we
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5243 don't need to initialize the pattern buffer fields which affect it. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5244
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5245 /* Match anchors at newlines. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5246 re_comp_buf.newline_anchor = 1;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5247
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5248 ret = regex_compile (s, strlen (s), re_syntax_options, &re_comp_buf);
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
5249
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5250 if (!ret)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5251 return NULL;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5252
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5253 /* Yes, we're discarding `const' here if !HAVE_LIBINTL. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5254 return (char *) gettext (re_error_msgid[(int) ret]);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5255 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5256
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5257
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5258 int
15635
89f7ba4ccd22 [_LIBC] (re_comp, re_exec): Use `weak_function' keyword in defn instead of
Roland McGrath <roland@gnu.org>
parents: 15516
diff changeset
5259 #ifdef _LIBC
89f7ba4ccd22 [_LIBC] (re_comp, re_exec): Use `weak_function' keyword in defn instead of
Roland McGrath <roland@gnu.org>
parents: 15516
diff changeset
5260 weak_function
89f7ba4ccd22 [_LIBC] (re_comp, re_exec): Use `weak_function' keyword in defn instead of
Roland McGrath <roland@gnu.org>
parents: 15516
diff changeset
5261 #endif
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5262 re_exec (s)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5263 const char *s;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5264 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5265 const int len = strlen (s);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5266 return
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5267 0 <= re_search (&re_comp_buf, s, len, 0, len, (struct re_registers *) 0);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5268 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5269 #endif /* _REGEX_RE_COMP */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5270
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5271 /* POSIX.2 functions. Don't define these for Emacs. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5272
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5273 #ifndef emacs
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5274
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5275 /* regcomp takes a regular expression as a string and compiles it.
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5276
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5277 PREG is a regex_t *. We do not expect any fields to be initialized,
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5278 since POSIX says we shouldn't. Thus, we set
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5279
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5280 `buffer' to the compiled pattern;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5281 `used' to the length of the compiled pattern;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5282 `syntax' to RE_SYNTAX_POSIX_EXTENDED if the
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5283 REG_EXTENDED bit in CFLAGS is set; otherwise, to
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5284 RE_SYNTAX_POSIX_BASIC;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5285 `newline_anchor' to REG_NEWLINE being set in CFLAGS;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5286 `fastmap' and `fastmap_accurate' to zero;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5287 `re_nsub' to the number of subexpressions in PATTERN.
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5288
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5289 PATTERN is the address of the pattern string.
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5290
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5291 CFLAGS is a series of bits which affect compilation.
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5292
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5293 If REG_EXTENDED is set, we use POSIX extended syntax; otherwise, we
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5294 use POSIX basic syntax.
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5295
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5296 If REG_NEWLINE is set, then . and [^...] don't match newline.
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5297 Also, regexec will try a match beginning after every newline.
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5298
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5299 If REG_ICASE is set, then we considers upper- and lowercase
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5300 versions of letters to be equivalent when matching.
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5301
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5302 If REG_NOSUB is set, then when PREG is passed to regexec, that
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5303 routine will report only success or failure, and nothing about the
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5304 registers.
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5305
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5306 It returns 0 if it succeeds, nonzero if it doesn't. (See regex.h for
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5307 the return codes and their meanings.) */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5308
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5309 int
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5310 regcomp (preg, pattern, cflags)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5311 regex_t *preg;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
5312 const char *pattern;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5313 int cflags;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5314 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5315 reg_errcode_t ret;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5316 unsigned syntax
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5317 = (cflags & REG_EXTENDED) ?
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5318 RE_SYNTAX_POSIX_EXTENDED : RE_SYNTAX_POSIX_BASIC;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5319
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5320 /* regex_compile will allocate the space for the compiled pattern. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5321 preg->buffer = 0;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5322 preg->allocated = 0;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5323 preg->used = 0;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
5324
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5325 /* Don't bother to use a fastmap when searching. This simplifies the
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5326 REG_NEWLINE case: if we used a fastmap, we'd have to put all the
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5327 characters after newlines into the fastmap. This way, we just try
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5328 every character. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5329 preg->fastmap = 0;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
5330
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5331 if (cflags & REG_ICASE)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5332 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5333 unsigned i;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
5334
13250
52e053f46f76 (TRANSLATE, PATFETCH): Cast elt of `translate'.
Richard M. Stallman <rms@gnu.org>
parents: 13100
diff changeset
5335 preg->translate
52e053f46f76 (TRANSLATE, PATFETCH): Cast elt of `translate'.
Richard M. Stallman <rms@gnu.org>
parents: 13100
diff changeset
5336 = (RE_TRANSLATE_TYPE) malloc (CHAR_SET_SIZE
52e053f46f76 (TRANSLATE, PATFETCH): Cast elt of `translate'.
Richard M. Stallman <rms@gnu.org>
parents: 13100
diff changeset
5337 * sizeof (*(RE_TRANSLATE_TYPE)0));
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5338 if (preg->translate == NULL)
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5339 return (int) REG_ESPACE;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5340
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5341 /* Map uppercase characters to corresponding lowercase ones. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5342 for (i = 0; i < CHAR_SET_SIZE; i++)
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5343 preg->translate[i] = ISUPPER (i) ? tolower (i) : i;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5344 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5345 else
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5346 preg->translate = NULL;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5347
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5348 /* If REG_NEWLINE is set, newlines are treated differently. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5349 if (cflags & REG_NEWLINE)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5350 { /* REG_NEWLINE implies neither . nor [^...] match newline. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5351 syntax &= ~RE_DOT_NEWLINE;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5352 syntax |= RE_HAT_LISTS_NOT_NEWLINE;
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5353 /* It also changes the matching behavior. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5354 preg->newline_anchor = 1;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5355 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5356 else
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5357 preg->newline_anchor = 0;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5358
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5359 preg->no_sub = !!(cflags & REG_NOSUB);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5360
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
5361 /* POSIX says a null character in the pattern terminates it, so we
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5362 can use strlen here in compiling the pattern. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5363 ret = regex_compile (pattern, strlen (pattern), syntax, preg);
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
5364
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5365 /* POSIX doesn't distinguish between an unmatched open-group and an
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5366 unmatched close-group: both are REG_EPAREN. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5367 if (ret == REG_ERPAREN) ret = REG_EPAREN;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
5368
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5369 return (int) ret;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5370 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5371
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5372
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5373 /* regexec searches for a given pattern, specified by PREG, in the
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5374 string STRING.
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
5375
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5376 If NMATCH is zero or REG_NOSUB was set in the cflags argument to
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5377 `regcomp', we ignore PMATCH. Otherwise, we assume PMATCH has at
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5378 least NMATCH elements, and we set them to the offsets of the
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5379 corresponding matched substrings.
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
5380
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5381 EFLAGS specifies `execution flags' which affect matching: if
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5382 REG_NOTBOL is set, then ^ does not match at the beginning of the
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5383 string; if REG_NOTEOL is set, then $ does not match at the end.
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
5384
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5385 We return 0 if we find a match and REG_NOMATCH if not. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5386
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5387 int
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5388 regexec (preg, string, nmatch, pmatch, eflags)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5389 const regex_t *preg;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
5390 const char *string;
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
5391 size_t nmatch;
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
5392 regmatch_t pmatch[];
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5393 int eflags;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5394 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5395 int ret;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5396 struct re_registers regs;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5397 regex_t private_preg;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5398 int len = strlen (string);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5399 boolean want_reg_info = !preg->no_sub && nmatch > 0;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5400
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5401 private_preg = *preg;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
5402
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5403 private_preg.not_bol = !!(eflags & REG_NOTBOL);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5404 private_preg.not_eol = !!(eflags & REG_NOTEOL);
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
5405
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5406 /* The user has told us exactly how many registers to return
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5407 information about, via `nmatch'. We have to pass that on to the
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5408 matching routines. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5409 private_preg.regs_allocated = REGS_FIXED;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
5410
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5411 if (want_reg_info)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5412 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5413 regs.num_regs = nmatch;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5414 regs.start = TALLOC (nmatch, regoff_t);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5415 regs.end = TALLOC (nmatch, regoff_t);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5416 if (regs.start == NULL || regs.end == NULL)
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5417 return (int) REG_NOMATCH;
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5418 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5419
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5420 /* Perform the searching operation. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5421 ret = re_search (&private_preg, string, len,
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5422 /* start: */ 0, /* range: */ len,
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5423 want_reg_info ? &regs : (struct re_registers *) 0);
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
5424
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5425 /* Copy the register information to the POSIX structure. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5426 if (want_reg_info)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5427 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5428 if (ret >= 0)
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5429 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5430 unsigned r;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5431
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5432 for (r = 0; r < nmatch; r++)
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5433 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5434 pmatch[r].rm_so = regs.start[r];
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5435 pmatch[r].rm_eo = regs.end[r];
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5436 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5437 }
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5438
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5439 /* If we needed the temporary register info, free the space now. */
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5440 free (regs.start);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5441 free (regs.end);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5442 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5443
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5444 /* We want zero return to mean success, unlike `re_search'. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5445 return ret >= 0 ? (int) REG_NOERROR : (int) REG_NOMATCH;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5446 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5447
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5448
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5449 /* Returns a message corresponding to an error code, ERRCODE, returned
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5450 from either regcomp or regexec. We don't use PREG here. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5451
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5452 size_t
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5453 regerror (errcode, preg, errbuf, errbuf_size)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5454 int errcode;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5455 const regex_t *preg;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5456 char *errbuf;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5457 size_t errbuf_size;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5458 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5459 const char *msg;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5460 size_t msg_size;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5461
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5462 if (errcode < 0
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5463 || errcode >= (sizeof (re_error_msgid) / sizeof (re_error_msgid[0])))
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
5464 /* Only error codes returned by the rest of the code should be passed
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5465 to this routine. If we are given anything else, or if other regex
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5466 code generates an invalid error code, then the program has a bug.
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5467 Dump core so we can fix it. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5468 abort ();
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5469
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5470 msg = gettext (re_error_msgid[errcode]);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5471
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5472 msg_size = strlen (msg) + 1; /* Includes the null. */
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
5473
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5474 if (errbuf_size != 0)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5475 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5476 if (msg_size > errbuf_size)
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5477 {
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5478 strncpy (errbuf, msg, errbuf_size - 1);
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5479 errbuf[errbuf_size - 1] = 0;
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5480 }
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5481 else
16010
4addc35d079b Clean up whitespace.
Richard M. Stallman <rms@gnu.org>
parents: 16009
diff changeset
5482 strcpy (errbuf, msg);
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5483 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5484
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5485 return msg_size;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5486 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5487
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5488
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5489 /* Free dynamically allocated space used by PREG. */
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5490
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5491 void
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5492 regfree (preg)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5493 regex_t *preg;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5494 {
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5495 if (preg->buffer != NULL)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5496 free (preg->buffer);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5497 preg->buffer = NULL;
13565
c66885b6330c (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 13517
diff changeset
5498
11864
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5499 preg->allocated = 0;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5500 preg->used = 0;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5501
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5502 if (preg->fastmap != NULL)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5503 free (preg->fastmap);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5504 preg->fastmap = NULL;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5505 preg->fastmap_accurate = 0;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5506
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5507 if (preg->translate != NULL)
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5508 free (preg->translate);
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5509 preg->translate = NULL;
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5510 }
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5511
620c7195b48f Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 11843
diff changeset
5512 #endif /* not emacs */