update.
[chise/xemacs-chise.git-] / src / syntax.c
index 9a1d56b..c84502a 100644 (file)
@@ -27,8 +27,6 @@ Boston, MA 02111-1307, USA.  */
 #include "lisp.h"
 
 #include "buffer.h"
 #include "lisp.h"
 
 #include "buffer.h"
-#include "commands.h"
-#include "insdel.h"
 #include "syntax.h"
 
 /* Here is a comment from Ken'ichi HANDA <handa@etl.go.jp>
 #include "syntax.h"
 
 /* Here is a comment from Ken'ichi HANDA <handa@etl.go.jp>
@@ -55,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 */
 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;
 
 
 Lisp_Object Qsyntax_table_p;
 
@@ -118,7 +117,7 @@ static Bufpos
 find_defun_start (struct buffer *buf, Bufpos pos)
 {
   Bufpos tem;
 find_defun_start (struct buffer *buf, Bufpos pos)
 {
   Bufpos tem;
-  struct Lisp_Char_Table *mirrortab = XCHAR_TABLE (buf->mirror_syntax_table);
+  Lisp_Char_Table *mirrortab = XCHAR_TABLE (buf->mirror_syntax_table);
 
   /* Use previous finding, if it's valid and applies to this inquiry.  */
   if (buf == find_start_buffer
 
   /* Use previous finding, if it's valid and applies to this inquiry.  */
   if (buf == find_start_buffer
@@ -225,7 +224,7 @@ BUFFER defaults to the current buffer if omitted.
    into the code it signifies.
    This is used by modify-syntax-entry, and other things. */
 
    into the code it signifies.
    This is used by modify-syntax-entry, and other things. */
 
-CONST unsigned char syntax_spec_code[0400] =
+const unsigned char syntax_spec_code[0400] =
 { 0377, 0377, 0377, 0377, 0377, 0377, 0377, 0377,
   0377, 0377, 0377, 0377, 0377, 0377, 0377, 0377,
   0377, 0377, 0377, 0377, 0377, 0377, 0377, 0377,
 { 0377, 0377, 0377, 0377, 0377, 0377, 0377, 0377,
   0377, 0377, 0377, 0377, 0377, 0377, 0377, 0377,
   0377, 0377, 0377, 0377, 0377, 0377, 0377, 0377,
@@ -247,7 +246,7 @@ CONST unsigned char syntax_spec_code[0400] =
   0377, 0377, 0377, 0377, 0377, 0377, 0377, 0377
 };
 
   0377, 0377, 0377, 0377, 0377, 0377, 0377, 0377
 };
 
-CONST unsigned char syntax_code_spec[] =  " .w_()'\"$\\/<>@";
+const unsigned char syntax_code_spec[] =  " .w_()'\"$\\/<>@";
 
 DEFUN ("syntax-designator-chars", Fsyntax_designator_chars, 0, 0, 0, /*
 Return a string of the recognized syntax designator chars.
 
 DEFUN ("syntax-designator-chars", Fsyntax_designator_chars, 0, 0, 0, /*
 Return a string of the recognized syntax designator chars.
@@ -269,7 +268,7 @@ syntax table.
 */
        (ch, table))
 {
 */
        (ch, table))
 {
-  struct Lisp_Char_Table *mirrortab;
+  Lisp_Char_Table *mirrortab;
 
   if (NILP(ch))
     {
 
   if (NILP(ch))
     {
@@ -296,14 +295,13 @@ charset_syntax (struct buffer *buf, Lisp_Object charset, int *multi_p_out)
 Lisp_Object
 syntax_match (Lisp_Object table, Emchar ch)
 {
 Lisp_Object
 syntax_match (Lisp_Object table, Emchar ch)
 {
-  Lisp_Object code = CHAR_TABLE_VALUE_UNSAFE (XCHAR_TABLE (table), ch);
+  Lisp_Object code = XCHAR_TABLE_VALUE_UNSAFE (table, ch);
   Lisp_Object code2 = code;
 
   if (CONSP (code))
     code2 = XCAR (code);
   if (SYNTAX_FROM_CODE (XINT (code2)) == Sinherit)
   Lisp_Object code2 = code;
 
   if (CONSP (code))
     code2 = XCAR (code);
   if (SYNTAX_FROM_CODE (XINT (code2)) == Sinherit)
-    code = CHAR_TABLE_VALUE_UNSAFE (XCHAR_TABLE (Vstandard_syntax_table),
-                                   ch);
+    code = XCHAR_TABLE_VALUE_UNSAFE (Vstandard_syntax_table, ch);
 
   return CONSP (code) ? XCDR (code) : Qnil;
 }
 
   return CONSP (code) ? XCDR (code) : Qnil;
 }
@@ -315,7 +313,7 @@ syntax table.
 */
        (ch, table))
 {
 */
        (ch, table))
 {
-  struct Lisp_Char_Table *mirrortab;
+  Lisp_Char_Table *mirrortab;
   int code;
 
   CHECK_CHAR_COERCE_INT (ch);
   int code;
 
   CHECK_CHAR_COERCE_INT (ch);
@@ -329,15 +327,17 @@ syntax table.
 
 \f
 
 
 \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.
 
 /* Return the position across COUNT words from FROM.
    If that many words cannot be found before the end of the buffer, return 0.
@@ -347,7 +347,11 @@ Bufpos
 scan_words (struct buffer *buf, Bufpos from, int count)
 {
   Bufpos limit = count > 0 ? BUF_ZV (buf) : BUF_BEGV (buf);
 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);
+  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;
   while (count > 0)
     {
       QUIT;
@@ -356,15 +360,35 @@ scan_words (struct buffer *buf, Bufpos from, int count)
        {
          if (from == limit)
            return 0;
        {
          if (from == limit)
            return 0;
-         if (word_constituent_p (buf, from, mirrortab))
-           break;
+
+         ch0 = BUF_FETCH_CHAR (buf, from);
+         code = SYNTAX_UNSAFE (mirrortab, ch0);
+
          from++;
          from++;
+         if (words_include_escapes
+             && (code == Sescape || code == Scharquote))
+           break;
+         if (code == Sword)
+           break;
        }
 
       QUIT;
 
        }
 
       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--;
          from++;
        }
       count--;
@@ -378,15 +402,35 @@ scan_words (struct buffer *buf, Bufpos from, int count)
        {
          if (from == limit)
            return 0;
        {
          if (from == limit)
            return 0;
-         if (word_constituent_p (buf, from - 1, mirrortab))
-           break;
+
+         ch1 = BUF_FETCH_CHAR (buf, from - 1);
+         code = SYNTAX_UNSAFE (mirrortab, ch1);
+
          from--;
          from--;
+         if (words_include_escapes
+             && (code == Sescape || code == Scharquote))
+           break;
+         if (code == Sword)
+           break;
        }
 
       QUIT;
 
        }
 
       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++;
          from--;
        }
       count++;
@@ -396,10 +440,12 @@ scan_words (struct buffer *buf, Bufpos from, int count)
 }
 
 DEFUN ("forward-word", Fforward_word, 1, 2, "_p", /*
 }
 
 DEFUN ("forward-word", Fforward_word, 1, 2, "_p", /*
-Move point forward ARG words (backward if ARG is negative).
+Move point forward COUNT words (backward if COUNT is negative).
 Normally returns t.
 If an edge of the buffer is reached, point is left there
 and nil is returned.
 Normally returns t.
 If an edge of the buffer is reached, point is left there
 and nil is returned.
+
+Optional argument BUFFER defaults to the current buffer.
 */
        (count, buffer))
 {
 */
        (count, buffer))
 {
@@ -428,7 +474,7 @@ find_start_of_comment (struct buffer *buf, Bufpos from, Bufpos stop, int mask)
 {
   Emchar c;
   enum syntaxcode code;
 {
   Emchar c;
   enum syntaxcode code;
-  struct Lisp_Char_Table *mirrortab = XCHAR_TABLE (buf->mirror_syntax_table);
+  Lisp_Char_Table *mirrortab = XCHAR_TABLE (buf->mirror_syntax_table);
 
   /* Look back, counting the parity of string-quotes,
      and recording the comment-starters seen.
 
   /* Look back, counting the parity of string-quotes,
      and recording the comment-starters seen.
@@ -562,7 +608,7 @@ static Bufpos
 find_end_of_comment (struct buffer *buf, Bufpos from, Bufpos stop, int mask)
 {
   int c;
 find_end_of_comment (struct buffer *buf, Bufpos from, Bufpos stop, int mask)
 {
   int c;
-  struct Lisp_Char_Table *mirrortab = XCHAR_TABLE (buf->mirror_syntax_table);
+  Lisp_Char_Table *mirrortab = XCHAR_TABLE (buf->mirror_syntax_table);
 
   while (1)
     {
 
   while (1)
     {
@@ -613,9 +659,9 @@ Optional argument BUFFER defaults to the current buffer.
   Bufpos stop;
   Emchar c;
   enum syntaxcode code;
   Bufpos stop;
   Emchar c;
   enum syntaxcode code;
-  int count;
+  EMACS_INT count;
   struct buffer *buf = decode_buffer (buffer, 0);
   struct buffer *buf = decode_buffer (buffer, 0);
-  struct Lisp_Char_Table *mirrortab = XCHAR_TABLE (buf->mirror_syntax_table);
+  Lisp_Char_Table *mirrortab = XCHAR_TABLE (buf->mirror_syntax_table);
 
   CHECK_INT (n);
   count = XINT (n);
 
   CHECK_INT (n);
   count = XINT (n);
@@ -769,7 +815,7 @@ scan_lists (struct buffer *buf, Bufpos from, int count, int depth,
   enum syntaxcode code;
   int min_depth = depth;    /* Err out if depth gets less than this. */
   Lisp_Object syntaxtab = buf->syntax_table;
   enum syntaxcode code;
   int min_depth = depth;    /* Err out if depth gets less than this. */
   Lisp_Object syntaxtab = buf->syntax_table;
-  struct Lisp_Char_Table *mirrortab = XCHAR_TABLE (buf->mirror_syntax_table);
+  Lisp_Char_Table *mirrortab = XCHAR_TABLE (buf->mirror_syntax_table);
 
   if (depth > 0) min_depth = 0;
 
 
   if (depth > 0) min_depth = 0;
 
@@ -979,7 +1025,7 @@ scan_lists (struct buffer *buf, Bufpos from, int count, int depth,
          if (SYNTAX_PREFIX_UNSAFE (mirrortab, c))
            continue;
 
          if (SYNTAX_PREFIX_UNSAFE (mirrortab, c))
            continue;
 
-         switch (((quoted) ? Sword : code))
+         switch (quoted ? Sword : code)
            {
            case Sword:
            case Ssymbol:
            {
            case Sword:
            case Ssymbol:
@@ -1088,7 +1134,7 @@ char_quoted (struct buffer *buf, Bufpos pos)
   enum syntaxcode code;
   Bufpos beg = BUF_BEGV (buf);
   int quoted = 0;
   enum syntaxcode code;
   Bufpos beg = BUF_BEGV (buf);
   int quoted = 0;
-  struct Lisp_Char_Table *mirrortab = XCHAR_TABLE (buf->mirror_syntax_table);
+  Lisp_Char_Table *mirrortab = XCHAR_TABLE (buf->mirror_syntax_table);
 
   while (pos > beg
         && ((code = SYNTAX (mirrortab, BUF_FETCH_CHAR (buf, pos - 1)))
 
   while (pos > beg
         && ((code = SYNTAX (mirrortab, BUF_FETCH_CHAR (buf, pos - 1)))
@@ -1170,7 +1216,7 @@ Optional arg BUFFER defaults to the current buffer.
   struct buffer *buf = decode_buffer (buffer, 0);
   Bufpos beg = BUF_BEGV (buf);
   Bufpos pos = BUF_PT (buf);
   struct buffer *buf = decode_buffer (buffer, 0);
   Bufpos beg = BUF_BEGV (buf);
   Bufpos pos = BUF_PT (buf);
-  struct Lisp_Char_Table *mirrortab = XCHAR_TABLE (buf->mirror_syntax_table);
+  Lisp_Char_Table *mirrortab = XCHAR_TABLE (buf->mirror_syntax_table);
 
   while (pos > beg && !char_quoted (buf, pos - 1)
         && (SYNTAX (mirrortab, BUF_FETCH_CHAR (buf, pos - 1)) == Squote
 
   while (pos > beg && !char_quoted (buf, pos - 1)
         && (SYNTAX (mirrortab, BUF_FETCH_CHAR (buf, pos - 1)) == Squote
@@ -1210,7 +1256,7 @@ scan_sexps_forward (struct buffer *buf, struct lisp_parse_state *stateptr,
   Lisp_Object tem;
   int mask;                                 /* comment mask */
   Lisp_Object syntaxtab = buf->syntax_table;
   Lisp_Object tem;
   int mask;                                 /* comment mask */
   Lisp_Object syntaxtab = buf->syntax_table;
-  struct Lisp_Char_Table *mirrortab = XCHAR_TABLE (buf->mirror_syntax_table);
+  Lisp_Char_Table *mirrortab = XCHAR_TABLE (buf->mirror_syntax_table);
 
   if (NILP (oldstate))
     {
 
   if (NILP (oldstate))
     {
@@ -1563,7 +1609,7 @@ cmst_mapfun (struct chartab_range *range, Lisp_Object val, void *arg)
 }
 
 static void
 }
 
 static void
-update_just_this_syntax_table (struct Lisp_Char_Table *ct)
+update_just_this_syntax_table (Lisp_Char_Table *ct)
 {
   struct chartab_range range;
   struct cmst_arg arg;
 {
   struct chartab_range range;
   struct cmst_arg arg;
@@ -1581,7 +1627,7 @@ update_just_this_syntax_table (struct Lisp_Char_Table *ct)
    one. */
 
 void
    one. */
 
 void
-update_syntax_table (struct Lisp_Char_Table *ct)
+update_syntax_table (Lisp_Char_Table *ct)
 {
   /* Don't be stymied at startup. */
   if (CHAR_TABLEP (Vstandard_syntax_table)
 {
   /* Don't be stymied at startup. */
   if (CHAR_TABLEP (Vstandard_syntax_table)
@@ -1633,18 +1679,28 @@ vars_of_syntax (void)
   DEFVAR_BOOL ("parse-sexp-ignore-comments", &parse_sexp_ignore_comments /*
 Non-nil means `forward-sexp', etc., should treat comments as whitespace.
 */ );
   DEFVAR_BOOL ("parse-sexp-ignore-comments", &parse_sexp_ignore_comments /*
 Non-nil means `forward-sexp', etc., should treat comments as whitespace.
 */ );
+  parse_sexp_ignore_comments = 0;
 
 
-  words_include_escapes = 0;
   DEFVAR_BOOL ("words-include-escapes", &words_include_escapes /*
 Non-nil means `forward-word', etc., should treat escape chars part of words.
 */ );
   DEFVAR_BOOL ("words-include-escapes", &words_include_escapes /*
 Non-nil means `forward-word', etc., should treat escape chars part of words.
 */ );
+  words_include_escapes = 0;
 
   no_quit_in_re_search = 0;
 }
 
 
   no_quit_in_re_search = 0;
 }
 
+static void
+define_standard_syntax (const char *p, enum syntaxcode syn)
+{
+  for (; *p; p++)
+    Fput_char_table (make_char (*p), make_int (syn), Vstandard_syntax_table);
+}
+
 void
 complex_vars_of_syntax (void)
 {
 void
 complex_vars_of_syntax (void)
 {
+  Emchar i;
+  const char *p;
   /* Set this now, so first buffer creation can refer to it. */
   /* Make it nil before calling copy-syntax-table
      so that copy-syntax-table will know not to try to copy from garbage */
   /* Set this now, so first buffer creation can refer to it. */
   /* Make it nil before calling copy-syntax-table
      so that copy-syntax-table will know not to try to copy from garbage */
@@ -1652,72 +1708,35 @@ complex_vars_of_syntax (void)
   Vstandard_syntax_table = Fcopy_syntax_table (Qnil);
   staticpro (&Vstandard_syntax_table);
 
   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);
 
   staticpro (&Vsyntax_designator_chars_string);
 
-  fill_char_table (XCHAR_TABLE (Vstandard_syntax_table),
-                  make_int (Spunct));
-
-  {
-    Emchar i;
-
-    for (i = 0; i <= 32; i++)
-      Fput_char_table (make_char (i), make_int ((int) Swhitespace),
-                      Vstandard_syntax_table);
-    for (i = 127; i <= 159; i++)
-      Fput_char_table (make_char (i), make_int ((int) Swhitespace),
-                      Vstandard_syntax_table);
+  fill_char_table (XCHAR_TABLE (Vstandard_syntax_table), make_int (Spunct));
 
 
-    for (i = 'a'; i <= 'z'; i++)
-      Fput_char_table (make_char (i), make_int ((int) Sword),
-                      Vstandard_syntax_table);
-    for (i = 'A'; i <= 'Z'; i++)
-      Fput_char_table (make_char (i), make_int ((int) Sword),
-                      Vstandard_syntax_table);
-    for (i = '0'; i <= '9'; i++)
-      Fput_char_table (make_char (i), make_int ((int) Sword),
-                      Vstandard_syntax_table);
-    Fput_char_table (make_char ('$'), make_int ((int) Sword),
+  for (i = 0; i <= 32; i++)    /* Control 0 plus SPACE */
+    Fput_char_table (make_char (i), make_int (Swhitespace),
                     Vstandard_syntax_table);
                     Vstandard_syntax_table);
-    Fput_char_table (make_char ('%'), make_int ((int) Sword),
+  for (i = 127; i <= 159; i++) /* DEL plus Control 1 */
+    Fput_char_table (make_char (i), make_int (Swhitespace),
                     Vstandard_syntax_table);
 
                     Vstandard_syntax_table);
 
+  define_standard_syntax ("abcdefghijklmnopqrstuvwxyz"
+                         "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+                         "0123456789"
+                         "$%", Sword);
+  define_standard_syntax ("\"", Sstring);
+  define_standard_syntax ("\\", Sescape);
+  define_standard_syntax ("_-+*/&|<>=", Ssymbol);
+  define_standard_syntax (".,;:?!#@~^'`", Spunct);
+
+  for (p = "()[]{}"; *p; p+=2)
     {
     {
-      Fput_char_table (make_char ('('), Fcons (make_int ((int) Sopen),
-                                              make_char (')')),
-                      Vstandard_syntax_table);
-      Fput_char_table (make_char (')'), Fcons (make_int ((int) Sclose),
-                                              make_char ('(')),
-                      Vstandard_syntax_table);
-      Fput_char_table (make_char ('['), Fcons (make_int ((int) Sopen),
-                                              make_char (']')),
-                      Vstandard_syntax_table);
-      Fput_char_table (make_char (']'), Fcons (make_int ((int) Sclose),
-                                              make_char ('[')),
-                      Vstandard_syntax_table);
-      Fput_char_table (make_char ('{'), Fcons (make_int ((int) Sopen),
-                                              make_char ('}')),
+      Fput_char_table (make_char (p[0]),
+                      Fcons (make_int (Sopen), make_char (p[1])),
                       Vstandard_syntax_table);
                       Vstandard_syntax_table);
-      Fput_char_table (make_char ('}'), Fcons (make_int ((int) Sclose),
-                                              make_char ('{')),
+      Fput_char_table (make_char (p[1]),
+                      Fcons (make_int (Sclose), make_char (p[0])),
                       Vstandard_syntax_table);
     }
                       Vstandard_syntax_table);
     }
-
-    Fput_char_table (make_char ('"'), make_int ((int) Sstring),
-                    Vstandard_syntax_table);
-    Fput_char_table (make_char ('\\'), make_int ((int) Sescape),
-                    Vstandard_syntax_table);
-
-    {
-      CONST char *p;
-      for (p = "_-+*/&|<>="; *p; p++)
-       Fput_char_table (make_char (*p), make_int ((int) Ssymbol),
-                        Vstandard_syntax_table);
-
-      for (p = ".,;:?!#@~^'`"; *p; p++)
-       Fput_char_table (make_char (*p), make_int ((int) Spunct),
-                        Vstandard_syntax_table);
-    }
-  }
 }
 }