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