Removed author and Adapted-By lines. They're wrong, and they're not
[emacs.git] / src / search.c
blob03ed61fcd0d8076bef98893cdd4e4cd0156bfafd
1 /* String search routines for GNU Emacs.
2 Copyright (C) 1985, 1986, 1987, 1992 Free Software Foundation, Inc.
4 This file is part of GNU Emacs.
6 GNU Emacs is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 1, or (at your option)
9 any later version.
11 GNU Emacs is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Emacs; see the file COPYING. If not, write to
18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
21 #include "config.h"
22 #include "lisp.h"
23 #include "syntax.h"
24 #include "buffer.h"
25 #include "commands.h"
27 #include <sys/types.h>
28 #include "regex.h"
30 #define max(a, b) ((a) > (b) ? (a) : (b))
31 #define min(a, b) ((a) < (b) ? (a) : (b))
33 /* We compile regexps into this buffer and then use it for searching. */
35 struct re_pattern_buffer searchbuf;
37 char search_fastmap[0400];
39 /* Last regexp we compiled */
41 Lisp_Object last_regexp;
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).
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
50 been allocated by checking search_regs.num_regs.
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. */
60 static struct re_registers search_regs;
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. */
65 static Lisp_Object last_thing_searched;
67 /* error condition signalled when regexp compile_pattern fails */
69 Lisp_Object Qinvalid_regexp;
71 static void
72 matcher_overflow ()
74 error ("Stack overflow in regexp matcher");
77 #ifdef __STDC__
78 #define CONST const
79 #else
80 #define CONST
81 #endif
83 /* Compile a regexp and signal a Lisp error if anything goes wrong. */
85 compile_pattern (pattern, bufp, regp, translate)
86 Lisp_Object pattern;
87 struct re_pattern_buffer *bufp;
88 struct re_registers *regp;
89 char *translate;
91 CONST char *val;
92 Lisp_Object dummy;
94 if (EQ (pattern, last_regexp)
95 && translate == bufp->translate)
96 return;
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)
105 dummy = build_string (val);
106 while (1)
107 Fsignal (Qinvalid_regexp, Fcons (dummy, Qnil));
110 last_regexp = pattern;
112 /* Advise the searching functions about the space we have allocated
113 for register data. */
114 if (regp)
115 re_set_registers (bufp, regp, regp->num_regs, regp->start, regp->end);
117 return;
120 /* Error condition used for failing searches */
121 Lisp_Object Qsearch_failed;
123 Lisp_Object
124 signal_failure (arg)
125 Lisp_Object arg;
127 Fsignal (Qsearch_failed, Fcons (arg, Qnil));
128 return Qnil;
131 DEFUN ("looking-at", Flooking_at, Slooking_at, 1, 1, 0,
132 "Return t if text after point matches regular expression PAT.\n\
133 This function modifies the match data that `match-beginning',\n\
134 `match-end' and `match-data' access; save and restore the match\n\
135 data if you want to preserve them.")
136 (string)
137 Lisp_Object string;
139 Lisp_Object val;
140 unsigned char *p1, *p2;
141 int s1, s2;
142 register int i;
144 CHECK_STRING (string, 0);
145 compile_pattern (string, &searchbuf, &search_regs,
146 !NILP (current_buffer->case_fold_search) ? DOWNCASE_TABLE : 0);
148 immediate_quit = 1;
149 QUIT; /* Do a pending quit right away, to avoid paradoxical behavior */
151 /* Get pointers and sizes of the two strings
152 that make up the visible portion of the buffer. */
154 p1 = BEGV_ADDR;
155 s1 = GPT - BEGV;
156 p2 = GAP_END_ADDR;
157 s2 = ZV - GPT;
158 if (s1 < 0)
160 p2 = p1;
161 s2 = ZV - BEGV;
162 s1 = 0;
164 if (s2 < 0)
166 s1 = ZV - BEGV;
167 s2 = 0;
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 ();
176 val = (0 <= i ? Qt : Qnil);
177 for (i = 0; i < search_regs.num_regs; i++)
178 if (search_regs.start[i] >= 0)
180 search_regs.start[i] += BEGV;
181 search_regs.end[i] += BEGV;
183 XSET (last_thing_searched, Lisp_Buffer, current_buffer);
184 immediate_quit = 0;
185 return val;
188 DEFUN ("string-match", Fstring_match, Sstring_match, 2, 3, 0,
189 "Return index of start of first match for REGEXP in STRING, or nil.\n\
190 If third arg START is non-nil, start search at that index in STRING.\n\
191 For index of first char beyond the match, do (match-end 0).\n\
192 `match-end' and `match-beginning' also give indices of substrings\n\
193 matched by parenthesis constructs in the pattern.")
194 (regexp, string, start)
195 Lisp_Object regexp, string, start;
197 int val;
198 int s;
200 CHECK_STRING (regexp, 0);
201 CHECK_STRING (string, 1);
203 if (NILP (start))
204 s = 0;
205 else
207 int len = XSTRING (string)->size;
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);
217 compile_pattern (regexp, &searchbuf, &search_regs,
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;
224 last_thing_searched = Qt;
225 if (val == -2)
226 matcher_overflow ();
227 if (val < 0) return Qnil;
228 return make_number (val);
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. */
236 fast_string_match (regexp, string)
237 Lisp_Object regexp, string;
239 int val;
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,
246 immediate_quit = 0;
247 return val;
250 /* Search for COUNT instances of the character TARGET, starting at START.
251 If COUNT is negative, search backwards.
253 If we find COUNT instances, set *SHORTAGE to zero, and return the
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.
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. */
262 scan_buffer (target, start, count, shortage)
263 int *shortage, start;
264 register int count, target;
266 int limit = ((count > 0) ? ZV - 1 : BEGV);
267 int direction = ((count > 0) ? 1 : -1);
269 register unsigned char *cursor;
270 unsigned char *base;
272 register int ceiling;
273 register unsigned char *ceiling_addr;
275 if (shortage != 0)
276 *shortage = 0;
278 immediate_quit = 1;
280 if (count > 0)
281 while (start != limit + 1)
283 ceiling = BUFFER_CEILING_OF (start);
284 ceiling = min (limit, ceiling);
285 ceiling_addr = &FETCH_CHAR (ceiling) + 1;
286 base = (cursor = &FETCH_CHAR (start));
287 while (1)
289 while (*cursor != target && ++cursor != ceiling_addr)
291 if (cursor != ceiling_addr)
293 if (--count == 0)
295 immediate_quit = 0;
296 return (start + cursor - base + 1);
298 else
299 if (++cursor == ceiling_addr)
300 break;
302 else
303 break;
305 start += cursor - base;
307 else
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));
316 cursor++;
317 while (1)
319 while (--cursor != ceiling_addr && *cursor != target)
321 if (cursor != ceiling_addr)
323 if (++count == 0)
325 immediate_quit = 0;
326 return (start + cursor - base + 1);
329 else
330 break;
332 start += cursor - base;
335 immediate_quit = 0;
336 if (shortage != 0)
337 *shortage = count * direction;
338 return (start + ((direction == 1 ? 0 : 1)));
342 find_next_newline (from, cnt)
343 register int from, cnt;
345 return (scan_buffer ('\n', from, cnt, (int *) 0));
348 Lisp_Object skip_chars ();
350 DEFUN ("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\
352 CHARS is like the inside of a `[...]' in a regular expression\n\
353 except that `]' is never special and `\\' quotes `^', `-' or `\\'.\n\
354 Thus, with arg \"a-zA-Z\", this skips letters stopping before first nonletter.\n\
355 With arg \"^a-zA-Z\", skips nonletters stopping before first letter.\n\
356 Returns the distance traveled, either zero or positive.")
357 (string, lim)
358 Lisp_Object string, lim;
360 return skip_chars (1, 0, string, lim);
363 DEFUN ("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\
365 See `skip-chars-forward' for details.\n\
366 Returns the distance traveled, either zero or negative.")
367 (string, lim)
368 Lisp_Object string, lim;
370 return skip_chars (0, 0, string, lim);
373 DEFUN ("skip-syntax-forward", Fskip_syntax_forward, Sskip_syntax_forward, 1, 2, 0,
374 "Move point forward across chars in specified syntax classes.\n\
375 SYNTAX is a string of syntax code characters.\n\
376 Stop before a char whose syntax is not in SYNTAX, or at position LIM.\n\
377 If SYNTAX starts with ^, skip characters whose syntax is NOT in SYNTAX.\n\
378 This function returns the distance traveled, either zero or positive.")
379 (syntax, lim)
380 Lisp_Object syntax, lim;
382 return skip_chars (1, 1, syntax, lim);
385 DEFUN ("skip-syntax-backward", Fskip_syntax_backward, Sskip_syntax_backward, 1, 2, 0,
386 "Move point backward across chars in specified syntax classes.\n\
387 SYNTAX is a string of syntax code characters.\n\
388 Stop on reaching a char whose syntax is not in SYNTAX, or at position LIM.\n\
389 If SYNTAX starts with ^, skip characters whose syntax is NOT in SYNTAX.\n\
390 This function returns the distance traveled, either zero or negative.")
391 (syntax, lim)
392 Lisp_Object syntax, lim;
394 return skip_chars (0, 1, syntax, lim);
397 Lisp_Object
398 skip_chars (forwardp, syntaxp, string, lim)
399 int forwardp, syntaxp;
400 Lisp_Object string, lim;
402 register unsigned char *p, *pend;
403 register unsigned char c;
404 unsigned char fastmap[0400];
405 int negate = 0;
406 register int i;
408 CHECK_STRING (string, 0);
410 if (NILP (lim))
411 XSET (lim, Lisp_Int, forwardp ? ZV : BEGV);
412 else
413 CHECK_NUMBER_COERCE_MARKER (lim, 1);
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
423 p = XSTRING (string)->data;
424 pend = p + XSTRING (string)->size;
425 bzero (fastmap, sizeof fastmap);
427 if (p != pend && *p == '^')
429 negate = 1; p++;
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 */
436 while (p != pend)
438 c = *p++;
439 if (syntaxp)
440 fastmap[c] = 1;
441 else
443 if (c == '\\')
445 if (p == pend) break;
446 c = *p++;
448 if (p != pend && *p == '-')
450 p++;
451 if (p == pend) break;
452 while (c <= *p)
454 fastmap[c] = 1;
455 c++;
457 p++;
459 else
460 fastmap[c] = 1;
464 /* If ^ was the first character, complement the fastmap. */
466 if (negate)
467 for (i = 0; i < sizeof fastmap; i++)
468 fastmap[i] ^= 1;
471 int start_point = point;
473 immediate_quit = 1;
474 if (syntaxp)
477 if (forwardp)
479 while (point < XINT (lim)
480 && fastmap[(unsigned char) syntax_code_spec[(int) SYNTAX (FETCH_CHAR (point))]])
481 SET_PT (point + 1);
483 else
485 while (point > XINT (lim)
486 && fastmap[(unsigned char) syntax_code_spec[(int) SYNTAX (FETCH_CHAR (point - 1))]])
487 SET_PT (point - 1);
490 else
492 if (forwardp)
494 while (point < XINT (lim) && fastmap[FETCH_CHAR (point)])
495 SET_PT (point + 1);
497 else
499 while (point > XINT (lim) && fastmap[FETCH_CHAR (point - 1)])
500 SET_PT (point - 1);
503 immediate_quit = 0;
505 return make_number (point - start_point);
509 /* Subroutines of Lisp buffer search functions. */
511 static Lisp_Object
512 search_command (string, bound, noerror, count, direction, RE)
513 Lisp_Object string, bound, noerror, count;
514 int direction;
515 int RE;
517 register int np;
518 int lim;
519 int n = direction;
521 if (!NILP (count))
523 CHECK_NUMBER (count, 3);
524 n *= XINT (count);
527 CHECK_STRING (string, 0);
528 if (NILP (bound))
529 lim = n > 0 ? ZV : BEGV;
530 else
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;
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)
549 if (NILP (noerror))
550 return signal_failure (string);
551 if (!EQ (noerror, Qt))
553 if (lim < BEGV || lim > ZV)
554 abort ();
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. */
559 np = lim;
560 #endif
562 else
563 return Qnil;
566 if (np < BEGV || np > ZV)
567 abort ();
569 SET_PT (np);
571 return make_number (np);
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.
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.
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). */
586 search_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;
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;
607 /* Null string is found at starting position. */
608 if (!len)
609 return pos;
611 if (RE)
612 compile_pattern (string, &searchbuf, &search_regs, (char *) trt);
614 if (RE /* Here we detect whether the */
615 /* generality of an RE search is */
616 /* really needed. */
617 /* first item is "exact match" */
618 && *(searchbuf.buffer) == (char) RE_EXACTN_VALUE
619 && searchbuf.buffer[1] + 2 == searchbuf.used) /*first is ONLY item */
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;
626 else if (!RE)
628 pat = (unsigned char *) alloca (len);
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;
635 if (RE)
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. */
645 p1 = BEGV_ADDR;
646 s1 = GPT - BEGV;
647 p2 = GAP_END_ADDR;
648 s2 = ZV - GPT;
649 if (s1 < 0)
651 p2 = p1;
652 s2 = ZV - BEGV;
653 s1 = 0;
655 if (s2 < 0)
657 s1 = ZV - BEGV;
658 s2 = 0;
660 while (n < 0)
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)
670 j = BEGV;
671 for (i = 0; i < search_regs.num_regs; i++)
672 if (search_regs.start[i] >= 0)
674 search_regs.start[i] += j;
675 search_regs.end[i] += j;
677 XSET (last_thing_searched, Lisp_Buffer, current_buffer);
678 /* Set pos to the new position. */
679 pos = search_regs.start[0];
681 else
683 immediate_quit = 0;
684 return (n);
686 n++;
688 while (n > 0)
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)
697 j = BEGV;
698 for (i = 0; i < search_regs.num_regs; i++)
699 if (search_regs.start[i] >= 0)
701 search_regs.start[i] += j;
702 search_regs.end[i] += j;
704 XSET (last_thing_searched, Lisp_Buffer, current_buffer);
705 pos = search_regs.end[0];
707 else
709 immediate_quit = 0;
710 return (0 - n);
712 n--;
714 immediate_quit = 0;
715 return (pos);
717 else /* non-RE case */
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). */
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. */
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)
763 *--BM_tab = j;
764 *--BM_tab = j;
765 *--BM_tab = j;
766 *--BM_tab = j;
768 i = 0;
769 while (i != infinity)
771 j = pat[i]; i += direction;
772 if (i == dirlen) i = infinity;
773 if ((int) trt)
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;
784 else
786 if (i == infinity)
787 stride_for_teases = BM_tab[j];
788 BM_tab[j] = dirlen - i;
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. */
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)
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)
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 */
823 if (direction > 0) /* worth duplicating */
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];
839 else
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];
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)
860 while ((i -= direction) + direction != 0)
861 if (pat[i] != trt[*(cursor -= direction)])
862 break;
864 else
866 while ((i -= direction) + direction != 0)
867 if (pat[i] != *(cursor -= direction))
868 break;
870 cursor += dirlen - i - direction; /* fix cursor */
871 if (i + direction == 0)
873 cursor -= direction;
875 /* Make sure we have registers in which to store
876 the match position. */
877 if (search_regs.num_regs == 0)
879 regoff_t *starts, *ends;
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);
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];
894 XSET (last_thing_searched, Lisp_Buffer, current_buffer);
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]);
901 else
902 cursor += stride_for_teases; /* <sigh> we lose - */
904 pos += cursor - p2;
906 else
907 /* Now we'll pick up a clump that has to be done the hard */
908 /* way because it covers a discontinuity */
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)
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)
936 pos -= direction;
937 if (pat[i] != (((int) trt)
938 ? trt[FETCH_CHAR(pos)]
939 : FETCH_CHAR (pos)))
940 break;
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)
948 pos -= direction;
950 /* Make sure we have registers in which to store
951 the match position. */
952 if (search_regs.num_regs == 0)
954 regoff_t *starts, *ends;
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);
965 search_regs.start[0]
966 = pos + ((direction > 0) ? 1 - len : 0);
967 search_regs.end[0] = len + search_regs.start[0];
968 XSET (last_thing_searched, Lisp_Buffer, current_buffer);
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]);
975 else
976 pos += stride_for_teases;
979 /* We have done one clump. Can we continue? */
980 if ((lim - pos) * direction < 0)
981 return ((0 - n) * direction);
983 return pos;
987 /* Given a string of words separated by word delimiters,
988 compute a regexp that matches those exact words
989 separated by arbitrary punctuation. */
991 static Lisp_Object
992 wordify (string)
993 Lisp_Object string;
995 register unsigned char *p, *o;
996 register int i, len, punct_count = 0, word_count = 0;
997 Lisp_Object val;
999 CHECK_STRING (string, 0);
1000 p = XSTRING (string)->data;
1001 len = XSTRING (string)->size;
1003 for (i = 0; i < len; i++)
1004 if (SYNTAX (p[i]) != Sword)
1006 punct_count++;
1007 if (i > 0 && SYNTAX (p[i-1]) == Sword) word_count++;
1009 if (SYNTAX (p[len-1]) == Sword) word_count++;
1010 if (!word_count) return build_string ("");
1012 val = make_string (p, len - punct_count + 5 * (word_count - 1) + 4);
1014 o = XSTRING (val)->data;
1015 *o++ = '\\';
1016 *o++ = 'b';
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)
1023 *o++ = '\\';
1024 *o++ = 'W';
1025 *o++ = '\\';
1026 *o++ = 'W';
1027 *o++ = '*';
1030 *o++ = '\\';
1031 *o++ = 'b';
1033 return val;
1036 DEFUN ("search-backward", Fsearch_backward, Ssearch_backward, 1, 4,
1037 "sSearch backward: ",
1038 "Search backward from point for STRING.\n\
1039 Set point to the beginning of the occurrence found, and return point.\n\
1040 An optional second argument bounds the search; it is a buffer position.\n\
1041 The match found must not extend before that position.\n\
1042 Optional 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\
1044 Optional fourth argument is repeat count--search for successive occurrences.\n\
1045 See also the functions `match-beginning', `match-end' and `replace-match'.")
1046 (string, bound, noerror, count)
1047 Lisp_Object string, bound, noerror, count;
1049 return search_command (string, bound, noerror, count, -1, 0);
1052 DEFUN ("search-forward", Fsearch_forward, Ssearch_forward, 1, 4, "sSearch: ",
1053 "Search forward from point for STRING.\n\
1054 Set point to the end of the occurrence found, and return point.\n\
1055 An optional second argument bounds the search; it is a buffer position.\n\
1056 The match found must not extend after that position. nil is equivalent\n\
1057 to (point-max).\n\
1058 Optional 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\
1060 Optional fourth argument is repeat count--search for successive occurrences.\n\
1061 See also the functions `match-beginning', `match-end' and `replace-match'.")
1062 (string, bound, noerror, count)
1063 Lisp_Object string, bound, noerror, count;
1065 return search_command (string, bound, noerror, count, 1, 0);
1068 DEFUN ("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\
1071 Set point to the beginning of the occurrence found, and return point.\n\
1072 An optional second argument bounds the search; it is a buffer position.\n\
1073 The match found must not extend before that position.\n\
1074 Optional 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\
1076 Optional fourth argument is repeat count--search for successive occurrences.")
1077 (string, bound, noerror, count)
1078 Lisp_Object string, bound, noerror, count;
1080 return search_command (wordify (string), bound, noerror, count, -1, 1);
1083 DEFUN ("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\
1086 Set point to the end of the occurrence found, and return point.\n\
1087 An optional second argument bounds the search; it is a buffer position.\n\
1088 The match found must not extend after that position.\n\
1089 Optional 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\
1091 Optional fourth argument is repeat count--search for successive occurrences.")
1092 (string, bound, noerror, count)
1093 Lisp_Object string, bound, noerror, count;
1095 return search_command (wordify (string), bound, noerror, count, 1, 1);
1098 DEFUN ("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\
1101 Set point to the beginning of the match, and return point.\n\
1102 The match found is the one starting last in the buffer\n\
1103 and yet ending before the place the origin of the search.\n\
1104 An optional second argument bounds the search; it is a buffer position.\n\
1105 The match found must start at or after that position.\n\
1106 Optional 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\
1108 Optional fourth argument is repeat count--search for successive occurrences.\n\
1109 See also the functions `match-beginning', `match-end' and `replace-match'.")
1110 (string, bound, noerror, count)
1111 Lisp_Object string, bound, noerror, count;
1113 return search_command (string, bound, noerror, count, -1, 1);
1116 DEFUN ("re-search-forward", Fre_search_forward, Sre_search_forward, 1, 4,
1117 "sRE search: ",
1118 "Search forward from point for regular expression REGEXP.\n\
1119 Set point to the end of the occurrence found, and return point.\n\
1120 An optional second argument bounds the search; it is a buffer position.\n\
1121 The match found must not extend after that position.\n\
1122 Optional 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\
1124 Optional fourth argument is repeat count--search for successive occurrences.\n\
1125 See also the functions `match-beginning', `match-end' and `replace-match'.")
1126 (string, bound, noerror, count)
1127 Lisp_Object string, bound, noerror, count;
1129 return search_command (string, bound, noerror, count, 1, 1);
1132 DEFUN ("replace-match", Freplace_match, Sreplace_match, 1, 3, 0,
1133 "Replace text matched by last search with NEWTEXT.\n\
1134 If second arg FIXEDCASE is non-nil, do not alter case of replacement text.\n\
1135 Otherwise convert to all caps or cap initials, like replaced text.\n\
1136 If third arg LITERAL is non-nil, insert NEWTEXT literally.\n\
1137 Otherwise 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\
1142 FIXEDCASE and LITERAL are optional arguments.\n\
1143 Leaves point at end of replacement text.")
1144 (string, fixedcase, literal)
1145 Lisp_Object string, fixedcase, literal;
1147 enum { nochange, all_caps, cap_initial } case_action;
1148 register int pos, last;
1149 int some_multiletter_word;
1150 int some_lowercase;
1151 int some_uppercase_initial;
1152 register int c, prevc;
1153 int inslen;
1155 CHECK_STRING (string, 0);
1157 case_action = nochange; /* We tried an initialization */
1158 /* but some C compilers blew it */
1160 if (search_regs.num_regs <= 0)
1161 error ("replace-match called before any match found");
1163 if (search_regs.start[0] < BEGV
1164 || search_regs.start[0] > search_regs.end[0]
1165 || search_regs.end[0] > ZV)
1166 args_out_of_range (make_number (search_regs.start[0]),
1167 make_number (search_regs.end[0]));
1169 if (NILP (fixedcase))
1171 /* Decide how to casify by examining the matched text. */
1173 last = search_regs.end[0];
1174 prevc = '\n';
1175 case_action = all_caps;
1177 /* some_multiletter_word is set nonzero if any original word
1178 is more than one letter long. */
1179 some_multiletter_word = 0;
1180 some_lowercase = 0;
1181 some_uppercase_initial = 0;
1183 for (pos = search_regs.start[0]; pos < last; pos++)
1185 c = FETCH_CHAR (pos);
1186 if (LOWERCASEP (c))
1188 /* Cannot be all caps if any original char is lower case */
1190 some_lowercase = 1;
1191 if (SYNTAX (prevc) != Sword)
1193 else
1194 some_multiletter_word = 1;
1196 else if (!NOCASEP (c))
1198 if (SYNTAX (prevc) != Sword)
1199 some_uppercase_initial = 1;
1200 else
1201 some_multiletter_word = 1;
1204 prevc = c;
1207 /* Convert to all caps if the old text is all caps
1208 and has at least one multiletter word. */
1209 if (! some_lowercase && some_multiletter_word)
1210 case_action = all_caps;
1211 /* Capitalize each word, if the old text has a capitalized word. */
1212 else if (some_uppercase_initial)
1213 case_action = cap_initial;
1214 else
1215 case_action = nochange;
1218 SET_PT (search_regs.end[0]);
1219 if (!NILP (literal))
1220 Finsert (1, &string);
1221 else
1223 struct gcpro gcpro1;
1224 GCPRO1 (string);
1226 for (pos = 0; pos < XSTRING (string)->size; pos++)
1228 c = XSTRING (string)->data[pos];
1229 if (c == '\\')
1231 c = XSTRING (string)->data[++pos];
1232 if (c == '&')
1233 Finsert_buffer_substring (Fcurrent_buffer (),
1234 make_number (search_regs.start[0]),
1235 make_number (search_regs.end[0]));
1236 else if (c >= '1' && c <= search_regs.num_regs + '0')
1238 if (search_regs.start[c - '0'] >= 1)
1239 Finsert_buffer_substring (Fcurrent_buffer (),
1240 make_number (search_regs.start[c - '0']),
1241 make_number (search_regs.end[c - '0']));
1243 else
1244 insert_char (c);
1246 else
1247 insert_char (c);
1249 UNGCPRO;
1252 inslen = point - (search_regs.end[0]);
1253 del_range (search_regs.start[0], search_regs.end[0]);
1255 if (case_action == all_caps)
1256 Fupcase_region (make_number (point - inslen), make_number (point));
1257 else if (case_action == cap_initial)
1258 upcase_initials_region (make_number (point - inslen), make_number (point));
1259 return Qnil;
1262 static Lisp_Object
1263 match_limit (num, beginningp)
1264 Lisp_Object num;
1265 int beginningp;
1267 register int n;
1269 CHECK_NUMBER (num, 0);
1270 n = XINT (num);
1271 if (n < 0 || n >= search_regs.num_regs)
1272 args_out_of_range (num, make_number (search_regs.num_regs));
1273 if (search_regs.num_regs <= 0
1274 || search_regs.start[n] < 0)
1275 return Qnil;
1276 return (make_number ((beginningp) ? search_regs.start[n]
1277 : search_regs.end[n]));
1280 DEFUN ("match-beginning", Fmatch_beginning, Smatch_beginning, 1, 1, 0,
1281 "Return position of start of text matched by last search.\n\
1282 ARG, a number, specifies which parenthesized expression in the last regexp.\n\
1283 Value is nil if ARGth pair didn't match, or there were less than ARG pairs.\n\
1284 Zero means the entire text matched by the whole regexp or whole string.")
1285 (num)
1286 Lisp_Object num;
1288 return match_limit (num, 1);
1291 DEFUN ("match-end", Fmatch_end, Smatch_end, 1, 1, 0,
1292 "Return position of end of text matched by last search.\n\
1293 ARG, a number, specifies which parenthesized expression in the last regexp.\n\
1294 Value is nil if ARGth pair didn't match, or there were less than ARG pairs.\n\
1295 Zero means the entire text matched by the whole regexp or whole string.")
1296 (num)
1297 Lisp_Object num;
1299 return match_limit (num, 0);
1302 DEFUN ("match-data", Fmatch_data, Smatch_data, 0, 0, 0,
1303 "Return a list containing all info on what the last search matched.\n\
1304 Element 2N is `(match-beginning N)'; element 2N + 1 is `(match-end N)'.\n\
1305 All the elements are markers or nil (nil if the Nth pair didn't match)\n\
1306 if the last match was on a buffer; integers or nil if a string was matched.\n\
1307 Use `store-match-data' to reinstate the data in this list.")
1310 Lisp_Object *data;
1311 int i, len;
1313 if (NILP (last_thing_searched))
1314 error ("match-data called before any match found");
1316 data = (Lisp_Object *) alloca ((2 * search_regs.num_regs)
1317 * sizeof (Lisp_Object));
1319 len = -1;
1320 for (i = 0; i < search_regs.num_regs; i++)
1322 int start = search_regs.start[i];
1323 if (start >= 0)
1325 if (EQ (last_thing_searched, Qt))
1327 XFASTINT (data[2 * i]) = start;
1328 XFASTINT (data[2 * i + 1]) = search_regs.end[i];
1330 else if (XTYPE (last_thing_searched) == Lisp_Buffer)
1332 data[2 * i] = Fmake_marker ();
1333 Fset_marker (data[2 * i],
1334 make_number (start),
1335 last_thing_searched);
1336 data[2 * i + 1] = Fmake_marker ();
1337 Fset_marker (data[2 * i + 1],
1338 make_number (search_regs.end[i]),
1339 last_thing_searched);
1341 else
1342 /* last_thing_searched must always be Qt, a buffer, or Qnil. */
1343 abort ();
1345 len = i;
1347 else
1348 data[2 * i] = data [2 * i + 1] = Qnil;
1350 return Flist (2 * len + 2, data);
1354 DEFUN ("store-match-data", Fstore_match_data, Sstore_match_data, 1, 1, 0,
1355 "Set internal data on last search match from elements of LIST.\n\
1356 LIST should have been created by calling `match-data' previously.")
1357 (list)
1358 register Lisp_Object list;
1360 register int i;
1361 register Lisp_Object marker;
1363 if (!CONSP (list) && !NILP (list))
1364 list = wrong_type_argument (Qconsp, list);
1366 /* Unless we find a marker with a buffer in LIST, assume that this
1367 match data came from a string. */
1368 last_thing_searched = Qt;
1370 /* Allocate registers if they don't already exist. */
1372 int length = XFASTINT (Flength (list)) / 2;
1374 if (length > search_regs.num_regs)
1376 if (search_regs.num_regs == 0)
1378 search_regs.start
1379 = (regoff_t *) xmalloc (length * sizeof (regoff_t));
1380 search_regs.end
1381 = (regoff_t *) xmalloc (length * sizeof (regoff_t));
1383 else
1385 search_regs.start
1386 = (regoff_t *) xrealloc (search_regs.start,
1387 length * sizeof (regoff_t));
1388 search_regs.end
1389 = (regoff_t *) xrealloc (search_regs.end,
1390 length * sizeof (regoff_t));
1393 re_set_registers (&searchbuf, &search_regs, length,
1394 search_regs.start, search_regs.end);
1398 for (i = 0; i < search_regs.num_regs; i++)
1400 marker = Fcar (list);
1401 if (NILP (marker))
1403 search_regs.start[i] = -1;
1404 list = Fcdr (list);
1406 else
1408 if (XTYPE (marker) == Lisp_Marker)
1410 if (XMARKER (marker)->buffer == 0)
1411 XFASTINT (marker) = 0;
1412 else
1413 XSET (last_thing_searched, Lisp_Buffer,
1414 XMARKER (marker)->buffer);
1417 CHECK_NUMBER_COERCE_MARKER (marker, 0);
1418 search_regs.start[i] = XINT (marker);
1419 list = Fcdr (list);
1421 marker = Fcar (list);
1422 if (XTYPE (marker) == Lisp_Marker
1423 && XMARKER (marker)->buffer == 0)
1424 XFASTINT (marker) = 0;
1426 CHECK_NUMBER_COERCE_MARKER (marker, 0);
1427 search_regs.end[i] = XINT (marker);
1429 list = Fcdr (list);
1432 return Qnil;
1435 /* Quote a string to inactivate reg-expr chars */
1437 DEFUN ("regexp-quote", Fregexp_quote, Sregexp_quote, 1, 1, 0,
1438 "Return a regexp string which matches exactly STRING and nothing else.")
1439 (str)
1440 Lisp_Object str;
1442 register unsigned char *in, *out, *end;
1443 register unsigned char *temp;
1445 CHECK_STRING (str, 0);
1447 temp = (unsigned char *) alloca (XSTRING (str)->size * 2);
1449 /* Now copy the data into the new string, inserting escapes. */
1451 in = XSTRING (str)->data;
1452 end = in + XSTRING (str)->size;
1453 out = temp;
1455 for (; in != end; in++)
1457 if (*in == '[' || *in == ']'
1458 || *in == '*' || *in == '.' || *in == '\\'
1459 || *in == '?' || *in == '+'
1460 || *in == '^' || *in == '$')
1461 *out++ = '\\';
1462 *out++ = *in;
1465 return make_string (temp, out - temp);
1468 syms_of_search ()
1470 register int i;
1472 searchbuf.allocated = 100;
1473 searchbuf.buffer = (unsigned char *) malloc (searchbuf.allocated);
1474 searchbuf.fastmap = search_fastmap;
1476 Qsearch_failed = intern ("search-failed");
1477 staticpro (&Qsearch_failed);
1478 Qinvalid_regexp = intern ("invalid-regexp");
1479 staticpro (&Qinvalid_regexp);
1481 Fput (Qsearch_failed, Qerror_conditions,
1482 Fcons (Qsearch_failed, Fcons (Qerror, Qnil)));
1483 Fput (Qsearch_failed, Qerror_message,
1484 build_string ("Search failed"));
1486 Fput (Qinvalid_regexp, Qerror_conditions,
1487 Fcons (Qinvalid_regexp, Fcons (Qerror, Qnil)));
1488 Fput (Qinvalid_regexp, Qerror_message,
1489 build_string ("Invalid regexp"));
1491 last_regexp = Qnil;
1492 staticpro (&last_regexp);
1494 last_thing_searched = Qnil;
1495 staticpro (&last_thing_searched);
1497 defsubr (&Sstring_match);
1498 defsubr (&Slooking_at);
1499 defsubr (&Sskip_chars_forward);
1500 defsubr (&Sskip_chars_backward);
1501 defsubr (&Sskip_syntax_forward);
1502 defsubr (&Sskip_syntax_backward);
1503 defsubr (&Ssearch_forward);
1504 defsubr (&Ssearch_backward);
1505 defsubr (&Sword_search_forward);
1506 defsubr (&Sword_search_backward);
1507 defsubr (&Sre_search_forward);
1508 defsubr (&Sre_search_backward);
1509 defsubr (&Sreplace_match);
1510 defsubr (&Smatch_beginning);
1511 defsubr (&Smatch_end);
1512 defsubr (&Smatch_data);
1513 defsubr (&Sstore_match_data);
1514 defsubr (&Sregexp_quote);