Mercurial > emacs
changeset 1896:10895ac08bc6
(Fskip_syntax_backward): New function.
(Fskip_syntax_forward): Likewise.
(skip_chars): New argument syntaxp.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Sun, 21 Feb 1993 06:03:36 +0000 |
parents | b497a7ec0d58 |
children | 2cbd4cfb7f4c |
files | src/search.c |
diffstat | 1 files changed, 76 insertions(+), 24 deletions(-) [+] |
line wrap: on
line diff
--- a/src/search.c Sun Feb 21 02:08:17 1993 +0000 +++ b/src/search.c Sun Feb 21 06:03:36 1993 +0000 @@ -357,7 +357,7 @@ (string, lim) Lisp_Object string, lim; { - return skip_chars (1, string, lim); + return skip_chars (1, 0, string, lim); } DEFUN ("skip-chars-backward", Fskip_chars_backward, Sskip_chars_backward, 1, 2, 0, @@ -367,12 +367,36 @@ (string, lim) Lisp_Object string, lim; { - return skip_chars (0, 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, string, lim) - int forwardp; +skip_chars (forwardp, syntaxp, string, lim) + int forwardp, syntaxp; Lisp_Object string, lim; { register unsigned char *p, *pend; @@ -405,29 +429,36 @@ negate = 1; p++; } - /* Find the characters specified and set their elements of fastmap. */ + /* 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 (c == '\\') - { - if (p == pend) break; - c = *p++; - } - if (p != pend && *p == '-') + if (syntaxp) + fastmap[c] = 1; + else { - p++; - if (p == pend) break; - while (c <= *p) + if (c == '\\') + { + if (p == pend) break; + c = *p++; + } + if (p != pend && *p == '-') { - fastmap[c] = 1; - c++; + p++; + if (p == pend) break; + while (c <= *p) + { + fastmap[c] = 1; + c++; + } + p++; } - p++; + else + fastmap[c] = 1; } - else - fastmap[c] = 1; } /* If ^ was the first character, complement the fastmap. */ @@ -440,15 +471,34 @@ int start_point = point; immediate_quit = 1; - if (forwardp) + if (syntaxp) { - while (point < XINT (lim) && fastmap[FETCH_CHAR (point)]) - SET_PT (point + 1); + + if (forwardp) + { + while (point < XINT (lim) + && fastmap[(unsigned char) syntax_code_spec[(int) SYNTAX (FETCH_CHAR (point))]]) + SET_PT (point + 1); + } + else + { + while (point > XINT (lim) + && fastmap[(unsigned char) syntax_code_spec[(int) SYNTAX (FETCH_CHAR (point - 1))]]) + SET_PT (point - 1); + } } else { - while (point > XINT (lim) && fastmap[FETCH_CHAR (point - 1)]) - SET_PT (point - 1); + if (forwardp) + { + while (point < XINT (lim) && fastmap[FETCH_CHAR (point)]) + SET_PT (point + 1); + } + else + { + while (point > XINT (lim) && fastmap[FETCH_CHAR (point - 1)]) + SET_PT (point - 1); + } } immediate_quit = 0; @@ -1446,6 +1496,8 @@ defsubr (&Slooking_at); 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);