From 5d3d63ab75fdb44cda1d6299bb68a46abe807de8 Mon Sep 17 00:00:00 2001 From: "Richard M. Stallman" Date: Tue, 15 Apr 1997 04:52:38 +0000 Subject: (looking_at_1): Set re_match_object. (string_match_1): Set re_match_object. (fast_string_match): Set re_match_object. (Fskip_chars_forward): Move to syntax.c. (Fskip_chars_backward): Move to syntax.c. (Fskip_syntax_forward): Move to syntax.c. (Fskip_syntax_backward): Move to syntax.c. (skip_chars): Move to syntax.c. (search_buffer): Set re_match_object. (syms_of_search): Move initialization of skip* to syntax.c. --- src/search.c | 305 ++--------------------------------------------------------- 1 file changed, 8 insertions(+), 297 deletions(-) diff --git a/src/search.c b/src/search.c index 7c8e58aa01c..fde9a8a1d0d 100644 --- a/src/search.c +++ b/src/search.c @@ -249,6 +249,8 @@ looking_at_1 (string, posix) s1 = ZV - BEGV; s2 = 0; } + + re_match_object = Qnil; i = re_match_2 (bufp, (char *) p1, s1, (char *) p2, s2, PT - BEGV, &search_regs, @@ -325,6 +327,8 @@ string_match_1 (regexp, string, start, posix) ? DOWNCASE_TABLE : 0), posix); immediate_quit = 1; + re_match_object = string; + val = re_search (bufp, (char *) XSTRING (string)->data, XSTRING (string)->size, s, XSTRING (string)->size - s, &search_regs); @@ -374,6 +378,8 @@ fast_string_match (regexp, string) bufp = compile_pattern (regexp, 0, 0, 0); immediate_quit = 1; + re_match_object = string; + val = re_search (bufp, (char *) XSTRING (string)->data, XSTRING (string)->size, 0, XSTRING (string)->size, 0); @@ -671,299 +677,6 @@ find_before_next_newline (from, to, cnt) return pos; } -Lisp_Object skip_chars (); - -DEFUN ("skip-chars-forward", Fskip_chars_forward, Sskip_chars_forward, 1, 2, 0, - "Move point forward, stopping before a char not in STRING, or at pos LIM.\n\ -STRING is like the inside of a `[...]' in a regular expression\n\ -except that `]' is never special and `\\' quotes `^', `-' or `\\'.\n\ -Thus, with arg \"a-zA-Z\", this skips letters stopping before first nonletter.\n\ -With arg \"^a-zA-Z\", skips nonletters stopping before first letter.\n\ -Returns the distance traveled, either zero or positive.") - (string, lim) - Lisp_Object string, lim; -{ - return skip_chars (1, 0, string, lim); -} - -DEFUN ("skip-chars-backward", Fskip_chars_backward, Sskip_chars_backward, 1, 2, 0, - "Move point backward, stopping after a char not in STRING, or at pos LIM.\n\ -See `skip-chars-forward' for details.\n\ -Returns the distance traveled, either zero or negative.") - (string, lim) - Lisp_Object string, lim; -{ - return skip_chars (0, 0, string, lim); -} - -DEFUN ("skip-syntax-forward", Fskip_syntax_forward, Sskip_syntax_forward, 1, 2, 0, - "Move point forward across chars in specified syntax classes.\n\ -SYNTAX is a string of syntax code characters.\n\ -Stop before a char whose syntax is not in SYNTAX, or at position LIM.\n\ -If SYNTAX starts with ^, skip characters whose syntax is NOT in SYNTAX.\n\ -This function returns the distance traveled, either zero or positive.") - (syntax, lim) - Lisp_Object syntax, lim; -{ - return skip_chars (1, 1, syntax, lim); -} - -DEFUN ("skip-syntax-backward", Fskip_syntax_backward, Sskip_syntax_backward, 1, 2, 0, - "Move point backward across chars in specified syntax classes.\n\ -SYNTAX is a string of syntax code characters.\n\ -Stop on reaching a char whose syntax is not in SYNTAX, or at position LIM.\n\ -If SYNTAX starts with ^, skip characters whose syntax is NOT in SYNTAX.\n\ -This function returns the distance traveled, either zero or negative.") - (syntax, lim) - Lisp_Object syntax, lim; -{ - return skip_chars (0, 1, syntax, lim); -} - -Lisp_Object -skip_chars (forwardp, syntaxp, string, lim) - int forwardp, syntaxp; - Lisp_Object string, lim; -{ - register unsigned char *p, *pend; - register unsigned int c; - register int ch; - unsigned char fastmap[0400]; - /* If SYNTAXP is 0, STRING may contain multi-byte form of characters - of which codes don't fit in FASTMAP. In that case, we set the - first byte of multibyte form (i.e. base leading-code) in FASTMAP - and set the actual ranges of characters in CHAR_RANGES. In the - form "X-Y" of STRING, both X and Y must belong to the same - character set because a range striding across character sets is - meaningless. */ - int *char_ranges - = (int *) alloca (XSTRING (string)->size * (sizeof (int)) * 2); - int n_char_ranges = 0; - int negate = 0; - register int i; - int multibyte = !NILP (current_buffer->enable_multibyte_characters); - - CHECK_STRING (string, 0); - - if (NILP (lim)) - XSETINT (lim, forwardp ? ZV : BEGV); - else - CHECK_NUMBER_COERCE_MARKER (lim, 1); - - /* In any case, don't allow scan outside bounds of buffer. */ - /* jla turned this off, for no known reason. - bfox turned the ZV part on, and rms turned the - BEGV part back on. */ - if (XINT (lim) > ZV) - XSETFASTINT (lim, ZV); - if (XINT (lim) < BEGV) - XSETFASTINT (lim, BEGV); - - p = XSTRING (string)->data; - pend = p + XSTRING (string)->size; - bzero (fastmap, sizeof fastmap); - - if (p != pend && *p == '^') - { - negate = 1; p++; - } - - /* Find the characters specified and set their elements of fastmap. - If syntaxp, each character counts as itself. - Otherwise, handle backslashes and ranges specially. */ - - while (p != pend) - { - c = *p; - if (multibyte) - { - ch = STRING_CHAR (p, pend - p); - p += BYTES_BY_CHAR_HEAD (*p); - } - else - { - ch = c; - p++; - } - if (syntaxp) - fastmap[syntax_spec_code[c]] = 1; - else - { - if (c == '\\') - { - if (p == pend) break; - c = *p++; - } - if (p != pend && *p == '-') - { - unsigned int ch2; - - p++; - if (p == pend) break; - if (SINGLE_BYTE_CHAR_P (ch)) - while (c <= *p) - { - fastmap[c] = 1; - c++; - } - else - { - fastmap[c] = 1; /* C is the base leading-code. */ - ch2 = STRING_CHAR (p, pend - p); - if (ch <= ch2) - char_ranges[n_char_ranges++] = ch, - char_ranges[n_char_ranges++] = ch2; - } - p += multibyte ? BYTES_BY_CHAR_HEAD (*p) : 1; - } - else - { - fastmap[c] = 1; - if (!SINGLE_BYTE_CHAR_P (ch)) - char_ranges[n_char_ranges++] = ch, - char_ranges[n_char_ranges++] = ch; - } - } - } - - /* If ^ was the first character, complement the fastmap. In - addition, as all multibyte characters have possibility of - matching, set all entries for base leading codes, which is - harmless even if SYNTAXP is 1. */ - - if (negate) - for (i = 0; i < sizeof fastmap; i++) - { - if (!multibyte || !BASE_LEADING_CODE_P (i)) - fastmap[i] ^= 1; - else - fastmap[i] = 1; - } - - { - int start_point = PT; - int pos = PT; - - immediate_quit = 1; - if (syntaxp) - { - if (forwardp) - { - if (multibyte) - while (pos < XINT (lim) - && fastmap[(int) SYNTAX (FETCH_CHAR (pos))]) - INC_POS (pos); - else - while (pos < XINT (lim) - && fastmap[(int) SYNTAX (FETCH_BYTE (pos))]) - pos++; - } - else - { - if (multibyte) - while (pos > XINT (lim)) - { - int savepos = pos; - DEC_POS (pos); - if (!fastmap[(int) SYNTAX (FETCH_CHAR (pos))]) - { - pos = savepos; - break; - } - } - else - while (pos > XINT (lim) - && fastmap[(int) SYNTAX (FETCH_BYTE (pos - 1))]) - pos--; - } - } - else - { - if (forwardp) - { - if (multibyte) - while (pos < XINT (lim) && fastmap[(c = FETCH_BYTE (pos))]) - { - if (!BASE_LEADING_CODE_P (c)) - pos++; - else if (n_char_ranges) - { - /* We much check CHAR_RANGES for a multibyte - character. */ - ch = FETCH_MULTIBYTE_CHAR (pos); - for (i = 0; i < n_char_ranges; i += 2) - if ((ch >= char_ranges[i] && ch <= char_ranges[i + 1])) - break; - if (!(negate ^ (i < n_char_ranges))) - break; - - INC_POS (pos); - } - else - { - if (!negate) break; - INC_POS (pos); - } - } - else - while (pos < XINT (lim) && fastmap[FETCH_BYTE (pos)]) - pos++; - } - else - { - if (multibyte) - while (pos > XINT (lim)) - { - int savepos = pos; - DEC_POS (pos); - if (fastmap[(c = FETCH_BYTE (pos))]) - { - if (!BASE_LEADING_CODE_P (c)) - ; - else if (n_char_ranges) - { - /* We much check CHAR_RANGES for a multibyte - character. */ - ch = FETCH_MULTIBYTE_CHAR (pos); - for (i = 0; i < n_char_ranges; i += 2) - if (ch >= char_ranges[i] && ch <= char_ranges[i + 1]) - break; - if (!(negate ^ (i < n_char_ranges))) - { - pos = savepos; - break; - } - } - else - if (!negate) - { - pos = savepos; - break; - } - } - else - { - pos = savepos; - break; - } - } - else - while (pos > XINT (lim) && fastmap[FETCH_BYTE (pos - 1)]) - pos--; - } - } - if (multibyte - /* INC_POS or DEC_POS might have moved POS over LIM. */ - && (forwardp ? (pos > XINT (lim)) : (pos < XINT (lim)))) - pos = XINT (lim); - - SET_PT (pos); - immediate_quit = 0; - - return make_number (PT - start_point); - } -} - /* Subroutines of Lisp buffer search functions. */ static Lisp_Object @@ -1145,6 +858,8 @@ search_buffer (string, pos, lim, n, RE, trt, inverse_trt, posix) s1 = ZV - BEGV; s2 = 0; } + re_match_object = Qnil; + while (n < 0) { int val; @@ -2273,10 +1988,6 @@ syms_of_search () defsubr (&Sposix_looking_at); defsubr (&Sstring_match); defsubr (&Sposix_string_match); - defsubr (&Sskip_chars_forward); - defsubr (&Sskip_chars_backward); - defsubr (&Sskip_syntax_forward); - defsubr (&Sskip_syntax_backward); defsubr (&Ssearch_forward); defsubr (&Ssearch_backward); defsubr (&Sword_search_forward); -- cgit v1.2.1