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