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);