annotate src/search.c @ 771:943eaba38521

[xemacs-hg @ 2002-03-13 08:51:24 by ben] The big ben-mule-21-5 check-in! Various files were added and deleted. See CHANGES-ben-mule. There are still some test suite failures. No crashes, though. Many of the failures have to do with problems in the test suite itself rather than in the actual code. I'll be addressing these in the next day or so -- none of the test suite failures are at all critical. Meanwhile I'll be trying to address the biggest issues -- i.e. build or run failures, which will almost certainly happen on various platforms. All comments should be sent to ben@xemacs.org -- use a Cc: if necessary when sending to mailing lists. There will be pre- and post- tags, something like pre-ben-mule-21-5-merge-in, and post-ben-mule-21-5-merge-in.
author ben
date Wed, 13 Mar 2002 08:54:06 +0000
parents a307f9a2021d
children e38acbeb1cae
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 /* String search routines for XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2 Copyright (C) 1985, 1986, 1987, 1992-1995 Free Software Foundation, Inc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3 Copyright (C) 1995 Sun Microsystems, Inc.
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
4 Copyright (C) 2001 Ben Wing.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6 This file is part of XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8 XEmacs is free software; you can redistribute it and/or modify it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9 under the terms of the GNU General Public License as published by the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10 Free Software Foundation; either version 2, or (at your option) any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11 later version.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13 XEmacs is distributed in the hope that it will be useful, but WITHOUT
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16 for more details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18 You should have received a copy of the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 along with XEmacs; see the file COPYING. If not, write to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21 Boston, MA 02111-1307, USA. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23 /* Synched up with: FSF 19.29, except for region-cache stuff. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25 /* Hacked on for Mule by Ben Wing, December 1994 and August 1995. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27 /* This file has been Mule-ized except for the TRT stuff. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29 #include <config.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30 #include "lisp.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32 #include "buffer.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 #include "insdel.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34 #include "opaque.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35 #ifdef REGION_CACHE_NEEDS_WORK
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36 #include "region-cache.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38 #include "syntax.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40 #include <sys/types.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41 #include "regex.h"
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
42 #include "casetab.h"
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
43 #include "chartab.h"
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
44
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
45 #define TRANSLATE(table, pos) \
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
46 (!NILP (table) ? TRT_TABLE_OF (table, (Emchar) pos) : pos)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48 #define REGEXP_CACHE_SIZE 20
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 /* If the regexp is non-nil, then the buffer contains the compiled form
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51 of that regexp, suitable for searching. */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
52 struct regexp_cache
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
53 {
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 struct regexp_cache *next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 Lisp_Object regexp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 struct re_pattern_buffer buf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 char fastmap[0400];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 /* Nonzero means regexp was compiled to do full POSIX backtracking. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59 char posix;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 /* The instances of that struct. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63 static struct regexp_cache searchbufs[REGEXP_CACHE_SIZE];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 /* The head of the linked list; points to the most recently used buffer. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 static struct regexp_cache *searchbuf_head;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 /* Every call to re_match, etc., must pass &search_regs as the regs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70 argument unless you can show it is unnecessary (i.e., if re_match
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71 is certainly going to be called again before region-around-match
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72 can be called).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 Since the registers are now dynamically allocated, we need to make
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 sure not to refer to the Nth register before checking that it has
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76 been allocated by checking search_regs.num_regs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78 The regex code keeps track of whether it has allocated the search
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 buffer using bits in the re_pattern_buffer. This means that whenever
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 you compile a new pattern, it completely forgets whether it has
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 allocated any registers, and will allocate new registers the next
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 time you call a searching or matching function. Therefore, we need
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 to call re_set_registers after compiling a new pattern or after
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84 setting the match registers, so that the regex functions will be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85 able to free or re-allocate it properly. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 /* Note: things get trickier under Mule because the values returned from
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
88 the regexp routines are in Bytebposs but we need them to be in Charbpos's.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 We take the easy way out for the moment and just convert them immediately.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 We could be more clever by not converting them until necessary, but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 that gets real ugly real fast since the buffer might have changed and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92 the positions might be out of sync or out of range.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 static struct re_registers search_regs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 /* The buffer in which the last search was performed, or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 Qt if the last search was done in a string;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98 Qnil if no searching has been done yet. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 static Lisp_Object last_thing_searched;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101 /* error condition signalled when regexp compile_pattern fails */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 Lisp_Object Qinvalid_regexp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 /* Regular expressions used in forward/backward-word */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 Lisp_Object Vforward_word_regexp, Vbackward_word_regexp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107
507
167135c7a7ae [xemacs-hg @ 2001-05-05 10:10:36 by martinb]
martinb
parents: 502
diff changeset
108 Fixnum warn_about_possibly_incompatible_back_references;
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 469
diff changeset
109
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110 /* range table for use with skip_chars. Only needed for Mule. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111 Lisp_Object Vskip_chars_range_table;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
113 static void set_search_regs (struct buffer *buf, Charbpos beg, Charcount len);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114 static void save_search_regs (void);
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
115 static Charbpos simple_search (struct buffer *buf, Intbyte *base_pat,
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
116 Bytecount len, Bytebpos pos, Bytebpos lim,
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
117 EMACS_INT n, Lisp_Object trt);
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
118 static Charbpos boyer_moore (struct buffer *buf, Intbyte *base_pat,
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
119 Bytecount len, Bytebpos pos, Bytebpos lim,
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
120 EMACS_INT n, Lisp_Object trt,
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
121 Lisp_Object inverse_trt, int charset_base);
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
122 static Charbpos search_buffer (struct buffer *buf, Lisp_Object str,
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
123 Charbpos charbpos, Charbpos buflim, EMACS_INT n, int RE,
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
124 Lisp_Object trt, Lisp_Object inverse_trt,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125 int posix);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
127 struct regex_reentrancy
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
128 {
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
129 struct syntax_cache cache;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
130 struct buffer *regex_emacs_buffer;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
131 Lisp_Object regex_match_object;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
132 };
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
133
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
134 typedef struct
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
135 {
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
136 Dynarr_declare (struct regex_reentrancy);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
137 } regex_reentrancy_dynarr;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
138
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
139 static regex_reentrancy_dynarr *the_regex_reentrancy_dynarr;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
140
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
141 static Lisp_Object
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
142 restore_regex_reentrancy (Lisp_Object dummy)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
143 {
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
144 struct regex_reentrancy rr = Dynarr_pop (the_regex_reentrancy_dynarr);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
145 syntax_cache = rr.cache;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
146 regex_emacs_buffer = rr.regex_emacs_buffer;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
147 regex_match_object = rr.regex_match_object;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
148 return Qnil;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
149 }
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
150
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
151 static int
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
152 begin_regex_reentrancy (void)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
153 {
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
154 /* #### there is still a potential problem with the regex cache --
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
155 the compiled regex could be overwritten. we'd need 20-fold
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
156 reentrancy, though. */
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
157 struct regex_reentrancy rr;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
158 rr.cache = syntax_cache;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
159 rr.regex_emacs_buffer = regex_emacs_buffer;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
160 rr.regex_match_object = regex_match_object;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
161 if (!the_regex_reentrancy_dynarr)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
162 the_regex_reentrancy_dynarr = Dynarr_new2 (regex_reentrancy_dynarr,
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
163 struct regex_reentrancy);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
164 Dynarr_add (the_regex_reentrancy_dynarr, rr);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
165 return record_unwind_protect (restore_regex_reentrancy, Qnil);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
166 }
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
167
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 matcher_overflow (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 507
diff changeset
171 stack_overflow ("Stack overflow in regexp matcher", Qunbound);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 /* Compile a regexp and signal a Lisp error if anything goes wrong.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 PATTERN is the pattern to compile.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 CP is the place to put the result.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 TRANSLATE is a translation table for ignoring case, or NULL for none.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 REGP is the structure that says where to store the "register"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 values that will result from matching this pattern.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 If it is 0, we should compile the pattern not to record any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 subexpression bounds.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 POSIX is nonzero if we want full backtracking (POSIX style)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 for this pattern. 0 means backtrack only enough to get a valid match. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 compile_pattern_1 (struct regexp_cache *cp, Lisp_Object pattern,
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
187 Lisp_Object translate, struct re_registers *regp, int posix,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
188 Error_Behavior errb)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
190 const char *val;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 reg_syntax_t old;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 cp->regexp = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 cp->buf.translate = translate;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 cp->posix = posix;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 old = re_set_syntax (RE_SYNTAX_EMACS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 | (posix ? 0 : RE_NO_POSIX_BACKTRACKING));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
198 val = (const char *)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 re_compile_pattern ((char *) XSTRING_DATA (pattern),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 XSTRING_LENGTH (pattern), &cp->buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201 re_set_syntax (old);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202 if (val)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 507
diff changeset
204 maybe_signal_error (Qinvalid_regexp, 0, build_string (val),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 Qsearch, errb);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 cp->regexp = Fcopy_sequence (pattern);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 /* Compile a regexp if necessary, but first check to see if there's one in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 the cache.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 PATTERN is the pattern to compile.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 TRANSLATE is a translation table for ignoring case, or NULL for none.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 REGP is the structure that says where to store the "register"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 values that will result from matching this pattern.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 If it is 0, we should compile the pattern not to record any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 subexpression bounds.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 POSIX is nonzero if we want full backtracking (POSIX style)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 for this pattern. 0 means backtrack only enough to get a valid match. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 struct re_pattern_buffer *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 compile_pattern (Lisp_Object pattern, struct re_registers *regp,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
226 Lisp_Object translate, int posix, Error_Behavior errb)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 struct regexp_cache *cp, **cpp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 for (cpp = &searchbuf_head; ; cpp = &cp->next)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 cp = *cpp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 if (!NILP (Fstring_equal (cp->regexp, pattern))
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
234 && EQ (cp->buf.translate, translate)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235 && cp->posix == posix)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 /* If we're at the end of the cache, compile into the last cell. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 if (cp->next == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 if (!compile_pattern_1 (cp, pattern, translate, regp, posix,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 errb))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 /* When we get here, cp (aka *cpp) contains the compiled pattern,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 either because we found it in the cache or because we just compiled it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 Move it to the front of the queue to mark it as most recently used. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 *cpp = cp->next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 cp->next = searchbuf_head;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 searchbuf_head = cp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 /* Advise the searching functions about the space we have allocated
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 for register data. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 if (regp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 re_set_registers (&cp->buf, regp, regp->num_regs, regp->start, regp->end);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 return &cp->buf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 /* Error condition used for failing searches */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 Lisp_Object Qsearch_failed;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 signal_failure (Lisp_Object arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 {
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
269 for (;;)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
270 Fsignal (Qsearch_failed, list1 (arg));
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
271 return Qnil; /* Not reached. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
274 /* Convert the search registers from Bytebposs to Charbpos's. Needs to be
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275 done after each regexp match that uses the search regs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277 We could get a potential speedup by not converting the search registers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278 until it's really necessary, e.g. when match-data or replace-match is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279 called. However, this complexifies the code a lot (e.g. the buffer
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
280 could have changed and the Bytebposs stored might be invalid) and is
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281 probably not a great time-saver. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284 fixup_search_regs_for_buffer (struct buffer *buf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287 int num_regs = search_regs.num_regs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289 for (i = 0; i < num_regs; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291 if (search_regs.start[i] >= 0)
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
292 search_regs.start[i] = bytebpos_to_charbpos (buf, search_regs.start[i]);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293 if (search_regs.end[i] >= 0)
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
294 search_regs.end[i] = bytebpos_to_charbpos (buf, search_regs.end[i]);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298 /* Similar but for strings. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300 fixup_search_regs_for_string (Lisp_Object string)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303 int num_regs = search_regs.num_regs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305 /* #### bytecount_to_charcount() is not that efficient. This function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306 could be faster if it did its own conversion (using INC_CHARPTR()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307 and such), because the register ends are likely to be somewhat ordered.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 (Even if not, you could sort them.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 Think about this if this function is a time hog, which it's probably
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 not. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 for (i = 0; i < num_regs; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314 if (search_regs.start[i] > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316 search_regs.start[i] =
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
317 XSTRING_INDEX_BYTE_TO_CHAR (string, search_regs.start[i]);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319 if (search_regs.end[i] > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 search_regs.end[i] =
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
322 XSTRING_INDEX_BYTE_TO_CHAR (string, search_regs.end[i]);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 looking_at_1 (Lisp_Object string, struct buffer *buf, int posix)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 /* This function has been Mule-ized, except for the trt table handling. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 Lisp_Object val;
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
333 Bytebpos p1, p2;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 Bytecount s1, s2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 REGISTER int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336 struct re_pattern_buffer *bufp;
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
337 int count = begin_regex_reentrancy ();
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 if (running_asynch_code)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 save_search_regs ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 CHECK_STRING (string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343 bufp = compile_pattern (string, &search_regs,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344 (!NILP (buf->case_fold_search)
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
345 ? XCASE_TABLE_DOWNCASE (buf->case_table) : Qnil),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346 posix, ERROR_ME);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348 QUIT;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 /* Get pointers and sizes of the two strings
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351 that make up the visible portion of the buffer. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
352
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353 p1 = BI_BUF_BEGV (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354 p2 = BI_BUF_CEILING_OF (buf, p1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 s1 = p2 - p1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356 s2 = BI_BUF_ZV (buf) - p2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 446
diff changeset
358 regex_match_object = Qnil;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359 regex_emacs_buffer = buf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360 i = re_match_2 (bufp, (char *) BI_BUF_BYTE_ADDRESS (buf, p1),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361 s1, (char *) BI_BUF_BYTE_ADDRESS (buf, p2), s2,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 BI_BUF_PT (buf) - BI_BUF_BEGV (buf), &search_regs,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 BI_BUF_ZV (buf) - BI_BUF_BEGV (buf));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365 if (i == -2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366 matcher_overflow ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368 val = (0 <= i ? Qt : Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369 if (NILP (val))
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
370 return unbind_to (count);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
371 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372 int num_regs = search_regs.num_regs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373 for (i = 0; i < num_regs; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374 if (search_regs.start[i] >= 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
376 search_regs.start[i] += BI_BUF_BEGV (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377 search_regs.end[i] += BI_BUF_BEGV (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
378 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
379 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
380 XSETBUFFER (last_thing_searched, buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
381 fixup_search_regs_for_buffer (buf);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
382 return unbind_to_1 (count, val);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
385 DEFUN ("looking-at", Flooking_at, 1, 2, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386 Return t if text after point matches regular expression REGEXP.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387 This function modifies the match data that `match-beginning',
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388 `match-end' and `match-data' access; save and restore the match
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
389 data if you want to preserve them.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
391 Optional argument BUFFER defaults to the current buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
392 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
393 (regexp, buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
395 return looking_at_1 (regexp, decode_buffer (buffer, 0), 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
396 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398 DEFUN ("posix-looking-at", Fposix_looking_at, 1, 2, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399 Return t if text after point matches regular expression REGEXP.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400 Find the longest match, in accord with Posix regular expression rules.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401 This function modifies the match data that `match-beginning',
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
402 `match-end' and `match-data' access; save and restore the match
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
403 data if you want to preserve them.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
404
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
405 Optional argument BUFFER defaults to the current buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
406 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
407 (regexp, buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
408 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
409 return looking_at_1 (regexp, decode_buffer (buffer, 0), 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
410 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
411
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
412 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
413 string_match_1 (Lisp_Object regexp, Lisp_Object string, Lisp_Object start,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
414 struct buffer *buf, int posix)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
415 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
416 /* This function has been Mule-ized, except for the trt table handling. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
417 Bytecount val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
418 Charcount s;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419 struct re_pattern_buffer *bufp;
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
420 int count = begin_regex_reentrancy ();
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
422 if (running_asynch_code)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
423 save_search_regs ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
424
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
425 CHECK_STRING (regexp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
426 CHECK_STRING (string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
427
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
428 if (NILP (start))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
429 s = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
430 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
431 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
432 Charcount len = XSTRING_CHAR_LENGTH (string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
433
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
434 CHECK_INT (start);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
435 s = XINT (start);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
436 if (s < 0 && -s <= len)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
437 s = len + s;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
438 else if (0 > s || s > len)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
439 args_out_of_range (string, start);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
440 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
441
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
443 bufp = compile_pattern (regexp, &search_regs,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444 (!NILP (buf->case_fold_search)
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
445 ? XCASE_TABLE_DOWNCASE (buf->case_table) : Qnil),
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
446 0, ERROR_ME);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
447 QUIT;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
448 {
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
449 Bytecount bis = XSTRING_INDEX_CHAR_TO_BYTE (string, s);
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 446
diff changeset
450 regex_match_object = string;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451 regex_emacs_buffer = buf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452 val = re_search (bufp, (char *) XSTRING_DATA (string),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
453 XSTRING_LENGTH (string), bis,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
454 XSTRING_LENGTH (string) - bis,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
455 &search_regs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
456 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
457 if (val == -2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
458 matcher_overflow ();
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
459 if (val < 0) return unbind_to (count);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
460 last_thing_searched = Qt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
461 fixup_search_regs_for_string (string);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
462 return
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
463 unbind_to_1 (count,
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
464 make_int (XSTRING_INDEX_BYTE_TO_CHAR (string, val)));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
466
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
467 DEFUN ("string-match", Fstring_match, 2, 4, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468 Return index of start of first match for REGEXP in STRING, or nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469 If third arg START is non-nil, start search at that index in STRING.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
470 For index of first char beyond the match, do (match-end 0).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
471 `match-end' and `match-beginning' also give indices of substrings
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
472 matched by parenthesis constructs in the pattern.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
473
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
474 Optional arg BUFFER controls how case folding is done (according to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
475 the value of `case-fold-search' in that buffer and that buffer's case
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
476 tables) and defaults to the current buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
477 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
478 (regexp, string, start, buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
479 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
480 return string_match_1 (regexp, string, start, decode_buffer (buffer, 0), 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
481 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
482
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
483 DEFUN ("posix-string-match", Fposix_string_match, 2, 4, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
484 Return index of start of first match for REGEXP in STRING, or nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
485 Find the longest match, in accord with Posix regular expression rules.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486 If third arg START is non-nil, start search at that index in STRING.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
487 For index of first char beyond the match, do (match-end 0).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
488 `match-end' and `match-beginning' also give indices of substrings
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
489 matched by parenthesis constructs in the pattern.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
490
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
491 Optional arg BUFFER controls how case folding is done (according to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
492 the value of `case-fold-search' in that buffer and that buffer's case
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
493 tables) and defaults to the current buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
494 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
495 (regexp, string, start, buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
496 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
497 return string_match_1 (regexp, string, start, decode_buffer (buffer, 0), 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
498 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
499
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
500 /* Match REGEXP against STRING, searching all of STRING,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
501 and return the index of the match, or negative on failure.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
502 This does not clobber the match data. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
503
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
504 Bytecount
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
505 fast_string_match (Lisp_Object regexp, const Intbyte *nonreloc,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
506 Lisp_Object reloc, Bytecount offset,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
507 Bytecount length, int case_fold_search,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
508 Error_Behavior errb, int no_quit)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
509 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
510 /* This function has been Mule-ized, except for the trt table handling. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
511 Bytecount val;
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
512 Intbyte *newnonreloc = (Intbyte *) nonreloc;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
513 struct re_pattern_buffer *bufp;
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
514 int count;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
515
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
516 bufp = compile_pattern (regexp, 0,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
517 (case_fold_search
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
518 ? XCASE_TABLE_DOWNCASE (Vstandard_case_table)
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
519 : Qnil),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520 0, errb);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
521 if (!bufp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
522 return -1; /* will only do this when errb != ERROR_ME */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
523 if (!no_quit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
524 QUIT;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
525 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
526 no_quit_in_re_search = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
527
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
528 fixup_internal_substring (nonreloc, reloc, offset, &length);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
529
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
530 /* Don't need to protect against GC inside of re_search() due to QUIT;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
531 QUIT is GC-inhibited. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
532 if (!NILP (reloc))
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
533 newnonreloc = XSTRING_DATA (reloc);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
534
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
535 count = begin_regex_reentrancy ();
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536 /* #### evil current-buffer dependency */
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 446
diff changeset
537 regex_match_object = reloc;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538 regex_emacs_buffer = current_buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
539 val = re_search (bufp, (char *) newnonreloc + offset, length, 0,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
540 length, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
541
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
542 no_quit_in_re_search = 0;
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
543 unbind_to (count);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544 return val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
545 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
547 Bytecount
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
548 fast_lisp_string_match (Lisp_Object regex, Lisp_Object string)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
550 return fast_string_match (regex, 0, string, 0, -1, 0, ERROR_ME, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
551 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
554 #ifdef REGION_CACHE_NEEDS_WORK
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
555 /* The newline cache: remembering which sections of text have no newlines. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
556
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
557 /* If the user has requested newline caching, make sure it's on.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
558 Otherwise, make sure it's off.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
559 This is our cheezy way of associating an action with the change of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
560 state of a buffer-local variable. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
561 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
562 newline_cache_on_off (struct buffer *buf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
563 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
564 if (NILP (buf->cache_long_line_scans))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
565 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
566 /* It should be off. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
567 if (buf->newline_cache)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
568 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
569 free_region_cache (buf->newline_cache);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
570 buf->newline_cache = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
571 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
572 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
573 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
574 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
575 /* It should be on. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
576 if (buf->newline_cache == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
577 buf->newline_cache = new_region_cache ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
578 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
579 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
580 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
581
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582 /* Search in BUF for COUNT instances of the character TARGET between
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583 START and END.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
584
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
585 If COUNT is positive, search forwards; END must be >= START.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586 If COUNT is negative, search backwards for the -COUNTth instance;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587 END must be <= START.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588 If COUNT is zero, do anything you please; run rogue, for all I care.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
589
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
590 If END is zero, use BEGV or ZV instead, as appropriate for the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
591 direction indicated by COUNT.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
592
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
593 If we find COUNT instances, set *SHORTAGE to zero, and return the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
594 position after the COUNTth match. Note that for reverse motion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
595 this is not the same as the usual convention for Emacs motion commands.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
596
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
597 If we don't find COUNT instances before reaching END, set *SHORTAGE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
598 to the number of TARGETs left unfound, and return END.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
599
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
600 If ALLOW_QUIT is non-zero, call QUIT periodically. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
601
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
602 static Bytebpos
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
603 bi_scan_buffer (struct buffer *buf, Emchar target, Bytebpos st, Bytebpos en,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
604 EMACS_INT count, EMACS_INT *shortage, int allow_quit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
605 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
606 /* This function has been Mule-ized. */
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
607 Bytebpos lim = en > 0 ? en :
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
608 ((count > 0) ? BI_BUF_ZV (buf) : BI_BUF_BEGV (buf));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
609
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
610 /* #### newline cache stuff in this function not yet ported */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
611
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
612 assert (count != 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
613
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
614 if (shortage)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
615 *shortage = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
616
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
617 if (count > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
618 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
619 #ifdef MULE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
620 /* Due to the Mule representation of characters in a buffer,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
621 we can simply search for characters in the range 0 - 127
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
622 directly. For other characters, we do it the "hard" way.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
623 Note that this way works for all characters but the other
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
624 way is faster. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
625 if (target >= 0200)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
626 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
627 while (st < lim && count > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
628 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
629 if (BI_BUF_FETCH_CHAR (buf, st) == target)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
630 count--;
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
631 INC_BYTEBPOS (buf, st);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
632 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
633 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
634 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
635 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
636 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
637 while (st < lim && count > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
638 {
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
639 Bytebpos ceil;
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
640 Intbyte *bufptr;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
641
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
642 ceil = BI_BUF_CEILING_OF (buf, st);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
643 ceil = min (lim, ceil);
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
644 bufptr = (Intbyte *) memchr (BI_BUF_BYTE_ADDRESS (buf, st),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
645 (int) target, ceil - st);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
646 if (bufptr)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
647 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
648 count--;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
649 st = BI_BUF_PTR_BYTE_POS (buf, bufptr) + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
650 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
651 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
652 st = ceil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
653 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
654 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
655
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
656 if (shortage)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
657 *shortage = count;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
658 if (allow_quit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
659 QUIT;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
660 return st;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
661 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
662 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
663 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
664 #ifdef MULE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
665 if (target >= 0200)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
666 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
667 while (st > lim && count < 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
668 {
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
669 DEC_BYTEBPOS (buf, st);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
670 if (BI_BUF_FETCH_CHAR (buf, st) == target)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
671 count++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
672 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
673 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
674 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
675 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
676 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
677 while (st > lim && count < 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
678 {
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
679 Bytebpos floor;
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
680 Intbyte *bufptr;
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
681 Intbyte *floorptr;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
682
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
683 floor = BI_BUF_FLOOR_OF (buf, st);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
684 floor = max (lim, floor);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
685 /* No memrchr() ... */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
686 bufptr = BI_BUF_BYTE_ADDRESS_BEFORE (buf, st);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
687 floorptr = BI_BUF_BYTE_ADDRESS (buf, floor);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
688 while (bufptr >= floorptr)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
689 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
690 st--;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
691 /* At this point, both ST and BUFPTR refer to the same
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
692 character. When the loop terminates, ST will
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
693 always point to the last character we tried. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
694 if (* (unsigned char *) bufptr == (unsigned char) target)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
695 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
696 count++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
697 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
698 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
699 bufptr--;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
700 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
701 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
702 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
703
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
704 if (shortage)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
705 *shortage = -count;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
706 if (allow_quit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
707 QUIT;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
708 if (count)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
709 return st;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
710 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
711 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
712 /* We found the character we were looking for; we have to return
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
713 the position *after* it due to the strange way that the return
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
714 value is defined. */
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
715 INC_BYTEBPOS (buf, st);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
716 return st;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
717 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
718 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
719 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
720
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
721 Charbpos
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
722 scan_buffer (struct buffer *buf, Emchar target, Charbpos start, Charbpos end,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
723 EMACS_INT count, EMACS_INT *shortage, int allow_quit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
724 {
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
725 Bytebpos bi_retval;
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
726 Bytebpos bi_start, bi_end;
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
727
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
728 bi_start = charbpos_to_bytebpos (buf, start);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
729 if (end)
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
730 bi_end = charbpos_to_bytebpos (buf, end);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
731 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
732 bi_end = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
733 bi_retval = bi_scan_buffer (buf, target, bi_start, bi_end, count,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
734 shortage, allow_quit);
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
735 return bytebpos_to_charbpos (buf, bi_retval);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
736 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
737
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
738 Bytebpos
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
739 bi_find_next_newline_no_quit (struct buffer *buf, Bytebpos from, int count)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
740 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
741 return bi_scan_buffer (buf, '\n', from, 0, count, 0, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
742 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
743
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
744 Charbpos
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
745 find_next_newline_no_quit (struct buffer *buf, Charbpos from, int count)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
746 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
747 return scan_buffer (buf, '\n', from, 0, count, 0, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
748 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
749
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
750 Charbpos
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
751 find_next_newline (struct buffer *buf, Charbpos from, int count)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
752 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
753 return scan_buffer (buf, '\n', from, 0, count, 0, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
754 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
755
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
756 Bytebpos
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
757 bi_find_next_emchar_in_string (Lisp_String* str, Emchar target, Bytebpos st,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
758 EMACS_INT count)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
759 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
760 /* This function has been Mule-ized. */
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
761 Bytebpos lim = string_length (str) -1;
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
762 Intbyte* s = string_data (str);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
763
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
764 assert (count >= 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
765
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
766 #ifdef MULE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
767 /* Due to the Mule representation of characters in a buffer,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
768 we can simply search for characters in the range 0 - 127
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
769 directly. For other characters, we do it the "hard" way.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
770 Note that this way works for all characters but the other
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
771 way is faster. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
772 if (target >= 0200)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
773 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
774 while (st < lim && count > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
775 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
776 if (string_char (str, st) == target)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
777 count--;
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
778 INC_CHARBYTEBPOS (s, st);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
779 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
780 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
781 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
782 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
783 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
784 while (st < lim && count > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
785 {
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
786 Intbyte *bufptr = (Intbyte *) memchr (charptr_n_addr (s, st),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
787 (int) target, lim - st);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
788 if (bufptr)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
789 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
790 count--;
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
791 st = (Bytebpos)(bufptr - s) + 1;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
792 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
793 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
794 st = lim;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
795 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
796 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
797 return st;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
798 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
799
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
800 /* Like find_next_newline, but returns position before the newline,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
801 not after, and only search up to TO. This isn't just
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
802 find_next_newline (...)-1, because you might hit TO. */
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
803 Charbpos
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
804 find_before_next_newline (struct buffer *buf, Charbpos from, Charbpos to, int count)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
805 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
806 EMACS_INT shortage;
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
807 Charbpos pos = scan_buffer (buf, '\n', from, to, count, &shortage, 1);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
808
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
809 if (shortage == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
810 pos--;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
811
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
812 return pos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
813 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
814
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
815 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
816 skip_chars (struct buffer *buf, int forwardp, int syntaxp,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
817 Lisp_Object string, Lisp_Object lim)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
818 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
819 /* This function has been Mule-ized. */
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
820 REGISTER Intbyte *p, *pend;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
821 REGISTER Emchar c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
822 /* We store the first 256 chars in an array here and the rest in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
823 a range table. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
824 unsigned char fastmap[0400];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
825 int negate = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
826 REGISTER int i;
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 446
diff changeset
827 #ifndef emacs
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
828 Lisp_Char_Table *syntax_table = XCHAR_TABLE (buf->mirror_syntax_table);
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 446
diff changeset
829 #endif
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
830 Charbpos limit;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
831
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
832 if (NILP (lim))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
833 limit = forwardp ? BUF_ZV (buf) : BUF_BEGV (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
834 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
835 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
836 CHECK_INT_COERCE_MARKER (lim);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
837 limit = XINT (lim);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
838
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
839 /* In any case, don't allow scan outside bounds of buffer. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
840 if (limit > BUF_ZV (buf)) limit = BUF_ZV (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
841 if (limit < BUF_BEGV (buf)) limit = BUF_BEGV (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
842 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
843
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
844 CHECK_STRING (string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
845 p = XSTRING_DATA (string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
846 pend = p + XSTRING_LENGTH (string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
847 memset (fastmap, 0, sizeof (fastmap));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
848
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
849 Fclear_range_table (Vskip_chars_range_table);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
850
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
851 if (p != pend && *p == '^')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
852 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
853 negate = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
854 p++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
855 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
856
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
857 /* Find the characters specified and set their elements of fastmap.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
858 If syntaxp, each character counts as itself.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
859 Otherwise, handle backslashes and ranges specially */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
860
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
861 while (p != pend)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
862 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
863 c = charptr_emchar (p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
864 INC_CHARPTR (p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
865 if (syntaxp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
866 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
867 if (c < 0400 && syntax_spec_code[c] < (unsigned char) Smax)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
868 fastmap[c] = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
869 else
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 507
diff changeset
870 invalid_argument ("Invalid syntax designator",
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
871 make_char (c));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
872 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
873 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
874 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
875 if (c == '\\')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
876 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
877 if (p == pend) break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
878 c = charptr_emchar (p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
879 INC_CHARPTR (p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
880 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
881 if (p != pend && *p == '-')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
882 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
883 Emchar cend;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
884
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
885 p++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
886 if (p == pend) break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
887 cend = charptr_emchar (p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
888 while (c <= cend && c < 0400)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
889 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
890 fastmap[c] = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
891 c++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
892 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
893 if (c <= cend)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
894 Fput_range_table (make_int (c), make_int (cend), Qt,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
895 Vskip_chars_range_table);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
896 INC_CHARPTR (p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
897 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
898 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
899 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
900 if (c < 0400)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
901 fastmap[c] = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
902 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
903 Fput_range_table (make_int (c), make_int (c), Qt,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
904 Vskip_chars_range_table);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
905 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
906 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
907 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
908
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
909 if (syntaxp && fastmap['-'] != 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
910 fastmap[' '] = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
911
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
912 /* If ^ was the first character, complement the fastmap.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
913 We don't complement the range table, however; we just use negate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
914 in the comparisons below. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
915
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
916 if (negate)
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 578
diff changeset
917 for (i = 0; i < (int) (sizeof (fastmap)); i++)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
918 fastmap[i] ^= 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
919
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
920 {
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
921 Charbpos start_point = BUF_PT (buf);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
922
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
923 if (syntaxp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
924 {
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 446
diff changeset
925 SETUP_SYNTAX_CACHE_FOR_BUFFER (buf, BUF_PT (buf), forwardp ? 1 : -1);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
926 /* All syntax designators are normal chars so nothing strange
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
927 to worry about */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
928 if (forwardp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
929 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
930 while (BUF_PT (buf) < limit
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
931 && fastmap[(unsigned char)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
932 syntax_code_spec
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 446
diff changeset
933 [(int) SYNTAX_FROM_CACHE (syntax_table,
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 446
diff changeset
934 BUF_FETCH_CHAR
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 446
diff changeset
935 (buf, BUF_PT (buf)))]])
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 446
diff changeset
936 {
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 446
diff changeset
937 BUF_SET_PT (buf, BUF_PT (buf) + 1);
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 446
diff changeset
938 UPDATE_SYNTAX_CACHE_FORWARD (BUF_PT (buf));
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 446
diff changeset
939 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
940 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
941 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
942 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
943 while (BUF_PT (buf) > limit
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
944 && fastmap[(unsigned char)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
945 syntax_code_spec
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 446
diff changeset
946 [(int) SYNTAX_FROM_CACHE (syntax_table,
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 446
diff changeset
947 BUF_FETCH_CHAR
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 446
diff changeset
948 (buf, BUF_PT (buf) - 1))]])
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 446
diff changeset
949 {
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 446
diff changeset
950 BUF_SET_PT (buf, BUF_PT (buf) - 1);
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 446
diff changeset
951 UPDATE_SYNTAX_CACHE_BACKWARD (BUF_PT (buf) - 1);
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 446
diff changeset
952 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
953 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
954 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
955 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
956 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
957 if (forwardp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
958 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
959 while (BUF_PT (buf) < limit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
960 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
961 Emchar ch = BUF_FETCH_CHAR (buf, BUF_PT (buf));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
962 if ((ch < 0400) ? fastmap[ch] :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
963 (NILP (Fget_range_table (make_int (ch),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
964 Vskip_chars_range_table,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
965 Qnil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
966 == negate))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
967 BUF_SET_PT (buf, BUF_PT (buf) + 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
968 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
969 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
970 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
971 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
972 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
973 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
974 while (BUF_PT (buf) > limit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
975 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
976 Emchar ch = BUF_FETCH_CHAR (buf, BUF_PT (buf) - 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
977 if ((ch < 0400) ? fastmap[ch] :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
978 (NILP (Fget_range_table (make_int (ch),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
979 Vskip_chars_range_table,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
980 Qnil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
981 == negate))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
982 BUF_SET_PT (buf, BUF_PT (buf) - 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
983 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
984 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
985 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
986 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
987 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
988 QUIT;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
989 return make_int (BUF_PT (buf) - start_point);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
990 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
991 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
992
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
993 DEFUN ("skip-chars-forward", Fskip_chars_forward, 1, 3, 0, /*
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
994 Move point forward, stopping before a char not in STRING, or at pos LIMIT.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
995 STRING is like the inside of a `[...]' in a regular expression
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
996 except that `]' is never special and `\\' quotes `^', `-' or `\\'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
997 Thus, with arg "a-zA-Z", this skips letters stopping before first nonletter.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
998 With arg "^a-zA-Z", skips nonletters stopping before first letter.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
999 Returns the distance traveled, either zero or positive.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1000
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1001 Optional argument BUFFER defaults to the current buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1002 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1003 (string, limit, buffer))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1004 {
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1005 return skip_chars (decode_buffer (buffer, 0), 1, 0, string, limit);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1006 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1007
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1008 DEFUN ("skip-chars-backward", Fskip_chars_backward, 1, 3, 0, /*
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1009 Move point backward, stopping after a char not in STRING, or at pos LIMIT.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1010 See `skip-chars-forward' for details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1011 Returns the distance traveled, either zero or negative.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1012
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1013 Optional argument BUFFER defaults to the current buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1014 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1015 (string, limit, buffer))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1016 {
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1017 return skip_chars (decode_buffer (buffer, 0), 0, 0, string, limit);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1018 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1019
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1020
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1021 DEFUN ("skip-syntax-forward", Fskip_syntax_forward, 1, 3, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1022 Move point forward across chars in specified syntax classes.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1023 SYNTAX is a string of syntax code characters.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1024 Stop before a char whose syntax is not in SYNTAX, or at position LIMIT.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1025 If SYNTAX starts with ^, skip characters whose syntax is NOT in SYNTAX.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1026 This function returns the distance traveled, either zero or positive.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1027
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1028 Optional argument BUFFER defaults to the current buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1029 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1030 (syntax, limit, buffer))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1031 {
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1032 return skip_chars (decode_buffer (buffer, 0), 1, 1, syntax, limit);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1033 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1034
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1035 DEFUN ("skip-syntax-backward", Fskip_syntax_backward, 1, 3, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1036 Move point backward across chars in specified syntax classes.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1037 SYNTAX is a string of syntax code characters.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1038 Stop on reaching a char whose syntax is not in SYNTAX, or at position LIMIT.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1039 If SYNTAX starts with ^, skip characters whose syntax is NOT in SYNTAX.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1040 This function returns the distance traveled, either zero or negative.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1041
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1042 Optional argument BUFFER defaults to the current buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1043 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1044 (syntax, limit, buffer))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1045 {
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1046 return skip_chars (decode_buffer (buffer, 0), 0, 1, syntax, limit);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1047 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1048
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1049
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1050 /* Subroutines of Lisp buffer search functions. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1051
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1052 static Lisp_Object
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1053 search_command (Lisp_Object string, Lisp_Object limit, Lisp_Object noerror,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1054 Lisp_Object count, Lisp_Object buffer, int direction,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1055 int RE, int posix)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1056 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1057 /* This function has been Mule-ized, except for the trt table handling. */
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1058 REGISTER Charbpos np;
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1059 Charbpos lim;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1060 EMACS_INT n = direction;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1061 struct buffer *buf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1062
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1063 if (!NILP (count))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1064 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1065 CHECK_INT (count);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1066 n *= XINT (count);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1067 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1068
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1069 buf = decode_buffer (buffer, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1070 CHECK_STRING (string);
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1071 if (NILP (limit))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1072 lim = n > 0 ? BUF_ZV (buf) : BUF_BEGV (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1073 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1074 {
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1075 CHECK_INT_COERCE_MARKER (limit);
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1076 lim = XINT (limit);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1077 if (n > 0 ? lim < BUF_PT (buf) : lim > BUF_PT (buf))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 507
diff changeset
1078 invalid_argument ("Invalid search limit (wrong side of point)",
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 507
diff changeset
1079 Qunbound);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1080 if (lim > BUF_ZV (buf))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1081 lim = BUF_ZV (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1082 if (lim < BUF_BEGV (buf))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1083 lim = BUF_BEGV (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1084 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1085
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1086 np = search_buffer (buf, string, BUF_PT (buf), lim, n, RE,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1087 (!NILP (buf->case_fold_search)
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1088 ? XCASE_TABLE_CANON (buf->case_table)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1089 : Qnil),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1090 (!NILP (buf->case_fold_search)
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1091 ? XCASE_TABLE_EQV (buf->case_table)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1092 : Qnil), posix);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1093
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1094 if (np <= 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1095 {
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1096 if (NILP (noerror))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1097 return signal_failure (string);
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1098 if (!EQ (noerror, Qt))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1099 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1100 if (lim < BUF_BEGV (buf) || lim > BUF_ZV (buf))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1101 abort ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1102 BUF_SET_PT (buf, lim);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1103 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1104 #if 0 /* This would be clean, but maybe programs depend on
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1105 a value of nil here. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1106 np = lim;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1107 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1108 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1109 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1110 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1111 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1112
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1113 if (np < BUF_BEGV (buf) || np > BUF_ZV (buf))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1114 abort ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1115
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1116 BUF_SET_PT (buf, np);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1117
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1118 return make_int (np);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1119 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1120
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1121 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1122 trivial_regexp_p (Lisp_Object regexp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1123 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1124 /* This function has been Mule-ized. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1125 Bytecount len = XSTRING_LENGTH (regexp);
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1126 Intbyte *s = XSTRING_DATA (regexp);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1127 while (--len >= 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1128 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1129 switch (*s++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1130 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1131 case '.': case '*': case '+': case '?': case '[': case '^': case '$':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1132 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1133 case '\\':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1134 if (--len < 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1135 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1136 switch (*s++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1137 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1138 case '|': case '(': case ')': case '`': case '\'': case 'b':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1139 case 'B': case '<': case '>': case 'w': case 'W': case 's':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1140 case 'S': case '=':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1141 #ifdef MULE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1142 /* 97/2/25 jhod Added for category matches */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1143 case 'c': case 'C':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1144 #endif /* MULE */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1145 case '1': case '2': case '3': case '4': case '5':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1146 case '6': case '7': case '8': case '9':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1147 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1148 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1149 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1150 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1151 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1152 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1153
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1154 /* Search for the n'th occurrence of STRING in BUF,
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1155 starting at position CHARBPOS and stopping at position BUFLIM,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1156 treating PAT as a literal string if RE is false or as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1157 a regular expression if RE is true.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1158
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1159 If N is positive, searching is forward and BUFLIM must be greater
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1160 than CHARBPOS.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1161 If N is negative, searching is backward and BUFLIM must be less
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1162 than CHARBPOS.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1163
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1164 Returns -x if only N-x occurrences found (x > 0),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1165 or else the position at the beginning of the Nth occurrence
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1166 (if searching backward) or the end (if searching forward).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1167
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1168 POSIX is nonzero if we want full backtracking (POSIX style)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1169 for this pattern. 0 means backtrack only enough to get a valid match. */
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1170 static Charbpos
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1171 search_buffer (struct buffer *buf, Lisp_Object string, Charbpos charbpos,
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1172 Charbpos buflim, EMACS_INT n, int RE, Lisp_Object trt,
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1173 Lisp_Object inverse_trt, int posix)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1174 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1175 /* This function has been Mule-ized, except for the trt table handling. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1176 Bytecount len = XSTRING_LENGTH (string);
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1177 Intbyte *base_pat = XSTRING_DATA (string);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1178 REGISTER EMACS_INT i, j;
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1179 Bytebpos p1, p2;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1180 Bytecount s1, s2;
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1181 Bytebpos pos, lim;
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
1182 int count;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1183
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1184 if (running_asynch_code)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1185 save_search_regs ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1186
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1187 /* Null string is found at starting position. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1188 if (len == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1189 {
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1190 set_search_regs (buf, charbpos, 0);
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1191 return charbpos;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1192 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1193
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1194 /* Searching 0 times means don't move. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1195 if (n == 0)
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1196 return charbpos;
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1197
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1198 pos = charbpos_to_bytebpos (buf, charbpos);
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1199 lim = charbpos_to_bytebpos (buf, buflim);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1200 if (RE && !trivial_regexp_p (string))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1201 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1202 struct re_pattern_buffer *bufp;
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
1203 count = begin_regex_reentrancy ();
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1204
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1205 bufp = compile_pattern (string, &search_regs, trt, posix,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1206 ERROR_ME);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1207
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1208 /* Get pointers and sizes of the two strings
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1209 that make up the visible portion of the buffer. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1210
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1211 p1 = BI_BUF_BEGV (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1212 p2 = BI_BUF_CEILING_OF (buf, p1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1213 s1 = p2 - p1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1214 s2 = BI_BUF_ZV (buf) - p2;
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 446
diff changeset
1215 regex_match_object = Qnil;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1216
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1217 while (n < 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1218 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1219 Bytecount val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1220 QUIT;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1221 regex_emacs_buffer = buf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1222 val = re_search_2 (bufp,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1223 (char *) BI_BUF_BYTE_ADDRESS (buf, p1), s1,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1224 (char *) BI_BUF_BYTE_ADDRESS (buf, p2), s2,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1225 pos - BI_BUF_BEGV (buf), lim - pos, &search_regs,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1226 pos - BI_BUF_BEGV (buf));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1227
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1228 if (val == -2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1229 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1230 matcher_overflow ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1231 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1232 if (val >= 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1233 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1234 int num_regs = search_regs.num_regs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1235 j = BI_BUF_BEGV (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1236 for (i = 0; i < num_regs; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1237 if (search_regs.start[i] >= 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1238 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1239 search_regs.start[i] += j;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1240 search_regs.end[i] += j;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1241 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1242 XSETBUFFER (last_thing_searched, buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1243 /* Set pos to the new position. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1244 pos = search_regs.start[0];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1245 fixup_search_regs_for_buffer (buf);
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1246 /* And charbpos too. */
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1247 charbpos = search_regs.start[0];
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1248 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1249 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1250 {
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
1251 unbind_to (count);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1252 return n;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1253 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1254 n++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1255 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1256 while (n > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1257 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1258 Bytecount val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1259 QUIT;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1260 regex_emacs_buffer = buf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1261 val = re_search_2 (bufp,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1262 (char *) BI_BUF_BYTE_ADDRESS (buf, p1), s1,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1263 (char *) BI_BUF_BYTE_ADDRESS (buf, p2), s2,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1264 pos - BI_BUF_BEGV (buf), lim - pos, &search_regs,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1265 lim - BI_BUF_BEGV (buf));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1266 if (val == -2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1267 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1268 matcher_overflow ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1269 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1270 if (val >= 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1271 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1272 int num_regs = search_regs.num_regs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1273 j = BI_BUF_BEGV (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1274 for (i = 0; i < num_regs; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1275 if (search_regs.start[i] >= 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1276 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1277 search_regs.start[i] += j;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1278 search_regs.end[i] += j;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1279 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1280 XSETBUFFER (last_thing_searched, buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1281 /* Set pos to the new position. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1282 pos = search_regs.end[0];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1283 fixup_search_regs_for_buffer (buf);
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1284 /* And charbpos too. */
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1285 charbpos = search_regs.end[0];
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1286 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1287 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1288 {
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
1289 unbind_to (count);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1290 return 0 - n;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1291 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1292 n--;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1293 }
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
1294 unbind_to (count);
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1295 return charbpos;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1296 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1297 else /* non-RE case */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1298 {
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1299 int charset_base = -1;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1300 int boyer_moore_ok = 1;
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1301 Intbyte *pat = 0;
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1302 Intbyte *patbuf = alloca_array (Intbyte, len * MAX_EMCHAR_LEN);
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1303 pat = patbuf;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1304 #ifdef MULE
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1305 while (len > 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1306 {
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1307 Intbyte tmp_str[MAX_EMCHAR_LEN];
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1308 Emchar c, translated, inverse;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1309 Bytecount orig_bytelen, new_bytelen, inv_bytelen;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1310
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1311 /* If we got here and the RE flag is set, it's because
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1312 we're dealing with a regexp known to be trivial, so the
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1313 backslash just quotes the next character. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1314 if (RE && *base_pat == '\\')
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1315 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1316 len--;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1317 base_pat++;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1318 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1319 c = charptr_emchar (base_pat);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1320 translated = TRANSLATE (trt, c);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1321 inverse = TRANSLATE (inverse_trt, c);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1322
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1323 orig_bytelen = charcount_to_bytecount (base_pat, 1);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1324 inv_bytelen = set_charptr_emchar (tmp_str, inverse);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1325 new_bytelen = set_charptr_emchar (tmp_str, translated);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1326
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1327
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1328 if (new_bytelen != orig_bytelen || inv_bytelen != orig_bytelen)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1329 boyer_moore_ok = 0;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1330 if (translated != c || inverse != c)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1331 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1332 /* Keep track of which character set row
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1333 contains the characters that need translation. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1334 int charset_base_code = c & ~CHAR_FIELD3_MASK;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1335 if (charset_base == -1)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1336 charset_base = charset_base_code;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1337 else if (charset_base != charset_base_code)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1338 /* If two different rows appear, needing translation,
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1339 then we cannot use boyer_moore search. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1340 boyer_moore_ok = 0;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1341 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1342 memcpy (pat, tmp_str, new_bytelen);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1343 pat += new_bytelen;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1344 base_pat += orig_bytelen;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1345 len -= orig_bytelen;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1346 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1347 #else /* not MULE */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1348 while (--len >= 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1349 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1350 /* If we got here and the RE flag is set, it's because
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1351 we're dealing with a regexp known to be trivial, so the
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1352 backslash just quotes the next character. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1353 if (RE && *base_pat == '\\')
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1354 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1355 len--;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1356 base_pat++;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1357 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1358 *pat++ = TRANSLATE (trt, *base_pat++);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1359 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1360 #endif /* MULE */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1361 len = pat - patbuf;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1362 pat = base_pat = patbuf;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1363 if (boyer_moore_ok)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1364 return boyer_moore (buf, base_pat, len, pos, lim, n,
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1365 trt, inverse_trt, charset_base);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1366 else
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1367 return simple_search (buf, base_pat, len, pos, lim, n, trt);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1368 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1369 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1370
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1371 /* Do a simple string search N times for the string PAT,
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1372 whose length is LEN/LEN_BYTE,
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1373 from buffer position POS/POS_BYTE until LIM/LIM_BYTE.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1374 TRT is the translation table.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1375
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1376 Return the character position where the match is found.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1377 Otherwise, if M matches remained to be found, return -M.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1378
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1379 This kind of search works regardless of what is in PAT and
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1380 regardless of what is in TRT. It is used in cases where
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1381 boyer_moore cannot work. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1382
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1383 static Charbpos
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1384 simple_search (struct buffer *buf, Intbyte *base_pat, Bytecount len_byte,
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1385 Bytebpos idx, Bytebpos lim, EMACS_INT n, Lisp_Object trt)
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1386 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1387 int forward = n > 0;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1388 Bytecount buf_len = 0; /* Shut up compiler. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1389
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1390 if (lim > idx)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1391 while (n > 0)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1392 {
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1393 while (1)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1394 {
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1395 Bytecount this_len = len_byte;
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1396 Bytebpos this_idx = idx;
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1397 Intbyte *p = base_pat;
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1398 if (idx >= lim)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1399 goto stop;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1400
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1401 while (this_len > 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1402 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1403 Emchar pat_ch, buf_ch;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1404 Bytecount pat_len;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1405
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1406 pat_ch = charptr_emchar (p);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1407 buf_ch = BI_BUF_FETCH_CHAR (buf, this_idx);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1408
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1409 buf_ch = TRANSLATE (trt, buf_ch);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1410
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1411 if (buf_ch != pat_ch)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1412 break;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1413
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1414 pat_len = charcount_to_bytecount (p, 1);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1415 p += pat_len;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1416 this_len -= pat_len;
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1417 INC_BYTEBPOS (buf, this_idx);
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1418 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1419 if (this_len == 0)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1420 {
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1421 buf_len = this_idx - idx;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1422 idx = this_idx;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1423 break;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1424 }
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1425 INC_BYTEBPOS (buf, idx);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1426 }
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1427 n--;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1428 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1429 else
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1430 while (n < 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1431 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1432 while (1)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1433 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1434 Bytecount this_len = len_byte;
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1435 Bytebpos this_idx = idx;
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1436 Intbyte *p;
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1437 if (idx <= lim)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1438 goto stop;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1439 p = base_pat + len_byte;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1440
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1441 while (this_len > 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1442 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1443 Emchar pat_ch, buf_ch;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1444
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1445 DEC_CHARPTR (p);
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1446 DEC_BYTEBPOS (buf, this_idx);
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1447 pat_ch = charptr_emchar (p);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1448 buf_ch = BI_BUF_FETCH_CHAR (buf, this_idx);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1449
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1450 buf_ch = TRANSLATE (trt, buf_ch);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1451
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1452 if (buf_ch != pat_ch)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1453 break;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1454
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1455 this_len -= charcount_to_bytecount (p, 1);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1456 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1457 if (this_len == 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1458 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1459 buf_len = idx - this_idx;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1460 idx = this_idx;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1461 break;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1462 }
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1463 DEC_BYTEBPOS (buf, idx);
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1464 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1465 n++;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1466 }
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1467 stop:
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1468 if (n == 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1469 {
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1470 Charbpos beg, end, retval;
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1471 if (forward)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1472 {
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1473 beg = bytebpos_to_charbpos (buf, idx - buf_len);
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1474 retval = end = bytebpos_to_charbpos (buf, idx);
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1475 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1476 else
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1477 {
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1478 retval = beg = bytebpos_to_charbpos (buf, idx);
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1479 end = bytebpos_to_charbpos (buf, idx + buf_len);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1480 }
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1481 set_search_regs (buf, beg, end - beg);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1482
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1483 return retval;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1484 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1485 else if (n > 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1486 return -n;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1487 else
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1488 return n;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1489 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1490
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1491 /* Do Boyer-Moore search N times for the string PAT,
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1492 whose length is LEN/LEN_BYTE,
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1493 from buffer position POS/POS_BYTE until LIM/LIM_BYTE.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1494 DIRECTION says which direction we search in.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1495 TRT and INVERSE_TRT are translation tables.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1496
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1497 This kind of search works if all the characters in PAT that have
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1498 nontrivial translation are the same aside from the last byte. This
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1499 makes it possible to translate just the last byte of a character,
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1500 and do so after just a simple test of the context.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1501
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1502 If that criterion is not satisfied, do not call this function. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1503
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1504 static Charbpos
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1505 boyer_moore (struct buffer *buf, Intbyte *base_pat, Bytecount len,
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1506 Bytebpos pos, Bytebpos lim, EMACS_INT n, Lisp_Object trt,
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1507 Lisp_Object inverse_trt, int charset_base)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1508 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1509 /* #### Someone really really really needs to comment the workings
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1510 of this junk somewhat better.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1511
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1512 BTW "BM" stands for Boyer-Moore, which is one of the standard
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1513 string-searching algorithms. It's the best string-searching
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1514 algorithm out there, provided that:
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1515
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1516 a) You're not fazed by algorithm complexity. (Rabin-Karp, which
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1517 uses hashing, is much much easier to code but not as fast.)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1518 b) You can freely move backwards in the string that you're
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1519 searching through.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1520
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1521 As the comment below tries to explain (but garbles in typical
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1522 programmer-ese), the idea is that you don't have to do a
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1523 string match at every successive position in the text. For
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1524 example, let's say the pattern is "a very long string". We
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1525 compare the last character in the string (`g') with the
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1526 corresponding character in the text. If it mismatches, and
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1527 it is, say, `z', then we can skip forward by the entire
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1528 length of the pattern because `z' does not occur anywhere
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1529 in the pattern. If the mismatching character does occur
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1530 in the pattern, we can usually still skip forward by more
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1531 than one: e.g. if it is `l', then we can skip forward
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1532 by the length of the substring "ong string" -- i.e. the
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1533 largest end section of the pattern that does not contain
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1534 the mismatched character. So what we do is compute, for
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1535 each possible character, the distance we can skip forward
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1536 (the "stride") and use it in the string matching. This
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1537 is what the BM_tab holds. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1538 REGISTER EMACS_INT *BM_tab;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1539 EMACS_INT *BM_tab_base;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1540 REGISTER Bytecount dirlen;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1541 EMACS_INT infinity;
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1542 Bytebpos limit;
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1543 Bytecount stride_for_teases = 0;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1544 REGISTER EMACS_INT i, j;
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1545 Intbyte *pat, *pat_end;
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1546 REGISTER Intbyte *cursor, *p_limit, *ptr2;
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1547 Intbyte simple_translate[0400];
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1548 REGISTER int direction = ((n > 0) ? 1 : -1);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1549 #ifdef MULE
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1550 Intbyte translate_prev_byte = 0;
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1551 Intbyte translate_anteprev_byte = 0;
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1552 #endif
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1553 #ifdef C_ALLOCA
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1554 EMACS_INT BM_tab_space[0400];
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1555 BM_tab = &BM_tab_space[0];
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1556 #else
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1557 BM_tab = alloca_array (EMACS_INT, 256);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1558 #endif
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1559
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1560 /* The general approach is that we are going to maintain that we
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1561 know the first (closest to the present position, in whatever
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1562 direction we're searching) character that could possibly be
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1563 the last (furthest from present position) character of a
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1564 valid match. We advance the state of our knowledge by
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1565 looking at that character and seeing whether it indeed
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1566 matches the last character of the pattern. If it does, we
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1567 take a closer look. If it does not, we move our pointer (to
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1568 putative last characters) as far as is logically possible.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1569 This amount of movement, which I call a stride, will be the
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1570 length of the pattern if the actual character appears nowhere
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1571 in the pattern, otherwise it will be the distance from the
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1572 last occurrence of that character to the end of the pattern.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1573 As a coding trick, an enormous stride is coded into the table
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1574 for characters that match the last character. This allows
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1575 use of only a single test, a test for having gone past the
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1576 end of the permissible match region, to test for both
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1577 possible matches (when the stride goes past the end
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1578 immediately) and failure to match (where you get nudged past
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1579 the end one stride at a time).
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1580
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1581 Here we make a "mickey mouse" BM table. The stride of the
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1582 search is determined only by the last character of the
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1583 putative match. If that character does not match, we will
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1584 stride the proper distance to propose a match that
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1585 superimposes it on the last instance of a character that
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1586 matches it (per trt), or misses it entirely if there is
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1587 none. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1588
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1589 dirlen = len * direction;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1590 infinity = dirlen - (lim + pos + len + len) * direction;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1591 /* Record position after the end of the pattern. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1592 pat_end = base_pat + len;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1593 if (direction < 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1594 base_pat = pat_end - 1;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1595 BM_tab_base = BM_tab;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1596 BM_tab += 0400;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1597 j = dirlen; /* to get it in a register */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1598 /* A character that does not appear in the pattern induces a
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1599 stride equal to the pattern length. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1600 while (BM_tab_base != BM_tab)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1601 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1602 *--BM_tab = j;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1603 *--BM_tab = j;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1604 *--BM_tab = j;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1605 *--BM_tab = j;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1606 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1607 /* We use this for translation, instead of TRT itself. We
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1608 fill this in to handle the characters that actually occur
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1609 in the pattern. Others don't matter anyway! */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1610 xzero (simple_translate);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1611 for (i = 0; i < 0400; i++)
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1612 simple_translate[i] = (Intbyte) i;
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1613 i = 0;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1614 while (i != infinity)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1615 {
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1616 Intbyte *ptr = base_pat + i;
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1617 i += direction;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1618 if (i == dirlen)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1619 i = infinity;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1620 if (!NILP (trt))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1621 {
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1622 #ifdef MULE
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1623 Emchar ch, untranslated;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1624 int this_translated = 1;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1625
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1626 /* Is *PTR the last byte of a character? */
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1627 if (pat_end - ptr == 1 || INTBYTE_FIRST_BYTE_P (ptr[1]))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1628 {
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1629 Intbyte *charstart = ptr;
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1630 while (!INTBYTE_FIRST_BYTE_P (*charstart))
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1631 charstart--;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1632 untranslated = charptr_emchar (charstart);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1633 if (charset_base == (untranslated & ~CHAR_FIELD3_MASK))
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1634 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1635 ch = TRANSLATE (trt, untranslated);
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1636 if (!INTBYTE_FIRST_BYTE_P (*ptr))
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1637 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1638 translate_prev_byte = ptr[-1];
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1639 if (!INTBYTE_FIRST_BYTE_P (translate_prev_byte))
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1640 translate_anteprev_byte = ptr[-2];
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1641 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1642 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1643 else
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1644 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1645 this_translated = 0;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1646 ch = *ptr;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1647 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1648 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1649 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1650 {
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1651 ch = *ptr;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1652 this_translated = 0;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1653 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1654 if (ch > 0400)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1655 j = ((unsigned char) ch | 0200);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1656 else
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1657 j = (unsigned char) ch;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1658
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1659 if (i == infinity)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1660 stride_for_teases = BM_tab[j];
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1661 BM_tab[j] = dirlen - i;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1662 /* A translation table is accompanied by its inverse --
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1663 see comment following downcase_table for details */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1664 if (this_translated)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1665 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1666 Emchar starting_ch = ch;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1667 EMACS_INT starting_j = j;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1668 while (1)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1669 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1670 ch = TRANSLATE (inverse_trt, ch);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1671 if (ch > 0400)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1672 j = ((unsigned char) ch | 0200);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1673 else
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1674 j = (unsigned char) ch;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1675
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1676 /* For all the characters that map into CH,
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1677 set up simple_translate to map the last byte
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1678 into STARTING_J. */
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
1679 simple_translate[j] = (Intbyte) starting_j;
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1680 if (ch == starting_ch)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1681 break;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1682 BM_tab[j] = dirlen - i;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1683 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1684 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1685 #else
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1686 EMACS_INT k;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1687 j = *ptr;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1688 k = (j = TRANSLATE (trt, j));
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1689 if (i == infinity)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1690 stride_for_teases = BM_tab[j];
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1691 BM_tab[j] = dirlen - i;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1692 /* A translation table is accompanied by its inverse --
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1693 see comment following downcase_table for details */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1694
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1695 while ((j = TRANSLATE (inverse_trt, j)) != k)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1696 {
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1697 simple_translate[j] = (Intbyte) k;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1698 BM_tab[j] = dirlen - i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1699 }
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1700 #endif
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1701 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1702 else
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1703 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1704 j = *ptr;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1705
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1706 if (i == infinity)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1707 stride_for_teases = BM_tab[j];
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1708 BM_tab[j] = dirlen - i;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1709 }
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1710 /* stride_for_teases tells how much to stride if we get a
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1711 match on the far character but are subsequently
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1712 disappointed, by recording what the stride would have been
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1713 for that character if the last character had been
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1714 different. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1715 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1716 infinity = dirlen - infinity;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1717 pos += dirlen - ((direction > 0) ? direction : 0);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1718 /* loop invariant - pos points at where last char (first char if
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1719 reverse) of pattern would align in a possible match. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1720 while (n != 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1721 {
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1722 Bytebpos tail_end;
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1723 Intbyte *tail_end_ptr;
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1724 /* It's been reported that some (broken) compiler thinks
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1725 that Boolean expressions in an arithmetic context are
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1726 unsigned. Using an explicit ?1:0 prevents this. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1727 if ((lim - pos - ((direction > 0) ? 1 : 0)) * direction < 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1728 return n * (0 - direction);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1729 /* First we do the part we can by pointers (maybe
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1730 nothing) */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1731 QUIT;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1732 pat = base_pat;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1733 limit = pos - dirlen + direction;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1734 /* XEmacs change: definitions of CEILING_OF and FLOOR_OF
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1735 have changed. See buffer.h. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1736 limit = ((direction > 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1737 ? BI_BUF_CEILING_OF (buf, limit) - 1
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1738 : BI_BUF_FLOOR_OF (buf, limit + 1));
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1739 /* LIMIT is now the last (not beyond-last!) value POS can
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1740 take on without hitting edge of buffer or the gap. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1741 limit = ((direction > 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1742 ? min (lim - 1, min (limit, pos + 20000))
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1743 : max (lim, max (limit, pos - 20000)));
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1744 tail_end = BI_BUF_CEILING_OF (buf, pos);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1745 tail_end_ptr = BI_BUF_BYTE_ADDRESS (buf, tail_end);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1746
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1747 if ((limit - pos) * direction > 20)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1748 {
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1749 p_limit = BI_BUF_BYTE_ADDRESS (buf, limit);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1750 ptr2 = (cursor = BI_BUF_BYTE_ADDRESS (buf, pos));
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1751 /* In this loop, pos + cursor - ptr2 is the surrogate
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1752 for pos */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1753 while (1) /* use one cursor setting as long as i can */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1754 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1755 if (direction > 0) /* worth duplicating */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1756 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1757 /* Use signed comparison if appropriate to make
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1758 cursor+infinity sure to be > p_limit.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1759 Assuming that the buffer lies in a range of
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1760 addresses that are all "positive" (as ints)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1761 or all "negative", either kind of comparison
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1762 will work as long as we don't step by
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1763 infinity. So pick the kind that works when
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1764 we do step by infinity. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1765 if ((EMACS_INT) (p_limit + infinity) >
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1766 (EMACS_INT) p_limit)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1767 while ((EMACS_INT) cursor <=
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1768 (EMACS_INT) p_limit)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1769 cursor += BM_tab[*cursor];
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1770 else
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1771 while ((EMACS_UINT) cursor <=
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1772 (EMACS_UINT) p_limit)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1773 cursor += BM_tab[*cursor];
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1774 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1775 else
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1776 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1777 if ((EMACS_INT) (p_limit + infinity) <
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1778 (EMACS_INT) p_limit)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1779 while ((EMACS_INT) cursor >=
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1780 (EMACS_INT) p_limit)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1781 cursor += BM_tab[*cursor];
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1782 else
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1783 while ((EMACS_UINT) cursor >=
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1784 (EMACS_UINT) p_limit)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1785 cursor += BM_tab[*cursor];
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1786 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1787 /* If you are here, cursor is beyond the end of the
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1788 searched region. This can happen if you match on
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1789 the far character of the pattern, because the
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1790 "stride" of that character is infinity, a number
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1791 able to throw you well beyond the end of the
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1792 search. It can also happen if you fail to match
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1793 within the permitted region and would otherwise
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1794 try a character beyond that region */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1795 if ((cursor - p_limit) * direction <= len)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1796 break; /* a small overrun is genuine */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1797 cursor -= infinity; /* large overrun = hit */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1798 i = dirlen - direction;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1799 if (!NILP (trt))
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1800 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1801 while ((i -= direction) + direction != 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1802 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1803 #ifdef MULE
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1804 Emchar ch;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1805 cursor -= direction;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1806 /* Translate only the last byte of a character. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1807 if ((cursor == tail_end_ptr
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1808 || INTBYTE_FIRST_BYTE_P (cursor[1]))
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1809 && (INTBYTE_FIRST_BYTE_P (cursor[0])
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1810 || (translate_prev_byte == cursor[-1]
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1811 && (INTBYTE_FIRST_BYTE_P (translate_prev_byte)
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1812 || translate_anteprev_byte == cursor[-2]))))
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1813 ch = simple_translate[*cursor];
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1814 else
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1815 ch = *cursor;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1816 if (pat[i] != ch)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1817 break;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1818 #else
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1819 if (pat[i] != TRANSLATE (trt, *(cursor -= direction)))
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1820 break;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1821 #endif
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1822 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1823 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1824 else
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1825 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1826 while ((i -= direction) + direction != 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1827 if (pat[i] != *(cursor -= direction))
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1828 break;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1829 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1830 cursor += dirlen - i - direction; /* fix cursor */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1831 if (i + direction == 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1832 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1833 cursor -= direction;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1834
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1835 {
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1836 Bytebpos bytstart = (pos + cursor - ptr2 +
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1837 ((direction > 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1838 ? 1 - len : 0));
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1839 Charbpos bufstart = bytebpos_to_charbpos (buf, bytstart);
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1840 Charbpos bufend = bytebpos_to_charbpos (buf, bytstart + len);
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1841
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1842 set_search_regs (buf, bufstart, bufend - bufstart);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1843 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1844
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1845 if ((n -= direction) != 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1846 cursor += dirlen; /* to resume search */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1847 else
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1848 return ((direction > 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1849 ? search_regs.end[0] : search_regs.start[0]);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1850 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1851 else
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1852 cursor += stride_for_teases; /* <sigh> we lose - */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1853 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1854 pos += cursor - ptr2;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1855 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1856 else
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1857 /* Now we'll pick up a clump that has to be done the hard
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1858 way because it covers a discontinuity */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1859 {
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1860 /* XEmacs change: definitions of CEILING_OF and FLOOR_OF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1861 have changed. See buffer.h. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1862 limit = ((direction > 0)
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1863 ? BI_BUF_CEILING_OF (buf, pos - dirlen + 1) - 1
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1864 : BI_BUF_FLOOR_OF (buf, pos - dirlen));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1865 limit = ((direction > 0)
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1866 ? min (limit + len, lim - 1)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1867 : max (limit - len, lim));
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1868 /* LIMIT is now the last value POS can have
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1869 and still be valid for a possible match. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1870 while (1)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1871 {
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1872 /* This loop can be coded for space rather than
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1873 speed because it will usually run only once.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1874 (the reach is at most len + 21, and typically
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1875 does not exceed len) */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1876 while ((limit - pos) * direction >= 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1877 /* *not* BI_BUF_FETCH_CHAR. We are working here
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1878 with bytes, not characters. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1879 pos += BM_tab[*BI_BUF_BYTE_ADDRESS (buf, pos)];
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1880 /* now run the same tests to distinguish going off
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1881 the end, a match or a phony match. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1882 if ((pos - limit) * direction <= len)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1883 break; /* ran off the end */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1884 /* Found what might be a match.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1885 Set POS back to last (first if reverse) char pos. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1886 pos -= infinity;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1887 i = dirlen - direction;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1888 while ((i -= direction) + direction != 0)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1889 {
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1890 #ifdef MULE
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1891 Emchar ch;
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1892 Intbyte *ptr;
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1893 #endif
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1894 pos -= direction;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1895 #ifdef MULE
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1896 ptr = BI_BUF_BYTE_ADDRESS (buf, pos);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1897 if ((ptr == tail_end_ptr
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1898 || INTBYTE_FIRST_BYTE_P (ptr[1]))
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1899 && (INTBYTE_FIRST_BYTE_P (ptr[0])
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1900 || (translate_prev_byte == ptr[-1]
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1901 && (INTBYTE_FIRST_BYTE_P (translate_prev_byte)
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1902 || translate_anteprev_byte == ptr[-2]))))
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1903 ch = simple_translate[*ptr];
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1904 else
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1905 ch = *ptr;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1906 if (pat[i] != ch)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1907 break;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1908
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1909 #else
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1910 if (pat[i] != TRANSLATE (trt,
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1911 *BI_BUF_BYTE_ADDRESS (buf, pos)))
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1912 break;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1913 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1914 }
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1915 /* Above loop has moved POS part or all the way back
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1916 to the first char pos (last char pos if reverse).
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1917 Set it once again at the last (first if reverse)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1918 char. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1919 pos += dirlen - i- direction;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1920 if (i + direction == 0)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1921 {
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1922 pos -= direction;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1923
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1924 {
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1925 Bytebpos bytstart = (pos +
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1926 ((direction > 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1927 ? 1 - len : 0));
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1928 Charbpos bufstart = bytebpos_to_charbpos (buf, bytstart);
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1929 Charbpos bufend = bytebpos_to_charbpos (buf, bytstart + len);
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1930
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1931 set_search_regs (buf, bufstart, bufend - bufstart);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1932 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1933
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1934 if ((n -= direction) != 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1935 pos += dirlen; /* to resume search */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1936 else
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1937 return ((direction > 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1938 ? search_regs.end[0] : search_regs.start[0]);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1939 }
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1940 else
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1941 pos += stride_for_teases;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1942 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1943 }
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1944 /* We have done one clump. Can we continue? */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1945 if ((lim - pos) * direction < 0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1946 return (0 - n) * direction;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1947 }
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1948 return bytebpos_to_charbpos (buf, pos);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1949 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1950
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1951 /* Record beginning BEG and end BEG + LEN
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1952 for a match just found in the current buffer. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1953
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1954 static void
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1955 set_search_regs (struct buffer *buf, Charbpos beg, Charcount len)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1956 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1957 /* This function has been Mule-ized. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1958 /* Make sure we have registers in which to store
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1959 the match position. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1960 if (search_regs.num_regs == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1961 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1962 search_regs.start = xnew (regoff_t);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1963 search_regs.end = xnew (regoff_t);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1964 search_regs.num_regs = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1965 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1966
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1967 search_regs.start[0] = beg;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1968 search_regs.end[0] = beg + len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1969 XSETBUFFER (last_thing_searched, buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1970 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1971
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1972
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1973 /* Given a string of words separated by word delimiters,
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1974 compute a regexp that matches those exact words
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1975 separated by arbitrary punctuation. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1976
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1977 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1978 wordify (Lisp_Object buffer, Lisp_Object string)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1979 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1980 Charcount i, len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1981 EMACS_INT punct_count = 0, word_count = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1982 struct buffer *buf = decode_buffer (buffer, 0);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
1983 Lisp_Char_Table *syntax_table = XCHAR_TABLE (buf->mirror_syntax_table);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1984
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1985 CHECK_STRING (string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1986 len = XSTRING_CHAR_LENGTH (string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1987
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1988 for (i = 0; i < len; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1989 if (!WORD_SYNTAX_P (syntax_table, string_char (XSTRING (string), i)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1990 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1991 punct_count++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1992 if (i > 0 && WORD_SYNTAX_P (syntax_table,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1993 string_char (XSTRING (string), i - 1)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1994 word_count++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1995 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1996 if (WORD_SYNTAX_P (syntax_table, string_char (XSTRING (string), len - 1)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1997 word_count++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1998 if (!word_count) return build_string ("");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1999
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2000 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2001 /* The following value is an upper bound on the amount of storage we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2002 need. In non-Mule, it is exact. */
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2003 Intbyte *storage =
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2004 (Intbyte *) alloca (XSTRING_LENGTH (string) - punct_count +
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2005 5 * (word_count - 1) + 4);
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2006 Intbyte *o = storage;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2007
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2008 *o++ = '\\';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2009 *o++ = 'b';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2010
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2011 for (i = 0; i < len; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2012 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2013 Emchar ch = string_char (XSTRING (string), i);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2014
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2015 if (WORD_SYNTAX_P (syntax_table, ch))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2016 o += set_charptr_emchar (o, ch);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2017 else if (i > 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2018 && WORD_SYNTAX_P (syntax_table,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2019 string_char (XSTRING (string), i - 1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2020 && --word_count)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2021 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2022 *o++ = '\\';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2023 *o++ = 'W';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2024 *o++ = '\\';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2025 *o++ = 'W';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2026 *o++ = '*';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2027 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2028 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2029
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2030 *o++ = '\\';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2031 *o++ = 'b';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2032
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2033 return make_string (storage, o - storage);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2034 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2035 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2036
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2037 DEFUN ("search-backward", Fsearch_backward, 1, 5, "sSearch backward: ", /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2038 Search backward from point for STRING.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2039 Set point to the beginning of the occurrence found, and return point.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2040
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2041 Optional second argument LIMIT bounds the search; it is a buffer
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2042 position. The match found must not extend before that position.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2043 The value nil is equivalent to (point-min).
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2044
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2045 Optional third argument NOERROR, if t, means just return nil (no
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2046 error) if the search fails. If neither nil nor t, set point to LIMIT
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2047 and return nil.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2048
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2049 Optional fourth argument COUNT is a repeat count--search for
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2050 successive occurrences.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2051
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2052 Optional fifth argument BUFFER specifies the buffer to search in and
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2053 defaults to the current buffer.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2054
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2055 See also the functions `match-beginning', `match-end' and `replace-match'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2056 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2057 (string, limit, noerror, count, buffer))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2058 {
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2059 return search_command (string, limit, noerror, count, buffer, -1, 0, 0);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2060 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2061
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2062 DEFUN ("search-forward", Fsearch_forward, 1, 5, "sSearch: ", /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2063 Search forward from point for STRING.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2064 Set point to the end of the occurrence found, and return point.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2065
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2066 Optional second argument LIMIT bounds the search; it is a buffer
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2067 position. The match found must not extend after that position. The
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2068 value nil is equivalent to (point-max).
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2069
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2070 Optional third argument NOERROR, if t, means just return nil (no
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2071 error) if the search fails. If neither nil nor t, set point to LIMIT
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2072 and return nil.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2073
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2074 Optional fourth argument COUNT is a repeat count--search for
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2075 successive occurrences.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2076
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2077 Optional fifth argument BUFFER specifies the buffer to search in and
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2078 defaults to the current buffer.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2079
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2080 See also the functions `match-beginning', `match-end' and `replace-match'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2081 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2082 (string, limit, noerror, count, buffer))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2083 {
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2084 return search_command (string, limit, noerror, count, buffer, 1, 0, 0);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2085 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2086
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2087 DEFUN ("word-search-backward", Fword_search_backward, 1, 5,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2088 "sWord search backward: ", /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2089 Search backward from point for STRING, ignoring differences in punctuation.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2090 Set point to the beginning of the occurrence found, and return point.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2091
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2092 Optional second argument LIMIT bounds the search; it is a buffer
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2093 position. The match found must not extend before that position.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2094 The value nil is equivalent to (point-min).
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2095
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2096 Optional third argument NOERROR, if t, means just return nil (no
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2097 error) if the search fails. If neither nil nor t, set point to LIMIT
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2098 and return nil.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2099
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2100 Optional fourth argument COUNT is a repeat count--search for
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2101 successive occurrences.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2102
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2103 Optional fifth argument BUFFER specifies the buffer to search in and
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2104 defaults to the current buffer.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2105
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2106 See also the functions `match-beginning', `match-end' and `replace-match'.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2107 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2108 (string, limit, noerror, count, buffer))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2109 {
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2110 return search_command (wordify (buffer, string), limit, noerror, count,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2111 buffer, -1, 1, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2112 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2113
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2114 DEFUN ("word-search-forward", Fword_search_forward, 1, 5, "sWord search: ", /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2115 Search forward from point for STRING, ignoring differences in punctuation.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2116 Set point to the end of the occurrence found, and return point.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2117
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2118 Optional second argument LIMIT bounds the search; it is a buffer
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2119 position. The match found must not extend after that position. The
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2120 value nil is equivalent to (point-max).
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2121
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2122 Optional third argument NOERROR, if t, means just return nil (no
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2123 error) if the search fails. If neither nil nor t, set point to LIMIT
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2124 and return nil.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2125
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2126 Optional fourth argument COUNT is a repeat count--search for
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2127 successive occurrences.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2128
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2129 Optional fifth argument BUFFER specifies the buffer to search in and
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2130 defaults to the current buffer.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2131
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2132 See also the functions `match-beginning', `match-end' and `replace-match'.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2133 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2134 (string, limit, noerror, count, buffer))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2135 {
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2136 return search_command (wordify (buffer, string), limit, noerror, count,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2137 buffer, 1, 1, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2138 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2139
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2140 DEFUN ("re-search-backward", Fre_search_backward, 1, 5,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2141 "sRE search backward: ", /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2142 Search backward from point for match for regular expression REGEXP.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2143 Set point to the beginning of the match, and return point.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2144 The match found is the one starting last in the buffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2145 and yet ending before the origin of the search.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2146
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2147 Optional second argument LIMIT bounds the search; it is a buffer
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2148 position. The match found must not extend before that position.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2149 The value nil is equivalent to (point-min).
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2150
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2151 Optional third argument NOERROR, if t, means just return nil (no
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2152 error) if the search fails. If neither nil nor t, set point to LIMIT
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2153 and return nil.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2154
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2155 Optional fourth argument COUNT is a repeat count--search for
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2156 successive occurrences.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2157
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2158 Optional fifth argument BUFFER specifies the buffer to search in and
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2159 defaults to the current buffer.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2160
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2161 See also the functions `match-beginning', `match-end' and `replace-match'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2162 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2163 (regexp, limit, noerror, count, buffer))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2164 {
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2165 return search_command (regexp, limit, noerror, count, buffer, -1, 1, 0);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2166 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2167
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2168 DEFUN ("re-search-forward", Fre_search_forward, 1, 5, "sRE search: ", /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2169 Search forward from point for regular expression REGEXP.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2170 Set point to the end of the occurrence found, and return point.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2171
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2172 Optional second argument LIMIT bounds the search; it is a buffer
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2173 position. The match found must not extend after that position. The
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2174 value nil is equivalent to (point-max).
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2175
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2176 Optional third argument NOERROR, if t, means just return nil (no
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2177 error) if the search fails. If neither nil nor t, set point to LIMIT
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2178 and return nil.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2179
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2180 Optional fourth argument COUNT is a repeat count--search for
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2181 successive occurrences.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2182
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2183 Optional fifth argument BUFFER specifies the buffer to search in and
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2184 defaults to the current buffer.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2185
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2186 See also the functions `match-beginning', `match-end' and `replace-match'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2187 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2188 (regexp, limit, noerror, count, buffer))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2189 {
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2190 return search_command (regexp, limit, noerror, count, buffer, 1, 1, 0);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2191 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2192
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2193 DEFUN ("posix-search-backward", Fposix_search_backward, 1, 5,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2194 "sPosix search backward: ", /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2195 Search backward from point for match for regular expression REGEXP.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2196 Find the longest match in accord with Posix regular expression rules.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2197 Set point to the beginning of the match, and return point.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2198 The match found is the one starting last in the buffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2199 and yet ending before the origin of the search.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2200
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2201 Optional second argument LIMIT bounds the search; it is a buffer
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2202 position. The match found must not extend before that position.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2203 The value nil is equivalent to (point-min).
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2204
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2205 Optional third argument NOERROR, if t, means just return nil (no
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2206 error) if the search fails. If neither nil nor t, set point to LIMIT
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2207 and return nil.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2208
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2209 Optional fourth argument COUNT is a repeat count--search for
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2210 successive occurrences.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2211
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2212 Optional fifth argument BUFFER specifies the buffer to search in and
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2213 defaults to the current buffer.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2214
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2215 See also the functions `match-beginning', `match-end' and `replace-match'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2216 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2217 (regexp, limit, noerror, count, buffer))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2218 {
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2219 return search_command (regexp, limit, noerror, count, buffer, -1, 1, 1);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2220 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2221
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2222 DEFUN ("posix-search-forward", Fposix_search_forward, 1, 5, "sPosix search: ", /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2223 Search forward from point for regular expression REGEXP.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2224 Find the longest match in accord with Posix regular expression rules.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2225 Set point to the end of the occurrence found, and return point.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2226
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2227 Optional second argument LIMIT bounds the search; it is a buffer
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2228 position. The match found must not extend after that position. The
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2229 value nil is equivalent to (point-max).
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2230
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2231 Optional third argument NOERROR, if t, means just return nil (no
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2232 error) if the search fails. If neither nil nor t, set point to LIMIT
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2233 and return nil.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2234
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2235 Optional fourth argument COUNT is a repeat count--search for
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2236 successive occurrences.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2237
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2238 Optional fifth argument BUFFER specifies the buffer to search in and
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2239 defaults to the current buffer.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2240
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2241 See also the functions `match-beginning', `match-end' and `replace-match'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2242 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2243 (regexp, limit, noerror, count, buffer))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2244 {
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2245 return search_command (regexp, limit, noerror, count, buffer, 1, 1, 1);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2246 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2247
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2248
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2249 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2250 free_created_dynarrs (Lisp_Object cons)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2251 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2252 Dynarr_free (get_opaque_ptr (XCAR (cons)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2253 Dynarr_free (get_opaque_ptr (XCDR (cons)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2254 free_opaque_ptr (XCAR (cons));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2255 free_opaque_ptr (XCDR (cons));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2256 free_cons (XCONS (cons));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2257 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2258 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2259
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2260 DEFUN ("replace-match", Freplace_match, 1, 5, 0, /*
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2261 Replace text matched by last search with REPLACEMENT.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2262 If second arg FIXEDCASE is non-nil, do not alter case of replacement text.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2263 Otherwise maybe capitalize the whole text, or maybe just word initials,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2264 based on the replaced text.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2265 If the replaced text has only capital letters
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2266 and has at least one multiletter word, convert REPLACEMENT to all caps.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2267 If the replaced text has at least one word starting with a capital letter,
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2268 then capitalize each word in REPLACEMENT.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2269
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2270 If third arg LITERAL is non-nil, insert REPLACEMENT literally.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2271 Otherwise treat `\\' as special:
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2272 `\\&' in REPLACEMENT means substitute original matched text.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2273 `\\N' means substitute what matched the Nth `\\(...\\)'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2274 If Nth parens didn't match, substitute nothing.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2275 `\\\\' means insert one `\\'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2276 `\\u' means upcase the next character.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2277 `\\l' means downcase the next character.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2278 `\\U' means begin upcasing all following characters.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2279 `\\L' means begin downcasing all following characters.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2280 `\\E' means terminate the effect of any `\\U' or `\\L'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2281 Case changes made with `\\u', `\\l', `\\U', and `\\L' override
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2282 all other case changes that may be made in the replaced text.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2283 FIXEDCASE and LITERAL are optional arguments.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2284 Leaves point at end of replacement text.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2285
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2286 The optional fourth argument STRING can be a string to modify.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2287 In that case, this function creates and returns a new string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2288 which is made by replacing the part of STRING that was matched.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2289 When fourth argument is a string, fifth argument STRBUFFER specifies
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2290 the buffer to be used for syntax-table and case-table lookup and
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2291 defaults to the current buffer. When fourth argument is not a string,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2292 the buffer that the match occurred in has automatically been remembered
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2293 and you do not need to specify it.
469
ccaeb2a3c329 [xemacs-hg @ 2001-04-13 15:04:38 by michaels]
michaels
parents: 462
diff changeset
2294
ccaeb2a3c329 [xemacs-hg @ 2001-04-13 15:04:38 by michaels]
michaels
parents: 462
diff changeset
2295 When fourth argument is nil, STRBUFFER specifies a subexpression of
ccaeb2a3c329 [xemacs-hg @ 2001-04-13 15:04:38 by michaels]
michaels
parents: 462
diff changeset
2296 the match. It says to replace just that subexpression instead of the
ccaeb2a3c329 [xemacs-hg @ 2001-04-13 15:04:38 by michaels]
michaels
parents: 462
diff changeset
2297 whole match. This is useful only after a regular expression search or
ccaeb2a3c329 [xemacs-hg @ 2001-04-13 15:04:38 by michaels]
michaels
parents: 462
diff changeset
2298 match since only regular expressions have distinguished subexpressions.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2299 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2300 (replacement, fixedcase, literal, string, strbuffer))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2301 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2302 /* This function has been Mule-ized. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2303 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2304 enum { nochange, all_caps, cap_initial } case_action;
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2305 Charbpos pos, last;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2306 int some_multiletter_word;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2307 int some_lowercase;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2308 int some_uppercase;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2309 int some_nonuppercase_initial;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2310 Emchar c, prevc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2311 Charcount inslen;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2312 struct buffer *buf;
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
2313 Lisp_Char_Table *syntax_table;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2314 int mc_count;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2315 Lisp_Object buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2316 int_dynarr *ul_action_dynarr = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2317 int_dynarr *ul_pos_dynarr = 0;
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 469
diff changeset
2318 int sub = 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2319 int speccount;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2320
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2321 CHECK_STRING (replacement);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2322
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2323 if (! NILP (string))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2324 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2325 CHECK_STRING (string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2326 if (!EQ (last_thing_searched, Qt))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 507
diff changeset
2327 invalid_argument ("last thing matched was not a string", Qunbound);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2328 /* If the match data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2329 were abstracted into a special "match data" type instead
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2330 of the typical half-assed "let the implementation be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2331 visible" form it's in, we could extend it to include
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2332 the last string matched and the buffer used for that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2333 matching. But of course we can't change it as it is. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2334 buf = decode_buffer (strbuffer, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2335 XSETBUFFER (buffer, buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2336 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2337 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2338 {
707
a307f9a2021d [xemacs-hg @ 2001-12-20 05:49:28 by andyp]
andyp
parents: 665
diff changeset
2339 if (!NILP (strbuffer))
469
ccaeb2a3c329 [xemacs-hg @ 2001-04-13 15:04:38 by michaels]
michaels
parents: 462
diff changeset
2340 {
ccaeb2a3c329 [xemacs-hg @ 2001-04-13 15:04:38 by michaels]
michaels
parents: 462
diff changeset
2341 CHECK_INT (strbuffer);
ccaeb2a3c329 [xemacs-hg @ 2001-04-13 15:04:38 by michaels]
michaels
parents: 462
diff changeset
2342 sub = XINT (strbuffer);
ccaeb2a3c329 [xemacs-hg @ 2001-04-13 15:04:38 by michaels]
michaels
parents: 462
diff changeset
2343 if (sub < 0 || sub >= (int) search_regs.num_regs)
ccaeb2a3c329 [xemacs-hg @ 2001-04-13 15:04:38 by michaels]
michaels
parents: 462
diff changeset
2344 args_out_of_range (strbuffer, make_int (search_regs.num_regs));
ccaeb2a3c329 [xemacs-hg @ 2001-04-13 15:04:38 by michaels]
michaels
parents: 462
diff changeset
2345 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2346 if (!BUFFERP (last_thing_searched))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 507
diff changeset
2347 invalid_argument ("last thing matched was not a buffer", Qunbound);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2348 buffer = last_thing_searched;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2349 buf = XBUFFER (buffer);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2350 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2351
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2352 syntax_table = XCHAR_TABLE (buf->mirror_syntax_table);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2353
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2354 case_action = nochange; /* We tried an initialization */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2355 /* but some C compilers blew it */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2356
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2357 if (search_regs.num_regs == 0)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 507
diff changeset
2358 signal_error (Qinvalid_operation, "replace-match called before any match found", Qunbound);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2359
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2360 if (NILP (string))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2361 {
469
ccaeb2a3c329 [xemacs-hg @ 2001-04-13 15:04:38 by michaels]
michaels
parents: 462
diff changeset
2362 if (search_regs.start[sub] < BUF_BEGV (buf)
ccaeb2a3c329 [xemacs-hg @ 2001-04-13 15:04:38 by michaels]
michaels
parents: 462
diff changeset
2363 || search_regs.start[sub] > search_regs.end[sub]
ccaeb2a3c329 [xemacs-hg @ 2001-04-13 15:04:38 by michaels]
michaels
parents: 462
diff changeset
2364 || search_regs.end[sub] > BUF_ZV (buf))
ccaeb2a3c329 [xemacs-hg @ 2001-04-13 15:04:38 by michaels]
michaels
parents: 462
diff changeset
2365 args_out_of_range (make_int (search_regs.start[sub]),
ccaeb2a3c329 [xemacs-hg @ 2001-04-13 15:04:38 by michaels]
michaels
parents: 462
diff changeset
2366 make_int (search_regs.end[sub]));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2367 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2368 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2369 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2370 if (search_regs.start[0] < 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2371 || search_regs.start[0] > search_regs.end[0]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2372 || search_regs.end[0] > XSTRING_CHAR_LENGTH (string))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2373 args_out_of_range (make_int (search_regs.start[0]),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2374 make_int (search_regs.end[0]));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2375 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2376
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2377 if (NILP (fixedcase))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2378 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2379 /* Decide how to casify by examining the matched text. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2380
707
a307f9a2021d [xemacs-hg @ 2001-12-20 05:49:28 by andyp]
andyp
parents: 665
diff changeset
2381 last = search_regs.end[sub];
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2382 prevc = '\n';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2383 case_action = all_caps;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2384
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2385 /* some_multiletter_word is set nonzero if any original word
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2386 is more than one letter long. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2387 some_multiletter_word = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2388 some_lowercase = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2389 some_nonuppercase_initial = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2390 some_uppercase = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2391
707
a307f9a2021d [xemacs-hg @ 2001-12-20 05:49:28 by andyp]
andyp
parents: 665
diff changeset
2392 for (pos = search_regs.start[sub]; pos < last; pos++)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2393 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2394 if (NILP (string))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2395 c = BUF_FETCH_CHAR (buf, pos);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2396 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2397 c = string_char (XSTRING (string), pos);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2398
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2399 if (LOWERCASEP (buf, c))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2400 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2401 /* Cannot be all caps if any original char is lower case */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2402
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2403 some_lowercase = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2404 if (!WORD_SYNTAX_P (syntax_table, prevc))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2405 some_nonuppercase_initial = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2406 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2407 some_multiletter_word = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2408 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2409 else if (!NOCASEP (buf, c))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2410 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2411 some_uppercase = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2412 if (!WORD_SYNTAX_P (syntax_table, prevc))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2413 ;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2414 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2415 some_multiletter_word = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2416 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2417 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2418 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2419 /* If the initial is a caseless word constituent,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2420 treat that like a lowercase initial. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2421 if (!WORD_SYNTAX_P (syntax_table, prevc))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2422 some_nonuppercase_initial = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2423 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2424
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2425 prevc = c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2426 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2427
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2428 /* Convert to all caps if the old text is all caps
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2429 and has at least one multiletter word. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2430 if (! some_lowercase && some_multiletter_word)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2431 case_action = all_caps;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2432 /* Capitalize each word, if the old text has all capitalized words. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2433 else if (!some_nonuppercase_initial && some_multiletter_word)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2434 case_action = cap_initial;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2435 else if (!some_nonuppercase_initial && some_uppercase)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2436 /* Should x -> yz, operating on X, give Yz or YZ?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2437 We'll assume the latter. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2438 case_action = all_caps;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2439 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2440 case_action = nochange;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2441 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2442
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2443 /* Do replacement in a string. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2444 if (!NILP (string))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2445 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2446 Lisp_Object before, after;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2447
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2448 speccount = specpdl_depth ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2449 before = Fsubstring (string, Qzero, make_int (search_regs.start[0]));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2450 after = Fsubstring (string, make_int (search_regs.end[0]), Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2451
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2452 /* Do case substitution into REPLACEMENT if desired. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2453 if (NILP (literal))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2454 {
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2455 Charcount stlen = XSTRING_CHAR_LENGTH (replacement);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2456 Charcount strpos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2457 /* XEmacs change: rewrote this loop somewhat to make it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2458 cleaner. Also added \U, \E, etc. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2459 Charcount literal_start = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2460 /* We build up the substituted string in ACCUM. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2461 Lisp_Object accum;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2462
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2463 accum = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2464
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2465 /* OK, the basic idea here is that we scan through the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2466 replacement string until we find a backslash, which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2467 represents a substring of the original string to be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2468 substituted. We then append onto ACCUM the literal
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2469 text before the backslash (LASTPOS marks the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2470 beginning of this) followed by the substring of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2471 original string that needs to be inserted. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2472 for (strpos = 0; strpos < stlen; strpos++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2473 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2474 /* If LITERAL_END is set, we've encountered a backslash
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2475 (the end of literal text to be inserted). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2476 Charcount literal_end = -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2477 /* If SUBSTART is set, we need to also insert the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2478 text from SUBSTART to SUBEND in the original string. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2479 Charcount substart = -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2480 Charcount subend = -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2481
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2482 c = string_char (XSTRING (replacement), strpos);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2483 if (c == '\\' && strpos < stlen - 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2484 {
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2485 c = string_char (XSTRING (replacement), ++strpos);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2486 if (c == '&')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2487 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2488 literal_end = strpos - 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2489 substart = search_regs.start[0];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2490 subend = search_regs.end[0];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2491 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2492 else if (c >= '1' && c <= '9' &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2493 c <= search_regs.num_regs + '0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2494 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2495 if (search_regs.start[c - '0'] >= 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2496 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2497 literal_end = strpos - 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2498 substart = search_regs.start[c - '0'];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2499 subend = search_regs.end[c - '0'];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2500 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2501 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2502 else if (c == 'U' || c == 'u' || c == 'L' || c == 'l' ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2503 c == 'E')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2504 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2505 /* Keep track of all case changes requested, but don't
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2506 make them now. Do them later so we override
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2507 everything else. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2508 if (!ul_pos_dynarr)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2509 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2510 ul_pos_dynarr = Dynarr_new (int);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2511 ul_action_dynarr = Dynarr_new (int);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2512 record_unwind_protect
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2513 (free_created_dynarrs,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2514 noseeum_cons
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2515 (make_opaque_ptr (ul_pos_dynarr),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2516 make_opaque_ptr (ul_action_dynarr)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2517 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2518 literal_end = strpos - 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2519 Dynarr_add (ul_pos_dynarr,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2520 (!NILP (accum)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2521 ? XSTRING_CHAR_LENGTH (accum)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2522 : 0) + (literal_end - literal_start));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2523 Dynarr_add (ul_action_dynarr, c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2524 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2525 else if (c == '\\')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2526 /* So we get just one backslash. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2527 literal_end = strpos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2528 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2529 if (literal_end >= 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2530 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2531 Lisp_Object literal_text = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2532 Lisp_Object substring = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2533 if (literal_end != literal_start)
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2534 literal_text = Fsubstring (replacement,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2535 make_int (literal_start),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2536 make_int (literal_end));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2537 if (substart >= 0 && subend != substart)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2538 substring = Fsubstring (string,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2539 make_int (substart),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2540 make_int (subend));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2541 if (!NILP (literal_text) || !NILP (substring))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2542 accum = concat3 (accum, literal_text, substring);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2543 literal_start = strpos + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2544 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2545 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2546
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2547 if (strpos != literal_start)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2548 /* some literal text at end to be inserted */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2549 replacement = concat2 (accum, Fsubstring (replacement,
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2550 make_int (literal_start),
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2551 make_int (strpos)));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2552 else
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2553 replacement = accum;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2554 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2555
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2556 /* replacement can be nil. */
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2557 if (NILP (replacement))
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2558 replacement = build_string ("");
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2559
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2560 if (case_action == all_caps)
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2561 replacement = Fupcase (replacement, buffer);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2562 else if (case_action == cap_initial)
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2563 replacement = Fupcase_initials (replacement, buffer);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2564
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2565 /* Now finally, we need to process the \U's, \E's, etc. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2566 if (ul_pos_dynarr)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2567 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2568 int i = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2569 int cur_action = 'E';
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2570 Charcount stlen = XSTRING_CHAR_LENGTH (replacement);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2571 Charcount strpos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2572
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2573 for (strpos = 0; strpos < stlen; strpos++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2574 {
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2575 Emchar curchar = string_char (XSTRING (replacement), strpos);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2576 Emchar newchar = -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2577 if (i < Dynarr_length (ul_pos_dynarr) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2578 strpos == Dynarr_at (ul_pos_dynarr, i))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2579 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2580 int new_action = Dynarr_at (ul_action_dynarr, i);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2581 i++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2582 if (new_action == 'u')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2583 newchar = UPCASE (buf, curchar);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2584 else if (new_action == 'l')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2585 newchar = DOWNCASE (buf, curchar);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2586 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2587 cur_action = new_action;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2588 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2589 if (newchar == -1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2590 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2591 if (cur_action == 'U')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2592 newchar = UPCASE (buf, curchar);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2593 else if (cur_action == 'L')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2594 newchar = DOWNCASE (buf, curchar);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2595 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2596 newchar = curchar;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2597 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2598 if (newchar != curchar)
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2599 set_string_char (XSTRING (replacement), strpos, newchar);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2600 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2601 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2602
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2603 /* frees the Dynarrs if necessary. */
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
2604 unbind_to (speccount);
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2605 return concat3 (before, replacement, after);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2606 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2607
707
a307f9a2021d [xemacs-hg @ 2001-12-20 05:49:28 by andyp]
andyp
parents: 665
diff changeset
2608 mc_count = begin_multiple_change (buf, search_regs.start[sub],
a307f9a2021d [xemacs-hg @ 2001-12-20 05:49:28 by andyp]
andyp
parents: 665
diff changeset
2609 search_regs.end[sub]);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2610
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2611 /* begin_multiple_change() records an unwind-protect, so we need to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2612 record this value now. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2613 speccount = specpdl_depth ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2614
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2615 /* We insert the replacement text before the old text, and then
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2616 delete the original text. This means that markers at the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2617 beginning or end of the original will float to the corresponding
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2618 position in the replacement. */
707
a307f9a2021d [xemacs-hg @ 2001-12-20 05:49:28 by andyp]
andyp
parents: 665
diff changeset
2619 BUF_SET_PT (buf, search_regs.start[sub]);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2620 if (!NILP (literal))
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2621 Finsert (1, &replacement);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2622 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2623 {
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2624 Charcount stlen = XSTRING_CHAR_LENGTH (replacement);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2625 Charcount strpos;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2626 struct gcpro gcpro1;
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2627 GCPRO1 (replacement);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2628 for (strpos = 0; strpos < stlen; strpos++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2629 {
707
a307f9a2021d [xemacs-hg @ 2001-12-20 05:49:28 by andyp]
andyp
parents: 665
diff changeset
2630 /* on the first iteration assert(offset==0),
a307f9a2021d [xemacs-hg @ 2001-12-20 05:49:28 by andyp]
andyp
parents: 665
diff changeset
2631 exactly complementing BUF_SET_PT() above.
a307f9a2021d [xemacs-hg @ 2001-12-20 05:49:28 by andyp]
andyp
parents: 665
diff changeset
2632 During the loop, it keeps track of the amount inserted.
a307f9a2021d [xemacs-hg @ 2001-12-20 05:49:28 by andyp]
andyp
parents: 665
diff changeset
2633 */
a307f9a2021d [xemacs-hg @ 2001-12-20 05:49:28 by andyp]
andyp
parents: 665
diff changeset
2634 Charcount offset = BUF_PT (buf) - search_regs.start[sub];
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2635
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2636 c = string_char (XSTRING (replacement), strpos);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2637 if (c == '\\' && strpos < stlen - 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2638 {
707
a307f9a2021d [xemacs-hg @ 2001-12-20 05:49:28 by andyp]
andyp
parents: 665
diff changeset
2639 /* XXX FIXME: replacing just a substring non-literally
a307f9a2021d [xemacs-hg @ 2001-12-20 05:49:28 by andyp]
andyp
parents: 665
diff changeset
2640 using backslash refs to the match looks dangerous. But
a307f9a2021d [xemacs-hg @ 2001-12-20 05:49:28 by andyp]
andyp
parents: 665
diff changeset
2641 <15366.18513.698042.156573@ns.caldera.de> from Torsten Duwe
a307f9a2021d [xemacs-hg @ 2001-12-20 05:49:28 by andyp]
andyp
parents: 665
diff changeset
2642 <duwe@caldera.de> claims Finsert_buffer_substring already
a307f9a2021d [xemacs-hg @ 2001-12-20 05:49:28 by andyp]
andyp
parents: 665
diff changeset
2643 handles this correctly.
a307f9a2021d [xemacs-hg @ 2001-12-20 05:49:28 by andyp]
andyp
parents: 665
diff changeset
2644 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2645 c = string_char (XSTRING (replacement), ++strpos);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2646 if (c == '&')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2647 Finsert_buffer_substring
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2648 (buffer,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2649 make_int (search_regs.start[0] + offset),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2650 make_int (search_regs.end[0] + offset));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2651 else if (c >= '1' && c <= '9' &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2652 c <= search_regs.num_regs + '0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2653 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2654 if (search_regs.start[c - '0'] >= 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2655 Finsert_buffer_substring
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2656 (buffer,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2657 make_int (search_regs.start[c - '0'] + offset),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2658 make_int (search_regs.end[c - '0'] + offset));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2659 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2660 else if (c == 'U' || c == 'u' || c == 'L' || c == 'l' ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2661 c == 'E')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2662 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2663 /* Keep track of all case changes requested, but don't
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2664 make them now. Do them later so we override
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2665 everything else. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2666 if (!ul_pos_dynarr)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2667 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2668 ul_pos_dynarr = Dynarr_new (int);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2669 ul_action_dynarr = Dynarr_new (int);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2670 record_unwind_protect
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2671 (free_created_dynarrs,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2672 Fcons (make_opaque_ptr (ul_pos_dynarr),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2673 make_opaque_ptr (ul_action_dynarr)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2674 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2675 Dynarr_add (ul_pos_dynarr, BUF_PT (buf));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2676 Dynarr_add (ul_action_dynarr, c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2677 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2678 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2679 buffer_insert_emacs_char (buf, c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2680 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2681 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2682 buffer_insert_emacs_char (buf, c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2683 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2684 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2685 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2686
707
a307f9a2021d [xemacs-hg @ 2001-12-20 05:49:28 by andyp]
andyp
parents: 665
diff changeset
2687 inslen = BUF_PT (buf) - (search_regs.start[sub]);
a307f9a2021d [xemacs-hg @ 2001-12-20 05:49:28 by andyp]
andyp
parents: 665
diff changeset
2688 buffer_delete_range (buf, search_regs.start[sub] + inslen,
a307f9a2021d [xemacs-hg @ 2001-12-20 05:49:28 by andyp]
andyp
parents: 665
diff changeset
2689 search_regs.end[sub] + inslen, 0);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2690
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2691 if (case_action == all_caps)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2692 Fupcase_region (make_int (BUF_PT (buf) - inslen),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2693 make_int (BUF_PT (buf)), buffer);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2694 else if (case_action == cap_initial)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2695 Fupcase_initials_region (make_int (BUF_PT (buf) - inslen),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2696 make_int (BUF_PT (buf)), buffer);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2697
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2698 /* Now go through and make all the case changes that were requested
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2699 in the replacement string. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2700 if (ul_pos_dynarr)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2701 {
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2702 Charbpos eend = BUF_PT (buf);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2703 int i = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2704 int cur_action = 'E';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2705
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2706 for (pos = BUF_PT (buf) - inslen; pos < eend; pos++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2707 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2708 Emchar curchar = BUF_FETCH_CHAR (buf, pos);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2709 Emchar newchar = -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2710 if (i < Dynarr_length (ul_pos_dynarr) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2711 pos == Dynarr_at (ul_pos_dynarr, i))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2712 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2713 int new_action = Dynarr_at (ul_action_dynarr, i);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2714 i++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2715 if (new_action == 'u')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2716 newchar = UPCASE (buf, curchar);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2717 else if (new_action == 'l')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2718 newchar = DOWNCASE (buf, curchar);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2719 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2720 cur_action = new_action;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2721 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2722 if (newchar == -1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2723 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2724 if (cur_action == 'U')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2725 newchar = UPCASE (buf, curchar);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2726 else if (cur_action == 'L')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2727 newchar = DOWNCASE (buf, curchar);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2728 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2729 newchar = curchar;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2730 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2731 if (newchar != curchar)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2732 buffer_replace_char (buf, pos, newchar, 0, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2733 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2734 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2735
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2736 /* frees the Dynarrs if necessary. */
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 707
diff changeset
2737 unbind_to (speccount);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2738 end_multiple_change (buf, mc_count);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2739
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2740 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2741 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2742
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2743 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2744 match_limit (Lisp_Object num, int beginningp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2745 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2746 /* This function has been Mule-ized. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2747 int n;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2748
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2749 CHECK_INT (num);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2750 n = XINT (num);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2751 if (n < 0 || n >= search_regs.num_regs)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2752 args_out_of_range (num, make_int (search_regs.num_regs));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2753 if (search_regs.num_regs == 0 ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2754 search_regs.start[n] < 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2755 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2756 return make_int (beginningp ? search_regs.start[n] : search_regs.end[n]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2757 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2758
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2759 DEFUN ("match-beginning", Fmatch_beginning, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2760 Return position of start of text matched by last regexp search.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2761 NUM, specifies which parenthesized expression in the last regexp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2762 Value is nil if NUMth pair didn't match, or there were less than NUM pairs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2763 Zero means the entire text matched by the whole regexp or whole string.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2764 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2765 (num))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2766 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2767 return match_limit (num, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2768 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2769
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2770 DEFUN ("match-end", Fmatch_end, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2771 Return position of end of text matched by last regexp search.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2772 NUM specifies which parenthesized expression in the last regexp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2773 Value is nil if NUMth pair didn't match, or there were less than NUM pairs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2774 Zero means the entire text matched by the whole regexp or whole string.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2775 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2776 (num))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2777 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2778 return match_limit (num, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2779 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2780
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2781 DEFUN ("match-data", Fmatch_data, 0, 2, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2782 Return a list containing all info on what the last regexp search matched.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2783 Element 2N is `(match-beginning N)'; element 2N + 1 is `(match-end N)'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2784 All the elements are markers or nil (nil if the Nth pair didn't match)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2785 if the last match was on a buffer; integers or nil if a string was matched.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2786 Use `store-match-data' to reinstate the data in this list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2787
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2788 If INTEGERS (the optional first argument) is non-nil, always use integers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2789 \(rather than markers) to represent buffer positions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2790 If REUSE is a list, reuse it as part of the value. If REUSE is long enough
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2791 to hold all the values, and if INTEGERS is non-nil, no consing is done.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2792 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2793 (integers, reuse))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2794 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2795 /* This function has been Mule-ized. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2796 Lisp_Object tail, prev;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2797 Lisp_Object *data;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2798 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2799 Charcount len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2800
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2801 if (NILP (last_thing_searched))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 507
diff changeset
2802 /*error ("match-data called before any match found", Qunbound);*/
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2803 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2804
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2805 data = alloca_array (Lisp_Object, 2 * search_regs.num_regs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2806
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2807 len = -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2808 for (i = 0; i < search_regs.num_regs; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2809 {
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2810 Charbpos start = search_regs.start[i];
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2811 if (start >= 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2812 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2813 if (EQ (last_thing_searched, Qt)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2814 || !NILP (integers))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2815 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2816 data[2 * i] = make_int (start);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2817 data[2 * i + 1] = make_int (search_regs.end[i]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2818 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2819 else if (BUFFERP (last_thing_searched))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2820 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2821 data[2 * i] = Fmake_marker ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2822 Fset_marker (data[2 * i],
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2823 make_int (start),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2824 last_thing_searched);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2825 data[2 * i + 1] = Fmake_marker ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2826 Fset_marker (data[2 * i + 1],
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2827 make_int (search_regs.end[i]),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2828 last_thing_searched);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2829 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2830 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2831 /* last_thing_searched must always be Qt, a buffer, or Qnil. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2832 abort ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2833
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2834 len = i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2835 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2836 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2837 data[2 * i] = data [2 * i + 1] = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2838 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2839 if (!CONSP (reuse))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2840 return Flist (2 * len + 2, data);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2841
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2842 /* If REUSE is a list, store as many value elements as will fit
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2843 into the elements of REUSE. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2844 for (prev = Qnil, i = 0, tail = reuse; CONSP (tail); i++, tail = XCDR (tail))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2845 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2846 if (i < 2 * len + 2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2847 XCAR (tail) = data[i];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2848 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2849 XCAR (tail) = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2850 prev = tail;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2851 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2852
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2853 /* If we couldn't fit all value elements into REUSE,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2854 cons up the rest of them and add them to the end of REUSE. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2855 if (i < 2 * len + 2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2856 XCDR (prev) = Flist (2 * len + 2 - i, data + i);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2857
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2858 return reuse;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2859 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2860
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2861
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2862 DEFUN ("store-match-data", Fstore_match_data, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2863 Set internal data on last search match from elements of LIST.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2864 LIST should have been created by calling `match-data' previously.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2865 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2866 (list))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2867 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2868 /* This function has been Mule-ized. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2869 REGISTER int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2870 REGISTER Lisp_Object marker;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2871 int num_regs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2872 int length;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2873
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2874 if (running_asynch_code)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2875 save_search_regs ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2876
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2877 CONCHECK_LIST (list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2878
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2879 /* Unless we find a marker with a buffer in LIST, assume that this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2880 match data came from a string. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2881 last_thing_searched = Qt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2882
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2883 /* Allocate registers if they don't already exist. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2884 length = XINT (Flength (list)) / 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2885 num_regs = search_regs.num_regs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2886
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2887 if (length > num_regs)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2888 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2889 if (search_regs.num_regs == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2890 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2891 search_regs.start = xnew_array (regoff_t, length);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2892 search_regs.end = xnew_array (regoff_t, length);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2893 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2894 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2895 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2896 XREALLOC_ARRAY (search_regs.start, regoff_t, length);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2897 XREALLOC_ARRAY (search_regs.end, regoff_t, length);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2898 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2899
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2900 search_regs.num_regs = length;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2901 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2902
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2903 for (i = 0; i < num_regs; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2904 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2905 marker = Fcar (list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2906 if (NILP (marker))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2907 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2908 search_regs.start[i] = -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2909 list = Fcdr (list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2910 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2911 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2912 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2913 if (MARKERP (marker))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2914 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2915 if (XMARKER (marker)->buffer == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2916 marker = Qzero;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2917 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2918 XSETBUFFER (last_thing_searched, XMARKER (marker)->buffer);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2919 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2920
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2921 CHECK_INT_COERCE_MARKER (marker);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2922 search_regs.start[i] = XINT (marker);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2923 list = Fcdr (list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2924
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2925 marker = Fcar (list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2926 if (MARKERP (marker) && XMARKER (marker)->buffer == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2927 marker = Qzero;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2928
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2929 CHECK_INT_COERCE_MARKER (marker);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2930 search_regs.end[i] = XINT (marker);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2931 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2932 list = Fcdr (list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2933 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2934
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2935 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2936 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2937
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2938 /* If non-zero the match data have been saved in saved_search_regs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2939 during the execution of a sentinel or filter. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2940 static int search_regs_saved;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2941 static struct re_registers saved_search_regs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2942
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2943 /* Called from Flooking_at, Fstring_match, search_buffer, Fstore_match_data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2944 if asynchronous code (filter or sentinel) is running. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2945 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2946 save_search_regs (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2947 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2948 if (!search_regs_saved)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2949 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2950 saved_search_regs.num_regs = search_regs.num_regs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2951 saved_search_regs.start = search_regs.start;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2952 saved_search_regs.end = search_regs.end;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2953 search_regs.num_regs = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2954 search_regs.start = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2955 search_regs.end = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2956
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2957 search_regs_saved = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2958 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2959 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2960
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2961 /* Called upon exit from filters and sentinels. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2962 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2963 restore_match_data (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2964 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2965 if (search_regs_saved)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2966 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2967 if (search_regs.num_regs > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2968 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2969 xfree (search_regs.start);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2970 xfree (search_regs.end);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2971 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2972 search_regs.num_regs = saved_search_regs.num_regs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2973 search_regs.start = saved_search_regs.start;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2974 search_regs.end = saved_search_regs.end;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2975
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2976 search_regs_saved = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2977 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2978 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2979
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2980 /* Quote a string to inactivate reg-expr chars */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2981
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2982 DEFUN ("regexp-quote", Fregexp_quote, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2983 Return a regexp string which matches exactly STRING and nothing else.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2984 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2985 (string))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2986 {
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2987 REGISTER Intbyte *in, *out, *end;
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2988 REGISTER Intbyte *temp;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2989
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2990 CHECK_STRING (string);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2991
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2992 temp = (Intbyte *) alloca (XSTRING_LENGTH (string) * 2);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2993
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2994 /* Now copy the data into the new string, inserting escapes. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2995
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2996 in = XSTRING_DATA (string);
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2997 end = in + XSTRING_LENGTH (string);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2998 out = temp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2999
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3000 while (in < end)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3001 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3002 Emchar c = charptr_emchar (in);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3003
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3004 if (c == '[' || c == ']'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3005 || c == '*' || c == '.' || c == '\\'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3006 || c == '?' || c == '+'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3007 || c == '^' || c == '$')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3008 *out++ = '\\';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3009 out += set_charptr_emchar (out, c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3010 INC_CHARPTR (in);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3011 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3012
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3013 return make_string (temp, out - temp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3014 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3015
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3016 DEFUN ("set-word-regexp", Fset_word_regexp, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3017 Set the regexp to be used to match a word in regular-expression searching.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3018 #### Not yet implemented. Currently does nothing.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3019 #### Do not use this yet. Its calling interface is likely to change.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3020 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3021 (regexp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3022 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3023 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3024 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3025
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3026
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3027 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3028 /* initialization */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3029 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3030
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3031 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3032 syms_of_search (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3033 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3034
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3035 DEFERROR_STANDARD (Qsearch_failed, Qinvalid_operation);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3036 DEFERROR_STANDARD (Qinvalid_regexp, Qsyntax_error);
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 507
diff changeset
3037 Fput (Qinvalid_regexp, Qerror_lacks_explanatory_string, Qt);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3038
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3039 DEFSUBR (Flooking_at);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3040 DEFSUBR (Fposix_looking_at);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3041 DEFSUBR (Fstring_match);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3042 DEFSUBR (Fposix_string_match);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3043 DEFSUBR (Fskip_chars_forward);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3044 DEFSUBR (Fskip_chars_backward);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3045 DEFSUBR (Fskip_syntax_forward);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3046 DEFSUBR (Fskip_syntax_backward);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3047 DEFSUBR (Fsearch_forward);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3048 DEFSUBR (Fsearch_backward);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3049 DEFSUBR (Fword_search_forward);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3050 DEFSUBR (Fword_search_backward);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3051 DEFSUBR (Fre_search_forward);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3052 DEFSUBR (Fre_search_backward);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3053 DEFSUBR (Fposix_search_forward);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3054 DEFSUBR (Fposix_search_backward);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3055 DEFSUBR (Freplace_match);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3056 DEFSUBR (Fmatch_beginning);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3057 DEFSUBR (Fmatch_end);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3058 DEFSUBR (Fmatch_data);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3059 DEFSUBR (Fstore_match_data);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3060 DEFSUBR (Fregexp_quote);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3061 DEFSUBR (Fset_word_regexp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3062 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3063
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3064 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3065 reinit_vars_of_search (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3066 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3067 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3068
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3069 last_thing_searched = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3070 staticpro_nodump (&last_thing_searched);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3071
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3072 for (i = 0; i < REGEXP_CACHE_SIZE; ++i)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3073 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3074 searchbufs[i].buf.allocated = 100;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3075 searchbufs[i].buf.buffer = (unsigned char *) xmalloc (100);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3076 searchbufs[i].buf.fastmap = searchbufs[i].fastmap;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3077 searchbufs[i].regexp = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3078 staticpro_nodump (&searchbufs[i].regexp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3079 searchbufs[i].next = (i == REGEXP_CACHE_SIZE-1 ? 0 : &searchbufs[i+1]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3080 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3081 searchbuf_head = &searchbufs[0];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3082 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3083
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3084 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3085 vars_of_search (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3086 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3087 reinit_vars_of_search ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3088
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3089 DEFVAR_LISP ("forward-word-regexp", &Vforward_word_regexp /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3090 *Regular expression to be used in `forward-word'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3091 #### Not yet implemented.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3092 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3093 Vforward_word_regexp = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3094
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3095 DEFVAR_LISP ("backward-word-regexp", &Vbackward_word_regexp /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3096 *Regular expression to be used in `backward-word'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3097 #### Not yet implemented.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3098 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3099 Vbackward_word_regexp = Qnil;
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 469
diff changeset
3100
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 469
diff changeset
3101 DEFVAR_INT ("warn-about-possibly-incompatible-back-references",
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 469
diff changeset
3102 &warn_about_possibly_incompatible_back_references /*
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 469
diff changeset
3103 If true, issue warnings when new-semantics back references occur.
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 469
diff changeset
3104 This is to catch places where old code might inadvertently have changed
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 469
diff changeset
3105 semantics. This will occur in old code only where more than nine groups
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 469
diff changeset
3106 occur and a back reference to one of them is directly followed by a digit.
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 469
diff changeset
3107 */ );
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 469
diff changeset
3108 warn_about_possibly_incompatible_back_references = 1;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3109 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3110
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3111 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3112 complex_vars_of_search (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3113 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3114 Vskip_chars_range_table = Fmake_range_table ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3115 staticpro (&Vskip_chars_range_table);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3116 }