* process.c: Make sure we don't miss processes exiting, by having
[bpt/emacs.git] / src / search.c
CommitLineData
ca1d1d23
JB
1/* String search routines for GNU Emacs.
2 Copyright (C) 1985, 1986, 1987, 1992 Free Software Foundation, Inc.
3
4This file is part of GNU Emacs.
5
6GNU Emacs is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 1, or (at your option)
9any later version.
10
11GNU Emacs is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GNU Emacs; see the file COPYING. If not, write to
18the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19
20
21#include "config.h"
22#include "lisp.h"
23#include "syntax.h"
24#include "buffer.h"
25#include "commands.h"
4746118a 26
ca1d1d23
JB
27#include <sys/types.h>
28#include "regex.h"
29
30#define max(a, b) ((a) > (b) ? (a) : (b))
31#define min(a, b) ((a) < (b) ? (a) : (b))
32
33/* We compile regexps into this buffer and then use it for searching. */
34
35struct re_pattern_buffer searchbuf;
36
37char search_fastmap[0400];
38
39/* Last regexp we compiled */
40
41Lisp_Object last_regexp;
42
4746118a
JB
43/* Every call to re_match, etc., must pass &search_regs as the regs
44 argument unless you can show it is unnecessary (i.e., if re_match
45 is certainly going to be called again before region-around-match
46 can be called).
47
48 Since the registers are now dynamically allocated, we need to make
49 sure not to refer to the Nth register before checking that it has
1113d9db
JB
50 been allocated by checking search_regs.num_regs.
51
52 The regex code keeps track of whether it has allocated the search
53 buffer using bits in searchbuf. This means that whenever you
54 compile a new pattern, it completely forgets whether it has
55 allocated any registers, and will allocate new registers the next
56 time you call a searching or matching function. Therefore, we need
57 to call re_set_registers after compiling a new pattern or after
58 setting the match registers, so that the regex functions will be
59 able to free or re-allocate it properly. */
ca1d1d23
JB
60static struct re_registers search_regs;
61
daa37602
JB
62/* The buffer in which the last search was performed, or
63 Qt if the last search was done in a string;
64 Qnil if no searching has been done yet. */
65static Lisp_Object last_thing_searched;
ca1d1d23
JB
66
67/* error condition signalled when regexp compile_pattern fails */
68
69Lisp_Object Qinvalid_regexp;
70
71static void
72matcher_overflow ()
73{
74 error ("Stack overflow in regexp matcher");
75}
76
77#ifdef __STDC__
78#define CONST const
79#else
80#define CONST
81#endif
82
83/* Compile a regexp and signal a Lisp error if anything goes wrong. */
84
1113d9db 85compile_pattern (pattern, bufp, regp, translate)
ca1d1d23
JB
86 Lisp_Object pattern;
87 struct re_pattern_buffer *bufp;
1113d9db 88 struct re_registers *regp;
ca1d1d23
JB
89 char *translate;
90{
91 CONST char *val;
92 Lisp_Object dummy;
93
94 if (EQ (pattern, last_regexp)
95 && translate == bufp->translate)
96 return;
1113d9db 97
ca1d1d23
JB
98 last_regexp = Qnil;
99 bufp->translate = translate;
100 val = re_compile_pattern ((char *) XSTRING (pattern)->data,
101 XSTRING (pattern)->size,
102 bufp);
103 if (val)
104 {
105 dummy = build_string (val);
106 while (1)
107 Fsignal (Qinvalid_regexp, Fcons (dummy, Qnil));
108 }
1113d9db 109
ca1d1d23 110 last_regexp = pattern;
1113d9db
JB
111
112 /* Advise the searching functions about the space we have allocated
113 for register data. */
ebb9e16f
JB
114 if (regp)
115 re_set_registers (bufp, regp, regp->num_regs, regp->start, regp->end);
1113d9db 116
ca1d1d23
JB
117 return;
118}
119
120/* Error condition used for failing searches */
121Lisp_Object Qsearch_failed;
122
123Lisp_Object
124signal_failure (arg)
125 Lisp_Object arg;
126{
127 Fsignal (Qsearch_failed, Fcons (arg, Qnil));
128 return Qnil;
129}
130\f
131DEFUN ("looking-at", Flooking_at, Slooking_at, 1, 1, 0,
e065a56e
JB
132 "Return t if text after point matches regular expression PAT.\n\
133This function modifies the match data that `match-beginning',\n\
134`match-end' and `match-data' access; save and restore the match\n\
fe99283d 135data if you want to preserve them.")
ca1d1d23
JB
136 (string)
137 Lisp_Object string;
138{
139 Lisp_Object val;
140 unsigned char *p1, *p2;
141 int s1, s2;
142 register int i;
143
144 CHECK_STRING (string, 0);
1113d9db 145 compile_pattern (string, &searchbuf, &search_regs,
ca1d1d23
JB
146 !NILP (current_buffer->case_fold_search) ? DOWNCASE_TABLE : 0);
147
148 immediate_quit = 1;
149 QUIT; /* Do a pending quit right away, to avoid paradoxical behavior */
150
151 /* Get pointers and sizes of the two strings
152 that make up the visible portion of the buffer. */
153
154 p1 = BEGV_ADDR;
155 s1 = GPT - BEGV;
156 p2 = GAP_END_ADDR;
157 s2 = ZV - GPT;
158 if (s1 < 0)
159 {
160 p2 = p1;
161 s2 = ZV - BEGV;
162 s1 = 0;
163 }
164 if (s2 < 0)
165 {
166 s1 = ZV - BEGV;
167 s2 = 0;
168 }
169
170 i = re_match_2 (&searchbuf, (char *) p1, s1, (char *) p2, s2,
171 point - BEGV, &search_regs,
172 ZV - BEGV);
173 if (i == -2)
174 matcher_overflow ();
175
176 val = (0 <= i ? Qt : Qnil);
4746118a 177 for (i = 0; i < search_regs.num_regs; i++)
ca1d1d23
JB
178 if (search_regs.start[i] >= 0)
179 {
180 search_regs.start[i] += BEGV;
181 search_regs.end[i] += BEGV;
182 }
daa37602 183 XSET (last_thing_searched, Lisp_Buffer, current_buffer);
ca1d1d23
JB
184 immediate_quit = 0;
185 return val;
186}
187
188DEFUN ("string-match", Fstring_match, Sstring_match, 2, 3, 0,
189 "Return index of start of first match for REGEXP in STRING, or nil.\n\
190If third arg START is non-nil, start search at that index in STRING.\n\
191For index of first char beyond the match, do (match-end 0).\n\
192`match-end' and `match-beginning' also give indices of substrings\n\
193matched by parenthesis constructs in the pattern.")
194 (regexp, string, start)
195 Lisp_Object regexp, string, start;
196{
197 int val;
198 int s;
199
200 CHECK_STRING (regexp, 0);
201 CHECK_STRING (string, 1);
202
203 if (NILP (start))
204 s = 0;
205 else
206 {
207 int len = XSTRING (string)->size;
208
209 CHECK_NUMBER (start, 2);
210 s = XINT (start);
211 if (s < 0 && -s <= len)
212 s = len - s;
213 else if (0 > s || s > len)
214 args_out_of_range (string, start);
215 }
216
1113d9db 217 compile_pattern (regexp, &searchbuf, &search_regs,
ca1d1d23
JB
218 !NILP (current_buffer->case_fold_search) ? DOWNCASE_TABLE : 0);
219 immediate_quit = 1;
220 val = re_search (&searchbuf, (char *) XSTRING (string)->data,
221 XSTRING (string)->size, s, XSTRING (string)->size - s,
222 &search_regs);
223 immediate_quit = 0;
daa37602 224 last_thing_searched = Qt;
ca1d1d23
JB
225 if (val == -2)
226 matcher_overflow ();
227 if (val < 0) return Qnil;
228 return make_number (val);
229}
e59a8453
RS
230
231/* Match REGEXP against STRING, searching all of STRING,
232 and return the index of the match, or negative on failure.
233 This does not clobber the match data. */
234
235int
236fast_string_match (regexp, string)
237 Lisp_Object regexp, string;
238{
239 int val;
240
241 compile_pattern (regexp, &searchbuf, 0, 0);
242 immediate_quit = 1;
243 val = re_search (&searchbuf, (char *) XSTRING (string)->data,
244 XSTRING (string)->size, 0, XSTRING (string)->size,
245 0);
246 immediate_quit = 0;
247 return val;
248}
ca1d1d23 249\f
ffd56f97
JB
250/* Search for COUNT instances of the character TARGET, starting at START.
251 If COUNT is negative, search backwards.
252
253 If we find COUNT instances, set *SHORTAGE to zero, and return the
5bfe95c9
RS
254 position after the COUNTth match. Note that for reverse motion
255 this is not the same as the usual convention for Emacs motion commands.
ffd56f97
JB
256
257 If we don't find COUNT instances before reaching the end of the
258 buffer (or the beginning, if scanning backwards), set *SHORTAGE to
259 the number of TARGETs left unfound, and return the end of the
260 buffer we bumped up against. */
261
262scan_buffer (target, start, count, shortage)
263 int *shortage, start;
264 register int count, target;
ca1d1d23 265{
ffd56f97
JB
266 int limit = ((count > 0) ? ZV - 1 : BEGV);
267 int direction = ((count > 0) ? 1 : -1);
268
269 register unsigned char *cursor;
ca1d1d23 270 unsigned char *base;
ffd56f97
JB
271
272 register int ceiling;
273 register unsigned char *ceiling_addr;
ca1d1d23
JB
274
275 if (shortage != 0)
276 *shortage = 0;
277
278 immediate_quit = 1;
279
ffd56f97
JB
280 if (count > 0)
281 while (start != limit + 1)
ca1d1d23 282 {
ffd56f97
JB
283 ceiling = BUFFER_CEILING_OF (start);
284 ceiling = min (limit, ceiling);
285 ceiling_addr = &FETCH_CHAR (ceiling) + 1;
286 base = (cursor = &FETCH_CHAR (start));
ca1d1d23
JB
287 while (1)
288 {
ffd56f97 289 while (*cursor != target && ++cursor != ceiling_addr)
ca1d1d23 290 ;
ffd56f97 291 if (cursor != ceiling_addr)
ca1d1d23 292 {
ffd56f97 293 if (--count == 0)
ca1d1d23
JB
294 {
295 immediate_quit = 0;
ffd56f97 296 return (start + cursor - base + 1);
ca1d1d23
JB
297 }
298 else
ffd56f97 299 if (++cursor == ceiling_addr)
ca1d1d23
JB
300 break;
301 }
302 else
303 break;
304 }
ffd56f97 305 start += cursor - base;
ca1d1d23
JB
306 }
307 else
308 {
ffd56f97
JB
309 start--; /* first character we scan */
310 while (start > limit - 1)
311 { /* we WILL scan under start */
312 ceiling = BUFFER_FLOOR_OF (start);
313 ceiling = max (limit, ceiling);
314 ceiling_addr = &FETCH_CHAR (ceiling) - 1;
315 base = (cursor = &FETCH_CHAR (start));
ca1d1d23
JB
316 cursor++;
317 while (1)
318 {
ffd56f97 319 while (--cursor != ceiling_addr && *cursor != target)
ca1d1d23 320 ;
ffd56f97 321 if (cursor != ceiling_addr)
ca1d1d23 322 {
ffd56f97 323 if (++count == 0)
ca1d1d23
JB
324 {
325 immediate_quit = 0;
ffd56f97 326 return (start + cursor - base + 1);
ca1d1d23
JB
327 }
328 }
329 else
330 break;
331 }
ffd56f97 332 start += cursor - base;
ca1d1d23
JB
333 }
334 }
335 immediate_quit = 0;
336 if (shortage != 0)
ffd56f97
JB
337 *shortage = count * direction;
338 return (start + ((direction == 1 ? 0 : 1)));
ca1d1d23
JB
339}
340
341int
342find_next_newline (from, cnt)
343 register int from, cnt;
344{
345 return (scan_buffer ('\n', from, cnt, (int *) 0));
346}
347\f
c1dc99a1
JB
348Lisp_Object skip_chars ();
349
ca1d1d23
JB
350DEFUN ("skip-chars-forward", Fskip_chars_forward, Sskip_chars_forward, 1, 2, 0,
351 "Move point forward, stopping before a char not in CHARS, or at position LIM.\n\
352CHARS is like the inside of a `[...]' in a regular expression\n\
353except that `]' is never special and `\\' quotes `^', `-' or `\\'.\n\
354Thus, with arg \"a-zA-Z\", this skips letters stopping before first nonletter.\n\
c1dc99a1
JB
355With arg \"^a-zA-Z\", skips nonletters stopping before first letter.\n\
356Returns the distance traveled, either zero or positive.")
ca1d1d23
JB
357 (string, lim)
358 Lisp_Object string, lim;
359{
17431c60 360 return skip_chars (1, 0, string, lim);
ca1d1d23
JB
361}
362
363DEFUN ("skip-chars-backward", Fskip_chars_backward, Sskip_chars_backward, 1, 2, 0,
364 "Move point backward, stopping after a char not in CHARS, or at position LIM.\n\
c1dc99a1
JB
365See `skip-chars-forward' for details.\n\
366Returns the distance traveled, either zero or negative.")
ca1d1d23
JB
367 (string, lim)
368 Lisp_Object string, lim;
369{
17431c60
RS
370 return skip_chars (0, 0, string, lim);
371}
372
373DEFUN ("skip-syntax-forward", Fskip_syntax_forward, Sskip_syntax_forward, 1, 2, 0,
374 "Move point forward across chars in specified syntax classes.\n\
375SYNTAX is a string of syntax code characters.\n\
376Stop before a char whose syntax is not in SYNTAX, or at position LIM.\n\
377If SYNTAX starts with ^, skip characters whose syntax is NOT in SYNTAX.\n\
378This function returns the distance traveled, either zero or positive.")
379 (syntax, lim)
380 Lisp_Object syntax, lim;
381{
382 return skip_chars (1, 1, syntax, lim);
383}
384
385DEFUN ("skip-syntax-backward", Fskip_syntax_backward, Sskip_syntax_backward, 1, 2, 0,
386 "Move point backward across chars in specified syntax classes.\n\
387SYNTAX is a string of syntax code characters.\n\
388Stop on reaching a char whose syntax is not in SYNTAX, or at position LIM.\n\
389If SYNTAX starts with ^, skip characters whose syntax is NOT in SYNTAX.\n\
390This function returns the distance traveled, either zero or negative.")
391 (syntax, lim)
392 Lisp_Object syntax, lim;
393{
394 return skip_chars (0, 1, syntax, lim);
ca1d1d23
JB
395}
396
c1dc99a1 397Lisp_Object
17431c60
RS
398skip_chars (forwardp, syntaxp, string, lim)
399 int forwardp, syntaxp;
ca1d1d23
JB
400 Lisp_Object string, lim;
401{
402 register unsigned char *p, *pend;
403 register unsigned char c;
404 unsigned char fastmap[0400];
405 int negate = 0;
406 register int i;
407
408 CHECK_STRING (string, 0);
409
410 if (NILP (lim))
411 XSET (lim, Lisp_Int, forwardp ? ZV : BEGV);
412 else
413 CHECK_NUMBER_COERCE_MARKER (lim, 1);
414
415#if 0 /* This breaks some things... jla. */
416 /* In any case, don't allow scan outside bounds of buffer. */
417 if (XFASTINT (lim) > ZV)
418 XFASTINT (lim) = ZV;
419 if (XFASTINT (lim) < BEGV)
420 XFASTINT (lim) = BEGV;
421#endif
422
423 p = XSTRING (string)->data;
424 pend = p + XSTRING (string)->size;
425 bzero (fastmap, sizeof fastmap);
426
427 if (p != pend && *p == '^')
428 {
429 negate = 1; p++;
430 }
431
17431c60
RS
432 /* Find the characters specified and set their elements of fastmap.
433 If syntaxp, each character counts as itself.
434 Otherwise, handle backslashes and ranges specially */
ca1d1d23
JB
435
436 while (p != pend)
437 {
438 c = *p++;
17431c60
RS
439 if (syntaxp)
440 fastmap[c] = 1;
441 else
ca1d1d23 442 {
17431c60 443 if (c == '\\')
ca1d1d23 444 {
17431c60
RS
445 if (p == pend) break;
446 c = *p++;
447 }
448 if (p != pend && *p == '-')
449 {
450 p++;
451 if (p == pend) break;
452 while (c <= *p)
453 {
454 fastmap[c] = 1;
455 c++;
456 }
457 p++;
ca1d1d23 458 }
17431c60
RS
459 else
460 fastmap[c] = 1;
ca1d1d23 461 }
ca1d1d23
JB
462 }
463
464 /* If ^ was the first character, complement the fastmap. */
465
466 if (negate)
467 for (i = 0; i < sizeof fastmap; i++)
468 fastmap[i] ^= 1;
469
c1dc99a1
JB
470 {
471 int start_point = point;
472
473 immediate_quit = 1;
17431c60 474 if (syntaxp)
c1dc99a1 475 {
17431c60
RS
476
477 if (forwardp)
478 {
479 while (point < XINT (lim)
480 && fastmap[(unsigned char) syntax_code_spec[(int) SYNTAX (FETCH_CHAR (point))]])
481 SET_PT (point + 1);
482 }
483 else
484 {
485 while (point > XINT (lim)
486 && fastmap[(unsigned char) syntax_code_spec[(int) SYNTAX (FETCH_CHAR (point - 1))]])
487 SET_PT (point - 1);
488 }
c1dc99a1
JB
489 }
490 else
491 {
17431c60
RS
492 if (forwardp)
493 {
494 while (point < XINT (lim) && fastmap[FETCH_CHAR (point)])
495 SET_PT (point + 1);
496 }
497 else
498 {
499 while (point > XINT (lim) && fastmap[FETCH_CHAR (point - 1)])
500 SET_PT (point - 1);
501 }
c1dc99a1
JB
502 }
503 immediate_quit = 0;
504
505 return make_number (point - start_point);
506 }
ca1d1d23
JB
507}
508\f
509/* Subroutines of Lisp buffer search functions. */
510
511static Lisp_Object
512search_command (string, bound, noerror, count, direction, RE)
513 Lisp_Object string, bound, noerror, count;
514 int direction;
515 int RE;
516{
517 register int np;
518 int lim;
519 int n = direction;
520
521 if (!NILP (count))
522 {
523 CHECK_NUMBER (count, 3);
524 n *= XINT (count);
525 }
526
527 CHECK_STRING (string, 0);
528 if (NILP (bound))
529 lim = n > 0 ? ZV : BEGV;
530 else
531 {
532 CHECK_NUMBER_COERCE_MARKER (bound, 1);
533 lim = XINT (bound);
534 if (n > 0 ? lim < point : lim > point)
535 error ("Invalid search bound (wrong side of point)");
536 if (lim > ZV)
537 lim = ZV;
538 if (lim < BEGV)
539 lim = BEGV;
540 }
541
542 np = search_buffer (string, point, lim, n, RE,
543 (!NILP (current_buffer->case_fold_search)
544 ? XSTRING (current_buffer->case_canon_table)->data : 0),
545 (!NILP (current_buffer->case_fold_search)
546 ? XSTRING (current_buffer->case_eqv_table)->data : 0));
547 if (np <= 0)
548 {
549 if (NILP (noerror))
550 return signal_failure (string);
551 if (!EQ (noerror, Qt))
552 {
553 if (lim < BEGV || lim > ZV)
554 abort ();
a5f217b8
RS
555 SET_PT (lim);
556 return Qnil;
557#if 0 /* This would be clean, but maybe programs depend on
558 a value of nil here. */
481399bf 559 np = lim;
a5f217b8 560#endif
ca1d1d23 561 }
481399bf
RS
562 else
563 return Qnil;
ca1d1d23
JB
564 }
565
566 if (np < BEGV || np > ZV)
567 abort ();
568
569 SET_PT (np);
570
571 return make_number (np);
572}
573\f
574/* search for the n'th occurrence of STRING in the current buffer,
575 starting at position POS and stopping at position LIM,
576 treating PAT as a literal string if RE is false or as
577 a regular expression if RE is true.
578
579 If N is positive, searching is forward and LIM must be greater than POS.
580 If N is negative, searching is backward and LIM must be less than POS.
581
582 Returns -x if only N-x occurrences found (x > 0),
583 or else the position at the beginning of the Nth occurrence
584 (if searching backward) or the end (if searching forward). */
585
586search_buffer (string, pos, lim, n, RE, trt, inverse_trt)
587 Lisp_Object string;
588 int pos;
589 int lim;
590 int n;
591 int RE;
592 register unsigned char *trt;
593 register unsigned char *inverse_trt;
594{
595 int len = XSTRING (string)->size;
596 unsigned char *base_pat = XSTRING (string)->data;
597 register int *BM_tab;
598 int *BM_tab_base;
599 register int direction = ((n > 0) ? 1 : -1);
600 register int dirlen;
601 int infinity, limit, k, stride_for_teases;
602 register unsigned char *pat, *cursor, *p_limit;
603 register int i, j;
604 unsigned char *p1, *p2;
605 int s1, s2;
606
607 /* Null string is found at starting position. */
608 if (!len)
609 return pos;
610
611 if (RE)
1113d9db 612 compile_pattern (string, &searchbuf, &search_regs, (char *) trt);
ca1d1d23
JB
613
614 if (RE /* Here we detect whether the */
615 /* generality of an RE search is */
616 /* really needed. */
617 /* first item is "exact match" */
4746118a 618 && *(searchbuf.buffer) == (char) RE_EXACTN_VALUE
ca1d1d23
JB
619 && searchbuf.buffer[1] + 2 == searchbuf.used) /*first is ONLY item */
620 {
621 RE = 0; /* can do straight (non RE) search */
622 pat = (base_pat = (unsigned char *) searchbuf.buffer + 2);
623 /* trt already applied */
624 len = searchbuf.used - 2;
625 }
626 else if (!RE)
627 {
628 pat = (unsigned char *) alloca (len);
629
630 for (i = len; i--;) /* Copy the pattern; apply trt */
631 *pat++ = (((int) trt) ? trt [*base_pat++] : *base_pat++);
632 pat -= len; base_pat = pat;
633 }
634
635 if (RE)
636 {
637 immediate_quit = 1; /* Quit immediately if user types ^G,
638 because letting this function finish
639 can take too long. */
640 QUIT; /* Do a pending quit right away,
641 to avoid paradoxical behavior */
642 /* Get pointers and sizes of the two strings
643 that make up the visible portion of the buffer. */
644
645 p1 = BEGV_ADDR;
646 s1 = GPT - BEGV;
647 p2 = GAP_END_ADDR;
648 s2 = ZV - GPT;
649 if (s1 < 0)
650 {
651 p2 = p1;
652 s2 = ZV - BEGV;
653 s1 = 0;
654 }
655 if (s2 < 0)
656 {
657 s1 = ZV - BEGV;
658 s2 = 0;
659 }
660 while (n < 0)
661 {
662 int val = re_search_2 (&searchbuf, (char *) p1, s1, (char *) p2, s2,
663 pos - BEGV, lim - pos, &search_regs,
664 /* Don't allow match past current point */
665 pos - BEGV);
666 if (val == -2)
667 matcher_overflow ();
668 if (val >= 0)
669 {
670 j = BEGV;
4746118a 671 for (i = 0; i < search_regs.num_regs; i++)
ca1d1d23
JB
672 if (search_regs.start[i] >= 0)
673 {
674 search_regs.start[i] += j;
675 search_regs.end[i] += j;
676 }
daa37602 677 XSET (last_thing_searched, Lisp_Buffer, current_buffer);
ca1d1d23
JB
678 /* Set pos to the new position. */
679 pos = search_regs.start[0];
680 }
681 else
682 {
683 immediate_quit = 0;
684 return (n);
685 }
686 n++;
687 }
688 while (n > 0)
689 {
690 int val = re_search_2 (&searchbuf, (char *) p1, s1, (char *) p2, s2,
691 pos - BEGV, lim - pos, &search_regs,
692 lim - BEGV);
693 if (val == -2)
694 matcher_overflow ();
695 if (val >= 0)
696 {
697 j = BEGV;
4746118a 698 for (i = 0; i < search_regs.num_regs; i++)
ca1d1d23
JB
699 if (search_regs.start[i] >= 0)
700 {
701 search_regs.start[i] += j;
702 search_regs.end[i] += j;
703 }
daa37602 704 XSET (last_thing_searched, Lisp_Buffer, current_buffer);
ca1d1d23
JB
705 pos = search_regs.end[0];
706 }
707 else
708 {
709 immediate_quit = 0;
710 return (0 - n);
711 }
712 n--;
713 }
714 immediate_quit = 0;
715 return (pos);
716 }
717 else /* non-RE case */
718 {
719#ifdef C_ALLOCA
720 int BM_tab_space[0400];
721 BM_tab = &BM_tab_space[0];
722#else
723 BM_tab = (int *) alloca (0400 * sizeof (int));
724#endif
725 /* The general approach is that we are going to maintain that we know */
726 /* the first (closest to the present position, in whatever direction */
727 /* we're searching) character that could possibly be the last */
728 /* (furthest from present position) character of a valid match. We */
729 /* advance the state of our knowledge by looking at that character */
730 /* and seeing whether it indeed matches the last character of the */
731 /* pattern. If it does, we take a closer look. If it does not, we */
732 /* move our pointer (to putative last characters) as far as is */
733 /* logically possible. This amount of movement, which I call a */
734 /* stride, will be the length of the pattern if the actual character */
735 /* appears nowhere in the pattern, otherwise it will be the distance */
736 /* from the last occurrence of that character to the end of the */
737 /* pattern. */
738 /* As a coding trick, an enormous stride is coded into the table for */
739 /* characters that match the last character. This allows use of only */
740 /* a single test, a test for having gone past the end of the */
741 /* permissible match region, to test for both possible matches (when */
742 /* the stride goes past the end immediately) and failure to */
743 /* match (where you get nudged past the end one stride at a time). */
744
745 /* Here we make a "mickey mouse" BM table. The stride of the search */
746 /* is determined only by the last character of the putative match. */
747 /* If that character does not match, we will stride the proper */
748 /* distance to propose a match that superimposes it on the last */
749 /* instance of a character that matches it (per trt), or misses */
750 /* it entirely if there is none. */
751
752 dirlen = len * direction;
753 infinity = dirlen - (lim + pos + len + len) * direction;
754 if (direction < 0)
755 pat = (base_pat += len - 1);
756 BM_tab_base = BM_tab;
757 BM_tab += 0400;
758 j = dirlen; /* to get it in a register */
759 /* A character that does not appear in the pattern induces a */
760 /* stride equal to the pattern length. */
761 while (BM_tab_base != BM_tab)
762 {
763 *--BM_tab = j;
764 *--BM_tab = j;
765 *--BM_tab = j;
766 *--BM_tab = j;
767 }
768 i = 0;
769 while (i != infinity)
770 {
771 j = pat[i]; i += direction;
772 if (i == dirlen) i = infinity;
773 if ((int) trt)
774 {
775 k = (j = trt[j]);
776 if (i == infinity)
777 stride_for_teases = BM_tab[j];
778 BM_tab[j] = dirlen - i;
779 /* A translation table is accompanied by its inverse -- see */
780 /* comment following downcase_table for details */
781 while ((j = inverse_trt[j]) != k)
782 BM_tab[j] = dirlen - i;
783 }
784 else
785 {
786 if (i == infinity)
787 stride_for_teases = BM_tab[j];
788 BM_tab[j] = dirlen - i;
789 }
790 /* stride_for_teases tells how much to stride if we get a */
791 /* match on the far character but are subsequently */
792 /* disappointed, by recording what the stride would have been */
793 /* for that character if the last character had been */
794 /* different. */
795 }
796 infinity = dirlen - infinity;
797 pos += dirlen - ((direction > 0) ? direction : 0);
798 /* loop invariant - pos points at where last char (first char if reverse)
799 of pattern would align in a possible match. */
800 while (n != 0)
801 {
802 if ((lim - pos - (direction > 0)) * direction < 0)
803 return (n * (0 - direction));
804 /* First we do the part we can by pointers (maybe nothing) */
805 QUIT;
806 pat = base_pat;
807 limit = pos - dirlen + direction;
808 limit = ((direction > 0)
809 ? BUFFER_CEILING_OF (limit)
810 : BUFFER_FLOOR_OF (limit));
811 /* LIMIT is now the last (not beyond-last!) value
812 POS can take on without hitting edge of buffer or the gap. */
813 limit = ((direction > 0)
814 ? min (lim - 1, min (limit, pos + 20000))
815 : max (lim, max (limit, pos - 20000)));
816 if ((limit - pos) * direction > 20)
817 {
818 p_limit = &FETCH_CHAR (limit);
819 p2 = (cursor = &FETCH_CHAR (pos));
820 /* In this loop, pos + cursor - p2 is the surrogate for pos */
821 while (1) /* use one cursor setting as long as i can */
822 {
823 if (direction > 0) /* worth duplicating */
824 {
825 /* Use signed comparison if appropriate
826 to make cursor+infinity sure to be > p_limit.
827 Assuming that the buffer lies in a range of addresses
828 that are all "positive" (as ints) or all "negative",
829 either kind of comparison will work as long
830 as we don't step by infinity. So pick the kind
831 that works when we do step by infinity. */
832 if ((int) (p_limit + infinity) > (int) p_limit)
833 while ((int) cursor <= (int) p_limit)
834 cursor += BM_tab[*cursor];
835 else
836 while ((unsigned int) cursor <= (unsigned int) p_limit)
837 cursor += BM_tab[*cursor];
838 }
839 else
840 {
841 if ((int) (p_limit + infinity) < (int) p_limit)
842 while ((int) cursor >= (int) p_limit)
843 cursor += BM_tab[*cursor];
844 else
845 while ((unsigned int) cursor >= (unsigned int) p_limit)
846 cursor += BM_tab[*cursor];
847 }
848/* If you are here, cursor is beyond the end of the searched region. */
849 /* This can happen if you match on the far character of the pattern, */
850 /* because the "stride" of that character is infinity, a number able */
851 /* to throw you well beyond the end of the search. It can also */
852 /* happen if you fail to match within the permitted region and would */
853 /* otherwise try a character beyond that region */
854 if ((cursor - p_limit) * direction <= len)
855 break; /* a small overrun is genuine */
856 cursor -= infinity; /* large overrun = hit */
857 i = dirlen - direction;
858 if ((int) trt)
859 {
860 while ((i -= direction) + direction != 0)
861 if (pat[i] != trt[*(cursor -= direction)])
862 break;
863 }
864 else
865 {
866 while ((i -= direction) + direction != 0)
867 if (pat[i] != *(cursor -= direction))
868 break;
869 }
870 cursor += dirlen - i - direction; /* fix cursor */
871 if (i + direction == 0)
872 {
873 cursor -= direction;
1113d9db
JB
874
875 /* Make sure we have registers in which to store
876 the match position. */
877 if (search_regs.num_regs == 0)
878 {
879 regoff_t *starts, *ends;
880
881 starts =
882 (regoff_t *) xmalloc (2 * sizeof (regoff_t));
883 ends =
884 (regoff_t *) xmalloc (2 * sizeof (regoff_t));
885 re_set_registers (&searchbuf,
886 &search_regs,
887 2, starts, ends);
888 }
889
ca1d1d23
JB
890 search_regs.start[0]
891 = pos + cursor - p2 + ((direction > 0)
892 ? 1 - len : 0);
893 search_regs.end[0] = len + search_regs.start[0];
daa37602 894 XSET (last_thing_searched, Lisp_Buffer, current_buffer);
ca1d1d23
JB
895 if ((n -= direction) != 0)
896 cursor += dirlen; /* to resume search */
897 else
898 return ((direction > 0)
899 ? search_regs.end[0] : search_regs.start[0]);
900 }
901 else
902 cursor += stride_for_teases; /* <sigh> we lose - */
903 }
904 pos += cursor - p2;
905 }
906 else
907 /* Now we'll pick up a clump that has to be done the hard */
908 /* way because it covers a discontinuity */
909 {
910 limit = ((direction > 0)
911 ? BUFFER_CEILING_OF (pos - dirlen + 1)
912 : BUFFER_FLOOR_OF (pos - dirlen - 1));
913 limit = ((direction > 0)
914 ? min (limit + len, lim - 1)
915 : max (limit - len, lim));
916 /* LIMIT is now the last value POS can have
917 and still be valid for a possible match. */
918 while (1)
919 {
920 /* This loop can be coded for space rather than */
921 /* speed because it will usually run only once. */
922 /* (the reach is at most len + 21, and typically */
923 /* does not exceed len) */
924 while ((limit - pos) * direction >= 0)
925 pos += BM_tab[FETCH_CHAR(pos)];
926 /* now run the same tests to distinguish going off the */
927 /* end, a match or a phoney match. */
928 if ((pos - limit) * direction <= len)
929 break; /* ran off the end */
930 /* Found what might be a match.
931 Set POS back to last (first if reverse) char pos. */
932 pos -= infinity;
933 i = dirlen - direction;
934 while ((i -= direction) + direction != 0)
935 {
936 pos -= direction;
937 if (pat[i] != (((int) trt)
938 ? trt[FETCH_CHAR(pos)]
939 : FETCH_CHAR (pos)))
940 break;
941 }
942 /* Above loop has moved POS part or all the way
943 back to the first char pos (last char pos if reverse).
944 Set it once again at the last (first if reverse) char. */
945 pos += dirlen - i- direction;
946 if (i + direction == 0)
947 {
948 pos -= direction;
1113d9db
JB
949
950 /* Make sure we have registers in which to store
951 the match position. */
952 if (search_regs.num_regs == 0)
953 {
954 regoff_t *starts, *ends;
955
956 starts =
957 (regoff_t *) xmalloc (2 * sizeof (regoff_t));
958 ends =
959 (regoff_t *) xmalloc (2 * sizeof (regoff_t));
960 re_set_registers (&searchbuf,
961 &search_regs,
962 2, starts, ends);
963 }
964
ca1d1d23
JB
965 search_regs.start[0]
966 = pos + ((direction > 0) ? 1 - len : 0);
967 search_regs.end[0] = len + search_regs.start[0];
daa37602 968 XSET (last_thing_searched, Lisp_Buffer, current_buffer);
ca1d1d23
JB
969 if ((n -= direction) != 0)
970 pos += dirlen; /* to resume search */
971 else
972 return ((direction > 0)
973 ? search_regs.end[0] : search_regs.start[0]);
974 }
975 else
976 pos += stride_for_teases;
977 }
978 }
979 /* We have done one clump. Can we continue? */
980 if ((lim - pos) * direction < 0)
981 return ((0 - n) * direction);
982 }
983 return pos;
984 }
985}
986\f
987/* Given a string of words separated by word delimiters,
988 compute a regexp that matches those exact words
989 separated by arbitrary punctuation. */
990
991static Lisp_Object
992wordify (string)
993 Lisp_Object string;
994{
995 register unsigned char *p, *o;
996 register int i, len, punct_count = 0, word_count = 0;
997 Lisp_Object val;
998
999 CHECK_STRING (string, 0);
1000 p = XSTRING (string)->data;
1001 len = XSTRING (string)->size;
1002
1003 for (i = 0; i < len; i++)
1004 if (SYNTAX (p[i]) != Sword)
1005 {
1006 punct_count++;
1007 if (i > 0 && SYNTAX (p[i-1]) == Sword) word_count++;
1008 }
1009 if (SYNTAX (p[len-1]) == Sword) word_count++;
1010 if (!word_count) return build_string ("");
1011
1012 val = make_string (p, len - punct_count + 5 * (word_count - 1) + 4);
1013
1014 o = XSTRING (val)->data;
1015 *o++ = '\\';
1016 *o++ = 'b';
1017
1018 for (i = 0; i < len; i++)
1019 if (SYNTAX (p[i]) == Sword)
1020 *o++ = p[i];
1021 else if (i > 0 && SYNTAX (p[i-1]) == Sword && --word_count)
1022 {
1023 *o++ = '\\';
1024 *o++ = 'W';
1025 *o++ = '\\';
1026 *o++ = 'W';
1027 *o++ = '*';
1028 }
1029
1030 *o++ = '\\';
1031 *o++ = 'b';
1032
1033 return val;
1034}
1035\f
1036DEFUN ("search-backward", Fsearch_backward, Ssearch_backward, 1, 4,
1037 "sSearch backward: ",
1038 "Search backward from point for STRING.\n\
1039Set point to the beginning of the occurrence found, and return point.\n\
1040An optional second argument bounds the search; it is a buffer position.\n\
1041The match found must not extend before that position.\n\
1042Optional third argument, if t, means if fail just return nil (no error).\n\
1043 If not nil and not t, position at limit of search and return nil.\n\
1044Optional fourth argument is repeat count--search for successive occurrences.\n\
1045See also the functions `match-beginning', `match-end' and `replace-match'.")
1046 (string, bound, noerror, count)
1047 Lisp_Object string, bound, noerror, count;
1048{
1049 return search_command (string, bound, noerror, count, -1, 0);
1050}
1051
1052DEFUN ("search-forward", Fsearch_forward, Ssearch_forward, 1, 4, "sSearch: ",
1053 "Search forward from point for STRING.\n\
1054Set point to the end of the occurrence found, and return point.\n\
1055An optional second argument bounds the search; it is a buffer position.\n\
1056The match found must not extend after that position. nil is equivalent\n\
1057 to (point-max).\n\
1058Optional third argument, if t, means if fail just return nil (no error).\n\
1059 If not nil and not t, move to limit of search and return nil.\n\
1060Optional fourth argument is repeat count--search for successive occurrences.\n\
1061See also the functions `match-beginning', `match-end' and `replace-match'.")
1062 (string, bound, noerror, count)
1063 Lisp_Object string, bound, noerror, count;
1064{
1065 return search_command (string, bound, noerror, count, 1, 0);
1066}
1067
1068DEFUN ("word-search-backward", Fword_search_backward, Sword_search_backward, 1, 4,
1069 "sWord search backward: ",
1070 "Search backward from point for STRING, ignoring differences in punctuation.\n\
1071Set point to the beginning of the occurrence found, and return point.\n\
1072An optional second argument bounds the search; it is a buffer position.\n\
1073The match found must not extend before that position.\n\
1074Optional third argument, if t, means if fail just return nil (no error).\n\
1075 If not nil and not t, move to limit of search and return nil.\n\
1076Optional fourth argument is repeat count--search for successive occurrences.")
1077 (string, bound, noerror, count)
1078 Lisp_Object string, bound, noerror, count;
1079{
1080 return search_command (wordify (string), bound, noerror, count, -1, 1);
1081}
1082
1083DEFUN ("word-search-forward", Fword_search_forward, Sword_search_forward, 1, 4,
1084 "sWord search: ",
1085 "Search forward from point for STRING, ignoring differences in punctuation.\n\
1086Set point to the end of the occurrence found, and return point.\n\
1087An optional second argument bounds the search; it is a buffer position.\n\
1088The match found must not extend after that position.\n\
1089Optional third argument, if t, means if fail just return nil (no error).\n\
1090 If not nil and not t, move to limit of search and return nil.\n\
1091Optional fourth argument is repeat count--search for successive occurrences.")
1092 (string, bound, noerror, count)
1093 Lisp_Object string, bound, noerror, count;
1094{
1095 return search_command (wordify (string), bound, noerror, count, 1, 1);
1096}
1097
1098DEFUN ("re-search-backward", Fre_search_backward, Sre_search_backward, 1, 4,
1099 "sRE search backward: ",
1100 "Search backward from point for match for regular expression REGEXP.\n\
1101Set point to the beginning of the match, and return point.\n\
1102The match found is the one starting last in the buffer\n\
1103and yet ending before the place the origin of the search.\n\
1104An optional second argument bounds the search; it is a buffer position.\n\
1105The match found must start at or after that position.\n\
1106Optional third argument, if t, means if fail just return nil (no error).\n\
1107 If not nil and not t, move to limit of search and return nil.\n\
1108Optional fourth argument is repeat count--search for successive occurrences.\n\
1109See also the functions `match-beginning', `match-end' and `replace-match'.")
1110 (string, bound, noerror, count)
1111 Lisp_Object string, bound, noerror, count;
1112{
1113 return search_command (string, bound, noerror, count, -1, 1);
1114}
1115
1116DEFUN ("re-search-forward", Fre_search_forward, Sre_search_forward, 1, 4,
1117 "sRE search: ",
1118 "Search forward from point for regular expression REGEXP.\n\
1119Set point to the end of the occurrence found, and return point.\n\
1120An optional second argument bounds the search; it is a buffer position.\n\
1121The match found must not extend after that position.\n\
1122Optional third argument, if t, means if fail just return nil (no error).\n\
1123 If not nil and not t, move to limit of search and return nil.\n\
1124Optional fourth argument is repeat count--search for successive occurrences.\n\
1125See also the functions `match-beginning', `match-end' and `replace-match'.")
1126 (string, bound, noerror, count)
1127 Lisp_Object string, bound, noerror, count;
1128{
1129 return search_command (string, bound, noerror, count, 1, 1);
1130}
1131\f
1132DEFUN ("replace-match", Freplace_match, Sreplace_match, 1, 3, 0,
1133 "Replace text matched by last search with NEWTEXT.\n\
1134If second arg FIXEDCASE is non-nil, do not alter case of replacement text.\n\
1135Otherwise convert to all caps or cap initials, like replaced text.\n\
1136If third arg LITERAL is non-nil, insert NEWTEXT literally.\n\
1137Otherwise treat `\\' as special:\n\
1138 `\\&' in NEWTEXT means substitute original matched text.\n\
1139 `\\N' means substitute what matched the Nth `\\(...\\)'.\n\
1140 If Nth parens didn't match, substitute nothing.\n\
1141 `\\\\' means insert one `\\'.\n\
1113d9db 1142FIXEDCASE and LITERAL are optional arguments.\n\
ca1d1d23
JB
1143Leaves point at end of replacement text.")
1144 (string, fixedcase, literal)
1145 Lisp_Object string, fixedcase, literal;
1146{
1147 enum { nochange, all_caps, cap_initial } case_action;
1148 register int pos, last;
1149 int some_multiletter_word;
1150 int some_letter = 0;
1151 register int c, prevc;
1152 int inslen;
1153
1154 CHECK_STRING (string, 0);
1155
1156 case_action = nochange; /* We tried an initialization */
1157 /* but some C compilers blew it */
4746118a
JB
1158
1159 if (search_regs.num_regs <= 0)
1160 error ("replace-match called before any match found");
1161
ca1d1d23
JB
1162 if (search_regs.start[0] < BEGV
1163 || search_regs.start[0] > search_regs.end[0]
1164 || search_regs.end[0] > ZV)
1165 args_out_of_range(make_number (search_regs.start[0]),
1166 make_number (search_regs.end[0]));
1167
1168 if (NILP (fixedcase))
1169 {
1170 /* Decide how to casify by examining the matched text. */
1171
1172 last = search_regs.end[0];
1173 prevc = '\n';
1174 case_action = all_caps;
1175
1176 /* some_multiletter_word is set nonzero if any original word
1177 is more than one letter long. */
1178 some_multiletter_word = 0;
1179
1180 for (pos = search_regs.start[0]; pos < last; pos++)
1181 {
1182 c = FETCH_CHAR (pos);
1183 if (LOWERCASEP (c))
1184 {
1185 /* Cannot be all caps if any original char is lower case */
1186
1187 case_action = cap_initial;
1188 if (SYNTAX (prevc) != Sword)
1189 {
1190 /* Cannot even be cap initials
1191 if some original initial is lower case */
1192 case_action = nochange;
1193 break;
1194 }
1195 else
1196 some_multiletter_word = 1;
1197 }
1198 else if (!NOCASEP (c))
1199 {
1200 some_letter = 1;
1201 if (!some_multiletter_word && SYNTAX (prevc) == Sword)
1202 some_multiletter_word = 1;
1203 }
1204
1205 prevc = c;
1206 }
1207
1208 /* Do not make new text all caps
1209 if the original text contained only single letter words. */
1210 if (case_action == all_caps && !some_multiletter_word)
1211 case_action = cap_initial;
1212
1213 if (!some_letter) case_action = nochange;
1214 }
1215
1216 SET_PT (search_regs.end[0]);
1217 if (!NILP (literal))
1218 Finsert (1, &string);
1219 else
1220 {
1221 struct gcpro gcpro1;
1222 GCPRO1 (string);
1223
1224 for (pos = 0; pos < XSTRING (string)->size; pos++)
1225 {
1226 c = XSTRING (string)->data[pos];
1227 if (c == '\\')
1228 {
1229 c = XSTRING (string)->data[++pos];
1230 if (c == '&')
1231 Finsert_buffer_substring (Fcurrent_buffer (),
1232 make_number (search_regs.start[0]),
1233 make_number (search_regs.end[0]));
4746118a 1234 else if (c >= '1' && c <= search_regs.num_regs + '0')
ca1d1d23
JB
1235 {
1236 if (search_regs.start[c - '0'] >= 1)
1237 Finsert_buffer_substring (Fcurrent_buffer (),
1238 make_number (search_regs.start[c - '0']),
1239 make_number (search_regs.end[c - '0']));
1240 }
1241 else
1242 insert_char (c);
1243 }
1244 else
1245 insert_char (c);
1246 }
1247 UNGCPRO;
1248 }
1249
1250 inslen = point - (search_regs.end[0]);
1251 del_range (search_regs.start[0], search_regs.end[0]);
1252
1253 if (case_action == all_caps)
1254 Fupcase_region (make_number (point - inslen), make_number (point));
1255 else if (case_action == cap_initial)
1256 upcase_initials_region (make_number (point - inslen), make_number (point));
1257 return Qnil;
1258}
1259\f
1260static Lisp_Object
1261match_limit (num, beginningp)
1262 Lisp_Object num;
1263 int beginningp;
1264{
1265 register int n;
1266
1267 CHECK_NUMBER (num, 0);
1268 n = XINT (num);
4746118a
JB
1269 if (n < 0 || n >= search_regs.num_regs)
1270 args_out_of_range (num, make_number (search_regs.num_regs));
1271 if (search_regs.num_regs <= 0
1272 || search_regs.start[n] < 0)
ca1d1d23
JB
1273 return Qnil;
1274 return (make_number ((beginningp) ? search_regs.start[n]
1275 : search_regs.end[n]));
1276}
1277
1278DEFUN ("match-beginning", Fmatch_beginning, Smatch_beginning, 1, 1, 0,
1279 "Return position of start of text matched by last search.\n\
1280ARG, a number, specifies which parenthesized expression in the last regexp.\n\
1281 Value is nil if ARGth pair didn't match, or there were less than ARG pairs.\n\
1282Zero means the entire text matched by the whole regexp or whole string.")
1283 (num)
1284 Lisp_Object num;
1285{
1286 return match_limit (num, 1);
1287}
1288
1289DEFUN ("match-end", Fmatch_end, Smatch_end, 1, 1, 0,
1290 "Return position of end of text matched by last search.\n\
1291ARG, a number, specifies which parenthesized expression in the last regexp.\n\
1292 Value is nil if ARGth pair didn't match, or there were less than ARG pairs.\n\
1293Zero means the entire text matched by the whole regexp or whole string.")
1294 (num)
1295 Lisp_Object num;
1296{
1297 return match_limit (num, 0);
1298}
1299
1300DEFUN ("match-data", Fmatch_data, Smatch_data, 0, 0, 0,
1301 "Return a list containing all info on what the last search matched.\n\
1302Element 2N is `(match-beginning N)'; element 2N + 1 is `(match-end N)'.\n\
1303All the elements are markers or nil (nil if the Nth pair didn't match)\n\
1304if the last match was on a buffer; integers or nil if a string was matched.\n\
1305Use `store-match-data' to reinstate the data in this list.")
1306 ()
1307{
4746118a 1308 Lisp_Object *data;
ca1d1d23
JB
1309 int i, len;
1310
daa37602
JB
1311 if (NILP (last_thing_searched))
1312 error ("match-data called before any match found");
1313
4746118a
JB
1314 data = (Lisp_Object *) alloca ((2 * search_regs.num_regs)
1315 * sizeof (Lisp_Object));
1316
ca1d1d23 1317 len = -1;
4746118a 1318 for (i = 0; i < search_regs.num_regs; i++)
ca1d1d23
JB
1319 {
1320 int start = search_regs.start[i];
1321 if (start >= 0)
1322 {
daa37602 1323 if (EQ (last_thing_searched, Qt))
ca1d1d23
JB
1324 {
1325 XFASTINT (data[2 * i]) = start;
1326 XFASTINT (data[2 * i + 1]) = search_regs.end[i];
1327 }
daa37602 1328 else if (XTYPE (last_thing_searched) == Lisp_Buffer)
ca1d1d23
JB
1329 {
1330 data[2 * i] = Fmake_marker ();
daa37602
JB
1331 Fset_marker (data[2 * i],
1332 make_number (start),
1333 last_thing_searched);
ca1d1d23
JB
1334 data[2 * i + 1] = Fmake_marker ();
1335 Fset_marker (data[2 * i + 1],
daa37602
JB
1336 make_number (search_regs.end[i]),
1337 last_thing_searched);
ca1d1d23 1338 }
daa37602
JB
1339 else
1340 /* last_thing_searched must always be Qt, a buffer, or Qnil. */
1341 abort ();
1342
ca1d1d23
JB
1343 len = i;
1344 }
1345 else
1346 data[2 * i] = data [2 * i + 1] = Qnil;
1347 }
1348 return Flist (2 * len + 2, data);
1349}
1350
1351
1352DEFUN ("store-match-data", Fstore_match_data, Sstore_match_data, 1, 1, 0,
1353 "Set internal data on last search match from elements of LIST.\n\
1354LIST should have been created by calling `match-data' previously.")
1355 (list)
1356 register Lisp_Object list;
1357{
1358 register int i;
1359 register Lisp_Object marker;
1360
1361 if (!CONSP (list) && !NILP (list))
1362 list = wrong_type_argument (Qconsp, list, 0);
1363
daa37602
JB
1364 /* Unless we find a marker with a buffer in LIST, assume that this
1365 match data came from a string. */
1366 last_thing_searched = Qt;
1367
4746118a
JB
1368 /* Allocate registers if they don't already exist. */
1369 {
d084e942 1370 int length = XFASTINT (Flength (list)) / 2;
4746118a
JB
1371
1372 if (length > search_regs.num_regs)
1373 {
1113d9db
JB
1374 if (search_regs.num_regs == 0)
1375 {
1376 search_regs.start
1377 = (regoff_t *) xmalloc (length * sizeof (regoff_t));
1378 search_regs.end
1379 = (regoff_t *) xmalloc (length * sizeof (regoff_t));
1380 }
4746118a 1381 else
1113d9db
JB
1382 {
1383 search_regs.start
1384 = (regoff_t *) xrealloc (search_regs.start,
1385 length * sizeof (regoff_t));
1386 search_regs.end
1387 = (regoff_t *) xrealloc (search_regs.end,
1388 length * sizeof (regoff_t));
1389 }
4746118a 1390
1113d9db
JB
1391 re_set_registers (&searchbuf, &search_regs, length,
1392 search_regs.start, search_regs.end);
4746118a
JB
1393 }
1394 }
1395
1396 for (i = 0; i < search_regs.num_regs; i++)
ca1d1d23
JB
1397 {
1398 marker = Fcar (list);
1399 if (NILP (marker))
1400 {
1401 search_regs.start[i] = -1;
1402 list = Fcdr (list);
1403 }
1404 else
1405 {
daa37602
JB
1406 if (XTYPE (marker) == Lisp_Marker)
1407 {
1408 if (XMARKER (marker)->buffer == 0)
1409 XFASTINT (marker) = 0;
1410 else
1411 XSET (last_thing_searched, Lisp_Buffer,
1412 XMARKER (marker)->buffer);
1413 }
ca1d1d23
JB
1414
1415 CHECK_NUMBER_COERCE_MARKER (marker, 0);
1416 search_regs.start[i] = XINT (marker);
1417 list = Fcdr (list);
1418
1419 marker = Fcar (list);
1420 if (XTYPE (marker) == Lisp_Marker
1421 && XMARKER (marker)->buffer == 0)
1422 XFASTINT (marker) = 0;
1423
1424 CHECK_NUMBER_COERCE_MARKER (marker, 0);
1425 search_regs.end[i] = XINT (marker);
1426 }
1427 list = Fcdr (list);
1428 }
1429
1430 return Qnil;
1431}
1432
1433/* Quote a string to inactivate reg-expr chars */
1434
1435DEFUN ("regexp-quote", Fregexp_quote, Sregexp_quote, 1, 1, 0,
1436 "Return a regexp string which matches exactly STRING and nothing else.")
1437 (str)
1438 Lisp_Object str;
1439{
1440 register unsigned char *in, *out, *end;
1441 register unsigned char *temp;
1442
1443 CHECK_STRING (str, 0);
1444
1445 temp = (unsigned char *) alloca (XSTRING (str)->size * 2);
1446
1447 /* Now copy the data into the new string, inserting escapes. */
1448
1449 in = XSTRING (str)->data;
1450 end = in + XSTRING (str)->size;
1451 out = temp;
1452
1453 for (; in != end; in++)
1454 {
1455 if (*in == '[' || *in == ']'
1456 || *in == '*' || *in == '.' || *in == '\\'
1457 || *in == '?' || *in == '+'
1458 || *in == '^' || *in == '$')
1459 *out++ = '\\';
1460 *out++ = *in;
1461 }
1462
1463 return make_string (temp, out - temp);
1464}
1465\f
1466syms_of_search ()
1467{
1468 register int i;
1469
1470 searchbuf.allocated = 100;
8c0e7b73 1471 searchbuf.buffer = (unsigned char *) malloc (searchbuf.allocated);
ca1d1d23
JB
1472 searchbuf.fastmap = search_fastmap;
1473
1474 Qsearch_failed = intern ("search-failed");
1475 staticpro (&Qsearch_failed);
1476 Qinvalid_regexp = intern ("invalid-regexp");
1477 staticpro (&Qinvalid_regexp);
1478
1479 Fput (Qsearch_failed, Qerror_conditions,
1480 Fcons (Qsearch_failed, Fcons (Qerror, Qnil)));
1481 Fput (Qsearch_failed, Qerror_message,
1482 build_string ("Search failed"));
1483
1484 Fput (Qinvalid_regexp, Qerror_conditions,
1485 Fcons (Qinvalid_regexp, Fcons (Qerror, Qnil)));
1486 Fput (Qinvalid_regexp, Qerror_message,
1487 build_string ("Invalid regexp"));
1488
1489 last_regexp = Qnil;
1490 staticpro (&last_regexp);
1491
daa37602
JB
1492 last_thing_searched = Qnil;
1493 staticpro (&last_thing_searched);
1494
ca1d1d23
JB
1495 defsubr (&Sstring_match);
1496 defsubr (&Slooking_at);
1497 defsubr (&Sskip_chars_forward);
1498 defsubr (&Sskip_chars_backward);
17431c60
RS
1499 defsubr (&Sskip_syntax_forward);
1500 defsubr (&Sskip_syntax_backward);
ca1d1d23
JB
1501 defsubr (&Ssearch_forward);
1502 defsubr (&Ssearch_backward);
1503 defsubr (&Sword_search_forward);
1504 defsubr (&Sword_search_backward);
1505 defsubr (&Sre_search_forward);
1506 defsubr (&Sre_search_backward);
1507 defsubr (&Sreplace_match);
1508 defsubr (&Smatch_beginning);
1509 defsubr (&Smatch_end);
1510 defsubr (&Smatch_data);
1511 defsubr (&Sstore_match_data);
1512 defsubr (&Sregexp_quote);
1513}