annotate regex.c @ 2345:93d6633849d6

This is a big redesign of failure-stack and register handling, prompted by bugs revealed when trying to add shy-groups. Overall, what happened is that loops are now structured a little differently, groups can be shy and the code is a little simpler. (enum re_opcode_t): Remove jump_past_alt, maybe_pop_jump, push_dummy_failure and dumy_failure_jump. Add on_failure_jump_(exclusive, loop and smart). Also fix the comment for (start|stop)_memory since they now only take one argument (the second has becomes unnecessary). (print_partial_compiled_pattern): Adjust for changes in re_opcode_t. (print_compiled_pattern): Use %ld to printf long ints and flush to make debugging a little easier. (union fail_stack_elt): Make the integer unsigned. (struct fail_stack_type): Add a `frame' element. (INIT_FAIL_STACK): Init `frame' as well. (POP_PATTERN_OP): New macro for re_compile_fastmap. (DEBUG_PUSH, DEBUG_POP): Remove. (NUM_REG_ITEMS): Remove. (NUM_NONREG_ITEMS): Adjust. (FAILURE_PAT, FAILURE_STR, NEXT_FAILURE_HANDLE, TOP_FAILURE_HANDLE): New macros for the cycle detection. (ENSURE_FAIL_STACK): New macro for PUSH_FAILURE_(REG|POINT). (PUSH_FAILURE_REG, POP_FAILURE_REG, CHECK_INFINITE_LOOP): New macros. (PUSH_FAILURE_POINT): Don't push registers any more. The pattern address pushed is not the destination of the jump but the source of it instead. (NUM_FAILURE_ITEMS): Remove. (POP_FAILURE_POINT): Adapt to the new stack structure (i.e. pop registers before the actual failure point). Don't hardcode any meaning for str==NULL anymore. (union register_info_type, REG_MATCH_NULL_STRING_P, IS_ACTIVE) (MATCHED_SOMETHING, EVER_MATCHED_SOMETHING, SET_REGS_MATCHED): Remove. (REG_UNSET_VALUE): Use NULL (why not?). (compile_range): Remove declaration since it doesn't exist. (struct compile_stack_elt_t): Remove inner_group_offset. (old_reg(start|end), reg_info, reg_dummy, reg_info_dummy): Remove. (regex_grow_registers): Remove dead code. (FIXUP_ALT_JUMP): New macro. (regex_compile): Add shy-groups Change loops to use on_failure_jump_smart&jump instead of on_failure_jump&maybe_pop_jump. Change + loops to eliminate the initial (dummy_failure_)jump. Remove c1_base (looks like unused variable to me). Use `jump' instead of `jump_past_alt' and don't bother with push_dummy_failure in alternatives since it is now unnecessary. Use FIXUP_ALT_JUMP. Eliminate a useless `#ifdef emacs' for (re)allocating the stack. (re_compile_fastmap): Remove dead variables i and num_regs. Exit from loop when bufp->can_be_null rather than jumping to `done'. Avoid jumping backwards so as to ensure termination. Use PATTERN_STACK_EMPTY and POP_PATTERN_OP. Improved handling of backreferences. Remove dead code in handling of `anychar'. (skip_noops, mutually_exclusive_p): New functions taken from the handling of `maybe_pop_jump' in re_match_2_internal. Slightly improve mutually_exclusive_p to handle ".+\n". ((lowest|highest)_active_reg, NO_(LOWEST|HIGHEST)_ACTIVE_REG) Remove. (re_match_2_internal): Use %p instead of 0x%x when printf'ing ptrs. Don't SET_REGS_MATCHED anymore. Remove many dead variables. Push register (in `start_memory') on the stack rather than storing it in old_reg(start|end). Remove the cycle detection from `stop_memory', replaced by the use of on_failure_jump_loop for greedy loops. Add code for the new on_failure_jump_<foo>. Remove ad-hoc code in `on_failure_jump' to push more registers in the case of a loop. Take out code from `maybe_pop_jump' into separate functions and adapt it to the semantics of `on_failure_jump_smart'. Remove jump_past_alt, dummy_failure_jump and push_dummy_failure. Remove dummy_failure handling and handling of `failures to jump to on_failure_jump' (this last one was already dead code, it seems). ((group|alt|common_op)_match_null_string_p): Remove.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Wed, 08 Mar 2000 23:25:41 +0000
parents 63b4d41860c8
children 5fa185a9956e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
679
b088267ea1c8 Clean up whitespace.
Richard Stallman <rms@gnu.org>
parents: 678
diff changeset
1 /* Extended regular expression matching and search library, version
b088267ea1c8 Clean up whitespace.
Richard Stallman <rms@gnu.org>
parents: 678
diff changeset
2 0.12. (Implements POSIX draft P10003.2/D11.2, except for
2
d7a0c431b2a0 Initial revision
Karl Berry <karl@freefriends.org>
parents:
diff changeset
3 internationalization features.)
d7a0c431b2a0 Initial revision
Karl Berry <karl@freefriends.org>
parents:
diff changeset
4
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5 Copyright (C) 1993,94,95,96,97,98,2000 Free Software Foundation, Inc.
2
d7a0c431b2a0 Initial revision
Karl Berry <karl@freefriends.org>
parents:
diff changeset
6
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
7 This program is free software; you can redistribute it and/or modify
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
8 it under the terms of the GNU General Public License as published by
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
9 the Free Software Foundation; either version 2, or (at your option)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
10 any later version.
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
11
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
12 This program is distributed in the hope that it will be useful,
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
15 GNU General Public License for more details.
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
16
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
17 You should have received a copy of the GNU General Public License
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
18 along with this program; if not, write to the Free Software
542
7b0868042f7a Update FSF address in comment.
Karl Heuer <kwzh@gnu.org>
parents: 521
diff changeset
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
20 USA. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
21
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
22 /* TODO:
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
23 - detect nasty infinite loops like "\\(\\)+?ab" when matching "ac".
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
24 - use `keep_string' more often than just .*\n.
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
25 - structure the opcode space into opcode+flag.
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
26 - merge with glic's regex.[ch]
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
27
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
28 That's it for now -sm */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
29
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
30 /* AIX requires this to be the first thing in the file. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
31 #if defined (_AIX) && !defined (REGEX_MALLOC)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
32 #pragma alloca
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
33 #endif
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
34
511
799190471f84 (NUM_FAILURE_ITEMS, POP_FAILURE_POINT, PUSH_FAILURE_POINT):
Richard Stallman <rms@gnu.org>
parents: 506
diff changeset
35 #undef _GNU_SOURCE
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
36 #define _GNU_SOURCE
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
37
1383
a7627de5ef66 (PTR_TO_OFFSET): Alternate definition if not `emacs'.
Richard Stallman <rms@gnu.org>
parents: 1382
diff changeset
38 #ifdef emacs
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
39 /* Converts the pointer to the char to BEG-based offset from the start. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
40 #define PTR_TO_OFFSET(d) \
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
41 POS_AS_IN_BUFFER (MATCHING_IN_FIRST_STRING \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
42 ? (d) - string1 : (d) - (string2 - size1))
1382
894acce816ca (POS_AS_IN_BUFFER): Add 1 only if operating on a buffer.
Richard Stallman <rms@gnu.org>
parents: 1381
diff changeset
43 #define POS_AS_IN_BUFFER(p) ((p) + (NILP (re_match_object) || BUFFERP (re_match_object)))
1383
a7627de5ef66 (PTR_TO_OFFSET): Alternate definition if not `emacs'.
Richard Stallman <rms@gnu.org>
parents: 1382
diff changeset
44 #else
a7627de5ef66 (PTR_TO_OFFSET): Alternate definition if not `emacs'.
Richard Stallman <rms@gnu.org>
parents: 1382
diff changeset
45 #define PTR_TO_OFFSET(d) 0
a7627de5ef66 (PTR_TO_OFFSET): Alternate definition if not `emacs'.
Richard Stallman <rms@gnu.org>
parents: 1382
diff changeset
46 #endif
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
47
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
48 #ifdef HAVE_CONFIG_H
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
49 #include <config.h>
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
50 #endif
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
51
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
52 /* We need this for `regex.h', and perhaps for the Emacs include files. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
53 #include <sys/types.h>
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
54
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
55 /* This is for other GNU distributions with internationalized messages. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
56 #if HAVE_LIBINTL_H || defined (_LIBC)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
57 # include <libintl.h>
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
58 #else
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
59 # define gettext(msgid) (msgid)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
60 #endif
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
61
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
62 #ifndef gettext_noop
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
63 /* This define is so xgettext can find the internationalizable
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
64 strings. */
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
65 #define gettext_noop(String) String
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
66 #endif
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
67
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
68 /* The `emacs' switch turns on certain matching commands
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
69 that make sense only in Emacs. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
70 #ifdef emacs
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
71
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
72 #include "lisp.h"
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
73 #include "buffer.h"
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
74
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
75 /* Make syntax table lookup grant data in gl_state. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
76 #define SYNTAX_ENTRY_VIA_PROPERTY
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
77
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
78 #include "syntax.h"
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
79 #include "charset.h"
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
80 #include "category.h"
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
81
786
c9e346539fc6 [emacs] (malloc, free): Define as xmalloc, and xfree.
Richard Stallman <rms@gnu.org>
parents: 692
diff changeset
82 #define malloc xmalloc
1326
bf0e53366c55 (realloc) <emacs>: Define to xrealloc.
Andreas Schwab <schwab@suse.de>
parents: 1321
diff changeset
83 #define realloc xrealloc
786
c9e346539fc6 [emacs] (malloc, free): Define as xmalloc, and xfree.
Richard Stallman <rms@gnu.org>
parents: 692
diff changeset
84 #define free xfree
c9e346539fc6 [emacs] (malloc, free): Define as xmalloc, and xfree.
Richard Stallman <rms@gnu.org>
parents: 692
diff changeset
85
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
86 #else /* not emacs */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
87
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
88 /* If we are not linking with Emacs proper,
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
89 we can't use the relocating allocator
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
90 even if config.h says that we can. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
91 #undef REL_ALLOC
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
92
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
93 #if defined (STDC_HEADERS) || defined (_LIBC)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
94 #include <stdlib.h>
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
95 #else
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
96 char *malloc ();
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
97 char *realloc ();
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
98 #endif
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
99
451
b08ce70c8b7c Undefined INHIBIT_STRING_HEADER when we have no
Karl Heuer <kwzh@gnu.org>
parents: 449
diff changeset
100 /* When used in Emacs's lib-src, we need to get bzero and bcopy somehow.
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
101 If nothing else has been done, use the method below. */
451
b08ce70c8b7c Undefined INHIBIT_STRING_HEADER when we have no
Karl Heuer <kwzh@gnu.org>
parents: 449
diff changeset
102 #ifdef INHIBIT_STRING_HEADER
b08ce70c8b7c Undefined INHIBIT_STRING_HEADER when we have no
Karl Heuer <kwzh@gnu.org>
parents: 449
diff changeset
103 #if !(defined (HAVE_BZERO) && defined (HAVE_BCOPY))
b08ce70c8b7c Undefined INHIBIT_STRING_HEADER when we have no
Karl Heuer <kwzh@gnu.org>
parents: 449
diff changeset
104 #if !defined (bzero) && !defined (bcopy)
b08ce70c8b7c Undefined INHIBIT_STRING_HEADER when we have no
Karl Heuer <kwzh@gnu.org>
parents: 449
diff changeset
105 #undef INHIBIT_STRING_HEADER
b08ce70c8b7c Undefined INHIBIT_STRING_HEADER when we have no
Karl Heuer <kwzh@gnu.org>
parents: 449
diff changeset
106 #endif
b08ce70c8b7c Undefined INHIBIT_STRING_HEADER when we have no
Karl Heuer <kwzh@gnu.org>
parents: 449
diff changeset
107 #endif
b08ce70c8b7c Undefined INHIBIT_STRING_HEADER when we have no
Karl Heuer <kwzh@gnu.org>
parents: 449
diff changeset
108 #endif
b08ce70c8b7c Undefined INHIBIT_STRING_HEADER when we have no
Karl Heuer <kwzh@gnu.org>
parents: 449
diff changeset
109
b08ce70c8b7c Undefined INHIBIT_STRING_HEADER when we have no
Karl Heuer <kwzh@gnu.org>
parents: 449
diff changeset
110 /* This is the normal way of making sure we have a bcopy and a bzero.
b08ce70c8b7c Undefined INHIBIT_STRING_HEADER when we have no
Karl Heuer <kwzh@gnu.org>
parents: 449
diff changeset
111 This is used in most programs--a few other programs avoid this
b08ce70c8b7c Undefined INHIBIT_STRING_HEADER when we have no
Karl Heuer <kwzh@gnu.org>
parents: 449
diff changeset
112 by defining INHIBIT_STRING_HEADER. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
113 #ifndef INHIBIT_STRING_HEADER
460
ea133fff5811 Use `defined' to test HAVE_STRING_H and STDC_HEADERS.
Richard Stallman <rms@gnu.org>
parents: 451
diff changeset
114 #if defined (HAVE_STRING_H) || defined (STDC_HEADERS) || defined (_LIBC)
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
115 #include <string.h>
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
116 #ifndef bcmp
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
117 #define bcmp(s1, s2, n) memcmp ((s1), (s2), (n))
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
118 #endif
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
119 #ifndef bcopy
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
120 #define bcopy(s, d, n) memcpy ((d), (s), (n))
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
121 #endif
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
122 #ifndef bzero
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
123 #define bzero(s, n) memset ((s), 0, (n))
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
124 #endif
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
125 #else
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
126 #include <strings.h>
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
127 #endif
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
128 #endif
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
129
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
130 /* Define the syntax stuff for \<, \>, etc. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
131
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
132 /* This must be nonzero for the wordchar and notwordchar pattern
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
133 commands in re_match_2. */
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
134 #ifndef Sword
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
135 #define Sword 1
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
136 #endif
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
137
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
138 #ifdef SWITCH_ENUM_BUG
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
139 #define SWITCH_ENUM_CAST(x) ((int)(x))
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
140 #else
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
141 #define SWITCH_ENUM_CAST(x) (x)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
142 #endif
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
143
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
144 #ifdef SYNTAX_TABLE
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
145
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
146 extern char *re_syntax_table;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
147
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
148 #else /* not SYNTAX_TABLE */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
149
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
150 /* How many characters in the character set. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
151 #define CHAR_SET_SIZE 256
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
152
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
153 static char re_syntax_table[CHAR_SET_SIZE];
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
154
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
155 static void
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
156 init_syntax_once ()
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
157 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
158 register int c;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
159 static int done = 0;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
160
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
161 if (done)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
162 return;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
163
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
164 bzero (re_syntax_table, sizeof re_syntax_table);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
165
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
166 for (c = 'a'; c <= 'z'; c++)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
167 re_syntax_table[c] = Sword;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
168
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
169 for (c = 'A'; c <= 'Z'; c++)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
170 re_syntax_table[c] = Sword;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
171
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
172 for (c = '0'; c <= '9'; c++)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
173 re_syntax_table[c] = Sword;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
174
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
175 re_syntax_table['_'] = Sword;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
176
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
177 done = 1;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
178 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
179
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
180 #endif /* not SYNTAX_TABLE */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
181
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
182 #define SYNTAX(c) re_syntax_table[c]
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
183
1296
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
184 /* Dummy macros for non-Emacs environments. */
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
185 #define BASE_LEADING_CODE_P(c) (0)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
186 #define WORD_BOUNDARY_P(c1, c2) (0)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
187 #define CHAR_HEAD_P(p) (1)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
188 #define SINGLE_BYTE_CHAR_P(c) (1)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
189 #define SAME_CHARSET_P(c1, c2) (1)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
190 #define MULTIBYTE_FORM_LENGTH(p, s) (1)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
191 #define STRING_CHAR(p, s) (*(p))
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
192 #define STRING_CHAR_AND_LENGTH(p, s, actual_len) ((actual_len) = 1, *(p))
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
193 #define GET_CHAR_AFTER_2(c, p, str1, end1, str2, end2) \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
194 (c = ((p) == (end1) ? *(str2) : *(p)))
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
195 #define GET_CHAR_BEFORE_2(c, p, str1, end1, str2, end2) \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
196 (c = ((p) == (str2) ? *((end1) - 1) : *((p) - 1)))
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
197 #endif /* not emacs */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
198
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
199 /* Get the interface, including the syntax bits. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
200 #include "regex.h"
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
201
1965
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
202 /* isalpha etc. are used for the character classes. */
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
203 #include <ctype.h>
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
204
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
205 #ifdef emacs
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
206
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
207 /* 1 if C is an ASCII character. */
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
208 #define IS_REAL_ASCII(c) ((c) < 0200)
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
209
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
210 /* 1 if C is a unibyte character. */
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
211 #define ISUNIBYTE(c) (SINGLE_BYTE_CHAR_P ((c)))
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
212
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
213 /* The Emacs definitions should not be directly affected by locales. */
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
214
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
215 /* In Emacs, these are only used for single-byte characters. */
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
216 #define ISDIGIT(c) ((c) >= '0' && (c) <= '9')
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
217 #define ISCNTRL(c) ((c) < ' ')
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
218 #define ISXDIGIT(c) (((c) >= '0' && (c) <= '9') \
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
219 || ((c) >= 'a' && (c) <= 'f') \
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
220 || ((c) >= 'A' && (c) <= 'F'))
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
221
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
222 /* This is only used for single-byte characters. */
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
223 #define ISBLANK(c) ((c) == ' ' || (c) == '\t')
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
224
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
225 /* The rest must handle multibyte characters. */
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
226
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
227 #define ISGRAPH(c) (SINGLE_BYTE_CHAR_P (c) \
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
228 ? (c) > ' ' && !((c) >= 0177 && (c) <= 0237) \
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
229 : 1)
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
230
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
231 #define ISPRINT(c) (SINGLE_BYTE_CHAR_P (c) \
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
232 ? (c) >= ' ' && !((c) >= 0177 && (c) <= 0237) \
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
233 : 1)
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
234
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
235 #define ISALNUM(c) (IS_REAL_ASCII (c) \
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
236 ? (((c) >= 'a' && (c) <= 'z') \
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
237 || ((c) >= 'A' && (c) <= 'Z') \
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
238 || ((c) >= '0' && (c) <= '9')) \
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
239 : SYNTAX (c) == Sword)
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
240
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
241 #define ISALPHA(c) (IS_REAL_ASCII (c) \
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
242 ? (((c) >= 'a' && (c) <= 'z') \
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
243 || ((c) >= 'A' && (c) <= 'Z')) \
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
244 : SYNTAX (c) == Sword)
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
245
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
246 #define ISLOWER(c) (LOWERCASEP (c))
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
247
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
248 #define ISPUNCT(c) (IS_REAL_ASCII (c) \
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
249 ? ((c) > ' ' && (c) < 0177 \
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
250 && !(((c) >= 'a' && (c) <= 'z') \
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
251 || ((c) >= 'A' && (c) <= 'Z') \
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
252 || ((c) >= '0' && (c) <= '9'))) \
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
253 : SYNTAX (c) != Sword)
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
254
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
255 #define ISSPACE(c) (SYNTAX (c) == Swhitespace)
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
256
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
257 #define ISUPPER(c) (UPPERCASEP (c))
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
258
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
259 #define ISWORD(c) (SYNTAX (c) == Sword)
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
260
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
261 #else /* not emacs */
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
262
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
263 /* Jim Meyering writes:
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
264
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
265 "... Some ctype macros are valid only for character codes that
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
266 isascii says are ASCII (SGI's IRIX-4.0.5 is one such system --when
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
267 using /bin/cc or gcc but without giving an ansi option). So, all
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
268 ctype uses should be through macros like ISPRINT... If
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
269 STDC_HEADERS is defined, then autoconf has verified that the ctype
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
270 macros don't need to be guarded with references to isascii. ...
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
271 Defining isascii to 1 should let any compiler worth its salt
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
272 eliminate the && through constant folding." */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
273
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
274 #if defined (STDC_HEADERS) || (!defined (isascii) && !defined (HAVE_ISASCII))
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
275 #define ISASCII(c) 1
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
276 #else
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
277 #define ISASCII(c) isascii(c)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
278 #endif
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
279
1965
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
280 /* 1 if C is an ASCII character. */
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
281 #define IS_REAL_ASCII(c) ((c) < 0200)
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
282
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
283 /* This distinction is not meaningful, except in Emacs. */
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
284 #define ISUNIBYTE(c) 1
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
285
1933
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
286 #define ISDIGIT(c) (ISASCII (c) && isdigit (c))
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
287 #define ISCNTRL(c) (ISASCII (c) && iscntrl (c))
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
288 #define ISXDIGIT(c) (ISASCII (c) && isxdigit (c))
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
289
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
290 #ifdef isblank
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
291 #define ISBLANK(c) (ISASCII (c) && isblank (c))
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
292 #else
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
293 #define ISBLANK(c) ((c) == ' ' || (c) == '\t')
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
294 #endif
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
295 #ifdef isgraph
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
296 #define ISGRAPH(c) (ISASCII (c) && isgraph (c))
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
297 #else
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
298 #define ISGRAPH(c) (ISASCII (c) && isprint (c) && !isspace (c))
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
299 #endif
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
300
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
301 #define ISPRINT(c) (ISASCII (c) && isprint (c))
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
302 #define ISDIGIT(c) (ISASCII (c) && isdigit (c))
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
303 #define ISALNUM(c) (ISASCII (c) && isalnum (c))
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
304 #define ISALPHA(c) (ISASCII (c) && isalpha (c))
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
305 #define ISCNTRL(c) (ISASCII (c) && iscntrl (c))
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
306 #define ISLOWER(c) (ISASCII (c) && islower (c))
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
307 #define ISPUNCT(c) (ISASCII (c) && ispunct (c))
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
308 #define ISSPACE(c) (ISASCII (c) && isspace (c))
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
309 #define ISUPPER(c) (ISASCII (c) && isupper (c))
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
310 #define ISXDIGIT(c) (ISASCII (c) && isxdigit (c))
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
311
1933
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
312 #define ISWORD(c) ISALPHA(c)
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
313
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
314 #endif /* not emacs */
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
315
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
316 #ifndef NULL
447
5607a4b33402 (NULL): Use explicit cast.
Karl Heuer <kwzh@gnu.org>
parents: 442
diff changeset
317 #define NULL (void *)0
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
318 #endif
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
319
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
320 /* We remove any previous definition of `SIGN_EXTEND_CHAR',
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
321 since ours (we hope) works properly with all combinations of
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
322 machines, compilers, `char' and `unsigned char' argument types.
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
323 (Per Bothner suggested the basic approach.) */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
324 #undef SIGN_EXTEND_CHAR
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
325 #if __STDC__
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
326 #define SIGN_EXTEND_CHAR(c) ((signed char) (c))
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
327 #else /* not __STDC__ */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
328 /* As in Harbison and Steele. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
329 #define SIGN_EXTEND_CHAR(c) ((((unsigned char) (c)) ^ 128) - 128)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
330 #endif
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
331
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
332 /* Should we use malloc or alloca? If REGEX_MALLOC is not defined, we
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
333 use `alloca' instead of `malloc'. This is because using malloc in
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
334 re_search* or re_match* could cause memory leaks when C-g is used in
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
335 Emacs; also, malloc is slower and causes storage fragmentation. On
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
336 the other hand, malloc is more portable, and easier to debug.
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
337
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
338 Because we sometimes use alloca, some routines have to be macros,
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
339 not functions -- `alloca'-allocated space disappears at the end of the
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
340 function it is called in. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
341
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
342 #ifdef REGEX_MALLOC
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
343
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
344 #define REGEX_ALLOCATE malloc
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
345 #define REGEX_REALLOCATE(source, osize, nsize) realloc (source, nsize)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
346 #define REGEX_FREE free
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
347
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
348 #else /* not REGEX_MALLOC */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
349
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
350 /* Emacs already defines alloca, sometimes. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
351 #ifndef alloca
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
352
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
353 /* Make alloca work the best possible way. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
354 #ifdef __GNUC__
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
355 #define alloca __builtin_alloca
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
356 #else /* not __GNUC__ */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
357 #if HAVE_ALLOCA_H
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
358 #include <alloca.h>
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
359 #else /* not __GNUC__ or HAVE_ALLOCA_H */
503
2ee098e3c26c Don't declare alloca.
Richard Stallman <rms@gnu.org>
parents: 501
diff changeset
360 #if 0 /* It is a bad idea to declare alloca. We always cast the result. */
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
361 #ifndef _AIX /* Already did AIX, up at the top. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
362 char *alloca ();
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
363 #endif /* not _AIX */
503
2ee098e3c26c Don't declare alloca.
Richard Stallman <rms@gnu.org>
parents: 501
diff changeset
364 #endif
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
365 #endif /* not HAVE_ALLOCA_H */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
366 #endif /* not __GNUC__ */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
367
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
368 #endif /* not alloca */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
369
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
370 #define REGEX_ALLOCATE alloca
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
371
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
372 /* Assumes a `char *destination' variable. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
373 #define REGEX_REALLOCATE(source, osize, nsize) \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
374 (destination = (char *) alloca (nsize), \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
375 bcopy (source, destination, osize), \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
376 destination)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
377
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
378 /* No need to do anything to free, after alloca. */
442
a7b85a203afa [REGEX_FREE]: Use ((void)0) instead of just (0).
Jim Meyering <jim@meyering.net>
parents: 441
diff changeset
379 #define REGEX_FREE(arg) ((void)0) /* Do nothing! But inhibit gcc warning. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
380
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
381 #endif /* not REGEX_MALLOC */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
382
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
383 /* Define how to allocate the failure stack. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
384
463
8b8df28857af Fix conditional.
Karl Heuer <kwzh@gnu.org>
parents: 462
diff changeset
385 #if defined (REL_ALLOC) && defined (REGEX_MALLOC)
462
115ffc5a3b13 Don't use relocatable allocator.
Richard Stallman <rms@gnu.org>
parents: 460
diff changeset
386
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
387 #define REGEX_ALLOCATE_STACK(size) \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
388 r_alloc (&failure_stack_ptr, (size))
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
389 #define REGEX_REALLOCATE_STACK(source, osize, nsize) \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
390 r_re_alloc (&failure_stack_ptr, (nsize))
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
391 #define REGEX_FREE_STACK(ptr) \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
392 r_alloc_free (&failure_stack_ptr)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
393
462
115ffc5a3b13 Don't use relocatable allocator.
Richard Stallman <rms@gnu.org>
parents: 460
diff changeset
394 #else /* not using relocating allocator */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
395
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
396 #ifdef REGEX_MALLOC
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
397
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
398 #define REGEX_ALLOCATE_STACK malloc
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
399 #define REGEX_REALLOCATE_STACK(source, osize, nsize) realloc (source, nsize)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
400 #define REGEX_FREE_STACK free
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
401
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
402 #else /* not REGEX_MALLOC */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
403
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
404 #define REGEX_ALLOCATE_STACK alloca
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
405
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
406 #define REGEX_REALLOCATE_STACK(source, osize, nsize) \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
407 REGEX_REALLOCATE (source, osize, nsize)
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
408 /* No need to explicitly free anything. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
409 #define REGEX_FREE_STACK(arg)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
410
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
411 #endif /* not REGEX_MALLOC */
462
115ffc5a3b13 Don't use relocatable allocator.
Richard Stallman <rms@gnu.org>
parents: 460
diff changeset
412 #endif /* not using relocating allocator */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
413
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
414
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
415 /* True if `size1' is non-NULL and PTR is pointing anywhere inside
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
416 `string1' or just past its end. This works if PTR is NULL, which is
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
417 a good thing. */
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
418 #define FIRST_STRING_P(ptr) \
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
419 (size1 && string1 <= (ptr) && (ptr) <= string1 + size1)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
420
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
421 /* (Re)Allocate N items of type T using malloc, or fail. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
422 #define TALLOC(n, t) ((t *) malloc ((n) * sizeof (t)))
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
423 #define RETALLOC(addr, n, t) ((addr) = (t *) realloc (addr, (n) * sizeof (t)))
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
424 #define RETALLOC_IF(addr, n, t) \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
425 if (addr) RETALLOC((addr), (n), t); else (addr) = TALLOC ((n), t)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
426 #define REGEX_TALLOC(n, t) ((t *) REGEX_ALLOCATE ((n) * sizeof (t)))
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
427
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
428 #define BYTEWIDTH 8 /* In bits. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
429
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
430 #define STREQ(s1, s2) ((strcmp (s1, s2) == 0))
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
431
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
432 #undef MAX
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
433 #undef MIN
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
434 #define MAX(a, b) ((a) > (b) ? (a) : (b))
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
435 #define MIN(a, b) ((a) < (b) ? (a) : (b))
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
436
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
437 typedef char boolean;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
438 #define false 0
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
439 #define true 1
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
440
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
441 static int re_match_2_internal ();
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
442
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
443 /* These are the command codes that appear in compiled regular
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
444 expressions. Some opcodes are followed by argument bytes. A
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
445 command code can specify any interpretation whatsoever for its
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
446 arguments. Zero bytes may appear in the compiled regular expression. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
447
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
448 typedef enum
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
449 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
450 no_op = 0,
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
451
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
452 /* Succeed right away--no more backtracking. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
453 succeed,
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
454
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
455 /* Followed by one byte giving n, then by n literal bytes. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
456 exactn,
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
457
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
458 /* Matches any (more or less) character. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
459 anychar,
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
460
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
461 /* Matches any one char belonging to specified set. First
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
462 following byte is number of bitmap bytes. Then come bytes
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
463 for a bitmap saying which chars are in. Bits in each byte
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
464 are ordered low-bit-first. A character is in the set if its
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
465 bit is 1. A character too large to have a bit in the map is
1933
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
466 automatically not in the set.
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
467
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
468 If the length byte has the 0x80 bit set, then that stuff
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
469 is followed by a range table:
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
470 2 bytes of flags for character sets (low 8 bits, high 8 bits)
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
471 See RANGE_TABLE_WORK_BITS below.
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
472 2 bytes, the number of pairs that follow
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
473 pairs, each 2 multibyte characters,
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
474 each multibyte character represented as 3 bytes. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
475 charset,
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
476
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
477 /* Same parameters as charset, but match any character that is
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
478 not one of those specified. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
479 charset_not,
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
480
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
481 /* Start remembering the text that is matched, for storing in a
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
482 register. Followed by one byte with the register number, in
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
483 the range 0 to one less than the pattern buffer's re_nsub
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
484 field. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
485 start_memory,
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
486
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
487 /* Stop remembering the text that is matched and store it in a
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
488 memory register. Followed by one byte with the register
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
489 number, in the range 0 to one less than `re_nsub' in the
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
490 pattern buffer. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
491 stop_memory,
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
492
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
493 /* Match a duplicate of something remembered. Followed by one
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
494 byte containing the register number. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
495 duplicate,
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
496
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
497 /* Fail unless at beginning of line. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
498 begline,
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
499
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
500 /* Fail unless at end of line. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
501 endline,
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
502
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
503 /* Succeeds if at beginning of buffer (if emacs) or at beginning
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
504 of string to be matched (if not). */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
505 begbuf,
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
506
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
507 /* Analogously, for end of buffer/string. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
508 endbuf,
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
509
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
510 /* Followed by two byte relative address to which to jump. */
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
511 jump,
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
512
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
513 /* Followed by two-byte relative address of place to resume at
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
514 in case of failure. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
515 on_failure_jump,
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
516
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
517 /* Like on_failure_jump, but pushes a placeholder instead of the
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
518 current string position when executed. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
519 on_failure_keep_string_jump,
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
520
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
521 /* Like `on_failure_jump', except that it assumes that the
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
522 pattern following it is mutually exclusive with the pattern
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
523 at the destination of the jump: if one matches something,
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
524 the other won't match at all.
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
525 Always used via `on_failure_jump_smart'. */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
526 on_failure_jump_exclusive,
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
527
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
528 /* Just like `on_failure_jump', except that it checks that we
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
529 don't get stuck in an infinite loop (matching an empty string
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
530 indefinitely). */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
531 on_failure_jump_loop,
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
532
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
533 /* A smart `on_failure_jump' used for greedy * and + operators.
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
534 It analyses the loop before which it is put and if the
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
535 loop does not require backtracking, it changes itself to
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
536 `on_failure_jump_exclusive', else it just defaults to
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
537 changing itself into `on_failure_jump_loop'. */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
538 on_failure_jump_smart,
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
539
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
540 /* Followed by two-byte relative address and two-byte number n.
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
541 After matching N times, jump to the address upon failure. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
542 succeed_n,
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
543
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
544 /* Followed by two-byte relative address, and two-byte number n.
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
545 Jump to the address N times, then fail. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
546 jump_n,
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
547
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
548 /* Set the following two-byte relative address to the
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
549 subsequent two-byte number. The address *includes* the two
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
550 bytes of number. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
551 set_number_at,
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
552
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
553 wordchar, /* Matches any word-constituent character. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
554 notwordchar, /* Matches any char that is not a word-constituent. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
555
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
556 wordbeg, /* Succeeds if at word beginning. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
557 wordend, /* Succeeds if at word end. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
558
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
559 wordbound, /* Succeeds if at a word boundary. */
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
560 notwordbound /* Succeeds if not at a word boundary. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
561
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
562 #ifdef emacs
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
563 ,before_dot, /* Succeeds if before point. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
564 at_dot, /* Succeeds if at point. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
565 after_dot, /* Succeeds if after point. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
566
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
567 /* Matches any character whose syntax is specified. Followed by
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
568 a byte which contains a syntax code, e.g., Sword. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
569 syntaxspec,
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
570
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
571 /* Matches any character whose syntax is not that specified. */
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
572 notsyntaxspec,
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
573
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
574 /* Matches any character whose category-set contains the specified
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
575 category. The operator is followed by a byte which contains a
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
576 category code (mnemonic ASCII character). */
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
577 categoryspec,
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
578
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
579 /* Matches any character whose category-set does not contain the
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
580 specified category. The operator is followed by a byte which
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
581 contains the category code (mnemonic ASCII character). */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
582 notcategoryspec
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
583 #endif /* emacs */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
584 } re_opcode_t;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
585
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
586 /* Common operations on the compiled pattern. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
587
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
588 /* Store NUMBER in two contiguous bytes starting at DESTINATION. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
589
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
590 #define STORE_NUMBER(destination, number) \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
591 do { \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
592 (destination)[0] = (number) & 0377; \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
593 (destination)[1] = (number) >> 8; \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
594 } while (0)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
595
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
596 /* Same as STORE_NUMBER, except increment DESTINATION to
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
597 the byte after where the number is stored. Therefore, DESTINATION
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
598 must be an lvalue. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
599
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
600 #define STORE_NUMBER_AND_INCR(destination, number) \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
601 do { \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
602 STORE_NUMBER (destination, number); \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
603 (destination) += 2; \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
604 } while (0)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
605
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
606 /* Put into DESTINATION a number stored in two contiguous bytes starting
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
607 at SOURCE. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
608
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
609 #define EXTRACT_NUMBER(destination, source) \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
610 do { \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
611 (destination) = *(source) & 0377; \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
612 (destination) += SIGN_EXTEND_CHAR (*((source) + 1)) << 8; \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
613 } while (0)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
614
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
615 #ifdef DEBUG
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
616 static void
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
617 extract_number (dest, source)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
618 int *dest;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
619 unsigned char *source;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
620 {
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
621 int temp = SIGN_EXTEND_CHAR (*(source + 1));
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
622 *dest = *source & 0377;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
623 *dest += temp << 8;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
624 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
625
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
626 #ifndef EXTRACT_MACROS /* To debug the macros. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
627 #undef EXTRACT_NUMBER
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
628 #define EXTRACT_NUMBER(dest, src) extract_number (&dest, src)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
629 #endif /* not EXTRACT_MACROS */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
630
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
631 #endif /* DEBUG */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
632
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
633 /* Same as EXTRACT_NUMBER, except increment SOURCE to after the number.
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
634 SOURCE must be an lvalue. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
635
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
636 #define EXTRACT_NUMBER_AND_INCR(destination, source) \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
637 do { \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
638 EXTRACT_NUMBER (destination, source); \
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
639 (source) += 2; \
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
640 } while (0)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
641
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
642 #ifdef DEBUG
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
643 static void
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
644 extract_number_and_incr (destination, source)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
645 int *destination;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
646 unsigned char **source;
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
647 {
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
648 extract_number (destination, *source);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
649 *source += 2;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
650 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
651
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
652 #ifndef EXTRACT_MACROS
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
653 #undef EXTRACT_NUMBER_AND_INCR
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
654 #define EXTRACT_NUMBER_AND_INCR(dest, src) \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
655 extract_number_and_incr (&dest, &src)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
656 #endif /* not EXTRACT_MACROS */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
657
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
658 #endif /* DEBUG */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
659
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
660 /* Store a multibyte character in three contiguous bytes starting
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
661 DESTINATION, and increment DESTINATION to the byte after where the
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
662 character is stored. Therefore, DESTINATION must be an lvalue. */
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
663
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
664 #define STORE_CHARACTER_AND_INCR(destination, character) \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
665 do { \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
666 (destination)[0] = (character) & 0377; \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
667 (destination)[1] = ((character) >> 8) & 0377; \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
668 (destination)[2] = (character) >> 16; \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
669 (destination) += 3; \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
670 } while (0)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
671
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
672 /* Put into DESTINATION a character stored in three contiguous bytes
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
673 starting at SOURCE. */
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
674
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
675 #define EXTRACT_CHARACTER(destination, source) \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
676 do { \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
677 (destination) = ((source)[0] \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
678 | ((source)[1] << 8) \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
679 | ((source)[2] << 16)); \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
680 } while (0)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
681
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
682
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
683 /* Macros for charset. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
684
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
685 /* Size of bitmap of charset P in bytes. P is a start of charset,
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
686 i.e. *P is (re_opcode_t) charset or (re_opcode_t) charset_not. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
687 #define CHARSET_BITMAP_SIZE(p) ((p)[1] & 0x7F)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
688
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
689 /* Nonzero if charset P has range table. */
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
690 #define CHARSET_RANGE_TABLE_EXISTS_P(p) ((p)[1] & 0x80)
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
691
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
692 /* Return the address of range table of charset P. But not the start
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
693 of table itself, but the before where the number of ranges is
1933
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
694 stored. `2 +' means to skip re_opcode_t and size of bitmap,
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
695 and the 2 bytes of flags at the start of the range table. */
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
696 #define CHARSET_RANGE_TABLE(p) (&(p)[4 + CHARSET_BITMAP_SIZE (p)])
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
697
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
698 /* Extract the bit flags that start a range table. */
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
699 #define CHARSET_RANGE_TABLE_BITS(p) \
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
700 ((p)[2 + CHARSET_BITMAP_SIZE (p)] \
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
701 + (p)[3 + CHARSET_BITMAP_SIZE (p)] * 0x100)
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
702
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
703 /* Test if C is listed in the bitmap of charset P. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
704 #define CHARSET_LOOKUP_BITMAP(p, c) \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
705 ((c) < CHARSET_BITMAP_SIZE (p) * BYTEWIDTH \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
706 && (p)[2 + (c) / BYTEWIDTH] & (1 << ((c) % BYTEWIDTH)))
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
707
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
708 /* Return the address of end of RANGE_TABLE. COUNT is number of
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
709 ranges (which is a pair of (start, end)) in the RANGE_TABLE. `* 2'
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
710 is start of range and end of range. `* 3' is size of each start
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
711 and end. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
712 #define CHARSET_RANGE_TABLE_END(range_table, count) \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
713 ((range_table) + (count) * 2 * 3)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
714
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
715 /* Test if C is in RANGE_TABLE. A flag NOT is negated if C is in.
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
716 COUNT is number of ranges in RANGE_TABLE. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
717 #define CHARSET_LOOKUP_RANGE_TABLE_RAW(not, c, range_table, count) \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
718 do \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
719 { \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
720 int range_start, range_end; \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
721 unsigned char *p; \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
722 unsigned char *range_table_end \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
723 = CHARSET_RANGE_TABLE_END ((range_table), (count)); \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
724 \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
725 for (p = (range_table); p < range_table_end; p += 2 * 3) \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
726 { \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
727 EXTRACT_CHARACTER (range_start, p); \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
728 EXTRACT_CHARACTER (range_end, p + 3); \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
729 \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
730 if (range_start <= (c) && (c) <= range_end) \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
731 { \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
732 (not) = !(not); \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
733 break; \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
734 } \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
735 } \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
736 } \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
737 while (0)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
738
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
739 /* Test if C is in range table of CHARSET. The flag NOT is negated if
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
740 C is listed in it. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
741 #define CHARSET_LOOKUP_RANGE_TABLE(not, c, charset) \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
742 do \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
743 { \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
744 /* Number of ranges in range table. */ \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
745 int count; \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
746 unsigned char *range_table = CHARSET_RANGE_TABLE (charset); \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
747 \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
748 EXTRACT_NUMBER_AND_INCR (count, range_table); \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
749 CHARSET_LOOKUP_RANGE_TABLE_RAW ((not), (c), range_table, count); \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
750 } \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
751 while (0)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
752
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
753 /* If DEBUG is defined, Regex prints many voluminous messages about what
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
754 it is doing (if the variable `debug' is nonzero). If linked with the
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
755 main program in `iregex.c', you can enter patterns and strings
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
756 interactively. And if linked with the main program in `main.c' and
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
757 the other test files, you can run the already-written tests. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
758
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
759 #ifdef DEBUG
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
760
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
761 /* We use standard I/O for debugging. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
762 #include <stdio.h>
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
763
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
764 /* It is useful to test things that ``must'' be true when debugging. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
765 #include <assert.h>
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
766
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
767 static int debug = 0;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
768
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
769 #define DEBUG_STATEMENT(e) e
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
770 #define DEBUG_PRINT1(x) if (debug) printf (x)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
771 #define DEBUG_PRINT2(x1, x2) if (debug) printf (x1, x2)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
772 #define DEBUG_PRINT3(x1, x2, x3) if (debug) printf (x1, x2, x3)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
773 #define DEBUG_PRINT4(x1, x2, x3, x4) if (debug) printf (x1, x2, x3, x4)
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
774 #define DEBUG_PRINT_COMPILED_PATTERN(p, s, e) \
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
775 if (debug) print_partial_compiled_pattern (s, e)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
776 #define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2) \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
777 if (debug) print_double_string (w, s1, sz1, s2, sz2)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
778
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
779
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
780 /* Print the fastmap in human-readable form. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
781
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
782 void
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
783 print_fastmap (fastmap)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
784 char *fastmap;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
785 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
786 unsigned was_a_range = 0;
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
787 unsigned i = 0;
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
788
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
789 while (i < (1 << BYTEWIDTH))
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
790 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
791 if (fastmap[i++])
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
792 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
793 was_a_range = 0;
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
794 putchar (i - 1);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
795 while (i < (1 << BYTEWIDTH) && fastmap[i])
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
796 {
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
797 was_a_range = 1;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
798 i++;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
799 }
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
800 if (was_a_range)
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
801 {
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
802 printf ("-");
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
803 putchar (i - 1);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
804 }
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
805 }
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
806 }
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
807 putchar ('\n');
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
808 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
809
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
810
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
811 /* Print a compiled pattern string in human-readable form, starting at
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
812 the START pointer into it and ending just before the pointer END. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
813
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
814 void
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
815 print_partial_compiled_pattern (start, end)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
816 unsigned char *start;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
817 unsigned char *end;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
818 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
819 int mcnt, mcnt2;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
820 unsigned char *p = start;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
821 unsigned char *pend = end;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
822
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
823 if (start == NULL)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
824 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
825 printf ("(null)\n");
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
826 return;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
827 }
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
828
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
829 /* Loop over pattern commands. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
830 while (p < pend)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
831 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
832 printf ("%d:\t", p - start);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
833
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
834 switch ((re_opcode_t) *p++)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
835 {
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
836 case no_op:
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
837 printf ("/no_op");
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
838 break;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
839
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
840 case exactn:
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
841 mcnt = *p++;
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
842 printf ("/exactn/%d", mcnt);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
843 do
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
844 {
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
845 putchar ('/');
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
846 putchar (*p++);
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
847 }
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
848 while (--mcnt);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
849 break;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
850
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
851 case start_memory:
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
852 printf ("/start_memory/%d", *p++);
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
853 break;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
854
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
855 case stop_memory:
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
856 printf ("/stop_memory/%d", *p++);
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
857 break;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
858
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
859 case duplicate:
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
860 printf ("/duplicate/%d", *p++);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
861 break;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
862
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
863 case anychar:
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
864 printf ("/anychar");
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
865 break;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
866
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
867 case charset:
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
868 case charset_not:
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
869 {
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
870 register int c, last = -100;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
871 register int in_range = 0;
1933
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
872 int length = *p & 0x7f;
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
873 int has_range_table = *p & 0x80;
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
874 int range_length = p[length + 2] + p[length + 3] * 0x100;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
875
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
876 printf ("/charset [%s",
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
877 (re_opcode_t) *(p - 1) == charset_not ? "^" : "");
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
878
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
879 assert (p + *p < pend);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
880
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
881 for (c = 0; c < 256; c++)
1933
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
882 if (c / 8 < length
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
883 && (p[1 + (c/8)] & (1 << (c % 8))))
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
884 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
885 /* Are we starting a range? */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
886 if (last + 1 == c && ! in_range)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
887 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
888 putchar ('-');
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
889 in_range = 1;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
890 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
891 /* Have we broken a range? */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
892 else if (last + 1 != c && in_range)
1933
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
893 {
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
894 putchar (last);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
895 in_range = 0;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
896 }
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
897
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
898 if (! in_range)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
899 putchar (c);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
900
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
901 last = c;
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
902 }
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
903
1933
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
904 p += 1 + length;
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
905
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
906 if (in_range)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
907 putchar (last);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
908
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
909 putchar (']');
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
910
1933
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
911 if (has_range_table)
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
912 printf ("has-range-table");
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
913
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
914 /* ??? Should print the range table; for now,
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
915 just skip it. */
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
916 if (has_range_table)
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
917 p += 4 + 6 * range_length;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
918 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
919 break;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
920
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
921 case begline:
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
922 printf ("/begline");
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
923 break;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
924
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
925 case endline:
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
926 printf ("/endline");
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
927 break;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
928
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
929 case on_failure_jump:
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
930 extract_number_and_incr (&mcnt, &p);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
931 printf ("/on_failure_jump to %d", p + mcnt - start);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
932 break;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
933
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
934 case on_failure_keep_string_jump:
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
935 extract_number_and_incr (&mcnt, &p);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
936 printf ("/on_failure_keep_string_jump to %d", p + mcnt - start);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
937 break;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
938
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
939 case on_failure_jump_exclusive:
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
940 extract_number_and_incr (&mcnt, &p);
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
941 printf ("/on_failure_jump_exclusive to %d", p + mcnt - start);
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
942 break;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
943
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
944 case on_failure_jump_loop:
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
945 extract_number_and_incr (&mcnt, &p);
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
946 printf ("/on_failure_jump_loop to %d", p + mcnt - start);
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
947 break;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
948
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
949 case on_failure_jump_smart:
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
950 extract_number_and_incr (&mcnt, &p);
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
951 printf ("/on_failure_jump_smart to %d", p + mcnt - start);
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
952 break;
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
953
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
954 case jump:
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
955 extract_number_and_incr (&mcnt, &p);
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
956 printf ("/jump to %d", p + mcnt - start);
679
b088267ea1c8 Clean up whitespace.
Richard Stallman <rms@gnu.org>
parents: 678
diff changeset
957 break;
b088267ea1c8 Clean up whitespace.
Richard Stallman <rms@gnu.org>
parents: 678
diff changeset
958
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
959 case succeed_n:
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
960 extract_number_and_incr (&mcnt, &p);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
961 extract_number_and_incr (&mcnt2, &p);
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
962 printf ("/succeed_n to %d, %d times", p + mcnt - start, mcnt2);
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
963 break;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
964
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
965 case jump_n:
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
966 extract_number_and_incr (&mcnt, &p);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
967 extract_number_and_incr (&mcnt2, &p);
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
968 printf ("/jump_n to %d, %d times", p + mcnt - start, mcnt2);
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
969 break;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
970
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
971 case set_number_at:
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
972 extract_number_and_incr (&mcnt, &p);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
973 extract_number_and_incr (&mcnt2, &p);
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
974 printf ("/set_number_at location %d to %d", p + mcnt - start, mcnt2);
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
975 break;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
976
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
977 case wordbound:
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
978 printf ("/wordbound");
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
979 break;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
980
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
981 case notwordbound:
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
982 printf ("/notwordbound");
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
983 break;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
984
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
985 case wordbeg:
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
986 printf ("/wordbeg");
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
987 break;
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
988
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
989 case wordend:
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
990 printf ("/wordend");
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
991
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
992 #ifdef emacs
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
993 case before_dot:
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
994 printf ("/before_dot");
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
995 break;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
996
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
997 case at_dot:
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
998 printf ("/at_dot");
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
999 break;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1000
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1001 case after_dot:
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1002 printf ("/after_dot");
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1003 break;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1004
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1005 case syntaxspec:
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1006 printf ("/syntaxspec");
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1007 mcnt = *p++;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1008 printf ("/%d", mcnt);
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1009 break;
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
1010
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1011 case notsyntaxspec:
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1012 printf ("/notsyntaxspec");
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1013 mcnt = *p++;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1014 printf ("/%d", mcnt);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1015 break;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1016 #endif /* emacs */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1017
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1018 case wordchar:
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1019 printf ("/wordchar");
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1020 break;
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
1021
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1022 case notwordchar:
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1023 printf ("/notwordchar");
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1024 break;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1025
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1026 case begbuf:
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1027 printf ("/begbuf");
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1028 break;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1029
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1030 case endbuf:
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1031 printf ("/endbuf");
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1032 break;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1033
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1034 default:
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1035 printf ("?%d", *(p-1));
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1036 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1037
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1038 putchar ('\n');
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1039 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1040
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1041 printf ("%d:\tend of pattern.\n", p - start);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1042 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1043
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1044
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1045 void
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1046 print_compiled_pattern (bufp)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1047 struct re_pattern_buffer *bufp;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1048 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1049 unsigned char *buffer = bufp->buffer;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1050
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1051 print_partial_compiled_pattern (buffer, buffer + bufp->used);
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1052 printf ("%ld bytes used/%ld bytes allocated.\n", bufp->used, bufp->allocated);
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1053
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1054 if (bufp->fastmap_accurate && bufp->fastmap)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1055 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1056 printf ("fastmap: ");
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1057 print_fastmap (bufp->fastmap);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1058 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1059
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1060 printf ("re_nsub: %d\t", bufp->re_nsub);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1061 printf ("regs_alloc: %d\t", bufp->regs_allocated);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1062 printf ("can_be_null: %d\t", bufp->can_be_null);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1063 printf ("newline_anchor: %d\n", bufp->newline_anchor);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1064 printf ("no_sub: %d\t", bufp->no_sub);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1065 printf ("not_bol: %d\t", bufp->not_bol);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1066 printf ("not_eol: %d\t", bufp->not_eol);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1067 printf ("syntax: %d\n", bufp->syntax);
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1068 fflush (stdout);
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1069 /* Perhaps we should print the translate table? */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1070 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1071
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1072
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1073 void
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1074 print_double_string (where, string1, size1, string2, size2)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1075 const char *where;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1076 const char *string1;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1077 const char *string2;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1078 int size1;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1079 int size2;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1080 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1081 unsigned this_char;
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
1082
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1083 if (where == NULL)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1084 printf ("(null)");
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1085 else
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1086 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1087 if (FIRST_STRING_P (where))
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1088 {
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1089 for (this_char = where - string1; this_char < size1; this_char++)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1090 putchar (string1[this_char]);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1091
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1092 where = string2;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1093 }
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1094
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1095 for (this_char = where - string2; this_char < size2; this_char++)
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1096 putchar (string2[this_char]);
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1097 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1098 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1099
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1100 #else /* not DEBUG */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1101
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1102 #undef assert
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1103 #define assert(e)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1104
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1105 #define DEBUG_STATEMENT(e)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1106 #define DEBUG_PRINT1(x)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1107 #define DEBUG_PRINT2(x1, x2)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1108 #define DEBUG_PRINT3(x1, x2, x3)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1109 #define DEBUG_PRINT4(x1, x2, x3, x4)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1110 #define DEBUG_PRINT_COMPILED_PATTERN(p, s, e)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1111 #define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1112
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1113 #endif /* not DEBUG */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1114
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1115 /* Set by `re_set_syntax' to the current regexp syntax to recognize. Can
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1116 also be assigned to arbitrarily: each pattern buffer stores its own
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1117 syntax, so it can be changed between regex compilations. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1118 /* This has no initializer because initialized variables in Emacs
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1119 become read-only after dumping. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1120 reg_syntax_t re_syntax_options;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1121
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1122
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1123 /* Specify the precise syntax of regexps for compilation. This provides
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1124 for compatibility for various utilities which historically have
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1125 different, incompatible syntaxes.
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1126
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1127 The argument SYNTAX is a bit mask comprised of the various bits
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1128 defined in regex.h. We return the old syntax. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1129
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1130 reg_syntax_t
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1131 re_set_syntax (syntax)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1132 reg_syntax_t syntax;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1133 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1134 reg_syntax_t ret = re_syntax_options;
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
1135
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1136 re_syntax_options = syntax;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1137 return ret;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1138 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1139
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1140 /* This table gives an error message for each of the error codes listed
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1141 in regex.h. Obviously the order here has to be same as there.
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1142 POSIX doesn't require that we do anything for REG_NOERROR,
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1143 but why not be nice? */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1144
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1145 static const char *re_error_msgid[] =
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
1146 {
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
1147 gettext_noop ("Success"), /* REG_NOERROR */
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
1148 gettext_noop ("No match"), /* REG_NOMATCH */
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
1149 gettext_noop ("Invalid regular expression"), /* REG_BADPAT */
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
1150 gettext_noop ("Invalid collation character"), /* REG_ECOLLATE */
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
1151 gettext_noop ("Invalid character class name"), /* REG_ECTYPE */
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
1152 gettext_noop ("Trailing backslash"), /* REG_EESCAPE */
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
1153 gettext_noop ("Invalid back reference"), /* REG_ESUBREG */
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
1154 gettext_noop ("Unmatched [ or [^"), /* REG_EBRACK */
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
1155 gettext_noop ("Unmatched ( or \\("), /* REG_EPAREN */
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
1156 gettext_noop ("Unmatched \\{"), /* REG_EBRACE */
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
1157 gettext_noop ("Invalid content of \\{\\}"), /* REG_BADBR */
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
1158 gettext_noop ("Invalid range end"), /* REG_ERANGE */
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
1159 gettext_noop ("Memory exhausted"), /* REG_ESPACE */
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
1160 gettext_noop ("Invalid preceding regular expression"), /* REG_BADRPT */
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
1161 gettext_noop ("Premature end of regular expression"), /* REG_EEND */
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
1162 gettext_noop ("Regular expression too big"), /* REG_ESIZE */
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
1163 gettext_noop ("Unmatched ) or \\)"), /* REG_ERPAREN */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1164 };
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1165
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1166 /* Avoiding alloca during matching, to placate r_alloc. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1167
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1168 /* Define MATCH_MAY_ALLOCATE unless we need to make sure that the
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1169 searching and matching functions should not call alloca. On some
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1170 systems, alloca is implemented in terms of malloc, and if we're
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1171 using the relocating allocator routines, then malloc could cause a
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1172 relocation, which might (if the strings being searched are in the
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1173 ralloc heap) shift the data out from underneath the regexp
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1174 routines.
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1175
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
1176 Here's another reason to avoid allocation: Emacs
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1177 processes input from X in a signal handler; processing X input may
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1178 call malloc; if input arrives while a matching routine is calling
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1179 malloc, then we're scrod. But Emacs can't just block input while
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1180 calling matching routines; then we don't notice interrupts when
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1181 they come in. So, Emacs blocks input around all regexp calls
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1182 except the matching calls, which it leaves unprotected, in the
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1183 faith that they will not malloc. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1184
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1185 /* Normally, this is fine. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1186 #define MATCH_MAY_ALLOCATE
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1187
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1188 /* When using GNU C, we are not REALLY using the C alloca, no matter
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1189 what config.h may say. So don't take precautions for it. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1190 #ifdef __GNUC__
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1191 #undef C_ALLOCA
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1192 #endif
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1193
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1194 /* The match routines may not allocate if (1) they would do it with malloc
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1195 and (2) it's not safe for them to use malloc.
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1196 Note that if REL_ALLOC is defined, matching would not use malloc for the
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1197 failure stack, but we would still use it for the register vectors;
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1198 so REL_ALLOC should not affect this. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1199 #if (defined (C_ALLOCA) || defined (REGEX_MALLOC)) && defined (emacs)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1200 #undef MATCH_MAY_ALLOCATE
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1201 #endif
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1202
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1203
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1204 /* Failure stack declarations and macros; both re_compile_fastmap and
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1205 re_match_2 use a failure stack. These have to be macros because of
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1206 REGEX_ALLOCATE_STACK. */
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
1207
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1208
1156
8e1cbb305ddc (TYPICAL_FAILURE_SIZE): Renamed from MAX_FAILURE_ITEMS.
Karl Heuer <kwzh@gnu.org>
parents: 992
diff changeset
1209 /* Approximate number of failure points for which to initially allocate space
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1210 when matching. If this number is exceeded, we allocate more
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1211 space, so it is not a hard limit. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1212 #ifndef INIT_FAILURE_ALLOC
1156
8e1cbb305ddc (TYPICAL_FAILURE_SIZE): Renamed from MAX_FAILURE_ITEMS.
Karl Heuer <kwzh@gnu.org>
parents: 992
diff changeset
1213 #define INIT_FAILURE_ALLOC 20
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1214 #endif
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1215
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1216 /* Roughly the maximum number of failure points on the stack. Would be
1156
8e1cbb305ddc (TYPICAL_FAILURE_SIZE): Renamed from MAX_FAILURE_ITEMS.
Karl Heuer <kwzh@gnu.org>
parents: 992
diff changeset
1217 exactly that if always used TYPICAL_FAILURE_SIZE items each time we failed.
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1218 This is a variable only so users of regex can assign to it; we never
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1219 change it ourselves. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1220 #if defined (MATCH_MAY_ALLOCATE)
1156
8e1cbb305ddc (TYPICAL_FAILURE_SIZE): Renamed from MAX_FAILURE_ITEMS.
Karl Heuer <kwzh@gnu.org>
parents: 992
diff changeset
1221 /* Note that 4400 is enough to cause a crash on Alpha OSF/1,
8e1cbb305ddc (TYPICAL_FAILURE_SIZE): Renamed from MAX_FAILURE_ITEMS.
Karl Heuer <kwzh@gnu.org>
parents: 992
diff changeset
1222 whose default stack limit is 2mb. In order for a larger
8e1cbb305ddc (TYPICAL_FAILURE_SIZE): Renamed from MAX_FAILURE_ITEMS.
Karl Heuer <kwzh@gnu.org>
parents: 992
diff changeset
1223 value to work reliably, you have to try to make it accord
8e1cbb305ddc (TYPICAL_FAILURE_SIZE): Renamed from MAX_FAILURE_ITEMS.
Karl Heuer <kwzh@gnu.org>
parents: 992
diff changeset
1224 with the process stack limit. */
8e1cbb305ddc (TYPICAL_FAILURE_SIZE): Renamed from MAX_FAILURE_ITEMS.
Karl Heuer <kwzh@gnu.org>
parents: 992
diff changeset
1225 int re_max_failures = 40000;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1226 #else
1156
8e1cbb305ddc (TYPICAL_FAILURE_SIZE): Renamed from MAX_FAILURE_ITEMS.
Karl Heuer <kwzh@gnu.org>
parents: 992
diff changeset
1227 int re_max_failures = 4000;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1228 #endif
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1229
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1230 union fail_stack_elt
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1231 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1232 unsigned char *pointer;
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1233 unsigned int integer;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1234 };
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1235
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1236 typedef union fail_stack_elt fail_stack_elt_t;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1237
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1238 typedef struct
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1239 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1240 fail_stack_elt_t *stack;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1241 unsigned size;
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1242 unsigned avail; /* Offset of next open position. */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1243 unsigned frame; /* Offset of the cur constructed frame. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1244 } fail_stack_type;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1245
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1246 #define PATTERN_STACK_EMPTY() (fail_stack.avail == 0)
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1247 #define FAIL_STACK_EMPTY() (fail_stack.frame == 0)
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1248 #define FAIL_STACK_FULL() (fail_stack.avail == fail_stack.size)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1249
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1250
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1251 /* Define macros to initialize and free the failure stack.
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1252 Do `return -2' if the alloc fails. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1253
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1254 #ifdef MATCH_MAY_ALLOCATE
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1255 #define INIT_FAIL_STACK() \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1256 do { \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1257 fail_stack.stack = (fail_stack_elt_t *) \
1156
8e1cbb305ddc (TYPICAL_FAILURE_SIZE): Renamed from MAX_FAILURE_ITEMS.
Karl Heuer <kwzh@gnu.org>
parents: 992
diff changeset
1258 REGEX_ALLOCATE_STACK (INIT_FAILURE_ALLOC * TYPICAL_FAILURE_SIZE \
8e1cbb305ddc (TYPICAL_FAILURE_SIZE): Renamed from MAX_FAILURE_ITEMS.
Karl Heuer <kwzh@gnu.org>
parents: 992
diff changeset
1259 * sizeof (fail_stack_elt_t)); \
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1260 \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1261 if (fail_stack.stack == NULL) \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1262 return -2; \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1263 \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1264 fail_stack.size = INIT_FAILURE_ALLOC; \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1265 fail_stack.avail = 0; \
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1266 fail_stack.frame = 0; \
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1267 } while (0)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1268
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1269 #define RESET_FAIL_STACK() REGEX_FREE_STACK (fail_stack.stack)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1270 #else
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1271 #define INIT_FAIL_STACK() \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1272 do { \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1273 fail_stack.avail = 0; \
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1274 fail_stack.frame = 0; \
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1275 } while (0)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1276
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1277 #define RESET_FAIL_STACK()
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1278 #endif
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1279
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1280
1156
8e1cbb305ddc (TYPICAL_FAILURE_SIZE): Renamed from MAX_FAILURE_ITEMS.
Karl Heuer <kwzh@gnu.org>
parents: 992
diff changeset
1281 /* Double the size of FAIL_STACK, up to a limit
8e1cbb305ddc (TYPICAL_FAILURE_SIZE): Renamed from MAX_FAILURE_ITEMS.
Karl Heuer <kwzh@gnu.org>
parents: 992
diff changeset
1282 which allows approximately `re_max_failures' items.
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1283
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1284 Return 1 if succeeds, and 0 if either ran out of memory
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
1285 allocating space for it or it was already too large.
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
1286
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1287 REGEX_REALLOCATE_STACK requires `destination' be declared. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1288
1156
8e1cbb305ddc (TYPICAL_FAILURE_SIZE): Renamed from MAX_FAILURE_ITEMS.
Karl Heuer <kwzh@gnu.org>
parents: 992
diff changeset
1289 /* Factor to increase the failure stack size by
8e1cbb305ddc (TYPICAL_FAILURE_SIZE): Renamed from MAX_FAILURE_ITEMS.
Karl Heuer <kwzh@gnu.org>
parents: 992
diff changeset
1290 when we increase it.
8e1cbb305ddc (TYPICAL_FAILURE_SIZE): Renamed from MAX_FAILURE_ITEMS.
Karl Heuer <kwzh@gnu.org>
parents: 992
diff changeset
1291 This used to be 2, but 2 was too wasteful
8e1cbb305ddc (TYPICAL_FAILURE_SIZE): Renamed from MAX_FAILURE_ITEMS.
Karl Heuer <kwzh@gnu.org>
parents: 992
diff changeset
1292 because the old discarded stacks added up to as much space
8e1cbb305ddc (TYPICAL_FAILURE_SIZE): Renamed from MAX_FAILURE_ITEMS.
Karl Heuer <kwzh@gnu.org>
parents: 992
diff changeset
1293 were as ultimate, maximum-size stack. */
8e1cbb305ddc (TYPICAL_FAILURE_SIZE): Renamed from MAX_FAILURE_ITEMS.
Karl Heuer <kwzh@gnu.org>
parents: 992
diff changeset
1294 #define FAIL_STACK_GROWTH_FACTOR 4
8e1cbb305ddc (TYPICAL_FAILURE_SIZE): Renamed from MAX_FAILURE_ITEMS.
Karl Heuer <kwzh@gnu.org>
parents: 992
diff changeset
1295
8e1cbb305ddc (TYPICAL_FAILURE_SIZE): Renamed from MAX_FAILURE_ITEMS.
Karl Heuer <kwzh@gnu.org>
parents: 992
diff changeset
1296 #define GROW_FAIL_STACK(fail_stack) \
1158
282562802f46 (GROW_FAIL_STACK): Fix test for stack size at max.
Karl Heuer <kwzh@gnu.org>
parents: 1157
diff changeset
1297 (((fail_stack).size * sizeof (fail_stack_elt_t) \
282562802f46 (GROW_FAIL_STACK): Fix test for stack size at max.
Karl Heuer <kwzh@gnu.org>
parents: 1157
diff changeset
1298 >= re_max_failures * TYPICAL_FAILURE_SIZE) \
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1299 ? 0 \
1156
8e1cbb305ddc (TYPICAL_FAILURE_SIZE): Renamed from MAX_FAILURE_ITEMS.
Karl Heuer <kwzh@gnu.org>
parents: 992
diff changeset
1300 : ((fail_stack).stack \
8e1cbb305ddc (TYPICAL_FAILURE_SIZE): Renamed from MAX_FAILURE_ITEMS.
Karl Heuer <kwzh@gnu.org>
parents: 992
diff changeset
1301 = (fail_stack_elt_t *) \
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1302 REGEX_REALLOCATE_STACK ((fail_stack).stack, \
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1303 (fail_stack).size * sizeof (fail_stack_elt_t), \
1156
8e1cbb305ddc (TYPICAL_FAILURE_SIZE): Renamed from MAX_FAILURE_ITEMS.
Karl Heuer <kwzh@gnu.org>
parents: 992
diff changeset
1304 MIN (re_max_failures * TYPICAL_FAILURE_SIZE, \
8e1cbb305ddc (TYPICAL_FAILURE_SIZE): Renamed from MAX_FAILURE_ITEMS.
Karl Heuer <kwzh@gnu.org>
parents: 992
diff changeset
1305 ((fail_stack).size * sizeof (fail_stack_elt_t) \
8e1cbb305ddc (TYPICAL_FAILURE_SIZE): Renamed from MAX_FAILURE_ITEMS.
Karl Heuer <kwzh@gnu.org>
parents: 992
diff changeset
1306 * FAIL_STACK_GROWTH_FACTOR))), \
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1307 \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1308 (fail_stack).stack == NULL \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1309 ? 0 \
1157
5aa89bba935d (GROW_FAIL_STACK): Fix previous change:
Karl Heuer <kwzh@gnu.org>
parents: 1156
diff changeset
1310 : ((fail_stack).size \
5aa89bba935d (GROW_FAIL_STACK): Fix previous change:
Karl Heuer <kwzh@gnu.org>
parents: 1156
diff changeset
1311 = (MIN (re_max_failures * TYPICAL_FAILURE_SIZE, \
5aa89bba935d (GROW_FAIL_STACK): Fix previous change:
Karl Heuer <kwzh@gnu.org>
parents: 1156
diff changeset
1312 ((fail_stack).size * sizeof (fail_stack_elt_t) \
5aa89bba935d (GROW_FAIL_STACK): Fix previous change:
Karl Heuer <kwzh@gnu.org>
parents: 1156
diff changeset
1313 * FAIL_STACK_GROWTH_FACTOR)) \
5aa89bba935d (GROW_FAIL_STACK): Fix previous change:
Karl Heuer <kwzh@gnu.org>
parents: 1156
diff changeset
1314 / sizeof (fail_stack_elt_t)), \
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1315 1)))
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1316
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1317
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
1318 /* Push pointer POINTER on FAIL_STACK.
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1319 Return 1 if was able to do so and 0 if ran out of memory allocating
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1320 space to do so. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1321 #define PUSH_PATTERN_OP(POINTER, FAIL_STACK) \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1322 ((FAIL_STACK_FULL () \
1156
8e1cbb305ddc (TYPICAL_FAILURE_SIZE): Renamed from MAX_FAILURE_ITEMS.
Karl Heuer <kwzh@gnu.org>
parents: 992
diff changeset
1323 && !GROW_FAIL_STACK (FAIL_STACK)) \
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1324 ? 0 \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1325 : ((FAIL_STACK).stack[(FAIL_STACK).avail++].pointer = POINTER, \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1326 1))
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1327 #define POP_PATTERN_OP() POP_FAILURE_POINTER ()
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1328
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1329 /* Push a pointer value onto the failure stack.
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1330 Assumes the variable `fail_stack'. Probably should only
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1331 be called from within `PUSH_FAILURE_POINT'. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1332 #define PUSH_FAILURE_POINTER(item) \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1333 fail_stack.stack[fail_stack.avail++].pointer = (unsigned char *) (item)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1334
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1335 /* This pushes an integer-valued item onto the failure stack.
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1336 Assumes the variable `fail_stack'. Probably should only
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1337 be called from within `PUSH_FAILURE_POINT'. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1338 #define PUSH_FAILURE_INT(item) \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1339 fail_stack.stack[fail_stack.avail++].integer = (item)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1340
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1341 /* Push a fail_stack_elt_t value onto the failure stack.
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1342 Assumes the variable `fail_stack'. Probably should only
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1343 be called from within `PUSH_FAILURE_POINT'. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1344 #define PUSH_FAILURE_ELT(item) \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1345 fail_stack.stack[fail_stack.avail++] = (item)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1346
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1347 /* These three POP... operations complement the three PUSH... operations.
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1348 All assume that `fail_stack' is nonempty. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1349 #define POP_FAILURE_POINTER() fail_stack.stack[--fail_stack.avail].pointer
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1350 #define POP_FAILURE_INT() fail_stack.stack[--fail_stack.avail].integer
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1351 #define POP_FAILURE_ELT() fail_stack.stack[--fail_stack.avail]
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1352
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1353 /* Individual items aside from the registers. */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1354 #define NUM_NONREG_ITEMS 3
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1355
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1356 /* Used to examine the stack (to detect infinite loops). */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1357 #define FAILURE_PAT(h) fail_stack.stack[(h) - 1].pointer
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1358 #define FAILURE_STR(h) ((char*)fail_stack.stack[(h) - 2].pointer)
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1359 #define NEXT_FAILURE_HANDLE(h) fail_stack.stack[(h) - 3].integer
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1360 #define TOP_FAILURE_HANDLE() fail_stack.frame
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1361
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1362
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1363 #define ENSURE_FAIL_STACK(space) \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1364 while (REMAINING_AVAIL_SLOTS <= space) { \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1365 if (!GROW_FAIL_STACK (fail_stack)) \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1366 return -2; \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1367 DEBUG_PRINT2 ("\n Doubled stack; size now: %d\n", (fail_stack).size);\
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1368 DEBUG_PRINT2 (" slots available: %d\n", REMAINING_AVAIL_SLOTS);\
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1369 }
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1370
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1371 /* Push register NUM onto the stack. */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1372 #define PUSH_FAILURE_REG(num) \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1373 do { \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1374 char *destination; \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1375 ENSURE_FAIL_STACK(3); \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1376 DEBUG_PRINT4 (" Push reg %d (spanning %p -> %p)\n", \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1377 num, regstart[num], regend[num]); \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1378 PUSH_FAILURE_POINTER (regstart[num]); \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1379 PUSH_FAILURE_POINTER (regend[num]); \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1380 PUSH_FAILURE_INT (num); \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1381 } while (0)
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1382
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1383 /* Pop a saved register off the stack. */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1384 #define POP_FAILURE_REG() \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1385 do { \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1386 int reg = POP_FAILURE_INT (); \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1387 regend[reg] = POP_FAILURE_POINTER (); \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1388 regstart[reg] = POP_FAILURE_POINTER (); \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1389 DEBUG_PRINT4 (" Pop reg %d (spanning %p -> %p)\n", \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1390 reg, regstart[reg], regend[reg]); \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1391 } while (0)
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1392
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1393 /* Check that we are not stuck in an infinite loop. */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1394 #define CHECK_INFINITE_LOOP(pat_cur, string_place) \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1395 do { \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1396 int failure = TOP_FAILURE_HANDLE(); \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1397 /* Check for infinite matching loops */ \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1398 while (failure > 0 && \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1399 (FAILURE_STR (failure) == string_place \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1400 || FAILURE_STR (failure) == NULL)) \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1401 { \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1402 assert (FAILURE_PAT (failure) >= bufp->buffer \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1403 && FAILURE_PAT (failure) <= bufp->buffer + bufp->used);\
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1404 if (FAILURE_PAT (failure) == pat_cur) \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1405 goto fail; \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1406 DEBUG_PRINT2 (" Other pattern: %p\n", FAILURE_PAT (failure));\
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1407 failure = NEXT_FAILURE_HANDLE(failure); \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1408 } \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1409 DEBUG_PRINT2 (" Other string: %p\n", FAILURE_STR (failure)); \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1410 } while (0)
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1411
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1412 /* Push the information about the state we will need
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
1413 if we ever fail back to it.
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
1414
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1415 Requires variables fail_stack, regstart, regend and
1156
8e1cbb305ddc (TYPICAL_FAILURE_SIZE): Renamed from MAX_FAILURE_ITEMS.
Karl Heuer <kwzh@gnu.org>
parents: 992
diff changeset
1416 num_regs be declared. GROW_FAIL_STACK requires `destination' be
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1417 declared.
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
1418
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1419 Does `return FAILURE_CODE' if runs out of memory. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1420
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1421 #define PUSH_FAILURE_POINT(pattern, string_place) \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1422 do { \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1423 char *destination; \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1424 /* Must be int, so when we don't save any registers, the arithmetic \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1425 of 0 + -1 isn't done as unsigned. */ \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1426 \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1427 DEBUG_STATEMENT (failure_id++); \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1428 DEBUG_STATEMENT (nfailure_points_pushed++); \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1429 DEBUG_PRINT2 ("\nPUSH_FAILURE_POINT #%u:\n", failure_id); \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1430 DEBUG_PRINT2 (" Before push, next avail: %d\n", (fail_stack).avail); \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1431 DEBUG_PRINT2 (" size: %d\n", (fail_stack).size);\
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1432 \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1433 ENSURE_FAIL_STACK (NUM_NONREG_ITEMS); \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1434 \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1435 DEBUG_PRINT1 ("\n"); \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1436 \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1437 DEBUG_PRINT2 (" Push frame index: %d\n", fail_stack.frame); \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1438 PUSH_FAILURE_INT (fail_stack.frame); \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1439 \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1440 DEBUG_PRINT2 (" Push string %p: `", string_place); \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1441 DEBUG_PRINT_DOUBLE_STRING (string_place, string1, size1, string2, size2);\
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1442 DEBUG_PRINT1 ("'\n"); \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1443 PUSH_FAILURE_POINTER (string_place); \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1444 \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1445 DEBUG_PRINT2 (" Push pattern %p: ", pattern); \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1446 DEBUG_PRINT_COMPILED_PATTERN (bufp, pattern, pend); \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1447 PUSH_FAILURE_POINTER (pattern); \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1448 \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1449 /* Close the frame by moving the frame pointer past it. */ \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1450 fail_stack.frame = fail_stack.avail; \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1451 } while (0)
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1452
1156
8e1cbb305ddc (TYPICAL_FAILURE_SIZE): Renamed from MAX_FAILURE_ITEMS.
Karl Heuer <kwzh@gnu.org>
parents: 992
diff changeset
1453 /* Estimate the size of data pushed by a typical failure stack entry.
8e1cbb305ddc (TYPICAL_FAILURE_SIZE): Renamed from MAX_FAILURE_ITEMS.
Karl Heuer <kwzh@gnu.org>
parents: 992
diff changeset
1454 An estimate is all we need, because all we use this for
8e1cbb305ddc (TYPICAL_FAILURE_SIZE): Renamed from MAX_FAILURE_ITEMS.
Karl Heuer <kwzh@gnu.org>
parents: 992
diff changeset
1455 is to choose a limit for how big to make the failure stack. */
8e1cbb305ddc (TYPICAL_FAILURE_SIZE): Renamed from MAX_FAILURE_ITEMS.
Karl Heuer <kwzh@gnu.org>
parents: 992
diff changeset
1456
8e1cbb305ddc (TYPICAL_FAILURE_SIZE): Renamed from MAX_FAILURE_ITEMS.
Karl Heuer <kwzh@gnu.org>
parents: 992
diff changeset
1457 #define TYPICAL_FAILURE_SIZE 20
8e1cbb305ddc (TYPICAL_FAILURE_SIZE): Renamed from MAX_FAILURE_ITEMS.
Karl Heuer <kwzh@gnu.org>
parents: 992
diff changeset
1458
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1459 /* How many items can still be added to the stack without overflowing it. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1460 #define REMAINING_AVAIL_SLOTS ((fail_stack).size - (fail_stack).avail)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1461
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1462
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1463 /* Pops what PUSH_FAIL_STACK pushes.
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1464
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1465 We restore into the parameters, all of which should be lvalues:
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1466 STR -- the saved data position.
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1467 PAT -- the saved pattern position.
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1468 REGSTART, REGEND -- arrays of string positions.
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
1469
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1470 Also assumes the variables `fail_stack' and (if debugging), `bufp',
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1471 `pend', `string1', `size1', `string2', and `size2'. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1472
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1473 #define POP_FAILURE_POINT(str, pat) \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1474 do { \
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1475 assert (!FAIL_STACK_EMPTY ()); \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1476 \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1477 /* Remove failure points and point to how many regs pushed. */ \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1478 DEBUG_PRINT1 ("POP_FAILURE_POINT:\n"); \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1479 DEBUG_PRINT2 (" Before pop, next avail: %d\n", fail_stack.avail); \
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1480 DEBUG_PRINT2 (" size: %d\n", fail_stack.size); \
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1481 \
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1482 /* Pop the saved registers. */ \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1483 while (fail_stack.frame < fail_stack.avail) \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1484 POP_FAILURE_REG (); \
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1485 \
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1486 pat = (unsigned char *) POP_FAILURE_POINTER (); \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1487 DEBUG_PRINT2 (" Popping pattern %p: ", pat); \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1488 DEBUG_PRINT_COMPILED_PATTERN (bufp, pat, pend); \
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1489 \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1490 /* If the saved string location is NULL, it came from an \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1491 on_failure_keep_string_jump opcode, and we want to throw away the \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1492 saved NULL, thus retaining our current position in the string. */ \
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1493 str = (char *) POP_FAILURE_POINTER (); \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1494 DEBUG_PRINT2 (" Popping string %p: `", str); \
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1495 DEBUG_PRINT_DOUBLE_STRING (str, string1, size1, string2, size2); \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1496 DEBUG_PRINT1 ("'\n"); \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1497 \
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1498 fail_stack.frame = POP_FAILURE_INT (); \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1499 DEBUG_PRINT2 (" Popping frame index: %d\n", fail_stack.frame); \
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1500 \
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1501 assert (fail_stack.avail >= 0); \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1502 assert (fail_stack.frame <= fail_stack.avail); \
480
998dc67883fb (PUSH_FAILURE_POINT, POP_FAILURE_POINT): Don't push or pop
Richard Stallman <rms@gnu.org>
parents: 463
diff changeset
1503 \
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1504 DEBUG_STATEMENT (nfailure_points_popped++); \
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1505 } while (0) /* POP_FAILURE_POINT */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1506
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1507
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1508
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1509 /* Registers are set to a sentinel when they haven't yet matched. */
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1510 #define REG_UNSET_VALUE NULL
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1511 #define REG_UNSET(e) ((e) == REG_UNSET_VALUE)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1512
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1513 /* Subroutine declarations and macros for regex_compile. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1514
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1515 static void store_op1 (), store_op2 ();
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1516 static void insert_op1 (), insert_op2 ();
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1517 static boolean at_begline_loc_p (), at_endline_loc_p ();
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1518 static boolean group_in_compile_stack ();
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1519
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
1520 /* Fetch the next character in the uncompiled pattern---translating it
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1521 if necessary. Also cast from a signed character in the constant
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1522 string passed to us by the user to an unsigned char that we can use
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1523 as an array index (in, e.g., `translate'). */
501
f29b13c2cefd (TRANSLATE, PATFETCH): Cast elt of `translate'.
Richard Stallman <rms@gnu.org>
parents: 490
diff changeset
1524 #ifndef PATFETCH
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1525 #define PATFETCH(c) \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1526 do {if (p == pend) return REG_EEND; \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1527 c = (unsigned char) *p++; \
1328
0aa10b723959 Use RE_TRANSLATE_P to check whether translation is
Andreas Schwab <schwab@suse.de>
parents: 1326
diff changeset
1528 if (RE_TRANSLATE_P (translate)) c = RE_TRANSLATE (translate, c); \
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1529 } while (0)
501
f29b13c2cefd (TRANSLATE, PATFETCH): Cast elt of `translate'.
Richard Stallman <rms@gnu.org>
parents: 490
diff changeset
1530 #endif
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1531
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1532 /* Fetch the next character in the uncompiled pattern, with no
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1533 translation. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1534 #define PATFETCH_RAW(c) \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1535 do {if (p == pend) return REG_EEND; \
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1536 c = (unsigned char) *p++; \
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1537 } while (0)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1538
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1539 /* Go backwards one character in the pattern. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1540 #define PATUNFETCH p--
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1541
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1542
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1543 /* If `translate' is non-null, return translate[D], else just D. We
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1544 cast the subscript to translate because some data is declared as
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1545 `char *', to avoid warnings when a string constant is passed. But
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1546 when we use a character as a subscript we must make it unsigned. */
501
f29b13c2cefd (TRANSLATE, PATFETCH): Cast elt of `translate'.
Richard Stallman <rms@gnu.org>
parents: 490
diff changeset
1547 #ifndef TRANSLATE
f29b13c2cefd (TRANSLATE, PATFETCH): Cast elt of `translate'.
Richard Stallman <rms@gnu.org>
parents: 490
diff changeset
1548 #define TRANSLATE(d) \
1328
0aa10b723959 Use RE_TRANSLATE_P to check whether translation is
Andreas Schwab <schwab@suse.de>
parents: 1326
diff changeset
1549 (RE_TRANSLATE_P (translate) \
0aa10b723959 Use RE_TRANSLATE_P to check whether translation is
Andreas Schwab <schwab@suse.de>
parents: 1326
diff changeset
1550 ? (unsigned) RE_TRANSLATE (translate, (unsigned) (d)) : (d))
501
f29b13c2cefd (TRANSLATE, PATFETCH): Cast elt of `translate'.
Richard Stallman <rms@gnu.org>
parents: 490
diff changeset
1551 #endif
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1552
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1553
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1554 /* Macros for outputting the compiled pattern into `buffer'. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1555
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1556 /* If the buffer isn't allocated when it comes in, use this. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1557 #define INIT_BUF_SIZE 32
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1558
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1559 /* Make sure we have at least N more bytes of space in buffer. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1560 #define GET_BUFFER_SPACE(n) \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1561 while (b - bufp->buffer + (n) > bufp->allocated) \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1562 EXTEND_BUFFER ()
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1563
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1564 /* Make sure we have one more byte of buffer space and then add C to it. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1565 #define BUF_PUSH(c) \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1566 do { \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1567 GET_BUFFER_SPACE (1); \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1568 *b++ = (unsigned char) (c); \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1569 } while (0)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1570
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1571
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1572 /* Ensure we have two more bytes of buffer space and then append C1 and C2. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1573 #define BUF_PUSH_2(c1, c2) \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1574 do { \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1575 GET_BUFFER_SPACE (2); \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1576 *b++ = (unsigned char) (c1); \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1577 *b++ = (unsigned char) (c2); \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1578 } while (0)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1579
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1580
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1581 /* As with BUF_PUSH_2, except for three bytes. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1582 #define BUF_PUSH_3(c1, c2, c3) \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1583 do { \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1584 GET_BUFFER_SPACE (3); \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1585 *b++ = (unsigned char) (c1); \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1586 *b++ = (unsigned char) (c2); \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1587 *b++ = (unsigned char) (c3); \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1588 } while (0)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1589
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1590
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1591 /* Store a jump with opcode OP at LOC to location TO. We store a
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1592 relative address offset by the three bytes the jump itself occupies. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1593 #define STORE_JUMP(op, loc, to) \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1594 store_op1 (op, loc, (to) - (loc) - 3)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1595
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1596 /* Likewise, for a two-argument jump. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1597 #define STORE_JUMP2(op, loc, to, arg) \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1598 store_op2 (op, loc, (to) - (loc) - 3, arg)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1599
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1600 /* Like `STORE_JUMP', but for inserting. Assume `b' is the buffer end. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1601 #define INSERT_JUMP(op, loc, to) \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1602 insert_op1 (op, loc, (to) - (loc) - 3, b)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1603
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1604 /* Like `STORE_JUMP2', but for inserting. Assume `b' is the buffer end. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1605 #define INSERT_JUMP2(op, loc, to, arg) \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1606 insert_op2 (op, loc, (to) - (loc) - 3, arg, b)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1607
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1608
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1609 /* This is not an arbitrary limit: the arguments which represent offsets
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1610 into the pattern are two bytes long. So if 2^16 bytes turns out to
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1611 be too small, many things would have to change. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1612 #define MAX_BUF_SIZE (1L << 16)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1613
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1614
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1615 /* Extend the buffer by twice its current size via realloc and
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1616 reset the pointers that pointed into the old block to point to the
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1617 correct places in the new one. If extending the buffer results in it
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1618 being larger than MAX_BUF_SIZE, then flag memory exhausted. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1619 #define EXTEND_BUFFER() \
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1620 do { \
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1621 unsigned char *old_buffer = bufp->buffer; \
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1622 if (bufp->allocated == MAX_BUF_SIZE) \
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1623 return REG_ESIZE; \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1624 bufp->allocated <<= 1; \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1625 if (bufp->allocated > MAX_BUF_SIZE) \
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1626 bufp->allocated = MAX_BUF_SIZE; \
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1627 bufp->buffer = (unsigned char *) realloc (bufp->buffer, bufp->allocated);\
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1628 if (bufp->buffer == NULL) \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1629 return REG_ESPACE; \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1630 /* If the buffer moved, move all the pointers into it. */ \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1631 if (old_buffer != bufp->buffer) \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1632 { \
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1633 b = (b - old_buffer) + bufp->buffer; \
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1634 begalt = (begalt - old_buffer) + bufp->buffer; \
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1635 if (fixup_alt_jump) \
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1636 fixup_alt_jump = (fixup_alt_jump - old_buffer) + bufp->buffer;\
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1637 if (laststart) \
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1638 laststart = (laststart - old_buffer) + bufp->buffer; \
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1639 if (pending_exact) \
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1640 pending_exact = (pending_exact - old_buffer) + bufp->buffer; \
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1641 } \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1642 } while (0)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1643
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1644
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1645 /* Since we have one byte reserved for the register number argument to
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1646 {start,stop}_memory, the maximum number of groups we can report
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1647 things about is what fits in that byte. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1648 #define MAX_REGNUM 255
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1649
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1650 /* But patterns can have more than `MAX_REGNUM' registers. We just
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1651 ignore the excess. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1652 typedef unsigned regnum_t;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1653
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1654
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1655 /* Macros for the compile stack. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1656
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1657 /* Since offsets can go either forwards or backwards, this type needs to
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1658 be able to hold values from -(MAX_BUF_SIZE - 1) to MAX_BUF_SIZE - 1. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1659 typedef int pattern_offset_t;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1660
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1661 typedef struct
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1662 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1663 pattern_offset_t begalt_offset;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1664 pattern_offset_t fixup_alt_jump;
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
1665 pattern_offset_t laststart_offset;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1666 regnum_t regnum;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1667 } compile_stack_elt_t;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1668
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1669
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1670 typedef struct
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1671 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1672 compile_stack_elt_t *stack;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1673 unsigned size;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1674 unsigned avail; /* Offset of next open position. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1675 } compile_stack_type;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1676
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1677
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1678 #define INIT_COMPILE_STACK_SIZE 32
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1679
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1680 #define COMPILE_STACK_EMPTY (compile_stack.avail == 0)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1681 #define COMPILE_STACK_FULL (compile_stack.avail == compile_stack.size)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1682
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1683 /* The next available element. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1684 #define COMPILE_STACK_TOP (compile_stack.stack[compile_stack.avail])
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1685
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1686
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1687 /* Structure to manage work area for range table. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1688 struct range_table_work_area
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1689 {
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1690 int *table; /* actual work area. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1691 int allocated; /* allocated size for work area in bytes. */
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1692 int used; /* actually used size in words. */
1933
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
1693 int bits; /* flag to record character classes */
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1694 };
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1695
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1696 /* Make sure that WORK_AREA can hold more N multibyte characters. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1697 #define EXTEND_RANGE_TABLE_WORK_AREA(work_area, n) \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1698 do { \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1699 if (((work_area).used + (n)) * sizeof (int) > (work_area).allocated) \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1700 { \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1701 (work_area).allocated += 16 * sizeof (int); \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1702 if ((work_area).table) \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1703 (work_area).table \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1704 = (int *) realloc ((work_area).table, (work_area).allocated); \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1705 else \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1706 (work_area).table \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1707 = (int *) malloc ((work_area).allocated); \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1708 if ((work_area).table == 0) \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1709 FREE_STACK_RETURN (REG_ESPACE); \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1710 } \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1711 } while (0)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1712
1933
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
1713 #define SET_RANGE_TABLE_WORK_AREA_BIT(work_area, bit) \
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
1714 (work_area).bits |= (bit)
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
1715
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
1716 /* These bits represent the various character classes such as [:alnum:]
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
1717 in a charset's range table. */
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
1718 #define BIT_ALNUM 0x1
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
1719 #define BIT_ALPHA 0x2
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
1720 #define BIT_WORD 0x4
1965
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
1721 #define BIT_ASCII 0x8
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
1722 #define BIT_NONASCII 0x10
1933
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
1723 #define BIT_GRAPH 0x20
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
1724 #define BIT_LOWER 0x40
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
1725 #define BIT_PRINT 0x80
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
1726 #define BIT_PUNCT 0x100
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
1727 #define BIT_SPACE 0x200
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
1728 #define BIT_UPPER 0x400
1965
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
1729 #define BIT_UNIBYTE 0x800
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
1730 #define BIT_MULTIBYTE 0x1000
1933
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
1731
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1732 /* Set a range (RANGE_START, RANGE_END) to WORK_AREA. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1733 #define SET_RANGE_TABLE_WORK_AREA(work_area, range_start, range_end) \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1734 do { \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1735 EXTEND_RANGE_TABLE_WORK_AREA ((work_area), 2); \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1736 (work_area).table[(work_area).used++] = (range_start); \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1737 (work_area).table[(work_area).used++] = (range_end); \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1738 } while (0)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1739
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1740 /* Free allocated memory for WORK_AREA. */
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1741 #define FREE_RANGE_TABLE_WORK_AREA(work_area) \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1742 do { \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1743 if ((work_area).table) \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1744 free ((work_area).table); \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1745 } while (0)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1746
1933
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
1747 #define CLEAR_RANGE_TABLE_WORK_USED(work_area) ((work_area).used = 0, (work_area).bits = 0)
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1748 #define RANGE_TABLE_WORK_USED(work_area) ((work_area).used)
1933
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
1749 #define RANGE_TABLE_WORK_BITS(work_area) ((work_area).bits)
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1750 #define RANGE_TABLE_WORK_ELT(work_area, i) ((work_area).table[i])
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1751
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1752
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1753 /* Set the bit for character C in a list. */
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1754 #define SET_LIST_BIT(c) \
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1755 (b[((unsigned char) (c)) / BYTEWIDTH] \
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1756 |= 1 << (((unsigned char) c) % BYTEWIDTH))
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1757
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1758
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1759 /* Get the next unsigned number in the uncompiled pattern. */
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1760 #define GET_UNSIGNED_NUMBER(num) \
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1761 { if (p != pend) \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1762 { \
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1763 PATFETCH (c); \
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1764 while (ISDIGIT (c)) \
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1765 { \
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1766 if (num < 0) \
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1767 num = 0; \
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1768 num = num * 10 + c - '0'; \
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1769 if (p == pend) \
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1770 break; \
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1771 PATFETCH (c); \
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1772 } \
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1773 } \
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
1774 }
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1775
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1776 #define CHAR_CLASS_MAX_LENGTH 6 /* Namely, `xdigit'. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1777
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1778 #define IS_CHAR_CLASS(string) \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1779 (STREQ (string, "alpha") || STREQ (string, "upper") \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1780 || STREQ (string, "lower") || STREQ (string, "digit") \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1781 || STREQ (string, "alnum") || STREQ (string, "xdigit") \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1782 || STREQ (string, "space") || STREQ (string, "print") \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1783 || STREQ (string, "punct") || STREQ (string, "graph") \
1933
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
1784 || STREQ (string, "cntrl") || STREQ (string, "blank") \
1965
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
1785 || STREQ (string, "word") \
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
1786 || STREQ (string, "ascii") || STREQ (string, "nonascii") \
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
1787 || STREQ (string, "unibyte") || STREQ (string, "multibyte"))
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1788
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1789 #ifndef MATCH_MAY_ALLOCATE
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1790
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1791 /* If we cannot allocate large objects within re_match_2_internal,
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1792 we make the fail stack and register vectors global.
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1793 The fail stack, we grow to the maximum size when a regexp
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1794 is compiled.
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1795 The register vectors, we adjust in size each time we
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1796 compile a regexp, according to the number of registers it needs. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1797
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1798 static fail_stack_type fail_stack;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1799
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1800 /* Size with which the following vectors are currently allocated.
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1801 That is so we can make them bigger as needed,
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1802 but never make them smaller. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1803 static int regs_allocated_size;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1804
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1805 static const char ** regstart, ** regend;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1806 static const char **best_regstart, **best_regend;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1807
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1808 /* Make the register vectors big enough for NUM_REGS registers,
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1809 but don't make them smaller. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1810
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1811 static
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1812 regex_grow_registers (num_regs)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1813 int num_regs;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1814 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1815 if (num_regs > regs_allocated_size)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1816 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1817 RETALLOC_IF (regstart, num_regs, const char *);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1818 RETALLOC_IF (regend, num_regs, const char *);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1819 RETALLOC_IF (best_regstart, num_regs, const char *);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1820 RETALLOC_IF (best_regend, num_regs, const char *);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1821
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1822 regs_allocated_size = num_regs;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1823 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1824 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1825
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1826 #endif /* not MATCH_MAY_ALLOCATE */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1827
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1828 /* `regex_compile' compiles PATTERN (of length SIZE) according to SYNTAX.
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1829 Returns one of error codes defined in `regex.h', or zero for success.
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1830
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1831 Assumes the `allocated' (and perhaps `buffer') and `translate'
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1832 fields are set in BUFP on entry.
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1833
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1834 If it succeeds, results are put in BUFP (if it returns an error, the
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1835 contents of BUFP are undefined):
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1836 `buffer' is the compiled pattern;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1837 `syntax' is set to SYNTAX;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1838 `used' is set to the length of the compiled pattern;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1839 `fastmap_accurate' is zero;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1840 `re_nsub' is the number of subexpressions in PATTERN;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1841 `not_bol' and `not_eol' are zero;
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
1842
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1843 The `fastmap' and `newline_anchor' fields are neither
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1844 examined nor set. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1845
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1846 /* Insert the `jump' from the end of last alternative to "here".
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1847 The space for the jump has already been allocated. */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1848 #define FIXUP_ALT_JUMP() \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1849 do { \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1850 if (fixup_alt_jump) \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1851 STORE_JUMP (jump, fixup_alt_jump, b); \
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1852 } while (0)
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1853
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1854
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1855 /* Return, freeing storage we allocated. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1856 #define FREE_STACK_RETURN(value) \
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1857 do { \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1858 FREE_RANGE_TABLE_WORK_AREA (range_table_work); \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1859 free (compile_stack.stack); \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1860 return value; \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1861 } while (0)
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1862
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1863 static reg_errcode_t
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1864 regex_compile (pattern, size, syntax, bufp)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1865 const char *pattern;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1866 int size;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1867 reg_syntax_t syntax;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1868 struct re_pattern_buffer *bufp;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1869 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1870 /* We fetch characters from PATTERN here. Even though PATTERN is
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1871 `char *' (i.e., signed), we declare these variables as unsigned, so
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1872 they can be reliably used as array indices. */
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1873 register unsigned int c, c1;
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
1874
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1875 /* A random temporary spot in PATTERN. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1876 const char *p1;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1877
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1878 /* Points to the end of the buffer, where we should append. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1879 register unsigned char *b;
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
1880
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1881 /* Keeps track of unclosed groups. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1882 compile_stack_type compile_stack;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1883
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1884 /* Points to the current (ending) position in the pattern. */
1440
ba6fdbf593bb (regex_compile): Declare p with non-const type on AIX.
Richard Stallman <rms@gnu.org>
parents: 1383
diff changeset
1885 #ifdef AIX
ba6fdbf593bb (regex_compile): Declare p with non-const type on AIX.
Richard Stallman <rms@gnu.org>
parents: 1383
diff changeset
1886 /* `const' makes AIX compiler fail. */
ba6fdbf593bb (regex_compile): Declare p with non-const type on AIX.
Richard Stallman <rms@gnu.org>
parents: 1383
diff changeset
1887 char *p = pattern;
ba6fdbf593bb (regex_compile): Declare p with non-const type on AIX.
Richard Stallman <rms@gnu.org>
parents: 1383
diff changeset
1888 #else
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1889 const char *p = pattern;
1440
ba6fdbf593bb (regex_compile): Declare p with non-const type on AIX.
Richard Stallman <rms@gnu.org>
parents: 1383
diff changeset
1890 #endif
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1891 const char *pend = pattern + size;
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
1892
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1893 /* How to translate the characters in the pattern. */
501
f29b13c2cefd (TRANSLATE, PATFETCH): Cast elt of `translate'.
Richard Stallman <rms@gnu.org>
parents: 490
diff changeset
1894 RE_TRANSLATE_TYPE translate = bufp->translate;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1895
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1896 /* Address of the count-byte of the most recently inserted `exactn'
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1897 command. This makes it possible to tell if a new exact-match
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1898 character can be added to that command or if the character requires
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1899 a new `exactn' command. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1900 unsigned char *pending_exact = 0;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1901
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1902 /* Address of start of the most recently finished expression.
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1903 This tells, e.g., postfix * where to find the start of its
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1904 operand. Reset at the beginning of groups and alternatives. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1905 unsigned char *laststart = 0;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1906
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1907 /* Address of beginning of regexp, or inside of last group. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1908 unsigned char *begalt;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1909
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1910 /* Place in the uncompiled pattern (i.e., the {) to
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1911 which to go back if the interval is invalid. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1912 const char *beg_interval;
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
1913
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1914 /* Address of the place where a forward jump should go to the end of
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1915 the containing expression. Each alternative of an `or' -- except the
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1916 last -- ends with a forward jump of this sort. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1917 unsigned char *fixup_alt_jump = 0;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1918
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1919 /* Counts open-groups as they are encountered. Remembered for the
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1920 matching close-group on the compile stack, so the same register
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1921 number is put in the stop_memory as the start_memory. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1922 regnum_t regnum = 0;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1923
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1924 /* Work area for range table of charset. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1925 struct range_table_work_area range_table_work;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1926
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1927 #ifdef DEBUG
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
1928 /* debug = 1; */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1929 DEBUG_PRINT1 ("\nCompiling pattern: ");
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1930 if (debug)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1931 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1932 unsigned debug_count;
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
1933
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1934 for (debug_count = 0; debug_count < size; debug_count++)
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1935 putchar (pattern[debug_count]);
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1936 putchar ('\n');
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1937 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1938 #endif /* DEBUG */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1939
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1940 /* Initialize the compile stack. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1941 compile_stack.stack = TALLOC (INIT_COMPILE_STACK_SIZE, compile_stack_elt_t);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1942 if (compile_stack.stack == NULL)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1943 return REG_ESPACE;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1944
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1945 compile_stack.size = INIT_COMPILE_STACK_SIZE;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1946 compile_stack.avail = 0;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1947
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1948 range_table_work.table = 0;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1949 range_table_work.allocated = 0;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1950
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1951 /* Initialize the pattern buffer. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1952 bufp->syntax = syntax;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1953 bufp->fastmap_accurate = 0;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1954 bufp->not_bol = bufp->not_eol = 0;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1955
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1956 /* Set `used' to zero, so that if we return an error, the pattern
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1957 printer (for debugging) will think there's no pattern. We reset it
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1958 at the end. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1959 bufp->used = 0;
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
1960
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1961 /* Always count groups, whether or not bufp->no_sub is set. */
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
1962 bufp->re_nsub = 0;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1963
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1964 #ifdef emacs
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1965 /* bufp->multibyte is set before regex_compile is called, so don't alter
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1966 it. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1967 #else /* not emacs */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1968 /* Nothing is recognized as a multibyte character. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1969 bufp->multibyte = 0;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1970 #endif
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
1971
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1972 #if !defined (emacs) && !defined (SYNTAX_TABLE)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1973 /* Initialize the syntax table. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1974 init_syntax_once ();
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1975 #endif
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1976
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1977 if (bufp->allocated == 0)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1978 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1979 if (bufp->buffer)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1980 { /* If zero allocated, but buffer is non-null, try to realloc
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1981 enough space. This loses if buffer's address is bogus, but
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1982 that is the user's responsibility. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1983 RETALLOC (bufp->buffer, INIT_BUF_SIZE, unsigned char);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1984 }
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1985 else
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1986 { /* Caller did not allocate a buffer. Do it for them. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1987 bufp->buffer = TALLOC (INIT_BUF_SIZE, unsigned char);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
1988 }
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1989 if (!bufp->buffer) FREE_STACK_RETURN (REG_ESPACE);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1990
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1991 bufp->allocated = INIT_BUF_SIZE;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1992 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1993
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1994 begalt = b = bufp->buffer;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1995
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1996 /* Loop through the uncompiled pattern until we're at the end. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1997 while (p != pend)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1998 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
1999 PATFETCH (c);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
2000
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
2001 switch (c)
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2002 {
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2003 case '^':
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2004 {
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2005 if ( /* If at start of pattern, it's an operator. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2006 p == pattern + 1
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2007 /* If context independent, it's an operator. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2008 || syntax & RE_CONTEXT_INDEP_ANCHORS
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2009 /* Otherwise, depends on what's come before. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2010 || at_begline_loc_p (pattern, p, syntax))
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2011 BUF_PUSH (begline);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2012 else
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2013 goto normal_char;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2014 }
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2015 break;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2016
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2017
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2018 case '$':
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2019 {
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2020 if ( /* If at end of pattern, it's an operator. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2021 p == pend
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2022 /* If context independent, it's an operator. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2023 || syntax & RE_CONTEXT_INDEP_ANCHORS
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2024 /* Otherwise, depends on what's next. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2025 || at_endline_loc_p (p, pend, syntax))
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2026 BUF_PUSH (endline);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2027 else
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2028 goto normal_char;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2029 }
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2030 break;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
2031
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
2032
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
2033 case '+':
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2034 case '?':
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2035 if ((syntax & RE_BK_PLUS_QM)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2036 || (syntax & RE_LIMITED_OPS))
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2037 goto normal_char;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2038 handle_plus:
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2039 case '*':
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2040 /* If there is no previous pattern... */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2041 if (!laststart)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2042 {
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2043 if (syntax & RE_CONTEXT_INVALID_OPS)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2044 FREE_STACK_RETURN (REG_BADRPT);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2045 else if (!(syntax & RE_CONTEXT_INDEP_OPS))
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2046 goto normal_char;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2047 }
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2048
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2049 {
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2050 /* Are we optimizing this jump? */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2051 boolean keep_string_p = false;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2052
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2053 /* 1 means zero (many) matches is allowed. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2054 char zero_times_ok = 0, many_times_ok = 0;
2034
00db7733320d 1999-12-15 Kenichi Handa <handa@etl.go.jp>
Dave Love <fx@gnu.org>
parents: 1972
diff changeset
2055 char greedy = 1;
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2056
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2057 /* If there is a sequence of repetition chars, collapse it
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2058 down to just one (the right one). We can't combine
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2059 interval operators with these because of, e.g., `a{2}*',
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2060 which should only match an even number of `a's. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2061
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2062 for (;;)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2063 {
2034
00db7733320d 1999-12-15 Kenichi Handa <handa@etl.go.jp>
Dave Love <fx@gnu.org>
parents: 1972
diff changeset
2064 if (!(syntax & RE_ALL_GREEDY)
00db7733320d 1999-12-15 Kenichi Handa <handa@etl.go.jp>
Dave Love <fx@gnu.org>
parents: 1972
diff changeset
2065 && c == '?' && (zero_times_ok || many_times_ok))
00db7733320d 1999-12-15 Kenichi Handa <handa@etl.go.jp>
Dave Love <fx@gnu.org>
parents: 1972
diff changeset
2066 greedy = 0;
00db7733320d 1999-12-15 Kenichi Handa <handa@etl.go.jp>
Dave Love <fx@gnu.org>
parents: 1972
diff changeset
2067 else
00db7733320d 1999-12-15 Kenichi Handa <handa@etl.go.jp>
Dave Love <fx@gnu.org>
parents: 1972
diff changeset
2068 {
00db7733320d 1999-12-15 Kenichi Handa <handa@etl.go.jp>
Dave Love <fx@gnu.org>
parents: 1972
diff changeset
2069 zero_times_ok |= c != '+';
00db7733320d 1999-12-15 Kenichi Handa <handa@etl.go.jp>
Dave Love <fx@gnu.org>
parents: 1972
diff changeset
2070 many_times_ok |= c != '?';
00db7733320d 1999-12-15 Kenichi Handa <handa@etl.go.jp>
Dave Love <fx@gnu.org>
parents: 1972
diff changeset
2071 }
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2072
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2073 if (p == pend)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2074 break;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2075
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2076 PATFETCH (c);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2077
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2078 if (c == '*'
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2079 || (!(syntax & RE_BK_PLUS_QM) && (c == '+' || c == '?')))
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2080 ;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2081
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2082 else if (syntax & RE_BK_PLUS_QM && c == '\\')
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2083 {
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2084 if (p == pend) FREE_STACK_RETURN (REG_EESCAPE);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2085
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2086 PATFETCH (c1);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2087 if (!(c1 == '+' || c1 == '?'))
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2088 {
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2089 PATUNFETCH;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2090 PATUNFETCH;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2091 break;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2092 }
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2093
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2094 c = c1;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2095 }
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2096 else
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2097 {
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2098 PATUNFETCH;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2099 break;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2100 }
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2101
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2102 /* If we get here, we found another repeat character. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2103 }
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2104
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2105 /* Star, etc. applied to an empty pattern is equivalent
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2106 to an empty pattern. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2107 if (!laststart)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2108 break;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2109
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2110 /* Now we know whether or not zero matches is allowed
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2111 and also whether or not two or more matches is allowed. */
2034
00db7733320d 1999-12-15 Kenichi Handa <handa@etl.go.jp>
Dave Love <fx@gnu.org>
parents: 1972
diff changeset
2112 if (greedy)
00db7733320d 1999-12-15 Kenichi Handa <handa@etl.go.jp>
Dave Love <fx@gnu.org>
parents: 1972
diff changeset
2113 {
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2114 if (many_times_ok)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2115 { /* More than one repetition is allowed, so put in at the
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2116 end a backward relative jump from `b' to before the next
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2117 jump we're going to put in below (which jumps from
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2118 laststart to after this jump).
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2119
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2120 But if we are at the `*' in the exact sequence `.*\n',
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2121 insert an unconditional jump backwards to the .,
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2122 instead of the beginning of the loop. This way we only
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2123 push a failure point once, instead of every time
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2124 through the loop. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2125 assert (p - 1 > pattern);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2126
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2127 /* Allocate the space for the jump. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2128 GET_BUFFER_SPACE (3);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2129
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2130 /* We know we are not at the first character of the pattern,
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2131 because laststart was nonzero. And we've already
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2132 incremented `p', by the way, to be the character after
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2133 the `*'. Do we have to do something analogous here
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2134 for null bytes, because of RE_DOT_NOT_NULL? */
1296
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
2135 if (TRANSLATE ((unsigned char)*(p - 2)) == TRANSLATE ('.')
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
2136 && zero_times_ok
1296
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
2137 && p < pend
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
2138 && TRANSLATE ((unsigned char)*p) == TRANSLATE ('\n')
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2139 && !(syntax & RE_DOT_NEWLINE))
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2140 { /* We have .*\n. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2141 STORE_JUMP (jump, b, laststart);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2142 keep_string_p = true;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2143 }
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2144 else
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2145 STORE_JUMP (jump, b, laststart - 3);
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2146
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2147 /* We've added more stuff to the buffer. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2148 b += 3;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2149 }
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2150
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2151 /* On failure, jump from laststart to b + 3, which will be the
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2152 end of the buffer after this jump is inserted. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2153 GET_BUFFER_SPACE (3);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2154 if (!zero_times_ok)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2155 {
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2156 assert (many_times_ok);
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2157 INSERT_JUMP (on_failure_jump_smart, b - 3, b + 3);
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2158 pending_exact = 0;
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2159 b += 3;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2160 }
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2161 else
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2162 {
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2163 INSERT_JUMP (keep_string_p ? on_failure_keep_string_jump
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2164 : !many_times_ok ?
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2165 on_failure_jump : on_failure_jump_smart,
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2166 laststart, b + 3);
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2167 pending_exact = 0;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2168 b += 3;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2169 }
2034
00db7733320d 1999-12-15 Kenichi Handa <handa@etl.go.jp>
Dave Love <fx@gnu.org>
parents: 1972
diff changeset
2170 }
00db7733320d 1999-12-15 Kenichi Handa <handa@etl.go.jp>
Dave Love <fx@gnu.org>
parents: 1972
diff changeset
2171 else /* not greedy */
00db7733320d 1999-12-15 Kenichi Handa <handa@etl.go.jp>
Dave Love <fx@gnu.org>
parents: 1972
diff changeset
2172 { /* I wish the greedy and non-greedy cases could be merged. */
00db7733320d 1999-12-15 Kenichi Handa <handa@etl.go.jp>
Dave Love <fx@gnu.org>
parents: 1972
diff changeset
2173
00db7733320d 1999-12-15 Kenichi Handa <handa@etl.go.jp>
Dave Love <fx@gnu.org>
parents: 1972
diff changeset
2174 if (many_times_ok)
00db7733320d 1999-12-15 Kenichi Handa <handa@etl.go.jp>
Dave Love <fx@gnu.org>
parents: 1972
diff changeset
2175 {
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2176 /* The non-greedy multiple match looks like a repeat..until:
2034
00db7733320d 1999-12-15 Kenichi Handa <handa@etl.go.jp>
Dave Love <fx@gnu.org>
parents: 1972
diff changeset
2177 we only need a conditional jump at the end of the loop */
00db7733320d 1999-12-15 Kenichi Handa <handa@etl.go.jp>
Dave Love <fx@gnu.org>
parents: 1972
diff changeset
2178 GET_BUFFER_SPACE (3);
00db7733320d 1999-12-15 Kenichi Handa <handa@etl.go.jp>
Dave Love <fx@gnu.org>
parents: 1972
diff changeset
2179 STORE_JUMP (on_failure_jump, b, laststart);
00db7733320d 1999-12-15 Kenichi Handa <handa@etl.go.jp>
Dave Love <fx@gnu.org>
parents: 1972
diff changeset
2180 b += 3;
00db7733320d 1999-12-15 Kenichi Handa <handa@etl.go.jp>
Dave Love <fx@gnu.org>
parents: 1972
diff changeset
2181 if (zero_times_ok)
00db7733320d 1999-12-15 Kenichi Handa <handa@etl.go.jp>
Dave Love <fx@gnu.org>
parents: 1972
diff changeset
2182 {
00db7733320d 1999-12-15 Kenichi Handa <handa@etl.go.jp>
Dave Love <fx@gnu.org>
parents: 1972
diff changeset
2183 /* The repeat...until naturally matches one or more.
00db7733320d 1999-12-15 Kenichi Handa <handa@etl.go.jp>
Dave Love <fx@gnu.org>
parents: 1972
diff changeset
2184 To also match zero times, we need to first jump to
00db7733320d 1999-12-15 Kenichi Handa <handa@etl.go.jp>
Dave Love <fx@gnu.org>
parents: 1972
diff changeset
2185 the end of the loop (its conditional jump). */
00db7733320d 1999-12-15 Kenichi Handa <handa@etl.go.jp>
Dave Love <fx@gnu.org>
parents: 1972
diff changeset
2186 GET_BUFFER_SPACE (3);
00db7733320d 1999-12-15 Kenichi Handa <handa@etl.go.jp>
Dave Love <fx@gnu.org>
parents: 1972
diff changeset
2187 INSERT_JUMP (jump, laststart, b);
00db7733320d 1999-12-15 Kenichi Handa <handa@etl.go.jp>
Dave Love <fx@gnu.org>
parents: 1972
diff changeset
2188 b += 3;
00db7733320d 1999-12-15 Kenichi Handa <handa@etl.go.jp>
Dave Love <fx@gnu.org>
parents: 1972
diff changeset
2189 }
00db7733320d 1999-12-15 Kenichi Handa <handa@etl.go.jp>
Dave Love <fx@gnu.org>
parents: 1972
diff changeset
2190 }
00db7733320d 1999-12-15 Kenichi Handa <handa@etl.go.jp>
Dave Love <fx@gnu.org>
parents: 1972
diff changeset
2191 else
00db7733320d 1999-12-15 Kenichi Handa <handa@etl.go.jp>
Dave Love <fx@gnu.org>
parents: 1972
diff changeset
2192 {
00db7733320d 1999-12-15 Kenichi Handa <handa@etl.go.jp>
Dave Love <fx@gnu.org>
parents: 1972
diff changeset
2193 /* non-greedy a?? */
00db7733320d 1999-12-15 Kenichi Handa <handa@etl.go.jp>
Dave Love <fx@gnu.org>
parents: 1972
diff changeset
2194 GET_BUFFER_SPACE (6);
00db7733320d 1999-12-15 Kenichi Handa <handa@etl.go.jp>
Dave Love <fx@gnu.org>
parents: 1972
diff changeset
2195 INSERT_JUMP (jump, laststart, b + 3);
00db7733320d 1999-12-15 Kenichi Handa <handa@etl.go.jp>
Dave Love <fx@gnu.org>
parents: 1972
diff changeset
2196 b += 3;
00db7733320d 1999-12-15 Kenichi Handa <handa@etl.go.jp>
Dave Love <fx@gnu.org>
parents: 1972
diff changeset
2197 INSERT_JUMP (on_failure_jump, laststart, laststart + 6);
00db7733320d 1999-12-15 Kenichi Handa <handa@etl.go.jp>
Dave Love <fx@gnu.org>
parents: 1972
diff changeset
2198 b += 3;
00db7733320d 1999-12-15 Kenichi Handa <handa@etl.go.jp>
Dave Love <fx@gnu.org>
parents: 1972
diff changeset
2199 }
00db7733320d 1999-12-15 Kenichi Handa <handa@etl.go.jp>
Dave Love <fx@gnu.org>
parents: 1972
diff changeset
2200 }
00db7733320d 1999-12-15 Kenichi Handa <handa@etl.go.jp>
Dave Love <fx@gnu.org>
parents: 1972
diff changeset
2201 }
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
2202 break;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
2203
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
2204
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
2205 case '.':
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2206 laststart = b;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2207 BUF_PUSH (anychar);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2208 break;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2209
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2210
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2211 case '[':
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2212 {
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2213 CLEAR_RANGE_TABLE_WORK_USED (range_table_work);
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2214
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2215 if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2216
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2217 /* Ensure that we have enough space to push a charset: the
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2218 opcode, the length count, and the bitset; 34 bytes in all. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
2219 GET_BUFFER_SPACE (34);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
2220
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2221 laststart = b;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2222
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2223 /* We test `*p == '^' twice, instead of using an if
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2224 statement, so we only need one BUF_PUSH. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2225 BUF_PUSH (*p == '^' ? charset_not : charset);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2226 if (*p == '^')
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2227 p++;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2228
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2229 /* Remember the first position in the bracket expression. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2230 p1 = p;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2231
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2232 /* Push the number of bytes in the bitmap. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2233 BUF_PUSH ((1 << BYTEWIDTH) / BYTEWIDTH);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2234
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2235 /* Clear the whole map. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2236 bzero (b, (1 << BYTEWIDTH) / BYTEWIDTH);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2237
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2238 /* charset_not matches newline according to a syntax bit. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2239 if ((re_opcode_t) b[-2] == charset_not
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2240 && (syntax & RE_HAT_LISTS_NOT_NEWLINE))
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2241 SET_LIST_BIT ('\n');
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2242
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2243 /* Read in characters and ranges, setting map bits. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2244 for (;;)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2245 {
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2246 int len;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2247 boolean escaped_char = false;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2248
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2249 if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2250
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2251 PATFETCH (c);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2252
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2253 /* \ might escape characters inside [...] and [^...]. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2254 if ((syntax & RE_BACKSLASH_ESCAPE_IN_LISTS) && c == '\\')
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2255 {
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2256 if (p == pend) FREE_STACK_RETURN (REG_EESCAPE);
679
b088267ea1c8 Clean up whitespace.
Richard Stallman <rms@gnu.org>
parents: 678
diff changeset
2257
b088267ea1c8 Clean up whitespace.
Richard Stallman <rms@gnu.org>
parents: 678
diff changeset
2258 PATFETCH (c);
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2259 escaped_char = true;
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2260 }
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2261 else
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2262 {
992
03e78eed4997 Whitespace change.
Richard Stallman <rms@gnu.org>
parents: 963
diff changeset
2263 /* Could be the end of the bracket expression. If it's
03e78eed4997 Whitespace change.
Richard Stallman <rms@gnu.org>
parents: 963
diff changeset
2264 not (i.e., when the bracket expression is `[]' so
03e78eed4997 Whitespace change.
Richard Stallman <rms@gnu.org>
parents: 963
diff changeset
2265 far), the ']' character bit gets set way below. */
03e78eed4997 Whitespace change.
Richard Stallman <rms@gnu.org>
parents: 963
diff changeset
2266 if (c == ']' && p != p1 + 1)
03e78eed4997 Whitespace change.
Richard Stallman <rms@gnu.org>
parents: 963
diff changeset
2267 break;
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2268 }
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2269
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2270 /* If C indicates start of multibyte char, get the
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2271 actual character code in C, and set the pattern
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2272 pointer P to the next character boundary. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2273 if (bufp->multibyte && BASE_LEADING_CODE_P (c))
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2274 {
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2275 PATUNFETCH;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2276 c = STRING_CHAR_AND_LENGTH (p, pend - p, len);
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2277 p += len;
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2278 }
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2279 /* What should we do for the character which is
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2280 greater than 0x7F, but not BASE_LEADING_CODE_P?
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2281 XXX */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2282
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2283 /* See if we're at the beginning of a possible character
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2284 class. */
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2285
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2286 else if (!escaped_char &&
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2287 syntax & RE_CHAR_CLASSES && c == '[' && *p == ':')
992
03e78eed4997 Whitespace change.
Richard Stallman <rms@gnu.org>
parents: 963
diff changeset
2288 {
03e78eed4997 Whitespace change.
Richard Stallman <rms@gnu.org>
parents: 963
diff changeset
2289 /* Leave room for the null. */
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2290 char str[CHAR_CLASS_MAX_LENGTH + 1];
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2291
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2292 PATFETCH (c);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2293 c1 = 0;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2294
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2295 /* If pattern is `[[:'. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2296 if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2297
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2298 for (;;)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2299 {
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2300 PATFETCH (c);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2301 if (c == ':' || c == ']' || p == pend
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2302 || c1 == CHAR_CLASS_MAX_LENGTH)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2303 break;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2304 str[c1++] = c;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2305 }
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2306 str[c1] = '\0';
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2307
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2308 /* If isn't a word bracketed by `[:' and `:]':
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2309 undo the ending character, the letters, and
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2310 leave the leading `:' and `[' (but set bits for
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2311 them). */
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2312 if (c == ':' && *p == ']')
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2313 {
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2314 int ch;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2315 boolean is_alnum = STREQ (str, "alnum");
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2316 boolean is_alpha = STREQ (str, "alpha");
1965
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
2317 boolean is_ascii = STREQ (str, "ascii");
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2318 boolean is_blank = STREQ (str, "blank");
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2319 boolean is_cntrl = STREQ (str, "cntrl");
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2320 boolean is_digit = STREQ (str, "digit");
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2321 boolean is_graph = STREQ (str, "graph");
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2322 boolean is_lower = STREQ (str, "lower");
1965
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
2323 boolean is_multibyte = STREQ (str, "multibyte");
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
2324 boolean is_nonascii = STREQ (str, "nonascii");
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2325 boolean is_print = STREQ (str, "print");
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2326 boolean is_punct = STREQ (str, "punct");
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2327 boolean is_space = STREQ (str, "space");
1965
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
2328 boolean is_unibyte = STREQ (str, "unibyte");
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2329 boolean is_upper = STREQ (str, "upper");
1965
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
2330 boolean is_word = STREQ (str, "word");
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2331 boolean is_xdigit = STREQ (str, "xdigit");
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2332
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2333 if (!IS_CHAR_CLASS (str))
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
2334 FREE_STACK_RETURN (REG_ECTYPE);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
2335
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2336 /* Throw away the ] at the end of the character
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2337 class. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2338 PATFETCH (c);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2339
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2340 if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2341
1933
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
2342 /* Most character classes in a multibyte match
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
2343 just set a flag. Exceptions are is_blank,
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
2344 is_digit, is_cntrl, and is_xdigit, since
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
2345 they can only match ASCII characters. We
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
2346 don't need to handle them for multibyte. */
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
2347
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
2348 if (bufp->multibyte)
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
2349 {
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
2350 int bit = 0;
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
2351
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
2352 if (is_alnum) bit = BIT_ALNUM;
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
2353 if (is_alpha) bit = BIT_ALPHA;
1965
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
2354 if (is_ascii) bit = BIT_ASCII;
1933
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
2355 if (is_graph) bit = BIT_GRAPH;
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
2356 if (is_lower) bit = BIT_LOWER;
1965
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
2357 if (is_multibyte) bit = BIT_MULTIBYTE;
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
2358 if (is_nonascii) bit = BIT_NONASCII;
1933
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
2359 if (is_print) bit = BIT_PRINT;
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
2360 if (is_punct) bit = BIT_PUNCT;
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
2361 if (is_space) bit = BIT_SPACE;
1965
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
2362 if (is_unibyte) bit = BIT_UNIBYTE;
1933
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
2363 if (is_upper) bit = BIT_UPPER;
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
2364 if (is_word) bit = BIT_WORD;
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
2365 if (bit)
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
2366 SET_RANGE_TABLE_WORK_AREA_BIT (range_table_work,
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
2367 bit);
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
2368 }
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
2369
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
2370 /* Handle character classes for ASCII characters. */
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2371 for (ch = 0; ch < 1 << BYTEWIDTH; ch++)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2372 {
692
1036844e8833 (regex_compile): Use TRANSLATE before calling SET_LIST_BIT.
Richard Stallman <rms@gnu.org>
parents: 680
diff changeset
2373 int translated = TRANSLATE (ch);
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
2374 /* This was split into 3 if's to
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
2375 avoid an arbitrary limit in some compiler. */
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2376 if ( (is_alnum && ISALNUM (ch))
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2377 || (is_alpha && ISALPHA (ch))
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2378 || (is_blank && ISBLANK (ch))
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2379 || (is_cntrl && ISCNTRL (ch)))
692
1036844e8833 (regex_compile): Use TRANSLATE before calling SET_LIST_BIT.
Richard Stallman <rms@gnu.org>
parents: 680
diff changeset
2380 SET_LIST_BIT (translated);
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
2381 if ( (is_digit && ISDIGIT (ch))
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2382 || (is_graph && ISGRAPH (ch))
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2383 || (is_lower && ISLOWER (ch))
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2384 || (is_print && ISPRINT (ch)))
692
1036844e8833 (regex_compile): Use TRANSLATE before calling SET_LIST_BIT.
Richard Stallman <rms@gnu.org>
parents: 680
diff changeset
2385 SET_LIST_BIT (translated);
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
2386 if ( (is_punct && ISPUNCT (ch))
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2387 || (is_space && ISSPACE (ch))
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2388 || (is_upper && ISUPPER (ch))
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2389 || (is_xdigit && ISXDIGIT (ch)))
692
1036844e8833 (regex_compile): Use TRANSLATE before calling SET_LIST_BIT.
Richard Stallman <rms@gnu.org>
parents: 680
diff changeset
2390 SET_LIST_BIT (translated);
1965
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
2391 if ( (is_ascii && IS_REAL_ASCII (ch))
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
2392 || (is_nonascii && !IS_REAL_ASCII (ch))
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
2393 || (is_unibyte && ISUNIBYTE (ch))
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
2394 || (is_multibyte && !ISUNIBYTE (ch)))
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
2395 SET_LIST_BIT (translated);
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
2396
1933
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
2397 if ( (is_word && ISWORD (ch)))
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
2398 SET_LIST_BIT (translated);
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2399 }
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2400
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2401 /* Repeat the loop. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2402 continue;
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2403 }
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2404 else
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2405 {
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2406 c1++;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2407 while (c1--)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2408 PATUNFETCH;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2409 SET_LIST_BIT ('[');
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2410
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2411 /* Because the `:' may starts the range, we
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2412 can't simply set bit and repeat the loop.
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2413 Instead, just set it to C and handle below. */
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2414 c = ':';
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2415 }
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2416 }
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2417
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2418 if (p < pend && p[0] == '-' && p[1] != ']')
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2419 {
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2420
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2421 /* Discard the `-'. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2422 PATFETCH (c1);
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2423
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2424 /* Fetch the character which ends the range. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2425 PATFETCH (c1);
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2426 if (bufp->multibyte && BASE_LEADING_CODE_P (c1))
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2427 {
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2428 PATUNFETCH;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2429 c1 = STRING_CHAR_AND_LENGTH (p, pend - p, len);
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2430 p += len;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2431 }
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2432
1296
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
2433 if (SINGLE_BYTE_CHAR_P (c)
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
2434 && ! SINGLE_BYTE_CHAR_P (c1))
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
2435 {
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
2436 /* Handle a range such as \177-\377 in multibyte mode.
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
2437 Split that into two ranges,,
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
2438 the low one ending at 0237, and the high one
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
2439 starting at ...040. */
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2440 /* Unless I'm missing something,
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2441 this line is useless. -sm
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2442 int c1_base = (c1 & ~0177) | 040; */
1296
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
2443 SET_RANGE_TABLE_WORK_AREA (range_table_work, c, c1);
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
2444 c1 = 0237;
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
2445 }
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
2446 else if (!SAME_CHARSET_P (c, c1))
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2447 FREE_STACK_RETURN (REG_ERANGE);
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2448 }
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2449 else
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2450 /* Range from C to C. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2451 c1 = c;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2452
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2453 /* Set the range ... */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2454 if (SINGLE_BYTE_CHAR_P (c))
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2455 /* ... into bitmap. */
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2456 {
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2457 unsigned this_char;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2458 int range_start = c, range_end = c1;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2459
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2460 /* If the start is after the end, the range is empty. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2461 if (range_start > range_end)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2462 {
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2463 if (syntax & RE_NO_EMPTY_RANGES)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2464 FREE_STACK_RETURN (REG_ERANGE);
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2465 /* Else, repeat the loop. */
679
b088267ea1c8 Clean up whitespace.
Richard Stallman <rms@gnu.org>
parents: 678
diff changeset
2466 }
b088267ea1c8 Clean up whitespace.
Richard Stallman <rms@gnu.org>
parents: 678
diff changeset
2467 else
b088267ea1c8 Clean up whitespace.
Richard Stallman <rms@gnu.org>
parents: 678
diff changeset
2468 {
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2469 for (this_char = range_start; this_char <= range_end;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2470 this_char++)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2471 SET_LIST_BIT (TRANSLATE (this_char));
1296
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
2472 }
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2473 }
679
b088267ea1c8 Clean up whitespace.
Richard Stallman <rms@gnu.org>
parents: 678
diff changeset
2474 else
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2475 /* ... into range table. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2476 SET_RANGE_TABLE_WORK_AREA (range_table_work, c, c1);
679
b088267ea1c8 Clean up whitespace.
Richard Stallman <rms@gnu.org>
parents: 678
diff changeset
2477 }
b088267ea1c8 Clean up whitespace.
Richard Stallman <rms@gnu.org>
parents: 678
diff changeset
2478
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2479 /* Discard any (non)matching list bytes that are all 0 at the
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2480 end of the map. Decrease the map-length byte too. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2481 while ((int) b[-1] > 0 && b[b[-1] - 1] == 0)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2482 b[-1]--;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2483 b += b[-1];
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2484
1933
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
2485 /* Build real range table from work area. */
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
2486 if (RANGE_TABLE_WORK_USED (range_table_work)
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
2487 || RANGE_TABLE_WORK_BITS (range_table_work))
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2488 {
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2489 int i;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2490 int used = RANGE_TABLE_WORK_USED (range_table_work);
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2491
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2492 /* Allocate space for COUNT + RANGE_TABLE. Needs two
1933
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
2493 bytes for flags, two for COUNT, and three bytes for
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
2494 each character. */
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
2495 GET_BUFFER_SPACE (4 + used * 3);
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2496
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2497 /* Indicate the existence of range table. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2498 laststart[1] |= 0x80;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2499
1933
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
2500 /* Store the character class flag bits into the range table.
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
2501 If not in emacs, these flag bits are always 0. */
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
2502 *b++ = RANGE_TABLE_WORK_BITS (range_table_work) & 0xff;
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
2503 *b++ = RANGE_TABLE_WORK_BITS (range_table_work) >> 8;
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
2504
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2505 STORE_NUMBER_AND_INCR (b, used / 2);
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2506 for (i = 0; i < used; i++)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2507 STORE_CHARACTER_AND_INCR
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2508 (b, RANGE_TABLE_WORK_ELT (range_table_work, i));
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2509 }
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2510 }
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2511 break;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
2512
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
2513
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
2514 case '(':
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2515 if (syntax & RE_NO_BK_PARENS)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2516 goto handle_open;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2517 else
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2518 goto normal_char;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2519
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2520
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2521 case ')':
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2522 if (syntax & RE_NO_BK_PARENS)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2523 goto handle_close;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2524 else
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2525 goto normal_char;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2526
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2527
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2528 case '\n':
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2529 if (syntax & RE_NEWLINE_ALT)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2530 goto handle_alt;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2531 else
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2532 goto normal_char;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
2533
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
2534
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
2535 case '|':
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2536 if (syntax & RE_NO_BK_VBAR)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2537 goto handle_alt;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2538 else
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2539 goto normal_char;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2540
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2541
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2542 case '{':
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2543 if (syntax & RE_INTERVALS && syntax & RE_NO_BK_BRACES)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2544 goto handle_interval;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2545 else
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2546 goto normal_char;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2547
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2548
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2549 case '\\':
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2550 if (p == pend) FREE_STACK_RETURN (REG_EESCAPE);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2551
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2552 /* Do not translate the character after the \, so that we can
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2553 distinguish, e.g., \B from \b, even if we normally would
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2554 translate, e.g., B to b. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2555 PATFETCH_RAW (c);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2556
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2557 switch (c)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2558 {
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2559 case '(':
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2560 if (syntax & RE_NO_BK_PARENS)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2561 goto normal_backslash;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2562
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2563 handle_open:
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2564 {
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2565 int shy = 0;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2566 if (p+1 < pend)
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2567 {
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2568 /* Look for a special (?...) construct */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2569 PATFETCH (c);
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2570 if ((syntax & RE_SHY_GROUPS) && c == '?')
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2571 {
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2572 PATFETCH (c);
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2573 switch (c)
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2574 {
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2575 case ':': shy = 1; break;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2576 default:
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2577 /* Only (?:...) is supported right now. */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2578 FREE_STACK_RETURN (REG_BADPAT);
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2579 }
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2580 }
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2581 else PATUNFETCH;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2582 }
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2583
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2584 if (!shy)
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2585 {
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2586 bufp->re_nsub++;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2587 regnum++;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2588 }
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2589
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2590 if (COMPILE_STACK_FULL)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2591 {
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2592 RETALLOC (compile_stack.stack, compile_stack.size << 1,
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2593 compile_stack_elt_t);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2594 if (compile_stack.stack == NULL) return REG_ESPACE;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2595
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2596 compile_stack.size <<= 1;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2597 }
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2598
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2599 /* These are the values to restore when we hit end of this
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2600 group. They are all relative offsets, so that if the
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2601 whole pattern moves because of realloc, they will still
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2602 be valid. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2603 COMPILE_STACK_TOP.begalt_offset = begalt - bufp->buffer;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2604 COMPILE_STACK_TOP.fixup_alt_jump
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2605 = fixup_alt_jump ? fixup_alt_jump - bufp->buffer + 1 : 0;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2606 COMPILE_STACK_TOP.laststart_offset = b - bufp->buffer;
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2607 COMPILE_STACK_TOP.regnum = shy ? -regnum : regnum;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2608
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2609 /* Do not push a
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2610 start_memory for groups beyond the last one we can
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2611 represent in the compiled pattern. */
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2612 if (regnum <= MAX_REGNUM && !shy)
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2613 BUF_PUSH_2 (start_memory, regnum);
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2614
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2615 compile_stack.avail++;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2616
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2617 fixup_alt_jump = 0;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2618 laststart = 0;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2619 begalt = b;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
2620 /* If we've reached MAX_REGNUM groups, then this open
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
2621 won't actually generate any code, so we'll have to
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
2622 clear pending_exact explicitly. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
2623 pending_exact = 0;
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2624 break;
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2625 }
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2626
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2627 case ')':
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2628 if (syntax & RE_NO_BK_PARENS) goto normal_backslash;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2629
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2630 if (COMPILE_STACK_EMPTY)
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2631 {
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2632 if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD)
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2633 goto normal_backslash;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2634 else
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2635 FREE_STACK_RETURN (REG_ERPAREN);
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2636 }
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2637
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2638 handle_close:
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2639 FIXUP_ALT_JUMP ();
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2640
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2641 /* See similar code for backslashed left paren above. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2642 if (COMPILE_STACK_EMPTY)
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2643 {
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2644 if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD)
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2645 goto normal_char;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2646 else
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2647 FREE_STACK_RETURN (REG_ERPAREN);
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2648 }
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2649
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2650 /* Since we just checked for an empty stack above, this
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2651 ``can't happen''. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2652 assert (compile_stack.avail != 0);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2653 {
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2654 /* We don't just want to restore into `regnum', because
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2655 later groups should continue to be numbered higher,
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2656 as in `(ab)c(de)' -- the second group is #2. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2657 regnum_t this_group_regnum;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2658
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2659 compile_stack.avail--;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2660 begalt = bufp->buffer + COMPILE_STACK_TOP.begalt_offset;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2661 fixup_alt_jump
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2662 = COMPILE_STACK_TOP.fixup_alt_jump
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2663 ? bufp->buffer + COMPILE_STACK_TOP.fixup_alt_jump - 1
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2664 : 0;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2665 laststart = bufp->buffer + COMPILE_STACK_TOP.laststart_offset;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2666 this_group_regnum = COMPILE_STACK_TOP.regnum;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
2667 /* If we've reached MAX_REGNUM groups, then this open
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
2668 won't actually generate any code, so we'll have to
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
2669 clear pending_exact explicitly. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
2670 pending_exact = 0;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
2671
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2672 /* We're at the end of the group, so now we know how many
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2673 groups were inside this one. */
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2674 if (this_group_regnum <= MAX_REGNUM && this_group_regnum > 0)
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2675 BUF_PUSH_2 (stop_memory, this_group_regnum);
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2676 }
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2677 break;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2678
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2679
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2680 case '|': /* `\|'. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2681 if (syntax & RE_LIMITED_OPS || syntax & RE_NO_BK_VBAR)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2682 goto normal_backslash;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2683 handle_alt:
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2684 if (syntax & RE_LIMITED_OPS)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2685 goto normal_char;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2686
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2687 /* Insert before the previous alternative a jump which
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2688 jumps to this alternative if the former fails. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2689 GET_BUFFER_SPACE (3);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2690 INSERT_JUMP (on_failure_jump, begalt, b + 6);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2691 pending_exact = 0;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2692 b += 3;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2693
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2694 /* The alternative before this one has a jump after it
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2695 which gets executed if it gets matched. Adjust that
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2696 jump so it will jump to this alternative's analogous
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2697 jump (put in below, which in turn will jump to the next
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2698 (if any) alternative's such jump, etc.). The last such
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2699 jump jumps to the correct final destination. A picture:
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2700 _____ _____
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2701 | | | |
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2702 | v | v
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2703 a | b | c
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2704
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2705 If we are at `b', then fixup_alt_jump right now points to a
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2706 three-byte space after `a'. We'll put in the jump, set
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2707 fixup_alt_jump to right after `b', and leave behind three
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2708 bytes which we'll fill in when we get to after `c'. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2709
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
2710 FIXUP_ALT_JUMP ();
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2711
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2712 /* Mark and leave space for a jump after this alternative,
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2713 to be filled in later either by next alternative or
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2714 when know we're at the end of a series of alternatives. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2715 fixup_alt_jump = b;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2716 GET_BUFFER_SPACE (3);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2717 b += 3;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2718
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2719 laststart = 0;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2720 begalt = b;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2721 break;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2722
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2723
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2724 case '{':
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2725 /* If \{ is a literal. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2726 if (!(syntax & RE_INTERVALS)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2727 /* If we're at `\{' and it's not the open-interval
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2728 operator. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2729 || ((syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES))
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2730 || (p - 2 == pattern && p == pend))
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2731 goto normal_backslash;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2732
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2733 handle_interval:
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2734 {
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2735 /* If got here, then the syntax allows intervals. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2736
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2737 /* At least (most) this many matches must be made. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2738 int lower_bound = -1, upper_bound = -1;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2739
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2740 beg_interval = p - 1;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2741
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2742 if (p == pend)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2743 {
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2744 if (syntax & RE_NO_BK_BRACES)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2745 goto unfetch_interval;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2746 else
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2747 FREE_STACK_RETURN (REG_EBRACE);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2748 }
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2749
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2750 GET_UNSIGNED_NUMBER (lower_bound);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2751
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2752 if (c == ',')
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2753 {
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2754 GET_UNSIGNED_NUMBER (upper_bound);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2755 if (upper_bound < 0) upper_bound = RE_DUP_MAX;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2756 }
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2757 else
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2758 /* Interval such as `{1}' => match exactly once. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2759 upper_bound = lower_bound;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2760
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2761 if (lower_bound < 0 || upper_bound > RE_DUP_MAX
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2762 || lower_bound > upper_bound)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2763 {
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2764 if (syntax & RE_NO_BK_BRACES)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2765 goto unfetch_interval;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2766 else
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2767 FREE_STACK_RETURN (REG_BADBR);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2768 }
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2769
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2770 if (!(syntax & RE_NO_BK_BRACES))
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2771 {
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2772 if (c != '\\') FREE_STACK_RETURN (REG_EBRACE);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2773
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2774 PATFETCH (c);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2775 }
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2776
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2777 if (c != '}')
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2778 {
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2779 if (syntax & RE_NO_BK_BRACES)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2780 goto unfetch_interval;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2781 else
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2782 FREE_STACK_RETURN (REG_BADBR);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2783 }
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2784
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2785 /* We just parsed a valid interval. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2786
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2787 /* If it's invalid to have no preceding re. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2788 if (!laststart)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2789 {
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2790 if (syntax & RE_CONTEXT_INVALID_OPS)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2791 FREE_STACK_RETURN (REG_BADRPT);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2792 else if (syntax & RE_CONTEXT_INDEP_OPS)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2793 laststart = b;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2794 else
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2795 goto unfetch_interval;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2796 }
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2797
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2798 /* If the upper bound is zero, don't want to succeed at
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2799 all; jump from `laststart' to `b + 3', which will be
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2800 the end of the buffer after we insert the jump. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2801 if (upper_bound == 0)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2802 {
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2803 GET_BUFFER_SPACE (3);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2804 INSERT_JUMP (jump, laststart, b + 3);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2805 b += 3;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2806 }
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2807
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2808 /* Otherwise, we have a nontrivial interval. When
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2809 we're all done, the pattern will look like:
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2810 set_number_at <jump count> <upper bound>
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2811 set_number_at <succeed_n count> <lower bound>
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2812 succeed_n <after jump addr> <succeed_n count>
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2813 <body of loop>
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2814 jump_n <succeed_n addr> <jump count>
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2815 (The upper bound and `jump_n' are omitted if
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2816 `upper_bound' is 1, though.) */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2817 else
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2818 { /* If the upper bound is > 1, we need to insert
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2819 more at the end of the loop. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2820 unsigned nbytes = 10 + (upper_bound > 1) * 10;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2821
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2822 GET_BUFFER_SPACE (nbytes);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2823
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2824 /* Initialize lower bound of the `succeed_n', even
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2825 though it will be set during matching by its
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2826 attendant `set_number_at' (inserted next),
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2827 because `re_compile_fastmap' needs to know.
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2828 Jump to the `jump_n' we might insert below. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2829 INSERT_JUMP2 (succeed_n, laststart,
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2830 b + 5 + (upper_bound > 1) * 5,
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2831 lower_bound);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2832 b += 5;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2833
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2834 /* Code to initialize the lower bound. Insert
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2835 before the `succeed_n'. The `5' is the last two
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2836 bytes of this `set_number_at', plus 3 bytes of
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2837 the following `succeed_n'. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2838 insert_op2 (set_number_at, laststart, 5, lower_bound, b);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2839 b += 5;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2840
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2841 if (upper_bound > 1)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2842 { /* More than one repetition is allowed, so
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2843 append a backward jump to the `succeed_n'
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2844 that starts this interval.
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2845
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2846 When we've reached this during matching,
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2847 we'll have matched the interval once, so
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2848 jump back only `upper_bound - 1' times. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2849 STORE_JUMP2 (jump_n, b, laststart + 5,
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2850 upper_bound - 1);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2851 b += 5;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2852
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2853 /* The location we want to set is the second
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2854 parameter of the `jump_n'; that is `b-2' as
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2855 an absolute address. `laststart' will be
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2856 the `set_number_at' we're about to insert;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2857 `laststart+3' the number to set, the source
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2858 for the relative address. But we are
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2859 inserting into the middle of the pattern --
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2860 so everything is getting moved up by 5.
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2861 Conclusion: (b - 2) - (laststart + 3) + 5,
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2862 i.e., b - laststart.
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2863
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2864 We insert this at the beginning of the loop
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2865 so that if we fail during matching, we'll
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2866 reinitialize the bounds. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2867 insert_op2 (set_number_at, laststart, b - laststart,
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2868 upper_bound - 1, b);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2869 b += 5;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2870 }
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2871 }
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2872 pending_exact = 0;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2873 beg_interval = NULL;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2874 }
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2875 break;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2876
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2877 unfetch_interval:
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2878 /* If an invalid interval, match the characters as literals. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2879 assert (beg_interval);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2880 p = beg_interval;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2881 beg_interval = NULL;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2882
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2883 /* normal_char and normal_backslash need `c'. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2884 PATFETCH (c);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2885
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2886 if (!(syntax & RE_NO_BK_BRACES))
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2887 {
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2888 if (p > pattern && p[-1] == '\\')
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2889 goto normal_backslash;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2890 }
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2891 goto normal_char;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
2892
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
2893 #ifdef emacs
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2894 /* There is no way to specify the before_dot and after_dot
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2895 operators. rms says this is ok. --karl */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2896 case '=':
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2897 BUF_PUSH (at_dot);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2898 break;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2899
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2900 case 's':
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2901 laststart = b;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2902 PATFETCH (c);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2903 BUF_PUSH_2 (syntaxspec, syntax_spec_code[c]);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2904 break;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2905
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2906 case 'S':
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2907 laststart = b;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2908 PATFETCH (c);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2909 BUF_PUSH_2 (notsyntaxspec, syntax_spec_code[c]);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2910 break;
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2911
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2912 case 'c':
679
b088267ea1c8 Clean up whitespace.
Richard Stallman <rms@gnu.org>
parents: 678
diff changeset
2913 laststart = b;
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2914 PATFETCH_RAW (c);
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2915 BUF_PUSH_2 (categoryspec, c);
679
b088267ea1c8 Clean up whitespace.
Richard Stallman <rms@gnu.org>
parents: 678
diff changeset
2916 break;
b088267ea1c8 Clean up whitespace.
Richard Stallman <rms@gnu.org>
parents: 678
diff changeset
2917
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2918 case 'C':
679
b088267ea1c8 Clean up whitespace.
Richard Stallman <rms@gnu.org>
parents: 678
diff changeset
2919 laststart = b;
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2920 PATFETCH_RAW (c);
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
2921 BUF_PUSH_2 (notcategoryspec, c);
679
b088267ea1c8 Clean up whitespace.
Richard Stallman <rms@gnu.org>
parents: 678
diff changeset
2922 break;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
2923 #endif /* emacs */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
2924
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
2925
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2926 case 'w':
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2927 laststart = b;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2928 BUF_PUSH (wordchar);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2929 break;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2930
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2931
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2932 case 'W':
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2933 laststart = b;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2934 BUF_PUSH (notwordchar);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2935 break;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2936
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2937
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2938 case '<':
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2939 BUF_PUSH (wordbeg);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2940 break;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2942 case '>':
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2943 BUF_PUSH (wordend);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2944 break;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2945
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2946 case 'b':
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2947 BUF_PUSH (wordbound);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2948 break;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2949
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2950 case 'B':
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2951 BUF_PUSH (notwordbound);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2952 break;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2953
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2954 case '`':
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2955 BUF_PUSH (begbuf);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2956 break;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2957
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2958 case '\'':
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2959 BUF_PUSH (endbuf);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2960 break;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2961
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2962 case '1': case '2': case '3': case '4': case '5':
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2963 case '6': case '7': case '8': case '9':
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2964 if (syntax & RE_NO_BK_REFS)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2965 goto normal_char;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2966
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2967 c1 = c - '0';
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2968
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2969 if (c1 > regnum)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2970 FREE_STACK_RETURN (REG_ESUBREG);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2971
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2972 /* Can't back reference to a subexpression if inside of it. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2973 if (group_in_compile_stack (compile_stack, c1))
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2974 goto normal_char;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2975
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2976 laststart = b;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2977 BUF_PUSH_2 (duplicate, c1);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2978 break;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2979
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2980
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2981 case '+':
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2982 case '?':
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2983 if (syntax & RE_BK_PLUS_QM)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2984 goto handle_plus;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2985 else
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2986 goto normal_backslash;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2987
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2988 default:
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2989 normal_backslash:
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2990 /* You might think it would be useful for \ to mean
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2991 not to translate; but if we don't translate it
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2992 it will never match anything. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2993 c = TRANSLATE (c);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2994 goto normal_char;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2995 }
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
2996 break;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
2997
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
2998
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
2999 default:
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3000 /* Expects the character in `c'. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3001 normal_char:
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3002 p1 = p - 1; /* P1 points the head of C. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3003 #ifdef emacs
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3004 if (bufp->multibyte)
1545
84951ef7a5ed (regex_compile): Handle translation of multibyte
Karl Heuer <kwzh@gnu.org>
parents: 1440
diff changeset
3005 {
84951ef7a5ed (regex_compile): Handle translation of multibyte
Karl Heuer <kwzh@gnu.org>
parents: 1440
diff changeset
3006 c = STRING_CHAR (p1, pend - p1);
84951ef7a5ed (regex_compile): Handle translation of multibyte
Karl Heuer <kwzh@gnu.org>
parents: 1440
diff changeset
3007 c = TRANSLATE (c);
84951ef7a5ed (regex_compile): Handle translation of multibyte
Karl Heuer <kwzh@gnu.org>
parents: 1440
diff changeset
3008 /* Set P to the next character boundary. */
84951ef7a5ed (regex_compile): Handle translation of multibyte
Karl Heuer <kwzh@gnu.org>
parents: 1440
diff changeset
3009 p += MULTIBYTE_FORM_LENGTH (p1, pend - p1) - 1;
84951ef7a5ed (regex_compile): Handle translation of multibyte
Karl Heuer <kwzh@gnu.org>
parents: 1440
diff changeset
3010 }
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3011 #endif
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3012 /* If no exactn currently being built. */
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3013 if (!pending_exact
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3014
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3015 /* If last exactn not at current position. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3016 || pending_exact + *pending_exact + 1 != b
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3017
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3018 /* We have only one byte following the exactn for the count. */
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3019 || *pending_exact >= (1 << BYTEWIDTH) - (p - p1)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3020
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3021 /* If followed by a repetition operator. */
1342
e5cbc689bc64 (regex_compile): When checking after exactn
Richard Stallman <rms@gnu.org>
parents: 1335
diff changeset
3022 || (p != pend && (*p == '*' || *p == '^'))
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3023 || ((syntax & RE_BK_PLUS_QM)
1342
e5cbc689bc64 (regex_compile): When checking after exactn
Richard Stallman <rms@gnu.org>
parents: 1335
diff changeset
3024 ? p + 1 < pend && *p == '\\' && (p[1] == '+' || p[1] == '?')
e5cbc689bc64 (regex_compile): When checking after exactn
Richard Stallman <rms@gnu.org>
parents: 1335
diff changeset
3025 : p != pend && (*p == '+' || *p == '?'))
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3026 || ((syntax & RE_INTERVALS)
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3027 && ((syntax & RE_NO_BK_BRACES)
1342
e5cbc689bc64 (regex_compile): When checking after exactn
Richard Stallman <rms@gnu.org>
parents: 1335
diff changeset
3028 ? p != pend && *p == '{'
e5cbc689bc64 (regex_compile): When checking after exactn
Richard Stallman <rms@gnu.org>
parents: 1335
diff changeset
3029 : p + 1 < pend && p[0] == '\\' && p[1] == '{')))
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3030 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3031 /* Start building a new exactn. */
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
3032
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3033 laststart = b;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3034
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3035 BUF_PUSH_2 (exactn, 0);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3036 pending_exact = b - 1;
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3037 }
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3038
1545
84951ef7a5ed (regex_compile): Handle translation of multibyte
Karl Heuer <kwzh@gnu.org>
parents: 1440
diff changeset
3039 #ifdef emacs
84951ef7a5ed (regex_compile): Handle translation of multibyte
Karl Heuer <kwzh@gnu.org>
parents: 1440
diff changeset
3040 if (! SINGLE_BYTE_CHAR_P (c))
84951ef7a5ed (regex_compile): Handle translation of multibyte
Karl Heuer <kwzh@gnu.org>
parents: 1440
diff changeset
3041 {
2034
00db7733320d 1999-12-15 Kenichi Handa <handa@etl.go.jp>
Dave Love <fx@gnu.org>
parents: 1972
diff changeset
3042 unsigned char str[MAX_MULTIBYTE_LENGTH];
00db7733320d 1999-12-15 Kenichi Handa <handa@etl.go.jp>
Dave Love <fx@gnu.org>
parents: 1972
diff changeset
3043 int i = CHAR_STRING (c, str);
1545
84951ef7a5ed (regex_compile): Handle translation of multibyte
Karl Heuer <kwzh@gnu.org>
parents: 1440
diff changeset
3044 int j;
84951ef7a5ed (regex_compile): Handle translation of multibyte
Karl Heuer <kwzh@gnu.org>
parents: 1440
diff changeset
3045 for (j = 0; j < i; j++)
84951ef7a5ed (regex_compile): Handle translation of multibyte
Karl Heuer <kwzh@gnu.org>
parents: 1440
diff changeset
3046 {
84951ef7a5ed (regex_compile): Handle translation of multibyte
Karl Heuer <kwzh@gnu.org>
parents: 1440
diff changeset
3047 BUF_PUSH (str[j]);
84951ef7a5ed (regex_compile): Handle translation of multibyte
Karl Heuer <kwzh@gnu.org>
parents: 1440
diff changeset
3048 (*pending_exact)++;
84951ef7a5ed (regex_compile): Handle translation of multibyte
Karl Heuer <kwzh@gnu.org>
parents: 1440
diff changeset
3049 }
84951ef7a5ed (regex_compile): Handle translation of multibyte
Karl Heuer <kwzh@gnu.org>
parents: 1440
diff changeset
3050 }
84951ef7a5ed (regex_compile): Handle translation of multibyte
Karl Heuer <kwzh@gnu.org>
parents: 1440
diff changeset
3051 else
84951ef7a5ed (regex_compile): Handle translation of multibyte
Karl Heuer <kwzh@gnu.org>
parents: 1440
diff changeset
3052 #endif
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3053 {
1296
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
3054 BUF_PUSH (c);
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
3055 (*pending_exact)++;
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3056 }
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3057 break;
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3058 } /* switch (c) */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3059 } /* while p != pend */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3060
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
3061
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3062 /* Through the pattern now. */
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
3063
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3064 FIXUP_ALT_JUMP ();
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3065
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
3066 if (!COMPILE_STACK_EMPTY)
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3067 FREE_STACK_RETURN (REG_EPAREN);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3068
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3069 /* If we don't want backtracking, force success
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3070 the first time we reach the end of the compiled pattern. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3071 if (syntax & RE_NO_POSIX_BACKTRACKING)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3072 BUF_PUSH (succeed);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3073
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3074 free (compile_stack.stack);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3075
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3076 /* We have succeeded; set the length of the buffer. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3077 bufp->used = b - bufp->buffer;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3078
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3079 #ifdef DEBUG
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3080 if (debug)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3081 {
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3082 re_compile_fastmap (bufp);
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3083 DEBUG_PRINT1 ("\nCompiled pattern: \n");
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3084 print_compiled_pattern (bufp);
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3085 /* debug = 0; */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3086 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3087 #endif /* DEBUG */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3088
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3089 #ifndef MATCH_MAY_ALLOCATE
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3090 /* Initialize the failure stack to the largest possible stack. This
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3091 isn't necessary unless we're trying to avoid calling alloca in
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3092 the search and match routines. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3093 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3094 int num_regs = bufp->re_nsub + 1;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3095
1156
8e1cbb305ddc (TYPICAL_FAILURE_SIZE): Renamed from MAX_FAILURE_ITEMS.
Karl Heuer <kwzh@gnu.org>
parents: 992
diff changeset
3096 if (fail_stack.size < re_max_failures * TYPICAL_FAILURE_SIZE)
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3097 {
1297
ac5117571763 (regex_compile) [!MATCH_MAY_ALLOCATE]: Fix paren error.
Richard Stallman <rms@gnu.org>
parents: 1296
diff changeset
3098 fail_stack.size = re_max_failures * TYPICAL_FAILURE_SIZE;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3099
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3100 if (! fail_stack.stack)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3101 fail_stack.stack
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
3102 = (fail_stack_elt_t *) malloc (fail_stack.size
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3103 * sizeof (fail_stack_elt_t));
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3104 else
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3105 fail_stack.stack
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3106 = (fail_stack_elt_t *) realloc (fail_stack.stack,
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3107 (fail_stack.size
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3108 * sizeof (fail_stack_elt_t)));
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3109 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3110
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3111 regex_grow_registers (num_regs);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3112 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3113 #endif /* not MATCH_MAY_ALLOCATE */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3114
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3115 return REG_NOERROR;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3116 } /* regex_compile */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3117
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3118 /* Subroutines for `regex_compile'. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3119
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3120 /* Store OP at LOC followed by two-byte integer parameter ARG. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3121
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3122 static void
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3123 store_op1 (op, loc, arg)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3124 re_opcode_t op;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3125 unsigned char *loc;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3126 int arg;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3127 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3128 *loc = (unsigned char) op;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3129 STORE_NUMBER (loc + 1, arg);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3130 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3131
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3132
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3133 /* Like `store_op1', but for two two-byte parameters ARG1 and ARG2. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3134
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3135 static void
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3136 store_op2 (op, loc, arg1, arg2)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3137 re_opcode_t op;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3138 unsigned char *loc;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3139 int arg1, arg2;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3140 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3141 *loc = (unsigned char) op;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3142 STORE_NUMBER (loc + 1, arg1);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3143 STORE_NUMBER (loc + 3, arg2);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3144 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3145
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3146
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3147 /* Copy the bytes from LOC to END to open up three bytes of space at LOC
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3148 for OP followed by two-byte integer parameter ARG. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3149
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3150 static void
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3151 insert_op1 (op, loc, arg, end)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3152 re_opcode_t op;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3153 unsigned char *loc;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3154 int arg;
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
3155 unsigned char *end;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3156 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3157 register unsigned char *pfrom = end;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3158 register unsigned char *pto = end + 3;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3159
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3160 while (pfrom != loc)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3161 *--pto = *--pfrom;
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
3162
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3163 store_op1 (op, loc, arg);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3164 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3165
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3166
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3167 /* Like `insert_op1', but for two two-byte parameters ARG1 and ARG2. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3168
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3169 static void
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3170 insert_op2 (op, loc, arg1, arg2, end)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3171 re_opcode_t op;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3172 unsigned char *loc;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3173 int arg1, arg2;
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
3174 unsigned char *end;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3175 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3176 register unsigned char *pfrom = end;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3177 register unsigned char *pto = end + 5;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3178
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3179 while (pfrom != loc)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3180 *--pto = *--pfrom;
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
3181
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3182 store_op2 (op, loc, arg1, arg2);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3183 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3184
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3185
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3186 /* P points to just after a ^ in PATTERN. Return true if that ^ comes
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3187 after an alternative or a begin-subexpression. We assume there is at
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3188 least one character before the ^. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3189
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3190 static boolean
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3191 at_begline_loc_p (pattern, p, syntax)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3192 const char *pattern, *p;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3193 reg_syntax_t syntax;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3194 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3195 const char *prev = p - 2;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3196 boolean prev_prev_backslash = prev > pattern && prev[-1] == '\\';
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
3197
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3198 return
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3199 /* After a subexpression? */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3200 (*prev == '(' && (syntax & RE_NO_BK_PARENS || prev_prev_backslash))
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3201 /* After an alternative? */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3202 || (*prev == '|' && (syntax & RE_NO_BK_VBAR || prev_prev_backslash));
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3203 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3204
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3205
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3206 /* The dual of at_begline_loc_p. This one is for $. We assume there is
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3207 at least one character after the $, i.e., `P < PEND'. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3208
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3209 static boolean
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3210 at_endline_loc_p (p, pend, syntax)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3211 const char *p, *pend;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3212 int syntax;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3213 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3214 const char *next = p;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3215 boolean next_backslash = *next == '\\';
449
c29f67a3f852 (at_endline_loc_p): Use 0, not NULL, in ?: for next_next.
Karl Heuer <kwzh@gnu.org>
parents: 447
diff changeset
3216 const char *next_next = p + 1 < pend ? p + 1 : 0;
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
3217
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3218 return
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3219 /* Before a subexpression? */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3220 (syntax & RE_NO_BK_PARENS ? *next == ')'
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3221 : next_backslash && next_next && *next_next == ')')
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3222 /* Before an alternative? */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3223 || (syntax & RE_NO_BK_VBAR ? *next == '|'
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3224 : next_backslash && next_next && *next_next == '|');
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3225 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3226
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3227
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
3228 /* Returns true if REGNUM is in one of COMPILE_STACK's elements and
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3229 false if it's not. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3230
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3231 static boolean
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3232 group_in_compile_stack (compile_stack, regnum)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3233 compile_stack_type compile_stack;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3234 regnum_t regnum;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3235 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3236 int this_element;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3237
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
3238 for (this_element = compile_stack.avail - 1;
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
3239 this_element >= 0;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3240 this_element--)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3241 if (compile_stack.stack[this_element].regnum == regnum)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3242 return true;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3243
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3244 return false;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3245 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3246
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3247 /* re_compile_fastmap computes a ``fastmap'' for the compiled pattern in
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3248 BUFP. A fastmap records which of the (1 << BYTEWIDTH) possible
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3249 characters can start a string that matches the pattern. This fastmap
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3250 is used by re_search to skip quickly over impossible starting points.
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3251
1933
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
3252 Character codes above (1 << BYTEWIDTH) are not represented in the
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
3253 fastmap, but the leading codes are represented. Thus, the fastmap
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
3254 indicates which character sets could start a match.
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
3255
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3256 The caller must supply the address of a (1 << BYTEWIDTH)-byte data
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3257 area as BUFP->fastmap.
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
3258
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3259 We set the `fastmap', `fastmap_accurate', and `can_be_null' fields in
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3260 the pattern buffer.
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3261
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3262 Returns 0 if we succeed, -2 if an internal error. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3263
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3264 int
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3265 re_compile_fastmap (bufp)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3266 struct re_pattern_buffer *bufp;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3267 {
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3268 int j, k;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3269 #ifdef MATCH_MAY_ALLOCATE
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3270 fail_stack_type fail_stack;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3271 #endif
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3272 #ifndef REGEX_MALLOC
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3273 char *destination;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3274 #endif
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
3275
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3276 register char *fastmap = bufp->fastmap;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3277 unsigned char *pattern = bufp->buffer;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3278 unsigned long size = bufp->used;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3279 unsigned char *p = pattern;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3280 register unsigned char *pend = pattern + size;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3281
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3282 /* This holds the pointer to the failure stack, when
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3283 it is allocated relocatably. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3284 fail_stack_elt_t *failure_stack_ptr;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3285
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3286 /* Assume that each path through the pattern can be null until
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3287 proven otherwise. We set this false at the bottom of switch
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3288 statement, to which we get only if a particular path doesn't
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3289 match the empty string. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3290 boolean path_can_be_null = true;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3291
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3292 /* We aren't doing a `succeed_n' to begin with. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3293 boolean succeed_n_p = false;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3294
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3295 /* If all elements for base leading-codes in fastmap is set, this
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3296 flag is set true. */
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3297 boolean match_any_multibyte_characters = false;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3298
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3299 /* Maximum code of simple (single byte) character. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3300 int simple_char_max;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3301
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3302 assert (fastmap != NULL && p != NULL);
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
3303
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3304 INIT_FAIL_STACK ();
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3305 bzero (fastmap, 1 << BYTEWIDTH); /* Assume nothing's valid. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3306 bufp->fastmap_accurate = 1; /* It will be when we're done. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3307 bufp->can_be_null = 0;
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
3308
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3309 /* The loop below works as follows:
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3310 - It has a working-list kept in the PATTERN_STACK and which basically
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3311 starts by only containing a pointer to the first operation.
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3312 - If the opcode we're looking at is a match against some set of
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3313 chars, then we add those chars to the fastmap and go on to the
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3314 next work element from the worklist (done via `break').
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3315 - If the opcode is a control operator on the other hand, we either
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3316 ignore it (if it's meaningless at this point, such as `start_memory')
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3317 or execute it (if it's a jump). If the jump has several destinations
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3318 (i.e. `on_failure_jump'), then we push the other destination onto the
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3319 worklist.
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3320 We guarantee termination by ignoring backward jumps (more or less),
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3321 so that `p' is monotonically increasing. More to the point, we
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3322 never set `p' (or push) anything `<= p1'. */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3323
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3324 /* If can_be_null is set, then the fastmap will not be used anyway. */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3325 while (!bufp->can_be_null)
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3326 {
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3327 /* `p1' is used as a marker of how far back a `on_failure_jump'
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3328 can go without being ignored. It is normally equal to `p'
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3329 (which prevents any backward `on_failure_jump') except right
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3330 after a plain `jump', to allow patterns such as:
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3331 0: jump 10
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3332 3..9: <body>
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3333 10: on_failure_jump 3
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3334 as used for the *? operator. */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3335 unsigned char *p1 = p;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3336
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3337 if (p == pend || *p == succeed)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3338 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3339 /* We have reached the (effective) end of pattern. */
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3340 if (!PATTERN_STACK_EMPTY ())
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3341 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3342 bufp->can_be_null |= path_can_be_null;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3343
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3344 /* Reset for next path. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3345 path_can_be_null = true;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3346
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3347 p = POP_PATTERN_OP ();
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3348
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3349 continue;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3350 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3351 else
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3352 break;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3353 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3354
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3355 /* We should never be about to go beyond the end of the pattern. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3356 assert (p < pend);
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
3357
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3358 switch (SWITCH_ENUM_CAST ((re_opcode_t) *p++))
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3359 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3360
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3361 case duplicate:
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3362 /* If the first character has to match a backreference, that means
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3363 that the group was empty (since it already matched). Since this
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3364 is the only case that interests us here, we can assume that the
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3365 backreference must match the empty string. */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3366 p++;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3367 continue;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3368
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3369
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3370 /* Following are the cases which match a character. These end
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3371 with `break'. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3372
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3373 case exactn:
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3374 fastmap[p[1]] = 1;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3375 break;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3376
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3377
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3378 #ifndef emacs
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3379 case charset:
1933
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
3380 {
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
3381 int length = (*p & 0x7f);;
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
3382 p++;
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
3383
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
3384 for (j = length * BYTEWIDTH - 1; j >= 0; j--)
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
3385 if (p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH)))
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
3386 fastmap[j] = 1;
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
3387 }
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3388 break;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3389
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3390 case charset_not:
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3391 /* Chars beyond end of map must be allowed. */
1933
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
3392 {
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
3393 int length = (*p & 0x7f);;
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
3394 p++;
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
3395
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
3396 for (j = length * BYTEWIDTH; j < (1 << BYTEWIDTH); j++)
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3397 fastmap[j] = 1;
1933
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
3398
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
3399 for (j = length * BYTEWIDTH - 1; j >= 0; j--)
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
3400 if (!(p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH))))
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
3401 fastmap[j] = 1;
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
3402 }
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3403 break;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3404
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3405 case wordchar:
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3406 for (j = 0; j < (1 << BYTEWIDTH); j++)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3407 if (SYNTAX (j) == Sword)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3408 fastmap[j] = 1;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3409 break;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3410
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3411
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3412 case notwordchar:
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3413 for (j = 0; j < (1 << BYTEWIDTH); j++)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3414 if (SYNTAX (j) != Sword)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3415 fastmap[j] = 1;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3416 break;
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3417 #else /* emacs */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3418 case charset:
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3419 for (j = CHARSET_BITMAP_SIZE (&p[-1]) * BYTEWIDTH - 1, p++;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3420 j >= 0; j--)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3421 if (p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH)))
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3422 fastmap[j] = 1;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3423
1965
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
3424 /* If we can match a character class, we can match
1933
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
3425 any character set. */
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
3426 if (CHARSET_RANGE_TABLE_EXISTS_P (&p[-2])
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
3427 && CHARSET_RANGE_TABLE_BITS (&p[-2]) != 0)
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
3428 goto set_fastmap_for_multibyte_characters;
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
3429
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3430 if (CHARSET_RANGE_TABLE_EXISTS_P (&p[-2])
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3431 && match_any_multibyte_characters == false)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3432 {
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3433 /* Set fastmap[I] 1 where I is a base leading code of each
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3434 multibyte character in the range table. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3435 int c, count;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3436
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3437 /* Make P points the range table. */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3438 p += CHARSET_BITMAP_SIZE (&p[-2]);
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3439
1965
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
3440 /* Extract the number of ranges in range table into COUNT. */
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3441 EXTRACT_NUMBER_AND_INCR (count, p);
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3442 for (; count > 0; count--, p += 2 * 3) /* XXX */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3443 {
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3444 /* Extract the start of each range. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3445 EXTRACT_CHARACTER (c, p);
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3446 j = CHAR_CHARSET (c);
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3447 fastmap[CHARSET_LEADING_CODE_BASE (j)] = 1;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3448 }
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3449 }
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3450 break;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3451
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3452
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3453 case charset_not:
1583
36ec1d59acb3 (re_compile_fastmap): Do something similar to the
Richard Stallman <rms@gnu.org>
parents: 1564
diff changeset
3454 /* Chars beyond end of bitmap are possible matches.
36ec1d59acb3 (re_compile_fastmap): Do something similar to the
Richard Stallman <rms@gnu.org>
parents: 1564
diff changeset
3455 All the single-byte codes can occur in multibyte buffers.
36ec1d59acb3 (re_compile_fastmap): Do something similar to the
Richard Stallman <rms@gnu.org>
parents: 1564
diff changeset
3456 So any that are not listed in the charset
36ec1d59acb3 (re_compile_fastmap): Do something similar to the
Richard Stallman <rms@gnu.org>
parents: 1564
diff changeset
3457 are possible matches, even in multibyte buffers. */
36ec1d59acb3 (re_compile_fastmap): Do something similar to the
Richard Stallman <rms@gnu.org>
parents: 1564
diff changeset
3458 simple_char_max = (1 << BYTEWIDTH);
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3459 for (j = CHARSET_BITMAP_SIZE (&p[-1]) * BYTEWIDTH;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3460 j < simple_char_max; j++)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3461 fastmap[j] = 1;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3462
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3463 for (j = CHARSET_BITMAP_SIZE (&p[-1]) * BYTEWIDTH - 1, p++;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3464 j >= 0; j--)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3465 if (!(p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH))))
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3466 fastmap[j] = 1;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3467
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3468 if (bufp->multibyte)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3469 /* Any character set can possibly contain a character
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3470 which doesn't match the specified set of characters. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3471 {
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3472 set_fastmap_for_multibyte_characters:
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3473 if (match_any_multibyte_characters == false)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3474 {
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3475 for (j = 0x80; j < 0xA0; j++) /* XXX */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3476 if (BASE_LEADING_CODE_P (j))
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3477 fastmap[j] = 1;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3478 match_any_multibyte_characters = true;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3479 }
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3480 }
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3481 break;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3482
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3483
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3484 case wordchar:
1583
36ec1d59acb3 (re_compile_fastmap): Do something similar to the
Richard Stallman <rms@gnu.org>
parents: 1564
diff changeset
3485 /* All the single-byte codes can occur in multibyte buffers,
36ec1d59acb3 (re_compile_fastmap): Do something similar to the
Richard Stallman <rms@gnu.org>
parents: 1564
diff changeset
3486 and they may have word syntax. So do consider them. */
36ec1d59acb3 (re_compile_fastmap): Do something similar to the
Richard Stallman <rms@gnu.org>
parents: 1564
diff changeset
3487 simple_char_max = (1 << BYTEWIDTH);
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3488 for (j = 0; j < simple_char_max; j++)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3489 if (SYNTAX (j) == Sword)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3490 fastmap[j] = 1;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3491
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3492 if (bufp->multibyte)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3493 /* Any character set can possibly contain a character
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3494 whose syntax is `Sword'. */
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3495 goto set_fastmap_for_multibyte_characters;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3496 break;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3497
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3498
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3499 case notwordchar:
1583
36ec1d59acb3 (re_compile_fastmap): Do something similar to the
Richard Stallman <rms@gnu.org>
parents: 1564
diff changeset
3500 /* All the single-byte codes can occur in multibyte buffers,
36ec1d59acb3 (re_compile_fastmap): Do something similar to the
Richard Stallman <rms@gnu.org>
parents: 1564
diff changeset
3501 and they may not have word syntax. So do consider them. */
36ec1d59acb3 (re_compile_fastmap): Do something similar to the
Richard Stallman <rms@gnu.org>
parents: 1564
diff changeset
3502 simple_char_max = (1 << BYTEWIDTH);
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3503 for (j = 0; j < simple_char_max; j++)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3504 if (SYNTAX (j) != Sword)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3505 fastmap[j] = 1;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3506
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3507 if (bufp->multibyte)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3508 /* Any character set can possibly contain a character
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3509 whose syntax is not `Sword'. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3510 goto set_fastmap_for_multibyte_characters;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3511 break;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3512 #endif
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3513
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3514 case anychar:
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3515 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3516 int fastmap_newline = fastmap['\n'];
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3517
1564
7c27b6d24ba6 (re_compile_fastmap): For anychar, set all fastmap
Karl Heuer <kwzh@gnu.org>
parents: 1545
diff changeset
3518 /* `.' matches anything, except perhaps newline.
7c27b6d24ba6 (re_compile_fastmap): For anychar, set all fastmap
Karl Heuer <kwzh@gnu.org>
parents: 1545
diff changeset
3519 Even in a multibyte buffer, it should match any
7c27b6d24ba6 (re_compile_fastmap): For anychar, set all fastmap
Karl Heuer <kwzh@gnu.org>
parents: 1545
diff changeset
3520 conceivable byte value for the fastmap. */
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3521 if (bufp->multibyte)
1564
7c27b6d24ba6 (re_compile_fastmap): For anychar, set all fastmap
Karl Heuer <kwzh@gnu.org>
parents: 1545
diff changeset
3522 match_any_multibyte_characters = true;
7c27b6d24ba6 (re_compile_fastmap): For anychar, set all fastmap
Karl Heuer <kwzh@gnu.org>
parents: 1545
diff changeset
3523
7c27b6d24ba6 (re_compile_fastmap): For anychar, set all fastmap
Karl Heuer <kwzh@gnu.org>
parents: 1545
diff changeset
3524 simple_char_max = (1 << BYTEWIDTH);
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3525 for (j = 0; j < simple_char_max; j++)
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3526 fastmap[j] = 1;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3527
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3528 /* ... except perhaps newline. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3529 if (!(bufp->syntax & RE_DOT_NEWLINE))
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3530 fastmap['\n'] = fastmap_newline;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3531
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3532 /* Otherwise, have to check alternative paths. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3533 break;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3534 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3535
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3536 #ifdef emacs
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3537 case wordbound:
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3538 case notwordbound:
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3539 case wordbeg:
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3540 case wordend:
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3541 case notsyntaxspec:
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3542 case syntaxspec:
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3543 /* This match depends on text properties. These end with
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3544 aborting optimizations. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3545 bufp->can_be_null = 1;
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3546 continue;
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3547 #if 0
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3548 k = *p++;
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3549 simple_char_max = bufp->multibyte ? 0x80 : (1 << BYTEWIDTH);
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3550 for (j = 0; j < simple_char_max; j++)
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3551 if (SYNTAX (j) == (enum syntaxcode) k)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3552 fastmap[j] = 1;
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3553
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3554 if (bufp->multibyte)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3555 /* Any character set can possibly contain a character
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3556 whose syntax is K. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3557 goto set_fastmap_for_multibyte_characters;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3558 break;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3559
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3560 case notsyntaxspec:
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3561 k = *p++;
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3562 simple_char_max = bufp->multibyte ? 0x80 : (1 << BYTEWIDTH);
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3563 for (j = 0; j < simple_char_max; j++)
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3564 if (SYNTAX (j) != (enum syntaxcode) k)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3565 fastmap[j] = 1;
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3566
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3567 if (bufp->multibyte)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3568 /* Any character set can possibly contain a character
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3569 whose syntax is not K. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3570 goto set_fastmap_for_multibyte_characters;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3571 break;
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3572 #endif
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3573
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3574
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3575 case categoryspec:
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3576 k = *p++;
1583
36ec1d59acb3 (re_compile_fastmap): Do something similar to the
Richard Stallman <rms@gnu.org>
parents: 1564
diff changeset
3577 simple_char_max = (1 << BYTEWIDTH);
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3578 for (j = 0; j < simple_char_max; j++)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3579 if (CHAR_HAS_CATEGORY (j, k))
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3580 fastmap[j] = 1;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3581
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3582 if (bufp->multibyte)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3583 /* Any character set can possibly contain a character
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3584 whose category is K. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3585 goto set_fastmap_for_multibyte_characters;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3586 break;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3587
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3588
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3589 case notcategoryspec:
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3590 k = *p++;
1583
36ec1d59acb3 (re_compile_fastmap): Do something similar to the
Richard Stallman <rms@gnu.org>
parents: 1564
diff changeset
3591 simple_char_max = (1 << BYTEWIDTH);
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3592 for (j = 0; j < simple_char_max; j++)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3593 if (!CHAR_HAS_CATEGORY (j, k))
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3594 fastmap[j] = 1;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3595
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3596 if (bufp->multibyte)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3597 /* Any character set can possibly contain a character
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3598 whose category is not K. */
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3599 goto set_fastmap_for_multibyte_characters;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3600 break;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3601
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3602 /* All cases after this match the empty string. These end with
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3603 `continue'. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3604
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3605
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3606 case before_dot:
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3607 case at_dot:
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3608 case after_dot:
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3609 continue;
481
35afc74165b7 (re_search_2): If pattern starts with \=, optimize search.
Richard Stallman <rms@gnu.org>
parents: 480
diff changeset
3610 #endif /* emacs */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3611
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3612
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3613 case no_op:
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3614 case begline:
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3615 case endline:
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3616 case begbuf:
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3617 case endbuf:
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3618 #ifndef emacs
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3619 case wordbound:
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3620 case notwordbound:
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3621 case wordbeg:
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3622 case wordend:
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3623 #endif
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3624 continue;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3625
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3626
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3627 case jump_n:
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3628 case jump:
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3629 EXTRACT_NUMBER_AND_INCR (j, p);
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3630 if (j < 0)
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3631 /* Backward jumps can only go back to code that we've already
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3632 visited. `re_compile' should make sure this is true. */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3633 break;
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
3634 p += j;
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3635 switch (SWITCH_ENUM_CAST ((re_opcode_t) *p))
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3636 {
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3637 case on_failure_jump:
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3638 case on_failure_keep_string_jump:
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3639 case on_failure_jump_exclusive:
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3640 case on_failure_jump_loop:
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3641 case on_failure_jump_smart:
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3642 p++;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3643 break;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3644 default:
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3645 continue;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3646 };
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3647 /* Keep `p1' to allow the `on_failure_jump' we are jumping to
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3648 to jump back to "just after here". */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3649 /* Fallthrough */
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3650
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3651 case on_failure_jump:
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3652 case on_failure_keep_string_jump:
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3653 case on_failure_jump_exclusive:
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3654 case on_failure_jump_loop:
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3655 case on_failure_jump_smart:
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3656 handle_on_failure_jump:
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3657 EXTRACT_NUMBER_AND_INCR (j, p);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3658
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3659 /* For some patterns, e.g., `(a?)?', `p+j' here points to the
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3660 end of the pattern. We don't want to push such a point,
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3661 since when we restore it above, entering the switch will
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3662 increment `p' past the end of the pattern. We don't need
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3663 to push such a point since we obviously won't find any more
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3664 fastmap entries beyond `pend'. Such a pattern can match
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3665 the null string, though. */
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3666 if (p + j <= p1)
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3667 /* Backward jump to be ignored. */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3668 ;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3669 else if (p + j < pend)
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3670 {
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3671 if (!PUSH_PATTERN_OP (p + j, fail_stack))
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3672 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3673 RESET_FAIL_STACK ();
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3674 return -2;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3675 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3676 }
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3677 else
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3678 bufp->can_be_null = 1;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3679
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3680 if (succeed_n_p)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3681 {
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3682 EXTRACT_NUMBER_AND_INCR (k, p); /* Skip the n. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3683 succeed_n_p = false;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3684 }
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3685
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3686 continue;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3687
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3688
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3689 case succeed_n:
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3690 /* Get to the number of times to succeed. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3691 p += 2;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3692
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3693 /* Increment p past the n for when k != 0. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3694 EXTRACT_NUMBER_AND_INCR (k, p);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3695 if (k == 0)
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3696 {
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3697 p -= 4;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3698 succeed_n_p = true; /* Spaghetti code alert. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3699 goto handle_on_failure_jump;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3700 }
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3701 continue;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3702
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3703
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3704 case set_number_at:
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3705 p += 4;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3706 continue;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3707
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3708
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3709 case start_memory:
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3710 case stop_memory:
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
3711 p += 1;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3712 continue;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3713
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3714
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3715 default:
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3716 abort (); /* We have listed all the cases. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3717 } /* switch *p++ */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3718
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3719 /* Getting here means we have found the possible starting
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3720 characters for one path of the pattern -- and that the empty
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3721 string does not match. We need not follow this path further.
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3722 Instead, look at the next alternative (remembered on the
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3723 stack), or quit if no more. The test at the top of the loop
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3724 does these things. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3725 path_can_be_null = false;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3726 p = pend;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3727 } /* while p */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3728
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3729 /* Set `can_be_null' for the last path (also the first path, if the
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3730 pattern is empty). */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3731 bufp->can_be_null |= path_can_be_null;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3732 RESET_FAIL_STACK ();
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3733 return 0;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3734 } /* re_compile_fastmap */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3735
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3736 /* Set REGS to hold NUM_REGS registers, storing them in STARTS and
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3737 ENDS. Subsequent matches using PATTERN_BUFFER and REGS will use
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3738 this memory for recording register information. STARTS and ENDS
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3739 must be allocated using the malloc library routine, and must each
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3740 be at least NUM_REGS * sizeof (regoff_t) bytes long.
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3741
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3742 If NUM_REGS == 0, then subsequent matches should allocate their own
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3743 register data.
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3744
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3745 Unless this function is called, the first search or match using
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3746 PATTERN_BUFFER will allocate its own register data, without
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3747 freeing the old data. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3748
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3749 void
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3750 re_set_registers (bufp, regs, num_regs, starts, ends)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3751 struct re_pattern_buffer *bufp;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3752 struct re_registers *regs;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3753 unsigned num_regs;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3754 regoff_t *starts, *ends;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3755 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3756 if (num_regs)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3757 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3758 bufp->regs_allocated = REGS_REALLOCATE;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3759 regs->num_regs = num_regs;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3760 regs->start = starts;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3761 regs->end = ends;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3762 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3763 else
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3764 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3765 bufp->regs_allocated = REGS_UNALLOCATED;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3766 regs->num_regs = 0;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3767 regs->start = regs->end = (regoff_t *) 0;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3768 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3769 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3770
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3771 /* Searching routines. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3772
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3773 /* Like re_search_2, below, but only one string is specified, and
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3774 doesn't let you say where to stop matching. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3775
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3776 int
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3777 re_search (bufp, string, size, startpos, range, regs)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3778 struct re_pattern_buffer *bufp;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3779 const char *string;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3780 int size, startpos, range;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3781 struct re_registers *regs;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3782 {
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
3783 return re_search_2 (bufp, NULL, 0, string, size, startpos, range,
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3784 regs, size);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3785 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3786
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3787 /* End address of virtual concatenation of string. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3788 #define STOP_ADDR_VSTRING(P) \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3789 (((P) >= size1 ? string2 + size2 : string1 + size1))
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3790
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3791 /* Address of POS in the concatenation of virtual string. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3792 #define POS_ADDR_VSTRING(POS) \
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3793 (((POS) >= size1 ? string2 - size1 : string1) + (POS))
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3794
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3795 /* Using the compiled pattern in BUFP->buffer, first tries to match the
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3796 virtual concatenation of STRING1 and STRING2, starting first at index
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3797 STARTPOS, then at STARTPOS + 1, and so on.
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
3798
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3799 STRING1 and STRING2 have length SIZE1 and SIZE2, respectively.
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
3800
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3801 RANGE is how far to scan while trying to match. RANGE = 0 means try
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3802 only at STARTPOS; in general, the last start tried is STARTPOS +
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3803 RANGE.
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
3804
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3805 In REGS, return the indices of the virtual concatenation of STRING1
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3806 and STRING2 that matched the entire BUFP->buffer and its contained
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3807 subexpressions.
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
3808
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3809 Do not consider matching one past the index STOP in the virtual
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3810 concatenation of STRING1 and STRING2.
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3811
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3812 We return either the position in the strings at which the match was
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3813 found, -1 if no match, or -2 if error (such as failure
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3814 stack overflow). */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3815
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3816 int
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3817 re_search_2 (bufp, string1, size1, string2, size2, startpos, range, regs, stop)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3818 struct re_pattern_buffer *bufp;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3819 const char *string1, *string2;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3820 int size1, size2;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3821 int startpos;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3822 int range;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3823 struct re_registers *regs;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3824 int stop;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3825 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3826 int val;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3827 register char *fastmap = bufp->fastmap;
501
f29b13c2cefd (TRANSLATE, PATFETCH): Cast elt of `translate'.
Richard Stallman <rms@gnu.org>
parents: 490
diff changeset
3828 register RE_TRANSLATE_TYPE translate = bufp->translate;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3829 int total_size = size1 + size2;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3830 int endpos = startpos + range;
678
bd677f8ba924 (re_search_2): Optimize regexp that starts with ^.
Richard Stallman <rms@gnu.org>
parents: 677
diff changeset
3831 int anchored_start = 0;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3832
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3833 /* Nonzero if we have to concern multibyte character. */
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3834 int multibyte = bufp->multibyte;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3835
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3836 /* Check for out-of-range STARTPOS. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3837 if (startpos < 0 || startpos > total_size)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3838 return -1;
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
3839
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3840 /* Fix up RANGE if it might eventually take us outside
490
985fe9826996 (re_search_2): Use 0, not -1, as the lower bound
Richard Stallman <rms@gnu.org>
parents: 481
diff changeset
3841 the virtual concatenation of STRING1 and STRING2.
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
3842 Make sure we won't move STARTPOS below 0 or above TOTAL_SIZE. */
490
985fe9826996 (re_search_2): Use 0, not -1, as the lower bound
Richard Stallman <rms@gnu.org>
parents: 481
diff changeset
3843 if (endpos < 0)
985fe9826996 (re_search_2): Use 0, not -1, as the lower bound
Richard Stallman <rms@gnu.org>
parents: 481
diff changeset
3844 range = 0 - startpos;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3845 else if (endpos > total_size)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3846 range = total_size - startpos;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3847
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3848 /* If the search isn't to be a backwards one, don't waste time in a
1329
818db3848f2b (re_search_2): Fix handling of at_dot.
Richard Stallman <rms@gnu.org>
parents: 1328
diff changeset
3849 search for a pattern anchored at beginning of buffer. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3850 if (bufp->used > 0 && (re_opcode_t) bufp->buffer[0] == begbuf && range > 0)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3851 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3852 if (startpos > 0)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3853 return -1;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3854 else
1329
818db3848f2b (re_search_2): Fix handling of at_dot.
Richard Stallman <rms@gnu.org>
parents: 1328
diff changeset
3855 range = 0;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3856 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3857
481
35afc74165b7 (re_search_2): If pattern starts with \=, optimize search.
Richard Stallman <rms@gnu.org>
parents: 480
diff changeset
3858 #ifdef emacs
35afc74165b7 (re_search_2): If pattern starts with \=, optimize search.
Richard Stallman <rms@gnu.org>
parents: 480
diff changeset
3859 /* In a forward search for something that starts with \=.
35afc74165b7 (re_search_2): If pattern starts with \=, optimize search.
Richard Stallman <rms@gnu.org>
parents: 480
diff changeset
3860 don't keep searching past point. */
35afc74165b7 (re_search_2): If pattern starts with \=, optimize search.
Richard Stallman <rms@gnu.org>
parents: 480
diff changeset
3861 if (bufp->used > 0 && (re_opcode_t) bufp->buffer[0] == at_dot && range > 0)
35afc74165b7 (re_search_2): If pattern starts with \=, optimize search.
Richard Stallman <rms@gnu.org>
parents: 480
diff changeset
3862 {
1329
818db3848f2b (re_search_2): Fix handling of at_dot.
Richard Stallman <rms@gnu.org>
parents: 1328
diff changeset
3863 range = PT_BYTE - BEGV_BYTE - startpos;
818db3848f2b (re_search_2): Fix handling of at_dot.
Richard Stallman <rms@gnu.org>
parents: 1328
diff changeset
3864 if (range < 0)
481
35afc74165b7 (re_search_2): If pattern starts with \=, optimize search.
Richard Stallman <rms@gnu.org>
parents: 480
diff changeset
3865 return -1;
35afc74165b7 (re_search_2): If pattern starts with \=, optimize search.
Richard Stallman <rms@gnu.org>
parents: 480
diff changeset
3866 }
35afc74165b7 (re_search_2): If pattern starts with \=, optimize search.
Richard Stallman <rms@gnu.org>
parents: 480
diff changeset
3867 #endif /* emacs */
35afc74165b7 (re_search_2): If pattern starts with \=, optimize search.
Richard Stallman <rms@gnu.org>
parents: 480
diff changeset
3868
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3869 /* Update the fastmap now if not correct already. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3870 if (fastmap && !bufp->fastmap_accurate)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3871 if (re_compile_fastmap (bufp) == -2)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3872 return -2;
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
3873
678
bd677f8ba924 (re_search_2): Optimize regexp that starts with ^.
Richard Stallman <rms@gnu.org>
parents: 677
diff changeset
3874 /* See whether the pattern is anchored. */
bd677f8ba924 (re_search_2): Optimize regexp that starts with ^.
Richard Stallman <rms@gnu.org>
parents: 677
diff changeset
3875 if (bufp->buffer[0] == begline)
bd677f8ba924 (re_search_2): Optimize regexp that starts with ^.
Richard Stallman <rms@gnu.org>
parents: 677
diff changeset
3876 anchored_start = 1;
bd677f8ba924 (re_search_2): Optimize regexp that starts with ^.
Richard Stallman <rms@gnu.org>
parents: 677
diff changeset
3877
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3878 #ifdef emacs
1321
a37088328c87 (re_match_2, re_search_2): Convert position to a charpos,
Karl Heuer <kwzh@gnu.org>
parents: 1313
diff changeset
3879 gl_state.object = re_match_object;
a37088328c87 (re_match_2, re_search_2): Convert position to a charpos,
Karl Heuer <kwzh@gnu.org>
parents: 1313
diff changeset
3880 {
1382
894acce816ca (POS_AS_IN_BUFFER): Add 1 only if operating on a buffer.
Richard Stallman <rms@gnu.org>
parents: 1381
diff changeset
3881 int adjpos = NILP (re_match_object) || BUFFERP (re_match_object);
894acce816ca (POS_AS_IN_BUFFER): Add 1 only if operating on a buffer.
Richard Stallman <rms@gnu.org>
parents: 1381
diff changeset
3882 int charpos = SYNTAX_TABLE_BYTE_TO_CHAR (startpos + adjpos);
1321
a37088328c87 (re_match_2, re_search_2): Convert position to a charpos,
Karl Heuer <kwzh@gnu.org>
parents: 1313
diff changeset
3883
a37088328c87 (re_match_2, re_search_2): Convert position to a charpos,
Karl Heuer <kwzh@gnu.org>
parents: 1313
diff changeset
3884 SETUP_SYNTAX_TABLE_FOR_OBJECT (re_match_object, charpos, 1);
a37088328c87 (re_match_2, re_search_2): Convert position to a charpos,
Karl Heuer <kwzh@gnu.org>
parents: 1313
diff changeset
3885 }
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3886 #endif
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3887
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3888 /* Loop through the string, looking for a place to start matching. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3889 for (;;)
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
3890 {
678
bd677f8ba924 (re_search_2): Optimize regexp that starts with ^.
Richard Stallman <rms@gnu.org>
parents: 677
diff changeset
3891 /* If the pattern is anchored,
bd677f8ba924 (re_search_2): Optimize regexp that starts with ^.
Richard Stallman <rms@gnu.org>
parents: 677
diff changeset
3892 skip quickly past places we cannot match.
bd677f8ba924 (re_search_2): Optimize regexp that starts with ^.
Richard Stallman <rms@gnu.org>
parents: 677
diff changeset
3893 We don't bother to treat startpos == 0 specially
bd677f8ba924 (re_search_2): Optimize regexp that starts with ^.
Richard Stallman <rms@gnu.org>
parents: 677
diff changeset
3894 because that case doesn't repeat. */
bd677f8ba924 (re_search_2): Optimize regexp that starts with ^.
Richard Stallman <rms@gnu.org>
parents: 677
diff changeset
3895 if (anchored_start && startpos > 0)
bd677f8ba924 (re_search_2): Optimize regexp that starts with ^.
Richard Stallman <rms@gnu.org>
parents: 677
diff changeset
3896 {
bd677f8ba924 (re_search_2): Optimize regexp that starts with ^.
Richard Stallman <rms@gnu.org>
parents: 677
diff changeset
3897 if (! (bufp->newline_anchor
bd677f8ba924 (re_search_2): Optimize regexp that starts with ^.
Richard Stallman <rms@gnu.org>
parents: 677
diff changeset
3898 && ((startpos <= size1 ? string1[startpos - 1]
bd677f8ba924 (re_search_2): Optimize regexp that starts with ^.
Richard Stallman <rms@gnu.org>
parents: 677
diff changeset
3899 : string2[startpos - size1 - 1])
bd677f8ba924 (re_search_2): Optimize regexp that starts with ^.
Richard Stallman <rms@gnu.org>
parents: 677
diff changeset
3900 == '\n')))
bd677f8ba924 (re_search_2): Optimize regexp that starts with ^.
Richard Stallman <rms@gnu.org>
parents: 677
diff changeset
3901 goto advance;
bd677f8ba924 (re_search_2): Optimize regexp that starts with ^.
Richard Stallman <rms@gnu.org>
parents: 677
diff changeset
3902 }
bd677f8ba924 (re_search_2): Optimize regexp that starts with ^.
Richard Stallman <rms@gnu.org>
parents: 677
diff changeset
3903
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3904 /* If a fastmap is supplied, skip quickly over characters that
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3905 cannot be the start of a match. If the pattern can match the
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3906 null string, however, we don't need to skip characters; we want
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3907 the first null string. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3908 if (fastmap && startpos < total_size && !bufp->can_be_null)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3909 {
1296
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
3910 register const char *d;
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
3911 register unsigned int buf_ch;
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
3912
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
3913 d = POS_ADDR_VSTRING (startpos);
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
3914
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3915 if (range > 0) /* Searching forwards. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3916 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3917 register int lim = 0;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3918 int irange = range;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3919
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3920 if (startpos < size1 && startpos + range >= size1)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3921 lim = range - (size1 - startpos);
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
3922
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3923 /* Written out as an if-else to avoid testing `translate'
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3924 inside the loop. */
1335
97f50084cc62 (re_search_2): Fix indentation.
Andreas Schwab <schwab@suse.de>
parents: 1329
diff changeset
3925 if (RE_TRANSLATE_P (translate))
97f50084cc62 (re_search_2): Fix indentation.
Andreas Schwab <schwab@suse.de>
parents: 1329
diff changeset
3926 {
1296
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
3927 if (multibyte)
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
3928 while (range > lim)
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
3929 {
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
3930 int buf_charlen;
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
3931
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
3932 buf_ch = STRING_CHAR_AND_LENGTH (d, range - lim,
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
3933 buf_charlen);
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
3934
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
3935 buf_ch = RE_TRANSLATE (translate, buf_ch);
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
3936 if (buf_ch >= 0400
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
3937 || fastmap[buf_ch])
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
3938 break;
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
3939
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
3940 range -= buf_charlen;
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
3941 d += buf_charlen;
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
3942 }
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
3943 else
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
3944 while (range > lim
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
3945 && !fastmap[(unsigned char)
1381
24423cbaf6a9 (re_search_2): Don't use ++ inside RE_TRANSLATE.
Richard Stallman <rms@gnu.org>
parents: 1342
diff changeset
3946 RE_TRANSLATE (translate, (unsigned char) *d)])
24423cbaf6a9 (re_search_2): Don't use ++ inside RE_TRANSLATE.
Richard Stallman <rms@gnu.org>
parents: 1342
diff changeset
3947 {
24423cbaf6a9 (re_search_2): Don't use ++ inside RE_TRANSLATE.
Richard Stallman <rms@gnu.org>
parents: 1342
diff changeset
3948 d++;
24423cbaf6a9 (re_search_2): Don't use ++ inside RE_TRANSLATE.
Richard Stallman <rms@gnu.org>
parents: 1342
diff changeset
3949 range--;
24423cbaf6a9 (re_search_2): Don't use ++ inside RE_TRANSLATE.
Richard Stallman <rms@gnu.org>
parents: 1342
diff changeset
3950 }
1296
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
3951 }
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3952 else
1381
24423cbaf6a9 (re_search_2): Don't use ++ inside RE_TRANSLATE.
Richard Stallman <rms@gnu.org>
parents: 1342
diff changeset
3953 while (range > lim && !fastmap[(unsigned char) *d])
24423cbaf6a9 (re_search_2): Don't use ++ inside RE_TRANSLATE.
Richard Stallman <rms@gnu.org>
parents: 1342
diff changeset
3954 {
24423cbaf6a9 (re_search_2): Don't use ++ inside RE_TRANSLATE.
Richard Stallman <rms@gnu.org>
parents: 1342
diff changeset
3955 d++;
24423cbaf6a9 (re_search_2): Don't use ++ inside RE_TRANSLATE.
Richard Stallman <rms@gnu.org>
parents: 1342
diff changeset
3956 range--;
24423cbaf6a9 (re_search_2): Don't use ++ inside RE_TRANSLATE.
Richard Stallman <rms@gnu.org>
parents: 1342
diff changeset
3957 }
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3958
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3959 startpos += irange - range;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3960 }
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3961 else /* Searching backwards. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3962 {
1296
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
3963 int room = (size1 == 0 || startpos >= size1
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
3964 ? size2 + size1 - startpos
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
3965 : size1 - startpos);
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
3966
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
3967 buf_ch = STRING_CHAR (d, room);
1328
0aa10b723959 Use RE_TRANSLATE_P to check whether translation is
Andreas Schwab <schwab@suse.de>
parents: 1326
diff changeset
3968 if (RE_TRANSLATE_P (translate))
1296
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
3969 buf_ch = RE_TRANSLATE (translate, buf_ch);
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
3970
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
3971 if (! (buf_ch >= 0400
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
3972 || fastmap[buf_ch]))
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3973 goto advance;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3974 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3975 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3976
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3977 /* If can't match the null string, and that's all we have left, fail. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3978 if (range >= 0 && startpos == total_size && fastmap
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3979 && !bufp->can_be_null)
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3980 return -1;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3981
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3982 val = re_match_2_internal (bufp, string1, size1, string2, size2,
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3983 startpos, regs, stop);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3984 #ifndef REGEX_MALLOC
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3985 #ifdef C_ALLOCA
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3986 alloca (0);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3987 #endif
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3988 #endif
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3989
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3990 if (val >= 0)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3991 return startpos;
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
3992
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3993 if (val == -2)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3994 return -2;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3995
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
3996 advance:
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
3997 if (!range)
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
3998 break;
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
3999 else if (range > 0)
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4000 {
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4001 /* Update STARTPOS to the next character boundary. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4002 if (multibyte)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4003 {
961
6959c7741ed2 (re_search_2): Cast result of POS_ADDR_VSTRING.
Richard Stallman <rms@gnu.org>
parents: 942
diff changeset
4004 const unsigned char *p
6959c7741ed2 (re_search_2): Cast result of POS_ADDR_VSTRING.
Richard Stallman <rms@gnu.org>
parents: 942
diff changeset
4005 = (const unsigned char *) POS_ADDR_VSTRING (startpos);
6959c7741ed2 (re_search_2): Cast result of POS_ADDR_VSTRING.
Richard Stallman <rms@gnu.org>
parents: 942
diff changeset
4006 const unsigned char *pend
6959c7741ed2 (re_search_2): Cast result of POS_ADDR_VSTRING.
Richard Stallman <rms@gnu.org>
parents: 942
diff changeset
4007 = (const unsigned char *) STOP_ADDR_VSTRING (startpos);
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4008 int len = MULTIBYTE_FORM_LENGTH (p, pend - p);
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4009
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4010 range -= len;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4011 if (range < 0)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4012 break;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4013 startpos += len;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4014 }
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4015 else
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4016 {
961
6959c7741ed2 (re_search_2): Cast result of POS_ADDR_VSTRING.
Richard Stallman <rms@gnu.org>
parents: 942
diff changeset
4017 range--;
6959c7741ed2 (re_search_2): Cast result of POS_ADDR_VSTRING.
Richard Stallman <rms@gnu.org>
parents: 942
diff changeset
4018 startpos++;
6959c7741ed2 (re_search_2): Cast result of POS_ADDR_VSTRING.
Richard Stallman <rms@gnu.org>
parents: 942
diff changeset
4019 }
679
b088267ea1c8 Clean up whitespace.
Richard Stallman <rms@gnu.org>
parents: 678
diff changeset
4020 }
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4021 else
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4022 {
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4023 range++;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4024 startpos--;
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4025
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4026 /* Update STARTPOS to the previous character boundary. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4027 if (multibyte)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4028 {
961
6959c7741ed2 (re_search_2): Cast result of POS_ADDR_VSTRING.
Richard Stallman <rms@gnu.org>
parents: 942
diff changeset
4029 const unsigned char *p
6959c7741ed2 (re_search_2): Cast result of POS_ADDR_VSTRING.
Richard Stallman <rms@gnu.org>
parents: 942
diff changeset
4030 = (const unsigned char *) POS_ADDR_VSTRING (startpos);
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4031 int len = 0;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4032
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4033 /* Find the head of multibyte form. */
1204
28ff40a118b8 (re_search_2): Fix call to CHAR_HEAD_P.
Richard Stallman <rms@gnu.org>
parents: 1158
diff changeset
4034 while (!CHAR_HEAD_P (*p))
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4035 p--, len++;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4036
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4037 /* Adjust it. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4038 #if 0 /* XXX */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4039 if (MULTIBYTE_FORM_LENGTH (p, len + 1) != (len + 1))
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4040 ;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4041 else
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4042 #endif
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4043 {
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4044 range += len;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4045 if (range > 0)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4046 break;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4047
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4048 startpos -= len;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4049 }
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4050 }
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4051 }
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4052 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4053 return -1;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4054 } /* re_search_2 */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4055
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4056 /* Declarations and macros for re_match_2. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4057
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4058 static int bcmp_translate ();
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4059
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4060 /* This converts PTR, a pointer into one of the search strings `string1'
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4061 and `string2' into an offset from the beginning of that string. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4062 #define POINTER_TO_OFFSET(ptr) \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4063 (FIRST_STRING_P (ptr) \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4064 ? ((regoff_t) ((ptr) - string1)) \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4065 : ((regoff_t) ((ptr) - string2 + size1)))
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4066
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4067 /* Macros for dealing with the split strings in re_match_2. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4068
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4069 #define MATCHING_IN_FIRST_STRING (dend == end_match_1)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4070
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4071 /* Call before fetching a character with *d. This switches over to
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4072 string2 if necessary. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4073 #define PREFETCH() \
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4074 while (d == dend) \
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4075 { \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4076 /* End of string2 => fail. */ \
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4077 if (dend == end_match_2) \
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4078 goto fail; \
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4079 /* End of string1 => advance to string2. */ \
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4080 d = string2; \
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4081 dend = end_match_2; \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4082 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4083
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4084
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4085 /* Test if at very beginning or at very end of the virtual concatenation
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4086 of `string1' and `string2'. If only one string, it's `string2'. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4087 #define AT_STRINGS_BEG(d) ((d) == (size1 ? string1 : string2) || !size2)
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
4088 #define AT_STRINGS_END(d) ((d) == end2)
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4089
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4090
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4091 /* Test if D points to a character which is word-constituent. We have
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4092 two special cases to check for: if past the end of string1, look at
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4093 the first character in string2; and if before the beginning of
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4094 string2, look at the last character in string1. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4095 #define WORDCHAR_P(d) \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4096 (SYNTAX ((d) == end1 ? *string2 \
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4097 : (d) == string2 - 1 ? *(end1 - 1) : *(d)) \
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4098 == Sword)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4099
521
7089c3a3a164 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 515
diff changeset
4100 /* Disabled due to a compiler bug -- see comment at case wordbound */
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4101
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4102 /* The comment at case wordbound is following one, but we don't use
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4103 AT_WORD_BOUNDARY anymore to support multibyte form.
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4104
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4105 The DEC Alpha C compiler 3.x generates incorrect code for the
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4106 test WORDCHAR_P (d - 1) != WORDCHAR_P (d) in the expansion of
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4107 AT_WORD_BOUNDARY, so this code is disabled. Expanding the
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4108 macro and introducing temporary variables works around the bug. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4109
521
7089c3a3a164 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 515
diff changeset
4110 #if 0
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4111 /* Test if the character before D and the one at D differ with respect
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4112 to being word-constituent. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4113 #define AT_WORD_BOUNDARY(d) \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4114 (AT_STRINGS_BEG (d) || AT_STRINGS_END (d) \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4115 || WORDCHAR_P (d - 1) != WORDCHAR_P (d))
521
7089c3a3a164 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 515
diff changeset
4116 #endif
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4117
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4118 /* Free everything we malloc. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4119 #ifdef MATCH_MAY_ALLOCATE
942
c6196b52ec1d Fix previous change.
Richard Stallman <rms@gnu.org>
parents: 941
diff changeset
4120 #define FREE_VAR(var) if (var) { REGEX_FREE (var); var = NULL; } else
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4121 #define FREE_VARIABLES() \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4122 do { \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4123 REGEX_FREE_STACK (fail_stack.stack); \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4124 FREE_VAR (regstart); \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4125 FREE_VAR (regend); \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4126 FREE_VAR (best_regstart); \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4127 FREE_VAR (best_regend); \
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4128 } while (0)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4129 #else
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4130 #define FREE_VARIABLES() ((void)0) /* Do nothing! But inhibit gcc warning. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4131 #endif /* not MATCH_MAY_ALLOCATE */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4132
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4133
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4134 /* Optimization routines. */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4135
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4136 /* Jump over non-matching operations. */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4137 static unsigned char *
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4138 skip_noops (p, pend, memory)
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4139 unsigned char *p, *pend;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4140 int memory;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4141 {
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4142 int mcnt;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4143 while (p < pend)
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4144 {
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4145 switch (SWITCH_ENUM_CAST ((re_opcode_t) *p))
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4146 {
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4147 case start_memory:
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4148 if (!memory)
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4149 return p;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4150 case stop_memory:
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4151 p += 2; break;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4152 case no_op:
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4153 p += 1; break;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4154 case jump:
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4155 p += 1;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4156 EXTRACT_NUMBER_AND_INCR (mcnt, p);
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4157 p += mcnt;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4158 break;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4159 default:
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4160 return p;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4161 }
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4162 }
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4163 assert (p == pend);
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4164 return p;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4165 }
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4166
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4167 /* Non-zero if "p1 matches something" implies "p2 fails". */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4168 static int
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4169 mutually_exclusive_p (bufp, p1, p2)
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4170 struct re_pattern_buffer *bufp;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4171 unsigned char *p1, *p2;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4172 {
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4173 int multibyte = bufp->multibyte;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4174 unsigned char *pend = bufp->buffer + bufp->used;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4175
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4176 assert (p1 >= bufp->buffer && p1 <= pend
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4177 && p2 >= bufp->buffer && p2 <= pend);
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4178
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4179 /* Skip over open/close-group commands.
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4180 If what follows this loop is a ...+ construct,
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4181 look at what begins its body, since we will have to
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4182 match at least one of that. */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4183 p2 = skip_noops (p2, pend, 1);
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4184 /* The same skip can be done for p1, except that skipping over
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4185 start_memory is not a good idea (if there's a group inside
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4186 the loop delimited by on_failure_jump_exclusive, then it
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4187 can't optimize the push away (it still works properly, but
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4188 slightly slower rather than faster)). */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4189 p1 = skip_noops (p1, pend, 0);
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4190
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4191 /* If we're at the end of the pattern, we can change. */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4192 if (p2 == pend)
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4193 {
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4194 switch (SWITCH_ENUM_CAST ((re_opcode_t) *p1))
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4195 {
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4196 case anychar:
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4197 case charset_not:
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4198 case charset:
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4199 case exactn:
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4200 DEBUG_PRINT1 (" End of pattern: fast loop.\n");
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4201 return 1;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4202 default:
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4203 return 0;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4204 }
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4205 }
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4206
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4207 else if ((re_opcode_t) *p2 == exactn
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4208 || (bufp->newline_anchor && (re_opcode_t) *p2 == endline))
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4209 {
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4210 register unsigned int c
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4211 = *p2 == (unsigned char) endline ? '\n' : p2[2];
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4212
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4213 if ((re_opcode_t) *p1 == exactn)
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4214 {
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4215 if (!(multibyte /* && (c != '\n') */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4216 && BASE_LEADING_CODE_P (c))
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4217 ? c != p1[2]
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4218 : (STRING_CHAR (&p2[2], pend - &p2[2])
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4219 != STRING_CHAR (&p1[2], pend - &p1[2])))
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4220 {
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4221 DEBUG_PRINT3 (" '%c' != '%c' => fast loop.\n", c, p1[2]);
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4222 return 1;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4223 }
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4224 }
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4225
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4226 else if ((re_opcode_t) *p1 == charset
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4227 || (re_opcode_t) *p1 == charset_not)
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4228 {
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4229 int not = (re_opcode_t) *p1 == charset_not;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4230
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4231 if (multibyte /* && (c != '\n') */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4232 && BASE_LEADING_CODE_P (c))
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4233 c = STRING_CHAR (&p2[2], pend - &p2[2]);
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4234
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4235 /* Test if C is listed in charset (or charset_not)
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4236 at `p1'. */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4237 if (SINGLE_BYTE_CHAR_P (c))
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4238 {
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4239 if (c < CHARSET_BITMAP_SIZE (p1) * BYTEWIDTH
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4240 && p1[2 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH)))
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4241 not = !not;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4242 }
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4243 else if (CHARSET_RANGE_TABLE_EXISTS_P (p1))
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4244 CHARSET_LOOKUP_RANGE_TABLE (not, c, p1);
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4245
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4246 /* `not' is equal to 1 if c would match, which means
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4247 that we can't change to pop_failure_jump. */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4248 if (!not)
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4249 {
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4250 DEBUG_PRINT1 (" No match => fast loop.\n");
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4251 return 1;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4252 }
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4253 }
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4254 else if ((re_opcode_t) *p1 == anychar
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4255 && c == '\n')
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4256 {
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4257 DEBUG_PRINT1 (" . != \\n => fast loop.\n");
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4258 return 1;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4259 }
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4260 }
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4261 else if ((re_opcode_t) *p2 == charset
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4262 || (re_opcode_t) *p2 == charset_not)
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4263 {
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4264 if ((re_opcode_t) *p1 == exactn)
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4265 /* Reuse the code above. */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4266 return mutually_exclusive_p (bufp, p2, p1);
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4267
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4268
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4269 /* It is hard to list up all the character in charset
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4270 P2 if it includes multibyte character. Give up in
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4271 such case. */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4272 else if (!multibyte || !CHARSET_RANGE_TABLE_EXISTS_P (p2))
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4273 {
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4274 /* Now, we are sure that P2 has no range table.
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4275 So, for the size of bitmap in P2, `p2[1]' is
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4276 enough. But P1 may have range table, so the
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4277 size of bitmap table of P1 is extracted by
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4278 using macro `CHARSET_BITMAP_SIZE'.
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4279
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4280 Since we know that all the character listed in
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4281 P2 is ASCII, it is enough to test only bitmap
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4282 table of P1. */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4283
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4284 if (*p1 == *p2)
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4285 {
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4286 int idx;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4287 /* We win if the charset inside the loop
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4288 has no overlap with the one after the loop. */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4289 for (idx = 0;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4290 (idx < (int) p2[1]
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4291 && idx < CHARSET_BITMAP_SIZE (p1));
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4292 idx++)
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4293 if ((p2[2 + idx] & p1[2 + idx]) != 0)
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4294 break;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4295
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4296 if (idx == p2[1]
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4297 || idx == CHARSET_BITMAP_SIZE (p1))
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4298 {
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4299 DEBUG_PRINT1 (" No match => fast loop.\n");
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4300 return 1;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4301 }
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4302 }
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4303 else if ((re_opcode_t) *p1 == charset
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4304 || (re_opcode_t) *p1 == charset_not)
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4305 {
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4306 int idx;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4307 /* We win if the charset_not inside the loop lists
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4308 every character listed in the charset after. */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4309 for (idx = 0; idx < (int) p2[1]; idx++)
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4310 if (! (p2[2 + idx] == 0
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4311 || (idx < CHARSET_BITMAP_SIZE (p1)
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4312 && ((p2[2 + idx] & ~ p1[2 + idx]) == 0))))
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4313 break;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4314
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4315 if (idx == p2[1])
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4316 {
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4317 DEBUG_PRINT1 (" No match => fast loop.\n");
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4318 return 1;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4319 }
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4320 }
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4321 }
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4322 }
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4323
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4324 /* Safe default. */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4325 return 0;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4326 }
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4327
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4328
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4329 /* Matching routines. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4330
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4331 #ifndef emacs /* Emacs never uses this. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4332 /* re_match is like re_match_2 except it takes only a single string. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4333
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4334 int
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4335 re_match (bufp, string, size, pos, regs)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4336 struct re_pattern_buffer *bufp;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4337 const char *string;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4338 int size, pos;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4339 struct re_registers *regs;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4340 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4341 int result = re_match_2_internal (bufp, NULL, 0, string, size,
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4342 pos, regs, size);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4343 alloca (0);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4344 return result;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4345 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4346 #endif /* not emacs */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4347
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4348 #ifdef emacs
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4349 /* In Emacs, this is the string or buffer in which we
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4350 are matching. It is used for looking up syntax properties. */
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4351 Lisp_Object re_match_object;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4352 #endif
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4353
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4354 /* re_match_2 matches the compiled pattern in BUFP against the
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4355 the (virtual) concatenation of STRING1 and STRING2 (of length SIZE1
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4356 and SIZE2, respectively). We start matching at POS, and stop
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4357 matching at STOP.
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
4358
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4359 If REGS is non-null and the `no_sub' field of BUFP is nonzero, we
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4360 store offsets for the substring each group matched in REGS. See the
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4361 documentation for exactly how many groups we fill.
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4362
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4363 We return -1 if no match, -2 if an internal error (such as the
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4364 failure stack overflowing). Otherwise, we return the length of the
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4365 matched substring. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4366
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4367 int
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4368 re_match_2 (bufp, string1, size1, string2, size2, pos, regs, stop)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4369 struct re_pattern_buffer *bufp;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4370 const char *string1, *string2;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4371 int size1, size2;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4372 int pos;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4373 struct re_registers *regs;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4374 int stop;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4375 {
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4376 int result;
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4377
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4378 #ifdef emacs
1321
a37088328c87 (re_match_2, re_search_2): Convert position to a charpos,
Karl Heuer <kwzh@gnu.org>
parents: 1313
diff changeset
4379 int charpos;
1382
894acce816ca (POS_AS_IN_BUFFER): Add 1 only if operating on a buffer.
Richard Stallman <rms@gnu.org>
parents: 1381
diff changeset
4380 int adjpos = NILP (re_match_object) || BUFFERP (re_match_object);
1321
a37088328c87 (re_match_2, re_search_2): Convert position to a charpos,
Karl Heuer <kwzh@gnu.org>
parents: 1313
diff changeset
4381 gl_state.object = re_match_object;
1382
894acce816ca (POS_AS_IN_BUFFER): Add 1 only if operating on a buffer.
Richard Stallman <rms@gnu.org>
parents: 1381
diff changeset
4382 charpos = SYNTAX_TABLE_BYTE_TO_CHAR (pos + adjpos);
1321
a37088328c87 (re_match_2, re_search_2): Convert position to a charpos,
Karl Heuer <kwzh@gnu.org>
parents: 1313
diff changeset
4383 SETUP_SYNTAX_TABLE_FOR_OBJECT (re_match_object, charpos, 1);
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4384 #endif
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4385
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4386 result = re_match_2_internal (bufp, string1, size1, string2, size2,
1321
a37088328c87 (re_match_2, re_search_2): Convert position to a charpos,
Karl Heuer <kwzh@gnu.org>
parents: 1313
diff changeset
4387 pos, regs, stop);
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4388 alloca (0);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4389 return result;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4390 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4391
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4392 /* This is a separate function so that we can force an alloca cleanup
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4393 afterwards. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4394 static int
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4395 re_match_2_internal (bufp, string1, size1, string2, size2, pos, regs, stop)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4396 struct re_pattern_buffer *bufp;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4397 const char *string1, *string2;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4398 int size1, size2;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4399 int pos;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4400 struct re_registers *regs;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4401 int stop;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4402 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4403 /* General temporaries. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4404 int mcnt;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4405 unsigned char *p1;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4406
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4407 /* Just past the end of the corresponding string. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4408 const char *end1, *end2;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4409
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4410 /* Pointers into string1 and string2, just past the last characters in
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4411 each to consider matching. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4412 const char *end_match_1, *end_match_2;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4413
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4414 /* Where we are in the data, and the end of the current string. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4415 const char *d, *dend;
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
4416
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4417 /* Where we are in the pattern, and the end of the pattern. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4418 unsigned char *p = bufp->buffer;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4419 register unsigned char *pend = p + bufp->used;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4420
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4421 /* We use this to map every character in the string. */
501
f29b13c2cefd (TRANSLATE, PATFETCH): Cast elt of `translate'.
Richard Stallman <rms@gnu.org>
parents: 490
diff changeset
4422 RE_TRANSLATE_TYPE translate = bufp->translate;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4423
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4424 /* Nonzero if we have to concern multibyte character. */
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4425 int multibyte = bufp->multibyte;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4426
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4427 /* Failure point stack. Each place that can handle a failure further
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4428 down the line pushes a failure point on this stack. It consists of
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4429 regstart, and regend for all registers corresponding to
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4430 the subexpressions we're currently inside, plus the number of such
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4431 registers, and, finally, two char *'s. The first char * is where
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4432 to resume scanning the pattern; the second one is where to resume
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4433 scanning the strings. */
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4434 #ifdef MATCH_MAY_ALLOCATE /* otherwise, this is global. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4435 fail_stack_type fail_stack;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4436 #endif
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4437 #ifdef DEBUG
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4438 static unsigned failure_id = 0;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4439 unsigned nfailure_points_pushed = 0, nfailure_points_popped = 0;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4440 #endif
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4442 /* This holds the pointer to the failure stack, when
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4443 it is allocated relocatably. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4444 fail_stack_elt_t *failure_stack_ptr;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4445
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4446 /* We fill all the registers internally, independent of what we
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4447 return, for use in backreferences. The number here includes
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4448 an element for register zero. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4449 unsigned num_regs = bufp->re_nsub + 1;
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
4450
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4451 /* Information on the contents of registers. These are pointers into
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4452 the input strings; they record just what was matched (on this
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4453 attempt) by a subexpression part of the pattern, that is, the
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4454 regnum-th regstart pointer points to where in the pattern we began
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4455 matching and the regnum-th regend points to right after where we
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4456 stopped matching the regnum-th subexpression. (The zeroth register
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4457 keeps track of what the whole pattern matches.) */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4458 #ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4459 const char **regstart, **regend;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4460 #endif
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4461
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4462 /* The following record the register info as found in the above
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
4463 variables when we find a match better than any we've seen before.
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4464 This happens as we backtrack through the failure points, which in
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4465 turn happens only if we have not yet matched the entire string. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4466 unsigned best_regs_set = false;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4467 #ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4468 const char **best_regstart, **best_regend;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4469 #endif
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
4470
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4471 /* Logically, this is `best_regend[0]'. But we don't want to have to
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4472 allocate space for that if we're not allocating space for anything
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4473 else (see below). Also, we never need info about register 0 for
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4474 any of the other register vectors, and it seems rather a kludge to
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4475 treat `best_regend' differently than the rest. So we keep track of
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4476 the end of the best match so far in a separate variable. We
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4477 initialize this to NULL so that when we backtrack the first time
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4478 and need to test it, it's not garbage. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4479 const char *match_end = NULL;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4480
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4481 #ifdef DEBUG
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4482 /* Counts the total number of registers pushed. */
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
4483 unsigned num_regs_pushed = 0;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4484 #endif
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4485
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4486 DEBUG_PRINT1 ("\n\nEntering re_match_2.\n");
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
4487
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4488 INIT_FAIL_STACK ();
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
4489
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4490 #ifdef MATCH_MAY_ALLOCATE
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4491 /* Do not bother to initialize all the register variables if there are
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4492 no groups in the pattern, as it takes a fair amount of time. If
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4493 there are groups, we include space for register 0 (the whole
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4494 pattern), even though we never use it, since it simplifies the
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4495 array indexing. We should fix this. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4496 if (bufp->re_nsub)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4497 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4498 regstart = REGEX_TALLOC (num_regs, const char *);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4499 regend = REGEX_TALLOC (num_regs, const char *);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4500 best_regstart = REGEX_TALLOC (num_regs, const char *);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4501 best_regend = REGEX_TALLOC (num_regs, const char *);
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4502
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4503 if (!(regstart && regend && best_regstart && best_regend))
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4504 {
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4505 FREE_VARIABLES ();
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4506 return -2;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4507 }
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4508 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4509 else
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4510 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4511 /* We must initialize all our variables to NULL, so that
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4512 `FREE_VARIABLES' doesn't try to free them. */
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4513 regstart = regend = best_regstart = best_regend = NULL;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4514 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4515 #endif /* MATCH_MAY_ALLOCATE */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4516
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4517 /* The starting position is bogus. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4518 if (pos < 0 || pos > size1 + size2)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4519 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4520 FREE_VARIABLES ();
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4521 return -1;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4522 }
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
4523
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4524 /* Initialize subexpression text positions to -1 to mark ones that no
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4525 start_memory/stop_memory has been seen for. Also initialize the
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4526 register information struct. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4527 for (mcnt = 1; mcnt < num_regs; mcnt++)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4528 {
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4529 regstart[mcnt] = regend[mcnt] = REG_UNSET_VALUE;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4530 }
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
4531
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4532 /* We move `string1' into `string2' if the latter's empty -- but not if
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4533 `string1' is null. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4534 if (size2 == 0 && string1 != NULL)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4535 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4536 string2 = string1;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4537 size2 = size1;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4538 string1 = 0;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4539 size1 = 0;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4540 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4541 end1 = string1 + size1;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4542 end2 = string2 + size2;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4543
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4544 /* Compute where to stop matching, within the two strings. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4545 if (stop <= size1)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4546 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4547 end_match_1 = string1 + stop;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4548 end_match_2 = string2;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4549 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4550 else
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4551 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4552 end_match_1 = end1;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4553 end_match_2 = string2 + stop - size1;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4554 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4555
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
4556 /* `p' scans through the pattern as `d' scans through the data.
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4557 `dend' is the end of the input string that `d' points within. `d'
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4558 is advanced into the following input string whenever necessary, but
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4559 this happens before fetching; therefore, at the beginning of the
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4560 loop, `d' can be pointing at the end of a string, but it cannot
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4561 equal `string2'. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4562 if (size1 > 0 && pos <= size1)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4563 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4564 d = string1 + pos;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4565 dend = end_match_1;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4566 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4567 else
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4568 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4569 d = string2 + pos - size1;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4570 dend = end_match_2;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4571 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4572
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4573 DEBUG_PRINT1 ("The compiled pattern is: ");
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4574 DEBUG_PRINT_COMPILED_PATTERN (bufp, p, pend);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4575 DEBUG_PRINT1 ("The string to match is: `");
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4576 DEBUG_PRINT_DOUBLE_STRING (d, string1, size1, string2, size2);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4577 DEBUG_PRINT1 ("'\n");
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
4578
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4579 /* This loops over pattern commands. It exits by returning from the
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4580 function if the match is complete, or it drops through if the match
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4581 fails at this starting point in the input data. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4582 for (;;)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4583 {
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4584 DEBUG_PRINT2 ("\n%p: ", p);
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4585
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4586 if (p == pend)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4587 { /* End of pattern means we might have succeeded. */
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4588 DEBUG_PRINT1 ("end of pattern ... ");
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
4589
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4590 /* If we haven't matched the entire string, and we want the
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4591 longest match, try backtracking. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4592 if (d != end_match_2)
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4593 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4594 /* 1 if this match ends in the same string (string1 or string2)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4595 as the best previous match. */
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
4596 boolean same_str_p = (FIRST_STRING_P (match_end)
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4597 == MATCHING_IN_FIRST_STRING);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4598 /* 1 if this match is the best seen so far. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4599 boolean best_match_p;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4600
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4601 /* AIX compiler got confused when this was combined
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4602 with the previous declaration. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4603 if (same_str_p)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4604 best_match_p = d > match_end;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4605 else
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4606 best_match_p = !MATCHING_IN_FIRST_STRING;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4607
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4608 DEBUG_PRINT1 ("backtracking.\n");
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4609
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4610 if (!FAIL_STACK_EMPTY ())
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4611 { /* More failure points to try. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4612
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4613 /* If exceeds best match so far, save it. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4614 if (!best_regs_set || best_match_p)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4615 {
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4616 best_regs_set = true;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4617 match_end = d;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4618
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4619 DEBUG_PRINT1 ("\nSAVING match as best so far.\n");
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4620
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4621 for (mcnt = 1; mcnt < num_regs; mcnt++)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4622 {
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4623 best_regstart[mcnt] = regstart[mcnt];
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4624 best_regend[mcnt] = regend[mcnt];
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4625 }
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4626 }
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4627 goto fail;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4628 }
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4629
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4630 /* If no failure points, don't restore garbage. And if
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4631 last match is real best match, don't restore second
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4632 best one. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4633 else if (best_regs_set && !best_match_p)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4634 {
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4635 restore_best_regs:
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4636 /* Restore best match. It may happen that `dend ==
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4637 end_match_1' while the restored d is in string2.
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4638 For example, the pattern `x.*y.*z' against the
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4639 strings `x-' and `y-z-', if the two strings are
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4640 not consecutive in memory. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4641 DEBUG_PRINT1 ("Restoring best registers.\n");
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4642
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4643 d = match_end;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4644 dend = ((d >= string1 && d <= end1)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4645 ? end_match_1 : end_match_2);
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4646
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4647 for (mcnt = 1; mcnt < num_regs; mcnt++)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4648 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4649 regstart[mcnt] = best_regstart[mcnt];
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4650 regend[mcnt] = best_regend[mcnt];
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4651 }
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4652 }
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4653 } /* d != end_match_2 */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4654
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4655 succeed_label:
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4656 DEBUG_PRINT1 ("Accepting match.\n");
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4657
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4658 /* If caller wants register contents data back, do it. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4659 if (regs && !bufp->no_sub)
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4660 {
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4661 /* Have the register data arrays been allocated? */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4662 if (bufp->regs_allocated == REGS_UNALLOCATED)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4663 { /* No. So allocate them with malloc. We need one
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4664 extra element beyond `num_regs' for the `-1' marker
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4665 GNU code uses. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4666 regs->num_regs = MAX (RE_NREGS, num_regs + 1);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4667 regs->start = TALLOC (regs->num_regs, regoff_t);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4668 regs->end = TALLOC (regs->num_regs, regoff_t);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4669 if (regs->start == NULL || regs->end == NULL)
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4670 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4671 FREE_VARIABLES ();
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4672 return -2;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4673 }
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4674 bufp->regs_allocated = REGS_REALLOCATE;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4675 }
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4676 else if (bufp->regs_allocated == REGS_REALLOCATE)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4677 { /* Yes. If we need more elements than were already
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4678 allocated, reallocate them. If we need fewer, just
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4679 leave it alone. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4680 if (regs->num_regs < num_regs + 1)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4681 {
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4682 regs->num_regs = num_regs + 1;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4683 RETALLOC (regs->start, regs->num_regs, regoff_t);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4684 RETALLOC (regs->end, regs->num_regs, regoff_t);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4685 if (regs->start == NULL || regs->end == NULL)
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4686 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4687 FREE_VARIABLES ();
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4688 return -2;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4689 }
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4690 }
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4691 }
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4692 else
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4693 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4694 /* These braces fend off a "empty body in an else-statement"
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4695 warning under GCC when assert expands to nothing. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4696 assert (bufp->regs_allocated == REGS_FIXED);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4697 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4698
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4699 /* Convert the pointer data in `regstart' and `regend' to
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4700 indices. Register zero has to be set differently,
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4701 since we haven't kept track of any info for it. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4702 if (regs->num_regs > 0)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4703 {
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4704 regs->start[0] = pos;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4705 regs->end[0] = (MATCHING_IN_FIRST_STRING
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4706 ? ((regoff_t) (d - string1))
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4707 : ((regoff_t) (d - string2 + size1)));
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4708 }
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4709
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4710 /* Go through the first `min (num_regs, regs->num_regs)'
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4711 registers, since that is all we initialized. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4712 for (mcnt = 1; mcnt < MIN (num_regs, regs->num_regs); mcnt++)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4713 {
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4714 if (REG_UNSET (regstart[mcnt]) || REG_UNSET (regend[mcnt]))
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4715 regs->start[mcnt] = regs->end[mcnt] = -1;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4716 else
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4717 {
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4718 regs->start[mcnt]
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4719 = (regoff_t) POINTER_TO_OFFSET (regstart[mcnt]);
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4720 regs->end[mcnt]
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4721 = (regoff_t) POINTER_TO_OFFSET (regend[mcnt]);
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4722 }
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4723 }
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
4724
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4725 /* If the regs structure we return has more elements than
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4726 were in the pattern, set the extra elements to -1. If
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4727 we (re)allocated the registers, this is the case,
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4728 because we always allocate enough to have at least one
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4729 -1 at the end. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4730 for (mcnt = num_regs; mcnt < regs->num_regs; mcnt++)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4731 regs->start[mcnt] = regs->end[mcnt] = -1;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4732 } /* regs && !bufp->no_sub */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4733
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4734 DEBUG_PRINT4 ("%u failure points pushed, %u popped (%u remain).\n",
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4735 nfailure_points_pushed, nfailure_points_popped,
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4736 nfailure_points_pushed - nfailure_points_popped);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4737 DEBUG_PRINT2 ("%u registers pushed.\n", num_regs_pushed);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4738
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4739 mcnt = d - pos - (MATCHING_IN_FIRST_STRING
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
4740 ? string1
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4741 : string2 - size1);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4742
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4743 DEBUG_PRINT2 ("Returning %d from re_match_2.\n", mcnt);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4744
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4745 FREE_VARIABLES ();
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4746 return mcnt;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4747 }
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4748
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4749 /* Otherwise match next pattern command. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4750 switch (SWITCH_ENUM_CAST ((re_opcode_t) *p++))
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4751 {
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4752 /* Ignore these. Used to ignore the n of succeed_n's which
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4753 currently have n == 0. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4754 case no_op:
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4755 DEBUG_PRINT1 ("EXECUTING no_op.\n");
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4756 break;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4757
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4758 case succeed:
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4759 DEBUG_PRINT1 ("EXECUTING succeed.\n");
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4760 goto succeed_label;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4761
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4762 /* Match the next n pattern characters exactly. The following
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4763 byte in the pattern defines n, and the n bytes after that
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4764 are the characters to match. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4765 case exactn:
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4766 mcnt = *p++;
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4767 DEBUG_PRINT2 ("EXECUTING exactn %d.\n", mcnt);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4768
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4769 /* This is written out as an if-else so we don't waste time
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4770 testing `translate' inside the loop. */
1328
0aa10b723959 Use RE_TRANSLATE_P to check whether translation is
Andreas Schwab <schwab@suse.de>
parents: 1326
diff changeset
4771 if (RE_TRANSLATE_P (translate))
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4772 {
1296
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4773 #ifdef emacs
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4774 if (multibyte)
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4775 do
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4776 {
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4777 int pat_charlen, buf_charlen;
1312
a9a56c9deb21 (re_match_2_internal): Declare buf_ch unsigned int.
Richard Stallman <rms@gnu.org>
parents: 1297
diff changeset
4778 unsigned int pat_ch, buf_ch;
1296
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4779
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4780 PREFETCH ();
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4781 pat_ch = STRING_CHAR_AND_LENGTH (p, pend - p, pat_charlen);
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4782 buf_ch = STRING_CHAR_AND_LENGTH (d, dend - d, buf_charlen);
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4783
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4784 if (RE_TRANSLATE (translate, buf_ch)
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4785 != pat_ch)
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4786 goto fail;
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4787
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4788 p += pat_charlen;
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4789 d += buf_charlen;
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4790 mcnt -= pat_charlen;
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4791 }
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4792 while (mcnt > 0);
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4793 else
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4794 #endif /* not emacs */
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4795 do
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4796 {
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4797 PREFETCH ();
1381
24423cbaf6a9 (re_search_2): Don't use ++ inside RE_TRANSLATE.
Richard Stallman <rms@gnu.org>
parents: 1342
diff changeset
4798 if ((unsigned char) RE_TRANSLATE (translate, (unsigned char) *d)
1296
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4799 != (unsigned char) *p++)
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4800 goto fail;
1381
24423cbaf6a9 (re_search_2): Don't use ++ inside RE_TRANSLATE.
Richard Stallman <rms@gnu.org>
parents: 1342
diff changeset
4801 d++;
1296
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4802 }
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4803 while (--mcnt);
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4804 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4805 else
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4806 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4807 do
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4808 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4809 PREFETCH ();
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4810 if (*d++ != (char) *p++) goto fail;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4811 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4812 while (--mcnt);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4813 }
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4814 break;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4815
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4816
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4817 /* Match any character except possibly a newline or a null. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4818 case anychar:
1296
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4819 {
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4820 int buf_charlen;
1312
a9a56c9deb21 (re_match_2_internal): Declare buf_ch unsigned int.
Richard Stallman <rms@gnu.org>
parents: 1297
diff changeset
4821 unsigned int buf_ch;
1296
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4822
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4823 DEBUG_PRINT1 ("EXECUTING anychar.\n");
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4824
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4825 PREFETCH ();
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4826
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4827 #ifdef emacs
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4828 if (multibyte)
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4829 buf_ch = STRING_CHAR_AND_LENGTH (d, dend - d, buf_charlen);
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4830 else
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4831 #endif /* not emacs */
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4832 {
1313
047101c8fdce (re_match_2) <anychar>: In unibyte case, set buf_ch as unsigned.
Karl Heuer <kwzh@gnu.org>
parents: 1312
diff changeset
4833 buf_ch = (unsigned char) *d;
1296
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4834 buf_charlen = 1;
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4835 }
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4836
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4837 buf_ch = TRANSLATE (buf_ch);
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4838
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4839 if ((!(bufp->syntax & RE_DOT_NEWLINE)
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4840 && buf_ch == '\n')
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4841 || ((bufp->syntax & RE_DOT_NOT_NULL)
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4842 && buf_ch == '\000'))
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4843 goto fail;
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4844
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4845 DEBUG_PRINT2 (" Matched `%d'.\n", *d);
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4846 d += buf_charlen;
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
4847 }
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4848 break;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4849
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4850
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4851 case charset:
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4852 case charset_not:
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4853 {
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4854 register unsigned int c;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4855 boolean not = (re_opcode_t) *(p - 1) == charset_not;
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4856 int len;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4857
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4858 /* Start of actual range_table, or end of bitmap if there is no
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4859 range table. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4860 unsigned char *range_table;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4861
1933
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
4862 /* Nonzero if there is a range table. */
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4863 int range_table_exists;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4864
1933
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
4865 /* Number of ranges of range table. This is not included
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
4866 in the initial byte-length of the command. */
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
4867 int count = 0;
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4868
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4869 DEBUG_PRINT2 ("EXECUTING charset%s.\n", not ? "_not" : "");
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4870
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4871 PREFETCH ();
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4872 c = (unsigned char) *d;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4873
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4874 range_table_exists = CHARSET_RANGE_TABLE_EXISTS_P (&p[-1]);
1933
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
4875
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
4876 #ifdef emacs
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4877 if (range_table_exists)
1933
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
4878 {
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
4879 range_table = CHARSET_RANGE_TABLE (&p[-1]); /* Past the bitmap. */
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
4880 EXTRACT_NUMBER_AND_INCR (count, range_table);
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
4881 }
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4882
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4883 if (multibyte && BASE_LEADING_CODE_P (c))
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4884 c = STRING_CHAR_AND_LENGTH (d, dend - d, len);
1933
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
4885 #endif /* emacs */
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4886
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4887 if (SINGLE_BYTE_CHAR_P (c))
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4888 { /* Lookup bitmap. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4889 c = TRANSLATE (c); /* The character to match. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4890 len = 1;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4891
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4892 /* Cast to `unsigned' instead of `unsigned char' in
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4893 case the bit list is a full 32 bytes long. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4894 if (c < (unsigned) (CHARSET_BITMAP_SIZE (&p[-1]) * BYTEWIDTH)
1933
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
4895 && p[1 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH)))
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
4896 not = !not;
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4897 }
1933
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
4898 #ifdef emacs
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4899 else if (range_table_exists)
1933
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
4900 {
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
4901 int class_bits = CHARSET_RANGE_TABLE_BITS (&p[-1]);
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
4902
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
4903 if ( (class_bits & BIT_ALNUM && ISALNUM (c))
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
4904 | (class_bits & BIT_ALPHA && ISALPHA (c))
1965
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
4905 | (class_bits & BIT_ASCII && IS_REAL_ASCII (c))
1933
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
4906 | (class_bits & BIT_GRAPH && ISGRAPH (c))
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
4907 | (class_bits & BIT_LOWER && ISLOWER (c))
1965
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
4908 | (class_bits & BIT_MULTIBYTE && !ISUNIBYTE (c))
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
4909 | (class_bits & BIT_NONASCII && !IS_REAL_ASCII (c))
1933
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
4910 | (class_bits & BIT_PRINT && ISPRINT (c))
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
4911 | (class_bits & BIT_PUNCT && ISPUNCT (c))
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
4912 | (class_bits & BIT_SPACE && ISSPACE (c))
1965
058a9ce57dd7 1999-09-04 Richard Stallman <rms@gnu.org>
Dave Love <fx@gnu.org>
parents: 1933
diff changeset
4913 | (class_bits & BIT_UNIBYTE && ISUNIBYTE (c))
1933
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
4914 | (class_bits & BIT_UPPER && ISUPPER (c))
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
4915 | (class_bits & BIT_WORD && ISWORD (c)))
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
4916 not = !not;
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
4917 else
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
4918 CHARSET_LOOKUP_RANGE_TABLE_RAW (not, c, range_table, count);
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
4919 }
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
4920 #endif /* emacs */
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
4921
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
4922 if (range_table_exists)
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
4923 p = CHARSET_RANGE_TABLE_END (range_table, count);
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
4924 else
5ffa81ab1988 [emacs]: Handle character classes for multibyte chars:
Richard Stallman <rms@gnu.org>
parents: 1660
diff changeset
4925 p += CHARSET_BITMAP_SIZE (&p[-1]) + 1;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4926
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4927 if (!not) goto fail;
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
4928
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
4929 d += len;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4930 break;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4931 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4932
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4933
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4934 /* The beginning of a group is represented by start_memory.
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4935 The argument is the register number. The text
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4936 matched within the group is recorded (in the internal
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4937 registers data structure) under the register number. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4938 case start_memory:
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4939 DEBUG_PRINT2 ("EXECUTING start_memory %d:\n", *p);
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4940
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4941 /* In case we need to undo this operation (via backtracking). */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4942 PUSH_FAILURE_REG ((unsigned int)*p);
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4943
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4944 regstart[*p] = d;
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4945 regend[*p] = REG_UNSET_VALUE; /* probably unnecessary. -sm */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4946 DEBUG_PRINT2 (" regstart: %d\n", POINTER_TO_OFFSET (regstart[*p]));
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4947
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4948 /* Move past the register number and inner group count. */
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4949 p += 1;
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4950 break;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4951
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4952
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4953 /* The stop_memory opcode represents the end of a group. Its
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4954 argument is the same as start_memory's: the register number. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4955 case stop_memory:
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4956 DEBUG_PRINT2 ("EXECUTING stop_memory %d:\n", *p);
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4957
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4958 assert (!REG_UNSET (regstart[*p]));
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4959 /* Strictly speaking, there should be code such as:
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4960
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4961 assert (REG_UNSET (regend[*p]));
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4962 PUSH_FAILURE_REGSTOP ((unsigned int)*p);
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4963
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4964 But the only info to be pushed is regend[*p] and it is known to
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4965 be UNSET, so there really isn't anything to push.
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4966 Not pushing anything, on the other hand deprives us from the
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4967 guarantee that regend[*p] is UNSET since undoing this operation
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4968 will not reset its value properly. This is not important since
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4969 the value will only be read on the next start_memory or at
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4970 the very end and both events can only happen if this stop_memory
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4971 is *not* undone. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4972
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4973 regend[*p] = d;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4974 DEBUG_PRINT2 (" regend: %d\n", POINTER_TO_OFFSET (regend[*p]));
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4975
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4976 /* Move past the register number and the inner group count. */
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
4977 p += 1;
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4978 break;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4979
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4980
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4981 /* \<digit> has been turned into a `duplicate' command which is
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4982 followed by the numeric value of <digit> as the register number. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4983 case duplicate:
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4984 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4985 register const char *d2, *dend2;
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4986 int regno = *p++; /* Get which register to match against. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4987 DEBUG_PRINT2 ("EXECUTING duplicate %d.\n", regno);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
4988
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4989 /* Can't back reference a group which we've never matched. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4990 if (REG_UNSET (regstart[regno]) || REG_UNSET (regend[regno]))
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4991 goto fail;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4992
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4993 /* Where in input to try to start matching. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4994 d2 = regstart[regno];
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4995
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4996 /* Where to stop matching; if both the place to start and
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4997 the place to stop matching are in the same string, then
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4998 set to the place to stop, otherwise, for now have to use
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
4999 the end of the first string. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5000
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5001 dend2 = ((FIRST_STRING_P (regstart[regno])
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5002 == FIRST_STRING_P (regend[regno]))
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5003 ? regend[regno] : end_match_1);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5004 for (;;)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5005 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5006 /* If necessary, advance to next segment in register
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5007 contents. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5008 while (d2 == dend2)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5009 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5010 if (dend2 == end_match_2) break;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5011 if (dend2 == regend[regno]) break;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5012
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5013 /* End of string1 => advance to string2. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5014 d2 = string2;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5015 dend2 = regend[regno];
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5016 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5017 /* At end of register contents => success */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5018 if (d2 == dend2) break;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5019
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5020 /* If necessary, advance to next segment in data. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5021 PREFETCH ();
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5022
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5023 /* How many characters left in this segment to match. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5024 mcnt = dend - d;
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
5025
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5026 /* Want how many consecutive characters we can match in
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5027 one shot, so, if necessary, adjust the count. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5028 if (mcnt > dend2 - d2)
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5029 mcnt = dend2 - d2;
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
5030
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5031 /* Compare that many; failure if mismatch, else move
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5032 past them. */
1328
0aa10b723959 Use RE_TRANSLATE_P to check whether translation is
Andreas Schwab <schwab@suse.de>
parents: 1326
diff changeset
5033 if (RE_TRANSLATE_P (translate)
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5034 ? bcmp_translate (d, d2, mcnt, translate)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5035 : bcmp (d, d2, mcnt))
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5036 goto fail;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5037 d += mcnt, d2 += mcnt;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5038 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5039 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5040 break;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5041
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5042
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5043 /* begline matches the empty string at the beginning of the string
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5044 (unless `not_bol' is set in `bufp'), and, if
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5045 `newline_anchor' is set, after newlines. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5046 case begline:
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5047 DEBUG_PRINT1 ("EXECUTING begline.\n");
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5048
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5049 if (AT_STRINGS_BEG (d))
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5050 {
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5051 if (!bufp->not_bol) break;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5052 }
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5053 else if (d[-1] == '\n' && bufp->newline_anchor)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5054 {
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5055 break;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5056 }
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5057 /* In all other cases, we fail. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5058 goto fail;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5059
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5060
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5061 /* endline is the dual of begline. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5062 case endline:
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5063 DEBUG_PRINT1 ("EXECUTING endline.\n");
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5064
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5065 if (AT_STRINGS_END (d))
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5066 {
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5067 if (!bufp->not_eol) break;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5068 }
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5069
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5070 /* We have to ``prefetch'' the next character. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5071 else if ((d == end1 ? *string2 : *d) == '\n'
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5072 && bufp->newline_anchor)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5073 {
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5074 break;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5075 }
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5076 goto fail;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5077
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5078
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5079 /* Match at the very beginning of the data. */
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5080 case begbuf:
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5081 DEBUG_PRINT1 ("EXECUTING begbuf.\n");
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5082 if (AT_STRINGS_BEG (d))
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5083 break;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5084 goto fail;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5085
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5086
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5087 /* Match at the very end of the data. */
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5088 case endbuf:
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5089 DEBUG_PRINT1 ("EXECUTING endbuf.\n");
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5090 if (AT_STRINGS_END (d))
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5091 break;
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5092 goto fail;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5093
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5094
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5095 /* on_failure_keep_string_jump is used to optimize `.*\n'. It
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5096 pushes NULL as the value for the string on the stack. Then
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5097 `POP_FAILURE_POINT' will keep the current value for the
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5098 string, instead of restoring it. To see why, consider
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5099 matching `foo\nbar' against `.*\n'. The .* matches the foo;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5100 then the . fails against the \n. But the next thing we want
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5101 to do is match the \n against the \n; if we restored the
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5102 string value, we would be back at the foo.
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5103
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5104 Because this is used only in specific cases, we don't need to
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5105 check all the things that `on_failure_jump' does, to make
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5106 sure the right things get saved on the stack. Hence we don't
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5107 share its code. The only reason to push anything on the
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5108 stack at all is that otherwise we would have to change
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5109 `anychar's code to do something besides goto fail in this
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5110 case; that seems worse than this. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5111 case on_failure_keep_string_jump:
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5112 EXTRACT_NUMBER_AND_INCR (mcnt, p);
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5113 DEBUG_PRINT3 ("EXECUTING on_failure_keep_string_jump %d (to %p):\n",
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5114 mcnt, p + mcnt);
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5115
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5116 PUSH_FAILURE_POINT (p - 3, NULL);
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5117 break;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5118
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5119 case on_failure_jump_exclusive:
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5120 EXTRACT_NUMBER_AND_INCR (mcnt, p);
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5121 DEBUG_PRINT3 ("EXECUTING on_failure_jump_exclusive %d (to %p):\n",
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5122 mcnt, p + mcnt);
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5123
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5124 if (! FAIL_STACK_EMPTY ()
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5125 && FAILURE_PAT (TOP_FAILURE_HANDLE ()) == (p - 3)
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5126 && fail_stack.avail == fail_stack.frame)
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5127 {
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5128 /* We are trying to push failure F2 onto the stack but there
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5129 is already a failure F1 pushed from the same instruction.
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5130 Between F1 and now, something has matched (else this is an
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5131 improper use of on_failure_jump_exclusive), so that we know
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5132 that the fail-destination of F1 cannot match, hence we can
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5133 pop F1 before pushing F2. Instead of doing this pop/push,
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5134 we manually turn F1 into F2.
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5135 `fail_stack.avail == fail_stack.frame' makes sure
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5136 that popping F1 doesn't involve registers, else
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5137 this optimization cannot be done so trivially. */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5138 assert (FAILURE_STR (TOP_FAILURE_HANDLE ()) != d);
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5139 FAILURE_STR (TOP_FAILURE_HANDLE ()) = d;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5140 }
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5141 else
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5142 PUSH_FAILURE_POINT (p - 3, d);
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5143 break;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5144
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5145 case on_failure_jump_loop:
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5146 on_failure:
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5147 EXTRACT_NUMBER_AND_INCR (mcnt, p);
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5148 DEBUG_PRINT3 ("EXECUTING on_failure_jump_loop %d (to %p):\n",
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5149 mcnt, p + mcnt);
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5150
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5151 CHECK_INFINITE_LOOP (p - 3, d);
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5152 PUSH_FAILURE_POINT (p - 3, d);
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5153 break;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5154
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5155
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5156 /* Uses of on_failure_jump:
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
5157
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5158 Each alternative starts with an on_failure_jump that points
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5159 to the beginning of the next alternative. Each alternative
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5160 except the last ends with a jump that in effect jumps past
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5161 the rest of the alternatives. (They really jump to the
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5162 ending jump of the following alternative, because tensioning
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5163 these jumps is a hassle.)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5164
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5165 Repeats start with an on_failure_jump that points past both
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5166 the repetition text and either the following jump or
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5167 pop_failure_jump back to this on_failure_jump. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5168 case on_failure_jump:
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5169
1660
ef1f39a7e7c3 (re_match_2_internal) [WINDOWSNT & emacs]: Insert QUIT at various places.
Richard Stallman <rms@gnu.org>
parents: 1583
diff changeset
5170 #if defined (WINDOWSNT) && defined (emacs)
ef1f39a7e7c3 (re_match_2_internal) [WINDOWSNT & emacs]: Insert QUIT at various places.
Richard Stallman <rms@gnu.org>
parents: 1583
diff changeset
5171 QUIT;
ef1f39a7e7c3 (re_match_2_internal) [WINDOWSNT & emacs]: Insert QUIT at various places.
Richard Stallman <rms@gnu.org>
parents: 1583
diff changeset
5172 #endif
ef1f39a7e7c3 (re_match_2_internal) [WINDOWSNT & emacs]: Insert QUIT at various places.
Richard Stallman <rms@gnu.org>
parents: 1583
diff changeset
5173
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5174 EXTRACT_NUMBER_AND_INCR (mcnt, p);
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5175 DEBUG_PRINT3 ("EXECUTING on_failure_jump %d (to %p):\n",
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5176 mcnt, p + mcnt);
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5177
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5178 PUSH_FAILURE_POINT (p -3, d);
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5179 break;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5180
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5181 /* This operation is used for greedy * and +.
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5182 Compare the beginning of the repeat with what in the
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5183 pattern follows its end. If we can establish that there
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5184 is nothing that they would both match, i.e., that we
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5185 would have to backtrack because of (as in, e.g., `a*a')
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5186 then we can use a non-backtracking loop based on
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5187 on_failure_jump_exclusive instead of on_failure_jump_loop. */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5188 case on_failure_jump_smart:
1660
ef1f39a7e7c3 (re_match_2_internal) [WINDOWSNT & emacs]: Insert QUIT at various places.
Richard Stallman <rms@gnu.org>
parents: 1583
diff changeset
5189 #if defined (WINDOWSNT) && defined (emacs)
ef1f39a7e7c3 (re_match_2_internal) [WINDOWSNT & emacs]: Insert QUIT at various places.
Richard Stallman <rms@gnu.org>
parents: 1583
diff changeset
5190 QUIT;
ef1f39a7e7c3 (re_match_2_internal) [WINDOWSNT & emacs]: Insert QUIT at various places.
Richard Stallman <rms@gnu.org>
parents: 1583
diff changeset
5191 #endif
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5192 EXTRACT_NUMBER_AND_INCR (mcnt, p);
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5193 DEBUG_PRINT3 ("EXECUTING on_failure_jump_smart %d (to %p).\n",
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5194 mcnt, p + mcnt);
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5195 {
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5196 unsigned char *p1 = p; /* Next operation. */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5197 unsigned char *p2 = p + mcnt; /* Destination of the jump. */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5198
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5199 p -= 3; /* Reset so that we will re-execute the
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5200 instruction once it's been changed. */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5201
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5202 /* DEBUG_STATEMENT (debug = 1); */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5203 if (mutually_exclusive_p (bufp, p1, p2))
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5204 {
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5205 /* Use a fast `on_failure_keep_string_jump' loop. */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5206 *p = (unsigned char) on_failure_jump_exclusive;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5207 /* STORE_NUMBER (p2 - 2, mcnt + 3); */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5208 }
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5209 else
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5210 {
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5211 /* Default to a safe `on_failure_jump' loop. */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5212 DEBUG_PRINT1 (" smart default => slow loop.\n");
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5213 *p = (unsigned char) on_failure_jump_loop;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5214 }
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5215 /* DEBUG_STATEMENT (debug = 0); */
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5216 }
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5217 break;
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5218
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5219 /* Unconditionally jump (without popping any failure points). */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5220 case jump:
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5221 unconditional_jump:
1660
ef1f39a7e7c3 (re_match_2_internal) [WINDOWSNT & emacs]: Insert QUIT at various places.
Richard Stallman <rms@gnu.org>
parents: 1583
diff changeset
5222 #if defined (WINDOWSNT) && defined (emacs)
ef1f39a7e7c3 (re_match_2_internal) [WINDOWSNT & emacs]: Insert QUIT at various places.
Richard Stallman <rms@gnu.org>
parents: 1583
diff changeset
5223 QUIT;
ef1f39a7e7c3 (re_match_2_internal) [WINDOWSNT & emacs]: Insert QUIT at various places.
Richard Stallman <rms@gnu.org>
parents: 1583
diff changeset
5224 #endif
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5225 EXTRACT_NUMBER_AND_INCR (mcnt, p); /* Get the amount to jump. */
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5226 DEBUG_PRINT2 ("EXECUTING jump %d ", mcnt);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5227 p += mcnt; /* Do the jump. */
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5228 DEBUG_PRINT2 ("(to %p).\n", p);
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5229 break;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5230
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5231
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5232 /* Have to succeed matching what follows at least n times.
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5233 After that, handle like `on_failure_jump'. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5234 case succeed_n:
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5235 EXTRACT_NUMBER (mcnt, p + 2);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5236 DEBUG_PRINT2 ("EXECUTING succeed_n %d.\n", mcnt);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5237
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5238 assert (mcnt >= 0);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5239 /* Originally, this is how many times we HAVE to succeed. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5240 if (mcnt > 0)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5241 {
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5242 mcnt--;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5243 p += 2;
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5244 STORE_NUMBER_AND_INCR (p, mcnt);
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5245 DEBUG_PRINT3 (" Setting %p to %d.\n", p, mcnt);
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5246 }
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5247 else if (mcnt == 0)
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5248 {
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5249 DEBUG_PRINT2 (" Setting two bytes from %p to no_op.\n", p+2);
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5250 p[2] = (unsigned char) no_op;
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5251 p[3] = (unsigned char) no_op;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5252 goto on_failure;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5253 }
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5254 break;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5255
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5256 case jump_n:
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5257 EXTRACT_NUMBER (mcnt, p + 2);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5258 DEBUG_PRINT2 ("EXECUTING jump_n %d.\n", mcnt);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5259
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5260 /* Originally, this is how many times we CAN jump. */
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5261 if (mcnt)
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5262 {
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5263 mcnt--;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5264 STORE_NUMBER (p + 2, mcnt);
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
5265 goto unconditional_jump;
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5266 }
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5267 /* If don't have to jump any more, skip over the rest of command. */
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
5268 else
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
5269 p += 4;
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5270 break;
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
5271
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5272 case set_number_at:
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5273 {
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5274 DEBUG_PRINT1 ("EXECUTING set_number_at.\n");
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5275
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5276 EXTRACT_NUMBER_AND_INCR (mcnt, p);
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5277 p1 = p + mcnt;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5278 EXTRACT_NUMBER_AND_INCR (mcnt, p);
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5279 DEBUG_PRINT3 (" Setting %p to %d.\n", p1, mcnt);
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5280 STORE_NUMBER (p1, mcnt);
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5281 break;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5282 }
521
7089c3a3a164 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 515
diff changeset
5283
7089c3a3a164 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 515
diff changeset
5284 case wordbound:
7089c3a3a164 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 515
diff changeset
5285 DEBUG_PRINT1 ("EXECUTING wordbound.\n");
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5286
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5287 /* We SUCCEED in one of the following cases: */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5288
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5289 /* Case 1: D is at the beginning or the end of string. */
521
7089c3a3a164 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 515
diff changeset
5290 if (AT_STRINGS_BEG (d) || AT_STRINGS_END (d))
7089c3a3a164 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 515
diff changeset
5291 break;
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5292 else
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5293 {
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5294 /* C1 is the character before D, S1 is the syntax of C1, C2
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5295 is the character at D, and S2 is the syntax of C2. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5296 int c1, c2, s1, s2;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5297 int pos1 = PTR_TO_OFFSET (d - 1);
1204
28ff40a118b8 (re_search_2): Fix call to CHAR_HEAD_P.
Richard Stallman <rms@gnu.org>
parents: 1158
diff changeset
5298 int charpos;
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5299
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5300 GET_CHAR_BEFORE_2 (c1, d, string1, end1, string2, end2);
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5301 GET_CHAR_AFTER_2 (c2, d, string1, end1, string2, end2);
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5302 #ifdef emacs
1382
894acce816ca (POS_AS_IN_BUFFER): Add 1 only if operating on a buffer.
Richard Stallman <rms@gnu.org>
parents: 1381
diff changeset
5303 charpos = SYNTAX_TABLE_BYTE_TO_CHAR (pos1);
1204
28ff40a118b8 (re_search_2): Fix call to CHAR_HEAD_P.
Richard Stallman <rms@gnu.org>
parents: 1158
diff changeset
5304 UPDATE_SYNTAX_TABLE (charpos);
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5305 #endif
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5306 s1 = SYNTAX (c1);
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5307 #ifdef emacs
1204
28ff40a118b8 (re_search_2): Fix call to CHAR_HEAD_P.
Richard Stallman <rms@gnu.org>
parents: 1158
diff changeset
5308 UPDATE_SYNTAX_TABLE_FORWARD (charpos + 1);
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5309 #endif
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5310 s2 = SYNTAX (c2);
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5311
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5312 if (/* Case 2: Only one of S1 and S2 is Sword. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5313 ((s1 == Sword) != (s2 == Sword))
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5314 /* Case 3: Both of S1 and S2 are Sword, and macro
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5315 WORD_BOUNDARY_P (C1, C2) returns nonzero. */
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5316 || ((s1 == Sword) && WORD_BOUNDARY_P (c1, c2)))
521
7089c3a3a164 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 515
diff changeset
5317 break;
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5318 }
521
7089c3a3a164 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 515
diff changeset
5319 goto fail;
7089c3a3a164 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 515
diff changeset
5320
7089c3a3a164 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 515
diff changeset
5321 case notwordbound:
7089c3a3a164 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 515
diff changeset
5322 DEBUG_PRINT1 ("EXECUTING notwordbound.\n");
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5323
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5324 /* We FAIL in one of the following cases: */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5325
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5326 /* Case 1: D is at the beginning or the end of string. */
521
7089c3a3a164 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 515
diff changeset
5327 if (AT_STRINGS_BEG (d) || AT_STRINGS_END (d))
7089c3a3a164 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 515
diff changeset
5328 goto fail;
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5329 else
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5330 {
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5331 /* C1 is the character before D, S1 is the syntax of C1, C2
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5332 is the character at D, and S2 is the syntax of C2. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5333 int c1, c2, s1, s2;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5334 int pos1 = PTR_TO_OFFSET (d - 1);
1204
28ff40a118b8 (re_search_2): Fix call to CHAR_HEAD_P.
Richard Stallman <rms@gnu.org>
parents: 1158
diff changeset
5335 int charpos;
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5336
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5337 GET_CHAR_BEFORE_2 (c1, d, string1, end1, string2, end2);
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5338 GET_CHAR_AFTER_2 (c2, d, string1, end1, string2, end2);
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5339 #ifdef emacs
1218
51cf07183c67 (re_match_2_internal): Use SYNTAX_TABLE_BYTE_TO_CHAR.
Richard Stallman <rms@gnu.org>
parents: 1204
diff changeset
5340 charpos = SYNTAX_TABLE_BYTE_TO_CHAR (pos1);
1204
28ff40a118b8 (re_search_2): Fix call to CHAR_HEAD_P.
Richard Stallman <rms@gnu.org>
parents: 1158
diff changeset
5341 UPDATE_SYNTAX_TABLE (charpos);
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5342 #endif
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5343 s1 = SYNTAX (c1);
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5344 #ifdef emacs
1204
28ff40a118b8 (re_search_2): Fix call to CHAR_HEAD_P.
Richard Stallman <rms@gnu.org>
parents: 1158
diff changeset
5345 UPDATE_SYNTAX_TABLE_FORWARD (charpos + 1);
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5346 #endif
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5347 s2 = SYNTAX (c2);
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5348
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5349 if (/* Case 2: Only one of S1 and S2 is Sword. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5350 ((s1 == Sword) != (s2 == Sword))
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5351 /* Case 3: Both of S1 and S2 are Sword, and macro
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5352 WORD_BOUNDARY_P (C1, C2) returns nonzero. */
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5353 || ((s1 == Sword) && WORD_BOUNDARY_P (c1, c2)))
521
7089c3a3a164 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 515
diff changeset
5354 goto fail;
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5355 }
521
7089c3a3a164 (AT_WORD_BOUNDARY): Disable macro.
Karl Heuer <kwzh@gnu.org>
parents: 515
diff changeset
5356 break;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5357
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5358 case wordbeg:
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5359 DEBUG_PRINT1 ("EXECUTING wordbeg.\n");
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5360
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5361 /* We FAIL in one of the following cases: */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5362
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5363 /* Case 1: D is at the end of string. */
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5364 if (AT_STRINGS_END (d))
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5365 goto fail;
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5366 else
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5367 {
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5368 /* C1 is the character before D, S1 is the syntax of C1, C2
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5369 is the character at D, and S2 is the syntax of C2. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5370 int c1, c2, s1, s2;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5371 int pos1 = PTR_TO_OFFSET (d);
1204
28ff40a118b8 (re_search_2): Fix call to CHAR_HEAD_P.
Richard Stallman <rms@gnu.org>
parents: 1158
diff changeset
5372 int charpos;
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5373
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5374 GET_CHAR_AFTER_2 (c2, d, string1, end1, string2, end2);
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5375 #ifdef emacs
1218
51cf07183c67 (re_match_2_internal): Use SYNTAX_TABLE_BYTE_TO_CHAR.
Richard Stallman <rms@gnu.org>
parents: 1204
diff changeset
5376 charpos = SYNTAX_TABLE_BYTE_TO_CHAR (pos1);
51cf07183c67 (re_match_2_internal): Use SYNTAX_TABLE_BYTE_TO_CHAR.
Richard Stallman <rms@gnu.org>
parents: 1204
diff changeset
5377 UPDATE_SYNTAX_TABLE (charpos);
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5378 #endif
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5379 s2 = SYNTAX (c2);
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5380
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5381 /* Case 2: S2 is not Sword. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5382 if (s2 != Sword)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5383 goto fail;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5384
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5385 /* Case 3: D is not at the beginning of string ... */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5386 if (!AT_STRINGS_BEG (d))
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5387 {
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5388 GET_CHAR_BEFORE_2 (c1, d, string1, end1, string2, end2);
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5389 #ifdef emacs
1204
28ff40a118b8 (re_search_2): Fix call to CHAR_HEAD_P.
Richard Stallman <rms@gnu.org>
parents: 1158
diff changeset
5390 UPDATE_SYNTAX_TABLE_BACKWARD (charpos - 1);
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5391 #endif
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5392 s1 = SYNTAX (c1);
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5393
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5394 /* ... and S1 is Sword, and WORD_BOUNDARY_P (C1, C2)
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5395 returns 0. */
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5396 if ((s1 == Sword) && !WORD_BOUNDARY_P (c1, c2))
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5397 goto fail;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5398 }
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5399 }
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5400 break;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5401
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5402 case wordend:
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5403 DEBUG_PRINT1 ("EXECUTING wordend.\n");
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5404
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5405 /* We FAIL in one of the following cases: */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5406
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5407 /* Case 1: D is at the beginning of string. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5408 if (AT_STRINGS_BEG (d))
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5409 goto fail;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5410 else
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5411 {
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5412 /* C1 is the character before D, S1 is the syntax of C1, C2
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5413 is the character at D, and S2 is the syntax of C2. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5414 int c1, c2, s1, s2;
1204
28ff40a118b8 (re_search_2): Fix call to CHAR_HEAD_P.
Richard Stallman <rms@gnu.org>
parents: 1158
diff changeset
5415 int pos1 = PTR_TO_OFFSET (d);
28ff40a118b8 (re_search_2): Fix call to CHAR_HEAD_P.
Richard Stallman <rms@gnu.org>
parents: 1158
diff changeset
5416 int charpos;
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5417
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5418 GET_CHAR_BEFORE_2 (c1, d, string1, end1, string2, end2);
1204
28ff40a118b8 (re_search_2): Fix call to CHAR_HEAD_P.
Richard Stallman <rms@gnu.org>
parents: 1158
diff changeset
5419 #ifdef emacs
1218
51cf07183c67 (re_match_2_internal): Use SYNTAX_TABLE_BYTE_TO_CHAR.
Richard Stallman <rms@gnu.org>
parents: 1204
diff changeset
5420 charpos = SYNTAX_TABLE_BYTE_TO_CHAR (pos1 - 1);
51cf07183c67 (re_match_2_internal): Use SYNTAX_TABLE_BYTE_TO_CHAR.
Richard Stallman <rms@gnu.org>
parents: 1204
diff changeset
5421 UPDATE_SYNTAX_TABLE (charpos);
1204
28ff40a118b8 (re_search_2): Fix call to CHAR_HEAD_P.
Richard Stallman <rms@gnu.org>
parents: 1158
diff changeset
5422 #endif
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5423 s1 = SYNTAX (c1);
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5424
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5425 /* Case 2: S1 is not Sword. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5426 if (s1 != Sword)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5427 goto fail;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5428
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5429 /* Case 3: D is not at the end of string ... */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5430 if (!AT_STRINGS_END (d))
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5431 {
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5432 GET_CHAR_AFTER_2 (c2, d, string1, end1, string2, end2);
1204
28ff40a118b8 (re_search_2): Fix call to CHAR_HEAD_P.
Richard Stallman <rms@gnu.org>
parents: 1158
diff changeset
5433 #ifdef emacs
28ff40a118b8 (re_search_2): Fix call to CHAR_HEAD_P.
Richard Stallman <rms@gnu.org>
parents: 1158
diff changeset
5434 UPDATE_SYNTAX_TABLE_FORWARD (charpos);
28ff40a118b8 (re_search_2): Fix call to CHAR_HEAD_P.
Richard Stallman <rms@gnu.org>
parents: 1158
diff changeset
5435 #endif
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5436 s2 = SYNTAX (c2);
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5437
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5438 /* ... and S2 is Sword, and WORD_BOUNDARY_P (C1, C2)
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5439 returns 0. */
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5440 if ((s2 == Sword) && !WORD_BOUNDARY_P (c1, c2))
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5441 goto fail;
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5442 }
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5443 }
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5444 break;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5445
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5446 #ifdef emacs
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5447 case before_dot:
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5448 DEBUG_PRINT1 ("EXECUTING before_dot.\n");
1204
28ff40a118b8 (re_search_2): Fix call to CHAR_HEAD_P.
Richard Stallman <rms@gnu.org>
parents: 1158
diff changeset
5449 if (PTR_BYTE_POS ((unsigned char *) d) >= PT_BYTE)
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5450 goto fail;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5451 break;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5452
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5453 case at_dot:
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5454 DEBUG_PRINT1 ("EXECUTING at_dot.\n");
1204
28ff40a118b8 (re_search_2): Fix call to CHAR_HEAD_P.
Richard Stallman <rms@gnu.org>
parents: 1158
diff changeset
5455 if (PTR_BYTE_POS ((unsigned char *) d) != PT_BYTE)
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5456 goto fail;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5457 break;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5458
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5459 case after_dot:
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5460 DEBUG_PRINT1 ("EXECUTING after_dot.\n");
1204
28ff40a118b8 (re_search_2): Fix call to CHAR_HEAD_P.
Richard Stallman <rms@gnu.org>
parents: 1158
diff changeset
5461 if (PTR_BYTE_POS ((unsigned char *) d) <= PT_BYTE)
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5462 goto fail;
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5463 break;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5464
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5465 case syntaxspec:
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5466 DEBUG_PRINT2 ("EXECUTING syntaxspec %d.\n", mcnt);
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5467 mcnt = *p++;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5468 goto matchsyntax;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5469
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5470 case wordchar:
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5471 DEBUG_PRINT1 ("EXECUTING Emacs wordchar.\n");
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5472 mcnt = (int) Sword;
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5473 matchsyntax:
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5474 PREFETCH ();
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5475 #ifdef emacs
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5476 {
1218
51cf07183c67 (re_match_2_internal): Use SYNTAX_TABLE_BYTE_TO_CHAR.
Richard Stallman <rms@gnu.org>
parents: 1204
diff changeset
5477 int pos1 = SYNTAX_TABLE_BYTE_TO_CHAR (PTR_TO_OFFSET (d));
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5478 UPDATE_SYNTAX_TABLE (pos1);
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5479 }
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5480 #endif
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5481 {
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5482 int c, len;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5483
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5484 if (multibyte)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5485 /* we must concern about multibyte form, ... */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5486 c = STRING_CHAR_AND_LENGTH (d, dend - d, len);
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5487 else
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5488 /* everything should be handled as ASCII, even though it
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5489 looks like multibyte form. */
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5490 c = *d, len = 1;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5491
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5492 if (SYNTAX (c) != (enum syntaxcode) mcnt)
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5493 goto fail;
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5494 d += len;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5495 }
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5496 break;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5497
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5498 case notsyntaxspec:
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5499 DEBUG_PRINT2 ("EXECUTING notsyntaxspec %d.\n", mcnt);
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5500 mcnt = *p++;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5501 goto matchnotsyntax;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5502
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5503 case notwordchar:
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5504 DEBUG_PRINT1 ("EXECUTING Emacs notwordchar.\n");
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5505 mcnt = (int) Sword;
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5506 matchnotsyntax:
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5507 PREFETCH ();
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5508 #ifdef emacs
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5509 {
1218
51cf07183c67 (re_match_2_internal): Use SYNTAX_TABLE_BYTE_TO_CHAR.
Richard Stallman <rms@gnu.org>
parents: 1204
diff changeset
5510 int pos1 = SYNTAX_TABLE_BYTE_TO_CHAR (PTR_TO_OFFSET (d));
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5511 UPDATE_SYNTAX_TABLE (pos1);
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5512 }
941
a6403bc27be4 Fix up whitespace.
Richard Stallman <rms@gnu.org>
parents: 939
diff changeset
5513 #endif
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5514 {
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5515 int c, len;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5516
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5517 if (multibyte)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5518 c = STRING_CHAR_AND_LENGTH (d, dend - d, len);
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5519 else
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5520 c = *d, len = 1;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5521
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5522 if (SYNTAX (c) == (enum syntaxcode) mcnt)
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5523 goto fail;
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5524 d += len;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5525 }
679
b088267ea1c8 Clean up whitespace.
Richard Stallman <rms@gnu.org>
parents: 678
diff changeset
5526 break;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5527
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5528 case categoryspec:
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5529 DEBUG_PRINT2 ("EXECUTING categoryspec %d.\n", *p);
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5530 mcnt = *p++;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5531 PREFETCH ();
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5532 {
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5533 int c, len;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5534
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5535 if (multibyte)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5536 c = STRING_CHAR_AND_LENGTH (d, dend - d, len);
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5537 else
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5538 c = *d, len = 1;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5539
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5540 if (!CHAR_HAS_CATEGORY (c, mcnt))
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5541 goto fail;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5542 d += len;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5543 }
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5544 break;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5545
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5546 case notcategoryspec:
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5547 DEBUG_PRINT2 ("EXECUTING notcategoryspec %d.\n", *p);
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5548 mcnt = *p++;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5549 PREFETCH ();
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5550 {
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5551 int c, len;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5552
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5553 if (multibyte)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5554 c = STRING_CHAR_AND_LENGTH (d, dend - d, len);
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5555 else
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5556 c = *d, len = 1;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5557
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5558 if (CHAR_HAS_CATEGORY (c, mcnt))
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5559 goto fail;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5560 d += len;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5561 }
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5562 break;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5563
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5564 #else /* not emacs */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5565 case wordchar:
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5566 DEBUG_PRINT1 ("EXECUTING non-Emacs wordchar.\n");
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5567 PREFETCH ();
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5568 if (!WORDCHAR_P (d))
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5569 goto fail;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5570 d++;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5571 break;
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
5572
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5573 case notwordchar:
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5574 DEBUG_PRINT1 ("EXECUTING non-Emacs notwordchar.\n");
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5575 PREFETCH ();
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5576 if (WORDCHAR_P (d))
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5577 goto fail;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5578 d++;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5579 break;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5580 #endif /* not emacs */
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
5581
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5582 default:
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5583 abort ();
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5584 }
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5585 continue; /* Successfully executed one pattern command; keep going. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5586
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5587
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5588 /* We goto here if a matching operation fails. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5589 fail:
1660
ef1f39a7e7c3 (re_match_2_internal) [WINDOWSNT & emacs]: Insert QUIT at various places.
Richard Stallman <rms@gnu.org>
parents: 1583
diff changeset
5590 #if defined (WINDOWSNT) && defined (emacs)
ef1f39a7e7c3 (re_match_2_internal) [WINDOWSNT & emacs]: Insert QUIT at various places.
Richard Stallman <rms@gnu.org>
parents: 1583
diff changeset
5591 QUIT;
ef1f39a7e7c3 (re_match_2_internal) [WINDOWSNT & emacs]: Insert QUIT at various places.
Richard Stallman <rms@gnu.org>
parents: 1583
diff changeset
5592 #endif
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5593 if (!FAIL_STACK_EMPTY ())
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5594 {
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5595 char *str;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5596 unsigned char *pat;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5597 /* A restart point is known. Restore to that state. */
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5598 DEBUG_PRINT1 ("\nFAIL:\n");
2345
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5599 POP_FAILURE_POINT (str, pat);
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5600 switch (SWITCH_ENUM_CAST ((re_opcode_t) *pat++))
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5601 {
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5602 case on_failure_keep_string_jump:
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5603 assert (str == NULL);
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5604 goto continue_failure_jump;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5605
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5606 case on_failure_jump_exclusive:
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5607 /* If something has matched, the alternative will not match,
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5608 so we might as well keep popping right away. */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5609 if (0 /* d != str && d != string2 */) /* Don't bother. -sm */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5610 /* (d == string2 && str == end1) => (d =~ str) */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5611 goto fail;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5612 /* Fallthrough */
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5613
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5614 case on_failure_jump_loop:
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5615 case on_failure_jump:
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5616 case succeed_n:
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5617 d = str;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5618 continue_failure_jump:
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5619 EXTRACT_NUMBER_AND_INCR (mcnt, pat);
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5620 p = pat + mcnt;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5621 break;
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5622
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5623 default:
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5624 abort();
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5625 }
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5626
93d6633849d6 This is a big redesign of failure-stack and register handling, prompted
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 2153
diff changeset
5627 assert (p >= bufp->buffer && p <= pend);
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5628
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5629 if (d >= string1 && d <= end1)
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5630 dend = end_match_1;
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5631 }
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5632 else
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5633 break; /* Matching at this starting point really fails. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5634 } /* for (;;) */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5635
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5636 if (best_regs_set)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5637 goto restore_best_regs;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5638
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5639 FREE_VARIABLES ();
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5640
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5641 return -1; /* Failure to match. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5642 } /* re_match_2 */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5643
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5644 /* Subroutine definitions for re_match_2. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5645
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5646 /* Return zero if TRANSLATE[S1] and TRANSLATE[S2] are identical for LEN
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5647 bytes; nonzero otherwise. */
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
5648
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5649 static int
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5650 bcmp_translate (s1, s2, len, translate)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5651 unsigned char *s1, *s2;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5652 register int len;
501
f29b13c2cefd (TRANSLATE, PATFETCH): Cast elt of `translate'.
Richard Stallman <rms@gnu.org>
parents: 490
diff changeset
5653 RE_TRANSLATE_TYPE translate;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5654 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5655 register unsigned char *p1 = s1, *p2 = s2;
1296
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
5656 unsigned char *p1_end = s1 + len;
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
5657 unsigned char *p2_end = s2 + len;
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
5658
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
5659 while (p1 != p1_end && p2 != p2_end)
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5660 {
1296
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
5661 int p1_charlen, p2_charlen;
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
5662 int p1_ch, p2_ch;
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
5663
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
5664 p1_ch = STRING_CHAR_AND_LENGTH (p1, p1_end - p1, p1_charlen);
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
5665 p2_ch = STRING_CHAR_AND_LENGTH (p2, p2_end - p2, p2_charlen);
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
5666
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
5667 if (RE_TRANSLATE (translate, p1_ch)
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
5668 != RE_TRANSLATE (translate, p2_ch))
963
ed0235161e4b (TRANSLATE, re_search_2, re_match_2_internal,bcmp_translate):
Richard Stallman <rms@gnu.org>
parents: 961
diff changeset
5669 return 1;
1296
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
5670
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
5671 p1 += p1_charlen, p2 += p2_charlen;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5672 }
1296
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
5673
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
5674 if (p1 != p1_end || p2 != p2_end)
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
5675 return 1;
7b938cc81ae2 (compile_range): Unused function deleted.
Richard Stallman <rms@gnu.org>
parents: 1218
diff changeset
5676
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5677 return 0;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5678 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5679
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5680 /* Entry points for GNU code. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5681
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5682 /* re_compile_pattern is the GNU regular expression compiler: it
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5683 compiles PATTERN (of length SIZE) and puts the result in BUFP.
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5684 Returns 0 if the pattern was valid, otherwise an error string.
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
5685
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5686 Assumes the `allocated' (and perhaps `buffer') and `translate' fields
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5687 are set in BUFP on entry.
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
5688
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5689 We call regex_compile to do the actual compilation. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5690
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5691 const char *
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5692 re_compile_pattern (pattern, length, bufp)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5693 const char *pattern;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5694 int length;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5695 struct re_pattern_buffer *bufp;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5696 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5697 reg_errcode_t ret;
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
5698
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5699 /* GNU code is written to assume at least RE_NREGS registers will be set
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5700 (and at least one extra will be -1). */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5701 bufp->regs_allocated = REGS_UNALLOCATED;
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
5702
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5703 /* And GNU code determines whether or not to get register information
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5704 by passing null for the REGS argument to re_match, etc., not by
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5705 setting no_sub. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5706 bufp->no_sub = 0;
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
5707
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5708 /* Match anchors at newline. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5709 bufp->newline_anchor = 1;
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
5710
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5711 ret = regex_compile (pattern, length, re_syntax_options, bufp);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5712
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5713 if (!ret)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5714 return NULL;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5715 return gettext (re_error_msgid[(int) ret]);
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
5716 }
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5717
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5718 /* Entry points compatible with 4.2 BSD regex library. We don't define
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5719 them unless specifically requested. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5720
622
152fc00ed9b5 Tue May 21 19:18:05 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
Roland McGrath <roland@gnu.org>
parents: 607
diff changeset
5721 #if defined (_REGEX_RE_COMP) || defined (_LIBC)
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5722
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5723 /* BSD has one and only one pattern buffer. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5724 static struct re_pattern_buffer re_comp_buf;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5725
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5726 char *
636
ddd029a89661 [_LIBC] (re_comp, re_exec): Use `weak_function' keyword in defn instead of
Roland McGrath <roland@gnu.org>
parents: 631
diff changeset
5727 #ifdef _LIBC
ddd029a89661 [_LIBC] (re_comp, re_exec): Use `weak_function' keyword in defn instead of
Roland McGrath <roland@gnu.org>
parents: 631
diff changeset
5728 /* Make these definitions weak in libc, so POSIX programs can redefine
ddd029a89661 [_LIBC] (re_comp, re_exec): Use `weak_function' keyword in defn instead of
Roland McGrath <roland@gnu.org>
parents: 631
diff changeset
5729 these names if they don't use our functions, and still use
ddd029a89661 [_LIBC] (re_comp, re_exec): Use `weak_function' keyword in defn instead of
Roland McGrath <roland@gnu.org>
parents: 631
diff changeset
5730 regcomp/regexec below without link errors. */
ddd029a89661 [_LIBC] (re_comp, re_exec): Use `weak_function' keyword in defn instead of
Roland McGrath <roland@gnu.org>
parents: 631
diff changeset
5731 weak_function
ddd029a89661 [_LIBC] (re_comp, re_exec): Use `weak_function' keyword in defn instead of
Roland McGrath <roland@gnu.org>
parents: 631
diff changeset
5732 #endif
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5733 re_comp (s)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5734 const char *s;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5735 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5736 reg_errcode_t ret;
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
5737
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5738 if (!s)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5739 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5740 if (!re_comp_buf.buffer)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5741 return gettext ("No previous regular expression");
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5742 return 0;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5743 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5744
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5745 if (!re_comp_buf.buffer)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5746 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5747 re_comp_buf.buffer = (unsigned char *) malloc (200);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5748 if (re_comp_buf.buffer == NULL)
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5749 return gettext (re_error_msgid[(int) REG_ESPACE]);
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5750 re_comp_buf.allocated = 200;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5751
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5752 re_comp_buf.fastmap = (char *) malloc (1 << BYTEWIDTH);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5753 if (re_comp_buf.fastmap == NULL)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5754 return gettext (re_error_msgid[(int) REG_ESPACE]);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5755 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5756
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5757 /* Since `re_exec' always passes NULL for the `regs' argument, we
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5758 don't need to initialize the pattern buffer fields which affect it. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5759
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5760 /* Match anchors at newlines. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5761 re_comp_buf.newline_anchor = 1;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5762
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5763 ret = regex_compile (s, strlen (s), re_syntax_options, &re_comp_buf);
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
5764
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5765 if (!ret)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5766 return NULL;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5767
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5768 /* Yes, we're discarding `const' here if !HAVE_LIBINTL. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5769 return (char *) gettext (re_error_msgid[(int) ret]);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5770 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5771
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5772
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5773 int
636
ddd029a89661 [_LIBC] (re_comp, re_exec): Use `weak_function' keyword in defn instead of
Roland McGrath <roland@gnu.org>
parents: 631
diff changeset
5774 #ifdef _LIBC
ddd029a89661 [_LIBC] (re_comp, re_exec): Use `weak_function' keyword in defn instead of
Roland McGrath <roland@gnu.org>
parents: 631
diff changeset
5775 weak_function
ddd029a89661 [_LIBC] (re_comp, re_exec): Use `weak_function' keyword in defn instead of
Roland McGrath <roland@gnu.org>
parents: 631
diff changeset
5776 #endif
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5777 re_exec (s)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5778 const char *s;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5779 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5780 const int len = strlen (s);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5781 return
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5782 0 <= re_search (&re_comp_buf, s, len, 0, len, (struct re_registers *) 0);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5783 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5784 #endif /* _REGEX_RE_COMP */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5785
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5786 /* POSIX.2 functions. Don't define these for Emacs. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5787
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5788 #ifndef emacs
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5789
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5790 /* regcomp takes a regular expression as a string and compiles it.
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5791
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5792 PREG is a regex_t *. We do not expect any fields to be initialized,
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5793 since POSIX says we shouldn't. Thus, we set
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5794
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5795 `buffer' to the compiled pattern;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5796 `used' to the length of the compiled pattern;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5797 `syntax' to RE_SYNTAX_POSIX_EXTENDED if the
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5798 REG_EXTENDED bit in CFLAGS is set; otherwise, to
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5799 RE_SYNTAX_POSIX_BASIC;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5800 `newline_anchor' to REG_NEWLINE being set in CFLAGS;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5801 `fastmap' and `fastmap_accurate' to zero;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5802 `re_nsub' to the number of subexpressions in PATTERN.
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5803
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5804 PATTERN is the address of the pattern string.
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5805
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5806 CFLAGS is a series of bits which affect compilation.
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5807
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5808 If REG_EXTENDED is set, we use POSIX extended syntax; otherwise, we
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5809 use POSIX basic syntax.
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5810
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5811 If REG_NEWLINE is set, then . and [^...] don't match newline.
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5812 Also, regexec will try a match beginning after every newline.
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5813
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5814 If REG_ICASE is set, then we considers upper- and lowercase
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5815 versions of letters to be equivalent when matching.
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5816
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5817 If REG_NOSUB is set, then when PREG is passed to regexec, that
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5818 routine will report only success or failure, and nothing about the
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5819 registers.
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5820
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5821 It returns 0 if it succeeds, nonzero if it doesn't. (See regex.h for
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5822 the return codes and their meanings.) */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5823
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5824 int
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5825 regcomp (preg, pattern, cflags)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5826 regex_t *preg;
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
5827 const char *pattern;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5828 int cflags;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5829 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5830 reg_errcode_t ret;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5831 unsigned syntax
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5832 = (cflags & REG_EXTENDED) ?
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5833 RE_SYNTAX_POSIX_EXTENDED : RE_SYNTAX_POSIX_BASIC;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5834
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5835 /* regex_compile will allocate the space for the compiled pattern. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5836 preg->buffer = 0;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5837 preg->allocated = 0;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5838 preg->used = 0;
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
5839
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5840 /* Don't bother to use a fastmap when searching. This simplifies the
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5841 REG_NEWLINE case: if we used a fastmap, we'd have to put all the
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5842 characters after newlines into the fastmap. This way, we just try
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5843 every character. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5844 preg->fastmap = 0;
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
5845
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5846 if (cflags & REG_ICASE)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5847 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5848 unsigned i;
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
5849
501
f29b13c2cefd (TRANSLATE, PATFETCH): Cast elt of `translate'.
Richard Stallman <rms@gnu.org>
parents: 490
diff changeset
5850 preg->translate
f29b13c2cefd (TRANSLATE, PATFETCH): Cast elt of `translate'.
Richard Stallman <rms@gnu.org>
parents: 490
diff changeset
5851 = (RE_TRANSLATE_TYPE) malloc (CHAR_SET_SIZE
f29b13c2cefd (TRANSLATE, PATFETCH): Cast elt of `translate'.
Richard Stallman <rms@gnu.org>
parents: 490
diff changeset
5852 * sizeof (*(RE_TRANSLATE_TYPE)0));
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5853 if (preg->translate == NULL)
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5854 return (int) REG_ESPACE;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5855
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5856 /* Map uppercase characters to corresponding lowercase ones. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5857 for (i = 0; i < CHAR_SET_SIZE; i++)
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5858 preg->translate[i] = ISUPPER (i) ? tolower (i) : i;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5859 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5860 else
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5861 preg->translate = NULL;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5862
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5863 /* If REG_NEWLINE is set, newlines are treated differently. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5864 if (cflags & REG_NEWLINE)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5865 { /* REG_NEWLINE implies neither . nor [^...] match newline. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5866 syntax &= ~RE_DOT_NEWLINE;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5867 syntax |= RE_HAT_LISTS_NOT_NEWLINE;
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5868 /* It also changes the matching behavior. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5869 preg->newline_anchor = 1;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5870 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5871 else
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5872 preg->newline_anchor = 0;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5873
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5874 preg->no_sub = !!(cflags & REG_NOSUB);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5875
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
5876 /* POSIX says a null character in the pattern terminates it, so we
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5877 can use strlen here in compiling the pattern. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5878 ret = regex_compile (pattern, strlen (pattern), syntax, preg);
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
5879
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5880 /* POSIX doesn't distinguish between an unmatched open-group and an
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5881 unmatched close-group: both are REG_EPAREN. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5882 if (ret == REG_ERPAREN) ret = REG_EPAREN;
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
5883
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5884 return (int) ret;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5885 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5886
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5887
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5888 /* regexec searches for a given pattern, specified by PREG, in the
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5889 string STRING.
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
5890
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5891 If NMATCH is zero or REG_NOSUB was set in the cflags argument to
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5892 `regcomp', we ignore PMATCH. Otherwise, we assume PMATCH has at
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5893 least NMATCH elements, and we set them to the offsets of the
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5894 corresponding matched substrings.
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
5895
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5896 EFLAGS specifies `execution flags' which affect matching: if
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5897 REG_NOTBOL is set, then ^ does not match at the beginning of the
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5898 string; if REG_NOTEOL is set, then $ does not match at the end.
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
5899
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5900 We return 0 if we find a match and REG_NOMATCH if not. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5901
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5902 int
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5903 regexec (preg, string, nmatch, pmatch, eflags)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5904 const regex_t *preg;
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
5905 const char *string;
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
5906 size_t nmatch;
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
5907 regmatch_t pmatch[];
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5908 int eflags;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5909 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5910 int ret;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5911 struct re_registers regs;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5912 regex_t private_preg;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5913 int len = strlen (string);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5914 boolean want_reg_info = !preg->no_sub && nmatch > 0;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5915
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5916 private_preg = *preg;
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
5917
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5918 private_preg.not_bol = !!(eflags & REG_NOTBOL);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5919 private_preg.not_eol = !!(eflags & REG_NOTEOL);
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
5920
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5921 /* The user has told us exactly how many registers to return
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5922 information about, via `nmatch'. We have to pass that on to the
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5923 matching routines. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5924 private_preg.regs_allocated = REGS_FIXED;
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
5925
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5926 if (want_reg_info)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5927 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5928 regs.num_regs = nmatch;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5929 regs.start = TALLOC (nmatch, regoff_t);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5930 regs.end = TALLOC (nmatch, regoff_t);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5931 if (regs.start == NULL || regs.end == NULL)
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5932 return (int) REG_NOMATCH;
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5933 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5934
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5935 /* Perform the searching operation. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5936 ret = re_search (&private_preg, string, len,
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5937 /* start: */ 0, /* range: */ len,
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5938 want_reg_info ? &regs : (struct re_registers *) 0);
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
5939
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5940 /* Copy the register information to the POSIX structure. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5941 if (want_reg_info)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5942 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5943 if (ret >= 0)
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5944 {
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5945 unsigned r;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5946
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5947 for (r = 0; r < nmatch; r++)
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5948 {
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5949 pmatch[r].rm_so = regs.start[r];
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5950 pmatch[r].rm_eo = regs.end[r];
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5951 }
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5952 }
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5953
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5954 /* If we needed the temporary register info, free the space now. */
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5955 free (regs.start);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5956 free (regs.end);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5957 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5958
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5959 /* We want zero return to mean success, unlike `re_search'. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5960 return ret >= 0 ? (int) REG_NOERROR : (int) REG_NOMATCH;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5961 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5962
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5963
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5964 /* Returns a message corresponding to an error code, ERRCODE, returned
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5965 from either regcomp or regexec. We don't use PREG here. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5966
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5967 size_t
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5968 regerror (errcode, preg, errbuf, errbuf_size)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5969 int errcode;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5970 const regex_t *preg;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5971 char *errbuf;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5972 size_t errbuf_size;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5973 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5974 const char *msg;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5975 size_t msg_size;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5976
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5977 if (errcode < 0
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5978 || errcode >= (sizeof (re_error_msgid) / sizeof (re_error_msgid[0])))
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
5979 /* Only error codes returned by the rest of the code should be passed
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5980 to this routine. If we are given anything else, or if other regex
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5981 code generates an invalid error code, then the program has a bug.
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5982 Dump core so we can fix it. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5983 abort ();
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5984
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5985 msg = gettext (re_error_msgid[errcode]);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5986
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5987 msg_size = strlen (msg) + 1; /* Includes the null. */
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
5988
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5989 if (errbuf_size != 0)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5990 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5991 if (msg_size > errbuf_size)
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5992 {
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5993 strncpy (errbuf, msg, errbuf_size - 1);
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5994 errbuf[errbuf_size - 1] = 0;
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5995 }
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5996 else
939
ace17b6e9d29 (PTR_TO_OFFSET): New macro.
Richard Stallman <rms@gnu.org>
parents: 786
diff changeset
5997 strcpy (errbuf, msg);
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5998 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
5999
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
6000 return msg_size;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
6001 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
6002
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
6003
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
6004 /* Free dynamically allocated space used by PREG. */
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
6005
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
6006 void
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
6007 regfree (preg)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
6008 regex_t *preg;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
6009 {
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
6010 if (preg->buffer != NULL)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
6011 free (preg->buffer);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
6012 preg->buffer = NULL;
515
69ba3b63e1d1 (gettext_noop): New macro, identity fn.
Roland McGrath <roland@gnu.org>
parents: 511
diff changeset
6013
441
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
6014 preg->allocated = 0;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
6015 preg->used = 0;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
6016
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
6017 if (preg->fastmap != NULL)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
6018 free (preg->fastmap);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
6019 preg->fastmap = NULL;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
6020 preg->fastmap_accurate = 0;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
6021
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
6022 if (preg->translate != NULL)
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
6023 free (preg->translate);
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
6024 preg->translate = NULL;
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
6025 }
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
6026
403b2dfdfa0b Add `#ifdef _LIBC' in a few places, so this can be compiled in libc.
Roland McGrath <roland@gnu.org>
parents: 438
diff changeset
6027 #endif /* not emacs */