diff src/syntax.c @ 420:41dbb7a9d5f2 r21-2-18

Import from CVS: tag r21-2-18
author cvs
date Mon, 13 Aug 2007 11:24:09 +0200
parents 697ef44129c6
children 11054d720c21
line wrap: on
line diff
--- a/src/syntax.c	Mon Aug 13 11:23:14 2007 +0200
+++ b/src/syntax.c	Mon Aug 13 11:24:09 2007 +0200
@@ -53,6 +53,7 @@
 two such characters.  */
 
 /* Mule 2.4 doesn't seem to have Sextword - I'm removing it -- mrb */
+/* Recovered by tomo */
 
 Lisp_Object Qsyntax_table_p;
 
@@ -326,7 +327,17 @@
 }
 
 
+#ifdef MULE
+/* Return 1 if there is a word boundary between two word-constituent
+   characters C1 and C2 if they appear in this order, else return 0.
+   There is no word boundary between two word-constituent ASCII
+   characters.  */
+#define WORD_BOUNDARY_P(c1, c2)			\
+  (!(CHAR_ASCII_P (c1) && CHAR_ASCII_P (c2))	\
+   && word_boundary_p (c1, c2))
 
+extern int word_boundary_p (Emchar c1, Emchar c2);
+#else
 static int
 word_constituent_p (struct buffer *buf, Bufpos pos,
 		    struct Lisp_Char_Table *tab)
@@ -336,6 +347,7 @@
 	   (code == Sescape || code == Scharquote))
 	  || (code == Sword));
 }
+#endif
 
 /* Return the position across COUNT words from FROM.
    If that many words cannot be found before the end of the buffer, return 0.
@@ -346,6 +358,11 @@
 {
   Bufpos limit = count > 0 ? BUF_ZV (buf) : BUF_BEGV (buf);
   struct Lisp_Char_Table *mirrortab = XCHAR_TABLE (buf->mirror_syntax_table);
+#ifdef MULE
+  Emchar ch0, ch1;
+  enum syntaxcode code;
+#endif
+
   while (count > 0)
     {
       QUIT;
@@ -354,15 +371,40 @@
 	{
 	  if (from == limit)
 	    return 0;
+#ifdef MULE
+	  ch0 = BUF_FETCH_CHAR (buf, from);
+	  code = SYNTAX_UNSAFE (mirrortab, ch0);
+#else
 	  if (word_constituent_p (buf, from, mirrortab))
 	    break;
+#endif
 	  from++;
+#ifdef MULE
+	  if (words_include_escapes
+	      && (code == Sescape || code == Scharquote))
+	    break;
+	  if (code == Sword)
+	    break;
+#endif
 	}
 
       QUIT;
 
-      while ((from != limit) && word_constituent_p (buf, from, mirrortab))
+      while ((from != limit)
+#ifndef MULE
+	     && word_constituent_p (buf, from, mirrortab)
+#endif
+	     )
 	{
+#ifdef MULE
+	  ch1 = BUF_FETCH_CHAR (buf, from);
+	  code = SYNTAX_UNSAFE (mirrortab, ch1);
+	  if (!(words_include_escapes
+		&& (code == Sescape || code == Scharquote)))
+	    if (code != Sword || WORD_BOUNDARY_P (ch0, ch1))
+	      break;
+	  ch0 = ch1;
+#endif
 	  from++;
 	}
       count--;
@@ -376,15 +418,39 @@
 	{
 	  if (from == limit)
 	    return 0;
+#ifndef MULE
 	  if (word_constituent_p (buf, from - 1, mirrortab))
 	    break;
+#endif
 	  from--;
+#ifdef MULE
+	  ch1 = BUF_FETCH_CHAR (buf, from - 1);
+	  code = SYNTAX_UNSAFE (mirrortab, ch1);
+	  if (words_include_escapes
+	      && (code == Sescape || code == Scharquote))
+	    break;
+	  if (code == Sword)
+	    break;
+#endif
 	}
 
       QUIT;
 
-      while ((from != limit) && word_constituent_p (buf, from - 1, mirrortab))
+      while ((from != limit)
+#ifndef MULE
+	     && word_constituent_p (buf, from - 1, mirrortab)
+#endif
+	     )
 	{
+#ifdef MULE
+	  ch0 = BUF_FETCH_CHAR (buf, from - 1);
+	  code = SYNTAX_UNSAFE (mirrortab, ch0);
+	  if (!(words_include_escapes
+		&& (code == Sescape || code == Scharquote)))
+	    if (code != Sword || WORD_BOUNDARY_P (ch0, ch1))
+	      break;
+	  ch1 = ch0;
+#endif
 	  from--;
 	}
       count++;