XEmacs 21.2.20 "Yoko".
[chise/xemacs-chise.git.1] / src / syntax.c
index 33b396e..4792c2b 100644 (file)
@@ -53,6 +53,7 @@ Sextword is a word-constituent but a word boundary may exist between
 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;
 
@@ -327,15 +328,17 @@ syntax table.
 
 \f
 
-static int
-word_constituent_p (struct buffer *buf, Bufpos pos,
-                   struct Lisp_Char_Table *tab)
-{
-  enum syntaxcode code = SYNTAX_UNSAFE (tab, BUF_FETCH_CHAR (buf, pos));
-  return ((words_include_escapes &&
-          (code == Sescape || code == Scharquote))
-         || (code == Sword));
-}
+#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);
+#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 +349,10 @@ scan_words (struct buffer *buf, Bufpos from, int count)
 {
   Bufpos limit = count > 0 ? BUF_ZV (buf) : BUF_BEGV (buf);
   struct Lisp_Char_Table *mirrortab = XCHAR_TABLE (buf->mirror_syntax_table);
+  Emchar ch0, ch1;
+  enum syntaxcode code;
+
+  /* #### is it really worth it to hand expand both cases? JV */
   while (count > 0)
     {
       QUIT;
@@ -354,15 +361,36 @@ scan_words (struct buffer *buf, Bufpos from, int count)
        {
          if (from == limit)
            return 0;
-         if (word_constituent_p (buf, from, mirrortab))
+
+         ch0 = BUF_FETCH_CHAR (buf, from);
+         code = SYNTAX_UNSAFE (mirrortab, ch0);
+
+         if (words_include_escapes
+             && (code == Sescape || code == Scharquote))
            break;
+         if (code == Sword)
+           break;
+
          from++;
        }
 
       QUIT;
 
-      while ((from != limit) && word_constituent_p (buf, from, mirrortab))
+      while (from != limit)
        {
+         ch1 = BUF_FETCH_CHAR (buf, from);
+         code = SYNTAX_UNSAFE (mirrortab, ch1);
+         if (!(words_include_escapes
+               && (code == Sescape || code == Scharquote)))
+           if (code != Sword
+#ifdef MULE
+               || WORD_BOUNDARY_P (ch0, ch1)
+#endif         
+               )
+             break;
+#ifdef MULE
+         ch0 = ch1;
+#endif   
          from++;
        }
       count--;
@@ -376,15 +404,35 @@ scan_words (struct buffer *buf, Bufpos from, int count)
        {
          if (from == limit)
            return 0;
-         if (word_constituent_p (buf, from - 1, mirrortab))
+
+         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;
+
          from--;
        }
 
       QUIT;
 
-      while ((from != limit) && word_constituent_p (buf, from - 1, mirrortab))
+      while (from != limit)
        {
+         ch0 = BUF_FETCH_CHAR (buf, from - 1);
+         code = SYNTAX_UNSAFE (mirrortab, ch0);
+         if (!(words_include_escapes
+               && (code == Sescape || code == Scharquote)))
+           if (code != Sword
+#ifdef MULE
+               || WORD_BOUNDARY_P (ch0, ch1)
+#endif
+               )
+             break;
+#ifdef MULE
+         ch1 = ch0;
+#endif
          from--;
        }
       count++;
@@ -1652,8 +1700,8 @@ complex_vars_of_syntax (void)
   Vstandard_syntax_table = Fcopy_syntax_table (Qnil);
   staticpro (&Vstandard_syntax_table);
 
-  Vsyntax_designator_chars_string = make_pure_string (syntax_code_spec,
-                                                     Smax, Qnil, 1);
+  Vsyntax_designator_chars_string = make_string_nocopy (syntax_code_spec,
+                                                       Smax);
   staticpro (&Vsyntax_designator_chars_string);
 
   fill_char_table (XCHAR_TABLE (Vstandard_syntax_table),