Mercurial > emacs
annotate src/search.c @ 20414:c42c4f60ecbb
(byte-optimize-lapcode): Correctly
distinguish byte-constant from operations on variables.
author | Karl Heuer <kwzh@gnu.org> |
---|---|
date | Thu, 04 Dec 1997 05:58:56 +0000 |
parents | d8e5f3c1618b |
children | c20c92ff4055 |
rev | line source |
---|---|
603 | 1 /* String search routines for GNU Emacs. |
7307 | 2 Copyright (C) 1985, 1986, 1987, 1993, 1994 Free Software Foundation, Inc. |
603 | 3 |
4 This file is part of GNU Emacs. | |
5 | |
6 GNU Emacs is free software; you can redistribute it and/or modify | |
7 it under the terms of the GNU General Public License as published by | |
12244 | 8 the Free Software Foundation; either version 2, or (at your option) |
603 | 9 any later version. |
10 | |
11 GNU Emacs is distributed in the hope that it will be useful, | |
12 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 GNU General Public License for more details. | |
15 | |
16 You should have received a copy of the GNU General Public License | |
17 along with GNU Emacs; see the file COPYING. If not, write to | |
14186
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
14086
diff
changeset
|
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
14086
diff
changeset
|
19 Boston, MA 02111-1307, USA. */ |
603 | 20 |
21 | |
4696
1fc792473491
Include <config.h> instead of "config.h".
Roland McGrath <roland@gnu.org>
parents:
4635
diff
changeset
|
22 #include <config.h> |
603 | 23 #include "lisp.h" |
24 #include "syntax.h" | |
17053
df904355f033
Include category.h and charset.h.
Karl Heuer <kwzh@gnu.org>
parents:
16880
diff
changeset
|
25 #include "category.h" |
603 | 26 #include "buffer.h" |
17053
df904355f033
Include category.h and charset.h.
Karl Heuer <kwzh@gnu.org>
parents:
16880
diff
changeset
|
27 #include "charset.h" |
9410
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
28 #include "region-cache.h" |
603 | 29 #include "commands.h" |
2439
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2393
diff
changeset
|
30 #include "blockinput.h" |
20347
d8e5f3c1618b
Include "intervals.h" for prototypes.
Andreas Schwab <schwab@suse.de>
parents:
19541
diff
changeset
|
31 #include "intervals.h" |
621 | 32 |
603 | 33 #include <sys/types.h> |
34 #include "regex.h" | |
35 | |
16275
a4bcfdc9bb66
(REGEXP_CACHE_SIZE): Increase to 20.
Richard M. Stallman <rms@gnu.org>
parents:
16152
diff
changeset
|
36 #define REGEXP_CACHE_SIZE 20 |
603 | 37 |
9605
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
38 /* If the regexp is non-nil, then the buffer contains the compiled form |
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
39 of that regexp, suitable for searching. */ |
16275
a4bcfdc9bb66
(REGEXP_CACHE_SIZE): Increase to 20.
Richard M. Stallman <rms@gnu.org>
parents:
16152
diff
changeset
|
40 struct regexp_cache |
a4bcfdc9bb66
(REGEXP_CACHE_SIZE): Increase to 20.
Richard M. Stallman <rms@gnu.org>
parents:
16152
diff
changeset
|
41 { |
9605
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
42 struct regexp_cache *next; |
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
43 Lisp_Object regexp; |
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
44 struct re_pattern_buffer buf; |
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
45 char fastmap[0400]; |
10020
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
46 /* Nonzero means regexp was compiled to do full POSIX backtracking. */ |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
47 char posix; |
9605
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
48 }; |
603 | 49 |
9605
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
50 /* The instances of that struct. */ |
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
51 struct regexp_cache searchbufs[REGEXP_CACHE_SIZE]; |
603 | 52 |
9605
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
53 /* The head of the linked list; points to the most recently used buffer. */ |
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
54 struct regexp_cache *searchbuf_head; |
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
55 |
603 | 56 |
621 | 57 /* Every call to re_match, etc., must pass &search_regs as the regs |
58 argument unless you can show it is unnecessary (i.e., if re_match | |
59 is certainly going to be called again before region-around-match | |
60 can be called). | |
61 | |
62 Since the registers are now dynamically allocated, we need to make | |
63 sure not to refer to the Nth register before checking that it has | |
708 | 64 been allocated by checking search_regs.num_regs. |
603 | 65 |
708 | 66 The regex code keeps track of whether it has allocated the search |
9605
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
67 buffer using bits in the re_pattern_buffer. This means that whenever |
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
68 you compile a new pattern, it completely forgets whether it has |
708 | 69 allocated any registers, and will allocate new registers the next |
70 time you call a searching or matching function. Therefore, we need | |
71 to call re_set_registers after compiling a new pattern or after | |
72 setting the match registers, so that the regex functions will be | |
73 able to free or re-allocate it properly. */ | |
603 | 74 static struct re_registers search_regs; |
75 | |
727 | 76 /* The buffer in which the last search was performed, or |
77 Qt if the last search was done in a string; | |
78 Qnil if no searching has been done yet. */ | |
79 static Lisp_Object last_thing_searched; | |
603 | 80 |
14036 | 81 /* error condition signaled when regexp compile_pattern fails */ |
603 | 82 |
83 Lisp_Object Qinvalid_regexp; | |
84 | |
5556
14161cfec24a
(set_search_regs): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
4954
diff
changeset
|
85 static void set_search_regs (); |
10055
cb713218845a
(save_search_regs): Add declaration.
Richard M. Stallman <rms@gnu.org>
parents:
10032
diff
changeset
|
86 static void save_search_regs (); |
5556
14161cfec24a
(set_search_regs): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
4954
diff
changeset
|
87 |
10020
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
88 static int search_buffer (); |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
89 |
603 | 90 static void |
91 matcher_overflow () | |
92 { | |
93 error ("Stack overflow in regexp matcher"); | |
94 } | |
95 | |
96 #ifdef __STDC__ | |
97 #define CONST const | |
98 #else | |
99 #define CONST | |
100 #endif | |
101 | |
10020
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
102 /* Compile a regexp and signal a Lisp error if anything goes wrong. |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
103 PATTERN is the pattern to compile. |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
104 CP is the place to put the result. |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
105 TRANSLATE is a translation table for ignoring case, or NULL for none. |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
106 REGP is the structure that says where to store the "register" |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
107 values that will result from matching this pattern. |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
108 If it is 0, we should compile the pattern not to record any |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
109 subexpression bounds. |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
110 POSIX is nonzero if we want full backtracking (POSIX style) |
17053
df904355f033
Include category.h and charset.h.
Karl Heuer <kwzh@gnu.org>
parents:
16880
diff
changeset
|
111 for this pattern. 0 means backtrack only enough to get a valid match. |
df904355f033
Include category.h and charset.h.
Karl Heuer <kwzh@gnu.org>
parents:
16880
diff
changeset
|
112 MULTIBYTE is nonzero if we want to handle multibyte characters in |
df904355f033
Include category.h and charset.h.
Karl Heuer <kwzh@gnu.org>
parents:
16880
diff
changeset
|
113 PATTERN. 0 means all multibyte characters are recognized just as |
df904355f033
Include category.h and charset.h.
Karl Heuer <kwzh@gnu.org>
parents:
16880
diff
changeset
|
114 sequences of binary data. */ |
603 | 115 |
9605
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
116 static void |
17053
df904355f033
Include category.h and charset.h.
Karl Heuer <kwzh@gnu.org>
parents:
16880
diff
changeset
|
117 compile_pattern_1 (cp, pattern, translate, regp, posix, multibyte) |
9605
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
118 struct regexp_cache *cp; |
603 | 119 Lisp_Object pattern; |
13237
1aa239b8d03c
(compile_pattern_1, compile_pattern, search_buffer):
Richard M. Stallman <rms@gnu.org>
parents:
12807
diff
changeset
|
120 Lisp_Object *translate; |
708 | 121 struct re_registers *regp; |
10020
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
122 int posix; |
17053
df904355f033
Include category.h and charset.h.
Karl Heuer <kwzh@gnu.org>
parents:
16880
diff
changeset
|
123 int multibyte; |
603 | 124 { |
18762
12c0de0113af
(compile_pattern_1): Don't declare val with CONST.
Richard M. Stallman <rms@gnu.org>
parents:
18193
diff
changeset
|
125 char *val; |
10020
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
126 reg_syntax_t old; |
603 | 127 |
9605
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
128 cp->regexp = Qnil; |
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
129 cp->buf.translate = translate; |
10020
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
130 cp->posix = posix; |
17053
df904355f033
Include category.h and charset.h.
Karl Heuer <kwzh@gnu.org>
parents:
16880
diff
changeset
|
131 cp->buf.multibyte = multibyte; |
2439
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2393
diff
changeset
|
132 BLOCK_INPUT; |
10020
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
133 old = re_set_syntax (RE_SYNTAX_EMACS |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
134 | (posix ? 0 : RE_NO_POSIX_BACKTRACKING)); |
18762
12c0de0113af
(compile_pattern_1): Don't declare val with CONST.
Richard M. Stallman <rms@gnu.org>
parents:
18193
diff
changeset
|
135 val = (char *) re_compile_pattern ((char *) XSTRING (pattern)->data, |
12c0de0113af
(compile_pattern_1): Don't declare val with CONST.
Richard M. Stallman <rms@gnu.org>
parents:
18193
diff
changeset
|
136 XSTRING (pattern)->size, &cp->buf); |
10020
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
137 re_set_syntax (old); |
2439
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2393
diff
changeset
|
138 UNBLOCK_INPUT; |
603 | 139 if (val) |
9605
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
140 Fsignal (Qinvalid_regexp, Fcons (build_string (val), Qnil)); |
708 | 141 |
9605
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
142 cp->regexp = Fcopy_sequence (pattern); |
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
143 } |
708 | 144 |
9605
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
145 /* Compile a regexp if necessary, but first check to see if there's one in |
10020
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
146 the cache. |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
147 PATTERN is the pattern to compile. |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
148 TRANSLATE is a translation table for ignoring case, or NULL for none. |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
149 REGP is the structure that says where to store the "register" |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
150 values that will result from matching this pattern. |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
151 If it is 0, we should compile the pattern not to record any |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
152 subexpression bounds. |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
153 POSIX is nonzero if we want full backtracking (POSIX style) |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
154 for this pattern. 0 means backtrack only enough to get a valid match. */ |
9605
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
155 |
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
156 struct re_pattern_buffer * |
10020
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
157 compile_pattern (pattern, regp, translate, posix) |
9605
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
158 Lisp_Object pattern; |
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
159 struct re_registers *regp; |
13237
1aa239b8d03c
(compile_pattern_1, compile_pattern, search_buffer):
Richard M. Stallman <rms@gnu.org>
parents:
12807
diff
changeset
|
160 Lisp_Object *translate; |
10020
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
161 int posix; |
9605
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
162 { |
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
163 struct regexp_cache *cp, **cpp; |
17053
df904355f033
Include category.h and charset.h.
Karl Heuer <kwzh@gnu.org>
parents:
16880
diff
changeset
|
164 /* Should we check it here, or add an argument `multibyte' to this |
df904355f033
Include category.h and charset.h.
Karl Heuer <kwzh@gnu.org>
parents:
16880
diff
changeset
|
165 function? */ |
df904355f033
Include category.h and charset.h.
Karl Heuer <kwzh@gnu.org>
parents:
16880
diff
changeset
|
166 int multibyte = !NILP (current_buffer->enable_multibyte_characters); |
9605
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
167 |
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
168 for (cpp = &searchbuf_head; ; cpp = &cp->next) |
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
169 { |
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
170 cp = *cpp; |
16275
a4bcfdc9bb66
(REGEXP_CACHE_SIZE): Increase to 20.
Richard M. Stallman <rms@gnu.org>
parents:
16152
diff
changeset
|
171 if (XSTRING (cp->regexp)->size == XSTRING (pattern)->size |
a4bcfdc9bb66
(REGEXP_CACHE_SIZE): Increase to 20.
Richard M. Stallman <rms@gnu.org>
parents:
16152
diff
changeset
|
172 && !NILP (Fstring_equal (cp->regexp, pattern)) |
10020
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
173 && cp->buf.translate == translate |
17053
df904355f033
Include category.h and charset.h.
Karl Heuer <kwzh@gnu.org>
parents:
16880
diff
changeset
|
174 && cp->posix == posix |
df904355f033
Include category.h and charset.h.
Karl Heuer <kwzh@gnu.org>
parents:
16880
diff
changeset
|
175 && cp->buf.multibyte == multibyte) |
9605
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
176 break; |
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
177 |
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
178 /* If we're at the end of the cache, compile into the last cell. */ |
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
179 if (cp->next == 0) |
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
180 { |
17053
df904355f033
Include category.h and charset.h.
Karl Heuer <kwzh@gnu.org>
parents:
16880
diff
changeset
|
181 compile_pattern_1 (cp, pattern, translate, regp, posix, multibyte); |
9605
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
182 break; |
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
183 } |
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
184 } |
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
185 |
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
186 /* When we get here, cp (aka *cpp) contains the compiled pattern, |
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
187 either because we found it in the cache or because we just compiled it. |
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
188 Move it to the front of the queue to mark it as most recently used. */ |
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
189 *cpp = cp->next; |
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
190 cp->next = searchbuf_head; |
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
191 searchbuf_head = cp; |
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
192 |
10141
afe81fd385eb
(compile_pattern): Call re_set_registers here.
Richard M. Stallman <rms@gnu.org>
parents:
10128
diff
changeset
|
193 /* Advise the searching functions about the space we have allocated |
afe81fd385eb
(compile_pattern): Call re_set_registers here.
Richard M. Stallman <rms@gnu.org>
parents:
10128
diff
changeset
|
194 for register data. */ |
afe81fd385eb
(compile_pattern): Call re_set_registers here.
Richard M. Stallman <rms@gnu.org>
parents:
10128
diff
changeset
|
195 if (regp) |
afe81fd385eb
(compile_pattern): Call re_set_registers here.
Richard M. Stallman <rms@gnu.org>
parents:
10128
diff
changeset
|
196 re_set_registers (&cp->buf, regp, regp->num_regs, regp->start, regp->end); |
afe81fd385eb
(compile_pattern): Call re_set_registers here.
Richard M. Stallman <rms@gnu.org>
parents:
10128
diff
changeset
|
197 |
9605
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
198 return &cp->buf; |
603 | 199 } |
200 | |
201 /* Error condition used for failing searches */ | |
202 Lisp_Object Qsearch_failed; | |
203 | |
204 Lisp_Object | |
205 signal_failure (arg) | |
206 Lisp_Object arg; | |
207 { | |
208 Fsignal (Qsearch_failed, Fcons (arg, Qnil)); | |
209 return Qnil; | |
210 } | |
211 | |
10020
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
212 static Lisp_Object |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
213 looking_at_1 (string, posix) |
603 | 214 Lisp_Object string; |
10020
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
215 int posix; |
603 | 216 { |
217 Lisp_Object val; | |
218 unsigned char *p1, *p2; | |
219 int s1, s2; | |
220 register int i; | |
9605
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
221 struct re_pattern_buffer *bufp; |
603 | 222 |
10032
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
223 if (running_asynch_code) |
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
224 save_search_regs (); |
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
225 |
603 | 226 CHECK_STRING (string, 0); |
9605
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
227 bufp = compile_pattern (string, &search_regs, |
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
228 (!NILP (current_buffer->case_fold_search) |
18077
27a0ced43e7e
(Freplace_match): Use move_if_not_intangible
Richard M. Stallman <rms@gnu.org>
parents:
17463
diff
changeset
|
229 ? XCHAR_TABLE (DOWNCASE_TABLE)->contents : 0), |
10020
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
230 posix); |
603 | 231 |
232 immediate_quit = 1; | |
233 QUIT; /* Do a pending quit right away, to avoid paradoxical behavior */ | |
234 | |
235 /* Get pointers and sizes of the two strings | |
236 that make up the visible portion of the buffer. */ | |
237 | |
238 p1 = BEGV_ADDR; | |
239 s1 = GPT - BEGV; | |
240 p2 = GAP_END_ADDR; | |
241 s2 = ZV - GPT; | |
242 if (s1 < 0) | |
243 { | |
244 p2 = p1; | |
245 s2 = ZV - BEGV; | |
246 s1 = 0; | |
247 } | |
248 if (s2 < 0) | |
249 { | |
250 s1 = ZV - BEGV; | |
251 s2 = 0; | |
252 } | |
17463
bb9ae80d22e2
(looking_at_1): Set re_match_object.
Richard M. Stallman <rms@gnu.org>
parents:
17284
diff
changeset
|
253 |
bb9ae80d22e2
(looking_at_1): Set re_match_object.
Richard M. Stallman <rms@gnu.org>
parents:
17284
diff
changeset
|
254 re_match_object = Qnil; |
603 | 255 |
9605
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
256 i = re_match_2 (bufp, (char *) p1, s1, (char *) p2, s2, |
16039
855c8d8ba0f0
Change all references from point to PT.
Karl Heuer <kwzh@gnu.org>
parents:
15667
diff
changeset
|
257 PT - BEGV, &search_regs, |
603 | 258 ZV - BEGV); |
259 if (i == -2) | |
260 matcher_overflow (); | |
261 | |
262 val = (0 <= i ? Qt : Qnil); | |
621 | 263 for (i = 0; i < search_regs.num_regs; i++) |
603 | 264 if (search_regs.start[i] >= 0) |
265 { | |
266 search_regs.start[i] += BEGV; | |
267 search_regs.end[i] += BEGV; | |
268 } | |
9278
f2138d548313
(Flooking_at, skip_chars, search_buffer, set_search_regs, Fstore_match_data):
Karl Heuer <kwzh@gnu.org>
parents:
9113
diff
changeset
|
269 XSETBUFFER (last_thing_searched, current_buffer); |
603 | 270 immediate_quit = 0; |
271 return val; | |
272 } | |
273 | |
10020
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
274 DEFUN ("looking-at", Flooking_at, Slooking_at, 1, 1, 0, |
11213
d0811ba886f8
(Flooking_at, Fposix_looking_at): Change arg name.
Richard M. Stallman <rms@gnu.org>
parents:
10250
diff
changeset
|
275 "Return t if text after point matches regular expression REGEXP.\n\ |
10020
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
276 This function modifies the match data that `match-beginning',\n\ |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
277 `match-end' and `match-data' access; save and restore the match\n\ |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
278 data if you want to preserve them.") |
11213
d0811ba886f8
(Flooking_at, Fposix_looking_at): Change arg name.
Richard M. Stallman <rms@gnu.org>
parents:
10250
diff
changeset
|
279 (regexp) |
d0811ba886f8
(Flooking_at, Fposix_looking_at): Change arg name.
Richard M. Stallman <rms@gnu.org>
parents:
10250
diff
changeset
|
280 Lisp_Object regexp; |
10020
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
281 { |
11213
d0811ba886f8
(Flooking_at, Fposix_looking_at): Change arg name.
Richard M. Stallman <rms@gnu.org>
parents:
10250
diff
changeset
|
282 return looking_at_1 (regexp, 0); |
10020
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
283 } |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
284 |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
285 DEFUN ("posix-looking-at", Fposix_looking_at, Sposix_looking_at, 1, 1, 0, |
11213
d0811ba886f8
(Flooking_at, Fposix_looking_at): Change arg name.
Richard M. Stallman <rms@gnu.org>
parents:
10250
diff
changeset
|
286 "Return t if text after point matches regular expression REGEXP.\n\ |
10020
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
287 Find the longest match, in accord with Posix regular expression rules.\n\ |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
288 This function modifies the match data that `match-beginning',\n\ |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
289 `match-end' and `match-data' access; save and restore the match\n\ |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
290 data if you want to preserve them.") |
11213
d0811ba886f8
(Flooking_at, Fposix_looking_at): Change arg name.
Richard M. Stallman <rms@gnu.org>
parents:
10250
diff
changeset
|
291 (regexp) |
d0811ba886f8
(Flooking_at, Fposix_looking_at): Change arg name.
Richard M. Stallman <rms@gnu.org>
parents:
10250
diff
changeset
|
292 Lisp_Object regexp; |
10020
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
293 { |
11213
d0811ba886f8
(Flooking_at, Fposix_looking_at): Change arg name.
Richard M. Stallman <rms@gnu.org>
parents:
10250
diff
changeset
|
294 return looking_at_1 (regexp, 1); |
10020
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
295 } |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
296 |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
297 static Lisp_Object |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
298 string_match_1 (regexp, string, start, posix) |
603 | 299 Lisp_Object regexp, string, start; |
10020
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
300 int posix; |
603 | 301 { |
302 int val; | |
303 int s; | |
9605
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
304 struct re_pattern_buffer *bufp; |
603 | 305 |
10032
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
306 if (running_asynch_code) |
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
307 save_search_regs (); |
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
308 |
603 | 309 CHECK_STRING (regexp, 0); |
310 CHECK_STRING (string, 1); | |
311 | |
312 if (NILP (start)) | |
313 s = 0; | |
314 else | |
315 { | |
316 int len = XSTRING (string)->size; | |
317 | |
318 CHECK_NUMBER (start, 2); | |
319 s = XINT (start); | |
320 if (s < 0 && -s <= len) | |
8584
4f0a475b1fa9
(Fstring_match): Fix sign error.
Karl Heuer <kwzh@gnu.org>
parents:
8526
diff
changeset
|
321 s = len + s; |
603 | 322 else if (0 > s || s > len) |
323 args_out_of_range (string, start); | |
324 } | |
325 | |
9605
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
326 bufp = compile_pattern (regexp, &search_regs, |
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
327 (!NILP (current_buffer->case_fold_search) |
18077
27a0ced43e7e
(Freplace_match): Use move_if_not_intangible
Richard M. Stallman <rms@gnu.org>
parents:
17463
diff
changeset
|
328 ? XCHAR_TABLE (DOWNCASE_TABLE)->contents : 0), |
13295
bc92156aa523
(string_match_1): Pass the POSIX arg to compile_pattern.
Richard M. Stallman <rms@gnu.org>
parents:
13237
diff
changeset
|
329 posix); |
603 | 330 immediate_quit = 1; |
17463
bb9ae80d22e2
(looking_at_1): Set re_match_object.
Richard M. Stallman <rms@gnu.org>
parents:
17284
diff
changeset
|
331 re_match_object = string; |
bb9ae80d22e2
(looking_at_1): Set re_match_object.
Richard M. Stallman <rms@gnu.org>
parents:
17284
diff
changeset
|
332 |
9605
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
333 val = re_search (bufp, (char *) XSTRING (string)->data, |
603 | 334 XSTRING (string)->size, s, XSTRING (string)->size - s, |
335 &search_regs); | |
336 immediate_quit = 0; | |
727 | 337 last_thing_searched = Qt; |
603 | 338 if (val == -2) |
339 matcher_overflow (); | |
340 if (val < 0) return Qnil; | |
341 return make_number (val); | |
342 } | |
842 | 343 |
10020
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
344 DEFUN ("string-match", Fstring_match, Sstring_match, 2, 3, 0, |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
345 "Return index of start of first match for REGEXP in STRING, or nil.\n\ |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
346 If third arg START is non-nil, start search at that index in STRING.\n\ |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
347 For index of first char beyond the match, do (match-end 0).\n\ |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
348 `match-end' and `match-beginning' also give indices of substrings\n\ |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
349 matched by parenthesis constructs in the pattern.") |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
350 (regexp, string, start) |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
351 Lisp_Object regexp, string, start; |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
352 { |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
353 return string_match_1 (regexp, string, start, 0); |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
354 } |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
355 |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
356 DEFUN ("posix-string-match", Fposix_string_match, Sposix_string_match, 2, 3, 0, |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
357 "Return index of start of first match for REGEXP in STRING, or nil.\n\ |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
358 Find the longest match, in accord with Posix regular expression rules.\n\ |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
359 If third arg START is non-nil, start search at that index in STRING.\n\ |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
360 For index of first char beyond the match, do (match-end 0).\n\ |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
361 `match-end' and `match-beginning' also give indices of substrings\n\ |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
362 matched by parenthesis constructs in the pattern.") |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
363 (regexp, string, start) |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
364 Lisp_Object regexp, string, start; |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
365 { |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
366 return string_match_1 (regexp, string, start, 1); |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
367 } |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
368 |
842 | 369 /* Match REGEXP against STRING, searching all of STRING, |
370 and return the index of the match, or negative on failure. | |
371 This does not clobber the match data. */ | |
372 | |
373 int | |
374 fast_string_match (regexp, string) | |
375 Lisp_Object regexp, string; | |
376 { | |
377 int val; | |
9605
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
378 struct re_pattern_buffer *bufp; |
842 | 379 |
10020
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
380 bufp = compile_pattern (regexp, 0, 0, 0); |
842 | 381 immediate_quit = 1; |
17463
bb9ae80d22e2
(looking_at_1): Set re_match_object.
Richard M. Stallman <rms@gnu.org>
parents:
17284
diff
changeset
|
382 re_match_object = string; |
bb9ae80d22e2
(looking_at_1): Set re_match_object.
Richard M. Stallman <rms@gnu.org>
parents:
17284
diff
changeset
|
383 |
9605
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
384 val = re_search (bufp, (char *) XSTRING (string)->data, |
842 | 385 XSTRING (string)->size, 0, XSTRING (string)->size, |
386 0); | |
387 immediate_quit = 0; | |
388 return val; | |
389 } | |
17053
df904355f033
Include category.h and charset.h.
Karl Heuer <kwzh@gnu.org>
parents:
16880
diff
changeset
|
390 |
df904355f033
Include category.h and charset.h.
Karl Heuer <kwzh@gnu.org>
parents:
16880
diff
changeset
|
391 /* Match REGEXP against STRING, searching all of STRING ignoring case, |
df904355f033
Include category.h and charset.h.
Karl Heuer <kwzh@gnu.org>
parents:
16880
diff
changeset
|
392 and return the index of the match, or negative on failure. |
df904355f033
Include category.h and charset.h.
Karl Heuer <kwzh@gnu.org>
parents:
16880
diff
changeset
|
393 This does not clobber the match data. */ |
df904355f033
Include category.h and charset.h.
Karl Heuer <kwzh@gnu.org>
parents:
16880
diff
changeset
|
394 |
df904355f033
Include category.h and charset.h.
Karl Heuer <kwzh@gnu.org>
parents:
16880
diff
changeset
|
395 extern Lisp_Object Vascii_downcase_table; |
df904355f033
Include category.h and charset.h.
Karl Heuer <kwzh@gnu.org>
parents:
16880
diff
changeset
|
396 |
df904355f033
Include category.h and charset.h.
Karl Heuer <kwzh@gnu.org>
parents:
16880
diff
changeset
|
397 int |
18193
4e4c8edb56da
(fast_c_string_match_ignore_case):
Richard M. Stallman <rms@gnu.org>
parents:
18124
diff
changeset
|
398 fast_c_string_match_ignore_case (regexp, string) |
17053
df904355f033
Include category.h and charset.h.
Karl Heuer <kwzh@gnu.org>
parents:
16880
diff
changeset
|
399 Lisp_Object regexp; |
df904355f033
Include category.h and charset.h.
Karl Heuer <kwzh@gnu.org>
parents:
16880
diff
changeset
|
400 char *string; |
df904355f033
Include category.h and charset.h.
Karl Heuer <kwzh@gnu.org>
parents:
16880
diff
changeset
|
401 { |
df904355f033
Include category.h and charset.h.
Karl Heuer <kwzh@gnu.org>
parents:
16880
diff
changeset
|
402 int val; |
df904355f033
Include category.h and charset.h.
Karl Heuer <kwzh@gnu.org>
parents:
16880
diff
changeset
|
403 struct re_pattern_buffer *bufp; |
df904355f033
Include category.h and charset.h.
Karl Heuer <kwzh@gnu.org>
parents:
16880
diff
changeset
|
404 int len = strlen (string); |
df904355f033
Include category.h and charset.h.
Karl Heuer <kwzh@gnu.org>
parents:
16880
diff
changeset
|
405 |
18193
4e4c8edb56da
(fast_c_string_match_ignore_case):
Richard M. Stallman <rms@gnu.org>
parents:
18124
diff
changeset
|
406 re_match_object = Qt; |
17053
df904355f033
Include category.h and charset.h.
Karl Heuer <kwzh@gnu.org>
parents:
16880
diff
changeset
|
407 bufp = compile_pattern (regexp, 0, |
df904355f033
Include category.h and charset.h.
Karl Heuer <kwzh@gnu.org>
parents:
16880
diff
changeset
|
408 XCHAR_TABLE (Vascii_downcase_table)->contents, 0); |
df904355f033
Include category.h and charset.h.
Karl Heuer <kwzh@gnu.org>
parents:
16880
diff
changeset
|
409 immediate_quit = 1; |
df904355f033
Include category.h and charset.h.
Karl Heuer <kwzh@gnu.org>
parents:
16880
diff
changeset
|
410 val = re_search (bufp, string, len, 0, len, 0); |
df904355f033
Include category.h and charset.h.
Karl Heuer <kwzh@gnu.org>
parents:
16880
diff
changeset
|
411 immediate_quit = 0; |
df904355f033
Include category.h and charset.h.
Karl Heuer <kwzh@gnu.org>
parents:
16880
diff
changeset
|
412 return val; |
df904355f033
Include category.h and charset.h.
Karl Heuer <kwzh@gnu.org>
parents:
16880
diff
changeset
|
413 } |
603 | 414 |
9410
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
415 /* max and min. */ |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
416 |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
417 static int |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
418 max (a, b) |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
419 int a, b; |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
420 { |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
421 return ((a > b) ? a : b); |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
422 } |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
423 |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
424 static int |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
425 min (a, b) |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
426 int a, b; |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
427 { |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
428 return ((a < b) ? a : b); |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
429 } |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
430 |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
431 |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
432 /* The newline cache: remembering which sections of text have no newlines. */ |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
433 |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
434 /* If the user has requested newline caching, make sure it's on. |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
435 Otherwise, make sure it's off. |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
436 This is our cheezy way of associating an action with the change of |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
437 state of a buffer-local variable. */ |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
438 static void |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
439 newline_cache_on_off (buf) |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
440 struct buffer *buf; |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
441 { |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
442 if (NILP (buf->cache_long_line_scans)) |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
443 { |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
444 /* It should be off. */ |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
445 if (buf->newline_cache) |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
446 { |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
447 free_region_cache (buf->newline_cache); |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
448 buf->newline_cache = 0; |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
449 } |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
450 } |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
451 else |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
452 { |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
453 /* It should be on. */ |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
454 if (buf->newline_cache == 0) |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
455 buf->newline_cache = new_region_cache (); |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
456 } |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
457 } |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
458 |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
459 |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
460 /* Search for COUNT instances of the character TARGET between START and END. |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
461 |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
462 If COUNT is positive, search forwards; END must be >= START. |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
463 If COUNT is negative, search backwards for the -COUNTth instance; |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
464 END must be <= START. |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
465 If COUNT is zero, do anything you please; run rogue, for all I care. |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
466 |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
467 If END is zero, use BEGV or ZV instead, as appropriate for the |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
468 direction indicated by COUNT. |
648 | 469 |
470 If we find COUNT instances, set *SHORTAGE to zero, and return the | |
1413 | 471 position after the COUNTth match. Note that for reverse motion |
472 this is not the same as the usual convention for Emacs motion commands. | |
648 | 473 |
9410
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
474 If we don't find COUNT instances before reaching END, set *SHORTAGE |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
475 to the number of TARGETs left unfound, and return END. |
648 | 476 |
5756
a54c236b43c6
(scan_buffer): New arg ALLOW_QUIT.
Richard M. Stallman <rms@gnu.org>
parents:
5556
diff
changeset
|
477 If ALLOW_QUIT is non-zero, set immediate_quit. That's good to do |
a54c236b43c6
(scan_buffer): New arg ALLOW_QUIT.
Richard M. Stallman <rms@gnu.org>
parents:
5556
diff
changeset
|
478 except when inside redisplay. */ |
a54c236b43c6
(scan_buffer): New arg ALLOW_QUIT.
Richard M. Stallman <rms@gnu.org>
parents:
5556
diff
changeset
|
479 |
9410
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
480 scan_buffer (target, start, end, count, shortage, allow_quit) |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
481 register int target; |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
482 int start, end; |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
483 int count; |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
484 int *shortage; |
5756
a54c236b43c6
(scan_buffer): New arg ALLOW_QUIT.
Richard M. Stallman <rms@gnu.org>
parents:
5556
diff
changeset
|
485 int allow_quit; |
603 | 486 { |
9410
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
487 struct region_cache *newline_cache; |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
488 int direction; |
648 | 489 |
9410
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
490 if (count > 0) |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
491 { |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
492 direction = 1; |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
493 if (! end) end = ZV; |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
494 } |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
495 else |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
496 { |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
497 direction = -1; |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
498 if (! end) end = BEGV; |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
499 } |
648 | 500 |
9410
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
501 newline_cache_on_off (current_buffer); |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
502 newline_cache = current_buffer->newline_cache; |
603 | 503 |
504 if (shortage != 0) | |
505 *shortage = 0; | |
506 | |
5756
a54c236b43c6
(scan_buffer): New arg ALLOW_QUIT.
Richard M. Stallman <rms@gnu.org>
parents:
5556
diff
changeset
|
507 immediate_quit = allow_quit; |
603 | 508 |
648 | 509 if (count > 0) |
9410
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
510 while (start != end) |
603 | 511 { |
9410
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
512 /* Our innermost scanning loop is very simple; it doesn't know |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
513 about gaps, buffer ends, or the newline cache. ceiling is |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
514 the position of the last character before the next such |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
515 obstacle --- the last character the dumb search loop should |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
516 examine. */ |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
517 register int ceiling = end - 1; |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
518 |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
519 /* If we're looking for a newline, consult the newline cache |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
520 to see where we can avoid some scanning. */ |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
521 if (target == '\n' && newline_cache) |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
522 { |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
523 int next_change; |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
524 immediate_quit = 0; |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
525 while (region_cache_forward |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
526 (current_buffer, newline_cache, start, &next_change)) |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
527 start = next_change; |
9452
76f75b9091f1
(scan_buffer): After temporarily turning immediate_quit off, turn it
Jim Blandy <jimb@redhat.com>
parents:
9410
diff
changeset
|
528 immediate_quit = allow_quit; |
9410
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
529 |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
530 /* start should never be after end. */ |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
531 if (start >= end) |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
532 start = end - 1; |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
533 |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
534 /* Now the text after start is an unknown region, and |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
535 next_change is the position of the next known region. */ |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
536 ceiling = min (next_change - 1, ceiling); |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
537 } |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
538 |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
539 /* The dumb loop can only scan text stored in contiguous |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
540 bytes. BUFFER_CEILING_OF returns the last character |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
541 position that is contiguous, so the ceiling is the |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
542 position after that. */ |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
543 ceiling = min (BUFFER_CEILING_OF (start), ceiling); |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
544 |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
545 { |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
546 /* The termination address of the dumb loop. */ |
17053
df904355f033
Include category.h and charset.h.
Karl Heuer <kwzh@gnu.org>
parents:
16880
diff
changeset
|
547 register unsigned char *ceiling_addr = POS_ADDR (ceiling) + 1; |
df904355f033
Include category.h and charset.h.
Karl Heuer <kwzh@gnu.org>
parents:
16880
diff
changeset
|
548 register unsigned char *cursor = POS_ADDR (start); |
9410
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
549 unsigned char *base = cursor; |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
550 |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
551 while (cursor < ceiling_addr) |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
552 { |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
553 unsigned char *scan_start = cursor; |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
554 |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
555 /* The dumb loop. */ |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
556 while (*cursor != target && ++cursor < ceiling_addr) |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
557 ; |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
558 |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
559 /* If we're looking for newlines, cache the fact that |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
560 the region from start to cursor is free of them. */ |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
561 if (target == '\n' && newline_cache) |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
562 know_region_cache (current_buffer, newline_cache, |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
563 start + scan_start - base, |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
564 start + cursor - base); |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
565 |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
566 /* Did we find the target character? */ |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
567 if (cursor < ceiling_addr) |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
568 { |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
569 if (--count == 0) |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
570 { |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
571 immediate_quit = 0; |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
572 return (start + cursor - base + 1); |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
573 } |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
574 cursor++; |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
575 } |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
576 } |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
577 |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
578 start += cursor - base; |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
579 } |
603 | 580 } |
581 else | |
9410
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
582 while (start > end) |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
583 { |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
584 /* The last character to check before the next obstacle. */ |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
585 register int ceiling = end; |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
586 |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
587 /* Consult the newline cache, if appropriate. */ |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
588 if (target == '\n' && newline_cache) |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
589 { |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
590 int next_change; |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
591 immediate_quit = 0; |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
592 while (region_cache_backward |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
593 (current_buffer, newline_cache, start, &next_change)) |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
594 start = next_change; |
9452
76f75b9091f1
(scan_buffer): After temporarily turning immediate_quit off, turn it
Jim Blandy <jimb@redhat.com>
parents:
9410
diff
changeset
|
595 immediate_quit = allow_quit; |
9410
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
596 |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
597 /* Start should never be at or before end. */ |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
598 if (start <= end) |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
599 start = end + 1; |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
600 |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
601 /* Now the text before start is an unknown region, and |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
602 next_change is the position of the next known region. */ |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
603 ceiling = max (next_change, ceiling); |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
604 } |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
605 |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
606 /* Stop scanning before the gap. */ |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
607 ceiling = max (BUFFER_FLOOR_OF (start - 1), ceiling); |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
608 |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
609 { |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
610 /* The termination address of the dumb loop. */ |
17053
df904355f033
Include category.h and charset.h.
Karl Heuer <kwzh@gnu.org>
parents:
16880
diff
changeset
|
611 register unsigned char *ceiling_addr = POS_ADDR (ceiling); |
df904355f033
Include category.h and charset.h.
Karl Heuer <kwzh@gnu.org>
parents:
16880
diff
changeset
|
612 register unsigned char *cursor = POS_ADDR (start - 1); |
9410
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
613 unsigned char *base = cursor; |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
614 |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
615 while (cursor >= ceiling_addr) |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
616 { |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
617 unsigned char *scan_start = cursor; |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
618 |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
619 while (*cursor != target && --cursor >= ceiling_addr) |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
620 ; |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
621 |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
622 /* If we're looking for newlines, cache the fact that |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
623 the region from after the cursor to start is free of them. */ |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
624 if (target == '\n' && newline_cache) |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
625 know_region_cache (current_buffer, newline_cache, |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
626 start + cursor - base, |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
627 start + scan_start - base); |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
628 |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
629 /* Did we find the target character? */ |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
630 if (cursor >= ceiling_addr) |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
631 { |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
632 if (++count >= 0) |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
633 { |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
634 immediate_quit = 0; |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
635 return (start + cursor - base); |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
636 } |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
637 cursor--; |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
638 } |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
639 } |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
640 |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
641 start += cursor - base; |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
642 } |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
643 } |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
644 |
603 | 645 immediate_quit = 0; |
646 if (shortage != 0) | |
648 | 647 *shortage = count * direction; |
9410
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
648 return start; |
603 | 649 } |
650 | |
651 int | |
7891
7d8e0f338e4a
(find_next_newline_no_quit): New function.
Richard M. Stallman <rms@gnu.org>
parents:
7856
diff
changeset
|
652 find_next_newline_no_quit (from, cnt) |
7d8e0f338e4a
(find_next_newline_no_quit): New function.
Richard M. Stallman <rms@gnu.org>
parents:
7856
diff
changeset
|
653 register int from, cnt; |
7d8e0f338e4a
(find_next_newline_no_quit): New function.
Richard M. Stallman <rms@gnu.org>
parents:
7856
diff
changeset
|
654 { |
9410
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
655 return scan_buffer ('\n', from, 0, cnt, (int *) 0, 0); |
7891
7d8e0f338e4a
(find_next_newline_no_quit): New function.
Richard M. Stallman <rms@gnu.org>
parents:
7856
diff
changeset
|
656 } |
7d8e0f338e4a
(find_next_newline_no_quit): New function.
Richard M. Stallman <rms@gnu.org>
parents:
7856
diff
changeset
|
657 |
7d8e0f338e4a
(find_next_newline_no_quit): New function.
Richard M. Stallman <rms@gnu.org>
parents:
7856
diff
changeset
|
658 int |
603 | 659 find_next_newline (from, cnt) |
660 register int from, cnt; | |
661 { | |
9410
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
662 return scan_buffer ('\n', from, 0, cnt, (int *) 0, 1); |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
663 } |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
664 |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
665 |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
666 /* Like find_next_newline, but returns position before the newline, |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
667 not after, and only search up to TO. This isn't just |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
668 find_next_newline (...)-1, because you might hit TO. */ |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
669 int |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
670 find_before_next_newline (from, to, cnt) |
9452
76f75b9091f1
(scan_buffer): After temporarily turning immediate_quit off, turn it
Jim Blandy <jimb@redhat.com>
parents:
9410
diff
changeset
|
671 int from, to, cnt; |
9410
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
672 { |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
673 int shortage; |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
674 int pos = scan_buffer ('\n', from, to, cnt, &shortage, 1); |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
675 |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
676 if (shortage == 0) |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
677 pos--; |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
678 |
8598c3d6f2f0
* search.c: #include "region-cache.h".
Jim Blandy <jimb@redhat.com>
parents:
9319
diff
changeset
|
679 return pos; |
603 | 680 } |
681 | |
682 /* Subroutines of Lisp buffer search functions. */ | |
683 | |
684 static Lisp_Object | |
10020
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
685 search_command (string, bound, noerror, count, direction, RE, posix) |
603 | 686 Lisp_Object string, bound, noerror, count; |
687 int direction; | |
688 int RE; | |
10020
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
689 int posix; |
603 | 690 { |
691 register int np; | |
692 int lim; | |
693 int n = direction; | |
694 | |
695 if (!NILP (count)) | |
696 { | |
697 CHECK_NUMBER (count, 3); | |
698 n *= XINT (count); | |
699 } | |
700 | |
701 CHECK_STRING (string, 0); | |
702 if (NILP (bound)) | |
703 lim = n > 0 ? ZV : BEGV; | |
704 else | |
705 { | |
706 CHECK_NUMBER_COERCE_MARKER (bound, 1); | |
707 lim = XINT (bound); | |
16039
855c8d8ba0f0
Change all references from point to PT.
Karl Heuer <kwzh@gnu.org>
parents:
15667
diff
changeset
|
708 if (n > 0 ? lim < PT : lim > PT) |
603 | 709 error ("Invalid search bound (wrong side of point)"); |
710 if (lim > ZV) | |
711 lim = ZV; | |
712 if (lim < BEGV) | |
713 lim = BEGV; | |
714 } | |
715 | |
16039
855c8d8ba0f0
Change all references from point to PT.
Karl Heuer <kwzh@gnu.org>
parents:
15667
diff
changeset
|
716 np = search_buffer (string, PT, lim, n, RE, |
603 | 717 (!NILP (current_buffer->case_fold_search) |
13237
1aa239b8d03c
(compile_pattern_1, compile_pattern, search_buffer):
Richard M. Stallman <rms@gnu.org>
parents:
12807
diff
changeset
|
718 ? XCHAR_TABLE (current_buffer->case_canon_table)->contents |
1aa239b8d03c
(compile_pattern_1, compile_pattern, search_buffer):
Richard M. Stallman <rms@gnu.org>
parents:
12807
diff
changeset
|
719 : 0), |
603 | 720 (!NILP (current_buffer->case_fold_search) |
13237
1aa239b8d03c
(compile_pattern_1, compile_pattern, search_buffer):
Richard M. Stallman <rms@gnu.org>
parents:
12807
diff
changeset
|
721 ? XCHAR_TABLE (current_buffer->case_eqv_table)->contents |
1aa239b8d03c
(compile_pattern_1, compile_pattern, search_buffer):
Richard M. Stallman <rms@gnu.org>
parents:
12807
diff
changeset
|
722 : 0), |
10020
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
723 posix); |
603 | 724 if (np <= 0) |
725 { | |
726 if (NILP (noerror)) | |
727 return signal_failure (string); | |
728 if (!EQ (noerror, Qt)) | |
729 { | |
730 if (lim < BEGV || lim > ZV) | |
731 abort (); | |
1878
1c26d0049d4f
(search_command): #if 0 previous change.
Richard M. Stallman <rms@gnu.org>
parents:
1877
diff
changeset
|
732 SET_PT (lim); |
1c26d0049d4f
(search_command): #if 0 previous change.
Richard M. Stallman <rms@gnu.org>
parents:
1877
diff
changeset
|
733 return Qnil; |
1c26d0049d4f
(search_command): #if 0 previous change.
Richard M. Stallman <rms@gnu.org>
parents:
1877
diff
changeset
|
734 #if 0 /* This would be clean, but maybe programs depend on |
1c26d0049d4f
(search_command): #if 0 previous change.
Richard M. Stallman <rms@gnu.org>
parents:
1877
diff
changeset
|
735 a value of nil here. */ |
1877
7786f61ec635
(search_command): When moving to LIM on failure, return LIM.
Richard M. Stallman <rms@gnu.org>
parents:
1684
diff
changeset
|
736 np = lim; |
1878
1c26d0049d4f
(search_command): #if 0 previous change.
Richard M. Stallman <rms@gnu.org>
parents:
1877
diff
changeset
|
737 #endif |
603 | 738 } |
1877
7786f61ec635
(search_command): When moving to LIM on failure, return LIM.
Richard M. Stallman <rms@gnu.org>
parents:
1684
diff
changeset
|
739 else |
7786f61ec635
(search_command): When moving to LIM on failure, return LIM.
Richard M. Stallman <rms@gnu.org>
parents:
1684
diff
changeset
|
740 return Qnil; |
603 | 741 } |
742 | |
743 if (np < BEGV || np > ZV) | |
744 abort (); | |
745 | |
746 SET_PT (np); | |
747 | |
748 return make_number (np); | |
749 } | |
750 | |
8950
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
751 static int |
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
752 trivial_regexp_p (regexp) |
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
753 Lisp_Object regexp; |
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
754 { |
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
755 int len = XSTRING (regexp)->size; |
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
756 unsigned char *s = XSTRING (regexp)->data; |
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
757 unsigned char c; |
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
758 while (--len >= 0) |
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
759 { |
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
760 switch (*s++) |
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
761 { |
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
762 case '.': case '*': case '+': case '?': case '[': case '^': case '$': |
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
763 return 0; |
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
764 case '\\': |
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
765 if (--len < 0) |
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
766 return 0; |
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
767 switch (*s++) |
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
768 { |
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
769 case '|': case '(': case ')': case '`': case '\'': case 'b': |
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
770 case 'B': case '<': case '>': case 'w': case 'W': case 's': |
12069
505dc29a68cf
(trivial_regexp_p): = is special after \.
Karl Heuer <kwzh@gnu.org>
parents:
11678
diff
changeset
|
771 case 'S': case '=': |
17053
df904355f033
Include category.h and charset.h.
Karl Heuer <kwzh@gnu.org>
parents:
16880
diff
changeset
|
772 case 'c': case 'C': /* for categoryspec and notcategoryspec */ |
12069
505dc29a68cf
(trivial_regexp_p): = is special after \.
Karl Heuer <kwzh@gnu.org>
parents:
11678
diff
changeset
|
773 case '1': case '2': case '3': case '4': case '5': |
8950
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
774 case '6': case '7': case '8': case '9': |
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
775 return 0; |
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
776 } |
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
777 } |
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
778 } |
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
779 return 1; |
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
780 } |
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
781 |
5556
14161cfec24a
(set_search_regs): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
4954
diff
changeset
|
782 /* Search for the n'th occurrence of STRING in the current buffer, |
603 | 783 starting at position POS and stopping at position LIM, |
10020
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
784 treating STRING as a literal string if RE is false or as |
603 | 785 a regular expression if RE is true. |
786 | |
787 If N is positive, searching is forward and LIM must be greater than POS. | |
788 If N is negative, searching is backward and LIM must be less than POS. | |
789 | |
790 Returns -x if only N-x occurrences found (x > 0), | |
791 or else the position at the beginning of the Nth occurrence | |
10020
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
792 (if searching backward) or the end (if searching forward). |
603 | 793 |
10020
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
794 POSIX is nonzero if we want full backtracking (POSIX style) |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
795 for this pattern. 0 means backtrack only enough to get a valid match. */ |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
796 |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
797 static int |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
798 search_buffer (string, pos, lim, n, RE, trt, inverse_trt, posix) |
603 | 799 Lisp_Object string; |
800 int pos; | |
801 int lim; | |
802 int n; | |
803 int RE; | |
13237
1aa239b8d03c
(compile_pattern_1, compile_pattern, search_buffer):
Richard M. Stallman <rms@gnu.org>
parents:
12807
diff
changeset
|
804 Lisp_Object *trt; |
1aa239b8d03c
(compile_pattern_1, compile_pattern, search_buffer):
Richard M. Stallman <rms@gnu.org>
parents:
12807
diff
changeset
|
805 Lisp_Object *inverse_trt; |
10020
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
806 int posix; |
603 | 807 { |
808 int len = XSTRING (string)->size; | |
809 unsigned char *base_pat = XSTRING (string)->data; | |
810 register int *BM_tab; | |
811 int *BM_tab_base; | |
812 register int direction = ((n > 0) ? 1 : -1); | |
813 register int dirlen; | |
814 int infinity, limit, k, stride_for_teases; | |
815 register unsigned char *pat, *cursor, *p_limit; | |
816 register int i, j; | |
817 unsigned char *p1, *p2; | |
818 int s1, s2; | |
819 | |
10032
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
820 if (running_asynch_code) |
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
821 save_search_regs (); |
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
822 |
603 | 823 /* Null string is found at starting position. */ |
4299
7a2e1d7362c5
(search_buffer): If n is 0, just return POS.
Richard M. Stallman <rms@gnu.org>
parents:
3615
diff
changeset
|
824 if (len == 0) |
5556
14161cfec24a
(set_search_regs): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
4954
diff
changeset
|
825 { |
14161cfec24a
(set_search_regs): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
4954
diff
changeset
|
826 set_search_regs (pos, 0); |
14161cfec24a
(set_search_regs): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
4954
diff
changeset
|
827 return pos; |
14161cfec24a
(set_search_regs): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
4954
diff
changeset
|
828 } |
4299
7a2e1d7362c5
(search_buffer): If n is 0, just return POS.
Richard M. Stallman <rms@gnu.org>
parents:
3615
diff
changeset
|
829 |
7a2e1d7362c5
(search_buffer): If n is 0, just return POS.
Richard M. Stallman <rms@gnu.org>
parents:
3615
diff
changeset
|
830 /* Searching 0 times means don't move. */ |
7a2e1d7362c5
(search_buffer): If n is 0, just return POS.
Richard M. Stallman <rms@gnu.org>
parents:
3615
diff
changeset
|
831 if (n == 0) |
603 | 832 return pos; |
833 | |
8950
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
834 if (RE && !trivial_regexp_p (string)) |
603 | 835 { |
9605
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
836 struct re_pattern_buffer *bufp; |
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
837 |
13237
1aa239b8d03c
(compile_pattern_1, compile_pattern, search_buffer):
Richard M. Stallman <rms@gnu.org>
parents:
12807
diff
changeset
|
838 bufp = compile_pattern (string, &search_regs, trt, posix); |
603 | 839 |
840 immediate_quit = 1; /* Quit immediately if user types ^G, | |
841 because letting this function finish | |
842 can take too long. */ | |
843 QUIT; /* Do a pending quit right away, | |
844 to avoid paradoxical behavior */ | |
845 /* Get pointers and sizes of the two strings | |
846 that make up the visible portion of the buffer. */ | |
847 | |
848 p1 = BEGV_ADDR; | |
849 s1 = GPT - BEGV; | |
850 p2 = GAP_END_ADDR; | |
851 s2 = ZV - GPT; | |
852 if (s1 < 0) | |
853 { | |
854 p2 = p1; | |
855 s2 = ZV - BEGV; | |
856 s1 = 0; | |
857 } | |
858 if (s2 < 0) | |
859 { | |
860 s1 = ZV - BEGV; | |
861 s2 = 0; | |
862 } | |
17463
bb9ae80d22e2
(looking_at_1): Set re_match_object.
Richard M. Stallman <rms@gnu.org>
parents:
17284
diff
changeset
|
863 re_match_object = Qnil; |
bb9ae80d22e2
(looking_at_1): Set re_match_object.
Richard M. Stallman <rms@gnu.org>
parents:
17284
diff
changeset
|
864 |
603 | 865 while (n < 0) |
866 { | |
2475
052bbdf1b817
(search_buffer): Fix typo in previous change.
Richard M. Stallman <rms@gnu.org>
parents:
2439
diff
changeset
|
867 int val; |
9605
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
868 val = re_search_2 (bufp, (char *) p1, s1, (char *) p2, s2, |
2475
052bbdf1b817
(search_buffer): Fix typo in previous change.
Richard M. Stallman <rms@gnu.org>
parents:
2439
diff
changeset
|
869 pos - BEGV, lim - pos, &search_regs, |
052bbdf1b817
(search_buffer): Fix typo in previous change.
Richard M. Stallman <rms@gnu.org>
parents:
2439
diff
changeset
|
870 /* Don't allow match past current point */ |
052bbdf1b817
(search_buffer): Fix typo in previous change.
Richard M. Stallman <rms@gnu.org>
parents:
2439
diff
changeset
|
871 pos - BEGV); |
603 | 872 if (val == -2) |
8950
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
873 { |
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
874 matcher_overflow (); |
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
875 } |
603 | 876 if (val >= 0) |
877 { | |
878 j = BEGV; | |
621 | 879 for (i = 0; i < search_regs.num_regs; i++) |
603 | 880 if (search_regs.start[i] >= 0) |
881 { | |
882 search_regs.start[i] += j; | |
883 search_regs.end[i] += j; | |
884 } | |
9278
f2138d548313
(Flooking_at, skip_chars, search_buffer, set_search_regs, Fstore_match_data):
Karl Heuer <kwzh@gnu.org>
parents:
9113
diff
changeset
|
885 XSETBUFFER (last_thing_searched, current_buffer); |
603 | 886 /* Set pos to the new position. */ |
887 pos = search_regs.start[0]; | |
888 } | |
889 else | |
890 { | |
891 immediate_quit = 0; | |
892 return (n); | |
893 } | |
894 n++; | |
895 } | |
896 while (n > 0) | |
897 { | |
2475
052bbdf1b817
(search_buffer): Fix typo in previous change.
Richard M. Stallman <rms@gnu.org>
parents:
2439
diff
changeset
|
898 int val; |
9605
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
899 val = re_search_2 (bufp, (char *) p1, s1, (char *) p2, s2, |
2475
052bbdf1b817
(search_buffer): Fix typo in previous change.
Richard M. Stallman <rms@gnu.org>
parents:
2439
diff
changeset
|
900 pos - BEGV, lim - pos, &search_regs, |
052bbdf1b817
(search_buffer): Fix typo in previous change.
Richard M. Stallman <rms@gnu.org>
parents:
2439
diff
changeset
|
901 lim - BEGV); |
603 | 902 if (val == -2) |
8950
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
903 { |
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
904 matcher_overflow (); |
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
905 } |
603 | 906 if (val >= 0) |
907 { | |
908 j = BEGV; | |
621 | 909 for (i = 0; i < search_regs.num_regs; i++) |
603 | 910 if (search_regs.start[i] >= 0) |
911 { | |
912 search_regs.start[i] += j; | |
913 search_regs.end[i] += j; | |
914 } | |
9278
f2138d548313
(Flooking_at, skip_chars, search_buffer, set_search_regs, Fstore_match_data):
Karl Heuer <kwzh@gnu.org>
parents:
9113
diff
changeset
|
915 XSETBUFFER (last_thing_searched, current_buffer); |
603 | 916 pos = search_regs.end[0]; |
917 } | |
918 else | |
919 { | |
920 immediate_quit = 0; | |
921 return (0 - n); | |
922 } | |
923 n--; | |
924 } | |
925 immediate_quit = 0; | |
926 return (pos); | |
927 } | |
928 else /* non-RE case */ | |
929 { | |
930 #ifdef C_ALLOCA | |
931 int BM_tab_space[0400]; | |
932 BM_tab = &BM_tab_space[0]; | |
933 #else | |
934 BM_tab = (int *) alloca (0400 * sizeof (int)); | |
935 #endif | |
8950
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
936 { |
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
937 unsigned char *patbuf = (unsigned char *) alloca (len); |
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
938 pat = patbuf; |
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
939 while (--len >= 0) |
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
940 { |
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
941 /* If we got here and the RE flag is set, it's because we're |
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
942 dealing with a regexp known to be trivial, so the backslash |
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
943 just quotes the next character. */ |
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
944 if (RE && *base_pat == '\\') |
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
945 { |
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
946 len--; |
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
947 base_pat++; |
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
948 } |
18112
fa7208c8ac02
(search_buffer): Use XINT around refs to trt.
Richard M. Stallman <rms@gnu.org>
parents:
18081
diff
changeset
|
949 *pat++ = (trt ? XINT (trt[*base_pat++]) : *base_pat++); |
8950
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
950 } |
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
951 len = pat - patbuf; |
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
952 pat = base_pat = patbuf; |
68ad2f08d735
(trivial_regexp_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
8584
diff
changeset
|
953 } |
603 | 954 /* The general approach is that we are going to maintain that we know */ |
955 /* the first (closest to the present position, in whatever direction */ | |
956 /* we're searching) character that could possibly be the last */ | |
957 /* (furthest from present position) character of a valid match. We */ | |
958 /* advance the state of our knowledge by looking at that character */ | |
959 /* and seeing whether it indeed matches the last character of the */ | |
960 /* pattern. If it does, we take a closer look. If it does not, we */ | |
961 /* move our pointer (to putative last characters) as far as is */ | |
962 /* logically possible. This amount of movement, which I call a */ | |
963 /* stride, will be the length of the pattern if the actual character */ | |
964 /* appears nowhere in the pattern, otherwise it will be the distance */ | |
965 /* from the last occurrence of that character to the end of the */ | |
966 /* pattern. */ | |
967 /* As a coding trick, an enormous stride is coded into the table for */ | |
968 /* characters that match the last character. This allows use of only */ | |
969 /* a single test, a test for having gone past the end of the */ | |
970 /* permissible match region, to test for both possible matches (when */ | |
971 /* the stride goes past the end immediately) and failure to */ | |
972 /* match (where you get nudged past the end one stride at a time). */ | |
973 | |
974 /* Here we make a "mickey mouse" BM table. The stride of the search */ | |
975 /* is determined only by the last character of the putative match. */ | |
976 /* If that character does not match, we will stride the proper */ | |
977 /* distance to propose a match that superimposes it on the last */ | |
978 /* instance of a character that matches it (per trt), or misses */ | |
979 /* it entirely if there is none. */ | |
980 | |
981 dirlen = len * direction; | |
982 infinity = dirlen - (lim + pos + len + len) * direction; | |
983 if (direction < 0) | |
984 pat = (base_pat += len - 1); | |
985 BM_tab_base = BM_tab; | |
986 BM_tab += 0400; | |
987 j = dirlen; /* to get it in a register */ | |
988 /* A character that does not appear in the pattern induces a */ | |
989 /* stride equal to the pattern length. */ | |
990 while (BM_tab_base != BM_tab) | |
991 { | |
992 *--BM_tab = j; | |
993 *--BM_tab = j; | |
994 *--BM_tab = j; | |
995 *--BM_tab = j; | |
996 } | |
997 i = 0; | |
998 while (i != infinity) | |
999 { | |
1000 j = pat[i]; i += direction; | |
1001 if (i == dirlen) i = infinity; | |
11262
6386347256f0
(search_buffer): Avoid casting trt to int.
Richard M. Stallman <rms@gnu.org>
parents:
11213
diff
changeset
|
1002 if (trt != 0) |
603 | 1003 { |
18112
fa7208c8ac02
(search_buffer): Use XINT around refs to trt.
Richard M. Stallman <rms@gnu.org>
parents:
18081
diff
changeset
|
1004 k = (j = XINT (trt[j])); |
603 | 1005 if (i == infinity) |
1006 stride_for_teases = BM_tab[j]; | |
1007 BM_tab[j] = dirlen - i; | |
1008 /* A translation table is accompanied by its inverse -- see */ | |
1009 /* comment following downcase_table for details */ | |
18112
fa7208c8ac02
(search_buffer): Use XINT around refs to trt.
Richard M. Stallman <rms@gnu.org>
parents:
18081
diff
changeset
|
1010 while ((j = (unsigned char) XINT (inverse_trt[j])) != k) |
603 | 1011 BM_tab[j] = dirlen - i; |
1012 } | |
1013 else | |
1014 { | |
1015 if (i == infinity) | |
1016 stride_for_teases = BM_tab[j]; | |
1017 BM_tab[j] = dirlen - i; | |
1018 } | |
1019 /* stride_for_teases tells how much to stride if we get a */ | |
1020 /* match on the far character but are subsequently */ | |
1021 /* disappointed, by recording what the stride would have been */ | |
1022 /* for that character if the last character had been */ | |
1023 /* different. */ | |
1024 } | |
1025 infinity = dirlen - infinity; | |
1026 pos += dirlen - ((direction > 0) ? direction : 0); | |
1027 /* loop invariant - pos points at where last char (first char if reverse) | |
1028 of pattern would align in a possible match. */ | |
1029 while (n != 0) | |
1030 { | |
6343
372613d5970b
(search_buffer): Avoid boolean/integer mixing that confuses some compilers.
Karl Heuer <kwzh@gnu.org>
parents:
6297
diff
changeset
|
1031 /* It's been reported that some (broken) compiler thinks that |
372613d5970b
(search_buffer): Avoid boolean/integer mixing that confuses some compilers.
Karl Heuer <kwzh@gnu.org>
parents:
6297
diff
changeset
|
1032 Boolean expressions in an arithmetic context are unsigned. |
372613d5970b
(search_buffer): Avoid boolean/integer mixing that confuses some compilers.
Karl Heuer <kwzh@gnu.org>
parents:
6297
diff
changeset
|
1033 Using an explicit ?1:0 prevents this. */ |
372613d5970b
(search_buffer): Avoid boolean/integer mixing that confuses some compilers.
Karl Heuer <kwzh@gnu.org>
parents:
6297
diff
changeset
|
1034 if ((lim - pos - ((direction > 0) ? 1 : 0)) * direction < 0) |
603 | 1035 return (n * (0 - direction)); |
1036 /* First we do the part we can by pointers (maybe nothing) */ | |
1037 QUIT; | |
1038 pat = base_pat; | |
1039 limit = pos - dirlen + direction; | |
1040 limit = ((direction > 0) | |
1041 ? BUFFER_CEILING_OF (limit) | |
1042 : BUFFER_FLOOR_OF (limit)); | |
1043 /* LIMIT is now the last (not beyond-last!) value | |
1044 POS can take on without hitting edge of buffer or the gap. */ | |
1045 limit = ((direction > 0) | |
1046 ? min (lim - 1, min (limit, pos + 20000)) | |
1047 : max (lim, max (limit, pos - 20000))); | |
1048 if ((limit - pos) * direction > 20) | |
1049 { | |
17053
df904355f033
Include category.h and charset.h.
Karl Heuer <kwzh@gnu.org>
parents:
16880
diff
changeset
|
1050 p_limit = POS_ADDR (limit); |
df904355f033
Include category.h and charset.h.
Karl Heuer <kwzh@gnu.org>
parents:
16880
diff
changeset
|
1051 p2 = (cursor = POS_ADDR (pos)); |
603 | 1052 /* In this loop, pos + cursor - p2 is the surrogate for pos */ |
1053 while (1) /* use one cursor setting as long as i can */ | |
1054 { | |
1055 if (direction > 0) /* worth duplicating */ | |
1056 { | |
1057 /* Use signed comparison if appropriate | |
1058 to make cursor+infinity sure to be > p_limit. | |
1059 Assuming that the buffer lies in a range of addresses | |
1060 that are all "positive" (as ints) or all "negative", | |
1061 either kind of comparison will work as long | |
1062 as we don't step by infinity. So pick the kind | |
1063 that works when we do step by infinity. */ | |
11262
6386347256f0
(search_buffer): Avoid casting trt to int.
Richard M. Stallman <rms@gnu.org>
parents:
11213
diff
changeset
|
1064 if ((EMACS_INT) (p_limit + infinity) > (EMACS_INT) p_limit) |
11678
c0e33cdebfab
(search_buffer): Cast p_limit to EMACS_INT not int.
Richard M. Stallman <rms@gnu.org>
parents:
11262
diff
changeset
|
1065 while ((EMACS_INT) cursor <= (EMACS_INT) p_limit) |
603 | 1066 cursor += BM_tab[*cursor]; |
1067 else | |
16152
cc2b553290aa
(search_buffer): Use EMACS_UINT.
Richard M. Stallman <rms@gnu.org>
parents:
16039
diff
changeset
|
1068 while ((EMACS_UINT) cursor <= (EMACS_UINT) p_limit) |
603 | 1069 cursor += BM_tab[*cursor]; |
1070 } | |
1071 else | |
1072 { | |
11262
6386347256f0
(search_buffer): Avoid casting trt to int.
Richard M. Stallman <rms@gnu.org>
parents:
11213
diff
changeset
|
1073 if ((EMACS_INT) (p_limit + infinity) < (EMACS_INT) p_limit) |
6386347256f0
(search_buffer): Avoid casting trt to int.
Richard M. Stallman <rms@gnu.org>
parents:
11213
diff
changeset
|
1074 while ((EMACS_INT) cursor >= (EMACS_INT) p_limit) |
603 | 1075 cursor += BM_tab[*cursor]; |
1076 else | |
16152
cc2b553290aa
(search_buffer): Use EMACS_UINT.
Richard M. Stallman <rms@gnu.org>
parents:
16039
diff
changeset
|
1077 while ((EMACS_UINT) cursor >= (EMACS_UINT) p_limit) |
603 | 1078 cursor += BM_tab[*cursor]; |
1079 } | |
1080 /* If you are here, cursor is beyond the end of the searched region. */ | |
1081 /* This can happen if you match on the far character of the pattern, */ | |
1082 /* because the "stride" of that character is infinity, a number able */ | |
1083 /* to throw you well beyond the end of the search. It can also */ | |
1084 /* happen if you fail to match within the permitted region and would */ | |
1085 /* otherwise try a character beyond that region */ | |
1086 if ((cursor - p_limit) * direction <= len) | |
1087 break; /* a small overrun is genuine */ | |
1088 cursor -= infinity; /* large overrun = hit */ | |
1089 i = dirlen - direction; | |
11262
6386347256f0
(search_buffer): Avoid casting trt to int.
Richard M. Stallman <rms@gnu.org>
parents:
11213
diff
changeset
|
1090 if (trt != 0) |
603 | 1091 { |
1092 while ((i -= direction) + direction != 0) | |
18112
fa7208c8ac02
(search_buffer): Use XINT around refs to trt.
Richard M. Stallman <rms@gnu.org>
parents:
18081
diff
changeset
|
1093 if (pat[i] != XINT (trt[*(cursor -= direction)])) |
603 | 1094 break; |
1095 } | |
1096 else | |
1097 { | |
1098 while ((i -= direction) + direction != 0) | |
1099 if (pat[i] != *(cursor -= direction)) | |
1100 break; | |
1101 } | |
1102 cursor += dirlen - i - direction; /* fix cursor */ | |
1103 if (i + direction == 0) | |
1104 { | |
1105 cursor -= direction; | |
708 | 1106 |
5556
14161cfec24a
(set_search_regs): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
4954
diff
changeset
|
1107 set_search_regs (pos + cursor - p2 + ((direction > 0) |
14161cfec24a
(set_search_regs): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
4954
diff
changeset
|
1108 ? 1 - len : 0), |
14161cfec24a
(set_search_regs): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
4954
diff
changeset
|
1109 len); |
708 | 1110 |
603 | 1111 if ((n -= direction) != 0) |
1112 cursor += dirlen; /* to resume search */ | |
1113 else | |
1114 return ((direction > 0) | |
1115 ? search_regs.end[0] : search_regs.start[0]); | |
1116 } | |
1117 else | |
1118 cursor += stride_for_teases; /* <sigh> we lose - */ | |
1119 } | |
1120 pos += cursor - p2; | |
1121 } | |
1122 else | |
1123 /* Now we'll pick up a clump that has to be done the hard */ | |
1124 /* way because it covers a discontinuity */ | |
1125 { | |
1126 limit = ((direction > 0) | |
1127 ? BUFFER_CEILING_OF (pos - dirlen + 1) | |
1128 : BUFFER_FLOOR_OF (pos - dirlen - 1)); | |
1129 limit = ((direction > 0) | |
1130 ? min (limit + len, lim - 1) | |
1131 : max (limit - len, lim)); | |
1132 /* LIMIT is now the last value POS can have | |
1133 and still be valid for a possible match. */ | |
1134 while (1) | |
1135 { | |
1136 /* This loop can be coded for space rather than */ | |
1137 /* speed because it will usually run only once. */ | |
1138 /* (the reach is at most len + 21, and typically */ | |
1139 /* does not exceed len) */ | |
1140 while ((limit - pos) * direction >= 0) | |
17053
df904355f033
Include category.h and charset.h.
Karl Heuer <kwzh@gnu.org>
parents:
16880
diff
changeset
|
1141 pos += BM_tab[FETCH_BYTE (pos)]; |
603 | 1142 /* now run the same tests to distinguish going off the */ |
3591
507f64624555
Apply typo patches from Paul Eggert.
Jim Blandy <jimb@redhat.com>
parents:
2961
diff
changeset
|
1143 /* end, a match or a phony match. */ |
603 | 1144 if ((pos - limit) * direction <= len) |
1145 break; /* ran off the end */ | |
1146 /* Found what might be a match. | |
1147 Set POS back to last (first if reverse) char pos. */ | |
1148 pos -= infinity; | |
1149 i = dirlen - direction; | |
1150 while ((i -= direction) + direction != 0) | |
1151 { | |
1152 pos -= direction; | |
11262
6386347256f0
(search_buffer): Avoid casting trt to int.
Richard M. Stallman <rms@gnu.org>
parents:
11213
diff
changeset
|
1153 if (pat[i] != (trt != 0 |
18112
fa7208c8ac02
(search_buffer): Use XINT around refs to trt.
Richard M. Stallman <rms@gnu.org>
parents:
18081
diff
changeset
|
1154 ? XINT (trt[FETCH_BYTE (pos)]) |
17053
df904355f033
Include category.h and charset.h.
Karl Heuer <kwzh@gnu.org>
parents:
16880
diff
changeset
|
1155 : FETCH_BYTE (pos))) |
603 | 1156 break; |
1157 } | |
1158 /* Above loop has moved POS part or all the way | |
1159 back to the first char pos (last char pos if reverse). | |
1160 Set it once again at the last (first if reverse) char. */ | |
1161 pos += dirlen - i- direction; | |
1162 if (i + direction == 0) | |
1163 { | |
1164 pos -= direction; | |
708 | 1165 |
5556
14161cfec24a
(set_search_regs): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
4954
diff
changeset
|
1166 set_search_regs (pos + ((direction > 0) ? 1 - len : 0), |
14161cfec24a
(set_search_regs): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
4954
diff
changeset
|
1167 len); |
708 | 1168 |
603 | 1169 if ((n -= direction) != 0) |
1170 pos += dirlen; /* to resume search */ | |
1171 else | |
1172 return ((direction > 0) | |
1173 ? search_regs.end[0] : search_regs.start[0]); | |
1174 } | |
1175 else | |
1176 pos += stride_for_teases; | |
1177 } | |
1178 } | |
1179 /* We have done one clump. Can we continue? */ | |
1180 if ((lim - pos) * direction < 0) | |
1181 return ((0 - n) * direction); | |
1182 } | |
1183 return pos; | |
1184 } | |
1185 } | |
5556
14161cfec24a
(set_search_regs): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
4954
diff
changeset
|
1186 |
14161cfec24a
(set_search_regs): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
4954
diff
changeset
|
1187 /* Record beginning BEG and end BEG + LEN |
14161cfec24a
(set_search_regs): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
4954
diff
changeset
|
1188 for a match just found in the current buffer. */ |
14161cfec24a
(set_search_regs): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
4954
diff
changeset
|
1189 |
14161cfec24a
(set_search_regs): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
4954
diff
changeset
|
1190 static void |
14161cfec24a
(set_search_regs): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
4954
diff
changeset
|
1191 set_search_regs (beg, len) |
14161cfec24a
(set_search_regs): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
4954
diff
changeset
|
1192 int beg, len; |
14161cfec24a
(set_search_regs): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
4954
diff
changeset
|
1193 { |
14161cfec24a
(set_search_regs): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
4954
diff
changeset
|
1194 /* Make sure we have registers in which to store |
14161cfec24a
(set_search_regs): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
4954
diff
changeset
|
1195 the match position. */ |
14161cfec24a
(set_search_regs): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
4954
diff
changeset
|
1196 if (search_regs.num_regs == 0) |
14161cfec24a
(set_search_regs): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
4954
diff
changeset
|
1197 { |
10250
422c3b96efda
(set_search_regs): Really set search_regs.start and .end.
Richard M. Stallman <rms@gnu.org>
parents:
10141
diff
changeset
|
1198 search_regs.start = (regoff_t *) xmalloc (2 * sizeof (regoff_t)); |
422c3b96efda
(set_search_regs): Really set search_regs.start and .end.
Richard M. Stallman <rms@gnu.org>
parents:
10141
diff
changeset
|
1199 search_regs.end = (regoff_t *) xmalloc (2 * sizeof (regoff_t)); |
9605
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
1200 search_regs.num_regs = 2; |
5556
14161cfec24a
(set_search_regs): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
4954
diff
changeset
|
1201 } |
14161cfec24a
(set_search_regs): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
4954
diff
changeset
|
1202 |
14161cfec24a
(set_search_regs): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
4954
diff
changeset
|
1203 search_regs.start[0] = beg; |
14161cfec24a
(set_search_regs): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
4954
diff
changeset
|
1204 search_regs.end[0] = beg + len; |
9278
f2138d548313
(Flooking_at, skip_chars, search_buffer, set_search_regs, Fstore_match_data):
Karl Heuer <kwzh@gnu.org>
parents:
9113
diff
changeset
|
1205 XSETBUFFER (last_thing_searched, current_buffer); |
5556
14161cfec24a
(set_search_regs): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
4954
diff
changeset
|
1206 } |
603 | 1207 |
1208 /* Given a string of words separated by word delimiters, | |
1209 compute a regexp that matches those exact words | |
1210 separated by arbitrary punctuation. */ | |
1211 | |
1212 static Lisp_Object | |
1213 wordify (string) | |
1214 Lisp_Object string; | |
1215 { | |
1216 register unsigned char *p, *o; | |
1217 register int i, len, punct_count = 0, word_count = 0; | |
1218 Lisp_Object val; | |
1219 | |
1220 CHECK_STRING (string, 0); | |
1221 p = XSTRING (string)->data; | |
1222 len = XSTRING (string)->size; | |
1223 | |
1224 for (i = 0; i < len; i++) | |
1225 if (SYNTAX (p[i]) != Sword) | |
1226 { | |
1227 punct_count++; | |
1228 if (i > 0 && SYNTAX (p[i-1]) == Sword) word_count++; | |
1229 } | |
1230 if (SYNTAX (p[len-1]) == Sword) word_count++; | |
1231 if (!word_count) return build_string (""); | |
1232 | |
1233 val = make_string (p, len - punct_count + 5 * (word_count - 1) + 4); | |
1234 | |
1235 o = XSTRING (val)->data; | |
1236 *o++ = '\\'; | |
1237 *o++ = 'b'; | |
1238 | |
1239 for (i = 0; i < len; i++) | |
1240 if (SYNTAX (p[i]) == Sword) | |
1241 *o++ = p[i]; | |
1242 else if (i > 0 && SYNTAX (p[i-1]) == Sword && --word_count) | |
1243 { | |
1244 *o++ = '\\'; | |
1245 *o++ = 'W'; | |
1246 *o++ = '\\'; | |
1247 *o++ = 'W'; | |
1248 *o++ = '*'; | |
1249 } | |
1250 | |
1251 *o++ = '\\'; | |
1252 *o++ = 'b'; | |
1253 | |
1254 return val; | |
1255 } | |
1256 | |
1257 DEFUN ("search-backward", Fsearch_backward, Ssearch_backward, 1, 4, | |
19541
e7876a076881
(Fsearch_backward): Inherit the current input method on
Kenichi Handa <handa@m17n.org>
parents:
18762
diff
changeset
|
1258 "MSearch backward: ", |
603 | 1259 "Search backward from point for STRING.\n\ |
1260 Set point to the beginning of the occurrence found, and return point.\n\ | |
1261 An optional second argument bounds the search; it is a buffer position.\n\ | |
1262 The match found must not extend before that position.\n\ | |
1263 Optional third argument, if t, means if fail just return nil (no error).\n\ | |
1264 If not nil and not t, position at limit of search and return nil.\n\ | |
1265 Optional fourth argument is repeat count--search for successive occurrences.\n\ | |
1266 See also the functions `match-beginning', `match-end' and `replace-match'.") | |
1267 (string, bound, noerror, count) | |
1268 Lisp_Object string, bound, noerror, count; | |
1269 { | |
10020
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
1270 return search_command (string, bound, noerror, count, -1, 0, 0); |
603 | 1271 } |
1272 | |
19541
e7876a076881
(Fsearch_backward): Inherit the current input method on
Kenichi Handa <handa@m17n.org>
parents:
18762
diff
changeset
|
1273 DEFUN ("search-forward", Fsearch_forward, Ssearch_forward, 1, 4, "MSearch: ", |
603 | 1274 "Search forward from point for STRING.\n\ |
1275 Set point to the end of the occurrence found, and return point.\n\ | |
1276 An optional second argument bounds the search; it is a buffer position.\n\ | |
1277 The match found must not extend after that position. nil is equivalent\n\ | |
1278 to (point-max).\n\ | |
1279 Optional third argument, if t, means if fail just return nil (no error).\n\ | |
1280 If not nil and not t, move to limit of search and return nil.\n\ | |
1281 Optional fourth argument is repeat count--search for successive occurrences.\n\ | |
1282 See also the functions `match-beginning', `match-end' and `replace-match'.") | |
1283 (string, bound, noerror, count) | |
1284 Lisp_Object string, bound, noerror, count; | |
1285 { | |
10020
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
1286 return search_command (string, bound, noerror, count, 1, 0, 0); |
603 | 1287 } |
1288 | |
1289 DEFUN ("word-search-backward", Fword_search_backward, Sword_search_backward, 1, 4, | |
1290 "sWord search backward: ", | |
1291 "Search backward from point for STRING, ignoring differences in punctuation.\n\ | |
1292 Set point to the beginning of the occurrence found, and return point.\n\ | |
1293 An optional second argument bounds the search; it is a buffer position.\n\ | |
1294 The match found must not extend before that position.\n\ | |
1295 Optional third argument, if t, means if fail just return nil (no error).\n\ | |
1296 If not nil and not t, move to limit of search and return nil.\n\ | |
1297 Optional fourth argument is repeat count--search for successive occurrences.") | |
1298 (string, bound, noerror, count) | |
1299 Lisp_Object string, bound, noerror, count; | |
1300 { | |
10020
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
1301 return search_command (wordify (string), bound, noerror, count, -1, 1, 0); |
603 | 1302 } |
1303 | |
1304 DEFUN ("word-search-forward", Fword_search_forward, Sword_search_forward, 1, 4, | |
1305 "sWord search: ", | |
1306 "Search forward from point for STRING, ignoring differences in punctuation.\n\ | |
1307 Set point to the end of the occurrence found, and return point.\n\ | |
1308 An optional second argument bounds the search; it is a buffer position.\n\ | |
1309 The match found must not extend after that position.\n\ | |
1310 Optional third argument, if t, means if fail just return nil (no error).\n\ | |
1311 If not nil and not t, move to limit of search and return nil.\n\ | |
1312 Optional fourth argument is repeat count--search for successive occurrences.") | |
1313 (string, bound, noerror, count) | |
1314 Lisp_Object string, bound, noerror, count; | |
1315 { | |
10020
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
1316 return search_command (wordify (string), bound, noerror, count, 1, 1, 0); |
603 | 1317 } |
1318 | |
1319 DEFUN ("re-search-backward", Fre_search_backward, Sre_search_backward, 1, 4, | |
1320 "sRE search backward: ", | |
1321 "Search backward from point for match for regular expression REGEXP.\n\ | |
1322 Set point to the beginning of the match, and return point.\n\ | |
1323 The match found is the one starting last in the buffer\n\ | |
6297
b44907fd0ff0
(Fre_search_forward, Fre_search_backward): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents:
6196
diff
changeset
|
1324 and yet ending before the origin of the search.\n\ |
603 | 1325 An optional second argument bounds the search; it is a buffer position.\n\ |
1326 The match found must start at or after that position.\n\ | |
1327 Optional third argument, if t, means if fail just return nil (no error).\n\ | |
1328 If not nil and not t, move to limit of search and return nil.\n\ | |
1329 Optional fourth argument is repeat count--search for successive occurrences.\n\ | |
1330 See also the functions `match-beginning', `match-end' and `replace-match'.") | |
6297
b44907fd0ff0
(Fre_search_forward, Fre_search_backward): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents:
6196
diff
changeset
|
1331 (regexp, bound, noerror, count) |
b44907fd0ff0
(Fre_search_forward, Fre_search_backward): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents:
6196
diff
changeset
|
1332 Lisp_Object regexp, bound, noerror, count; |
603 | 1333 { |
10020
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
1334 return search_command (regexp, bound, noerror, count, -1, 1, 0); |
603 | 1335 } |
1336 | |
1337 DEFUN ("re-search-forward", Fre_search_forward, Sre_search_forward, 1, 4, | |
1338 "sRE search: ", | |
1339 "Search forward from point for regular expression REGEXP.\n\ | |
1340 Set point to the end of the occurrence found, and return point.\n\ | |
1341 An optional second argument bounds the search; it is a buffer position.\n\ | |
1342 The match found must not extend after that position.\n\ | |
1343 Optional third argument, if t, means if fail just return nil (no error).\n\ | |
1344 If not nil and not t, move to limit of search and return nil.\n\ | |
1345 Optional fourth argument is repeat count--search for successive occurrences.\n\ | |
1346 See also the functions `match-beginning', `match-end' and `replace-match'.") | |
6297
b44907fd0ff0
(Fre_search_forward, Fre_search_backward): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents:
6196
diff
changeset
|
1347 (regexp, bound, noerror, count) |
b44907fd0ff0
(Fre_search_forward, Fre_search_backward): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents:
6196
diff
changeset
|
1348 Lisp_Object regexp, bound, noerror, count; |
603 | 1349 { |
10020
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
1350 return search_command (regexp, bound, noerror, count, 1, 1, 0); |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
1351 } |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
1352 |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
1353 DEFUN ("posix-search-backward", Fposix_search_backward, Sposix_search_backward, 1, 4, |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
1354 "sPosix search backward: ", |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
1355 "Search backward from point for match for regular expression REGEXP.\n\ |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
1356 Find the longest match in accord with Posix regular expression rules.\n\ |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
1357 Set point to the beginning of the match, and return point.\n\ |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
1358 The match found is the one starting last in the buffer\n\ |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
1359 and yet ending before the origin of the search.\n\ |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
1360 An optional second argument bounds the search; it is a buffer position.\n\ |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
1361 The match found must start at or after that position.\n\ |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
1362 Optional third argument, if t, means if fail just return nil (no error).\n\ |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
1363 If not nil and not t, move to limit of search and return nil.\n\ |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
1364 Optional fourth argument is repeat count--search for successive occurrences.\n\ |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
1365 See also the functions `match-beginning', `match-end' and `replace-match'.") |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
1366 (regexp, bound, noerror, count) |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
1367 Lisp_Object regexp, bound, noerror, count; |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
1368 { |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
1369 return search_command (regexp, bound, noerror, count, -1, 1, 1); |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
1370 } |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
1371 |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
1372 DEFUN ("posix-search-forward", Fposix_search_forward, Sposix_search_forward, 1, 4, |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
1373 "sPosix search: ", |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
1374 "Search forward from point for regular expression REGEXP.\n\ |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
1375 Find the longest match in accord with Posix regular expression rules.\n\ |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
1376 Set point to the end of the occurrence found, and return point.\n\ |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
1377 An optional second argument bounds the search; it is a buffer position.\n\ |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
1378 The match found must not extend after that position.\n\ |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
1379 Optional third argument, if t, means if fail just return nil (no error).\n\ |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
1380 If not nil and not t, move to limit of search and return nil.\n\ |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
1381 Optional fourth argument is repeat count--search for successive occurrences.\n\ |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
1382 See also the functions `match-beginning', `match-end' and `replace-match'.") |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
1383 (regexp, bound, noerror, count) |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
1384 Lisp_Object regexp, bound, noerror, count; |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
1385 { |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
1386 return search_command (regexp, bound, noerror, count, 1, 1, 1); |
603 | 1387 } |
1388 | |
12807
34d269b30df1
(Freplace_match): New arg SUBEXP.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
1389 DEFUN ("replace-match", Freplace_match, Sreplace_match, 1, 5, 0, |
603 | 1390 "Replace text matched by last search with NEWTEXT.\n\ |
1391 If second arg FIXEDCASE is non-nil, do not alter case of replacement text.\n\ | |
6543
33032ee16c7c
(Freplace_match): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6343
diff
changeset
|
1392 Otherwise maybe capitalize the whole text, or maybe just word initials,\n\ |
33032ee16c7c
(Freplace_match): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6343
diff
changeset
|
1393 based on the replaced text.\n\ |
33032ee16c7c
(Freplace_match): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6343
diff
changeset
|
1394 If the replaced text has only capital letters\n\ |
33032ee16c7c
(Freplace_match): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6343
diff
changeset
|
1395 and has at least one multiletter word, convert NEWTEXT to all caps.\n\ |
33032ee16c7c
(Freplace_match): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6343
diff
changeset
|
1396 If the replaced text has at least one word starting with a capital letter,\n\ |
33032ee16c7c
(Freplace_match): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6343
diff
changeset
|
1397 then capitalize each word in NEWTEXT.\n\n\ |
603 | 1398 If third arg LITERAL is non-nil, insert NEWTEXT literally.\n\ |
1399 Otherwise treat `\\' as special:\n\ | |
1400 `\\&' in NEWTEXT means substitute original matched text.\n\ | |
1401 `\\N' means substitute what matched the Nth `\\(...\\)'.\n\ | |
1402 If Nth parens didn't match, substitute nothing.\n\ | |
1403 `\\\\' means insert one `\\'.\n\ | |
708 | 1404 FIXEDCASE and LITERAL are optional arguments.\n\ |
9029
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1405 Leaves point at end of replacement text.\n\ |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1406 \n\ |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1407 The optional fourth argument STRING can be a string to modify.\n\ |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1408 In that case, this function creates and returns a new string\n\ |
12807
34d269b30df1
(Freplace_match): New arg SUBEXP.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
1409 which is made by replacing the part of STRING that was matched.\n\ |
34d269b30df1
(Freplace_match): New arg SUBEXP.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
1410 \n\ |
34d269b30df1
(Freplace_match): New arg SUBEXP.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
1411 The optional fifth argument SUBEXP specifies a subexpression of the match.\n\ |
34d269b30df1
(Freplace_match): New arg SUBEXP.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
1412 It says to replace just that subexpression instead of the whole match.\n\ |
34d269b30df1
(Freplace_match): New arg SUBEXP.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
1413 This is useful only after a regular expression search or match\n\ |
34d269b30df1
(Freplace_match): New arg SUBEXP.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
1414 since only regular expressions have distinguished subexpressions.") |
34d269b30df1
(Freplace_match): New arg SUBEXP.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
1415 (newtext, fixedcase, literal, string, subexp) |
34d269b30df1
(Freplace_match): New arg SUBEXP.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
1416 Lisp_Object newtext, fixedcase, literal, string, subexp; |
603 | 1417 { |
1418 enum { nochange, all_caps, cap_initial } case_action; | |
1419 register int pos, last; | |
1420 int some_multiletter_word; | |
2393
a35d2c5cbb3b
(Freplace_match): Clean up criterion about converting case.
Richard M. Stallman <rms@gnu.org>
parents:
1926
diff
changeset
|
1421 int some_lowercase; |
7674
947d24fefd9e
(Freplace_match): Improve capitalization heuristics.
Karl Heuer <kwzh@gnu.org>
parents:
7673
diff
changeset
|
1422 int some_uppercase; |
8526
2b7b23059f1b
(Freplace_match): Treat caseless initial like a lowercase initial.
Richard M. Stallman <rms@gnu.org>
parents:
7891
diff
changeset
|
1423 int some_nonuppercase_initial; |
603 | 1424 register int c, prevc; |
1425 int inslen; | |
12807
34d269b30df1
(Freplace_match): New arg SUBEXP.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
1426 int sub; |
18081
300068b4fcef
(Freplace_match): Fix previous change.
Richard M. Stallman <rms@gnu.org>
parents:
18077
diff
changeset
|
1427 int opoint, newpoint; |
603 | 1428 |
4882
8c09f87f5087
(Freplace_match): Fix argument names to match doc string.
Brian Fox <bfox@gnu.org>
parents:
4832
diff
changeset
|
1429 CHECK_STRING (newtext, 0); |
603 | 1430 |
9029
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1431 if (! NILP (string)) |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1432 CHECK_STRING (string, 4); |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1433 |
603 | 1434 case_action = nochange; /* We tried an initialization */ |
1435 /* but some C compilers blew it */ | |
621 | 1436 |
1437 if (search_regs.num_regs <= 0) | |
1438 error ("replace-match called before any match found"); | |
1439 | |
12807
34d269b30df1
(Freplace_match): New arg SUBEXP.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
1440 if (NILP (subexp)) |
34d269b30df1
(Freplace_match): New arg SUBEXP.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
1441 sub = 0; |
34d269b30df1
(Freplace_match): New arg SUBEXP.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
1442 else |
34d269b30df1
(Freplace_match): New arg SUBEXP.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
1443 { |
34d269b30df1
(Freplace_match): New arg SUBEXP.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
1444 CHECK_NUMBER (subexp, 3); |
34d269b30df1
(Freplace_match): New arg SUBEXP.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
1445 sub = XINT (subexp); |
34d269b30df1
(Freplace_match): New arg SUBEXP.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
1446 if (sub < 0 || sub >= search_regs.num_regs) |
34d269b30df1
(Freplace_match): New arg SUBEXP.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
1447 args_out_of_range (subexp, make_number (search_regs.num_regs)); |
34d269b30df1
(Freplace_match): New arg SUBEXP.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
1448 } |
34d269b30df1
(Freplace_match): New arg SUBEXP.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
1449 |
9029
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1450 if (NILP (string)) |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1451 { |
12807
34d269b30df1
(Freplace_match): New arg SUBEXP.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
1452 if (search_regs.start[sub] < BEGV |
34d269b30df1
(Freplace_match): New arg SUBEXP.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
1453 || search_regs.start[sub] > search_regs.end[sub] |
34d269b30df1
(Freplace_match): New arg SUBEXP.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
1454 || search_regs.end[sub] > ZV) |
34d269b30df1
(Freplace_match): New arg SUBEXP.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
1455 args_out_of_range (make_number (search_regs.start[sub]), |
34d269b30df1
(Freplace_match): New arg SUBEXP.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
1456 make_number (search_regs.end[sub])); |
9029
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1457 } |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1458 else |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1459 { |
12807
34d269b30df1
(Freplace_match): New arg SUBEXP.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
1460 if (search_regs.start[sub] < 0 |
34d269b30df1
(Freplace_match): New arg SUBEXP.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
1461 || search_regs.start[sub] > search_regs.end[sub] |
34d269b30df1
(Freplace_match): New arg SUBEXP.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
1462 || search_regs.end[sub] > XSTRING (string)->size) |
34d269b30df1
(Freplace_match): New arg SUBEXP.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
1463 args_out_of_range (make_number (search_regs.start[sub]), |
34d269b30df1
(Freplace_match): New arg SUBEXP.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
1464 make_number (search_regs.end[sub])); |
9029
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1465 } |
603 | 1466 |
1467 if (NILP (fixedcase)) | |
1468 { | |
1469 /* Decide how to casify by examining the matched text. */ | |
1470 | |
12807
34d269b30df1
(Freplace_match): New arg SUBEXP.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
1471 last = search_regs.end[sub]; |
603 | 1472 prevc = '\n'; |
1473 case_action = all_caps; | |
1474 | |
1475 /* some_multiletter_word is set nonzero if any original word | |
1476 is more than one letter long. */ | |
1477 some_multiletter_word = 0; | |
2393
a35d2c5cbb3b
(Freplace_match): Clean up criterion about converting case.
Richard M. Stallman <rms@gnu.org>
parents:
1926
diff
changeset
|
1478 some_lowercase = 0; |
8526
2b7b23059f1b
(Freplace_match): Treat caseless initial like a lowercase initial.
Richard M. Stallman <rms@gnu.org>
parents:
7891
diff
changeset
|
1479 some_nonuppercase_initial = 0; |
7674
947d24fefd9e
(Freplace_match): Improve capitalization heuristics.
Karl Heuer <kwzh@gnu.org>
parents:
7673
diff
changeset
|
1480 some_uppercase = 0; |
603 | 1481 |
12807
34d269b30df1
(Freplace_match): New arg SUBEXP.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
1482 for (pos = search_regs.start[sub]; pos < last; pos++) |
603 | 1483 { |
9029
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1484 if (NILP (string)) |
17053
df904355f033
Include category.h and charset.h.
Karl Heuer <kwzh@gnu.org>
parents:
16880
diff
changeset
|
1485 c = FETCH_BYTE (pos); |
9029
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1486 else |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1487 c = XSTRING (string)->data[pos]; |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1488 |
603 | 1489 if (LOWERCASEP (c)) |
1490 { | |
1491 /* Cannot be all caps if any original char is lower case */ | |
1492 | |
2393
a35d2c5cbb3b
(Freplace_match): Clean up criterion about converting case.
Richard M. Stallman <rms@gnu.org>
parents:
1926
diff
changeset
|
1493 some_lowercase = 1; |
603 | 1494 if (SYNTAX (prevc) != Sword) |
8526
2b7b23059f1b
(Freplace_match): Treat caseless initial like a lowercase initial.
Richard M. Stallman <rms@gnu.org>
parents:
7891
diff
changeset
|
1495 some_nonuppercase_initial = 1; |
603 | 1496 else |
1497 some_multiletter_word = 1; | |
1498 } | |
1499 else if (!NOCASEP (c)) | |
1500 { | |
7674
947d24fefd9e
(Freplace_match): Improve capitalization heuristics.
Karl Heuer <kwzh@gnu.org>
parents:
7673
diff
changeset
|
1501 some_uppercase = 1; |
2393
a35d2c5cbb3b
(Freplace_match): Clean up criterion about converting case.
Richard M. Stallman <rms@gnu.org>
parents:
1926
diff
changeset
|
1502 if (SYNTAX (prevc) != Sword) |
6679
490b7e2db978
(Freplace_match): Don't capitalize unless all matched words are capitalized.
Karl Heuer <kwzh@gnu.org>
parents:
6543
diff
changeset
|
1503 ; |
2393
a35d2c5cbb3b
(Freplace_match): Clean up criterion about converting case.
Richard M. Stallman <rms@gnu.org>
parents:
1926
diff
changeset
|
1504 else |
603 | 1505 some_multiletter_word = 1; |
1506 } | |
8526
2b7b23059f1b
(Freplace_match): Treat caseless initial like a lowercase initial.
Richard M. Stallman <rms@gnu.org>
parents:
7891
diff
changeset
|
1507 else |
2b7b23059f1b
(Freplace_match): Treat caseless initial like a lowercase initial.
Richard M. Stallman <rms@gnu.org>
parents:
7891
diff
changeset
|
1508 { |
2b7b23059f1b
(Freplace_match): Treat caseless initial like a lowercase initial.
Richard M. Stallman <rms@gnu.org>
parents:
7891
diff
changeset
|
1509 /* If the initial is a caseless word constituent, |
2b7b23059f1b
(Freplace_match): Treat caseless initial like a lowercase initial.
Richard M. Stallman <rms@gnu.org>
parents:
7891
diff
changeset
|
1510 treat that like a lowercase initial. */ |
2b7b23059f1b
(Freplace_match): Treat caseless initial like a lowercase initial.
Richard M. Stallman <rms@gnu.org>
parents:
7891
diff
changeset
|
1511 if (SYNTAX (prevc) != Sword) |
2b7b23059f1b
(Freplace_match): Treat caseless initial like a lowercase initial.
Richard M. Stallman <rms@gnu.org>
parents:
7891
diff
changeset
|
1512 some_nonuppercase_initial = 1; |
2b7b23059f1b
(Freplace_match): Treat caseless initial like a lowercase initial.
Richard M. Stallman <rms@gnu.org>
parents:
7891
diff
changeset
|
1513 } |
603 | 1514 |
1515 prevc = c; | |
1516 } | |
1517 | |
2393
a35d2c5cbb3b
(Freplace_match): Clean up criterion about converting case.
Richard M. Stallman <rms@gnu.org>
parents:
1926
diff
changeset
|
1518 /* Convert to all caps if the old text is all caps |
a35d2c5cbb3b
(Freplace_match): Clean up criterion about converting case.
Richard M. Stallman <rms@gnu.org>
parents:
1926
diff
changeset
|
1519 and has at least one multiletter word. */ |
a35d2c5cbb3b
(Freplace_match): Clean up criterion about converting case.
Richard M. Stallman <rms@gnu.org>
parents:
1926
diff
changeset
|
1520 if (! some_lowercase && some_multiletter_word) |
a35d2c5cbb3b
(Freplace_match): Clean up criterion about converting case.
Richard M. Stallman <rms@gnu.org>
parents:
1926
diff
changeset
|
1521 case_action = all_caps; |
6679
490b7e2db978
(Freplace_match): Don't capitalize unless all matched words are capitalized.
Karl Heuer <kwzh@gnu.org>
parents:
6543
diff
changeset
|
1522 /* Capitalize each word, if the old text has all capitalized words. */ |
8526
2b7b23059f1b
(Freplace_match): Treat caseless initial like a lowercase initial.
Richard M. Stallman <rms@gnu.org>
parents:
7891
diff
changeset
|
1523 else if (!some_nonuppercase_initial && some_multiletter_word) |
603 | 1524 case_action = cap_initial; |
8526
2b7b23059f1b
(Freplace_match): Treat caseless initial like a lowercase initial.
Richard M. Stallman <rms@gnu.org>
parents:
7891
diff
changeset
|
1525 else if (!some_nonuppercase_initial && some_uppercase) |
7674
947d24fefd9e
(Freplace_match): Improve capitalization heuristics.
Karl Heuer <kwzh@gnu.org>
parents:
7673
diff
changeset
|
1526 /* Should x -> yz, operating on X, give Yz or YZ? |
947d24fefd9e
(Freplace_match): Improve capitalization heuristics.
Karl Heuer <kwzh@gnu.org>
parents:
7673
diff
changeset
|
1527 We'll assume the latter. */ |
947d24fefd9e
(Freplace_match): Improve capitalization heuristics.
Karl Heuer <kwzh@gnu.org>
parents:
7673
diff
changeset
|
1528 case_action = all_caps; |
2393
a35d2c5cbb3b
(Freplace_match): Clean up criterion about converting case.
Richard M. Stallman <rms@gnu.org>
parents:
1926
diff
changeset
|
1529 else |
a35d2c5cbb3b
(Freplace_match): Clean up criterion about converting case.
Richard M. Stallman <rms@gnu.org>
parents:
1926
diff
changeset
|
1530 case_action = nochange; |
603 | 1531 } |
1532 | |
9029
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1533 /* Do replacement in a string. */ |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1534 if (!NILP (string)) |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1535 { |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1536 Lisp_Object before, after; |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1537 |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1538 before = Fsubstring (string, make_number (0), |
12807
34d269b30df1
(Freplace_match): New arg SUBEXP.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
1539 make_number (search_regs.start[sub])); |
34d269b30df1
(Freplace_match): New arg SUBEXP.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
1540 after = Fsubstring (string, make_number (search_regs.end[sub]), Qnil); |
9029
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1541 |
17225
739e41eed8b6
(Freplace_match): Give error if
Richard M. Stallman <rms@gnu.org>
parents:
17102
diff
changeset
|
1542 /* Substitute parts of the match into NEWTEXT |
739e41eed8b6
(Freplace_match): Give error if
Richard M. Stallman <rms@gnu.org>
parents:
17102
diff
changeset
|
1543 if desired. */ |
9029
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1544 if (NILP (literal)) |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1545 { |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1546 int lastpos = -1; |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1547 /* We build up the substituted string in ACCUM. */ |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1548 Lisp_Object accum; |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1549 Lisp_Object middle; |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1550 |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1551 accum = Qnil; |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1552 |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1553 for (pos = 0; pos < XSTRING (newtext)->size; pos++) |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1554 { |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1555 int substart = -1; |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1556 int subend; |
12148
a1c38b9b0f73
(Freplace_match): Do the right thing with backslash.
Karl Heuer <kwzh@gnu.org>
parents:
12147
diff
changeset
|
1557 int delbackslash = 0; |
9029
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1558 |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1559 c = XSTRING (newtext)->data[pos]; |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1560 if (c == '\\') |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1561 { |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1562 c = XSTRING (newtext)->data[++pos]; |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1563 if (c == '&') |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1564 { |
12807
34d269b30df1
(Freplace_match): New arg SUBEXP.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
1565 substart = search_regs.start[sub]; |
34d269b30df1
(Freplace_match): New arg SUBEXP.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
1566 subend = search_regs.end[sub]; |
9029
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1567 } |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1568 else if (c >= '1' && c <= '9' && c <= search_regs.num_regs + '0') |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1569 { |
12147
9200a0e153d3
(Freplace_match): Fix check for valid reg in string replace.
Karl Heuer <kwzh@gnu.org>
parents:
12092
diff
changeset
|
1570 if (search_regs.start[c - '0'] >= 0) |
9029
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1571 { |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1572 substart = search_regs.start[c - '0']; |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1573 subend = search_regs.end[c - '0']; |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1574 } |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1575 } |
12148
a1c38b9b0f73
(Freplace_match): Do the right thing with backslash.
Karl Heuer <kwzh@gnu.org>
parents:
12147
diff
changeset
|
1576 else if (c == '\\') |
a1c38b9b0f73
(Freplace_match): Do the right thing with backslash.
Karl Heuer <kwzh@gnu.org>
parents:
12147
diff
changeset
|
1577 delbackslash = 1; |
17225
739e41eed8b6
(Freplace_match): Give error if
Richard M. Stallman <rms@gnu.org>
parents:
17102
diff
changeset
|
1578 else |
739e41eed8b6
(Freplace_match): Give error if
Richard M. Stallman <rms@gnu.org>
parents:
17102
diff
changeset
|
1579 error ("Invalid use of `\\' in replacement text"); |
9029
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1580 } |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1581 if (substart >= 0) |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1582 { |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1583 if (pos - 1 != lastpos + 1) |
12148
a1c38b9b0f73
(Freplace_match): Do the right thing with backslash.
Karl Heuer <kwzh@gnu.org>
parents:
12147
diff
changeset
|
1584 middle = Fsubstring (newtext, |
a1c38b9b0f73
(Freplace_match): Do the right thing with backslash.
Karl Heuer <kwzh@gnu.org>
parents:
12147
diff
changeset
|
1585 make_number (lastpos + 1), |
a1c38b9b0f73
(Freplace_match): Do the right thing with backslash.
Karl Heuer <kwzh@gnu.org>
parents:
12147
diff
changeset
|
1586 make_number (pos - 1)); |
9029
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1587 else |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1588 middle = Qnil; |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1589 accum = concat3 (accum, middle, |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1590 Fsubstring (string, make_number (substart), |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1591 make_number (subend))); |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1592 lastpos = pos; |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1593 } |
12148
a1c38b9b0f73
(Freplace_match): Do the right thing with backslash.
Karl Heuer <kwzh@gnu.org>
parents:
12147
diff
changeset
|
1594 else if (delbackslash) |
a1c38b9b0f73
(Freplace_match): Do the right thing with backslash.
Karl Heuer <kwzh@gnu.org>
parents:
12147
diff
changeset
|
1595 { |
a1c38b9b0f73
(Freplace_match): Do the right thing with backslash.
Karl Heuer <kwzh@gnu.org>
parents:
12147
diff
changeset
|
1596 middle = Fsubstring (newtext, make_number (lastpos + 1), |
a1c38b9b0f73
(Freplace_match): Do the right thing with backslash.
Karl Heuer <kwzh@gnu.org>
parents:
12147
diff
changeset
|
1597 make_number (pos)); |
a1c38b9b0f73
(Freplace_match): Do the right thing with backslash.
Karl Heuer <kwzh@gnu.org>
parents:
12147
diff
changeset
|
1598 accum = concat2 (accum, middle); |
a1c38b9b0f73
(Freplace_match): Do the right thing with backslash.
Karl Heuer <kwzh@gnu.org>
parents:
12147
diff
changeset
|
1599 lastpos = pos; |
a1c38b9b0f73
(Freplace_match): Do the right thing with backslash.
Karl Heuer <kwzh@gnu.org>
parents:
12147
diff
changeset
|
1600 } |
9029
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1601 } |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1602 |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1603 if (pos != lastpos + 1) |
12148
a1c38b9b0f73
(Freplace_match): Do the right thing with backslash.
Karl Heuer <kwzh@gnu.org>
parents:
12147
diff
changeset
|
1604 middle = Fsubstring (newtext, make_number (lastpos + 1), |
a1c38b9b0f73
(Freplace_match): Do the right thing with backslash.
Karl Heuer <kwzh@gnu.org>
parents:
12147
diff
changeset
|
1605 make_number (pos)); |
9029
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1606 else |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1607 middle = Qnil; |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1608 |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1609 newtext = concat2 (accum, middle); |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1610 } |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1611 |
17225
739e41eed8b6
(Freplace_match): Give error if
Richard M. Stallman <rms@gnu.org>
parents:
17102
diff
changeset
|
1612 /* Do case substitution in NEWTEXT if desired. */ |
9029
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1613 if (case_action == all_caps) |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1614 newtext = Fupcase (newtext); |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1615 else if (case_action == cap_initial) |
12092
b932b2ed40f5
(Freplace_match): Calls to upcase_initials and upcase_initials_region changed
Karl Heuer <kwzh@gnu.org>
parents:
12069
diff
changeset
|
1616 newtext = Fupcase_initials (newtext); |
9029
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1617 |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1618 return concat3 (before, newtext, after); |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1619 } |
f0d89b62dd27
(Freplace_match): New 4th arg OBJECT can specify string to replace in.
Richard M. Stallman <rms@gnu.org>
parents:
8950
diff
changeset
|
1620 |
18077
27a0ced43e7e
(Freplace_match): Use move_if_not_intangible
Richard M. Stallman <rms@gnu.org>
parents:
17463
diff
changeset
|
1621 /* Record point, the move (quietly) to the start of the match. */ |
27a0ced43e7e
(Freplace_match): Use move_if_not_intangible
Richard M. Stallman <rms@gnu.org>
parents:
17463
diff
changeset
|
1622 if (PT > search_regs.start[sub]) |
27a0ced43e7e
(Freplace_match): Use move_if_not_intangible
Richard M. Stallman <rms@gnu.org>
parents:
17463
diff
changeset
|
1623 opoint = PT - ZV; |
27a0ced43e7e
(Freplace_match): Use move_if_not_intangible
Richard M. Stallman <rms@gnu.org>
parents:
17463
diff
changeset
|
1624 else |
27a0ced43e7e
(Freplace_match): Use move_if_not_intangible
Richard M. Stallman <rms@gnu.org>
parents:
17463
diff
changeset
|
1625 opoint = PT; |
27a0ced43e7e
(Freplace_match): Use move_if_not_intangible
Richard M. Stallman <rms@gnu.org>
parents:
17463
diff
changeset
|
1626 |
27a0ced43e7e
(Freplace_match): Use move_if_not_intangible
Richard M. Stallman <rms@gnu.org>
parents:
17463
diff
changeset
|
1627 temp_set_point (search_regs.start[sub], current_buffer); |
27a0ced43e7e
(Freplace_match): Use move_if_not_intangible
Richard M. Stallman <rms@gnu.org>
parents:
17463
diff
changeset
|
1628 |
2655
594a33ffed85
* search.c (Freplace_match): Arrange for markers sitting at the
Jim Blandy <jimb@redhat.com>
parents:
2475
diff
changeset
|
1629 /* We insert the replacement text before the old text, and then |
594a33ffed85
* search.c (Freplace_match): Arrange for markers sitting at the
Jim Blandy <jimb@redhat.com>
parents:
2475
diff
changeset
|
1630 delete the original text. This means that markers at the |
594a33ffed85
* search.c (Freplace_match): Arrange for markers sitting at the
Jim Blandy <jimb@redhat.com>
parents:
2475
diff
changeset
|
1631 beginning or end of the original will float to the corresponding |
594a33ffed85
* search.c (Freplace_match): Arrange for markers sitting at the
Jim Blandy <jimb@redhat.com>
parents:
2475
diff
changeset
|
1632 position in the replacement. */ |
603 | 1633 if (!NILP (literal)) |
4882
8c09f87f5087
(Freplace_match): Fix argument names to match doc string.
Brian Fox <bfox@gnu.org>
parents:
4832
diff
changeset
|
1634 Finsert_and_inherit (1, &newtext); |
603 | 1635 else |
1636 { | |
1637 struct gcpro gcpro1; | |
4882
8c09f87f5087
(Freplace_match): Fix argument names to match doc string.
Brian Fox <bfox@gnu.org>
parents:
4832
diff
changeset
|
1638 GCPRO1 (newtext); |
603 | 1639 |
4882
8c09f87f5087
(Freplace_match): Fix argument names to match doc string.
Brian Fox <bfox@gnu.org>
parents:
4832
diff
changeset
|
1640 for (pos = 0; pos < XSTRING (newtext)->size; pos++) |
603 | 1641 { |
16039
855c8d8ba0f0
Change all references from point to PT.
Karl Heuer <kwzh@gnu.org>
parents:
15667
diff
changeset
|
1642 int offset = PT - search_regs.start[sub]; |
2655
594a33ffed85
* search.c (Freplace_match): Arrange for markers sitting at the
Jim Blandy <jimb@redhat.com>
parents:
2475
diff
changeset
|
1643 |
4882
8c09f87f5087
(Freplace_match): Fix argument names to match doc string.
Brian Fox <bfox@gnu.org>
parents:
4832
diff
changeset
|
1644 c = XSTRING (newtext)->data[pos]; |
603 | 1645 if (c == '\\') |
1646 { | |
4882
8c09f87f5087
(Freplace_match): Fix argument names to match doc string.
Brian Fox <bfox@gnu.org>
parents:
4832
diff
changeset
|
1647 c = XSTRING (newtext)->data[++pos]; |
603 | 1648 if (c == '&') |
2655
594a33ffed85
* search.c (Freplace_match): Arrange for markers sitting at the
Jim Blandy <jimb@redhat.com>
parents:
2475
diff
changeset
|
1649 Finsert_buffer_substring |
594a33ffed85
* search.c (Freplace_match): Arrange for markers sitting at the
Jim Blandy <jimb@redhat.com>
parents:
2475
diff
changeset
|
1650 (Fcurrent_buffer (), |
12807
34d269b30df1
(Freplace_match): New arg SUBEXP.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
1651 make_number (search_regs.start[sub] + offset), |
34d269b30df1
(Freplace_match): New arg SUBEXP.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
1652 make_number (search_regs.end[sub] + offset)); |
7856
9687141f6264
(Freplace_match): Be sure not to treat non-digit like digit.
Richard M. Stallman <rms@gnu.org>
parents:
7674
diff
changeset
|
1653 else if (c >= '1' && c <= '9' && c <= search_regs.num_regs + '0') |
603 | 1654 { |
1655 if (search_regs.start[c - '0'] >= 1) | |
2655
594a33ffed85
* search.c (Freplace_match): Arrange for markers sitting at the
Jim Blandy <jimb@redhat.com>
parents:
2475
diff
changeset
|
1656 Finsert_buffer_substring |
594a33ffed85
* search.c (Freplace_match): Arrange for markers sitting at the
Jim Blandy <jimb@redhat.com>
parents:
2475
diff
changeset
|
1657 (Fcurrent_buffer (), |
594a33ffed85
* search.c (Freplace_match): Arrange for markers sitting at the
Jim Blandy <jimb@redhat.com>
parents:
2475
diff
changeset
|
1658 make_number (search_regs.start[c - '0'] + offset), |
594a33ffed85
* search.c (Freplace_match): Arrange for markers sitting at the
Jim Blandy <jimb@redhat.com>
parents:
2475
diff
changeset
|
1659 make_number (search_regs.end[c - '0'] + offset)); |
603 | 1660 } |
17225
739e41eed8b6
(Freplace_match): Give error if
Richard M. Stallman <rms@gnu.org>
parents:
17102
diff
changeset
|
1661 else if (c == '\\') |
739e41eed8b6
(Freplace_match): Give error if
Richard M. Stallman <rms@gnu.org>
parents:
17102
diff
changeset
|
1662 insert_char (c); |
603 | 1663 else |
17225
739e41eed8b6
(Freplace_match): Give error if
Richard M. Stallman <rms@gnu.org>
parents:
17102
diff
changeset
|
1664 error ("Invalid use of `\\' in replacement text"); |
603 | 1665 } |
1666 else | |
1667 insert_char (c); | |
1668 } | |
1669 UNGCPRO; | |
1670 } | |
1671 | |
16039
855c8d8ba0f0
Change all references from point to PT.
Karl Heuer <kwzh@gnu.org>
parents:
15667
diff
changeset
|
1672 inslen = PT - (search_regs.start[sub]); |
12807
34d269b30df1
(Freplace_match): New arg SUBEXP.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
1673 del_range (search_regs.start[sub] + inslen, search_regs.end[sub] + inslen); |
603 | 1674 |
1675 if (case_action == all_caps) | |
16039
855c8d8ba0f0
Change all references from point to PT.
Karl Heuer <kwzh@gnu.org>
parents:
15667
diff
changeset
|
1676 Fupcase_region (make_number (PT - inslen), make_number (PT)); |
603 | 1677 else if (case_action == cap_initial) |
16039
855c8d8ba0f0
Change all references from point to PT.
Karl Heuer <kwzh@gnu.org>
parents:
15667
diff
changeset
|
1678 Fupcase_initials_region (make_number (PT - inslen), make_number (PT)); |
18077
27a0ced43e7e
(Freplace_match): Use move_if_not_intangible
Richard M. Stallman <rms@gnu.org>
parents:
17463
diff
changeset
|
1679 |
18081
300068b4fcef
(Freplace_match): Fix previous change.
Richard M. Stallman <rms@gnu.org>
parents:
18077
diff
changeset
|
1680 newpoint = PT; |
300068b4fcef
(Freplace_match): Fix previous change.
Richard M. Stallman <rms@gnu.org>
parents:
18077
diff
changeset
|
1681 |
18077
27a0ced43e7e
(Freplace_match): Use move_if_not_intangible
Richard M. Stallman <rms@gnu.org>
parents:
17463
diff
changeset
|
1682 /* Put point back where it was in the text. */ |
18124
6f2c80d2425a
(Freplace_match): If opoint is 0, that's relative to ZV.
Richard M. Stallman <rms@gnu.org>
parents:
18112
diff
changeset
|
1683 if (opoint <= 0) |
18077
27a0ced43e7e
(Freplace_match): Use move_if_not_intangible
Richard M. Stallman <rms@gnu.org>
parents:
17463
diff
changeset
|
1684 temp_set_point (opoint + ZV, current_buffer); |
27a0ced43e7e
(Freplace_match): Use move_if_not_intangible
Richard M. Stallman <rms@gnu.org>
parents:
17463
diff
changeset
|
1685 else |
27a0ced43e7e
(Freplace_match): Use move_if_not_intangible
Richard M. Stallman <rms@gnu.org>
parents:
17463
diff
changeset
|
1686 temp_set_point (opoint, current_buffer); |
27a0ced43e7e
(Freplace_match): Use move_if_not_intangible
Richard M. Stallman <rms@gnu.org>
parents:
17463
diff
changeset
|
1687 |
27a0ced43e7e
(Freplace_match): Use move_if_not_intangible
Richard M. Stallman <rms@gnu.org>
parents:
17463
diff
changeset
|
1688 /* Now move point "officially" to the start of the inserted replacement. */ |
18081
300068b4fcef
(Freplace_match): Fix previous change.
Richard M. Stallman <rms@gnu.org>
parents:
18077
diff
changeset
|
1689 move_if_not_intangible (newpoint); |
18077
27a0ced43e7e
(Freplace_match): Use move_if_not_intangible
Richard M. Stallman <rms@gnu.org>
parents:
17463
diff
changeset
|
1690 |
603 | 1691 return Qnil; |
1692 } | |
1693 | |
1694 static Lisp_Object | |
1695 match_limit (num, beginningp) | |
1696 Lisp_Object num; | |
1697 int beginningp; | |
1698 { | |
1699 register int n; | |
1700 | |
1701 CHECK_NUMBER (num, 0); | |
1702 n = XINT (num); | |
621 | 1703 if (n < 0 || n >= search_regs.num_regs) |
1704 args_out_of_range (num, make_number (search_regs.num_regs)); | |
1705 if (search_regs.num_regs <= 0 | |
1706 || search_regs.start[n] < 0) | |
603 | 1707 return Qnil; |
1708 return (make_number ((beginningp) ? search_regs.start[n] | |
1709 : search_regs.end[n])); | |
1710 } | |
1711 | |
1712 DEFUN ("match-beginning", Fmatch_beginning, Smatch_beginning, 1, 1, 0, | |
1713 "Return position of start of text matched by last search.\n\ | |
14086
a410808fda15
(Fmatch_end, Fregexp_quote): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
1714 SUBEXP, a number, specifies which parenthesized expression in the last\n\ |
a410808fda15
(Fmatch_end, Fregexp_quote): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
1715 regexp.\n\ |
a410808fda15
(Fmatch_end, Fregexp_quote): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
1716 Value is nil if SUBEXPth pair didn't match, or there were less than\n\ |
a410808fda15
(Fmatch_end, Fregexp_quote): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
1717 SUBEXP pairs.\n\ |
603 | 1718 Zero means the entire text matched by the whole regexp or whole string.") |
14086
a410808fda15
(Fmatch_end, Fregexp_quote): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
1719 (subexp) |
a410808fda15
(Fmatch_end, Fregexp_quote): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
1720 Lisp_Object subexp; |
603 | 1721 { |
14086
a410808fda15
(Fmatch_end, Fregexp_quote): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
1722 return match_limit (subexp, 1); |
603 | 1723 } |
1724 | |
1725 DEFUN ("match-end", Fmatch_end, Smatch_end, 1, 1, 0, | |
1726 "Return position of end of text matched by last search.\n\ | |
14086
a410808fda15
(Fmatch_end, Fregexp_quote): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
1727 SUBEXP, a number, specifies which parenthesized expression in the last\n\ |
a410808fda15
(Fmatch_end, Fregexp_quote): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
1728 regexp.\n\ |
a410808fda15
(Fmatch_end, Fregexp_quote): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
1729 Value is nil if SUBEXPth pair didn't match, or there were less than\n\ |
a410808fda15
(Fmatch_end, Fregexp_quote): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
1730 SUBEXP pairs.\n\ |
603 | 1731 Zero means the entire text matched by the whole regexp or whole string.") |
14086
a410808fda15
(Fmatch_end, Fregexp_quote): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
1732 (subexp) |
a410808fda15
(Fmatch_end, Fregexp_quote): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
1733 Lisp_Object subexp; |
603 | 1734 { |
14086
a410808fda15
(Fmatch_end, Fregexp_quote): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
1735 return match_limit (subexp, 0); |
603 | 1736 } |
1737 | |
16724
4b1fb372a4fe
(Fmatch_data): New args INTEGERS and REUSE.
Richard M. Stallman <rms@gnu.org>
parents:
16275
diff
changeset
|
1738 DEFUN ("match-data", Fmatch_data, Smatch_data, 0, 2, 0, |
603 | 1739 "Return a list containing all info on what the last search matched.\n\ |
1740 Element 2N is `(match-beginning N)'; element 2N + 1 is `(match-end N)'.\n\ | |
1741 All the elements are markers or nil (nil if the Nth pair didn't match)\n\ | |
1742 if the last match was on a buffer; integers or nil if a string was matched.\n\ | |
16724
4b1fb372a4fe
(Fmatch_data): New args INTEGERS and REUSE.
Richard M. Stallman <rms@gnu.org>
parents:
16275
diff
changeset
|
1743 Use `store-match-data' to reinstate the data in this list.\n\ |
4b1fb372a4fe
(Fmatch_data): New args INTEGERS and REUSE.
Richard M. Stallman <rms@gnu.org>
parents:
16275
diff
changeset
|
1744 \n\ |
4b1fb372a4fe
(Fmatch_data): New args INTEGERS and REUSE.
Richard M. Stallman <rms@gnu.org>
parents:
16275
diff
changeset
|
1745 If INTEGERS (the optional first argument) is non-nil, always use integers\n\ |
16731
039ef6e74d3a
(Fmatch_data): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
16724
diff
changeset
|
1746 \(rather than markers) to represent buffer positions.\n\ |
16724
4b1fb372a4fe
(Fmatch_data): New args INTEGERS and REUSE.
Richard M. Stallman <rms@gnu.org>
parents:
16275
diff
changeset
|
1747 If REUSE is a list, reuse it as part of the value. If REUSE is long enough\n\ |
4b1fb372a4fe
(Fmatch_data): New args INTEGERS and REUSE.
Richard M. Stallman <rms@gnu.org>
parents:
16275
diff
changeset
|
1748 to hold all the values, and if INTEGERS is non-nil, no consing is done.") |
4b1fb372a4fe
(Fmatch_data): New args INTEGERS and REUSE.
Richard M. Stallman <rms@gnu.org>
parents:
16275
diff
changeset
|
1749 (integers, reuse) |
4b1fb372a4fe
(Fmatch_data): New args INTEGERS and REUSE.
Richard M. Stallman <rms@gnu.org>
parents:
16275
diff
changeset
|
1750 Lisp_Object integers, reuse; |
603 | 1751 { |
16724
4b1fb372a4fe
(Fmatch_data): New args INTEGERS and REUSE.
Richard M. Stallman <rms@gnu.org>
parents:
16275
diff
changeset
|
1752 Lisp_Object tail, prev; |
621 | 1753 Lisp_Object *data; |
603 | 1754 int i, len; |
1755 | |
727 | 1756 if (NILP (last_thing_searched)) |
15667
9531c03134b6
(Fmatch_data): If no matching done yet, return Qnil.
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
1757 return Qnil; |
727 | 1758 |
621 | 1759 data = (Lisp_Object *) alloca ((2 * search_regs.num_regs) |
1760 * sizeof (Lisp_Object)); | |
1761 | |
603 | 1762 len = -1; |
621 | 1763 for (i = 0; i < search_regs.num_regs; i++) |
603 | 1764 { |
1765 int start = search_regs.start[i]; | |
1766 if (start >= 0) | |
1767 { | |
16724
4b1fb372a4fe
(Fmatch_data): New args INTEGERS and REUSE.
Richard M. Stallman <rms@gnu.org>
parents:
16275
diff
changeset
|
1768 if (EQ (last_thing_searched, Qt) |
4b1fb372a4fe
(Fmatch_data): New args INTEGERS and REUSE.
Richard M. Stallman <rms@gnu.org>
parents:
16275
diff
changeset
|
1769 || ! NILP (integers)) |
603 | 1770 { |
9319
7969182b6cc6
(skip_chars, Fmatch_data, Fstore_match_data): Don't use XFASTINT as an lvalue.
Karl Heuer <kwzh@gnu.org>
parents:
9278
diff
changeset
|
1771 XSETFASTINT (data[2 * i], start); |
7969182b6cc6
(skip_chars, Fmatch_data, Fstore_match_data): Don't use XFASTINT as an lvalue.
Karl Heuer <kwzh@gnu.org>
parents:
9278
diff
changeset
|
1772 XSETFASTINT (data[2 * i + 1], search_regs.end[i]); |
603 | 1773 } |
9113
766b6288e0f2
(Fmatch_data, Fstore_match_data): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9029
diff
changeset
|
1774 else if (BUFFERP (last_thing_searched)) |
603 | 1775 { |
1776 data[2 * i] = Fmake_marker (); | |
727 | 1777 Fset_marker (data[2 * i], |
1778 make_number (start), | |
1779 last_thing_searched); | |
603 | 1780 data[2 * i + 1] = Fmake_marker (); |
1781 Fset_marker (data[2 * i + 1], | |
727 | 1782 make_number (search_regs.end[i]), |
1783 last_thing_searched); | |
603 | 1784 } |
727 | 1785 else |
1786 /* last_thing_searched must always be Qt, a buffer, or Qnil. */ | |
1787 abort (); | |
1788 | |
603 | 1789 len = i; |
1790 } | |
1791 else | |
1792 data[2 * i] = data [2 * i + 1] = Qnil; | |
1793 } | |
16724
4b1fb372a4fe
(Fmatch_data): New args INTEGERS and REUSE.
Richard M. Stallman <rms@gnu.org>
parents:
16275
diff
changeset
|
1794 |
4b1fb372a4fe
(Fmatch_data): New args INTEGERS and REUSE.
Richard M. Stallman <rms@gnu.org>
parents:
16275
diff
changeset
|
1795 /* If REUSE is not usable, cons up the values and return them. */ |
4b1fb372a4fe
(Fmatch_data): New args INTEGERS and REUSE.
Richard M. Stallman <rms@gnu.org>
parents:
16275
diff
changeset
|
1796 if (! CONSP (reuse)) |
4b1fb372a4fe
(Fmatch_data): New args INTEGERS and REUSE.
Richard M. Stallman <rms@gnu.org>
parents:
16275
diff
changeset
|
1797 return Flist (2 * len + 2, data); |
4b1fb372a4fe
(Fmatch_data): New args INTEGERS and REUSE.
Richard M. Stallman <rms@gnu.org>
parents:
16275
diff
changeset
|
1798 |
4b1fb372a4fe
(Fmatch_data): New args INTEGERS and REUSE.
Richard M. Stallman <rms@gnu.org>
parents:
16275
diff
changeset
|
1799 /* If REUSE is a list, store as many value elements as will fit |
4b1fb372a4fe
(Fmatch_data): New args INTEGERS and REUSE.
Richard M. Stallman <rms@gnu.org>
parents:
16275
diff
changeset
|
1800 into the elements of REUSE. */ |
4b1fb372a4fe
(Fmatch_data): New args INTEGERS and REUSE.
Richard M. Stallman <rms@gnu.org>
parents:
16275
diff
changeset
|
1801 for (i = 0, tail = reuse; CONSP (tail); |
4b1fb372a4fe
(Fmatch_data): New args INTEGERS and REUSE.
Richard M. Stallman <rms@gnu.org>
parents:
16275
diff
changeset
|
1802 i++, tail = XCONS (tail)->cdr) |
4b1fb372a4fe
(Fmatch_data): New args INTEGERS and REUSE.
Richard M. Stallman <rms@gnu.org>
parents:
16275
diff
changeset
|
1803 { |
4b1fb372a4fe
(Fmatch_data): New args INTEGERS and REUSE.
Richard M. Stallman <rms@gnu.org>
parents:
16275
diff
changeset
|
1804 if (i < 2 * len + 2) |
4b1fb372a4fe
(Fmatch_data): New args INTEGERS and REUSE.
Richard M. Stallman <rms@gnu.org>
parents:
16275
diff
changeset
|
1805 XCONS (tail)->car = data[i]; |
4b1fb372a4fe
(Fmatch_data): New args INTEGERS and REUSE.
Richard M. Stallman <rms@gnu.org>
parents:
16275
diff
changeset
|
1806 else |
4b1fb372a4fe
(Fmatch_data): New args INTEGERS and REUSE.
Richard M. Stallman <rms@gnu.org>
parents:
16275
diff
changeset
|
1807 XCONS (tail)->car = Qnil; |
4b1fb372a4fe
(Fmatch_data): New args INTEGERS and REUSE.
Richard M. Stallman <rms@gnu.org>
parents:
16275
diff
changeset
|
1808 prev = tail; |
4b1fb372a4fe
(Fmatch_data): New args INTEGERS and REUSE.
Richard M. Stallman <rms@gnu.org>
parents:
16275
diff
changeset
|
1809 } |
4b1fb372a4fe
(Fmatch_data): New args INTEGERS and REUSE.
Richard M. Stallman <rms@gnu.org>
parents:
16275
diff
changeset
|
1810 |
4b1fb372a4fe
(Fmatch_data): New args INTEGERS and REUSE.
Richard M. Stallman <rms@gnu.org>
parents:
16275
diff
changeset
|
1811 /* If we couldn't fit all value elements into REUSE, |
4b1fb372a4fe
(Fmatch_data): New args INTEGERS and REUSE.
Richard M. Stallman <rms@gnu.org>
parents:
16275
diff
changeset
|
1812 cons up the rest of them and add them to the end of REUSE. */ |
4b1fb372a4fe
(Fmatch_data): New args INTEGERS and REUSE.
Richard M. Stallman <rms@gnu.org>
parents:
16275
diff
changeset
|
1813 if (i < 2 * len + 2) |
4b1fb372a4fe
(Fmatch_data): New args INTEGERS and REUSE.
Richard M. Stallman <rms@gnu.org>
parents:
16275
diff
changeset
|
1814 XCONS (prev)->cdr = Flist (2 * len + 2 - i, data + i); |
4b1fb372a4fe
(Fmatch_data): New args INTEGERS and REUSE.
Richard M. Stallman <rms@gnu.org>
parents:
16275
diff
changeset
|
1815 |
4b1fb372a4fe
(Fmatch_data): New args INTEGERS and REUSE.
Richard M. Stallman <rms@gnu.org>
parents:
16275
diff
changeset
|
1816 return reuse; |
603 | 1817 } |
1818 | |
1819 | |
1820 DEFUN ("store-match-data", Fstore_match_data, Sstore_match_data, 1, 1, 0, | |
1821 "Set internal data on last search match from elements of LIST.\n\ | |
1822 LIST should have been created by calling `match-data' previously.") | |
1823 (list) | |
1824 register Lisp_Object list; | |
1825 { | |
1826 register int i; | |
1827 register Lisp_Object marker; | |
1828 | |
10032
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
1829 if (running_asynch_code) |
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
1830 save_search_regs (); |
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
1831 |
603 | 1832 if (!CONSP (list) && !NILP (list)) |
1926
952f2a18f83d
* callint.c (Fcall_interactively): Pass the correct number of
Jim Blandy <jimb@redhat.com>
parents:
1896
diff
changeset
|
1833 list = wrong_type_argument (Qconsp, list); |
603 | 1834 |
727 | 1835 /* Unless we find a marker with a buffer in LIST, assume that this |
1836 match data came from a string. */ | |
1837 last_thing_searched = Qt; | |
1838 | |
621 | 1839 /* Allocate registers if they don't already exist. */ |
1840 { | |
1523
bd61aaa7828b
* search.c (Fstore_match_data): Don't assume Flength returns an
Jim Blandy <jimb@redhat.com>
parents:
1413
diff
changeset
|
1841 int length = XFASTINT (Flength (list)) / 2; |
621 | 1842 |
1843 if (length > search_regs.num_regs) | |
1844 { | |
708 | 1845 if (search_regs.num_regs == 0) |
1846 { | |
1847 search_regs.start | |
1848 = (regoff_t *) xmalloc (length * sizeof (regoff_t)); | |
1849 search_regs.end | |
1850 = (regoff_t *) xmalloc (length * sizeof (regoff_t)); | |
1851 } | |
621 | 1852 else |
708 | 1853 { |
1854 search_regs.start | |
1855 = (regoff_t *) xrealloc (search_regs.start, | |
1856 length * sizeof (regoff_t)); | |
1857 search_regs.end | |
1858 = (regoff_t *) xrealloc (search_regs.end, | |
1859 length * sizeof (regoff_t)); | |
1860 } | |
621 | 1861 |
9605
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
1862 search_regs.num_regs = length; |
621 | 1863 } |
1864 } | |
1865 | |
1866 for (i = 0; i < search_regs.num_regs; i++) | |
603 | 1867 { |
1868 marker = Fcar (list); | |
1869 if (NILP (marker)) | |
1870 { | |
1871 search_regs.start[i] = -1; | |
1872 list = Fcdr (list); | |
1873 } | |
1874 else | |
1875 { | |
9113
766b6288e0f2
(Fmatch_data, Fstore_match_data): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9029
diff
changeset
|
1876 if (MARKERP (marker)) |
727 | 1877 { |
1878 if (XMARKER (marker)->buffer == 0) | |
9319
7969182b6cc6
(skip_chars, Fmatch_data, Fstore_match_data): Don't use XFASTINT as an lvalue.
Karl Heuer <kwzh@gnu.org>
parents:
9278
diff
changeset
|
1879 XSETFASTINT (marker, 0); |
727 | 1880 else |
9278
f2138d548313
(Flooking_at, skip_chars, search_buffer, set_search_regs, Fstore_match_data):
Karl Heuer <kwzh@gnu.org>
parents:
9113
diff
changeset
|
1881 XSETBUFFER (last_thing_searched, XMARKER (marker)->buffer); |
727 | 1882 } |
603 | 1883 |
1884 CHECK_NUMBER_COERCE_MARKER (marker, 0); | |
1885 search_regs.start[i] = XINT (marker); | |
1886 list = Fcdr (list); | |
1887 | |
1888 marker = Fcar (list); | |
9113
766b6288e0f2
(Fmatch_data, Fstore_match_data): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9029
diff
changeset
|
1889 if (MARKERP (marker) && XMARKER (marker)->buffer == 0) |
9319
7969182b6cc6
(skip_chars, Fmatch_data, Fstore_match_data): Don't use XFASTINT as an lvalue.
Karl Heuer <kwzh@gnu.org>
parents:
9278
diff
changeset
|
1890 XSETFASTINT (marker, 0); |
603 | 1891 |
1892 CHECK_NUMBER_COERCE_MARKER (marker, 0); | |
1893 search_regs.end[i] = XINT (marker); | |
1894 } | |
1895 list = Fcdr (list); | |
1896 } | |
1897 | |
1898 return Qnil; | |
1899 } | |
1900 | |
10032
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
1901 /* If non-zero the match data have been saved in saved_search_regs |
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
1902 during the execution of a sentinel or filter. */ |
10128
59ccd063e016
(search_regs_saved): Delete initializer.
Richard M. Stallman <rms@gnu.org>
parents:
10055
diff
changeset
|
1903 static int search_regs_saved; |
10032
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
1904 static struct re_registers saved_search_regs; |
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
1905 |
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
1906 /* Called from Flooking_at, Fstring_match, search_buffer, Fstore_match_data |
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
1907 if asynchronous code (filter or sentinel) is running. */ |
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
1908 static void |
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
1909 save_search_regs () |
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
1910 { |
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
1911 if (!search_regs_saved) |
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
1912 { |
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
1913 saved_search_regs.num_regs = search_regs.num_regs; |
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
1914 saved_search_regs.start = search_regs.start; |
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
1915 saved_search_regs.end = search_regs.end; |
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
1916 search_regs.num_regs = 0; |
10250
422c3b96efda
(set_search_regs): Really set search_regs.start and .end.
Richard M. Stallman <rms@gnu.org>
parents:
10141
diff
changeset
|
1917 search_regs.start = 0; |
422c3b96efda
(set_search_regs): Really set search_regs.start and .end.
Richard M. Stallman <rms@gnu.org>
parents:
10141
diff
changeset
|
1918 search_regs.end = 0; |
10032
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
1919 |
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
1920 search_regs_saved = 1; |
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
1921 } |
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
1922 } |
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
1923 |
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
1924 /* Called upon exit from filters and sentinels. */ |
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
1925 void |
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
1926 restore_match_data () |
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
1927 { |
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
1928 if (search_regs_saved) |
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
1929 { |
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
1930 if (search_regs.num_regs > 0) |
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
1931 { |
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
1932 xfree (search_regs.start); |
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
1933 xfree (search_regs.end); |
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
1934 } |
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
1935 search_regs.num_regs = saved_search_regs.num_regs; |
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
1936 search_regs.start = saved_search_regs.start; |
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
1937 search_regs.end = saved_search_regs.end; |
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
1938 |
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
1939 search_regs_saved = 0; |
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
1940 } |
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
1941 } |
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potortì <pot@gnu.org>
parents:
10020
diff
changeset
|
1942 |
603 | 1943 /* Quote a string to inactivate reg-expr chars */ |
1944 | |
1945 DEFUN ("regexp-quote", Fregexp_quote, Sregexp_quote, 1, 1, 0, | |
1946 "Return a regexp string which matches exactly STRING and nothing else.") | |
14086
a410808fda15
(Fmatch_end, Fregexp_quote): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
1947 (string) |
a410808fda15
(Fmatch_end, Fregexp_quote): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
1948 Lisp_Object string; |
603 | 1949 { |
1950 register unsigned char *in, *out, *end; | |
1951 register unsigned char *temp; | |
1952 | |
14086
a410808fda15
(Fmatch_end, Fregexp_quote): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
1953 CHECK_STRING (string, 0); |
603 | 1954 |
14086
a410808fda15
(Fmatch_end, Fregexp_quote): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
1955 temp = (unsigned char *) alloca (XSTRING (string)->size * 2); |
603 | 1956 |
1957 /* Now copy the data into the new string, inserting escapes. */ | |
1958 | |
14086
a410808fda15
(Fmatch_end, Fregexp_quote): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
1959 in = XSTRING (string)->data; |
a410808fda15
(Fmatch_end, Fregexp_quote): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
1960 end = in + XSTRING (string)->size; |
603 | 1961 out = temp; |
1962 | |
1963 for (; in != end; in++) | |
1964 { | |
1965 if (*in == '[' || *in == ']' | |
1966 || *in == '*' || *in == '.' || *in == '\\' | |
1967 || *in == '?' || *in == '+' | |
1968 || *in == '^' || *in == '$') | |
1969 *out++ = '\\'; | |
1970 *out++ = *in; | |
1971 } | |
1972 | |
1973 return make_string (temp, out - temp); | |
1974 } | |
1975 | |
1976 syms_of_search () | |
1977 { | |
1978 register int i; | |
1979 | |
9605
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
1980 for (i = 0; i < REGEXP_CACHE_SIZE; ++i) |
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
1981 { |
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
1982 searchbufs[i].buf.allocated = 100; |
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
1983 searchbufs[i].buf.buffer = (unsigned char *) malloc (100); |
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
1984 searchbufs[i].buf.fastmap = searchbufs[i].fastmap; |
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
1985 searchbufs[i].regexp = Qnil; |
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
1986 staticpro (&searchbufs[i].regexp); |
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
1987 searchbufs[i].next = (i == REGEXP_CACHE_SIZE-1 ? 0 : &searchbufs[i+1]); |
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
1988 } |
cf97e75d8e02
(searchbufs): New variable, replaces searchbuf and last_regexp and
Karl Heuer <kwzh@gnu.org>
parents:
9452
diff
changeset
|
1989 searchbuf_head = &searchbufs[0]; |
603 | 1990 |
1991 Qsearch_failed = intern ("search-failed"); | |
1992 staticpro (&Qsearch_failed); | |
1993 Qinvalid_regexp = intern ("invalid-regexp"); | |
1994 staticpro (&Qinvalid_regexp); | |
1995 | |
1996 Fput (Qsearch_failed, Qerror_conditions, | |
1997 Fcons (Qsearch_failed, Fcons (Qerror, Qnil))); | |
1998 Fput (Qsearch_failed, Qerror_message, | |
1999 build_string ("Search failed")); | |
2000 | |
2001 Fput (Qinvalid_regexp, Qerror_conditions, | |
2002 Fcons (Qinvalid_regexp, Fcons (Qerror, Qnil))); | |
2003 Fput (Qinvalid_regexp, Qerror_message, | |
2004 build_string ("Invalid regexp")); | |
2005 | |
727 | 2006 last_thing_searched = Qnil; |
2007 staticpro (&last_thing_searched); | |
2008 | |
10020
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
2009 defsubr (&Slooking_at); |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
2010 defsubr (&Sposix_looking_at); |
603 | 2011 defsubr (&Sstring_match); |
10020
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
2012 defsubr (&Sposix_string_match); |
603 | 2013 defsubr (&Ssearch_forward); |
2014 defsubr (&Ssearch_backward); | |
2015 defsubr (&Sword_search_forward); | |
2016 defsubr (&Sword_search_backward); | |
2017 defsubr (&Sre_search_forward); | |
2018 defsubr (&Sre_search_backward); | |
10020
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
2019 defsubr (&Sposix_search_forward); |
c41ce96785a8
(struct regexp_cache): New field `posix'.
Richard M. Stallman <rms@gnu.org>
parents:
9605
diff
changeset
|
2020 defsubr (&Sposix_search_backward); |
603 | 2021 defsubr (&Sreplace_match); |
2022 defsubr (&Smatch_beginning); | |
2023 defsubr (&Smatch_end); | |
2024 defsubr (&Smatch_data); | |
2025 defsubr (&Sstore_match_data); | |
2026 defsubr (&Sregexp_quote); | |
2027 } |