annotate src/regex.c @ 502:7039e6323819

[xemacs-hg @ 2001-05-04 22:41:46 by ben] ----------------------- byte-comp warning fixes ----------------- New functions for cleanly eliminating byte-compiler warnings. Their definitions require no changes at all in bytecomp.el, meaning that any package that wants to use them and be compatible with older versions of XEmacs need only copy the code and rename the functions (i.e. prefix them with the package name). Eliminate byte-compiler warnings using the new functions in bytecomp-runtime.el. Move coding-system-put,get,category, since they're not Mule-specific and are used in prefer-coding-system. font.el was incredibly ugly. Clean it up. Avoid using defsubst for any exported functions, to avoid possible compatibility problems if we later change the internal interface. (It happened before, with face accessors, between 19.8 and 19.9). Fix tons of warnings. Clean up (new function gpm-is-supported-p eliminates duplicate code in gpm-create/delete-device-hook) and eliminate warnings. ---------- make byte-recompile-directory work in the --------- core `lisp' dir, even in the absence of a Mule XEmacs (i.e. make it skip the Mule files rather than trying to compile them). now you should be able to do `touch *.el' in the `lisp' dir, then M-x byte-recompile-directory, and get no warnings. Avoid trying to compile Mule files in byte-recompile-directory when we're not in a Mule XEmacs, since we're highly likely to get syntax errors. Add a coding-system cookie to all Mule files so that byte-recompile-directory ignores them. Magic cookie function moved to files.el from code-files.el (for use by bytecomp even in a non-coding-system XEmacs), and changed names and semantics for use by bytecomp. NOTE: IMO this is an internal function that we can change as we like (and there is absolutely no code anywhere else using the function). ---------------- GUI improvements: menus, help ------------------- Rearrange order of keymap declarations to be alphabetical. Improve help on help to include all bindings, and group by category. Add bindings for new Info commands. Remove warnings. Use command-hyper-apropos in place of command-apropos. Add a function to do the equivalent of command-apropos. Evals its help-text argument so you can put expressions there. Used now by help-for-help. Add binding to continue text searches. Expand index searches to work over multiple info documents. Add commands to search text/index in User and Lispref. Add new entry, "Uncomment Region" (parallels "Comment Out Region"). Redo Help menu; add bindings for new Info commands to search the index or text of the User and Lispref manuals. Add command for mark-paragraph, activate-region. Make Edit->R accelerator be rectangle, not register (more commonly used), and put rectangle first. Fix the Edit Init File entry to never load the .elc file. Simplify the default-popup-menu. Add Cmds->Tabs menu. Use kp-left not kp_left, etc. ---------------- Miscellaneous bug fixes/cleanup ------------------- byte-compiler-options: Correct doc string. easy-menu-do-define: fix extra quote. fill-paragraph-or-region:Rewrite to be more correct -- use call-interactively so that we always get exactly the same behavior as if the functions were called directly. No need to fiddle with zmacs-region-stays, now that bogus clearing of it (2001-04-28 src/ChangeLog) is removed. Put dialog titles back in -- this time correctly. Fix various other problems with leaks and such. key-sequence-list-description: Clean up fun to always correctly canonicalize. Clean up Kinsoku comments, synch comment-region with FSF 20.7. * simple.el (region-exists-p): * simple.el (region-active-p): Add comment about which one is correct to use in menu specs. * sound.el (load-sound-file): Minor code clean up. * startup.el: * startup.el (command-line-early): * startup.el (initial-scratch-message): Comment changes. Add info about sample.init.el to splash screen. Improve initial-scratch-message and clarify purpose of Scratch buffer. Fix byte-compile warning. ------------------------ Added features ------------------------- Add new variable to control whether etags checks all parent directories for tag files. (On by default.) * hash-table.el: New file, useful utility functions. * dumped-lisp.el (preloaded-file-list): Dump hash-table.el. ------------ notable bug fix: Windows event code -------------- Get critical quit working. ------------ notable bug fix and new feature: regex code -------------- Shy groups were implemented in a horrible, half-assed way that would cause them to screw up regex searching in most cases. Fixed to work correctly. Also extended back-reference syntax past 9. Only is recognized as such if there are at least that many non-shy groups; and optionally will warn about such uses, to catch old code that might be using them differently. (Added variable to control this in search.c -- `warn-about-possibly-incompatible-back- references', on by default for the moment. Declared in lisp.h. ---------------- process/SIGIO improvements ------------------- define USE_GETADDRINFO to replace more complex conditional, and use it. the code conditionalized on this in unix_open_network_stream had *serious* problems handling errors. it's now fixed, and major amounts of duplicate code between the two versions were combined. don't disable SIGIO and other interrupts unless CONNECT_NEEDS_SLOWED_INTERRUPTS is defined -- don't penalize OS's without bugs. similarly for a freebsd bug that was affecting all OS's. * s\ultrix.h: define CONNECT_NEEDS_SLOWED_INTERRUPTS, since that's the OS mentioned as having a kernel bug. * sysdep.c (request_sigio_on_device): * sysdep.c (unrequest_sigio_on_device): fix SIGIO problems on Linux. add check for O_ASYNC in case it's defined and FASYNC isn't. add comment about other ways to do SIGIO on Linux. * callproc.c (Fold_call_process_internal): * process.c (Fstart_process_internal): Deal with the possibility that `default-directory' doesn't have terminating slash. Correct comments about vfork. ---------------- Miscellaneous bug fixes/cleanup ------------------- * callint.c (Finteractive): Add lots of documentation -- exactly what the Lisp equivalents of all the interactive specs are. * console.h (struct console): change type of quit_char to Emchar. * event-msw.c (lstream_type_create_mswindows_selectable): spacing change. Eliminate events-mod.h and combine into events.h. * emacs.c: * emacs.c (make_arg_list_1): * emacs.c (main_1): A couple of char->Extbyte changes, add a comment. * glyphs-msw.c: Correct indentation of function defns to not exceed 80 cols. Try (sort of) to fix some code that sets the colors of the progress gauge. (Commented out) * keymap.c (syms_of_keymap): use DEFSYMBOL. * process.c (read_process_output): No need to fiddle with zmacs_region_stays, now that bogus clearing of it (see below) is removed. * search.c (Freplace_match): warning fix.
author ben
date Fri, 04 May 2001 22:42:35 +0000
parents 223736d75acb
children cd662ad69f40
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 /* Extended regular expression matching and search library,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2 version 0.12, extended for XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3 (Implements POSIX draft P10003.2/D11.2, except for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4 internationalization features.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6 Copyright (C) 1993, 1994, 1995 Free Software Foundation, Inc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7 Copyright (C) 1995 Sun Microsystems, Inc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8 Copyright (C) 1995 Ben Wing.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10 This program is free software; you can redistribute it and/or modify
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11 it under the terms of the GNU General Public License as published by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12 the Free Software Foundation; either version 2, or (at your option)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13 any later version.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15 This program is distributed in the hope that it will be useful,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18 GNU General Public License for more details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20 You should have received a copy of the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21 along with this program; see the file COPYING. If not, write to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23 Boston, MA 02111-1307, USA. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25 /* Synched up with: FSF 19.29. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27 /* Changes made for XEmacs:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29 (1) the REGEX_BEGLINE_CHECK code from the XEmacs v18 regex routines
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30 was added. This causes a huge speedup in font-locking.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31 (2) Rel-alloc is disabled when the MMAP version of rel-alloc is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32 being used, because it's too slow -- all those calls to mmap()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 add humongous overhead.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34 (3) Lots and lots of changes for Mule. They are bracketed by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35 `#ifdef MULE' or with comments that have `XEmacs' in them.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38 #ifdef HAVE_CONFIG_H
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 #include <config.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42 #ifndef REGISTER /* Rigidly enforced as of 20.3 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43 #define REGISTER
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46 #ifndef _GNU_SOURCE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47 #define _GNU_SOURCE 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
50 #ifdef emacs
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
51 /* Converts the pointer to the char to BEG-based offset from the start. */
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
52 #define PTR_TO_OFFSET(d) (MATCHING_IN_FIRST_STRING \
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
53 ? (d) - string1 : (d) - (string2 - size1))
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
54 #else
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
55 #define PTR_TO_OFFSET(d) 0
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
56 #endif
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
57
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 /* We assume non-Mule if emacs isn't defined. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59 #ifndef emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 #undef MULE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63 /* We need this for `regex.h', and perhaps for the Emacs include files. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 #include <sys/types.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 /* This is for other GNU distributions with internationalized messages. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67 #if defined (I18N3) && (defined (HAVE_LIBINTL_H) || defined (_LIBC))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68 # include <libintl.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70 # define gettext(msgid) (msgid)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 /* XEmacs: define this to add in a speedup for patterns anchored at
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 the beginning of a line. Keep the ifdefs so that it's easier to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 tell where/why this code has diverged from v19. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76 #define REGEX_BEGLINE_CHECK
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78 /* XEmacs: the current mmap-based ralloc handles small blocks very
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 poorly, so we disable it here. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 #if (defined (REL_ALLOC) && defined (HAVE_MMAP)) || defined(DOUG_LEA_MALLOC)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 # undef REL_ALLOC
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85 /* The `emacs' switch turns on certain matching commands
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 that make sense only in Emacs. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 #ifdef emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 #include "lisp.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 #include "buffer.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 #include "syntax.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93 #if (defined (DEBUG_XEMACS) && !defined (DEBUG))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 #define DEBUG
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 #ifdef MULE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 Lisp_Object Vthe_lisp_rangetab;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102 complex_vars_of_regex (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 Vthe_lisp_rangetab = Fmake_range_table ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 staticpro (&Vthe_lisp_rangetab);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108 #else /* not MULE */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111 complex_vars_of_regex (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
115 #endif /* MULE */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
116
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
117 #define RE_TRANSLATE(ch) TRT_TABLE_OF (translate, (Emchar) ch)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
118 #define TRANSLATE_P(tr) (!NILP (tr))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120 #else /* not emacs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122 /* If we are not linking with Emacs proper,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 we can't use the relocating allocator
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124 even if config.h says that we can. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125 #undef REL_ALLOC
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 #if defined (STDC_HEADERS) || defined (_LIBC)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 #include <stdlib.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 char *malloc ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 char *realloc ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134 #define charptr_emchar(str) ((Emchar) (str)[0])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136 #if (LONGBITS > INTBITS)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 # define EMACS_INT long
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 # define EMACS_INT int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142 typedef int Emchar;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 #define INC_CHARPTR(p) ((p)++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145 #define DEC_CHARPTR(p) ((p)--)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 #include <string.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 /* Define the syntax stuff for \<, \>, etc. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 /* This must be nonzero for the wordchar and notwordchar pattern
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152 commands in re_match_2. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 #ifndef Sword
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154 #define Sword 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 #ifdef SYNTAX_TABLE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159 extern char *re_syntax_table;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 #else /* not SYNTAX_TABLE */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 /* How many characters in the character set. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 #define CHAR_SET_SIZE 256
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 static char re_syntax_table[CHAR_SET_SIZE];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 init_syntax_once (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 static int done = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 if (!done)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
175 const char *word_syntax_chars =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 memset (re_syntax_table, 0, sizeof (re_syntax_table));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 while (*word_syntax_chars)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 re_syntax_table[(unsigned int)(*word_syntax_chars++)] = Sword;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 done = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
187 #endif /* SYNTAX_TABLE */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 #define SYNTAX_UNSAFE(ignored, c) re_syntax_table[c]
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
190 #undef SYNTAX_FROM_CACHE
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
191 #define SYNTAX_FROM_CACHE SYNTAX_UNSAFE
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
193 #define RE_TRANSLATE(c) translate[(unsigned char) (c)]
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
194 #define TRANSLATE_P(tr) tr
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
195
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
196 #endif /* emacs */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 /* Under XEmacs, this is needed because we don't define it elsewhere. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 #ifdef SWITCH_ENUM_BUG
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 #define SWITCH_ENUM_CAST(x) ((int)(x))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202 #define SWITCH_ENUM_CAST(x) (x)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 /* Get the interface, including the syntax bits. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 #include "regex.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 /* isalpha etc. are used for the character classes. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 #include <ctype.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212 /* Jim Meyering writes:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 "... Some ctype macros are valid only for character codes that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 isascii says are ASCII (SGI's IRIX-4.0.5 is one such system --when
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 using /bin/cc or gcc but without giving an ansi option). So, all
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 ctype uses should be through macros like ISPRINT... If
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 STDC_HEADERS is defined, then autoconf has verified that the ctype
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 macros don't need to be guarded with references to isascii. ...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 Defining isascii to 1 should let any compiler worth its salt
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 eliminate the && through constant folding." */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 #if defined (STDC_HEADERS) || (!defined (isascii) && !defined (HAVE_ISASCII))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 #define ISASCII_1(c) 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 #define ISASCII_1(c) isascii(c)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 #ifdef MULE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 /* The IS*() macros can be passed any character, including an extended
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 one. We need to make sure there are no crashes, which would occur
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 otherwise due to out-of-bounds array references. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 #define ISASCII(c) (((EMACS_UINT) (c)) < 0x100 && ISASCII_1 (c))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235 #define ISASCII(c) ISASCII_1 (c)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 #endif /* MULE */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 #ifdef isblank
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 #define ISBLANK(c) (ISASCII (c) && isblank (c))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 #define ISBLANK(c) ((c) == ' ' || (c) == '\t')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 #ifdef isgraph
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 #define ISGRAPH(c) (ISASCII (c) && isgraph (c))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 #define ISGRAPH(c) (ISASCII (c) && isprint (c) && !isspace (c))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 #define ISPRINT(c) (ISASCII (c) && isprint (c))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 #define ISDIGIT(c) (ISASCII (c) && isdigit (c))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 #define ISALNUM(c) (ISASCII (c) && isalnum (c))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 #define ISALPHA(c) (ISASCII (c) && isalpha (c))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 #define ISCNTRL(c) (ISASCII (c) && iscntrl (c))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 #define ISLOWER(c) (ISASCII (c) && islower (c))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 #define ISPUNCT(c) (ISASCII (c) && ispunct (c))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 #define ISSPACE(c) (ISASCII (c) && isspace (c))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 #define ISUPPER(c) (ISASCII (c) && isupper (c))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 #define ISXDIGIT(c) (ISASCII (c) && isxdigit (c))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 #ifndef NULL
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 #define NULL (void *)0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 /* We remove any previous definition of `SIGN_EXTEND_CHAR',
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 since ours (we hope) works properly with all combinations of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 machines, compilers, `char' and `unsigned char' argument types.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 (Per Bothner suggested the basic approach.) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 #undef SIGN_EXTEND_CHAR
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 #if __STDC__
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 #define SIGN_EXTEND_CHAR(c) ((signed char) (c))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 #else /* not __STDC__ */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 /* As in Harbison and Steele. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273 #define SIGN_EXTEND_CHAR(c) ((((unsigned char) (c)) ^ 128) - 128)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276 /* Should we use malloc or alloca? If REGEX_MALLOC is not defined, we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277 use `alloca' instead of `malloc'. This is because using malloc in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278 re_search* or re_match* could cause memory leaks when C-g is used in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279 Emacs; also, malloc is slower and causes storage fragmentation. On
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280 the other hand, malloc is more portable, and easier to debug.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282 Because we sometimes use alloca, some routines have to be macros,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 not functions -- `alloca'-allocated space disappears at the end of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284 function it is called in. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286 #ifdef REGEX_MALLOC
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 #define REGEX_ALLOCATE malloc
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289 #define REGEX_REALLOCATE(source, osize, nsize) realloc (source, nsize)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290 #define REGEX_FREE free
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292 #else /* not REGEX_MALLOC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294 /* Emacs already defines alloca, sometimes. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 #ifndef alloca
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297 /* Make alloca work the best possible way. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298 #ifdef __GNUC__
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299 #define alloca __builtin_alloca
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300 #else /* not __GNUC__ */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301 #if HAVE_ALLOCA_H
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 #include <alloca.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303 #else /* not __GNUC__ or HAVE_ALLOCA_H */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304 #ifndef _AIX /* Already did AIX, up at the top. */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
305 void *alloca ();
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306 #endif /* not _AIX */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
307 #endif /* HAVE_ALLOCA_H */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
308 #endif /* __GNUC__ */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 #endif /* not alloca */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 #define REGEX_ALLOCATE alloca
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314 /* Assumes a `char *destination' variable. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 #define REGEX_REALLOCATE(source, osize, nsize) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316 (destination = (char *) alloca (nsize), \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317 memmove (destination, source, osize), \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318 destination)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320 /* No need to do anything to free, after alloca. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 #define REGEX_FREE(arg) ((void)0) /* Do nothing! But inhibit gcc warning. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
323 #endif /* REGEX_MALLOC */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 /* Define how to allocate the failure stack. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327 #ifdef REL_ALLOC
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328 #define REGEX_ALLOCATE_STACK(size) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 r_alloc ((char **) &failure_stack_ptr, (size))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 #define REGEX_REALLOCATE_STACK(source, osize, nsize) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 r_re_alloc ((char **) &failure_stack_ptr, (nsize))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 #define REGEX_FREE_STACK(ptr) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 r_alloc_free ((void **) &failure_stack_ptr)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 #else /* not REL_ALLOC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 #ifdef REGEX_MALLOC
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 #define REGEX_ALLOCATE_STACK malloc
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 #define REGEX_REALLOCATE_STACK(source, osize, nsize) realloc (source, nsize)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341 #define REGEX_FREE_STACK free
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343 #else /* not REGEX_MALLOC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345 #define REGEX_ALLOCATE_STACK alloca
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347 #define REGEX_REALLOCATE_STACK(source, osize, nsize) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348 REGEX_REALLOCATE (source, osize, nsize)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349 /* No need to explicitly free anything. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 #define REGEX_FREE_STACK(arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
352 #endif /* REGEX_MALLOC */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
353 #endif /* REL_ALLOC */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356 /* True if `size1' is non-NULL and PTR is pointing anywhere inside
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357 `string1' or just past its end. This works if PTR is NULL, which is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358 a good thing. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359 #define FIRST_STRING_P(ptr) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360 (size1 && string1 <= (ptr) && (ptr) <= string1 + size1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 /* (Re)Allocate N items of type T using malloc, or fail. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 #define TALLOC(n, t) ((t *) malloc ((n) * sizeof (t)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364 #define RETALLOC(addr, n, t) ((addr) = (t *) realloc (addr, (n) * sizeof (t)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365 #define RETALLOC_IF(addr, n, t) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366 if (addr) RETALLOC((addr), (n), t); else (addr) = TALLOC ((n), t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367 #define REGEX_TALLOC(n, t) ((t *) REGEX_ALLOCATE ((n) * sizeof (t)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369 #define BYTEWIDTH 8 /* In bits. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
371 #define STREQ(s1, s2) (strcmp (s1, s2) == 0)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373 #undef MAX
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374 #undef MIN
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375 #define MAX(a, b) ((a) > (b) ? (a) : (b))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
376 #define MIN(a, b) ((a) < (b) ? (a) : (b))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
378 /* Type of source-pattern and string chars. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
379 typedef const unsigned char re_char;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
380
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
381 typedef char re_bool;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
382 #define false 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383 #define true 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
385
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386 /* These are the command codes that appear in compiled regular
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387 expressions. Some opcodes are followed by argument bytes. A
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388 command code can specify any interpretation whatsoever for its
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
389 arguments. Zero bytes may appear in the compiled regular expression. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
391 typedef enum
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
392 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
393 no_op = 0,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
395 /* Succeed right away--no more backtracking. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
396 succeed,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398 /* Followed by one byte giving n, then by n literal bytes. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399 exactn,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401 /* Matches any (more or less) character. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
402 anychar,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
403
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
404 /* Matches any one char belonging to specified set. First
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
405 following byte is number of bitmap bytes. Then come bytes
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
406 for a bitmap saying which chars are in. Bits in each byte
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
407 are ordered low-bit-first. A character is in the set if its
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
408 bit is 1. A character too large to have a bit in the map is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
409 automatically not in the set. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
410 charset,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
411
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
412 /* Same parameters as charset, but match any character that is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
413 not one of those specified. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
414 charset_not,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
415
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
416 /* Start remembering the text that is matched, for storing in a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
417 register. Followed by one byte with the register number, in
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
418 the range 1 to the pattern buffer's re_ngroups
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419 field. Then followed by one byte with the number of groups
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
420 inner to this one. (This last has to be part of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421 start_memory only because we need it in the on_failure_jump
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
422 of re_match_2.) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
423 start_memory,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
424
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
425 /* Stop remembering the text that is matched and store it in a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
426 memory register. Followed by one byte with the register
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
427 number, in the range 1 to `re_ngroups' in the
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
428 pattern buffer, and one byte with the number of inner groups,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
429 just like `start_memory'. (We need the number of inner
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
430 groups here because we don't have any easy way of finding the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
431 corresponding start_memory when we're at a stop_memory.) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
432 stop_memory,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
433
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
434 /* Match a duplicate of something remembered. Followed by one
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
435 byte containing the register number. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
436 duplicate,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
437
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
438 /* Fail unless at beginning of line. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
439 begline,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
440
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
441 /* Fail unless at end of line. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442 endline,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
443
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444 /* Succeeds if at beginning of buffer (if emacs) or at beginning
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
445 of string to be matched (if not). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
446 begbuf,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
447
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
448 /* Analogously, for end of buffer/string. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
449 endbuf,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
450
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451 /* Followed by two byte relative address to which to jump. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452 jump,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
453
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
454 /* Same as jump, but marks the end of an alternative. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
455 jump_past_alt,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
456
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
457 /* Followed by two-byte relative address of place to resume at
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
458 in case of failure. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
459 on_failure_jump,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
460
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
461 /* Like on_failure_jump, but pushes a placeholder instead of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
462 current string position when executed. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
463 on_failure_keep_string_jump,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
464
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465 /* Throw away latest failure point and then jump to following
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
466 two-byte relative address. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
467 pop_failure_jump,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469 /* Change to pop_failure_jump if know won't have to backtrack to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
470 match; otherwise change to jump. This is used to jump
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
471 back to the beginning of a repeat. If what follows this jump
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
472 clearly won't match what the repeat does, such that we can be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
473 sure that there is no use backtracking out of repetitions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
474 already matched, then we change it to a pop_failure_jump.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
475 Followed by two-byte address. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
476 maybe_pop_jump,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
477
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
478 /* Jump to following two-byte address, and push a dummy failure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
479 point. This failure point will be thrown away if an attempt
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
480 is made to use it for a failure. A `+' construct makes this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
481 before the first repeat. Also used as an intermediary kind
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
482 of jump when compiling an alternative. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
483 dummy_failure_jump,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
484
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
485 /* Push a dummy failure point and continue. Used at the end of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486 alternatives. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
487 push_dummy_failure,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
488
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
489 /* Followed by two-byte relative address and two-byte number n.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
490 After matching N times, jump to the address upon failure. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
491 succeed_n,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
492
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
493 /* Followed by two-byte relative address, and two-byte number n.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
494 Jump to the address N times, then fail. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
495 jump_n,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
496
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
497 /* Set the following two-byte relative address to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
498 subsequent two-byte number. The address *includes* the two
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
499 bytes of number. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
500 set_number_at,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
501
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
502 wordchar, /* Matches any word-constituent character. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
503 notwordchar, /* Matches any char that is not a word-constituent. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
504
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
505 wordbeg, /* Succeeds if at word beginning. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
506 wordend, /* Succeeds if at word end. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
507
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
508 wordbound, /* Succeeds if at a word boundary. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
509 notwordbound /* Succeeds if not at a word boundary. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
510
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
511 #ifdef emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
512 ,before_dot, /* Succeeds if before point. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
513 at_dot, /* Succeeds if at point. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
514 after_dot, /* Succeeds if after point. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
515
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
516 /* Matches any character whose syntax is specified. Followed by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
517 a byte which contains a syntax code, e.g., Sword. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
518 syntaxspec,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
519
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520 /* Matches any character whose syntax is not that specified. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
521 notsyntaxspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
522
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
523 #endif /* emacs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
524
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
525 #ifdef MULE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
526 /* need extra stuff to be able to properly work with XEmacs/Mule
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
527 characters (which may take up more than one byte) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
528
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
529 ,charset_mule, /* Matches any character belonging to specified set.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
530 The set is stored in "unified range-table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
531 format"; see rangetab.c. Unlike the `charset'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
532 opcode, this can handle arbitrary characters. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534 charset_mule_not /* Same parameters as charset_mule, but match any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
535 character that is not one of those specified. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
537 /* 97/2/17 jhod: The following two were merged back in from the Mule
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538 2.3 code to enable some language specific processing */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
539 ,categoryspec, /* Matches entries in the character category tables */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
540 notcategoryspec /* The opposite of the above */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
541 #endif /* MULE */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
542
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
543 } re_opcode_t;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
545 /* Common operations on the compiled pattern. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
547 /* Store NUMBER in two contiguous bytes starting at DESTINATION. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
548
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549 #define STORE_NUMBER(destination, number) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
550 do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
551 (destination)[0] = (number) & 0377; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552 (destination)[1] = (number) >> 8; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
554
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
555 /* Same as STORE_NUMBER, except increment DESTINATION to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
556 the byte after where the number is stored. Therefore, DESTINATION
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
557 must be an lvalue. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
558
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
559 #define STORE_NUMBER_AND_INCR(destination, number) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
560 do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
561 STORE_NUMBER (destination, number); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
562 (destination) += 2; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
563 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
564
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
565 /* Put into DESTINATION a number stored in two contiguous bytes starting
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
566 at SOURCE. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
567
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
568 #define EXTRACT_NUMBER(destination, source) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
569 do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
570 (destination) = *(source) & 0377; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
571 (destination) += SIGN_EXTEND_CHAR (*((source) + 1)) << 8; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
572 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
573
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
574 #ifdef DEBUG
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
575 static void
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
576 extract_number (int *dest, re_char *source)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
577 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
578 int temp = SIGN_EXTEND_CHAR (*(source + 1));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
579 *dest = *source & 0377;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
580 *dest += temp << 8;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
581 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583 #ifndef EXTRACT_MACROS /* To debug the macros. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
584 #undef EXTRACT_NUMBER
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
585 #define EXTRACT_NUMBER(dest, src) extract_number (&dest, src)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586 #endif /* not EXTRACT_MACROS */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588 #endif /* DEBUG */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
589
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
590 /* Same as EXTRACT_NUMBER, except increment SOURCE to after the number.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
591 SOURCE must be an lvalue. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
592
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
593 #define EXTRACT_NUMBER_AND_INCR(destination, source) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
594 do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
595 EXTRACT_NUMBER (destination, source); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
596 (source) += 2; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
597 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
598
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
599 #ifdef DEBUG
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
600 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
601 extract_number_and_incr (int *destination, unsigned char **source)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
602 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
603 extract_number (destination, *source);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
604 *source += 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
605 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
606
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
607 #ifndef EXTRACT_MACROS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
608 #undef EXTRACT_NUMBER_AND_INCR
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
609 #define EXTRACT_NUMBER_AND_INCR(dest, src) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
610 extract_number_and_incr (&dest, &src)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
611 #endif /* not EXTRACT_MACROS */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
612
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
613 #endif /* DEBUG */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
614
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
615 /* If DEBUG is defined, Regex prints many voluminous messages about what
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
616 it is doing (if the variable `debug' is nonzero). If linked with the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
617 main program in `iregex.c', you can enter patterns and strings
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
618 interactively. And if linked with the main program in `main.c' and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
619 the other test files, you can run the already-written tests. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
620
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
621 #if defined (DEBUG)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
622
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
623 /* We use standard I/O for debugging. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
624 #include <stdio.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
625
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
626 #ifndef emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
627 /* XEmacs provides its own version of assert() */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
628 /* It is useful to test things that ``must'' be true when debugging. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
629 #include <assert.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
630 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
631
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
632 static int debug = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
633
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
634 #define DEBUG_STATEMENT(e) e
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
635 #define DEBUG_PRINT1(x) if (debug) printf (x)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
636 #define DEBUG_PRINT2(x1, x2) if (debug) printf (x1, x2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
637 #define DEBUG_PRINT3(x1, x2, x3) if (debug) printf (x1, x2, x3)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
638 #define DEBUG_PRINT4(x1, x2, x3, x4) if (debug) printf (x1, x2, x3, x4)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
639 #define DEBUG_PRINT_COMPILED_PATTERN(p, s, e) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
640 if (debug) print_partial_compiled_pattern (s, e)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
641 #define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
642 if (debug) print_double_string (w, s1, sz1, s2, sz2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
643
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
644
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
645 /* Print the fastmap in human-readable form. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
646
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
647 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
648 print_fastmap (char *fastmap)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
649 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
650 unsigned was_a_range = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
651 unsigned i = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
652
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
653 while (i < (1 << BYTEWIDTH))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
654 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
655 if (fastmap[i++])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
656 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
657 was_a_range = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
658 putchar (i - 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
659 while (i < (1 << BYTEWIDTH) && fastmap[i])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
660 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
661 was_a_range = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
662 i++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
663 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
664 if (was_a_range)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
665 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
666 putchar ('-');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
667 putchar (i - 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
668 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
669 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
670 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
671 putchar ('\n');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
672 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
673
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
674
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
675 /* Print a compiled pattern string in human-readable form, starting at
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
676 the START pointer into it and ending just before the pointer END. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
677
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
678 static void
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
679 print_partial_compiled_pattern (re_char *start, re_char *end)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
680 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
681 int mcnt, mcnt2;
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
682 unsigned char *p = (unsigned char *) start;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
683 re_char *pend = end;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
684
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
685 if (start == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
686 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
687 puts ("(null)");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
688 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
689 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
690
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
691 /* Loop over pattern commands. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
692 while (p < pend)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
693 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
694 printf ("%ld:\t", (long)(p - start));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
695
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
696 switch ((re_opcode_t) *p++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
697 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
698 case no_op:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
699 printf ("/no_op");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
700 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
701
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
702 case exactn:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
703 mcnt = *p++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
704 printf ("/exactn/%d", mcnt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
705 do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
706 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
707 putchar ('/');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
708 putchar (*p++);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
709 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
710 while (--mcnt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
711 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
712
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
713 case start_memory:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
714 mcnt = *p++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
715 printf ("/start_memory/%d/%d", mcnt, *p++);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
716 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
717
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
718 case stop_memory:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
719 mcnt = *p++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
720 printf ("/stop_memory/%d/%d", mcnt, *p++);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
721 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
722
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
723 case duplicate:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
724 printf ("/duplicate/%d", *p++);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
725 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
726
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
727 case anychar:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
728 printf ("/anychar");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
729 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
730
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
731 case charset:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
732 case charset_not:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
733 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
734 REGISTER int c, last = -100;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
735 REGISTER int in_range = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
736
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
737 printf ("/charset [%s",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
738 (re_opcode_t) *(p - 1) == charset_not ? "^" : "");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
739
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
740 assert (p + *p < pend);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
741
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
742 for (c = 0; c < 256; c++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
743 if (((unsigned char) (c / 8) < *p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
744 && (p[1 + (c/8)] & (1 << (c % 8))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
745 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
746 /* Are we starting a range? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
747 if (last + 1 == c && ! in_range)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
748 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
749 putchar ('-');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
750 in_range = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
751 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
752 /* Have we broken a range? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
753 else if (last + 1 != c && in_range)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
754 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
755 putchar (last);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
756 in_range = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
757 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
758
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
759 if (! in_range)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
760 putchar (c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
761
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
762 last = c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
763 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
764
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
765 if (in_range)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
766 putchar (last);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
767
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
768 putchar (']');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
769
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
770 p += 1 + *p;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
771 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
772 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
773
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
774 #ifdef MULE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
775 case charset_mule:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
776 case charset_mule_not:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
777 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
778 int nentries, i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
779
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
780 printf ("/charset_mule [%s",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
781 (re_opcode_t) *(p - 1) == charset_mule_not ? "^" : "");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
782 nentries = unified_range_table_nentries (p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
783 for (i = 0; i < nentries; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
784 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
785 EMACS_INT first, last;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
786 Lisp_Object dummy_val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
787
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
788 unified_range_table_get_range (p, i, &first, &last,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
789 &dummy_val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
790 if (first < 0x100)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
791 putchar (first);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
792 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
793 printf ("(0x%lx)", (long)first);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
794 if (first != last)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
795 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
796 putchar ('-');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
797 if (last < 0x100)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
798 putchar (last);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
799 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
800 printf ("(0x%lx)", (long)last);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
801 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
802 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
803 putchar (']');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
804 p += unified_range_table_bytes_used (p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
805 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
806 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
807 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
808
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
809 case begline:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
810 printf ("/begline");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
811 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
812
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
813 case endline:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
814 printf ("/endline");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
815 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
816
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
817 case on_failure_jump:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
818 extract_number_and_incr (&mcnt, &p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
819 printf ("/on_failure_jump to %ld", (long)(p + mcnt - start));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
820 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
821
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
822 case on_failure_keep_string_jump:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
823 extract_number_and_incr (&mcnt, &p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
824 printf ("/on_failure_keep_string_jump to %ld", (long)(p + mcnt - start));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
825 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
826
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
827 case dummy_failure_jump:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
828 extract_number_and_incr (&mcnt, &p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
829 printf ("/dummy_failure_jump to %ld", (long)(p + mcnt - start));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
830 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
831
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
832 case push_dummy_failure:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
833 printf ("/push_dummy_failure");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
834 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
835
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
836 case maybe_pop_jump:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
837 extract_number_and_incr (&mcnt, &p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
838 printf ("/maybe_pop_jump to %ld", (long)(p + mcnt - start));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
839 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
840
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
841 case pop_failure_jump:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
842 extract_number_and_incr (&mcnt, &p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
843 printf ("/pop_failure_jump to %ld", (long)(p + mcnt - start));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
844 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
845
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
846 case jump_past_alt:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
847 extract_number_and_incr (&mcnt, &p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
848 printf ("/jump_past_alt to %ld", (long)(p + mcnt - start));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
849 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
850
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
851 case jump:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
852 extract_number_and_incr (&mcnt, &p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
853 printf ("/jump to %ld", (long)(p + mcnt - start));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
854 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
855
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
856 case succeed_n:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
857 extract_number_and_incr (&mcnt, &p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
858 extract_number_and_incr (&mcnt2, &p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
859 printf ("/succeed_n to %ld, %d times", (long)(p + mcnt - start), mcnt2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
860 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
861
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
862 case jump_n:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
863 extract_number_and_incr (&mcnt, &p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
864 extract_number_and_incr (&mcnt2, &p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
865 printf ("/jump_n to %ld, %d times", (long)(p + mcnt - start), mcnt2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
866 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
867
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
868 case set_number_at:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
869 extract_number_and_incr (&mcnt, &p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
870 extract_number_and_incr (&mcnt2, &p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
871 printf ("/set_number_at location %ld to %d", (long)(p + mcnt - start), mcnt2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
872 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
873
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
874 case wordbound:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
875 printf ("/wordbound");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
876 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
877
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
878 case notwordbound:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
879 printf ("/notwordbound");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
880 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
881
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
882 case wordbeg:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
883 printf ("/wordbeg");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
884 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
885
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
886 case wordend:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
887 printf ("/wordend");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
888
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
889 #ifdef emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
890 case before_dot:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
891 printf ("/before_dot");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
892 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
893
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
894 case at_dot:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
895 printf ("/at_dot");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
896 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
897
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
898 case after_dot:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
899 printf ("/after_dot");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
900 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
901
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
902 case syntaxspec:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
903 printf ("/syntaxspec");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
904 mcnt = *p++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
905 printf ("/%d", mcnt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
906 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
907
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
908 case notsyntaxspec:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
909 printf ("/notsyntaxspec");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
910 mcnt = *p++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
911 printf ("/%d", mcnt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
912 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
913
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
914 #ifdef MULE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
915 /* 97/2/17 jhod Mule category patch */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
916 case categoryspec:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
917 printf ("/categoryspec");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
918 mcnt = *p++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
919 printf ("/%d", mcnt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
920 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
921
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
922 case notcategoryspec:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
923 printf ("/notcategoryspec");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
924 mcnt = *p++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
925 printf ("/%d", mcnt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
926 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
927 /* end of category patch */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
928 #endif /* MULE */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
929 #endif /* emacs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
930
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
931 case wordchar:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
932 printf ("/wordchar");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
933 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
934
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
935 case notwordchar:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
936 printf ("/notwordchar");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
937 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
938
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
939 case begbuf:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
940 printf ("/begbuf");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
941 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
942
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
943 case endbuf:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
944 printf ("/endbuf");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
945 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
946
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
947 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
948 printf ("?%d", *(p-1));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
949 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
950
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
951 putchar ('\n');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
952 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
953
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
954 printf ("%ld:\tend of pattern.\n", (long)(p - start));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
955 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
956
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
957
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
958 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
959 print_compiled_pattern (struct re_pattern_buffer *bufp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
960 {
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
961 re_char *buffer = bufp->buffer;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
962
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
963 print_partial_compiled_pattern (buffer, buffer + bufp->used);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
964 printf ("%ld bytes used/%ld bytes allocated.\n", bufp->used,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
965 bufp->allocated);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
966
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
967 if (bufp->fastmap_accurate && bufp->fastmap)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
968 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
969 printf ("fastmap: ");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
970 print_fastmap (bufp->fastmap);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
971 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
972
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
973 printf ("re_nsub: %ld\t", (long)bufp->re_nsub);
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
974 printf ("re_ngroups: %ld\t", (long)bufp->re_ngroups);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
975 printf ("regs_alloc: %d\t", bufp->regs_allocated);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
976 printf ("can_be_null: %d\t", bufp->can_be_null);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
977 printf ("newline_anchor: %d\n", bufp->newline_anchor);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
978 printf ("no_sub: %d\t", bufp->no_sub);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
979 printf ("not_bol: %d\t", bufp->not_bol);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
980 printf ("not_eol: %d\t", bufp->not_eol);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
981 printf ("syntax: %d\n", bufp->syntax);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
982 /* Perhaps we should print the translate table? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
983 /* and maybe the category table? */
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
984
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
985 if (bufp->external_to_internal_register)
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
986 {
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
987 int i;
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
988
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
989 printf ("external_to_internal_register:\n");
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
990 for (i = 0; i <= bufp->re_nsub; i++)
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
991 {
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
992 if (i > 0)
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
993 printf (", ");
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
994 printf ("%d -> %d", i, bufp->external_to_internal_register[i]);
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
995 }
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
996 printf ("\n");
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
997 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
998 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
999
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1000
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1001 static void
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1002 print_double_string (re_char *where, re_char *string1, int size1,
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1003 re_char *string2, int size2)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1004 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1005 if (where == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1006 printf ("(null)");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1007 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1008 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1009 unsigned int this_char;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1010
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1011 if (FIRST_STRING_P (where))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1012 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1013 for (this_char = where - string1; this_char < size1; this_char++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1014 putchar (string1[this_char]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1015
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1016 where = string2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1017 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1018
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1019 for (this_char = where - string2; this_char < size2; this_char++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1020 putchar (string2[this_char]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1021 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1022 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1023
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1024 #else /* not DEBUG */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1025
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1026 #undef assert
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1027 #define assert(e)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1028
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1029 #define DEBUG_STATEMENT(e)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1030 #define DEBUG_PRINT1(x)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1031 #define DEBUG_PRINT2(x1, x2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1032 #define DEBUG_PRINT3(x1, x2, x3)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1033 #define DEBUG_PRINT4(x1, x2, x3, x4)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1034 #define DEBUG_PRINT_COMPILED_PATTERN(p, s, e)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1035 #define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1036
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1037 #endif /* DEBUG */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1038
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1039 /* Set by `re_set_syntax' to the current regexp syntax to recognize. Can
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1040 also be assigned to arbitrarily: each pattern buffer stores its own
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1041 syntax, so it can be changed between regex compilations. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1042 /* This has no initializer because initialized variables in Emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1043 become read-only after dumping. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1044 reg_syntax_t re_syntax_options;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1045
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1046
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1047 /* Specify the precise syntax of regexps for compilation. This provides
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1048 for compatibility for various utilities which historically have
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1049 different, incompatible syntaxes.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1050
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1051 The argument SYNTAX is a bit mask comprised of the various bits
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1052 defined in regex.h. We return the old syntax. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1053
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1054 reg_syntax_t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1055 re_set_syntax (reg_syntax_t syntax)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1056 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1057 reg_syntax_t ret = re_syntax_options;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1058
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1059 re_syntax_options = syntax;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1060 return ret;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1061 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1062
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1063 /* This table gives an error message for each of the error codes listed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1064 in regex.h. Obviously the order here has to be same as there.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1065 POSIX doesn't require that we do anything for REG_NOERROR,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1066 but why not be nice? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1067
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1068 static const char *re_error_msgid[] =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1069 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1070 "Success", /* REG_NOERROR */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1071 "No match", /* REG_NOMATCH */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1072 "Invalid regular expression", /* REG_BADPAT */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1073 "Invalid collation character", /* REG_ECOLLATE */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1074 "Invalid character class name", /* REG_ECTYPE */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1075 "Trailing backslash", /* REG_EESCAPE */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1076 "Invalid back reference", /* REG_ESUBREG */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1077 "Unmatched [ or [^", /* REG_EBRACK */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1078 "Unmatched ( or \\(", /* REG_EPAREN */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1079 "Unmatched \\{", /* REG_EBRACE */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1080 "Invalid content of \\{\\}", /* REG_BADBR */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1081 "Invalid range end", /* REG_ERANGE */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1082 "Memory exhausted", /* REG_ESPACE */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1083 "Invalid preceding regular expression", /* REG_BADRPT */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1084 "Premature end of regular expression", /* REG_EEND */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1085 "Regular expression too big", /* REG_ESIZE */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1086 "Unmatched ) or \\)", /* REG_ERPAREN */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1087 #ifdef emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1088 "Invalid syntax designator", /* REG_ESYNTAX */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1089 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1090 #ifdef MULE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1091 "Ranges may not span charsets", /* REG_ERANGESPAN */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1092 "Invalid category designator", /* REG_ECATEGORY */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1093 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1094 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1095
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1096 /* Avoiding alloca during matching, to placate r_alloc. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1097
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1098 /* Define MATCH_MAY_ALLOCATE unless we need to make sure that the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1099 searching and matching functions should not call alloca. On some
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1100 systems, alloca is implemented in terms of malloc, and if we're
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1101 using the relocating allocator routines, then malloc could cause a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1102 relocation, which might (if the strings being searched are in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1103 ralloc heap) shift the data out from underneath the regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1104 routines.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1105
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1106 Here's another reason to avoid allocation: Emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1107 processes input from X in a signal handler; processing X input may
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1108 call malloc; if input arrives while a matching routine is calling
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1109 malloc, then we're scrod. But Emacs can't just block input while
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1110 calling matching routines; then we don't notice interrupts when
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1111 they come in. So, Emacs blocks input around all regexp calls
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1112 except the matching calls, which it leaves unprotected, in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1113 faith that they will not malloc. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1114
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1115 /* Normally, this is fine. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1116 #define MATCH_MAY_ALLOCATE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1117
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1118 /* When using GNU C, we are not REALLY using the C alloca, no matter
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1119 what config.h may say. So don't take precautions for it. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1120 #ifdef __GNUC__
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1121 #undef C_ALLOCA
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1122 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1123
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1124 /* The match routines may not allocate if (1) they would do it with malloc
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1125 and (2) it's not safe for them to use malloc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1126 Note that if REL_ALLOC is defined, matching would not use malloc for the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1127 failure stack, but we would still use it for the register vectors;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1128 so REL_ALLOC should not affect this. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1129 #if (defined (C_ALLOCA) || defined (REGEX_MALLOC)) && defined (emacs)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1130 #undef MATCH_MAY_ALLOCATE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1131 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1132
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1133
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1134 /* Failure stack declarations and macros; both re_compile_fastmap and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1135 re_match_2 use a failure stack. These have to be macros because of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1136 REGEX_ALLOCATE_STACK. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1137
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1138
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1139 /* Number of failure points for which to initially allocate space
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1140 when matching. If this number is exceeded, we allocate more
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1141 space, so it is not a hard limit. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1142 #ifndef INIT_FAILURE_ALLOC
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1143 #define INIT_FAILURE_ALLOC 5
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1144 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1145
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1146 /* Roughly the maximum number of failure points on the stack. Would be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1147 exactly that if always used MAX_FAILURE_SPACE each time we failed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1148 This is a variable only so users of regex can assign to it; we never
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1149 change it ourselves. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1150 #if defined (MATCH_MAY_ALLOCATE)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1151 /* 4400 was enough to cause a crash on Alpha OSF/1,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1152 whose default stack limit is 2mb. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1153 int re_max_failures = 20000;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1154 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1155 int re_max_failures = 2000;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1156 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1157
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1158 union fail_stack_elt
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1159 {
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1160 re_char *pointer;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1161 int integer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1162 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1163
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1164 typedef union fail_stack_elt fail_stack_elt_t;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1165
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1166 typedef struct
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1167 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1168 fail_stack_elt_t *stack;
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1169 size_t size;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1170 size_t avail; /* Offset of next open position. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1171 } fail_stack_type;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1172
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1173 #define FAIL_STACK_EMPTY() (fail_stack.avail == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1174 #define FAIL_STACK_PTR_EMPTY() (fail_stack_ptr->avail == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1175 #define FAIL_STACK_FULL() (fail_stack.avail == fail_stack.size)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1176
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1177
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1178 /* Define macros to initialize and free the failure stack.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1179 Do `return -2' if the alloc fails. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1180
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1181 #ifdef MATCH_MAY_ALLOCATE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1182 #define INIT_FAIL_STACK() \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1183 do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1184 fail_stack.stack = (fail_stack_elt_t *) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1185 REGEX_ALLOCATE_STACK (INIT_FAILURE_ALLOC * sizeof (fail_stack_elt_t)); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1186 \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1187 if (fail_stack.stack == NULL) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1188 return -2; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1189 \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1190 fail_stack.size = INIT_FAILURE_ALLOC; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1191 fail_stack.avail = 0; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1192 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1193
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1194 #define RESET_FAIL_STACK() REGEX_FREE_STACK (fail_stack.stack)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1195 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1196 #define INIT_FAIL_STACK() \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1197 do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1198 fail_stack.avail = 0; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1199 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1200
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1201 #define RESET_FAIL_STACK()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1202 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1203
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1204
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1205 /* Double the size of FAIL_STACK, up to approximately `re_max_failures' items.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1206
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1207 Return 1 if succeeds, and 0 if either ran out of memory
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1208 allocating space for it or it was already too large.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1209
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1210 REGEX_REALLOCATE_STACK requires `destination' be declared. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1211
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1212 #define DOUBLE_FAIL_STACK(fail_stack) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1213 ((fail_stack).size > re_max_failures * MAX_FAILURE_ITEMS \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1214 ? 0 \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1215 : ((fail_stack).stack = (fail_stack_elt_t *) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1216 REGEX_REALLOCATE_STACK ((fail_stack).stack, \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1217 (fail_stack).size * sizeof (fail_stack_elt_t), \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1218 ((fail_stack).size << 1) * sizeof (fail_stack_elt_t)), \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1219 \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1220 (fail_stack).stack == NULL \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1221 ? 0 \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1222 : ((fail_stack).size <<= 1, \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1223 1)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1224
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1225
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1226 /* Push pointer POINTER on FAIL_STACK.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1227 Return 1 if was able to do so and 0 if ran out of memory allocating
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1228 space to do so. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1229 #define PUSH_PATTERN_OP(POINTER, FAIL_STACK) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1230 ((FAIL_STACK_FULL () \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1231 && !DOUBLE_FAIL_STACK (FAIL_STACK)) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1232 ? 0 \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1233 : ((FAIL_STACK).stack[(FAIL_STACK).avail++].pointer = POINTER, \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1234 1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1235
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1236 /* Push a pointer value onto the failure stack.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1237 Assumes the variable `fail_stack'. Probably should only
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1238 be called from within `PUSH_FAILURE_POINT'. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1239 #define PUSH_FAILURE_POINTER(item) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1240 fail_stack.stack[fail_stack.avail++].pointer = (unsigned char *) (item)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1241
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1242 /* This pushes an integer-valued item onto the failure stack.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1243 Assumes the variable `fail_stack'. Probably should only
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1244 be called from within `PUSH_FAILURE_POINT'. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1245 #define PUSH_FAILURE_INT(item) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1246 fail_stack.stack[fail_stack.avail++].integer = (item)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1247
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1248 /* Push a fail_stack_elt_t value onto the failure stack.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1249 Assumes the variable `fail_stack'. Probably should only
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1250 be called from within `PUSH_FAILURE_POINT'. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1251 #define PUSH_FAILURE_ELT(item) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1252 fail_stack.stack[fail_stack.avail++] = (item)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1253
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1254 /* These three POP... operations complement the three PUSH... operations.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1255 All assume that `fail_stack' is nonempty. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1256 #define POP_FAILURE_POINTER() fail_stack.stack[--fail_stack.avail].pointer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1257 #define POP_FAILURE_INT() fail_stack.stack[--fail_stack.avail].integer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1258 #define POP_FAILURE_ELT() fail_stack.stack[--fail_stack.avail]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1259
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1260 /* Used to omit pushing failure point id's when we're not debugging. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1261 #ifdef DEBUG
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1262 #define DEBUG_PUSH PUSH_FAILURE_INT
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1263 #define DEBUG_POP(item_addr) *(item_addr) = POP_FAILURE_INT ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1264 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1265 #define DEBUG_PUSH(item)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1266 #define DEBUG_POP(item_addr)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1267 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1268
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1269
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1270 /* Push the information about the state we will need
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1271 if we ever fail back to it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1272
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1273 Requires variables fail_stack, regstart, regend, reg_info, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1274 num_regs be declared. DOUBLE_FAIL_STACK requires `destination' be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1275 declared.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1276
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1277 Does `return FAILURE_CODE' if runs out of memory. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1278
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1279 #if !defined (REGEX_MALLOC) && !defined (REL_ALLOC)
456
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1280 #define DECLARE_DESTINATION char *destination
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1281 #else
456
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1282 #define DECLARE_DESTINATION DECLARE_NOTHING
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1283 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1284
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1285 #define PUSH_FAILURE_POINT(pattern_place, string_place, failure_code) \
456
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1286 do { \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1287 DECLARE_DESTINATION; \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1288 /* Must be int, so when we don't save any registers, the arithmetic \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1289 of 0 + -1 isn't done as unsigned. */ \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1290 int this_reg; \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1291 \
456
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1292 DEBUG_STATEMENT (failure_id++); \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1293 DEBUG_STATEMENT (nfailure_points_pushed++); \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1294 DEBUG_PRINT2 ("\nPUSH_FAILURE_POINT #%u:\n", failure_id); \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1295 DEBUG_PRINT2 (" Before push, next avail: %lu\n", \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1296 (unsigned long) (fail_stack).avail); \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1297 DEBUG_PRINT2 (" size: %lu\n", \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1298 (unsigned long) (fail_stack).size); \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1299 \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1300 DEBUG_PRINT2 (" slots needed: %d\n", NUM_FAILURE_ITEMS); \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1301 DEBUG_PRINT2 (" available: %ld\n", \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1302 (long) REMAINING_AVAIL_SLOTS); \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1303 \
456
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1304 /* Ensure we have enough space allocated for what we will push. */ \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1305 while (REMAINING_AVAIL_SLOTS < NUM_FAILURE_ITEMS) \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1306 { \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1307 if (!DOUBLE_FAIL_STACK (fail_stack)) \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1308 return failure_code; \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1309 \
456
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1310 DEBUG_PRINT2 ("\n Doubled stack; size now: %lu\n", \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1311 (unsigned long) (fail_stack).size); \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1312 DEBUG_PRINT2 (" slots available: %ld\n", \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1313 (long) REMAINING_AVAIL_SLOTS); \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1314 } \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1315 \
456
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1316 /* Push the info, starting with the registers. */ \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1317 DEBUG_PRINT1 ("\n"); \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1318 \
456
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1319 for (this_reg = lowest_active_reg; this_reg <= highest_active_reg; \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1320 this_reg++) \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1321 { \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1322 DEBUG_PRINT2 (" Pushing reg: %d\n", this_reg); \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1323 DEBUG_STATEMENT (num_regs_pushed++); \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1324 \
456
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1325 DEBUG_PRINT2 (" start: 0x%lx\n", (long) regstart[this_reg]); \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1326 PUSH_FAILURE_POINTER (regstart[this_reg]); \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1327 \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1328 DEBUG_PRINT2 (" end: 0x%lx\n", (long) regend[this_reg]); \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1329 PUSH_FAILURE_POINTER (regend[this_reg]); \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1330 \
456
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1331 DEBUG_PRINT2 (" info: 0x%lx\n ", \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1332 * (long *) (&reg_info[this_reg])); \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1333 DEBUG_PRINT2 (" match_null=%d", \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1334 REG_MATCH_NULL_STRING_P (reg_info[this_reg])); \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1335 DEBUG_PRINT2 (" active=%d", IS_ACTIVE (reg_info[this_reg])); \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1336 DEBUG_PRINT2 (" matched_something=%d", \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1337 MATCHED_SOMETHING (reg_info[this_reg])); \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1338 DEBUG_PRINT2 (" ever_matched_something=%d", \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1339 EVER_MATCHED_SOMETHING (reg_info[this_reg])); \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1340 DEBUG_PRINT1 ("\n"); \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1341 PUSH_FAILURE_ELT (reg_info[this_reg].word); \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1342 } \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1343 \
456
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1344 DEBUG_PRINT2 (" Pushing low active reg: %d\n", lowest_active_reg); \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1345 PUSH_FAILURE_INT (lowest_active_reg); \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1346 \
456
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1347 DEBUG_PRINT2 (" Pushing high active reg: %d\n", highest_active_reg); \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1348 PUSH_FAILURE_INT (highest_active_reg); \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1349 \
456
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1350 DEBUG_PRINT2 (" Pushing pattern 0x%lx: \n", (long) pattern_place); \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1351 DEBUG_PRINT_COMPILED_PATTERN (bufp, pattern_place, pend); \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1352 PUSH_FAILURE_POINTER (pattern_place); \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1353 \
456
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1354 DEBUG_PRINT2 (" Pushing string 0x%lx: `", (long) string_place); \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1355 DEBUG_PRINT_DOUBLE_STRING (string_place, string1, size1, string2, \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1356 size2); \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1357 DEBUG_PRINT1 ("'\n"); \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1358 PUSH_FAILURE_POINTER (string_place); \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1359 \
456
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1360 DEBUG_PRINT2 (" Pushing failure id: %u\n", failure_id); \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1361 DEBUG_PUSH (failure_id); \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1362 } while (0)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1363
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1364 /* This is the number of items that are pushed and popped on the stack
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1365 for each register. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1366 #define NUM_REG_ITEMS 3
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1367
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1368 /* Individual items aside from the registers. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1369 #ifdef DEBUG
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1370 #define NUM_NONREG_ITEMS 5 /* Includes failure point id. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1371 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1372 #define NUM_NONREG_ITEMS 4
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1373 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1374
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1375 /* We push at most this many items on the stack. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1376 /* We used to use (num_regs - 1), which is the number of registers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1377 this regexp will save; but that was changed to 5
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1378 to avoid stack overflow for a regexp with lots of parens. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1379 #define MAX_FAILURE_ITEMS (5 * NUM_REG_ITEMS + NUM_NONREG_ITEMS)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1380
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1381 /* We actually push this many items. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1382 #define NUM_FAILURE_ITEMS \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1383 ((highest_active_reg - lowest_active_reg + 1) * NUM_REG_ITEMS \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1384 + NUM_NONREG_ITEMS)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1385
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1386 /* How many items can still be added to the stack without overflowing it. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1387 #define REMAINING_AVAIL_SLOTS ((fail_stack).size - (fail_stack).avail)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1388
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1389
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1390 /* Pops what PUSH_FAIL_STACK pushes.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1391
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1392 We restore into the parameters, all of which should be lvalues:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1393 STR -- the saved data position.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1394 PAT -- the saved pattern position.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1395 LOW_REG, HIGH_REG -- the highest and lowest active registers.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1396 REGSTART, REGEND -- arrays of string positions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1397 REG_INFO -- array of information about each subexpression.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1398
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1399 Also assumes the variables `fail_stack' and (if debugging), `bufp',
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1400 `pend', `string1', `size1', `string2', and `size2'. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1401
456
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1402 #define POP_FAILURE_POINT(str, pat, low_reg, high_reg, \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1403 regstart, regend, reg_info) \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1404 do { \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1405 DEBUG_STATEMENT (fail_stack_elt_t ffailure_id;) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1406 int this_reg; \
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1407 const unsigned char *string_temp; \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1408 \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1409 assert (!FAIL_STACK_EMPTY ()); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1410 \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1411 /* Remove failure points and point to how many regs pushed. */ \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1412 DEBUG_PRINT1 ("POP_FAILURE_POINT:\n"); \
456
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1413 DEBUG_PRINT2 (" Before pop, next avail: %lu\n", \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1414 (unsigned long) fail_stack.avail); \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1415 DEBUG_PRINT2 (" size: %lu\n", \
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1416 (unsigned long) fail_stack.size); \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1417 \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1418 assert (fail_stack.avail >= NUM_NONREG_ITEMS); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1419 \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1420 DEBUG_POP (&ffailure_id.integer); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1421 DEBUG_PRINT2 (" Popping failure id: %u\n", \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1422 * (unsigned int *) &ffailure_id); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1423 \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1424 /* If the saved string location is NULL, it came from an \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1425 on_failure_keep_string_jump opcode, and we want to throw away the \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1426 saved NULL, thus retaining our current position in the string. */ \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1427 string_temp = POP_FAILURE_POINTER (); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1428 if (string_temp != NULL) \
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1429 str = string_temp; \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1430 \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1431 DEBUG_PRINT2 (" Popping string 0x%lx: `", (long) str); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1432 DEBUG_PRINT_DOUBLE_STRING (str, string1, size1, string2, size2); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1433 DEBUG_PRINT1 ("'\n"); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1434 \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1435 pat = (unsigned char *) POP_FAILURE_POINTER (); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1436 DEBUG_PRINT2 (" Popping pattern 0x%lx: ", (long) pat); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1437 DEBUG_PRINT_COMPILED_PATTERN (bufp, pat, pend); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1438 \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1439 /* Restore register info. */ \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1440 high_reg = (unsigned) POP_FAILURE_INT (); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1441 DEBUG_PRINT2 (" Popping high active reg: %d\n", high_reg); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1442 \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1443 low_reg = (unsigned) POP_FAILURE_INT (); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1444 DEBUG_PRINT2 (" Popping low active reg: %d\n", low_reg); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1445 \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1446 for (this_reg = high_reg; this_reg >= low_reg; this_reg--) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1447 { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1448 DEBUG_PRINT2 (" Popping reg: %d\n", this_reg); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1449 \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1450 reg_info[this_reg].word = POP_FAILURE_ELT (); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1451 DEBUG_PRINT2 (" info: 0x%lx\n", \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1452 * (long *) &reg_info[this_reg]); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1453 \
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1454 regend[this_reg] = POP_FAILURE_POINTER (); \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1455 DEBUG_PRINT2 (" end: 0x%lx\n", (long) regend[this_reg]); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1456 \
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1457 regstart[this_reg] = POP_FAILURE_POINTER (); \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1458 DEBUG_PRINT2 (" start: 0x%lx\n", (long) regstart[this_reg]); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1459 } \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1460 \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1461 set_regs_matched_done = 0; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1462 DEBUG_STATEMENT (nfailure_points_popped++); \
456
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
1463 } while (0) /* POP_FAILURE_POINT */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1464
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1465
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1466
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1467 /* Structure for per-register (a.k.a. per-group) information.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1468 Other register information, such as the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1469 starting and ending positions (which are addresses), and the list of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1470 inner groups (which is a bits list) are maintained in separate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1471 variables.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1472
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1473 We are making a (strictly speaking) nonportable assumption here: that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1474 the compiler will pack our bit fields into something that fits into
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1475 the type of `word', i.e., is something that fits into one item on the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1476 failure stack. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1477
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1478 typedef union
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1479 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1480 fail_stack_elt_t word;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1481 struct
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1482 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1483 /* This field is one if this group can match the empty string,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1484 zero if not. If not yet determined, `MATCH_NULL_UNSET_VALUE'. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1485 #define MATCH_NULL_UNSET_VALUE 3
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1486 unsigned match_null_string_p : 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1487 unsigned is_active : 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1488 unsigned matched_something : 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1489 unsigned ever_matched_something : 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1490 } bits;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1491 } register_info_type;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1492
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1493 #define REG_MATCH_NULL_STRING_P(R) ((R).bits.match_null_string_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1494 #define IS_ACTIVE(R) ((R).bits.is_active)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1495 #define MATCHED_SOMETHING(R) ((R).bits.matched_something)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1496 #define EVER_MATCHED_SOMETHING(R) ((R).bits.ever_matched_something)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1497
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1498
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1499 /* Call this when have matched a real character; it sets `matched' flags
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1500 for the subexpressions which we are currently inside. Also records
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1501 that those subexprs have matched. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1502 #define SET_REGS_MATCHED() \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1503 do \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1504 { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1505 if (!set_regs_matched_done) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1506 { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1507 unsigned r; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1508 set_regs_matched_done = 1; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1509 for (r = lowest_active_reg; r <= highest_active_reg; r++) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1510 { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1511 MATCHED_SOMETHING (reg_info[r]) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1512 = EVER_MATCHED_SOMETHING (reg_info[r]) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1513 = 1; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1514 } \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1515 } \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1516 } \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1517 while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1518
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1519 /* Registers are set to a sentinel when they haven't yet matched. */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1520 static unsigned char reg_unset_dummy;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1521 #define REG_UNSET_VALUE (&reg_unset_dummy)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1522 #define REG_UNSET(e) ((e) == REG_UNSET_VALUE)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1523
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1524 /* Subroutine declarations and macros for regex_compile. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1525
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1526 /* Fetch the next character in the uncompiled pattern---translating it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1527 if necessary. Also cast from a signed character in the constant
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1528 string passed to us by the user to an unsigned char that we can use
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1529 as an array index (in, e.g., `translate'). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1530 #define PATFETCH(c) \
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1531 do { \
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1532 PATFETCH_RAW (c); \
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1533 c = TRANSLATE (c); \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1534 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1535
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1536 /* Fetch the next character in the uncompiled pattern, with no
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1537 translation. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1538 #define PATFETCH_RAW(c) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1539 do {if (p == pend) return REG_EEND; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1540 assert (p < pend); \
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1541 c = charptr_emchar (p); \
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1542 INC_CHARPTR (p); \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1543 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1544
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1545 /* Go backwards one character in the pattern. */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1546 #define PATUNFETCH DEC_CHARPTR (p)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1547
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1548 #ifdef MULE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1549
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1550 #define PATFETCH_EXTENDED(emch) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1551 do {if (p == pend) return REG_EEND; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1552 assert (p < pend); \
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1553 emch = charptr_emchar ((const Bufbyte *) p); \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1554 INC_CHARPTR (p); \
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1555 if (TRANSLATE_P (translate) && emch < 0x80) \
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1556 emch = (Emchar) (unsigned char) RE_TRANSLATE (emch); \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1557 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1558
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1559 #define PATFETCH_RAW_EXTENDED(emch) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1560 do {if (p == pend) return REG_EEND; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1561 assert (p < pend); \
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1562 emch = charptr_emchar ((const Bufbyte *) p); \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1563 INC_CHARPTR (p); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1564 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1565
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1566 #define PATUNFETCH_EXTENDED DEC_CHARPTR (p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1567
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1568 #define PATFETCH_EITHER(emch) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1569 do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1570 if (has_extended_chars) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1571 PATFETCH_EXTENDED (emch); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1572 else \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1573 PATFETCH (emch); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1574 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1575
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1576 #define PATFETCH_RAW_EITHER(emch) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1577 do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1578 if (has_extended_chars) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1579 PATFETCH_RAW_EXTENDED (emch); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1580 else \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1581 PATFETCH_RAW (emch); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1582 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1583
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1584 #define PATUNFETCH_EITHER \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1585 do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1586 if (has_extended_chars) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1587 PATUNFETCH_EXTENDED (emch); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1588 else \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1589 PATUNFETCH (emch); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1590 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1591
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1592 #else /* not MULE */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1593
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1594 #define PATFETCH_EITHER(emch) PATFETCH (emch)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1595 #define PATFETCH_RAW_EITHER(emch) PATFETCH_RAW (emch)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1596 #define PATUNFETCH_EITHER PATUNFETCH
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1597
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1598 #endif /* MULE */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1599
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1600 /* If `translate' is non-null, return translate[D], else just D. We
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1601 cast the subscript to translate because some data is declared as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1602 `char *', to avoid warnings when a string constant is passed. But
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1603 when we use a character as a subscript we must make it unsigned. */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1604 #define TRANSLATE(d) (TRANSLATE_P (translate) ? RE_TRANSLATE (d) : (d))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1605
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1606 #ifdef MULE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1607
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1608 #define TRANSLATE_EXTENDED_UNSAFE(emch) \
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1609 (TRANSLATE_P (translate) && emch < 0x80 ? RE_TRANSLATE (emch) : (emch))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1610
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1611 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1612
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1613 /* Macros for outputting the compiled pattern into `buffer'. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1614
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1615 /* If the buffer isn't allocated when it comes in, use this. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1616 #define INIT_BUF_SIZE 32
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1617
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1618 /* Make sure we have at least N more bytes of space in buffer. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1619 #define GET_BUFFER_SPACE(n) \
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1620 while (buf_end - bufp->buffer + (n) > bufp->allocated) \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1621 EXTEND_BUFFER ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1622
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1623 /* Make sure we have one more byte of buffer space and then add C to it. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1624 #define BUF_PUSH(c) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1625 do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1626 GET_BUFFER_SPACE (1); \
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1627 *buf_end++ = (unsigned char) (c); \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1628 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1629
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1630
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1631 /* Ensure we have two more bytes of buffer space and then append C1 and C2. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1632 #define BUF_PUSH_2(c1, c2) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1633 do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1634 GET_BUFFER_SPACE (2); \
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1635 *buf_end++ = (unsigned char) (c1); \
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1636 *buf_end++ = (unsigned char) (c2); \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1637 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1638
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1639
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1640 /* As with BUF_PUSH_2, except for three bytes. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1641 #define BUF_PUSH_3(c1, c2, c3) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1642 do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1643 GET_BUFFER_SPACE (3); \
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1644 *buf_end++ = (unsigned char) (c1); \
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1645 *buf_end++ = (unsigned char) (c2); \
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1646 *buf_end++ = (unsigned char) (c3); \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1647 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1648
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1649
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1650 /* Store a jump with opcode OP at LOC to location TO. We store a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1651 relative address offset by the three bytes the jump itself occupies. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1652 #define STORE_JUMP(op, loc, to) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1653 store_op1 (op, loc, (to) - (loc) - 3)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1654
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1655 /* Likewise, for a two-argument jump. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1656 #define STORE_JUMP2(op, loc, to, arg) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1657 store_op2 (op, loc, (to) - (loc) - 3, arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1658
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1659 /* Like `STORE_JUMP', but for inserting. Assume `buf_end' is the
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1660 buffer end. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1661 #define INSERT_JUMP(op, loc, to) \
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1662 insert_op1 (op, loc, (to) - (loc) - 3, buf_end)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1663
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1664 /* Like `STORE_JUMP2', but for inserting. Assume `buf_end' is the
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1665 buffer end. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1666 #define INSERT_JUMP2(op, loc, to, arg) \
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1667 insert_op2 (op, loc, (to) - (loc) - 3, arg, buf_end)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1668
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1669
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1670 /* This is not an arbitrary limit: the arguments which represent offsets
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1671 into the pattern are two bytes long. So if 2^16 bytes turns out to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1672 be too small, many things would have to change. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1673 #define MAX_BUF_SIZE (1L << 16)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1674
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1675
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1676 /* Extend the buffer by twice its current size via realloc and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1677 reset the pointers that pointed into the old block to point to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1678 correct places in the new one. If extending the buffer results in it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1679 being larger than MAX_BUF_SIZE, then flag memory exhausted. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1680 #define EXTEND_BUFFER() \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1681 do { \
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1682 re_char *old_buffer = bufp->buffer; \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1683 if (bufp->allocated == MAX_BUF_SIZE) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1684 return REG_ESIZE; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1685 bufp->allocated <<= 1; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1686 if (bufp->allocated > MAX_BUF_SIZE) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1687 bufp->allocated = MAX_BUF_SIZE; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1688 bufp->buffer = (unsigned char *) realloc (bufp->buffer, bufp->allocated);\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1689 if (bufp->buffer == NULL) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1690 return REG_ESPACE; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1691 /* If the buffer moved, move all the pointers into it. */ \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1692 if (old_buffer != bufp->buffer) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1693 { \
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1694 buf_end = (buf_end - old_buffer) + bufp->buffer; \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1695 begalt = (begalt - old_buffer) + bufp->buffer; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1696 if (fixup_alt_jump) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1697 fixup_alt_jump = (fixup_alt_jump - old_buffer) + bufp->buffer;\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1698 if (laststart) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1699 laststart = (laststart - old_buffer) + bufp->buffer; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1700 if (pending_exact) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1701 pending_exact = (pending_exact - old_buffer) + bufp->buffer; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1702 } \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1703 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1704
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1705
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1706 /* Since we have one byte reserved for the register number argument to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1707 {start,stop}_memory, the maximum number of groups we can report
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1708 things about is what fits in that byte. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1709 #define MAX_REGNUM 255
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1710
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1711 /* But patterns can have more than `MAX_REGNUM' registers. We just
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
1712 ignore the excess.
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
1713 #### not true! groups past this will fail in lots of ways, if we
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
1714 ever have to backtrack.
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
1715 */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1716 typedef unsigned regnum_t;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1717
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
1718 #define INIT_REG_TRANSLATE_SIZE 5
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1719
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1720 /* Macros for the compile stack. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1721
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1722 /* Since offsets can go either forwards or backwards, this type needs to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1723 be able to hold values from -(MAX_BUF_SIZE - 1) to MAX_BUF_SIZE - 1. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1724 typedef int pattern_offset_t;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1725
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1726 typedef struct
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1727 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1728 pattern_offset_t begalt_offset;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1729 pattern_offset_t fixup_alt_jump;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1730 pattern_offset_t inner_group_offset;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1731 pattern_offset_t laststart_offset;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1732 regnum_t regnum;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1733 } compile_stack_elt_t;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1734
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1735
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1736 typedef struct
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1737 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1738 compile_stack_elt_t *stack;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1739 unsigned size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1740 unsigned avail; /* Offset of next open position. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1741 } compile_stack_type;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1742
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1743
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1744 #define INIT_COMPILE_STACK_SIZE 32
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1745
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1746 #define COMPILE_STACK_EMPTY (compile_stack.avail == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1747 #define COMPILE_STACK_FULL (compile_stack.avail == compile_stack.size)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1748
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1749 /* The next available element. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1750 #define COMPILE_STACK_TOP (compile_stack.stack[compile_stack.avail])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1751
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1752
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1753 /* Set the bit for character C in a bit vector. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1754 #define SET_LIST_BIT(c) \
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1755 (buf_end[((unsigned char) (c)) / BYTEWIDTH] \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1756 |= 1 << (((unsigned char) c) % BYTEWIDTH))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1757
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1758 #ifdef MULE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1759
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1760 /* Set the "bit" for character C in a range table. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1761 #define SET_RANGETAB_BIT(c) put_range_table (rtab, c, c, Qt)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1762
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1763 /* Set the "bit" for character c in the appropriate table. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1764 #define SET_EITHER_BIT(c) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1765 do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1766 if (has_extended_chars) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1767 SET_RANGETAB_BIT (c); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1768 else \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1769 SET_LIST_BIT (c); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1770 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1771
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1772 #else /* not MULE */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1773
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1774 #define SET_EITHER_BIT(c) SET_LIST_BIT (c)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1775
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1776 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1777
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1778
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1779 /* Get the next unsigned number in the uncompiled pattern. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1780 #define GET_UNSIGNED_NUMBER(num) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1781 { if (p != pend) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1782 { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1783 PATFETCH (c); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1784 while (ISDIGIT (c)) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1785 { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1786 if (num < 0) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1787 num = 0; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1788 num = num * 10 + c - '0'; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1789 if (p == pend) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1790 break; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1791 PATFETCH (c); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1792 } \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1793 } \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1794 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1795
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1796 #define CHAR_CLASS_MAX_LENGTH 6 /* Namely, `xdigit'. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1797
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1798 #define IS_CHAR_CLASS(string) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1799 (STREQ (string, "alpha") || STREQ (string, "upper") \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1800 || STREQ (string, "lower") || STREQ (string, "digit") \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1801 || STREQ (string, "alnum") || STREQ (string, "xdigit") \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1802 || STREQ (string, "space") || STREQ (string, "print") \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1803 || STREQ (string, "punct") || STREQ (string, "graph") \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1804 || STREQ (string, "cntrl") || STREQ (string, "blank"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1805
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1806 static void store_op1 (re_opcode_t op, unsigned char *loc, int arg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1807 static void store_op2 (re_opcode_t op, unsigned char *loc, int arg1, int arg2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1808 static void insert_op1 (re_opcode_t op, unsigned char *loc, int arg,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1809 unsigned char *end);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1810 static void insert_op2 (re_opcode_t op, unsigned char *loc, int arg1, int arg2,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1811 unsigned char *end);
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
1812 static re_bool at_begline_loc_p (re_char *pattern, re_char *p,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1813 reg_syntax_t syntax);
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
1814 static re_bool at_endline_loc_p (re_char *p, re_char *pend, int syntax);
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
1815 static re_bool group_in_compile_stack (compile_stack_type compile_stack,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1816 regnum_t regnum);
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1817 static reg_errcode_t compile_range (re_char **p_ptr, re_char *pend,
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1818 RE_TRANSLATE_TYPE translate,
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1819 reg_syntax_t syntax,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1820 unsigned char *b);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1821 #ifdef MULE
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1822 static reg_errcode_t compile_extended_range (re_char **p_ptr,
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1823 re_char *pend,
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1824 RE_TRANSLATE_TYPE translate,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1825 reg_syntax_t syntax,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1826 Lisp_Object rtab);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1827 #endif /* MULE */
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
1828 static re_bool group_match_null_string_p (unsigned char **p,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1829 unsigned char *end,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1830 register_info_type *reg_info);
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
1831 static re_bool alt_match_null_string_p (unsigned char *p, unsigned char *end,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1832 register_info_type *reg_info);
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
1833 static re_bool common_op_match_null_string_p (unsigned char **p,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1834 unsigned char *end,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1835 register_info_type *reg_info);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1836 static int bcmp_translate (const unsigned char *s1, const unsigned char *s2,
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1837 REGISTER int len, RE_TRANSLATE_TYPE translate);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1838 static int re_match_2_internal (struct re_pattern_buffer *bufp,
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1839 re_char *string1, int size1,
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1840 re_char *string2, int size2, int pos,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1841 struct re_registers *regs, int stop);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1842
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1843 #ifndef MATCH_MAY_ALLOCATE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1844
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1845 /* If we cannot allocate large objects within re_match_2_internal,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1846 we make the fail stack and register vectors global.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1847 The fail stack, we grow to the maximum size when a regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1848 is compiled.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1849 The register vectors, we adjust in size each time we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1850 compile a regexp, according to the number of registers it needs. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1851
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1852 static fail_stack_type fail_stack;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1853
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1854 /* Size with which the following vectors are currently allocated.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1855 That is so we can make them bigger as needed,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1856 but never make them smaller. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1857 static int regs_allocated_size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1858
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1859 static re_char ** regstart, ** regend;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1860 static re_char ** old_regstart, ** old_regend;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1861 static re_char **best_regstart, **best_regend;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1862 static register_info_type *reg_info;
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1863 static re_char **reg_dummy;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1864 static register_info_type *reg_info_dummy;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1865
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1866 /* Make the register vectors big enough for NUM_REGS registers,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1867 but don't make them smaller. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1868
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1869 static
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1870 regex_grow_registers (int num_regs)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1871 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1872 if (num_regs > regs_allocated_size)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1873 {
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1874 RETALLOC_IF (regstart, num_regs, re_char *);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1875 RETALLOC_IF (regend, num_regs, re_char *);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1876 RETALLOC_IF (old_regstart, num_regs, re_char *);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1877 RETALLOC_IF (old_regend, num_regs, re_char *);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1878 RETALLOC_IF (best_regstart, num_regs, re_char *);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1879 RETALLOC_IF (best_regend, num_regs, re_char *);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1880 RETALLOC_IF (reg_info, num_regs, register_info_type);
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1881 RETALLOC_IF (reg_dummy, num_regs, re_char *);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1882 RETALLOC_IF (reg_info_dummy, num_regs, register_info_type);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1883
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1884 regs_allocated_size = num_regs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1885 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1886 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1887
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1888 #endif /* not MATCH_MAY_ALLOCATE */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1889
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1890 /* `regex_compile' compiles PATTERN (of length SIZE) according to SYNTAX.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1891 Returns one of error codes defined in `regex.h', or zero for success.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1892
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1893 Assumes the `allocated' (and perhaps `buffer') and `translate'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1894 fields are set in BUFP on entry.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1895
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1896 If it succeeds, results are put in BUFP (if it returns an error, the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1897 contents of BUFP are undefined):
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1898 `buffer' is the compiled pattern;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1899 `syntax' is set to SYNTAX;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1900 `used' is set to the length of the compiled pattern;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1901 `fastmap_accurate' is zero;
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
1902 `re_ngroups' is the number of groups/subexpressions (including shy
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
1903 groups) in PATTERN;
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
1904 `re_nsub' is the number of non-shy groups in PATTERN;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1905 `not_bol' and `not_eol' are zero;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1906
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1907 The `fastmap' and `newline_anchor' fields are neither
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1908 examined nor set. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1909
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1910 /* Return, freeing storage we allocated. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1911 #define FREE_STACK_RETURN(value) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1912 return (free (compile_stack.stack), value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1913
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1914 static reg_errcode_t
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1915 regex_compile (re_char *pattern, int size, reg_syntax_t syntax,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1916 struct re_pattern_buffer *bufp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1917 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1918 /* We fetch characters from PATTERN here. We declare these as int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1919 (or possibly long) so that chars above 127 can be used as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1920 array indices. The macros that fetch a character from the pattern
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1921 make sure to coerce to unsigned char before assigning, so we won't
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1922 get bitten by negative numbers here. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1923 /* XEmacs change: used to be unsigned char. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1924 REGISTER EMACS_INT c, c1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1925
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1926 /* A random temporary spot in PATTERN. */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1927 re_char *p1;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1928
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1929 /* Points to the end of the buffer, where we should append. */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1930 REGISTER unsigned char *buf_end;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1931
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1932 /* Keeps track of unclosed groups. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1933 compile_stack_type compile_stack;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1934
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1935 /* Points to the current (ending) position in the pattern. */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1936 re_char *p = pattern;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1937 re_char *pend = pattern + size;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1938
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1939 /* How to translate the characters in the pattern. */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1940 RE_TRANSLATE_TYPE translate = bufp->translate;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1941
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1942 /* Address of the count-byte of the most recently inserted `exactn'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1943 command. This makes it possible to tell if a new exact-match
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1944 character can be added to that command or if the character requires
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1945 a new `exactn' command. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1946 unsigned char *pending_exact = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1947
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1948 /* Address of start of the most recently finished expression.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1949 This tells, e.g., postfix * where to find the start of its
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1950 operand. Reset at the beginning of groups and alternatives. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1951 unsigned char *laststart = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1952
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1953 /* Address of beginning of regexp, or inside of last group. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1954 unsigned char *begalt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1955
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1956 /* Place in the uncompiled pattern (i.e., the {) to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1957 which to go back if the interval is invalid. */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1958 re_char *beg_interval;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1959
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1960 /* Address of the place where a forward jump should go to the end of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1961 the containing expression. Each alternative of an `or' -- except the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1962 last -- ends with a forward jump of this sort. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1963 unsigned char *fixup_alt_jump = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1964
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1965 /* Counts open-groups as they are encountered. Remembered for the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1966 matching close-group on the compile stack, so the same register
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1967 number is put in the stop_memory as the start_memory. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1968 regnum_t regnum = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1969
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1970 #ifdef DEBUG
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1971 DEBUG_PRINT1 ("\nCompiling pattern: ");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1972 if (debug)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1973 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1974 unsigned debug_count;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1975
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1976 for (debug_count = 0; debug_count < size; debug_count++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1977 putchar (pattern[debug_count]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1978 putchar ('\n');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1979 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1980 #endif /* DEBUG */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1981
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1982 /* Initialize the compile stack. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1983 compile_stack.stack = TALLOC (INIT_COMPILE_STACK_SIZE, compile_stack_elt_t);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1984 if (compile_stack.stack == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1985 return REG_ESPACE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1986
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1987 compile_stack.size = INIT_COMPILE_STACK_SIZE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1988 compile_stack.avail = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1989
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1990 /* Initialize the pattern buffer. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1991 bufp->syntax = syntax;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1992 bufp->fastmap_accurate = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1993 bufp->not_bol = bufp->not_eol = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1994
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1995 /* Set `used' to zero, so that if we return an error, the pattern
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1996 printer (for debugging) will think there's no pattern. We reset it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1997 at the end. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1998 bufp->used = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1999
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2000 /* Always count groups, whether or not bufp->no_sub is set. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2001 bufp->re_nsub = 0;
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2002 bufp->re_ngroups = 0;
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2003
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2004 bufp->warned_about_incompatible_back_references = 0;
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2005
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2006 if (bufp->external_to_internal_register == 0)
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2007 {
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2008 bufp->external_to_internal_register_size = INIT_REG_TRANSLATE_SIZE;
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2009 RETALLOC (bufp->external_to_internal_register,
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2010 bufp->external_to_internal_register_size,
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2011 int);
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2012 }
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2013
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2014 {
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2015 int i;
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2016
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2017 bufp->external_to_internal_register[0] = 0;
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2018 for (i = 1; i < bufp->external_to_internal_register_size; i++)
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2019 bufp->external_to_internal_register[i] = (int) 0xDEADBEEF;
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2020 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2021
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2022 #if !defined (emacs) && !defined (SYNTAX_TABLE)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2023 /* Initialize the syntax table. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2024 init_syntax_once ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2025 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2026
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2027 if (bufp->allocated == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2028 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2029 if (bufp->buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2030 { /* If zero allocated, but buffer is non-null, try to realloc
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2031 enough space. This loses if buffer's address is bogus, but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2032 that is the user's responsibility. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2033 RETALLOC (bufp->buffer, INIT_BUF_SIZE, unsigned char);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2034 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2035 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2036 { /* Caller did not allocate a buffer. Do it for them. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2037 bufp->buffer = TALLOC (INIT_BUF_SIZE, unsigned char);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2038 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2039 if (!bufp->buffer) FREE_STACK_RETURN (REG_ESPACE);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2040
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2041 bufp->allocated = INIT_BUF_SIZE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2042 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2043
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2044 begalt = buf_end = bufp->buffer;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2045
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2046 /* Loop through the uncompiled pattern until we're at the end. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2047 while (p != pend)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2048 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2049 PATFETCH (c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2050
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2051 switch (c)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2052 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2053 case '^':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2054 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2055 if ( /* If at start of pattern, it's an operator. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2056 p == pattern + 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2057 /* If context independent, it's an operator. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2058 || syntax & RE_CONTEXT_INDEP_ANCHORS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2059 /* Otherwise, depends on what's come before. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2060 || at_begline_loc_p (pattern, p, syntax))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2061 BUF_PUSH (begline);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2062 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2063 goto normal_char;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2064 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2065 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2066
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2067
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2068 case '$':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2069 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2070 if ( /* If at end of pattern, it's an operator. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2071 p == pend
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2072 /* If context independent, it's an operator. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2073 || syntax & RE_CONTEXT_INDEP_ANCHORS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2074 /* Otherwise, depends on what's next. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2075 || at_endline_loc_p (p, pend, syntax))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2076 BUF_PUSH (endline);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2077 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2078 goto normal_char;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2079 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2080 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2081
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2082
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2083 case '+':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2084 case '?':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2085 if ((syntax & RE_BK_PLUS_QM)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2086 || (syntax & RE_LIMITED_OPS))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2087 goto normal_char;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2088 handle_plus:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2089 case '*':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2090 /* If there is no previous pattern... */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2091 if (!laststart)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2092 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2093 if (syntax & RE_CONTEXT_INVALID_OPS)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2094 FREE_STACK_RETURN (REG_BADRPT);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2095 else if (!(syntax & RE_CONTEXT_INDEP_OPS))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2096 goto normal_char;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2097 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2098
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2099 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2100 /* true means zero/many matches are allowed. */
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
2101 re_bool zero_times_ok = c != '+';
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
2102 re_bool many_times_ok = c != '?';
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2103
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2104 /* true means match shortest string possible. */
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
2105 re_bool minimal = false;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2106
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2107 /* If there is a sequence of repetition chars, collapse it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2108 down to just one (the right one). We can't combine
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2109 interval operators with these because of, e.g., `a{2}*',
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2110 which should only match an even number of `a's. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2111 while (p != pend)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2112 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2113 PATFETCH (c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2114
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2115 if (c == '*' || (!(syntax & RE_BK_PLUS_QM)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2116 && (c == '+' || c == '?')))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2117 ;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2118
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2119 else if (syntax & RE_BK_PLUS_QM && c == '\\')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2120 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2121 if (p == pend) FREE_STACK_RETURN (REG_EESCAPE);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2122
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2123 PATFETCH (c1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2124 if (!(c1 == '+' || c1 == '?'))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2125 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2126 PATUNFETCH;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2127 PATUNFETCH;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2128 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2129 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2130
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2131 c = c1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2132 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2133 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2134 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2135 PATUNFETCH;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2136 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2137 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2138
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2139 /* If we get here, we found another repeat character. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2140 if (!(syntax & RE_NO_MINIMAL_MATCHING))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2141 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
2142 /* "*?" and "+?" and "??" are okay (and mean match
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
2143 minimally), but other sequences (such as "*??" and
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
2144 "+++") are rejected (reserved for future use). */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2145 if (minimal || c != '?')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2146 FREE_STACK_RETURN (REG_BADRPT);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2147 minimal = true;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2148 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2149 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2150 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2151 zero_times_ok |= c != '+';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2152 many_times_ok |= c != '?';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2153 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2154 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2155
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2156 /* Star, etc. applied to an empty pattern is equivalent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2157 to an empty pattern. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2158 if (!laststart)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2159 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2160
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2161 /* Now we know whether zero matches is allowed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2162 and whether two or more matches is allowed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2163 and whether we want minimal or maximal matching. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2164 if (minimal)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2165 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2166 if (!many_times_ok)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2167 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2168 /* "a??" becomes:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2169 0: /on_failure_jump to 6
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2170 3: /jump to 9
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2171 6: /exactn/1/A
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2172 9: end of pattern.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2173 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2174 GET_BUFFER_SPACE (6);
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2175 INSERT_JUMP (jump, laststart, buf_end + 3);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2176 buf_end += 3;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2177 INSERT_JUMP (on_failure_jump, laststart, laststart + 6);
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2178 buf_end += 3;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2179 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2180 else if (zero_times_ok)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2181 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2182 /* "a*?" becomes:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2183 0: /jump to 6
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2184 3: /exactn/1/A
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2185 6: /on_failure_jump to 3
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2186 9: end of pattern.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2187 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2188 GET_BUFFER_SPACE (6);
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2189 INSERT_JUMP (jump, laststart, buf_end + 3);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2190 buf_end += 3;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2191 STORE_JUMP (on_failure_jump, buf_end, laststart + 3);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2192 buf_end += 3;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2193 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2194 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2195 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2196 /* "a+?" becomes:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2197 0: /exactn/1/A
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2198 3: /on_failure_jump to 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2199 6: end of pattern.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2200 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2201 GET_BUFFER_SPACE (3);
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2202 STORE_JUMP (on_failure_jump, buf_end, laststart);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2203 buf_end += 3;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2204 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2205 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2206 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2207 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2208 /* Are we optimizing this jump? */
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
2209 re_bool keep_string_p = false;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2210
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2211 if (many_times_ok)
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2212 { /* More than one repetition is allowed, so put in
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2213 at the end a backward relative jump from
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2214 `buf_end' to before the next jump we're going
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2215 to put in below (which jumps from laststart to
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2216 after this jump).
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2217
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2218 But if we are at the `*' in the exact sequence `.*\n',
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2219 insert an unconditional jump backwards to the .,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2220 instead of the beginning of the loop. This way we only
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2221 push a failure point once, instead of every time
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2222 through the loop. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2223 assert (p - 1 > pattern);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2224
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2225 /* Allocate the space for the jump. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2226 GET_BUFFER_SPACE (3);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2227
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2228 /* We know we are not at the first character of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2229 pattern, because laststart was nonzero. And we've
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2230 already incremented `p', by the way, to be the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2231 character after the `*'. Do we have to do something
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2232 analogous here for null bytes, because of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2233 RE_DOT_NOT_NULL? */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2234 if (*(p - 2) == '.'
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2235 && zero_times_ok
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2236 && p < pend && *p == '\n'
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2237 && !(syntax & RE_DOT_NEWLINE))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2238 { /* We have .*\n. */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2239 STORE_JUMP (jump, buf_end, laststart);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2240 keep_string_p = true;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2241 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2242 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2243 /* Anything else. */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2244 STORE_JUMP (maybe_pop_jump, buf_end, laststart - 3);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2245
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2246 /* We've added more stuff to the buffer. */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2247 buf_end += 3;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2248 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2249
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2250 /* On failure, jump from laststart to buf_end + 3,
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2251 which will be the end of the buffer after this jump
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2252 is inserted. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2253 GET_BUFFER_SPACE (3);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2254 INSERT_JUMP (keep_string_p ? on_failure_keep_string_jump
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2255 : on_failure_jump,
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2256 laststart, buf_end + 3);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2257 buf_end += 3;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2258
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2259 if (!zero_times_ok)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2260 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2261 /* At least one repetition is required, so insert a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2262 `dummy_failure_jump' before the initial
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2263 `on_failure_jump' instruction of the loop. This
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2264 effects a skip over that instruction the first time
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2265 we hit that loop. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2266 GET_BUFFER_SPACE (3);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2267 INSERT_JUMP (dummy_failure_jump, laststart, laststart + 6);
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2268 buf_end += 3;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2269 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2270 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2271 pending_exact = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2272 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2273 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2274
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2275
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2276 case '.':
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2277 laststart = buf_end;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2278 BUF_PUSH (anychar);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2279 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2280
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2281
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2282 case '[':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2283 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2284 /* XEmacs change: this whole section */
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
2285 re_bool had_char_class = false;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2286 #ifdef MULE
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
2287 re_bool has_extended_chars = false;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2288 REGISTER Lisp_Object rtab = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2289 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2290
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2291 if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2292
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2293 /* Ensure that we have enough space to push a charset: the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2294 opcode, the length count, and the bitset; 34 bytes in all. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2295 GET_BUFFER_SPACE (34);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2296
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2297 laststart = buf_end;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2298
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2299 /* We test `*p == '^' twice, instead of using an if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2300 statement, so we only need one BUF_PUSH. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2301 BUF_PUSH (*p == '^' ? charset_not : charset);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2302 if (*p == '^')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2303 p++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2304
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2305 /* Remember the first position in the bracket expression. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2306 p1 = p;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2307
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2308 /* Push the number of bytes in the bitmap. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2309 BUF_PUSH ((1 << BYTEWIDTH) / BYTEWIDTH);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2310
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2311 /* Clear the whole map. */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2312 memset (buf_end, 0, (1 << BYTEWIDTH) / BYTEWIDTH);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2313
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2314 /* charset_not matches newline according to a syntax bit. */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2315 if ((re_opcode_t) buf_end[-2] == charset_not
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2316 && (syntax & RE_HAT_LISTS_NOT_NEWLINE))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2317 SET_LIST_BIT ('\n');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2318
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2319 #ifdef MULE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2320 start_over_with_extended:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2321 if (has_extended_chars)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2322 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2323 /* There are extended chars here, which means we need to start
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2324 over and shift to unified range-table format. */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2325 if (buf_end[-2] == charset)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2326 buf_end[-2] = charset_mule;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2327 else
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2328 buf_end[-2] = charset_mule_not;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2329 buf_end--;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2330 p = p1; /* go back to the beginning of the charset, after
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2331 a possible ^. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2332 rtab = Vthe_lisp_rangetab;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2333 Fclear_range_table (rtab);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2334
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2335 /* charset_not matches newline according to a syntax bit. */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2336 if ((re_opcode_t) buf_end[-1] == charset_mule_not
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2337 && (syntax & RE_HAT_LISTS_NOT_NEWLINE))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2338 SET_EITHER_BIT ('\n');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2339 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2340 #endif /* MULE */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2341
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2342 /* Read in characters and ranges, setting map bits. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2343 for (;;)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2344 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2345 if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2346
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2347 PATFETCH (c);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2348
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2349 #ifdef MULE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2350 if (c >= 0x80 && !has_extended_chars)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2351 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2352 has_extended_chars = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2353 /* Frumble-bumble, we've found some extended chars.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2354 Need to start over, process everything using
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2355 the general extended-char mechanism, and need
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2356 to use charset_mule and charset_mule_not instead
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2357 of charset and charset_not. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2358 goto start_over_with_extended;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2359 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2360 #endif /* MULE */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2361 /* \ might escape characters inside [...] and [^...]. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2362 if ((syntax & RE_BACKSLASH_ESCAPE_IN_LISTS) && c == '\\')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2363 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2364 if (p == pend) FREE_STACK_RETURN (REG_EESCAPE);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2365
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2366 PATFETCH (c1);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2367 #ifdef MULE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2368 if (c1 >= 0x80 && !has_extended_chars)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2369 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2370 has_extended_chars = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2371 goto start_over_with_extended;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2372 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2373 #endif /* MULE */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2374 SET_EITHER_BIT (c1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2375 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2376 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2377
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2378 /* Could be the end of the bracket expression. If it's
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2379 not (i.e., when the bracket expression is `[]' so
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2380 far), the ']' character bit gets set way below. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2381 if (c == ']' && p != p1 + 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2382 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2383
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2384 /* Look ahead to see if it's a range when the last thing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2385 was a character class. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2386 if (had_char_class && c == '-' && *p != ']')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2387 FREE_STACK_RETURN (REG_ERANGE);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2388
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2389 /* Look ahead to see if it's a range when the last thing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2390 was a character: if this is a hyphen not at the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2391 beginning or the end of a list, then it's the range
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2392 operator. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2393 if (c == '-'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2394 && !(p - 2 >= pattern && p[-2] == '[')
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2395 && !(p - 3 >= pattern && p[-3] == '[' && p[-2] == '^')
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2396 && *p != ']')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2397 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2398 reg_errcode_t ret;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2399
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2400 #ifdef MULE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2401 if (* (unsigned char *) p >= 0x80 && !has_extended_chars)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2402 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2403 has_extended_chars = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2404 goto start_over_with_extended;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2405 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2406 if (has_extended_chars)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2407 ret = compile_extended_range (&p, pend, translate,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2408 syntax, rtab);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2409 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2410 #endif /* MULE */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2411 ret = compile_range (&p, pend, translate, syntax, buf_end);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2412 if (ret != REG_NOERROR) FREE_STACK_RETURN (ret);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2413 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2414
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2415 else if (p[0] == '-' && p[1] != ']')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2416 { /* This handles ranges made up of characters only. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2417 reg_errcode_t ret;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2418
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2419 /* Move past the `-'. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2420 PATFETCH (c1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2421
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2422 #ifdef MULE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2423 if (* (unsigned char *) p >= 0x80 && !has_extended_chars)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2424 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2425 has_extended_chars = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2426 goto start_over_with_extended;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2427 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2428 if (has_extended_chars)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2429 ret = compile_extended_range (&p, pend, translate,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2430 syntax, rtab);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2431 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2432 #endif /* MULE */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2433 ret = compile_range (&p, pend, translate, syntax, buf_end);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2434 if (ret != REG_NOERROR) FREE_STACK_RETURN (ret);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2435 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2436
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2437 /* See if we're at the beginning of a possible character
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2438 class. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2439
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2440 else if (syntax & RE_CHAR_CLASSES && c == '[' && *p == ':')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2441 { /* Leave room for the null. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2442 char str[CHAR_CLASS_MAX_LENGTH + 1];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2443
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2444 PATFETCH (c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2445 c1 = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2446
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2447 /* If pattern is `[[:'. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2448 if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2449
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2450 for (;;)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2451 {
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2452 /* #### This code is unused.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2453 Correctness is not checked after TRT
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2454 table change. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2455 PATFETCH (c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2456 if (c == ':' || c == ']' || p == pend
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2457 || c1 == CHAR_CLASS_MAX_LENGTH)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2458 break;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2459 str[c1++] = (char) c;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2460 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2461 str[c1] = '\0';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2462
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2463 /* If isn't a word bracketed by `[:' and `:]':
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2464 undo the ending character, the letters, and leave
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2465 the leading `:' and `[' (but set bits for them). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2466 if (c == ':' && *p == ']')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2467 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2468 int ch;
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
2469 re_bool is_alnum = STREQ (str, "alnum");
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
2470 re_bool is_alpha = STREQ (str, "alpha");
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
2471 re_bool is_blank = STREQ (str, "blank");
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
2472 re_bool is_cntrl = STREQ (str, "cntrl");
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
2473 re_bool is_digit = STREQ (str, "digit");
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
2474 re_bool is_graph = STREQ (str, "graph");
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
2475 re_bool is_lower = STREQ (str, "lower");
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
2476 re_bool is_print = STREQ (str, "print");
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
2477 re_bool is_punct = STREQ (str, "punct");
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
2478 re_bool is_space = STREQ (str, "space");
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
2479 re_bool is_upper = STREQ (str, "upper");
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
2480 re_bool is_xdigit = STREQ (str, "xdigit");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2481
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2482 if (!IS_CHAR_CLASS (str))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2483 FREE_STACK_RETURN (REG_ECTYPE);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2484
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2485 /* Throw away the ] at the end of the character
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2486 class. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2487 PATFETCH (c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2488
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2489 if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2490
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2491 for (ch = 0; ch < 1 << BYTEWIDTH; ch++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2492 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2493 /* This was split into 3 if's to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2494 avoid an arbitrary limit in some compiler. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2495 if ( (is_alnum && ISALNUM (ch))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2496 || (is_alpha && ISALPHA (ch))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2497 || (is_blank && ISBLANK (ch))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2498 || (is_cntrl && ISCNTRL (ch)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2499 SET_EITHER_BIT (ch);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2500 if ( (is_digit && ISDIGIT (ch))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2501 || (is_graph && ISGRAPH (ch))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2502 || (is_lower && ISLOWER (ch))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2503 || (is_print && ISPRINT (ch)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2504 SET_EITHER_BIT (ch);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2505 if ( (is_punct && ISPUNCT (ch))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2506 || (is_space && ISSPACE (ch))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2507 || (is_upper && ISUPPER (ch))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2508 || (is_xdigit && ISXDIGIT (ch)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2509 SET_EITHER_BIT (ch);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2510 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2511 had_char_class = true;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2512 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2513 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2514 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2515 c1++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2516 while (c1--)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2517 PATUNFETCH;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2518 SET_EITHER_BIT ('[');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2519 SET_EITHER_BIT (':');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2520 had_char_class = false;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2521 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2522 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2523 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2524 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2525 had_char_class = false;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2526 SET_EITHER_BIT (c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2527 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2528 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2529
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2530 #ifdef MULE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2531 if (has_extended_chars)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2532 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2533 /* We have a range table, not a bit vector. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2534 int bytes_needed =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2535 unified_range_table_bytes_needed (rtab);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2536 GET_BUFFER_SPACE (bytes_needed);
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2537 unified_range_table_copy_data (rtab, buf_end);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2538 buf_end += unified_range_table_bytes_used (buf_end);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2539 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2540 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2541 #endif /* MULE */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2542 /* Discard any (non)matching list bytes that are all 0 at the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2543 end of the map. Decrease the map-length byte too. */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2544 while ((int) buf_end[-1] > 0 && buf_end[buf_end[-1] - 1] == 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2545 buf_end[-1]--;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2546 buf_end += buf_end[-1];
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2547 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2548 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2549
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2550
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2551 case '(':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2552 if (syntax & RE_NO_BK_PARENS)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2553 goto handle_open;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2554 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2555 goto normal_char;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2556
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2557
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2558 case ')':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2559 if (syntax & RE_NO_BK_PARENS)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2560 goto handle_close;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2561 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2562 goto normal_char;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2563
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2564
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2565 case '\n':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2566 if (syntax & RE_NEWLINE_ALT)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2567 goto handle_alt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2568 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2569 goto normal_char;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2570
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2571
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2572 case '|':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2573 if (syntax & RE_NO_BK_VBAR)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2574 goto handle_alt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2575 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2576 goto normal_char;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2577
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2578
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2579 case '{':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2580 if (syntax & RE_INTERVALS && syntax & RE_NO_BK_BRACES)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2581 goto handle_interval;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2582 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2583 goto normal_char;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2584
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2585
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2586 case '\\':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2587 if (p == pend) FREE_STACK_RETURN (REG_EESCAPE);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2588
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2589 /* Do not translate the character after the \, so that we can
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2590 distinguish, e.g., \B from \b, even if we normally would
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2591 translate, e.g., B to b. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2592 PATFETCH_RAW (c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2593
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2594 switch (c)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2595 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2596 case '(':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2597 if (syntax & RE_NO_BK_PARENS)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2598 goto normal_backslash;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2599
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2600 handle_open:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2601 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2602 regnum_t r;
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2603 int shy = 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2604
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2605 if (!(syntax & RE_NO_SHY_GROUPS)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2606 && p != pend
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2607 && *p == '?')
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2608 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2609 p++;
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2610 PATFETCH (c);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2611 switch (c)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2612 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2613 case ':': /* shy groups */
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2614 shy = 1;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2615 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2616
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2617 /* All others are reserved for future constructs. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2618 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2619 FREE_STACK_RETURN (REG_BADPAT);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2620 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2621 }
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2622
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2623 r = ++regnum;
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2624 bufp->re_ngroups++;
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2625 if (!shy)
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2626 {
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2627 bufp->re_nsub++;
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2628 while (bufp->external_to_internal_register_size <=
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2629 bufp->re_nsub)
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2630 {
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2631 int i;
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2632 int old_size =
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2633 bufp->external_to_internal_register_size;
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2634 bufp->external_to_internal_register_size += 5;
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2635 RETALLOC (bufp->external_to_internal_register,
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2636 bufp->external_to_internal_register_size,
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2637 int);
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2638 /* debugging */
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2639 for (i = old_size;
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2640 i < bufp->external_to_internal_register_size; i++)
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2641 bufp->external_to_internal_register[i] =
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2642 (int) 0xDEADBEEF;
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2643 }
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2644
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2645 bufp->external_to_internal_register[bufp->re_nsub] =
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2646 bufp->re_ngroups;
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2647 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2648
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2649 if (COMPILE_STACK_FULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2650 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2651 RETALLOC (compile_stack.stack, compile_stack.size << 1,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2652 compile_stack_elt_t);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2653 if (compile_stack.stack == NULL) return REG_ESPACE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2654
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2655 compile_stack.size <<= 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2656 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2657
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2658 /* These are the values to restore when we hit end of this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2659 group. They are all relative offsets, so that if the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2660 whole pattern moves because of realloc, they will still
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2661 be valid. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2662 COMPILE_STACK_TOP.begalt_offset = begalt - bufp->buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2663 COMPILE_STACK_TOP.fixup_alt_jump
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2664 = fixup_alt_jump ? fixup_alt_jump - bufp->buffer + 1 : 0;
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2665 COMPILE_STACK_TOP.laststart_offset = buf_end - bufp->buffer;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2666 COMPILE_STACK_TOP.regnum = r;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2667
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2668 /* We will eventually replace the 0 with the number of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2669 groups inner to this one. But do not push a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2670 start_memory for groups beyond the last one we can
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2671 represent in the compiled pattern.
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2672 #### bad bad bad. this will fail in lots of ways, if we
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2673 ever have to backtrack for these groups.
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
2674 */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2675 if (r <= MAX_REGNUM)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2676 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2677 COMPILE_STACK_TOP.inner_group_offset
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2678 = buf_end - bufp->buffer + 2;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2679 BUF_PUSH_3 (start_memory, r, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2680 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2681
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2682 compile_stack.avail++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2683
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2684 fixup_alt_jump = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2685 laststart = 0;
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2686 begalt = buf_end;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2687 /* If we've reached MAX_REGNUM groups, then this open
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2688 won't actually generate any code, so we'll have to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2689 clear pending_exact explicitly. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2690 pending_exact = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2691 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2692 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2693
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2694
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2695 case ')':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2696 if (syntax & RE_NO_BK_PARENS) goto normal_backslash;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2697
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2698 if (COMPILE_STACK_EMPTY) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2699 if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2700 goto normal_backslash;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2701 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2702 FREE_STACK_RETURN (REG_ERPAREN);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2703 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2704
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2705 handle_close:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2706 if (fixup_alt_jump)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2707 { /* Push a dummy failure point at the end of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2708 alternative for a possible future
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2709 `pop_failure_jump' to pop. See comments at
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2710 `push_dummy_failure' in `re_match_2'. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2711 BUF_PUSH (push_dummy_failure);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2712
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2713 /* We allocated space for this jump when we assigned
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2714 to `fixup_alt_jump', in the `handle_alt' case below. */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2715 STORE_JUMP (jump_past_alt, fixup_alt_jump, buf_end - 1);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2716 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2717
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2718 /* See similar code for backslashed left paren above. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2719 if (COMPILE_STACK_EMPTY) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2720 if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2721 goto normal_char;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2722 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2723 FREE_STACK_RETURN (REG_ERPAREN);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2724 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2725
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2726 /* Since we just checked for an empty stack above, this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2727 ``can't happen''. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2728 assert (compile_stack.avail != 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2729 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2730 /* We don't just want to restore into `regnum', because
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2731 later groups should continue to be numbered higher,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2732 as in `(ab)c(de)' -- the second group is #2. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2733 regnum_t this_group_regnum;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2734
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2735 compile_stack.avail--;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2736 begalt = bufp->buffer + COMPILE_STACK_TOP.begalt_offset;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2737 fixup_alt_jump
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2738 = COMPILE_STACK_TOP.fixup_alt_jump
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2739 ? bufp->buffer + COMPILE_STACK_TOP.fixup_alt_jump - 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2740 : 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2741 laststart = bufp->buffer + COMPILE_STACK_TOP.laststart_offset;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2742 this_group_regnum = COMPILE_STACK_TOP.regnum;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2743 /* If we've reached MAX_REGNUM groups, then this open
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2744 won't actually generate any code, so we'll have to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2745 clear pending_exact explicitly. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2746 pending_exact = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2747
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2748 /* We're at the end of the group, so now we know how many
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2749 groups were inside this one. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2750 if (this_group_regnum <= MAX_REGNUM)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2751 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2752 unsigned char *inner_group_loc
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2753 = bufp->buffer + COMPILE_STACK_TOP.inner_group_offset;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2754
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2755 *inner_group_loc = regnum - this_group_regnum;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2756 BUF_PUSH_3 (stop_memory, this_group_regnum,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2757 regnum - this_group_regnum);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2758 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2759 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2760 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2761
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2762
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2763 case '|': /* `\|'. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2764 if (syntax & RE_LIMITED_OPS || syntax & RE_NO_BK_VBAR)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2765 goto normal_backslash;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2766 handle_alt:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2767 if (syntax & RE_LIMITED_OPS)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2768 goto normal_char;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2769
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2770 /* Insert before the previous alternative a jump which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2771 jumps to this alternative if the former fails. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2772 GET_BUFFER_SPACE (3);
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2773 INSERT_JUMP (on_failure_jump, begalt, buf_end + 6);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2774 pending_exact = 0;
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2775 buf_end += 3;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2776
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2777 /* The alternative before this one has a jump after it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2778 which gets executed if it gets matched. Adjust that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2779 jump so it will jump to this alternative's analogous
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2780 jump (put in below, which in turn will jump to the next
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2781 (if any) alternative's such jump, etc.). The last such
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2782 jump jumps to the correct final destination. A picture:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2783 _____ _____
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2784 | | | |
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2785 | v | v
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2786 a | b | c
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2787
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2788 If we are at `b', then fixup_alt_jump right now points to a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2789 three-byte space after `a'. We'll put in the jump, set
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2790 fixup_alt_jump to right after `b', and leave behind three
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2791 bytes which we'll fill in when we get to after `c'. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2792
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2793 if (fixup_alt_jump)
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2794 STORE_JUMP (jump_past_alt, fixup_alt_jump, buf_end);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2795
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2796 /* Mark and leave space for a jump after this alternative,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2797 to be filled in later either by next alternative or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2798 when know we're at the end of a series of alternatives. */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2799 fixup_alt_jump = buf_end;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2800 GET_BUFFER_SPACE (3);
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2801 buf_end += 3;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2802
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2803 laststart = 0;
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2804 begalt = buf_end;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2805 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2806
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2807
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2808 case '{':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2809 /* If \{ is a literal. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2810 if (!(syntax & RE_INTERVALS)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2811 /* If we're at `\{' and it's not the open-interval
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2812 operator. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2813 || ((syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2814 || (p - 2 == pattern && p == pend))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2815 goto normal_backslash;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2816
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2817 handle_interval:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2818 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2819 /* If got here, then the syntax allows intervals. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2820
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2821 /* At least (most) this many matches must be made. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2822 int lower_bound = -1, upper_bound = -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2823
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2824 beg_interval = p - 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2825
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2826 if (p == pend)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2827 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2828 if (syntax & RE_NO_BK_BRACES)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2829 goto unfetch_interval;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2830 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2831 FREE_STACK_RETURN (REG_EBRACE);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2832 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2833
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2834 GET_UNSIGNED_NUMBER (lower_bound);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2835
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2836 if (c == ',')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2837 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2838 GET_UNSIGNED_NUMBER (upper_bound);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2839 if (upper_bound < 0) upper_bound = RE_DUP_MAX;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2840 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2841 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2842 /* Interval such as `{1}' => match exactly once. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2843 upper_bound = lower_bound;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2844
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2845 if (lower_bound < 0 || upper_bound > RE_DUP_MAX
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2846 || lower_bound > upper_bound)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2847 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2848 if (syntax & RE_NO_BK_BRACES)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2849 goto unfetch_interval;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2850 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2851 FREE_STACK_RETURN (REG_BADBR);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2852 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2853
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2854 if (!(syntax & RE_NO_BK_BRACES))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2855 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2856 if (c != '\\') FREE_STACK_RETURN (REG_EBRACE);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2857
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2858 PATFETCH (c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2859 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2860
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2861 if (c != '}')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2862 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2863 if (syntax & RE_NO_BK_BRACES)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2864 goto unfetch_interval;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2865 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2866 FREE_STACK_RETURN (REG_BADBR);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2867 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2868
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2869 /* We just parsed a valid interval. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2870
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2871 /* If it's invalid to have no preceding re. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2872 if (!laststart)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2873 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2874 if (syntax & RE_CONTEXT_INVALID_OPS)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2875 FREE_STACK_RETURN (REG_BADRPT);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2876 else if (syntax & RE_CONTEXT_INDEP_OPS)
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2877 laststart = buf_end;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2878 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2879 goto unfetch_interval;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2880 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2881
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2882 /* If the upper bound is zero, don't want to succeed at
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2883 all; jump from `laststart' to `b + 3', which will be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2884 the end of the buffer after we insert the jump. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2885 if (upper_bound == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2886 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2887 GET_BUFFER_SPACE (3);
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2888 INSERT_JUMP (jump, laststart, buf_end + 3);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2889 buf_end += 3;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2890 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2891
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2892 /* Otherwise, we have a nontrivial interval. When
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2893 we're all done, the pattern will look like:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2894 set_number_at <jump count> <upper bound>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2895 set_number_at <succeed_n count> <lower bound>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2896 succeed_n <after jump addr> <succeed_n count>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2897 <body of loop>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2898 jump_n <succeed_n addr> <jump count>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2899 (The upper bound and `jump_n' are omitted if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2900 `upper_bound' is 1, though.) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2901 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2902 { /* If the upper bound is > 1, we need to insert
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2903 more at the end of the loop. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2904 unsigned nbytes = 10 + (upper_bound > 1) * 10;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2905
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2906 GET_BUFFER_SPACE (nbytes);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2907
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2908 /* Initialize lower bound of the `succeed_n', even
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2909 though it will be set during matching by its
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2910 attendant `set_number_at' (inserted next),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2911 because `re_compile_fastmap' needs to know.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2912 Jump to the `jump_n' we might insert below. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2913 INSERT_JUMP2 (succeed_n, laststart,
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2914 buf_end + 5 + (upper_bound > 1) * 5,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2915 lower_bound);
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2916 buf_end += 5;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2917
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2918 /* Code to initialize the lower bound. Insert
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2919 before the `succeed_n'. The `5' is the last two
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2920 bytes of this `set_number_at', plus 3 bytes of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2921 the following `succeed_n'. */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2922 insert_op2 (set_number_at, laststart, 5, lower_bound, buf_end);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2923 buf_end += 5;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2924
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2925 if (upper_bound > 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2926 { /* More than one repetition is allowed, so
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2927 append a backward jump to the `succeed_n'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2928 that starts this interval.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2929
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2930 When we've reached this during matching,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2931 we'll have matched the interval once, so
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2932 jump back only `upper_bound - 1' times. */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2933 STORE_JUMP2 (jump_n, buf_end, laststart + 5,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2934 upper_bound - 1);
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2935 buf_end += 5;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2936
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2937 /* The location we want to set is the second
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2938 parameter of the `jump_n'; that is `b-2' as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2939 an absolute address. `laststart' will be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2940 the `set_number_at' we're about to insert;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2941 `laststart+3' the number to set, the source
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2942 for the relative address. But we are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2943 inserting into the middle of the pattern --
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2944 so everything is getting moved up by 5.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2945 Conclusion: (b - 2) - (laststart + 3) + 5,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2946 i.e., b - laststart.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2947
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2948 We insert this at the beginning of the loop
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2949 so that if we fail during matching, we'll
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2950 reinitialize the bounds. */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2951 insert_op2 (set_number_at, laststart,
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2952 buf_end - laststart,
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2953 upper_bound - 1, buf_end);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2954 buf_end += 5;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2955 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2956 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2957 pending_exact = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2958 beg_interval = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2959 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2960 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2961
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2962 unfetch_interval:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2963 /* If an invalid interval, match the characters as literals. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2964 assert (beg_interval);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2965 p = beg_interval;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2966 beg_interval = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2967
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2968 /* normal_char and normal_backslash need `c'. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2969 PATFETCH (c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2970
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2971 if (!(syntax & RE_NO_BK_BRACES))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2972 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2973 if (p > pattern && p[-1] == '\\')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2974 goto normal_backslash;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2975 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2976 goto normal_char;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2977
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2978 #ifdef emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2979 /* There is no way to specify the before_dot and after_dot
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2980 operators. rms says this is ok. --karl */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2981 case '=':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2982 BUF_PUSH (at_dot);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2983 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2984
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2985 case 's':
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2986 laststart = buf_end;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2987 PATFETCH (c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2988 /* XEmacs addition */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2989 if (c >= 0x80 || syntax_spec_code[c] == 0377)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2990 FREE_STACK_RETURN (REG_ESYNTAX);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2991 BUF_PUSH_2 (syntaxspec, syntax_spec_code[c]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2992 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2993
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2994 case 'S':
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
2995 laststart = buf_end;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2996 PATFETCH (c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2997 /* XEmacs addition */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2998 if (c >= 0x80 || syntax_spec_code[c] == 0377)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2999 FREE_STACK_RETURN (REG_ESYNTAX);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3000 BUF_PUSH_2 (notsyntaxspec, syntax_spec_code[c]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3001 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3002
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3003 #ifdef MULE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3004 /* 97.2.17 jhod merged in to XEmacs from mule-2.3 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3005 case 'c':
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3006 laststart = buf_end;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3007 PATFETCH_RAW (c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3008 if (c < 32 || c > 127)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3009 FREE_STACK_RETURN (REG_ECATEGORY);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3010 BUF_PUSH_2 (categoryspec, c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3011 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3012
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3013 case 'C':
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3014 laststart = buf_end;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3015 PATFETCH_RAW (c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3016 if (c < 32 || c > 127)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3017 FREE_STACK_RETURN (REG_ECATEGORY);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3018 BUF_PUSH_2 (notcategoryspec, c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3019 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3020 /* end of category patch */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3021 #endif /* MULE */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3022 #endif /* emacs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3023
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3024
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3025 case 'w':
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3026 laststart = buf_end;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3027 BUF_PUSH (wordchar);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3028 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3029
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3030
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3031 case 'W':
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3032 laststart = buf_end;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3033 BUF_PUSH (notwordchar);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3034 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3035
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3036
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3037 case '<':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3038 BUF_PUSH (wordbeg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3039 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3040
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3041 case '>':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3042 BUF_PUSH (wordend);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3043 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3044
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3045 case 'b':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3046 BUF_PUSH (wordbound);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3047 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3048
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3049 case 'B':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3050 BUF_PUSH (notwordbound);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3051 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3052
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3053 case '`':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3054 BUF_PUSH (begbuf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3055 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3056
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3057 case '\'':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3058 BUF_PUSH (endbuf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3059 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3060
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3061 case '1': case '2': case '3': case '4': case '5':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3062 case '6': case '7': case '8': case '9':
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3063 {
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
3064 regnum_t reg, regint;
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
3065 int may_need_to_unfetch = 0;
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3066 if (syntax & RE_NO_BK_REFS)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3067 goto normal_char;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3068
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
3069 /* This only goes up to 99. It could be extended to work
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
3070 up to 255 (the maximum number of registers that can be
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
3071 handled by the current regexp engine, because it stores
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
3072 its register numbers in the compiled pattern as one byte,
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
3073 ugh). Doing that's a bit trickier, because you might
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
3074 have the case where \25 a back-ref but \255 is not, ... */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3075 reg = c - '0';
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
3076 if (p < pend)
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
3077 {
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
3078 PATFETCH (c);
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
3079 if (c >= '0' && c <= '9')
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
3080 {
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
3081 regnum_t new_reg = reg * 10 + c - '0';
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
3082 if (new_reg <= bufp->re_nsub)
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
3083 {
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
3084 reg = new_reg;
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
3085 may_need_to_unfetch = 1;
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
3086 }
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
3087 else
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
3088 PATUNFETCH;
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
3089 }
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
3090 }
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
3091
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
3092 if (reg > bufp->re_nsub)
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3093 FREE_STACK_RETURN (REG_ESUBREG);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3094
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
3095 regint = bufp->external_to_internal_register[reg];
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3096 /* Can't back reference to a subexpression if inside of it. */
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
3097 if (group_in_compile_stack (compile_stack, regint))
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
3098 {
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
3099 if (may_need_to_unfetch)
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
3100 PATUNFETCH;
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
3101 goto normal_char;
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
3102 }
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
3103
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
3104 #ifdef emacs
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
3105 if (reg > 9 &&
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
3106 bufp->warned_about_incompatible_back_references == 0)
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
3107 {
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
3108 bufp->warned_about_incompatible_back_references = 1;
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
3109 warn_when_safe (intern ("regex"), Qinfo,
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
3110 "Back reference \\%d now has new "
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
3111 "semantics in %s", reg, pattern);
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
3112 }
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
3113 #endif
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3114
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3115 laststart = buf_end;
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
3116 BUF_PUSH_2 (duplicate, regint);
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3117 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3118 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3119
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3120
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3121 case '+':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3122 case '?':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3123 if (syntax & RE_BK_PLUS_QM)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3124 goto handle_plus;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3125 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3126 goto normal_backslash;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3127
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3128 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3129 normal_backslash:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3130 /* You might think it would be useful for \ to mean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3131 not to translate; but if we don't translate it,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3132 it will never match anything. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3133 c = TRANSLATE (c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3134 goto normal_char;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3135 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3136 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3137
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3138
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3139 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3140 /* Expects the character in `c'. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3141 /* `p' points to the location after where `c' came from. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3142 normal_char:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3143 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3144 /* XEmacs: modifications here for Mule. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3145 /* `q' points to the beginning of the next char. */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3146 re_char *q = p;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3147
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3148 /* If no exactn currently being built. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3149 if (!pending_exact
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3150
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3151 /* If last exactn not at current position. */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3152 || pending_exact + *pending_exact + 1 != buf_end
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3153
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3154 /* We have only one byte following the exactn for the count. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3155 || ((unsigned int) (*pending_exact + (q - p)) >=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3156 ((unsigned int) (1 << BYTEWIDTH) - 1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3157
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3158 /* If followed by a repetition operator. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3159 || *q == '*' || *q == '^'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3160 || ((syntax & RE_BK_PLUS_QM)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3161 ? *q == '\\' && (q[1] == '+' || q[1] == '?')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3162 : (*q == '+' || *q == '?'))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3163 || ((syntax & RE_INTERVALS)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3164 && ((syntax & RE_NO_BK_BRACES)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3165 ? *q == '{'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3166 : (q[0] == '\\' && q[1] == '{'))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3167 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3168 /* Start building a new exactn. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3169
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3170 laststart = buf_end;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3171
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3172 BUF_PUSH_2 (exactn, 0);
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3173 pending_exact = buf_end - 1;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3174 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3175
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3176 #ifndef MULE
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3177 BUF_PUSH (c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3178 (*pending_exact)++;
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3179 #else
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3180 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3181 Bytecount bt_count;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3182 Bufbyte tmp_buf[MAX_EMCHAR_LEN];
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3183 int i;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3184
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3185 bt_count = set_charptr_emchar (tmp_buf, c);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3186
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3187 for (i = 0; i < bt_count; i++)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3188 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3189 BUF_PUSH (tmp_buf[i]);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3190 (*pending_exact)++;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3191 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3192 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3193 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3194 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3195 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3196 } /* switch (c) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3197 } /* while p != pend */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3198
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3199
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3200 /* Through the pattern now. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3201
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3202 if (fixup_alt_jump)
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3203 STORE_JUMP (jump_past_alt, fixup_alt_jump, buf_end);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3204
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3205 if (!COMPILE_STACK_EMPTY)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3206 FREE_STACK_RETURN (REG_EPAREN);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3207
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3208 /* If we don't want backtracking, force success
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3209 the first time we reach the end of the compiled pattern. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3210 if (syntax & RE_NO_POSIX_BACKTRACKING)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3211 BUF_PUSH (succeed);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3212
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3213 free (compile_stack.stack);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3214
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3215 /* We have succeeded; set the length of the buffer. */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3216 bufp->used = buf_end - bufp->buffer;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3217
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3218 #ifdef DEBUG
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3219 if (debug)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3220 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3221 DEBUG_PRINT1 ("\nCompiled pattern: \n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3222 print_compiled_pattern (bufp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3223 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3224 #endif /* DEBUG */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3225
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3226 #ifndef MATCH_MAY_ALLOCATE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3227 /* Initialize the failure stack to the largest possible stack. This
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3228 isn't necessary unless we're trying to avoid calling alloca in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3229 the search and match routines. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3230 {
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
3231 int num_regs = bufp->re_ngroups + 1;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3232
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3233 /* Since DOUBLE_FAIL_STACK refuses to double only if the current size
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3234 is strictly greater than re_max_failures, the largest possible stack
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3235 is 2 * re_max_failures failure points. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3236 if (fail_stack.size < (2 * re_max_failures * MAX_FAILURE_ITEMS))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3237 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3238 fail_stack.size = (2 * re_max_failures * MAX_FAILURE_ITEMS);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3239
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3240 #ifdef emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3241 if (! fail_stack.stack)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3242 fail_stack.stack
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3243 = (fail_stack_elt_t *) xmalloc (fail_stack.size
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3244 * sizeof (fail_stack_elt_t));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3245 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3246 fail_stack.stack
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3247 = (fail_stack_elt_t *) xrealloc (fail_stack.stack,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3248 (fail_stack.size
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3249 * sizeof (fail_stack_elt_t)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3250 #else /* not emacs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3251 if (! fail_stack.stack)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3252 fail_stack.stack
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3253 = (fail_stack_elt_t *) malloc (fail_stack.size
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3254 * sizeof (fail_stack_elt_t));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3255 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3256 fail_stack.stack
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3257 = (fail_stack_elt_t *) realloc (fail_stack.stack,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3258 (fail_stack.size
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3259 * sizeof (fail_stack_elt_t)));
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3260 #endif /* emacs */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3261 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3262
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3263 regex_grow_registers (num_regs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3264 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3265 #endif /* not MATCH_MAY_ALLOCATE */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3266
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3267 return REG_NOERROR;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3268 } /* regex_compile */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3269
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3270 /* Subroutines for `regex_compile'. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3271
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3272 /* Store OP at LOC followed by two-byte integer parameter ARG. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3273
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3274 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3275 store_op1 (re_opcode_t op, unsigned char *loc, int arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3276 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3277 *loc = (unsigned char) op;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3278 STORE_NUMBER (loc + 1, arg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3279 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3280
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3281
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3282 /* Like `store_op1', but for two two-byte parameters ARG1 and ARG2. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3283
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3284 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3285 store_op2 (re_opcode_t op, unsigned char *loc, int arg1, int arg2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3286 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3287 *loc = (unsigned char) op;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3288 STORE_NUMBER (loc + 1, arg1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3289 STORE_NUMBER (loc + 3, arg2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3290 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3291
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3292
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3293 /* Copy the bytes from LOC to END to open up three bytes of space at LOC
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3294 for OP followed by two-byte integer parameter ARG. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3295
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3296 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3297 insert_op1 (re_opcode_t op, unsigned char *loc, int arg, unsigned char *end)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3298 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3299 REGISTER unsigned char *pfrom = end;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3300 REGISTER unsigned char *pto = end + 3;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3301
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3302 while (pfrom != loc)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3303 *--pto = *--pfrom;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3304
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3305 store_op1 (op, loc, arg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3306 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3307
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3308
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3309 /* Like `insert_op1', but for two two-byte parameters ARG1 and ARG2. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3310
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3311 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3312 insert_op2 (re_opcode_t op, unsigned char *loc, int arg1, int arg2,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3313 unsigned char *end)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3314 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3315 REGISTER unsigned char *pfrom = end;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3316 REGISTER unsigned char *pto = end + 5;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3317
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3318 while (pfrom != loc)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3319 *--pto = *--pfrom;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3320
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3321 store_op2 (op, loc, arg1, arg2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3322 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3323
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3324
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3325 /* P points to just after a ^ in PATTERN. Return true if that ^ comes
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3326 after an alternative or a begin-subexpression. We assume there is at
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3327 least one character before the ^. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3328
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
3329 static re_bool
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3330 at_begline_loc_p (re_char *pattern, re_char *p, reg_syntax_t syntax)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3331 {
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3332 re_char *prev = p - 2;
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
3333 re_bool prev_prev_backslash = prev > pattern && prev[-1] == '\\';
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3334
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3335 return
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3336 /* After a subexpression? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3337 (*prev == '(' && (syntax & RE_NO_BK_PARENS || prev_prev_backslash))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3338 /* After an alternative? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3339 || (*prev == '|' && (syntax & RE_NO_BK_VBAR || prev_prev_backslash));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3340 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3341
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3342
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3343 /* The dual of at_begline_loc_p. This one is for $. We assume there is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3344 at least one character after the $, i.e., `P < PEND'. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3345
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
3346 static re_bool
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3347 at_endline_loc_p (re_char *p, re_char *pend, int syntax)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3348 {
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3349 re_char *next = p;
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
3350 re_bool next_backslash = *next == '\\';
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3351 re_char *next_next = p + 1 < pend ? p + 1 : 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3352
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3353 return
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3354 /* Before a subexpression? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3355 (syntax & RE_NO_BK_PARENS ? *next == ')'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3356 : next_backslash && next_next && *next_next == ')')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3357 /* Before an alternative? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3358 || (syntax & RE_NO_BK_VBAR ? *next == '|'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3359 : next_backslash && next_next && *next_next == '|');
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3360 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3361
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3362
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3363 /* Returns true if REGNUM is in one of COMPILE_STACK's elements and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3364 false if it's not. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3365
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
3366 static re_bool
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3367 group_in_compile_stack (compile_stack_type compile_stack, regnum_t regnum)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3368 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3369 int this_element;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3370
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3371 for (this_element = compile_stack.avail - 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3372 this_element >= 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3373 this_element--)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3374 if (compile_stack.stack[this_element].regnum == regnum)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3375 return true;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3376
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3377 return false;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3378 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3379
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3380
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3381 /* Read the ending character of a range (in a bracket expression) from the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3382 uncompiled pattern *P_PTR (which ends at PEND). We assume the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3383 starting character is in `P[-2]'. (`P[-1]' is the character `-'.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3384 Then we set the translation of all bits between the starting and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3385 ending characters (inclusive) in the compiled pattern B.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3386
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3387 Return an error code.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3388
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3389 We use these short variable names so we can use the same macros as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3390 `regex_compile' itself. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3391
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3392 static reg_errcode_t
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3393 compile_range (re_char **p_ptr, re_char *pend, RE_TRANSLATE_TYPE translate,
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3394 reg_syntax_t syntax, unsigned char *buf_end)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3395 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3396 unsigned this_char;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3397
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3398 re_char *p = *p_ptr;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3399 int range_start, range_end;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3400
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3401 if (p == pend)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3402 return REG_ERANGE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3403
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3404 /* Even though the pattern is a signed `char *', we need to fetch
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3405 with unsigned char *'s; if the high bit of the pattern character
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3406 is set, the range endpoints will be negative if we fetch using a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3407 signed char *.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3408
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3409 We also want to fetch the endpoints without translating them; the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3410 appropriate translation is done in the bit-setting loop below. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3411 /* The SVR4 compiler on the 3B2 had trouble with unsigned const char *. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3412 range_start = ((const unsigned char *) p)[-2];
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3413 range_end = ((const unsigned char *) p)[0];
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3414
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3415 /* Have to increment the pointer into the pattern string, so the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3416 caller isn't still at the ending character. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3417 (*p_ptr)++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3418
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3419 /* If the start is after the end, the range is empty. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3420 if (range_start > range_end)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3421 return syntax & RE_NO_EMPTY_RANGES ? REG_ERANGE : REG_NOERROR;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3422
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3423 /* Here we see why `this_char' has to be larger than an `unsigned
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3424 char' -- the range is inclusive, so if `range_end' == 0xff
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3425 (assuming 8-bit characters), we would otherwise go into an infinite
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3426 loop, since all characters <= 0xff. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3427 for (this_char = range_start; this_char <= range_end; this_char++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3428 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3429 SET_LIST_BIT (TRANSLATE (this_char));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3430 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3431
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3432 return REG_NOERROR;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3433 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3434
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3435 #ifdef MULE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3436
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3437 static reg_errcode_t
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3438 compile_extended_range (re_char **p_ptr, re_char *pend,
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3439 RE_TRANSLATE_TYPE translate,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3440 reg_syntax_t syntax, Lisp_Object rtab)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3441 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3442 Emchar this_char, range_start, range_end;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3443 const Bufbyte *p;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3444
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3445 if (*p_ptr == pend)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3446 return REG_ERANGE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3447
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3448 p = (const Bufbyte *) *p_ptr;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3449 range_end = charptr_emchar (p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3450 p--; /* back to '-' */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3451 DEC_CHARPTR (p); /* back to start of range */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3452 /* We also want to fetch the endpoints without translating them; the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3453 appropriate translation is done in the bit-setting loop below. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3454 range_start = charptr_emchar (p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3455 INC_CHARPTR (*p_ptr);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3456
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3457 /* If the start is after the end, the range is empty. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3458 if (range_start > range_end)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3459 return syntax & RE_NO_EMPTY_RANGES ? REG_ERANGE : REG_NOERROR;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3460
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3461 /* Can't have ranges spanning different charsets, except maybe for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3462 ranges entirely within the first 256 chars. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3463
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3464 if ((range_start >= 0x100 || range_end >= 0x100)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3465 && CHAR_LEADING_BYTE (range_start) !=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3466 CHAR_LEADING_BYTE (range_end))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3467 return REG_ERANGESPAN;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3468
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3469 /* As advertised, translations only work over the 0 - 0x7F range.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3470 Making this kind of stuff work generally is much harder.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3471 Iterating over the whole range like this would be way efficient
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3472 if the range encompasses 10,000 chars or something. You'd have
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3473 to do something like this:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3474
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3475 range_table a;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3476 range_table b;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3477 map over translation table in [range_start, range_end] of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3478 (put the mapped range in a;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3479 put the translation in b)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3480 invert the range in a and truncate to [range_start, range_end]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3481 compute the union of a, b
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3482 union the result into rtab
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3483 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3484 for (this_char = range_start;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3485 this_char <= range_end && this_char < 0x80; this_char++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3486 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3487 SET_RANGETAB_BIT (TRANSLATE (this_char));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3488 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3489
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3490 if (this_char <= range_end)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3491 put_range_table (rtab, this_char, range_end, Qt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3492
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3493 return REG_NOERROR;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3494 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3495
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3496 #endif /* MULE */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3497
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3498 /* re_compile_fastmap computes a ``fastmap'' for the compiled pattern in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3499 BUFP. A fastmap records which of the (1 << BYTEWIDTH) possible
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3500 characters can start a string that matches the pattern. This fastmap
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3501 is used by re_search to skip quickly over impossible starting points.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3502
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3503 The caller must supply the address of a (1 << BYTEWIDTH)-byte data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3504 area as BUFP->fastmap.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3505
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3506 We set the `fastmap', `fastmap_accurate', and `can_be_null' fields in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3507 the pattern buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3508
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3509 Returns 0 if we succeed, -2 if an internal error. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3510
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3511 int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3512 re_compile_fastmap (struct re_pattern_buffer *bufp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3513 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3514 int j, k;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3515 #ifdef MATCH_MAY_ALLOCATE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3516 fail_stack_type fail_stack;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3517 #endif
456
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 450
diff changeset
3518 DECLARE_DESTINATION;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3519 /* We don't push any register information onto the failure stack. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3520
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3521 REGISTER char *fastmap = bufp->fastmap;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3522 unsigned char *pattern = bufp->buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3523 unsigned long size = bufp->used;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3524 unsigned char *p = pattern;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3525 REGISTER unsigned char *pend = pattern + size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3526
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3527 #ifdef REL_ALLOC
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3528 /* This holds the pointer to the failure stack, when
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3529 it is allocated relocatably. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3530 fail_stack_elt_t *failure_stack_ptr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3531 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3532
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3533 /* Assume that each path through the pattern can be null until
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3534 proven otherwise. We set this false at the bottom of switch
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3535 statement, to which we get only if a particular path doesn't
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3536 match the empty string. */
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
3537 re_bool path_can_be_null = true;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3538
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3539 /* We aren't doing a `succeed_n' to begin with. */
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
3540 re_bool succeed_n_p = false;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3541
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3542 assert (fastmap != NULL && p != NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3543
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3544 INIT_FAIL_STACK ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3545 memset (fastmap, 0, 1 << BYTEWIDTH); /* Assume nothing's valid. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3546 bufp->fastmap_accurate = 1; /* It will be when we're done. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3547 bufp->can_be_null = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3548
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3549 while (1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3550 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3551 if (p == pend || *p == succeed)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3552 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3553 /* We have reached the (effective) end of pattern. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3554 if (!FAIL_STACK_EMPTY ())
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3555 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3556 bufp->can_be_null |= path_can_be_null;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3557
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3558 /* Reset for next path. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3559 path_can_be_null = true;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3560
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3561 p = (unsigned char *) fail_stack.stack[--fail_stack.avail].pointer;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3562
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3563 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3564 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3565 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3566 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3567 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3568
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3569 /* We should never be about to go beyond the end of the pattern. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3570 assert (p < pend);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3571
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3572 switch (SWITCH_ENUM_CAST ((re_opcode_t) *p++))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3573 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3574
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3575 /* I guess the idea here is to simply not bother with a fastmap
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3576 if a backreference is used, since it's too hard to figure out
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3577 the fastmap for the corresponding group. Setting
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3578 `can_be_null' stops `re_search_2' from using the fastmap, so
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3579 that is all we do. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3580 case duplicate:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3581 bufp->can_be_null = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3582 goto done;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3583
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3584
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3585 /* Following are the cases which match a character. These end
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3586 with `break'. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3587
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3588 case exactn:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3589 fastmap[p[1]] = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3590 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3591
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3592
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3593 case charset:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3594 /* XEmacs: Under Mule, these bit vectors will
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3595 only contain values for characters below 0x80. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3596 for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3597 if (p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3598 fastmap[j] = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3599 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3600
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3601
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3602 case charset_not:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3603 /* Chars beyond end of map must be allowed. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3604 #ifdef MULE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3605 for (j = *p * BYTEWIDTH; j < 0x80; j++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3606 fastmap[j] = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3607 /* And all extended characters must be allowed, too. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3608 for (j = 0x80; j < 0xA0; j++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3609 fastmap[j] = 1;
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3610 #else /* not MULE */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3611 for (j = *p * BYTEWIDTH; j < (1 << BYTEWIDTH); j++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3612 fastmap[j] = 1;
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3613 #endif /* MULE */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3614
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3615 for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3616 if (!(p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3617 fastmap[j] = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3618 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3619
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3620 #ifdef MULE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3621 case charset_mule:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3622 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3623 int nentries;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3624 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3625
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3626 nentries = unified_range_table_nentries (p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3627 for (i = 0; i < nentries; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3628 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3629 EMACS_INT first, last;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3630 Lisp_Object dummy_val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3631 int jj;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3632 Bufbyte strr[MAX_EMCHAR_LEN];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3633
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3634 unified_range_table_get_range (p, i, &first, &last,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3635 &dummy_val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3636 for (jj = first; jj <= last && jj < 0x80; jj++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3637 fastmap[jj] = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3638 /* Ranges below 0x100 can span charsets, but there
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3639 are only two (Control-1 and Latin-1), and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3640 either first or last has to be in them. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3641 set_charptr_emchar (strr, first);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3642 fastmap[*strr] = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3643 if (last < 0x100)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3644 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3645 set_charptr_emchar (strr, last);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3646 fastmap[*strr] = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3647 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3648 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3649 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3650 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3651
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3652 case charset_mule_not:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3653 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3654 int nentries;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3655 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3656
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3657 nentries = unified_range_table_nentries (p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3658 for (i = 0; i < nentries; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3659 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3660 EMACS_INT first, last;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3661 Lisp_Object dummy_val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3662 int jj;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3663 int smallest_prev = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3664
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3665 unified_range_table_get_range (p, i, &first, &last,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3666 &dummy_val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3667 for (jj = smallest_prev; jj < first && jj < 0x80; jj++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3668 fastmap[jj] = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3669 smallest_prev = last + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3670 if (smallest_prev >= 0x80)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3671 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3672 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3673 /* Calculating which leading bytes are actually allowed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3674 here is rather difficult, so we just punt and allow
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3675 all of them. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3676 for (i = 0x80; i < 0xA0; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3677 fastmap[i] = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3678 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3679 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3680 #endif /* MULE */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3681
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3682
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3683 case wordchar:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3684 #ifdef emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3685 k = (int) Sword;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3686 goto matchsyntax;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3687 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3688 for (j = 0; j < (1 << BYTEWIDTH); j++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3689 if (SYNTAX_UNSAFE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3690 (XCHAR_TABLE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3691 (regex_emacs_buffer->mirror_syntax_table), j) == Sword)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3692 fastmap[j] = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3693 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3694 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3695
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3696
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3697 case notwordchar:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3698 #ifdef emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3699 k = (int) Sword;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3700 goto matchnotsyntax;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3701 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3702 for (j = 0; j < (1 << BYTEWIDTH); j++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3703 if (SYNTAX_UNSAFE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3704 (XCHAR_TABLE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3705 (regex_emacs_buffer->mirror_syntax_table), j) != Sword)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3706 fastmap[j] = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3707 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3708 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3709
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3710
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3711 case anychar:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3712 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3713 int fastmap_newline = fastmap['\n'];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3714
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3715 /* `.' matches anything ... */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3716 #ifdef MULE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3717 /* "anything" only includes bytes that can be the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3718 first byte of a character. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3719 for (j = 0; j < 0xA0; j++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3720 fastmap[j] = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3721 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3722 for (j = 0; j < (1 << BYTEWIDTH); j++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3723 fastmap[j] = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3724 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3725
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3726 /* ... except perhaps newline. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3727 if (!(bufp->syntax & RE_DOT_NEWLINE))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3728 fastmap['\n'] = fastmap_newline;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3729
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3730 /* Return if we have already set `can_be_null'; if we have,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3731 then the fastmap is irrelevant. Something's wrong here. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3732 else if (bufp->can_be_null)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3733 goto done;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3734
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3735 /* Otherwise, have to check alternative paths. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3736 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3737 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3738
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3739 #ifdef emacs
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
3740 case wordbound:
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
3741 case notwordbound:
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
3742 case wordbeg:
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
3743 case wordend:
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
3744 case notsyntaxspec:
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
3745 case syntaxspec:
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
3746 /* This match depends on text properties. These end with
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
3747 aborting optimizations. */
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
3748 bufp->can_be_null = 1;
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
3749 goto done;
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
3750
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
3751 #ifdef emacs
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
3752 #if 0 /* Removed during syntax-table properties patch -- 2000/12/07 mct */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3753 case syntaxspec:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3754 k = *p++;
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
3755 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3756 matchsyntax:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3757 #ifdef MULE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3758 for (j = 0; j < 0x80; j++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3759 if (SYNTAX_UNSAFE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3760 (XCHAR_TABLE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3761 (regex_emacs_buffer->mirror_syntax_table), j) ==
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3762 (enum syntaxcode) k)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3763 fastmap[j] = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3764 for (j = 0x80; j < 0xA0; j++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3765 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3766 if (LEADING_BYTE_PREFIX_P(j))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3767 /* too complicated to calculate this right */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3768 fastmap[j] = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3769 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3770 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3771 int multi_p;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3772 Lisp_Object cset;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3773
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3774 cset = CHARSET_BY_LEADING_BYTE (j);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3775 if (CHARSETP (cset))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3776 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3777 if (charset_syntax (regex_emacs_buffer, cset,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3778 &multi_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3779 == Sword || multi_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3780 fastmap[j] = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3781 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3782 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3783 }
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3784 #else /* not MULE */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3785 for (j = 0; j < (1 << BYTEWIDTH); j++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3786 if (SYNTAX_UNSAFE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3787 (XCHAR_TABLE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3788 (regex_emacs_buffer->mirror_syntax_table), j) ==
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3789 (enum syntaxcode) k)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3790 fastmap[j] = 1;
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3791 #endif /* MULE */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3792 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3793
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3794
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
3795 #if 0 /* Removed during syntax-table properties patch -- 2000/12/07 mct */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3796 case notsyntaxspec:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3797 k = *p++;
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
3798 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3799 matchnotsyntax:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3800 #ifdef MULE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3801 for (j = 0; j < 0x80; j++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3802 if (SYNTAX_UNSAFE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3803 (XCHAR_TABLE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3804 (regex_emacs_buffer->mirror_syntax_table), j) !=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3805 (enum syntaxcode) k)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3806 fastmap[j] = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3807 for (j = 0x80; j < 0xA0; j++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3808 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3809 if (LEADING_BYTE_PREFIX_P(j))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3810 /* too complicated to calculate this right */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3811 fastmap[j] = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3812 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3813 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3814 int multi_p;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3815 Lisp_Object cset;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3816
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3817 cset = CHARSET_BY_LEADING_BYTE (j);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3818 if (CHARSETP (cset))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3819 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3820 if (charset_syntax (regex_emacs_buffer, cset,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3821 &multi_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3822 != Sword || multi_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3823 fastmap[j] = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3824 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3825 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3826 }
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3827 #else /* not MULE */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3828 for (j = 0; j < (1 << BYTEWIDTH); j++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3829 if (SYNTAX_UNSAFE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3830 (XCHAR_TABLE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3831 (regex_emacs_buffer->mirror_syntax_table), j) !=
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3832 (enum syntaxcode) k)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3833 fastmap[j] = 1;
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
3834 #endif /* MULE */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3835 break;
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
3836 #endif /* emacs */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3837
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3838 #ifdef MULE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3839 /* 97/2/17 jhod category patch */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3840 case categoryspec:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3841 case notcategoryspec:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3842 bufp->can_be_null = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3843 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3844 /* end if category patch */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3845 #endif /* MULE */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3846
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3847 /* All cases after this match the empty string. These end with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3848 `continue'. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3849
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3850
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3851 case before_dot:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3852 case at_dot:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3853 case after_dot:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3854 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3855 #endif /* not emacs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3856
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3857
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3858 case no_op:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3859 case begline:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3860 case endline:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3861 case begbuf:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3862 case endbuf:
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
3863 #ifndef emacs
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3864 case wordbound:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3865 case notwordbound:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3866 case wordbeg:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3867 case wordend:
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
3868 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3869 case push_dummy_failure:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3870 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3871
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3872
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3873 case jump_n:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3874 case pop_failure_jump:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3875 case maybe_pop_jump:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3876 case jump:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3877 case jump_past_alt:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3878 case dummy_failure_jump:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3879 EXTRACT_NUMBER_AND_INCR (j, p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3880 p += j;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3881 if (j > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3882 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3883
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3884 /* Jump backward implies we just went through the body of a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3885 loop and matched nothing. Opcode jumped to should be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3886 `on_failure_jump' or `succeed_n'. Just treat it like an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3887 ordinary jump. For a * loop, it has pushed its failure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3888 point already; if so, discard that as redundant. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3889 if ((re_opcode_t) *p != on_failure_jump
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3890 && (re_opcode_t) *p != succeed_n)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3891 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3892
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3893 p++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3894 EXTRACT_NUMBER_AND_INCR (j, p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3895 p += j;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3896
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3897 /* If what's on the stack is where we are now, pop it. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3898 if (!FAIL_STACK_EMPTY ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3899 && fail_stack.stack[fail_stack.avail - 1].pointer == p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3900 fail_stack.avail--;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3901
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3902 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3903
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3904
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3905 case on_failure_jump:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3906 case on_failure_keep_string_jump:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3907 handle_on_failure_jump:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3908 EXTRACT_NUMBER_AND_INCR (j, p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3909
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3910 /* For some patterns, e.g., `(a?)?', `p+j' here points to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3911 end of the pattern. We don't want to push such a point,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3912 since when we restore it above, entering the switch will
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3913 increment `p' past the end of the pattern. We don't need
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3914 to push such a point since we obviously won't find any more
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3915 fastmap entries beyond `pend'. Such a pattern can match
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3916 the null string, though. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3917 if (p + j < pend)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3918 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3919 if (!PUSH_PATTERN_OP (p + j, fail_stack))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3920 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3921 RESET_FAIL_STACK ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3922 return -2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3923 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3924 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3925 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3926 bufp->can_be_null = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3927
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3928 if (succeed_n_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3929 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3930 EXTRACT_NUMBER_AND_INCR (k, p); /* Skip the n. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3931 succeed_n_p = false;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3932 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3933
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3934 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3935
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3936
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3937 case succeed_n:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3938 /* Get to the number of times to succeed. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3939 p += 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3940
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3941 /* Increment p past the n for when k != 0. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3942 EXTRACT_NUMBER_AND_INCR (k, p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3943 if (k == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3944 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3945 p -= 4;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3946 succeed_n_p = true; /* Spaghetti code alert. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3947 goto handle_on_failure_jump;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3948 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3949 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3950
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3951
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3952 case set_number_at:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3953 p += 4;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3954 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3955
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3956
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3957 case start_memory:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3958 case stop_memory:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3959 p += 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3960 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3961
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3962
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3963 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3964 abort (); /* We have listed all the cases. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3965 } /* switch *p++ */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3966
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3967 /* Getting here means we have found the possible starting
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3968 characters for one path of the pattern -- and that the empty
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3969 string does not match. We need not follow this path further.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3970 Instead, look at the next alternative (remembered on the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3971 stack), or quit if no more. The test at the top of the loop
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3972 does these things. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3973 path_can_be_null = false;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3974 p = pend;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3975 } /* while p */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3976
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3977 /* Set `can_be_null' for the last path (also the first path, if the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3978 pattern is empty). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3979 bufp->can_be_null |= path_can_be_null;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3980
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3981 done:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3982 RESET_FAIL_STACK ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3983 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3984 } /* re_compile_fastmap */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3985
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3986 /* Set REGS to hold NUM_REGS registers, storing them in STARTS and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3987 ENDS. Subsequent matches using PATTERN_BUFFER and REGS will use
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3988 this memory for recording register information. STARTS and ENDS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3989 must be allocated using the malloc library routine, and must each
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3990 be at least NUM_REGS * sizeof (regoff_t) bytes long.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3991
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3992 If NUM_REGS == 0, then subsequent matches should allocate their own
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3993 register data.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3994
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3995 Unless this function is called, the first search or match using
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3996 PATTERN_BUFFER will allocate its own register data, without
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3997 freeing the old data. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3998
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3999 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4000 re_set_registers (struct re_pattern_buffer *bufp, struct re_registers *regs,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4001 unsigned num_regs, regoff_t *starts, regoff_t *ends)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4002 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4003 if (num_regs)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4004 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4005 bufp->regs_allocated = REGS_REALLOCATE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4006 regs->num_regs = num_regs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4007 regs->start = starts;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4008 regs->end = ends;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4009 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4010 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4011 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4012 bufp->regs_allocated = REGS_UNALLOCATED;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4013 regs->num_regs = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4014 regs->start = regs->end = (regoff_t *) 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4015 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4016 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4017
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4018 /* Searching routines. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4019
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4020 /* Like re_search_2, below, but only one string is specified, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4021 doesn't let you say where to stop matching. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4022
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4023 int
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4024 re_search (struct re_pattern_buffer *bufp, const char *string, int size,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4025 int startpos, int range, struct re_registers *regs)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4026 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4027 return re_search_2 (bufp, NULL, 0, string, size, startpos, range,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4028 regs, size);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4029 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4030
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4031 #ifndef emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4032 /* Snarfed from src/lisp.h, needed for compiling [ce]tags. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4033 # define bytecount_to_charcount(ptr, len) (len)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4034 # define charcount_to_bytecount(ptr, len) (len)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4035 typedef int Charcount;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4036 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4037
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4038 /* Using the compiled pattern in BUFP->buffer, first tries to match the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4039 virtual concatenation of STRING1 and STRING2, starting first at index
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4040 STARTPOS, then at STARTPOS + 1, and so on.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4041
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4042 With MULE, STARTPOS is a byte position, not a char position. And the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4043 search will increment STARTPOS by the width of the current leading
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4044 character.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4045
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4046 STRING1 and STRING2 have length SIZE1 and SIZE2, respectively.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4047
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4048 RANGE is how far to scan while trying to match. RANGE = 0 means try
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4049 only at STARTPOS; in general, the last start tried is STARTPOS +
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4050 RANGE.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4051
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4052 With MULE, RANGE is a byte position, not a char position. The last
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4053 start tried is the character starting <= STARTPOS + RANGE.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4054
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4055 In REGS, return the indices of the virtual concatenation of STRING1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4056 and STRING2 that matched the entire BUFP->buffer and its contained
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4057 subexpressions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4058
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4059 Do not consider matching one past the index STOP in the virtual
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4060 concatenation of STRING1 and STRING2.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4061
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4062 We return either the position in the strings at which the match was
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4063 found, -1 if no match, or -2 if error (such as failure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4064 stack overflow). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4065
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4066 int
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4067 re_search_2 (struct re_pattern_buffer *bufp, const char *str1,
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4068 int size1, const char *str2, int size2, int startpos,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4069 int range, struct re_registers *regs, int stop)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4070 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4071 int val;
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4072 re_char *string1 = (re_char *) str1;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4073 re_char *string2 = (re_char *) str2;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4074 REGISTER char *fastmap = bufp->fastmap;
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4075 REGISTER RE_TRANSLATE_TYPE translate = bufp->translate;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4076 int total_size = size1 + size2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4077 int endpos = startpos + range;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4078 #ifdef REGEX_BEGLINE_CHECK
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4079 int anchored_at_begline = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4080 #endif
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4081 re_char *d;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4082 Charcount d_size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4083
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4084 /* Check for out-of-range STARTPOS. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4085 if (startpos < 0 || startpos > total_size)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4086 return -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4087
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4088 /* Fix up RANGE if it might eventually take us outside
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4089 the virtual concatenation of STRING1 and STRING2. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4090 if (endpos < 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4091 range = 0 - startpos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4092 else if (endpos > total_size)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4093 range = total_size - startpos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4094
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4095 /* If the search isn't to be a backwards one, don't waste time in a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4096 search for a pattern that must be anchored. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4097 if (bufp->used > 0 && (re_opcode_t) bufp->buffer[0] == begbuf && range > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4098 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4099 if (startpos > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4100 return -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4101 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4102 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4103 d = ((const unsigned char *)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4104 (startpos >= size1 ? string2 - size1 : string1) + startpos);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4105 range = charcount_to_bytecount (d, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4106 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4107 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4108
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
4109 #ifdef emacs
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
4110 /* In a forward search for something that starts with \=.
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
4111 don't keep searching past point. */
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
4112 if (bufp->used > 0 && (re_opcode_t) bufp->buffer[0] == at_dot && range > 0)
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
4113 {
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
4114 range = BUF_PT (regex_emacs_buffer) - BUF_BEGV (regex_emacs_buffer)
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
4115 - startpos;
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
4116 if (range < 0)
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
4117 return -1;
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
4118 }
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
4119 #endif /* emacs */
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
4120
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4121 /* Update the fastmap now if not correct already. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4122 if (fastmap && !bufp->fastmap_accurate)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4123 if (re_compile_fastmap (bufp) == -2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4124 return -2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4125
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4126 #ifdef REGEX_BEGLINE_CHECK
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4127 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4128 int i = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4129
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4130 while (i < bufp->used)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4131 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4132 if (bufp->buffer[i] == start_memory ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4133 bufp->buffer[i] == stop_memory)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4134 i += 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4135 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4136 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4137 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4138 anchored_at_begline = i < bufp->used && bufp->buffer[i] == begline;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4139 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4140 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4141
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
4142 #ifdef emacs
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
4143 SETUP_SYNTAX_CACHE_FOR_OBJECT (regex_match_object,
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
4144 regex_emacs_buffer,
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
4145 SYNTAX_CACHE_OBJECT_BYTE_TO_CHAR (regex_match_object,
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
4146 regex_emacs_buffer,
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
4147 startpos),
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
4148 1);
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
4149 #endif
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
4150
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4151 /* Loop through the string, looking for a place to start matching. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4152 for (;;)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4153 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4154 #ifdef REGEX_BEGLINE_CHECK
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4155 /* If the regex is anchored at the beginning of a line (i.e. with a ^),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4156 then we can speed things up by skipping to the next beginning-of-
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4157 line. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4158 if (anchored_at_begline && startpos > 0 && startpos != size1 &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4159 range > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4160 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4161 /* whose stupid idea was it anyway to make this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4162 function take two strings to match?? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4163 int lim = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4164 int irange = range;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4165
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4166 if (startpos < size1 && startpos + range >= size1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4167 lim = range - (size1 - startpos);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4168
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4169 d = ((const unsigned char *)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4170 (startpos >= size1 ? string2 - size1 : string1) + startpos);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4171 DEC_CHARPTR(d); /* Ok, since startpos != size1. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4172 d_size = charcount_to_bytecount (d, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4173
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4174 if (TRANSLATE_P (translate))
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4175 while (range > lim && *d != '\n')
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4176 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4177 d += d_size; /* Speedier INC_CHARPTR(d) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4178 d_size = charcount_to_bytecount (d, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4179 range -= d_size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4180 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4181 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4182 while (range > lim && *d != '\n')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4183 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4184 d += d_size; /* Speedier INC_CHARPTR(d) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4185 d_size = charcount_to_bytecount (d, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4186 range -= d_size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4187 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4188
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4189 startpos += irange - range;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4190 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4191 #endif /* REGEX_BEGLINE_CHECK */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4192
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4193 /* If a fastmap is supplied, skip quickly over characters that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4194 cannot be the start of a match. If the pattern can match the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4195 null string, however, we don't need to skip characters; we want
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4196 the first null string. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4197 if (fastmap && startpos < total_size && !bufp->can_be_null)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4198 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4199 if (range > 0) /* Searching forwards. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4200 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4201 int lim = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4202 int irange = range;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4203
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4204 if (startpos < size1 && startpos + range >= size1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4205 lim = range - (size1 - startpos);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4206
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4207 d = ((const unsigned char *)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4208 (startpos >= size1 ? string2 - size1 : string1) + startpos);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4209
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4210 /* Written out as an if-else to avoid testing `translate'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4211 inside the loop. */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4212 if (TRANSLATE_P (translate))
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4213 while (range > lim)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4214 {
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4215 #ifdef MULE
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4216 Emchar buf_ch;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4217
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4218 buf_ch = charptr_emchar (d);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4219 buf_ch = RE_TRANSLATE (buf_ch);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4220 if (buf_ch >= 0200 || fastmap[(unsigned char) buf_ch])
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4221 break;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4222 #else
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4223 if (fastmap[(unsigned char)RE_TRANSLATE (*d)])
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4224 break;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4225 #endif /* MULE */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4226 d_size = charcount_to_bytecount (d, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4227 range -= d_size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4228 d += d_size; /* Speedier INC_CHARPTR(d) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4229 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4230 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4231 while (range > lim && !fastmap[*d])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4232 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4233 d_size = charcount_to_bytecount (d, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4234 range -= d_size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4235 d += d_size; /* Speedier INC_CHARPTR(d) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4236 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4237
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4238 startpos += irange - range;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4239 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4240 else /* Searching backwards. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4241 {
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4242 Emchar c = (size1 == 0 || startpos >= size1
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4243 ? charptr_emchar (string2 + startpos - size1)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4244 : charptr_emchar (string1 + startpos));
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4245 c = TRANSLATE (c);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4246 #ifdef MULE
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4247 if (!(c >= 0200 || fastmap[(unsigned char) c]))
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4248 goto advance;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4249 #else
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4250 if (!fastmap[(unsigned char) c])
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4251 goto advance;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4252 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4253 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4254 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4255
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4256 /* If can't match the null string, and that's all we have left, fail. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4257 if (range >= 0 && startpos == total_size && fastmap
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4258 && !bufp->can_be_null)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4259 return -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4260
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4261 #ifdef emacs /* XEmacs added, w/removal of immediate_quit */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4262 if (!no_quit_in_re_search)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4263 QUIT;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4264 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4265 val = re_match_2_internal (bufp, string1, size1, string2, size2,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4266 startpos, regs, stop);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4267 #ifndef REGEX_MALLOC
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4268 #ifdef C_ALLOCA
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4269 alloca (0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4270 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4271 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4272
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4273 if (val >= 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4274 return startpos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4275
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4276 if (val == -2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4277 return -2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4278
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4279 advance:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4280 if (!range)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4281 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4282 else if (range > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4283 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4284 d = ((const unsigned char *)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4285 (startpos >= size1 ? string2 - size1 : string1) + startpos);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4286 d_size = charcount_to_bytecount (d, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4287 range -= d_size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4288 startpos += d_size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4289 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4290 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4291 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4292 /* Note startpos > size1 not >=. If we are on the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4293 string1/string2 boundary, we want to backup into string1. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4294 d = ((const unsigned char *)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4295 (startpos > size1 ? string2 - size1 : string1) + startpos);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4296 DEC_CHARPTR(d);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4297 d_size = charcount_to_bytecount (d, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4298 range += d_size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4299 startpos -= d_size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4300 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4301 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4302 return -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4303 } /* re_search_2 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4304
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4305 /* Declarations and macros for re_match_2. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4306
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4307 /* This converts PTR, a pointer into one of the search strings `string1'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4308 and `string2' into an offset from the beginning of that string. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4309 #define POINTER_TO_OFFSET(ptr) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4310 (FIRST_STRING_P (ptr) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4311 ? ((regoff_t) ((ptr) - string1)) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4312 : ((regoff_t) ((ptr) - string2 + size1)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4313
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4314 /* Macros for dealing with the split strings in re_match_2. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4315
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4316 #define MATCHING_IN_FIRST_STRING (dend == end_match_1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4317
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4318 /* Call before fetching a character with *d. This switches over to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4319 string2 if necessary. */
450
98528da0b7fc Import from CVS: tag r21-2-40
cvs
parents: 446
diff changeset
4320 #define REGEX_PREFETCH() \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4321 while (d == dend) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4322 { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4323 /* End of string2 => fail. */ \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4324 if (dend == end_match_2) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4325 goto fail; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4326 /* End of string1 => advance to string2. */ \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4327 d = string2; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4328 dend = end_match_2; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4329 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4330
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4331
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4332 /* Test if at very beginning or at very end of the virtual concatenation
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4333 of `string1' and `string2'. If only one string, it's `string2'. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4334 #define AT_STRINGS_BEG(d) ((d) == (size1 ? string1 : string2) || !size2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4335 #define AT_STRINGS_END(d) ((d) == end2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4336
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4337 /* XEmacs change:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4338 If the given position straddles the string gap, return the equivalent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4339 position that is before or after the gap, respectively; otherwise,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4340 return the same position. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4341 #define POS_BEFORE_GAP_UNSAFE(d) ((d) == string2 ? end1 : (d))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4342 #define POS_AFTER_GAP_UNSAFE(d) ((d) == end1 ? string2 : (d))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4343
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4344 /* Test if CH is a word-constituent character. (XEmacs change) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4345 #define WORDCHAR_P_UNSAFE(ch) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4346 (SYNTAX_UNSAFE (XCHAR_TABLE (regex_emacs_buffer->mirror_syntax_table), \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4347 ch) == Sword)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4348
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4349 /* Free everything we malloc. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4350 #ifdef MATCH_MAY_ALLOCATE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4351 #define FREE_VAR(var) if (var) REGEX_FREE (var); var = NULL
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4352 #define FREE_VARIABLES() \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4353 do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4354 REGEX_FREE_STACK (fail_stack.stack); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4355 FREE_VAR (regstart); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4356 FREE_VAR (regend); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4357 FREE_VAR (old_regstart); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4358 FREE_VAR (old_regend); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4359 FREE_VAR (best_regstart); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4360 FREE_VAR (best_regend); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4361 FREE_VAR (reg_info); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4362 FREE_VAR (reg_dummy); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4363 FREE_VAR (reg_info_dummy); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4364 } while (0)
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4365 #else /* not MATCH_MAY_ALLOCATE */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4366 #define FREE_VARIABLES() ((void)0) /* Do nothing! But inhibit gcc warning. */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4367 #endif /* MATCH_MAY_ALLOCATE */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4368
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4369 /* These values must meet several constraints. They must not be valid
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4370 register values; since we have a limit of 255 registers (because
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4371 we use only one byte in the pattern for the register number), we can
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4372 use numbers larger than 255. They must differ by 1, because of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4373 NUM_FAILURE_ITEMS above. And the value for the lowest register must
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4374 be larger than the value for the highest register, so we do not try
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4375 to actually save any registers when none are active. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4376 #define NO_HIGHEST_ACTIVE_REG (1 << BYTEWIDTH)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4377 #define NO_LOWEST_ACTIVE_REG (NO_HIGHEST_ACTIVE_REG + 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4378
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4379 /* Matching routines. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4380
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4381 #ifndef emacs /* Emacs never uses this. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4382 /* re_match is like re_match_2 except it takes only a single string. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4383
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4384 int
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4385 re_match (struct re_pattern_buffer *bufp, const char *string, int size,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4386 int pos, struct re_registers *regs)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4387 {
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4388 int result = re_match_2_internal (bufp, NULL, 0, (re_char *) string, size,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4389 pos, regs, size);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4390 alloca (0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4391 return result;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4392 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4393 #endif /* not emacs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4394
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4395
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4396 /* re_match_2 matches the compiled pattern in BUFP against the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4397 (virtual) concatenation of STRING1 and STRING2 (of length SIZE1 and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4398 SIZE2, respectively). We start matching at POS, and stop matching
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4399 at STOP.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4400
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4401 If REGS is non-null and the `no_sub' field of BUFP is nonzero, we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4402 store offsets for the substring each group matched in REGS. See the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4403 documentation for exactly how many groups we fill.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4404
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4405 We return -1 if no match, -2 if an internal error (such as the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4406 failure stack overflowing). Otherwise, we return the length of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4407 matched substring. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4408
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4409 int
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4410 re_match_2 (struct re_pattern_buffer *bufp, const char *string1,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4411 int size1, const char *string2, int size2, int pos,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4412 struct re_registers *regs, int stop)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4413 {
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
4414 int result;
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
4415
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
4416 #ifdef emacs
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
4417 SETUP_SYNTAX_CACHE_FOR_OBJECT (regex_match_object,
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
4418 regex_emacs_buffer,
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
4419 SYNTAX_CACHE_OBJECT_BYTE_TO_CHAR (regex_match_object,
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
4420 regex_emacs_buffer,
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
4421 pos),
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
4422 1);
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
4423 #endif
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
4424
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
4425 result = re_match_2_internal (bufp, (re_char *) string1, size1,
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
4426 (re_char *) string2, size2,
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
4427 pos, regs, stop);
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
4428
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4429 alloca (0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4430 return result;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4431 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4432
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4433 /* This is a separate function so that we can force an alloca cleanup
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4434 afterwards. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4435 static int
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4436 re_match_2_internal (struct re_pattern_buffer *bufp, re_char *string1,
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4437 int size1, re_char *string2, int size2, int pos,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4438 struct re_registers *regs, int stop)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4439 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4440 /* General temporaries. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4441 int mcnt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4442 unsigned char *p1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4443 int should_succeed; /* XEmacs change */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4444
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4445 /* Just past the end of the corresponding string. */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4446 re_char *end1, *end2;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4447
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4448 /* Pointers into string1 and string2, just past the last characters in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4449 each to consider matching. */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4450 re_char *end_match_1, *end_match_2;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4451
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4452 /* Where we are in the data, and the end of the current string. */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4453 re_char *d, *dend;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4454
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4455 /* Where we are in the pattern, and the end of the pattern. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4456 unsigned char *p = bufp->buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4457 REGISTER unsigned char *pend = p + bufp->used;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4458
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4459 /* Mark the opcode just after a start_memory, so we can test for an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4460 empty subpattern when we get to the stop_memory. */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4461 re_char *just_past_start_mem = 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4462
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4463 /* We use this to map every character in the string. */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4464 RE_TRANSLATE_TYPE translate = bufp->translate;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4465
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4466 /* Failure point stack. Each place that can handle a failure further
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4467 down the line pushes a failure point on this stack. It consists of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4468 restart, regend, and reg_info for all registers corresponding to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4469 the subexpressions we're currently inside, plus the number of such
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4470 registers, and, finally, two char *'s. The first char * is where
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4471 to resume scanning the pattern; the second one is where to resume
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4472 scanning the strings. If the latter is zero, the failure point is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4473 a ``dummy''; if a failure happens and the failure point is a dummy,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4474 it gets discarded and the next one is tried. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4475 #ifdef MATCH_MAY_ALLOCATE /* otherwise, this is global. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4476 fail_stack_type fail_stack;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4477 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4478 #ifdef DEBUG
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4479 static unsigned failure_id;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4480 unsigned nfailure_points_pushed = 0, nfailure_points_popped = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4481 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4482
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4483 #ifdef REL_ALLOC
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4484 /* This holds the pointer to the failure stack, when
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4485 it is allocated relocatably. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4486 fail_stack_elt_t *failure_stack_ptr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4487 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4488
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4489 /* We fill all the registers internally, independent of what we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4490 return, for use in backreferences. The number here includes
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4491 an element for register zero. */
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
4492 unsigned num_regs = bufp->re_ngroups + 1;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4493
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4494 /* The currently active registers. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4495 unsigned lowest_active_reg = NO_LOWEST_ACTIVE_REG;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4496 unsigned highest_active_reg = NO_HIGHEST_ACTIVE_REG;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4497
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4498 /* Information on the contents of registers. These are pointers into
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4499 the input strings; they record just what was matched (on this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4500 attempt) by a subexpression part of the pattern, that is, the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4501 regnum-th regstart pointer points to where in the pattern we began
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4502 matching and the regnum-th regend points to right after where we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4503 stopped matching the regnum-th subexpression. (The zeroth register
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4504 keeps track of what the whole pattern matches.) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4505 #ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global. */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4506 re_char **regstart, **regend;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4507 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4508
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4509 /* If a group that's operated upon by a repetition operator fails to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4510 match anything, then the register for its start will need to be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4511 restored because it will have been set to wherever in the string we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4512 are when we last see its open-group operator. Similarly for a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4513 register's end. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4514 #ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global. */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4515 re_char **old_regstart, **old_regend;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4516 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4517
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4518 /* The is_active field of reg_info helps us keep track of which (possibly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4519 nested) subexpressions we are currently in. The matched_something
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4520 field of reg_info[reg_num] helps us tell whether or not we have
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4521 matched any of the pattern so far this time through the reg_num-th
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4522 subexpression. These two fields get reset each time through any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4523 loop their register is in. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4524 #ifdef MATCH_MAY_ALLOCATE /* otherwise, this is global. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4525 register_info_type *reg_info;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4526 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4527
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4528 /* The following record the register info as found in the above
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4529 variables when we find a match better than any we've seen before.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4530 This happens as we backtrack through the failure points, which in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4531 turn happens only if we have not yet matched the entire string. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4532 unsigned best_regs_set = false;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4533 #ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global. */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4534 re_char **best_regstart, **best_regend;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4535 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4536
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4537 /* Logically, this is `best_regend[0]'. But we don't want to have to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4538 allocate space for that if we're not allocating space for anything
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4539 else (see below). Also, we never need info about register 0 for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4540 any of the other register vectors, and it seems rather a kludge to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4541 treat `best_regend' differently than the rest. So we keep track of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4542 the end of the best match so far in a separate variable. We
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4543 initialize this to NULL so that when we backtrack the first time
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4544 and need to test it, it's not garbage. */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4545 re_char *match_end = NULL;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4546
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4547 /* This helps SET_REGS_MATCHED avoid doing redundant work. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4548 int set_regs_matched_done = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4549
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4550 /* Used when we pop values we don't care about. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4551 #ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global. */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4552 re_char **reg_dummy;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4553 register_info_type *reg_info_dummy;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4554 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4555
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4556 #ifdef DEBUG
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4557 /* Counts the total number of registers pushed. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4558 unsigned num_regs_pushed = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4559 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4560
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4561 /* 1 if this match ends in the same string (string1 or string2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4562 as the best previous match. */
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
4563 re_bool same_str_p;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4564
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4565 /* 1 if this match is the best seen so far. */
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
4566 re_bool best_match_p;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4567
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4568 DEBUG_PRINT1 ("\n\nEntering re_match_2.\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4569
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4570 INIT_FAIL_STACK ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4571
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4572 #ifdef MATCH_MAY_ALLOCATE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4573 /* Do not bother to initialize all the register variables if there are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4574 no groups in the pattern, as it takes a fair amount of time. If
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4575 there are groups, we include space for register 0 (the whole
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4576 pattern), even though we never use it, since it simplifies the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4577 array indexing. We should fix this. */
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
4578 if (bufp->re_ngroups)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4579 {
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4580 regstart = REGEX_TALLOC (num_regs, re_char *);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4581 regend = REGEX_TALLOC (num_regs, re_char *);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4582 old_regstart = REGEX_TALLOC (num_regs, re_char *);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4583 old_regend = REGEX_TALLOC (num_regs, re_char *);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4584 best_regstart = REGEX_TALLOC (num_regs, re_char *);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4585 best_regend = REGEX_TALLOC (num_regs, re_char *);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4586 reg_info = REGEX_TALLOC (num_regs, register_info_type);
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4587 reg_dummy = REGEX_TALLOC (num_regs, re_char *);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4588 reg_info_dummy = REGEX_TALLOC (num_regs, register_info_type);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4589
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4590 if (!(regstart && regend && old_regstart && old_regend && reg_info
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4591 && best_regstart && best_regend && reg_dummy && reg_info_dummy))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4592 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4593 FREE_VARIABLES ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4594 return -2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4595 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4596 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4597 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4598 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4599 /* We must initialize all our variables to NULL, so that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4600 `FREE_VARIABLES' doesn't try to free them. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4601 regstart = regend = old_regstart = old_regend = best_regstart
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4602 = best_regend = reg_dummy = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4603 reg_info = reg_info_dummy = (register_info_type *) NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4604 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4605 #endif /* MATCH_MAY_ALLOCATE */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4606
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4607 /* The starting position is bogus. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4608 if (pos < 0 || pos > size1 + size2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4609 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4610 FREE_VARIABLES ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4611 return -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4612 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4613
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4614 /* Initialize subexpression text positions to -1 to mark ones that no
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4615 start_memory/stop_memory has been seen for. Also initialize the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4616 register information struct. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4617 for (mcnt = 1; mcnt < num_regs; mcnt++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4618 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4619 regstart[mcnt] = regend[mcnt]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4620 = old_regstart[mcnt] = old_regend[mcnt] = REG_UNSET_VALUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4621
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4622 REG_MATCH_NULL_STRING_P (reg_info[mcnt]) = MATCH_NULL_UNSET_VALUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4623 IS_ACTIVE (reg_info[mcnt]) = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4624 MATCHED_SOMETHING (reg_info[mcnt]) = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4625 EVER_MATCHED_SOMETHING (reg_info[mcnt]) = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4626 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4627 /* We move `string1' into `string2' if the latter's empty -- but not if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4628 `string1' is null. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4629 if (size2 == 0 && string1 != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4630 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4631 string2 = string1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4632 size2 = size1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4633 string1 = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4634 size1 = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4635 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4636 end1 = string1 + size1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4637 end2 = string2 + size2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4638
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4639 /* Compute where to stop matching, within the two strings. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4640 if (stop <= size1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4641 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4642 end_match_1 = string1 + stop;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4643 end_match_2 = string2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4644 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4645 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4646 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4647 end_match_1 = end1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4648 end_match_2 = string2 + stop - size1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4649 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4650
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4651 /* `p' scans through the pattern as `d' scans through the data.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4652 `dend' is the end of the input string that `d' points within. `d'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4653 is advanced into the following input string whenever necessary, but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4654 this happens before fetching; therefore, at the beginning of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4655 loop, `d' can be pointing at the end of a string, but it cannot
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4656 equal `string2'. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4657 if (size1 > 0 && pos <= size1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4658 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4659 d = string1 + pos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4660 dend = end_match_1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4661 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4662 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4663 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4664 d = string2 + pos - size1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4665 dend = end_match_2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4666 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4667
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4668 DEBUG_PRINT1 ("The compiled pattern is: \n");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4669 DEBUG_PRINT_COMPILED_PATTERN (bufp, p, pend);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4670 DEBUG_PRINT1 ("The string to match is: `");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4671 DEBUG_PRINT_DOUBLE_STRING (d, string1, size1, string2, size2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4672 DEBUG_PRINT1 ("'\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4673
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4674 /* This loops over pattern commands. It exits by returning from the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4675 function if the match is complete, or it drops through if the match
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4676 fails at this starting point in the input data. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4677 for (;;)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4678 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4679 DEBUG_PRINT2 ("\n0x%lx: ", (long) p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4680 #ifdef emacs /* XEmacs added, w/removal of immediate_quit */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4681 if (!no_quit_in_re_search)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4682 QUIT;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4683 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4684
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4685 if (p == pend)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4686 { /* End of pattern means we might have succeeded. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4687 DEBUG_PRINT1 ("end of pattern ... ");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4688
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4689 /* If we haven't matched the entire string, and we want the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4690 longest match, try backtracking. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4691 if (d != end_match_2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4692 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4693 same_str_p = (FIRST_STRING_P (match_end)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4694 == MATCHING_IN_FIRST_STRING);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4695
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4696 /* AIX compiler got confused when this was combined
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4697 with the previous declaration. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4698 if (same_str_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4699 best_match_p = d > match_end;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4700 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4701 best_match_p = !MATCHING_IN_FIRST_STRING;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4702
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4703 DEBUG_PRINT1 ("backtracking.\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4704
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4705 if (!FAIL_STACK_EMPTY ())
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4706 { /* More failure points to try. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4707
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4708 /* If exceeds best match so far, save it. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4709 if (!best_regs_set || best_match_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4710 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4711 best_regs_set = true;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4712 match_end = d;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4713
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4714 DEBUG_PRINT1 ("\nSAVING match as best so far.\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4715
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4716 for (mcnt = 1; mcnt < num_regs; mcnt++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4717 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4718 best_regstart[mcnt] = regstart[mcnt];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4719 best_regend[mcnt] = regend[mcnt];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4720 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4721 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4722 goto fail;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4723 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4724
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4725 /* If no failure points, don't restore garbage. And if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4726 last match is real best match, don't restore second
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4727 best one. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4728 else if (best_regs_set && !best_match_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4729 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4730 restore_best_regs:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4731 /* Restore best match. It may happen that `dend ==
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4732 end_match_1' while the restored d is in string2.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4733 For example, the pattern `x.*y.*z' against the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4734 strings `x-' and `y-z-', if the two strings are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4735 not consecutive in memory. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4736 DEBUG_PRINT1 ("Restoring best registers.\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4737
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4738 d = match_end;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4739 dend = ((d >= string1 && d <= end1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4740 ? end_match_1 : end_match_2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4741
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4742 for (mcnt = 1; mcnt < num_regs; mcnt++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4743 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4744 regstart[mcnt] = best_regstart[mcnt];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4745 regend[mcnt] = best_regend[mcnt];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4746 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4747 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4748 } /* d != end_match_2 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4749
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4750 succeed_label:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4751 DEBUG_PRINT1 ("Accepting match.\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4752
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4753 /* If caller wants register contents data back, do it. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4754 if (regs && !bufp->no_sub)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4755 {
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
4756 int num_nonshy_regs = bufp->re_nsub + 1;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4757 /* Have the register data arrays been allocated? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4758 if (bufp->regs_allocated == REGS_UNALLOCATED)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4759 { /* No. So allocate them with malloc. We need one
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4760 extra element beyond `num_regs' for the `-1' marker
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4761 GNU code uses. */
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
4762 regs->num_regs = MAX (RE_NREGS, num_nonshy_regs + 1);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4763 regs->start = TALLOC (regs->num_regs, regoff_t);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4764 regs->end = TALLOC (regs->num_regs, regoff_t);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4765 if (regs->start == NULL || regs->end == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4766 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4767 FREE_VARIABLES ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4768 return -2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4769 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4770 bufp->regs_allocated = REGS_REALLOCATE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4771 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4772 else if (bufp->regs_allocated == REGS_REALLOCATE)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4773 { /* Yes. If we need more elements than were already
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4774 allocated, reallocate them. If we need fewer, just
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4775 leave it alone. */
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
4776 if (regs->num_regs < num_nonshy_regs + 1)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4777 {
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
4778 regs->num_regs = num_nonshy_regs + 1;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4779 RETALLOC (regs->start, regs->num_regs, regoff_t);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4780 RETALLOC (regs->end, regs->num_regs, regoff_t);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4781 if (regs->start == NULL || regs->end == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4782 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4783 FREE_VARIABLES ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4784 return -2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4785 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4786 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4787 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4788 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4789 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4790 /* These braces fend off a "empty body in an else-statement"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4791 warning under GCC when assert expands to nothing. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4792 assert (bufp->regs_allocated == REGS_FIXED);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4793 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4794
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4795 /* Convert the pointer data in `regstart' and `regend' to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4796 indices. Register zero has to be set differently,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4797 since we haven't kept track of any info for it. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4798 if (regs->num_regs > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4799 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4800 regs->start[0] = pos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4801 regs->end[0] = (MATCHING_IN_FIRST_STRING
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4802 ? ((regoff_t) (d - string1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4803 : ((regoff_t) (d - string2 + size1)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4804 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4805
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4806 /* Go through the first `min (num_regs, regs->num_regs)'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4807 registers, since that is all we initialized. */
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
4808 for (mcnt = 1; mcnt < MIN (num_nonshy_regs, regs->num_regs);
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
4809 mcnt++)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4810 {
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
4811 int internal_reg = bufp->external_to_internal_register[mcnt];
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
4812 if (REG_UNSET (regstart[internal_reg]) ||
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
4813 REG_UNSET (regend[internal_reg]))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4814 regs->start[mcnt] = regs->end[mcnt] = -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4815 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4816 {
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
4817 regs->start[mcnt] =
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
4818 (regoff_t) POINTER_TO_OFFSET (regstart[internal_reg]);
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
4819 regs->end[mcnt] =
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
4820 (regoff_t) POINTER_TO_OFFSET (regend[internal_reg]);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4821 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4822 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4823
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4824 /* If the regs structure we return has more elements than
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4825 were in the pattern, set the extra elements to -1. If
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4826 we (re)allocated the registers, this is the case,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4827 because we always allocate enough to have at least one
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4828 -1 at the end. */
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
4829 for (mcnt = num_nonshy_regs; mcnt < regs->num_regs; mcnt++)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4830 regs->start[mcnt] = regs->end[mcnt] = -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4831 } /* regs && !bufp->no_sub */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4832
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4833 DEBUG_PRINT4 ("%u failure points pushed, %u popped (%u remain).\n",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4834 nfailure_points_pushed, nfailure_points_popped,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4835 nfailure_points_pushed - nfailure_points_popped);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4836 DEBUG_PRINT2 ("%u registers pushed.\n", num_regs_pushed);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4837
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4838 mcnt = d - pos - (MATCHING_IN_FIRST_STRING
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4839 ? string1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4840 : string2 - size1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4841
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4842 DEBUG_PRINT2 ("Returning %d from re_match_2.\n", mcnt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4843
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4844 FREE_VARIABLES ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4845 return mcnt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4846 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4847
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4848 /* Otherwise match next pattern command. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4849 switch (SWITCH_ENUM_CAST ((re_opcode_t) *p++))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4850 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4851 /* Ignore these. Used to ignore the n of succeed_n's which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4852 currently have n == 0. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4853 case no_op:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4854 DEBUG_PRINT1 ("EXECUTING no_op.\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4855 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4856
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4857 case succeed:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4858 DEBUG_PRINT1 ("EXECUTING succeed.\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4859 goto succeed_label;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4860
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4861 /* Match the next n pattern characters exactly. The following
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4862 byte in the pattern defines n, and the n bytes after that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4863 are the characters to match. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4864 case exactn:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4865 mcnt = *p++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4866 DEBUG_PRINT2 ("EXECUTING exactn %d.\n", mcnt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4867
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4868 /* This is written out as an if-else so we don't waste time
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4869 testing `translate' inside the loop. */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4870 if (TRANSLATE_P (translate))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4871 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4872 do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4873 {
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4874 #ifdef MULE
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4875 Emchar pat_ch, buf_ch;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4876 Bytecount pat_len;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4877
450
98528da0b7fc Import from CVS: tag r21-2-40
cvs
parents: 446
diff changeset
4878 REGEX_PREFETCH ();
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4879 pat_ch = charptr_emchar (p);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4880 buf_ch = charptr_emchar (d);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4881 if (RE_TRANSLATE (buf_ch) != pat_ch)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4882 goto fail;
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4883
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4884 pat_len = charcount_to_bytecount (p, 1);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4885 p += pat_len;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4886 INC_CHARPTR (d);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4887
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4888 mcnt -= pat_len;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4889 #else /* not MULE */
450
98528da0b7fc Import from CVS: tag r21-2-40
cvs
parents: 446
diff changeset
4890 REGEX_PREFETCH ();
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4891 if ((unsigned char) RE_TRANSLATE (*d++) != *p++)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4892 goto fail;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4893 mcnt--;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4894 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4895 }
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4896 while (mcnt > 0);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4897 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4898 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4899 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4900 do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4901 {
450
98528da0b7fc Import from CVS: tag r21-2-40
cvs
parents: 446
diff changeset
4902 REGEX_PREFETCH ();
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
4903 if (*d++ != *p++) goto fail;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4904 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4905 while (--mcnt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4906 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4907 SET_REGS_MATCHED ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4908 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4909
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4910
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4911 /* Match any character except possibly a newline or a null. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4912 case anychar:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4913 DEBUG_PRINT1 ("EXECUTING anychar.\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4914
450
98528da0b7fc Import from CVS: tag r21-2-40
cvs
parents: 446
diff changeset
4915 REGEX_PREFETCH ();
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4916
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4917 if ((!(bufp->syntax & RE_DOT_NEWLINE) && TRANSLATE (*d) == '\n')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4918 || (bufp->syntax & RE_DOT_NOT_NULL && TRANSLATE (*d) == '\000'))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4919 goto fail;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4920
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4921 SET_REGS_MATCHED ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4922 DEBUG_PRINT2 (" Matched `%d'.\n", *d);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4923 INC_CHARPTR (d); /* XEmacs change */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4924 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4925
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4926
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4927 case charset:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4928 case charset_not:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4929 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4930 REGISTER unsigned char c;
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
4931 re_bool not_p = (re_opcode_t) *(p - 1) == charset_not;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 456
diff changeset
4932
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 456
diff changeset
4933 DEBUG_PRINT2 ("EXECUTING charset%s.\n", not_p ? "_not" : "");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4934
450
98528da0b7fc Import from CVS: tag r21-2-40
cvs
parents: 446
diff changeset
4935 REGEX_PREFETCH ();
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4936 c = TRANSLATE (*d); /* The character to match. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4937
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4938 /* Cast to `unsigned' instead of `unsigned char' in case the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4939 bit list is a full 32 bytes long. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4940 if (c < (unsigned) (*p * BYTEWIDTH)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4941 && p[1 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH)))
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 456
diff changeset
4942 not_p = !not_p;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4943
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4944 p += 1 + *p;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4945
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 456
diff changeset
4946 if (!not_p) goto fail;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4947
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4948 SET_REGS_MATCHED ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4949 INC_CHARPTR (d); /* XEmacs change */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4950 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4951 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4952
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4953 #ifdef MULE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4954 case charset_mule:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4955 case charset_mule_not:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4956 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4957 REGISTER Emchar c;
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
4958 re_bool not_p = (re_opcode_t) *(p - 1) == charset_mule_not;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 456
diff changeset
4959
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 456
diff changeset
4960 DEBUG_PRINT2 ("EXECUTING charset_mule%s.\n", not_p ? "_not" : "");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4961
450
98528da0b7fc Import from CVS: tag r21-2-40
cvs
parents: 446
diff changeset
4962 REGEX_PREFETCH ();
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4963 c = charptr_emchar ((const Bufbyte *) d);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4964 c = TRANSLATE_EXTENDED_UNSAFE (c); /* The character to match. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4965
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4966 if (EQ (Qt, unified_range_table_lookup (p, c, Qnil)))
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 456
diff changeset
4967 not_p = !not_p;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4968
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4969 p += unified_range_table_bytes_used (p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4970
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 456
diff changeset
4971 if (!not_p) goto fail;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4972
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4973 SET_REGS_MATCHED ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4974 INC_CHARPTR (d);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4975 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4976 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4977 #endif /* MULE */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4978
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4979
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4980 /* The beginning of a group is represented by start_memory.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4981 The arguments are the register number in the next byte, and the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4982 number of groups inner to this one in the next. The text
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4983 matched within the group is recorded (in the internal
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4984 registers data structure) under the register number. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4985 case start_memory:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4986 DEBUG_PRINT3 ("EXECUTING start_memory %d (%d):\n", *p, p[1]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4987
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4988 /* Find out if this group can match the empty string. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4989 p1 = p; /* To send to group_match_null_string_p. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4990
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4991 if (REG_MATCH_NULL_STRING_P (reg_info[*p]) == MATCH_NULL_UNSET_VALUE)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4992 REG_MATCH_NULL_STRING_P (reg_info[*p])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4993 = group_match_null_string_p (&p1, pend, reg_info);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4994
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4995 /* Save the position in the string where we were the last time
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4996 we were at this open-group operator in case the group is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4997 operated upon by a repetition operator, e.g., with `(a*)*b'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4998 against `ab'; then we want to ignore where we are now in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4999 the string in case this attempt to match fails. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5000 old_regstart[*p] = REG_MATCH_NULL_STRING_P (reg_info[*p])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5001 ? REG_UNSET (regstart[*p]) ? d : regstart[*p]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5002 : regstart[*p];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5003 DEBUG_PRINT2 (" old_regstart: %d\n",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5004 POINTER_TO_OFFSET (old_regstart[*p]));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5005
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5006 regstart[*p] = d;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5007 DEBUG_PRINT2 (" regstart: %d\n", POINTER_TO_OFFSET (regstart[*p]));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5008
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5009 IS_ACTIVE (reg_info[*p]) = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5010 MATCHED_SOMETHING (reg_info[*p]) = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5011
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5012 /* Clear this whenever we change the register activity status. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5013 set_regs_matched_done = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5014
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5015 /* This is the new highest active register. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5016 highest_active_reg = *p;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5017
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5018 /* If nothing was active before, this is the new lowest active
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5019 register. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5020 if (lowest_active_reg == NO_LOWEST_ACTIVE_REG)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5021 lowest_active_reg = *p;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5022
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5023 /* Move past the register number and inner group count. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5024 p += 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5025 just_past_start_mem = p;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5026
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5027 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5028
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5029
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5030 /* The stop_memory opcode represents the end of a group. Its
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5031 arguments are the same as start_memory's: the register
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5032 number, and the number of inner groups. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5033 case stop_memory:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5034 DEBUG_PRINT3 ("EXECUTING stop_memory %d (%d):\n", *p, p[1]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5035
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5036 /* We need to save the string position the last time we were at
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5037 this close-group operator in case the group is operated
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5038 upon by a repetition operator, e.g., with `((a*)*(b*)*)*'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5039 against `aba'; then we want to ignore where we are now in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5040 the string in case this attempt to match fails. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5041 old_regend[*p] = REG_MATCH_NULL_STRING_P (reg_info[*p])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5042 ? REG_UNSET (regend[*p]) ? d : regend[*p]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5043 : regend[*p];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5044 DEBUG_PRINT2 (" old_regend: %d\n",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5045 POINTER_TO_OFFSET (old_regend[*p]));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5046
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5047 regend[*p] = d;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5048 DEBUG_PRINT2 (" regend: %d\n", POINTER_TO_OFFSET (regend[*p]));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5049
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5050 /* This register isn't active anymore. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5051 IS_ACTIVE (reg_info[*p]) = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5052
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5053 /* Clear this whenever we change the register activity status. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5054 set_regs_matched_done = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5055
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5056 /* If this was the only register active, nothing is active
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5057 anymore. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5058 if (lowest_active_reg == highest_active_reg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5059 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5060 lowest_active_reg = NO_LOWEST_ACTIVE_REG;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5061 highest_active_reg = NO_HIGHEST_ACTIVE_REG;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5062 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5063 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5064 { /* We must scan for the new highest active register, since
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5065 it isn't necessarily one less than now: consider
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5066 (a(b)c(d(e)f)g). When group 3 ends, after the f), the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5067 new highest active register is 1. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5068 unsigned char r = *p - 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5069 while (r > 0 && !IS_ACTIVE (reg_info[r]))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5070 r--;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5071
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5072 /* If we end up at register zero, that means that we saved
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5073 the registers as the result of an `on_failure_jump', not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5074 a `start_memory', and we jumped to past the innermost
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5075 `stop_memory'. For example, in ((.)*) we save
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5076 registers 1 and 2 as a result of the *, but when we pop
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5077 back to the second ), we are at the stop_memory 1.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5078 Thus, nothing is active. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5079 if (r == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5080 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5081 lowest_active_reg = NO_LOWEST_ACTIVE_REG;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5082 highest_active_reg = NO_HIGHEST_ACTIVE_REG;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5083 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5084 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5085 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5086 highest_active_reg = r;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5087
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5088 /* 98/9/21 jhod: We've also gotta set lowest_active_reg, don't we? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5089 r = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5090 while (r < highest_active_reg && !IS_ACTIVE(reg_info[r]))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5091 r++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5092 lowest_active_reg = r;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5093 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5094 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5095
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5096 /* If just failed to match something this time around with a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5097 group that's operated on by a repetition operator, try to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5098 force exit from the ``loop'', and restore the register
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5099 information for this group that we had before trying this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5100 last match. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5101 if ((!MATCHED_SOMETHING (reg_info[*p])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5102 || just_past_start_mem == p - 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5103 && (p + 2) < pend)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5104 {
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5105 re_bool is_a_jump_n = false;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5106
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5107 p1 = p + 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5108 mcnt = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5109 switch ((re_opcode_t) *p1++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5110 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5111 case jump_n:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5112 is_a_jump_n = true;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5113 case pop_failure_jump:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5114 case maybe_pop_jump:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5115 case jump:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5116 case dummy_failure_jump:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5117 EXTRACT_NUMBER_AND_INCR (mcnt, p1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5118 if (is_a_jump_n)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5119 p1 += 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5120 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5121
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5122 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5123 /* do nothing */ ;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5124 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5125 p1 += mcnt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5126
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5127 /* If the next operation is a jump backwards in the pattern
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5128 to an on_failure_jump right before the start_memory
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5129 corresponding to this stop_memory, exit from the loop
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5130 by forcing a failure after pushing on the stack the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5131 on_failure_jump's jump in the pattern, and d. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5132 if (mcnt < 0 && (re_opcode_t) *p1 == on_failure_jump
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5133 && (re_opcode_t) p1[3] == start_memory && p1[4] == *p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5134 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5135 /* If this group ever matched anything, then restore
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5136 what its registers were before trying this last
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5137 failed match, e.g., with `(a*)*b' against `ab' for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5138 regstart[1], and, e.g., with `((a*)*(b*)*)*'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5139 against `aba' for regend[3].
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5140
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5141 Also restore the registers for inner groups for,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5142 e.g., `((a*)(b*))*' against `aba' (register 3 would
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5143 otherwise get trashed). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5144
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5145 if (EVER_MATCHED_SOMETHING (reg_info[*p]))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5146 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5147 unsigned r;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5148
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5149 EVER_MATCHED_SOMETHING (reg_info[*p]) = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5150
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5151 /* Restore this and inner groups' (if any) registers. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5152 for (r = *p; r < *p + *(p + 1); r++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5153 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5154 regstart[r] = old_regstart[r];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5155
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5156 /* xx why this test? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5157 if (old_regend[r] >= regstart[r])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5158 regend[r] = old_regend[r];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5159 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5160 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5161 p1++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5162 EXTRACT_NUMBER_AND_INCR (mcnt, p1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5163 PUSH_FAILURE_POINT (p1 + mcnt, d, -2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5164
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5165 goto fail;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5166 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5167 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5168
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5169 /* Move past the register number and the inner group count. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5170 p += 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5171 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5172
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5173
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5174 /* \<digit> has been turned into a `duplicate' command which is
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
5175 followed by the numeric value of <digit> as the register number.
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
5176 (Already passed through external-to-internal-register mapping,
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
5177 so it refers to the actual group number, not the non-shy-only
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
5178 numbering used in the external world.) */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5179 case duplicate:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5180 {
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
5181 REGISTER re_char *d2, *dend2;
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
5182 /* Get which register to match against. */
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
5183 int regno = *p++;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5184 DEBUG_PRINT2 ("EXECUTING duplicate %d.\n", regno);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5185
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5186 /* Can't back reference a group which we've never matched. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5187 if (REG_UNSET (regstart[regno]) || REG_UNSET (regend[regno]))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5188 goto fail;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5189
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5190 /* Where in input to try to start matching. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5191 d2 = regstart[regno];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5192
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5193 /* Where to stop matching; if both the place to start and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5194 the place to stop matching are in the same string, then
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5195 set to the place to stop, otherwise, for now have to use
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5196 the end of the first string. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5197
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5198 dend2 = ((FIRST_STRING_P (regstart[regno])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5199 == FIRST_STRING_P (regend[regno]))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5200 ? regend[regno] : end_match_1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5201 for (;;)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5202 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5203 /* If necessary, advance to next segment in register
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5204 contents. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5205 while (d2 == dend2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5206 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5207 if (dend2 == end_match_2) break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5208 if (dend2 == regend[regno]) break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5209
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5210 /* End of string1 => advance to string2. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5211 d2 = string2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5212 dend2 = regend[regno];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5213 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5214 /* At end of register contents => success */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5215 if (d2 == dend2) break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5216
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5217 /* If necessary, advance to next segment in data. */
450
98528da0b7fc Import from CVS: tag r21-2-40
cvs
parents: 446
diff changeset
5218 REGEX_PREFETCH ();
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5219
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5220 /* How many characters left in this segment to match. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5221 mcnt = dend - d;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5222
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5223 /* Want how many consecutive characters we can match in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5224 one shot, so, if necessary, adjust the count. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5225 if (mcnt > dend2 - d2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5226 mcnt = dend2 - d2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5227
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5228 /* Compare that many; failure if mismatch, else move
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5229 past them. */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
5230 if (TRANSLATE_P (translate)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5231 ? bcmp_translate ((unsigned char *) d,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5232 (unsigned char *) d2, mcnt, translate)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5233 : memcmp (d, d2, mcnt))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5234 goto fail;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5235 d += mcnt, d2 += mcnt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5236
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5237 /* Do this because we've match some characters. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5238 SET_REGS_MATCHED ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5239 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5240 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5241 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5242
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5243
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5244 /* begline matches the empty string at the beginning of the string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5245 (unless `not_bol' is set in `bufp'), and, if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5246 `newline_anchor' is set, after newlines. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5247 case begline:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5248 DEBUG_PRINT1 ("EXECUTING begline.\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5249
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5250 if (AT_STRINGS_BEG (d))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5251 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5252 if (!bufp->not_bol) break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5253 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5254 else if (d[-1] == '\n' && bufp->newline_anchor)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5255 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5256 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5257 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5258 /* In all other cases, we fail. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5259 goto fail;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5260
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5261
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5262 /* endline is the dual of begline. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5263 case endline:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5264 DEBUG_PRINT1 ("EXECUTING endline.\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5265
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5266 if (AT_STRINGS_END (d))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5267 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5268 if (!bufp->not_eol) break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5269 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5270
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5271 /* We have to ``prefetch'' the next character. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5272 else if ((d == end1 ? *string2 : *d) == '\n'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5273 && bufp->newline_anchor)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5274 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5275 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5276 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5277 goto fail;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5278
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5279
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5280 /* Match at the very beginning of the data. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5281 case begbuf:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5282 DEBUG_PRINT1 ("EXECUTING begbuf.\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5283 if (AT_STRINGS_BEG (d))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5284 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5285 goto fail;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5286
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5287
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5288 /* Match at the very end of the data. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5289 case endbuf:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5290 DEBUG_PRINT1 ("EXECUTING endbuf.\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5291 if (AT_STRINGS_END (d))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5292 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5293 goto fail;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5294
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5295
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5296 /* on_failure_keep_string_jump is used to optimize `.*\n'. It
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5297 pushes NULL as the value for the string on the stack. Then
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5298 `pop_failure_point' will keep the current value for the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5299 string, instead of restoring it. To see why, consider
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5300 matching `foo\nbar' against `.*\n'. The .* matches the foo;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5301 then the . fails against the \n. But the next thing we want
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5302 to do is match the \n against the \n; if we restored the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5303 string value, we would be back at the foo.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5304
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5305 Because this is used only in specific cases, we don't need to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5306 check all the things that `on_failure_jump' does, to make
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5307 sure the right things get saved on the stack. Hence we don't
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5308 share its code. The only reason to push anything on the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5309 stack at all is that otherwise we would have to change
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5310 `anychar's code to do something besides goto fail in this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5311 case; that seems worse than this. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5312 case on_failure_keep_string_jump:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5313 DEBUG_PRINT1 ("EXECUTING on_failure_keep_string_jump");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5314
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5315 EXTRACT_NUMBER_AND_INCR (mcnt, p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5316 DEBUG_PRINT3 (" %d (to 0x%lx):\n", mcnt, (long) (p + mcnt));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5317
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
5318 PUSH_FAILURE_POINT (p + mcnt, (unsigned char *) 0, -2);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5319 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5320
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5321
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5322 /* Uses of on_failure_jump:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5323
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5324 Each alternative starts with an on_failure_jump that points
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5325 to the beginning of the next alternative. Each alternative
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5326 except the last ends with a jump that in effect jumps past
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5327 the rest of the alternatives. (They really jump to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5328 ending jump of the following alternative, because tensioning
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5329 these jumps is a hassle.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5330
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5331 Repeats start with an on_failure_jump that points past both
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5332 the repetition text and either the following jump or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5333 pop_failure_jump back to this on_failure_jump. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5334 case on_failure_jump:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5335 on_failure:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5336 DEBUG_PRINT1 ("EXECUTING on_failure_jump");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5337
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5338 EXTRACT_NUMBER_AND_INCR (mcnt, p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5339 DEBUG_PRINT3 (" %d (to 0x%lx)", mcnt, (long) (p + mcnt));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5340
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5341 /* If this on_failure_jump comes right before a group (i.e.,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5342 the original * applied to a group), save the information
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5343 for that group and all inner ones, so that if we fail back
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5344 to this point, the group's information will be correct.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5345 For example, in \(a*\)*\1, we need the preceding group,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5346 and in \(\(a*\)b*\)\2, we need the inner group. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5347
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5348 /* We can't use `p' to check ahead because we push
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5349 a failure point to `p + mcnt' after we do this. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5350 p1 = p;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5351
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5352 /* We need to skip no_op's before we look for the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5353 start_memory in case this on_failure_jump is happening as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5354 the result of a completed succeed_n, as in \(a\)\{1,3\}b\1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5355 against aba. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5356 while (p1 < pend && (re_opcode_t) *p1 == no_op)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5357 p1++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5358
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5359 if (p1 < pend && (re_opcode_t) *p1 == start_memory)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5360 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5361 /* We have a new highest active register now. This will
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5362 get reset at the start_memory we are about to get to,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5363 but we will have saved all the registers relevant to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5364 this repetition op, as described above. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5365 highest_active_reg = *(p1 + 1) + *(p1 + 2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5366 if (lowest_active_reg == NO_LOWEST_ACTIVE_REG)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5367 lowest_active_reg = *(p1 + 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5368 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5369
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5370 DEBUG_PRINT1 (":\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5371 PUSH_FAILURE_POINT (p + mcnt, d, -2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5372 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5373
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5374
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5375 /* A smart repeat ends with `maybe_pop_jump'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5376 We change it to either `pop_failure_jump' or `jump'. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5377 case maybe_pop_jump:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5378 EXTRACT_NUMBER_AND_INCR (mcnt, p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5379 DEBUG_PRINT2 ("EXECUTING maybe_pop_jump %d.\n", mcnt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5380 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5381 REGISTER unsigned char *p2 = p;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5382
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5383 /* Compare the beginning of the repeat with what in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5384 pattern follows its end. If we can establish that there
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5385 is nothing that they would both match, i.e., that we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5386 would have to backtrack because of (as in, e.g., `a*a')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5387 then we can change to pop_failure_jump, because we'll
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5388 never have to backtrack.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5389
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5390 This is not true in the case of alternatives: in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5391 `(a|ab)*' we do need to backtrack to the `ab' alternative
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5392 (e.g., if the string was `ab'). But instead of trying to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5393 detect that here, the alternative has put on a dummy
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5394 failure point which is what we will end up popping. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5395
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5396 /* Skip over open/close-group commands.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5397 If what follows this loop is a ...+ construct,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5398 look at what begins its body, since we will have to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5399 match at least one of that. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5400 while (1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5401 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5402 if (p2 + 2 < pend
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5403 && ((re_opcode_t) *p2 == stop_memory
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5404 || (re_opcode_t) *p2 == start_memory))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5405 p2 += 3;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5406 else if (p2 + 6 < pend
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5407 && (re_opcode_t) *p2 == dummy_failure_jump)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5408 p2 += 6;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5409 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5410 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5411 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5412
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5413 p1 = p + mcnt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5414 /* p1[0] ... p1[2] are the `on_failure_jump' corresponding
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5415 to the `maybe_finalize_jump' of this case. Examine what
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5416 follows. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5417
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5418 /* If we're at the end of the pattern, we can change. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5419 if (p2 == pend)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5420 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5421 /* Consider what happens when matching ":\(.*\)"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5422 against ":/". I don't really understand this code
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5423 yet. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5424 p[-3] = (unsigned char) pop_failure_jump;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5425 DEBUG_PRINT1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5426 (" End of pattern: change to `pop_failure_jump'.\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5427 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5429 else if ((re_opcode_t) *p2 == exactn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5430 || (bufp->newline_anchor && (re_opcode_t) *p2 == endline))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5431 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5432 REGISTER unsigned char c
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5433 = *p2 == (unsigned char) endline ? '\n' : p2[2];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5434
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5435 if ((re_opcode_t) p1[3] == exactn && p1[5] != c)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5436 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5437 p[-3] = (unsigned char) pop_failure_jump;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5438 DEBUG_PRINT3 (" %c != %c => pop_failure_jump.\n",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5439 c, p1[5]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5440 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5441
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5442 else if ((re_opcode_t) p1[3] == charset
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5443 || (re_opcode_t) p1[3] == charset_not)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5444 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 456
diff changeset
5445 int not_p = (re_opcode_t) p1[3] == charset_not;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5446
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5447 if (c < (unsigned char) (p1[4] * BYTEWIDTH)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5448 && p1[5 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH)))
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 456
diff changeset
5449 not_p = !not_p;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 456
diff changeset
5450
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 456
diff changeset
5451 /* `not_p' is equal to 1 if c would match, which means
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5452 that we can't change to pop_failure_jump. */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 456
diff changeset
5453 if (!not_p)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5454 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5455 p[-3] = (unsigned char) pop_failure_jump;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5456 DEBUG_PRINT1 (" No match => pop_failure_jump.\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5457 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5458 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5459 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5460 else if ((re_opcode_t) *p2 == charset)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5461 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5462 #ifdef DEBUG
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5463 REGISTER unsigned char c
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5464 = *p2 == (unsigned char) endline ? '\n' : p2[2];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5465 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5466
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5467 if ((re_opcode_t) p1[3] == exactn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5468 && ! ((int) p2[1] * BYTEWIDTH > (int) p1[5]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5469 && (p2[2 + p1[5] / BYTEWIDTH]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5470 & (1 << (p1[5] % BYTEWIDTH)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5471 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5472 p[-3] = (unsigned char) pop_failure_jump;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5473 DEBUG_PRINT3 (" %c != %c => pop_failure_jump.\n",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5474 c, p1[5]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5475 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5476
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5477 else if ((re_opcode_t) p1[3] == charset_not)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5478 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5479 int idx;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5480 /* We win if the charset_not inside the loop
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5481 lists every character listed in the charset after. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5482 for (idx = 0; idx < (int) p2[1]; idx++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5483 if (! (p2[2 + idx] == 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5484 || (idx < (int) p1[4]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5485 && ((p2[2 + idx] & ~ p1[5 + idx]) == 0))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5486 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5487
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5488 if (idx == p2[1])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5489 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5490 p[-3] = (unsigned char) pop_failure_jump;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5491 DEBUG_PRINT1 (" No match => pop_failure_jump.\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5492 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5493 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5494 else if ((re_opcode_t) p1[3] == charset)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5495 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5496 int idx;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5497 /* We win if the charset inside the loop
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5498 has no overlap with the one after the loop. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5499 for (idx = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5500 idx < (int) p2[1] && idx < (int) p1[4];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5501 idx++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5502 if ((p2[2 + idx] & p1[5 + idx]) != 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5503 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5504
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5505 if (idx == p2[1] || idx == p1[4])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5506 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5507 p[-3] = (unsigned char) pop_failure_jump;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5508 DEBUG_PRINT1 (" No match => pop_failure_jump.\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5509 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5510 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5511 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5512 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5513 p -= 2; /* Point at relative address again. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5514 if ((re_opcode_t) p[-1] != pop_failure_jump)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5515 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5516 p[-1] = (unsigned char) jump;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5517 DEBUG_PRINT1 (" Match => jump.\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5518 goto unconditional_jump;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5519 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5520 /* Note fall through. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5521
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5522
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5523 /* The end of a simple repeat has a pop_failure_jump back to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5524 its matching on_failure_jump, where the latter will push a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5525 failure point. The pop_failure_jump takes off failure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5526 points put on by this pop_failure_jump's matching
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5527 on_failure_jump; we got through the pattern to here from the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5528 matching on_failure_jump, so didn't fail. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5529 case pop_failure_jump:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5530 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5531 /* We need to pass separate storage for the lowest and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5532 highest registers, even though we don't care about the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5533 actual values. Otherwise, we will restore only one
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5534 register from the stack, since lowest will == highest in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5535 `pop_failure_point'. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5536 unsigned dummy_low_reg, dummy_high_reg;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5537 unsigned char *pdummy;
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
5538 re_char *sdummy = NULL;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5539
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5540 DEBUG_PRINT1 ("EXECUTING pop_failure_jump.\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5541 POP_FAILURE_POINT (sdummy, pdummy,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5542 dummy_low_reg, dummy_high_reg,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5543 reg_dummy, reg_dummy, reg_info_dummy);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5544 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5545 /* Note fall through. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5546
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5547
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5548 /* Unconditionally jump (without popping any failure points). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5549 case jump:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5550 unconditional_jump:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5551 EXTRACT_NUMBER_AND_INCR (mcnt, p); /* Get the amount to jump. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5552 DEBUG_PRINT2 ("EXECUTING jump %d ", mcnt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5553 p += mcnt; /* Do the jump. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5554 DEBUG_PRINT2 ("(to 0x%lx).\n", (long) p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5555 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5556
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5557
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5558 /* We need this opcode so we can detect where alternatives end
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5559 in `group_match_null_string_p' et al. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5560 case jump_past_alt:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5561 DEBUG_PRINT1 ("EXECUTING jump_past_alt.\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5562 goto unconditional_jump;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5563
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5564
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5565 /* Normally, the on_failure_jump pushes a failure point, which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5566 then gets popped at pop_failure_jump. We will end up at
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5567 pop_failure_jump, also, and with a pattern of, say, `a+', we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5568 are skipping over the on_failure_jump, so we have to push
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5569 something meaningless for pop_failure_jump to pop. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5570 case dummy_failure_jump:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5571 DEBUG_PRINT1 ("EXECUTING dummy_failure_jump.\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5572 /* It doesn't matter what we push for the string here. What
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5573 the code at `fail' tests is the value for the pattern. */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
5574 PUSH_FAILURE_POINT ((unsigned char *) 0, (unsigned char *) 0, -2);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5575 goto unconditional_jump;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5576
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5577
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5578 /* At the end of an alternative, we need to push a dummy failure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5579 point in case we are followed by a `pop_failure_jump', because
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5580 we don't want the failure point for the alternative to be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5581 popped. For example, matching `(a|ab)*' against `aab'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5582 requires that we match the `ab' alternative. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5583 case push_dummy_failure:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5584 DEBUG_PRINT1 ("EXECUTING push_dummy_failure.\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5585 /* See comments just above at `dummy_failure_jump' about the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5586 two zeroes. */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
5587 PUSH_FAILURE_POINT ((unsigned char *) 0, (unsigned char *) 0, -2);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5588 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5589
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5590 /* Have to succeed matching what follows at least n times.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5591 After that, handle like `on_failure_jump'. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5592 case succeed_n:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5593 EXTRACT_NUMBER (mcnt, p + 2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5594 DEBUG_PRINT2 ("EXECUTING succeed_n %d.\n", mcnt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5595
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5596 assert (mcnt >= 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5597 /* Originally, this is how many times we HAVE to succeed. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5598 if (mcnt > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5599 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5600 mcnt--;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5601 p += 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5602 STORE_NUMBER_AND_INCR (p, mcnt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5603 DEBUG_PRINT3 (" Setting 0x%lx to %d.\n", (long) p, mcnt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5604 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5605 else if (mcnt == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5606 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5607 DEBUG_PRINT2 (" Setting two bytes from 0x%lx to no_op.\n",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5608 (long) (p+2));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5609 p[2] = (unsigned char) no_op;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5610 p[3] = (unsigned char) no_op;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5611 goto on_failure;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5612 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5613 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5614
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5615 case jump_n:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5616 EXTRACT_NUMBER (mcnt, p + 2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5617 DEBUG_PRINT2 ("EXECUTING jump_n %d.\n", mcnt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5618
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5619 /* Originally, this is how many times we CAN jump. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5620 if (mcnt)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5621 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5622 mcnt--;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5623 STORE_NUMBER (p + 2, mcnt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5624 goto unconditional_jump;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5625 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5626 /* If don't have to jump any more, skip over the rest of command. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5627 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5628 p += 4;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5629 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5630
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5631 case set_number_at:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5632 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5633 DEBUG_PRINT1 ("EXECUTING set_number_at.\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5634
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5635 EXTRACT_NUMBER_AND_INCR (mcnt, p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5636 p1 = p + mcnt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5637 EXTRACT_NUMBER_AND_INCR (mcnt, p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5638 DEBUG_PRINT3 (" Setting 0x%lx to %d.\n", (long) p1, mcnt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5639 STORE_NUMBER (p1, mcnt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5640 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5641 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5642
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5643 case wordbound:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5644 DEBUG_PRINT1 ("EXECUTING wordbound.\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5645 should_succeed = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5646 matchwordbound:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5647 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5648 /* XEmacs change */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5649 int result;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5650 if (AT_STRINGS_BEG (d) || AT_STRINGS_END (d))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5651 result = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5652 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5653 {
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5654 re_char *d_before = POS_BEFORE_GAP_UNSAFE (d);
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5655 re_char *d_after = POS_AFTER_GAP_UNSAFE (d);
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5656
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5657 /* emch1 is the character before d, syn1 is the syntax of emch1,
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5658 emch2 is the character at d, and syn2 is the syntax of emch2. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5659 Emchar emch1, emch2;
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5660 int syn1, syn2;
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5661 #ifdef emacs
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5662 int pos_before;
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5663 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5664
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5665 DEC_CHARPTR (d_before);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5666 emch1 = charptr_emchar (d_before);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5667 emch2 = charptr_emchar (d_after);
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5668
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5669 #ifdef emacs
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5670 pos_before = SYNTAX_CACHE_BYTE_TO_CHAR (PTR_TO_OFFSET (d)) - 1;
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5671 UPDATE_SYNTAX_CACHE (pos_before);
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5672 #endif
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5673 syn1 = SYNTAX_FROM_CACHE (XCHAR_TABLE (regex_emacs_buffer->mirror_syntax_table),
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5674 emch1);
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5675 #ifdef emacs
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5676 UPDATE_SYNTAX_CACHE_FORWARD (pos_before + 1);
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5677 #endif
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5678 syn2 = SYNTAX_FROM_CACHE (XCHAR_TABLE (regex_emacs_buffer->mirror_syntax_table),
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5679 emch2);
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5680
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5681 result = ((syn1 == Sword) != (syn2 == Sword));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5682 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5683 if (result == should_succeed)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5684 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5685 goto fail;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5686 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5687
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5688 case notwordbound:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5689 DEBUG_PRINT1 ("EXECUTING notwordbound.\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5690 should_succeed = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5691 goto matchwordbound;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5692
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5693 case wordbeg:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5694 DEBUG_PRINT1 ("EXECUTING wordbeg.\n");
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5695 if (AT_STRINGS_END (d))
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5696 goto fail;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5697 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5698 /* XEmacs: this originally read:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5699
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5700 if (WORDCHAR_P (d) && (AT_STRINGS_BEG (d) || !WORDCHAR_P (d - 1)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5701 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5702
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5703 */
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5704 re_char *dtmp = POS_AFTER_GAP_UNSAFE (d);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5705 Emchar emch = charptr_emchar (dtmp);
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5706 #ifdef emacs
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5707 int charpos = SYNTAX_CACHE_BYTE_TO_CHAR (PTR_TO_OFFSET (d));
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5708 UPDATE_SYNTAX_CACHE (charpos);
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5709 #endif
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5710 if (SYNTAX_FROM_CACHE (XCHAR_TABLE (regex_emacs_buffer->mirror_syntax_table),
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5711 emch) != Sword)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5712 goto fail;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5713 if (AT_STRINGS_BEG (d))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5714 break;
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5715 dtmp = POS_BEFORE_GAP_UNSAFE (d);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5716 DEC_CHARPTR (dtmp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5717 emch = charptr_emchar (dtmp);
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5718 #ifdef emacs
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5719 UPDATE_SYNTAX_CACHE_BACKWARD (charpos - 1);
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5720 #endif
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5721 if (SYNTAX_FROM_CACHE (XCHAR_TABLE (regex_emacs_buffer->mirror_syntax_table),
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5722 emch) != Sword)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5723 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5724 goto fail;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5725 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5726
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5727 case wordend:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5728 DEBUG_PRINT1 ("EXECUTING wordend.\n");
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5729 if (AT_STRINGS_BEG (d))
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5730 goto fail;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5731 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5732 /* XEmacs: this originally read:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5733
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5734 if (!AT_STRINGS_BEG (d) && WORDCHAR_P (d - 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5735 && (!WORDCHAR_P (d) || AT_STRINGS_END (d)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5736 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5737
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5738 The or condition is incorrect (reversed).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5739 */
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5740 re_char *dtmp;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5741 Emchar emch;
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5742 #ifdef emacs
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5743 int charpos = SYNTAX_CACHE_BYTE_TO_CHAR (PTR_TO_OFFSET (d)) - 1;
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5744 UPDATE_SYNTAX_CACHE (charpos);
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5745 #endif
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5746 dtmp = POS_BEFORE_GAP_UNSAFE (d);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5747 DEC_CHARPTR (dtmp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5748 emch = charptr_emchar (dtmp);
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5749 if (SYNTAX_FROM_CACHE (XCHAR_TABLE (regex_emacs_buffer->mirror_syntax_table),
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5750 emch) != Sword)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5751 goto fail;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5752 if (AT_STRINGS_END (d))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5753 break;
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5754 dtmp = POS_AFTER_GAP_UNSAFE (d);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5755 emch = charptr_emchar (dtmp);
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5756 #ifdef emacs
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5757 UPDATE_SYNTAX_CACHE_FORWARD (charpos + 1);
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5758 #endif
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5759 if (SYNTAX_FROM_CACHE (XCHAR_TABLE (regex_emacs_buffer->mirror_syntax_table),
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5760 emch) != Sword)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5761 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5762 goto fail;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5763 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5764
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5765 #ifdef emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5766 case before_dot:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5767 DEBUG_PRINT1 ("EXECUTING before_dot.\n");
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5768 if (! (NILP (regex_match_object) || BUFFERP (regex_match_object))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
5769 || (BUF_PTR_BYTE_POS (regex_emacs_buffer, (unsigned char *) d)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
5770 >= BUF_PT (regex_emacs_buffer)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5771 goto fail;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5772 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5773
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5774 case at_dot:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5775 DEBUG_PRINT1 ("EXECUTING at_dot.\n");
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5776 if (! (NILP (regex_match_object) || BUFFERP (regex_match_object))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
5777 || (BUF_PTR_BYTE_POS (regex_emacs_buffer, (unsigned char *) d)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
5778 != BUF_PT (regex_emacs_buffer)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5779 goto fail;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5780 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5781
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5782 case after_dot:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5783 DEBUG_PRINT1 ("EXECUTING after_dot.\n");
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5784 if (! (NILP (regex_match_object) || BUFFERP (regex_match_object))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
5785 || (BUF_PTR_BYTE_POS (regex_emacs_buffer, (unsigned char *) d)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
5786 <= BUF_PT (regex_emacs_buffer)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5787 goto fail;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5788 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5789 #if 0 /* not emacs19 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5790 case at_dot:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5791 DEBUG_PRINT1 ("EXECUTING at_dot.\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5792 if (BUF_PTR_BYTE_POS (regex_emacs_buffer, (unsigned char *) d) + 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5793 != BUF_PT (regex_emacs_buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5794 goto fail;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5795 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5796 #endif /* not emacs19 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5797
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5798 case syntaxspec:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5799 DEBUG_PRINT2 ("EXECUTING syntaxspec %d.\n", mcnt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5800 mcnt = *p++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5801 goto matchsyntax;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5802
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5803 case wordchar:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5804 DEBUG_PRINT1 ("EXECUTING Emacs wordchar.\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5805 mcnt = (int) Sword;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5806 matchsyntax:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5807 should_succeed = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5808 matchornotsyntax:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5809 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5810 int matches;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5811 Emchar emch;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5812
450
98528da0b7fc Import from CVS: tag r21-2-40
cvs
parents: 446
diff changeset
5813 REGEX_PREFETCH ();
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5814 #ifdef emacs
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5815 {
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5816 int charpos = SYNTAX_CACHE_BYTE_TO_CHAR (PTR_TO_OFFSET (d));
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5817 UPDATE_SYNTAX_CACHE (charpos);
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5818 }
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5819 #endif
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5820
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
5821 emch = charptr_emchar ((const Bufbyte *) d);
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5822 matches = (SYNTAX_FROM_CACHE (regex_emacs_buffer->mirror_syntax_table,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5823 emch) == (enum syntaxcode) mcnt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5824 INC_CHARPTR (d);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5825 if (matches != should_succeed)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5826 goto fail;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5827 SET_REGS_MATCHED ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5828 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5829 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5830
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5831 case notsyntaxspec:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5832 DEBUG_PRINT2 ("EXECUTING notsyntaxspec %d.\n", mcnt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5833 mcnt = *p++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5834 goto matchnotsyntax;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5835
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5836 case notwordchar:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5837 DEBUG_PRINT1 ("EXECUTING Emacs notwordchar.\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5838 mcnt = (int) Sword;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5839 matchnotsyntax:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5840 should_succeed = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5841 goto matchornotsyntax;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5842
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5843 #ifdef MULE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5844 /* 97/2/17 jhod Mule category code patch */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5845 case categoryspec:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5846 should_succeed = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5847 matchornotcategory:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5848 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5849 Emchar emch;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5850
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5851 mcnt = *p++;
450
98528da0b7fc Import from CVS: tag r21-2-40
cvs
parents: 446
diff changeset
5852 REGEX_PREFETCH ();
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
5853 emch = charptr_emchar ((const Bufbyte *) d);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5854 INC_CHARPTR (d);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5855 if (check_category_char(emch, regex_emacs_buffer->category_table,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5856 mcnt, should_succeed))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5857 goto fail;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5858 SET_REGS_MATCHED ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5859 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5860 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5861
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5862 case notcategoryspec:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5863 should_succeed = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5864 goto matchornotcategory;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5865 /* end of category patch */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5866 #endif /* MULE */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5867 #else /* not emacs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5868 case wordchar:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5869 DEBUG_PRINT1 ("EXECUTING non-Emacs wordchar.\n");
450
98528da0b7fc Import from CVS: tag r21-2-40
cvs
parents: 446
diff changeset
5870 REGEX_PREFETCH ();
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5871 if (!WORDCHAR_P_UNSAFE ((int) (*d)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5872 goto fail;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5873 SET_REGS_MATCHED ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5874 d++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5875 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5876
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5877 case notwordchar:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5878 DEBUG_PRINT1 ("EXECUTING non-Emacs notwordchar.\n");
450
98528da0b7fc Import from CVS: tag r21-2-40
cvs
parents: 446
diff changeset
5879 REGEX_PREFETCH ();
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5880 if (!WORDCHAR_P_UNSAFE ((int) (*d)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5881 goto fail;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5882 SET_REGS_MATCHED ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5883 d++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5884 break;
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
5885 #endif /* emacs */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5886
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5887 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5888 abort ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5889 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5890 continue; /* Successfully executed one pattern command; keep going. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5891
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5892
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5893 /* We goto here if a matching operation fails. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5894 fail:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5895 if (!FAIL_STACK_EMPTY ())
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5896 { /* A restart point is known. Restore to that state. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5897 DEBUG_PRINT1 ("\nFAIL:\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5898 POP_FAILURE_POINT (d, p,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5899 lowest_active_reg, highest_active_reg,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5900 regstart, regend, reg_info);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5901
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5902 /* If this failure point is a dummy, try the next one. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5903 if (!p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5904 goto fail;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5905
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5906 /* If we failed to the end of the pattern, don't examine *p. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5907 assert (p <= pend);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5908 if (p < pend)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5909 {
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5910 re_bool is_a_jump_n = false;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5911
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5912 /* If failed to a backwards jump that's part of a repetition
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5913 loop, need to pop this failure point and use the next one. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5914 switch ((re_opcode_t) *p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5915 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5916 case jump_n:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5917 is_a_jump_n = true;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5918 case maybe_pop_jump:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5919 case pop_failure_jump:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5920 case jump:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5921 p1 = p + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5922 EXTRACT_NUMBER_AND_INCR (mcnt, p1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5923 p1 += mcnt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5924
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5925 if ((is_a_jump_n && (re_opcode_t) *p1 == succeed_n)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5926 || (!is_a_jump_n
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5927 && (re_opcode_t) *p1 == on_failure_jump))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5928 goto fail;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5929 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5930 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5931 /* do nothing */ ;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5932 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5933 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5934
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5935 if (d >= string1 && d <= end1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5936 dend = end_match_1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5937 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5938 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5939 break; /* Matching at this starting point really fails. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5940 } /* for (;;) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5941
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5942 if (best_regs_set)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5943 goto restore_best_regs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5944
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5945 FREE_VARIABLES ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5946
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5947 return -1; /* Failure to match. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5948 } /* re_match_2 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5949
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5950 /* Subroutine definitions for re_match_2. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5951
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5952
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5953 /* We are passed P pointing to a register number after a start_memory.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5954
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5955 Return true if the pattern up to the corresponding stop_memory can
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5956 match the empty string, and false otherwise.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5957
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5958 If we find the matching stop_memory, sets P to point to one past its number.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5959 Otherwise, sets P to an undefined byte less than or equal to END.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5960
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5961 We don't handle duplicates properly (yet). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5962
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
5963 static re_bool
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5964 group_match_null_string_p (unsigned char **p, unsigned char *end,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5965 register_info_type *reg_info)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5966 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5967 int mcnt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5968 /* Point to after the args to the start_memory. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5969 unsigned char *p1 = *p + 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5970
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5971 while (p1 < end)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5972 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5973 /* Skip over opcodes that can match nothing, and return true or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5974 false, as appropriate, when we get to one that can't, or to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5975 matching stop_memory. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5976
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5977 switch ((re_opcode_t) *p1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5978 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5979 /* Could be either a loop or a series of alternatives. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5980 case on_failure_jump:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5981 p1++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5982 EXTRACT_NUMBER_AND_INCR (mcnt, p1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5983
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5984 /* If the next operation is not a jump backwards in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5985 pattern. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5986
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5987 if (mcnt >= 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5988 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5989 /* Go through the on_failure_jumps of the alternatives,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5990 seeing if any of the alternatives cannot match nothing.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5991 The last alternative starts with only a jump,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5992 whereas the rest start with on_failure_jump and end
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5993 with a jump, e.g., here is the pattern for `a|b|c':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5994
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5995 /on_failure_jump/0/6/exactn/1/a/jump_past_alt/0/6
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5996 /on_failure_jump/0/6/exactn/1/b/jump_past_alt/0/3
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5997 /exactn/1/c
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5998
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5999 So, we have to first go through the first (n-1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6000 alternatives and then deal with the last one separately. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6001
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6002
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6003 /* Deal with the first (n-1) alternatives, which start
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6004 with an on_failure_jump (see above) that jumps to right
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6005 past a jump_past_alt. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6006
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6007 while ((re_opcode_t) p1[mcnt-3] == jump_past_alt)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6008 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6009 /* `mcnt' holds how many bytes long the alternative
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6010 is, including the ending `jump_past_alt' and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6011 its number. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6012
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6013 if (!alt_match_null_string_p (p1, p1 + mcnt - 3,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6014 reg_info))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6015 return false;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6016
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6017 /* Move to right after this alternative, including the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6018 jump_past_alt. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6019 p1 += mcnt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6020
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6021 /* Break if it's the beginning of an n-th alternative
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6022 that doesn't begin with an on_failure_jump. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6023 if ((re_opcode_t) *p1 != on_failure_jump)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6024 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6025
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6026 /* Still have to check that it's not an n-th
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6027 alternative that starts with an on_failure_jump. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6028 p1++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6029 EXTRACT_NUMBER_AND_INCR (mcnt, p1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6030 if ((re_opcode_t) p1[mcnt-3] != jump_past_alt)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6031 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6032 /* Get to the beginning of the n-th alternative. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6033 p1 -= 3;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6034 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6035 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6036 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6037
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6038 /* Deal with the last alternative: go back and get number
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6039 of the `jump_past_alt' just before it. `mcnt' contains
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6040 the length of the alternative. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6041 EXTRACT_NUMBER (mcnt, p1 - 2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6042
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6043 if (!alt_match_null_string_p (p1, p1 + mcnt, reg_info))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6044 return false;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6045
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6046 p1 += mcnt; /* Get past the n-th alternative. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6047 } /* if mcnt > 0 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6048 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6049
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6050
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6051 case stop_memory:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6052 assert (p1[1] == **p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6053 *p = p1 + 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6054 return true;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6055
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6056
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6057 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6058 if (!common_op_match_null_string_p (&p1, end, reg_info))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6059 return false;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6060 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6061 } /* while p1 < end */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6062
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6063 return false;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6064 } /* group_match_null_string_p */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6065
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6066
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6067 /* Similar to group_match_null_string_p, but doesn't deal with alternatives:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6068 It expects P to be the first byte of a single alternative and END one
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6069 byte past the last. The alternative can contain groups. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6070
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
6071 static re_bool
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6072 alt_match_null_string_p (unsigned char *p, unsigned char *end,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6073 register_info_type *reg_info)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6074 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6075 int mcnt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6076 unsigned char *p1 = p;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6077
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6078 while (p1 < end)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6079 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6080 /* Skip over opcodes that can match nothing, and break when we get
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6081 to one that can't. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6082
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6083 switch ((re_opcode_t) *p1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6084 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6085 /* It's a loop. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6086 case on_failure_jump:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6087 p1++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6088 EXTRACT_NUMBER_AND_INCR (mcnt, p1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6089 p1 += mcnt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6090 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6091
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6092 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6093 if (!common_op_match_null_string_p (&p1, end, reg_info))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6094 return false;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6095 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6096 } /* while p1 < end */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6097
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6098 return true;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6099 } /* alt_match_null_string_p */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6100
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6101
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6102 /* Deals with the ops common to group_match_null_string_p and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6103 alt_match_null_string_p.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6104
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6105 Sets P to one after the op and its arguments, if any. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6106
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
6107 static re_bool
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6108 common_op_match_null_string_p (unsigned char **p, unsigned char *end,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6109 register_info_type *reg_info)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6110 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6111 int mcnt;
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
6112 re_bool ret;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6113 int reg_no;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6114 unsigned char *p1 = *p;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6115
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6116 switch ((re_opcode_t) *p1++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6117 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6118 case no_op:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6119 case begline:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6120 case endline:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6121 case begbuf:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6122 case endbuf:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6123 case wordbeg:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6124 case wordend:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6125 case wordbound:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6126 case notwordbound:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6127 #ifdef emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6128 case before_dot:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6129 case at_dot:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6130 case after_dot:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6131 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6132 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6133
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6134 case start_memory:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6135 reg_no = *p1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6136 assert (reg_no > 0 && reg_no <= MAX_REGNUM);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6137 ret = group_match_null_string_p (&p1, end, reg_info);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6138
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6139 /* Have to set this here in case we're checking a group which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6140 contains a group and a back reference to it. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6141
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6142 if (REG_MATCH_NULL_STRING_P (reg_info[reg_no]) == MATCH_NULL_UNSET_VALUE)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6143 REG_MATCH_NULL_STRING_P (reg_info[reg_no]) = ret;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6144
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6145 if (!ret)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6146 return false;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6147 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6148
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6149 /* If this is an optimized succeed_n for zero times, make the jump. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6150 case jump:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6151 EXTRACT_NUMBER_AND_INCR (mcnt, p1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6152 if (mcnt >= 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6153 p1 += mcnt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6154 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6155 return false;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6156 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6157
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6158 case succeed_n:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6159 /* Get to the number of times to succeed. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6160 p1 += 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6161 EXTRACT_NUMBER_AND_INCR (mcnt, p1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6162
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6163 if (mcnt == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6164 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6165 p1 -= 4;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6166 EXTRACT_NUMBER_AND_INCR (mcnt, p1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6167 p1 += mcnt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6168 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6169 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6170 return false;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6171 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6172
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6173 case duplicate:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6174 if (!REG_MATCH_NULL_STRING_P (reg_info[*p1]))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6175 return false;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6176 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6177
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6178 case set_number_at:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6179 p1 += 4;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6180
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6181 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6182 /* All other opcodes mean we cannot match the empty string. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6183 return false;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6184 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6185
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6186 *p = p1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6187 return true;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6188 } /* common_op_match_null_string_p */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6189
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6190
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6191 /* Return zero if TRANSLATE[S1] and TRANSLATE[S2] are identical for LEN
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6192 bytes; nonzero otherwise. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6193
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6194 static int
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
6195 bcmp_translate (re_char *s1, re_char *s2,
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
6196 REGISTER int len, RE_TRANSLATE_TYPE translate)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6197 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
6198 REGISTER const unsigned char *p1 = s1, *p2 = s2;
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
6199 #ifdef MULE
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
6200 const unsigned char *p1_end = s1 + len;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
6201 const unsigned char *p2_end = s2 + len;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
6202
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
6203 while (p1 != p1_end && p2 != p2_end)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
6204 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
6205 Emchar p1_ch, p2_ch;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
6206
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
6207 p1_ch = charptr_emchar (p1);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
6208 p2_ch = charptr_emchar (p2);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
6209
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
6210 if (RE_TRANSLATE (p1_ch)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
6211 != RE_TRANSLATE (p2_ch))
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
6212 return 1;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
6213 INC_CHARPTR (p1);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
6214 INC_CHARPTR (p2);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
6215 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
6216 #else /* not MULE */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6217 while (len)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6218 {
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
6219 if (RE_TRANSLATE (*p1++) != RE_TRANSLATE (*p2++)) return 1;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6220 len--;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6221 }
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
6222 #endif /* MULE */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6223 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6224 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6225
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6226 /* Entry points for GNU code. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6227
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6228 /* re_compile_pattern is the GNU regular expression compiler: it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6229 compiles PATTERN (of length SIZE) and puts the result in BUFP.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6230 Returns 0 if the pattern was valid, otherwise an error string.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6231
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6232 Assumes the `allocated' (and perhaps `buffer') and `translate' fields
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6233 are set in BUFP on entry.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6234
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6235 We call regex_compile to do the actual compilation. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6236
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
6237 const char *
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
6238 re_compile_pattern (const char *pattern, int length,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6239 struct re_pattern_buffer *bufp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6240 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6241 reg_errcode_t ret;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6242
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6243 /* GNU code is written to assume at least RE_NREGS registers will be set
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6244 (and at least one extra will be -1). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6245 bufp->regs_allocated = REGS_UNALLOCATED;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6246
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6247 /* And GNU code determines whether or not to get register information
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6248 by passing null for the REGS argument to re_match, etc., not by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6249 setting no_sub. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6250 bufp->no_sub = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6251
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6252 /* Match anchors at newline. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6253 bufp->newline_anchor = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6254
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
6255 ret = regex_compile ((unsigned char *) pattern, length, re_syntax_options, bufp);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6256
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6257 if (!ret)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6258 return NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6259 return gettext (re_error_msgid[(int) ret]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6260 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6261
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6262 /* Entry points compatible with 4.2 BSD regex library. We don't define
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6263 them unless specifically requested. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6264
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6265 #ifdef _REGEX_RE_COMP
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6266
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6267 /* BSD has one and only one pattern buffer. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6268 static struct re_pattern_buffer re_comp_buf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6269
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6270 char *
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
6271 re_comp (const char *s)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6272 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6273 reg_errcode_t ret;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6274
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6275 if (!s)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6276 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6277 if (!re_comp_buf.buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6278 return gettext ("No previous regular expression");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6279 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6280 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6281
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6282 if (!re_comp_buf.buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6283 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6284 re_comp_buf.buffer = (unsigned char *) malloc (200);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6285 if (re_comp_buf.buffer == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6286 return gettext (re_error_msgid[(int) REG_ESPACE]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6287 re_comp_buf.allocated = 200;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6288
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6289 re_comp_buf.fastmap = (char *) malloc (1 << BYTEWIDTH);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6290 if (re_comp_buf.fastmap == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6291 return gettext (re_error_msgid[(int) REG_ESPACE]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6292 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6293
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6294 /* Since `re_exec' always passes NULL for the `regs' argument, we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6295 don't need to initialize the pattern buffer fields which affect it. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6296
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6297 /* Match anchors at newlines. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6298 re_comp_buf.newline_anchor = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6299
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
6300 ret = regex_compile ((unsigned char *)s, strlen (s), re_syntax_options, &re_comp_buf);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6301
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6302 if (!ret)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6303 return NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6304
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
6305 /* Yes, we're discarding `const' here if !HAVE_LIBINTL. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6306 return (char *) gettext (re_error_msgid[(int) ret]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6307 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6308
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6309
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6310 int
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
6311 re_exec (const char *s)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6312 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
6313 const int len = strlen (s);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6314 return
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6315 0 <= re_search (&re_comp_buf, s, len, 0, len, (struct re_registers *) 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6316 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6317 #endif /* _REGEX_RE_COMP */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6318
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6319 /* POSIX.2 functions. Don't define these for Emacs. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6320
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6321 #ifndef emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6322
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6323 /* regcomp takes a regular expression as a string and compiles it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6324
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6325 PREG is a regex_t *. We do not expect any fields to be initialized,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6326 since POSIX says we shouldn't. Thus, we set
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6327
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6328 `buffer' to the compiled pattern;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6329 `used' to the length of the compiled pattern;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6330 `syntax' to RE_SYNTAX_POSIX_EXTENDED if the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6331 REG_EXTENDED bit in CFLAGS is set; otherwise, to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6332 RE_SYNTAX_POSIX_BASIC;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6333 `newline_anchor' to REG_NEWLINE being set in CFLAGS;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6334 `fastmap' and `fastmap_accurate' to zero;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6335 `re_nsub' to the number of subexpressions in PATTERN.
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
6336 (non-shy of course. POSIX probably doesn't know about
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 460
diff changeset
6337 shy ones, and in any case they should be invisible.)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6338
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6339 PATTERN is the address of the pattern string.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6340
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6341 CFLAGS is a series of bits which affect compilation.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6342
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6343 If REG_EXTENDED is set, we use POSIX extended syntax; otherwise, we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6344 use POSIX basic syntax.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6345
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6346 If REG_NEWLINE is set, then . and [^...] don't match newline.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6347 Also, regexec will try a match beginning after every newline.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6348
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6349 If REG_ICASE is set, then we considers upper- and lowercase
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6350 versions of letters to be equivalent when matching.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6351
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6352 If REG_NOSUB is set, then when PREG is passed to regexec, that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6353 routine will report only success or failure, and nothing about the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6354 registers.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6355
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6356 It returns 0 if it succeeds, nonzero if it doesn't. (See regex.h for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6357 the return codes and their meanings.) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6358
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6359 int
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
6360 regcomp (regex_t *preg, const char *pattern, int cflags)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6361 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6362 reg_errcode_t ret;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6363 unsigned syntax
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6364 = (cflags & REG_EXTENDED) ?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6365 RE_SYNTAX_POSIX_EXTENDED : RE_SYNTAX_POSIX_BASIC;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6366
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6367 /* regex_compile will allocate the space for the compiled pattern. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6368 preg->buffer = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6369 preg->allocated = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6370 preg->used = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6371
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6372 /* Don't bother to use a fastmap when searching. This simplifies the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6373 REG_NEWLINE case: if we used a fastmap, we'd have to put all the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6374 characters after newlines into the fastmap. This way, we just try
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6375 every character. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6376 preg->fastmap = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6377
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6378 if (cflags & REG_ICASE)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6379 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6380 unsigned i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6381
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6382 preg->translate = (char *) malloc (CHAR_SET_SIZE);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6383 if (preg->translate == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6384 return (int) REG_ESPACE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6385
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6386 /* Map uppercase characters to corresponding lowercase ones. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6387 for (i = 0; i < CHAR_SET_SIZE; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6388 preg->translate[i] = ISUPPER (i) ? tolower (i) : i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6389 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6390 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6391 preg->translate = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6392
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6393 /* If REG_NEWLINE is set, newlines are treated differently. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6394 if (cflags & REG_NEWLINE)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6395 { /* REG_NEWLINE implies neither . nor [^...] match newline. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6396 syntax &= ~RE_DOT_NEWLINE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6397 syntax |= RE_HAT_LISTS_NOT_NEWLINE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6398 /* It also changes the matching behavior. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6399 preg->newline_anchor = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6400 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6401 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6402 preg->newline_anchor = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6403
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6404 preg->no_sub = !!(cflags & REG_NOSUB);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6405
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6406 /* POSIX says a null character in the pattern terminates it, so we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6407 can use strlen here in compiling the pattern. */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
6408 ret = regex_compile ((unsigned char *) pattern, strlen (pattern), syntax, preg);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6409
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6410 /* POSIX doesn't distinguish between an unmatched open-group and an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6411 unmatched close-group: both are REG_EPAREN. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6412 if (ret == REG_ERPAREN) ret = REG_EPAREN;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6413
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6414 return (int) ret;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6415 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6416
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6417
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6418 /* regexec searches for a given pattern, specified by PREG, in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6419 string STRING.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6420
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6421 If NMATCH is zero or REG_NOSUB was set in the cflags argument to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6422 `regcomp', we ignore PMATCH. Otherwise, we assume PMATCH has at
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6423 least NMATCH elements, and we set them to the offsets of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6424 corresponding matched substrings.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6425
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6426 EFLAGS specifies `execution flags' which affect matching: if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6427 REG_NOTBOL is set, then ^ does not match at the beginning of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6428 string; if REG_NOTEOL is set, then $ does not match at the end.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6429
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6430 We return 0 if we find a match and REG_NOMATCH if not. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6431
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6432 int
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
6433 regexec (const regex_t *preg, const char *string, size_t nmatch,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6434 regmatch_t pmatch[], int eflags)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6435 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6436 int ret;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6437 struct re_registers regs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6438 regex_t private_preg;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6439 int len = strlen (string);
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 458
diff changeset
6440 re_bool want_reg_info = !preg->no_sub && nmatch > 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6441
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6442 private_preg = *preg;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6443
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6444 private_preg.not_bol = !!(eflags & REG_NOTBOL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6445 private_preg.not_eol = !!(eflags & REG_NOTEOL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6446
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6447 /* The user has told us exactly how many registers to return
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6448 information about, via `nmatch'. We have to pass that on to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6449 matching routines. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6450 private_preg.regs_allocated = REGS_FIXED;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6451
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6452 if (want_reg_info)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6453 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6454 regs.num_regs = nmatch;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6455 regs.start = TALLOC (nmatch, regoff_t);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6456 regs.end = TALLOC (nmatch, regoff_t);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6457 if (regs.start == NULL || regs.end == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6458 return (int) REG_NOMATCH;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6459 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6460
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6461 /* Perform the searching operation. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6462 ret = re_search (&private_preg, string, len,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6463 /* start: */ 0, /* range: */ len,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6464 want_reg_info ? &regs : (struct re_registers *) 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6465
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6466 /* Copy the register information to the POSIX structure. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6467 if (want_reg_info)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6468 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6469 if (ret >= 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6470 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6471 unsigned r;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6472
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6473 for (r = 0; r < nmatch; r++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6474 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6475 pmatch[r].rm_so = regs.start[r];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6476 pmatch[r].rm_eo = regs.end[r];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6477 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6478 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6479
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6480 /* If we needed the temporary register info, free the space now. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6481 free (regs.start);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6482 free (regs.end);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6483 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6484
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6485 /* We want zero return to mean success, unlike `re_search'. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6486 return ret >= 0 ? (int) REG_NOERROR : (int) REG_NOMATCH;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6487 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6488
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6489
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6490 /* Returns a message corresponding to an error code, ERRCODE, returned
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6491 from either regcomp or regexec. We don't use PREG here. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6492
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6493 size_t
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
6494 regerror (int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6495 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
6496 const char *msg;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6497 size_t msg_size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6498
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6499 if (errcode < 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6500 || errcode >= (sizeof (re_error_msgid) / sizeof (re_error_msgid[0])))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6501 /* Only error codes returned by the rest of the code should be passed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6502 to this routine. If we are given anything else, or if other regex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6503 code generates an invalid error code, then the program has a bug.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6504 Dump core so we can fix it. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6505 abort ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6506
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6507 msg = gettext (re_error_msgid[errcode]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6508
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6509 msg_size = strlen (msg) + 1; /* Includes the null. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6510
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6511 if (errbuf_size != 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6512 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6513 if (msg_size > errbuf_size)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6514 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6515 strncpy (errbuf, msg, errbuf_size - 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6516 errbuf[errbuf_size - 1] = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6517 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6518 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6519 strcpy (errbuf, msg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6520 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6521
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6522 return msg_size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6523 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6524
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6525
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6526 /* Free dynamically allocated space used by PREG. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6527
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6528 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6529 regfree (regex_t *preg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6530 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6531 if (preg->buffer != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6532 free (preg->buffer);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6533 preg->buffer = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6534
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6535 preg->allocated = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6536 preg->used = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6537
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6538 if (preg->fastmap != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6539 free (preg->fastmap);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6540 preg->fastmap = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6541 preg->fastmap_accurate = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6542
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6543 if (preg->translate != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6544 free (preg->translate);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6545 preg->translate = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6546 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6547
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6548 #endif /* not emacs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6549
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6550 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6551 Local variables:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6552 make-backup-files: t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6553 version-control: t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6554 trim-versions-without-asking: nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6555 End:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6556 */