]> code.delx.au - gnu-emacs/blobdiff - src/syntax.c
*** empty log message ***
[gnu-emacs] / src / syntax.c
index c7e60ce1894f199557d8f10b7ee4fee0854442bc..c2711b90ef12bd706ffb172fce53bd5f0ec7f320 100644 (file)
@@ -45,11 +45,20 @@ Lisp_Object Qsyntax_table_p, Qsyntax_table, Qscan_error;
 int words_include_escapes;
 int parse_sexp_lookup_properties;
 
+/* Nonzero means `scan-sexps' treat all multibyte characters as symbol.  */
+int multibyte_syntax_as_symbol;
+
 /* Used as a temporary in SYNTAX_ENTRY and other macros in syntax.h,
    if not compiled with GCC.  No need to mark it, since it is used
    only very temporarily.  */
 Lisp_Object syntax_temp;
 
+/* Non-zero means an open parenthesis in column 0 is always considered
+   to be the start of a defun.  Zero means an open parenthesis in
+   column 0 has no special meaning.  */
+
+int open_paren_in_column_0_is_defun_start;
+
 /* This is the internal form of the parse state used in parse-partial-sexp.  */
 
 struct lisp_parse_state
@@ -137,14 +146,14 @@ update_syntax_table (charpos, count, init, object)
       while (!NULL_PARENT (i)) 
        {
          if (AM_RIGHT_CHILD (i))
-           i->parent->position = i->position
+           INTERVAL_PARENT (i)->position = i->position
              - LEFT_TOTAL_LENGTH (i) + TOTAL_LENGTH (i) /* right end */
-             - TOTAL_LENGTH (i->parent)
-             + LEFT_TOTAL_LENGTH (i->parent);
+             - TOTAL_LENGTH (INTERVAL_PARENT (i))
+             + LEFT_TOTAL_LENGTH (INTERVAL_PARENT (i));
          else
-           i->parent->position = i->position - LEFT_TOTAL_LENGTH (i)
+           INTERVAL_PARENT (i)->position = i->position - LEFT_TOTAL_LENGTH (i)
              + TOTAL_LENGTH (i);
-         i = i->parent;
+         i = INTERVAL_PARENT (i);
        }
       i = gl_state.forward_i;
       gl_state.b_property = i->position - 1 - gl_state.offset;
@@ -367,11 +376,13 @@ find_defun_start (pos, pos_byte)
   gl_state.use_global = 0;
   while (PT > BEGV)
     {
-      /* Open-paren at start of line means we found our defun-start.  */
+      /* Open-paren at start of line means we may have found our
+        defun-start.  */
       if (SYNTAX (FETCH_CHAR (PT_BYTE)) == Sopen)
        {
          SETUP_SYNTAX_TABLE (PT + 1, -1);      /* Try again... */
-         if (SYNTAX (FETCH_CHAR (PT_BYTE)) == Sopen)
+         if (SYNTAX (FETCH_CHAR (PT_BYTE)) == Sopen
+             && open_paren_in_column_0_is_defun_start)
            break;
          /* Now fallback to the default value.  */
          gl_state.current_syntax_table = current_buffer->syntax_table;
@@ -710,11 +721,12 @@ One argument, a syntax table.")
   (table)
      Lisp_Object table;
 {
+  int idx;
   check_syntax_table (table);
   current_buffer->syntax_table = table;
   /* Indicate that this buffer now has a specified syntax table.  */
-  current_buffer->local_var_flags
-    |= XFASTINT (buffer_local_flags.syntax_table);
+  idx = PER_BUFFER_VAR_IDX (syntax_table);
+  SET_PER_BUFFER_VALUE_P (current_buffer, idx, 1);
   return table;
 }
 \f
@@ -1942,6 +1954,13 @@ between them, return t; otherwise return nil.")
   return Qt;
 }
 \f
+/* Return syntax code of character C if C is a single byte character
+   or `multibyte_symbol_p' is zero.  Otherwise, retrun Ssymbol.  */
+
+#define SYNTAX_WITH_MULTIBYTE_CHECK(c)                 \
+  ((SINGLE_BYTE_CHAR_P (c) || !multibyte_symbol_p)     \
+   ? SYNTAX (c) : Ssymbol)
+
 static Lisp_Object
 scan_lists (from, count, depth, sexpflag)
      register int from;
@@ -1963,6 +1982,7 @@ scan_lists (from, count, depth, sexpflag)
   int from_byte;
   int out_bytepos, out_charpos;
   int temp, dummy;
+  int multibyte_symbol_p = sexpflag && multibyte_syntax_as_symbol;
 
   if (depth > 0) min_depth = 0;
 
@@ -1982,7 +2002,7 @@ scan_lists (from, count, depth, sexpflag)
          int comstart_first, prefix;
          UPDATE_SYNTAX_TABLE_FORWARD (from);
          c = FETCH_CHAR (from_byte);
-         code = SYNTAX (c);
+         code = SYNTAX_WITH_MULTIBYTE_CHECK (c);
          comstart_first = SYNTAX_COMSTART_FIRST (c);
          comnested = SYNTAX_COMMENT_NESTED (c);
          prefix = SYNTAX_PREFIX (c);
@@ -2026,7 +2046,8 @@ scan_lists (from, count, depth, sexpflag)
                  UPDATE_SYNTAX_TABLE_FORWARD (from);
 
                  /* Some compilers can't handle this inside the switch.  */
-                 temp = SYNTAX (FETCH_CHAR (from_byte));
+                 c = FETCH_CHAR (from_byte);
+                 temp = SYNTAX_WITH_MULTIBYTE_CHECK (c);
                  switch (temp)
                    {
                    case Scharquote:
@@ -2101,13 +2122,14 @@ scan_lists (from, count, depth, sexpflag)
                {
                  if (from >= stop) goto lose;
                  UPDATE_SYNTAX_TABLE_FORWARD (from);
+                 c = FETCH_CHAR (from_byte);
                  if (code == Sstring 
-                     ? (FETCH_CHAR (from_byte) == stringterm)
-                     : SYNTAX (FETCH_CHAR (from_byte)) == Sstring_fence) 
+                     ? c == stringterm
+                     : SYNTAX_WITH_MULTIBYTE_CHECK (c) == Sstring_fence)
                    break;
 
                  /* Some compilers can't handle this inside the switch.  */
-                 temp = SYNTAX (FETCH_CHAR (from_byte));
+                 temp = SYNTAX_WITH_MULTIBYTE_CHECK (c);
                  switch (temp)
                    {
                    case Scharquote:
@@ -2140,7 +2162,7 @@ scan_lists (from, count, depth, sexpflag)
          DEC_BOTH (from, from_byte);
          UPDATE_SYNTAX_TABLE_BACKWARD (from);
          c = FETCH_CHAR (from_byte);
-         code = SYNTAX (c);
+         code = SYNTAX_WITH_MULTIBYTE_CHECK (c);
          if (depth == min_depth)
            last_good = from;
          comstyle = 0;
@@ -2188,7 +2210,7 @@ scan_lists (from, count, depth, sexpflag)
                    temp_pos--;
                  UPDATE_SYNTAX_TABLE_BACKWARD (from - 1);
                  c1 = FETCH_CHAR (temp_pos);
-                 temp_code = SYNTAX (c1);
+                 temp_code = SYNTAX_WITH_MULTIBYTE_CHECK (c1);
                  /* Don't allow comment-end to be quoted.  */
                  if (temp_code == Sendcomment)
                    goto done2;
@@ -2200,7 +2222,7 @@ scan_lists (from, count, depth, sexpflag)
                      UPDATE_SYNTAX_TABLE_BACKWARD (from - 1);
                    }
                  c1 = FETCH_CHAR (temp_pos);
-                 temp_code = SYNTAX (c1);
+                 temp_code = SYNTAX_WITH_MULTIBYTE_CHECK (c1);
                  if (! (quoted || temp_code == Sword
                         || temp_code == Ssymbol
                         || temp_code == Squote))
@@ -2260,7 +2282,8 @@ scan_lists (from, count, depth, sexpflag)
                  if (from == stop) goto lose;
                  UPDATE_SYNTAX_TABLE_BACKWARD (from);
                  if (!char_quoted (from, from_byte) 
-                     && SYNTAX (FETCH_CHAR (from_byte)) == code)
+                     && (c = FETCH_CHAR (from_byte),
+                         SYNTAX_WITH_MULTIBYTE_CHECK (c) == code))
                    break;
                }
              if (code == Sstring_fence && !depth && sexpflag) goto done2;
@@ -2909,6 +2932,11 @@ init_syntax_once ()
       c = ".,;:?!#@~^'`"[i];
       SET_RAW_SYNTAX_ENTRY (Vstandard_syntax_table, c, temp);
     }
+
+  /* All multibyte characters have syntax `word' by default.  */
+  temp = XVECTOR (Vsyntax_code_object)->contents[(int) Sword];
+  for (i = CHAR_TABLE_SINGLE_BYTE_SLOTS; i < CHAR_TABLE_ORDINARY_SLOTS; i++)
+    XCHAR_TABLE (Vstandard_syntax_table)->contents[i] = temp;
 }
 
 void
@@ -2940,6 +2968,15 @@ relevant only for open/close type.");
   DEFVAR_BOOL ("words-include-escapes", &words_include_escapes,
     "Non-nil means `forward-word', etc., should treat escape chars part of words.");
 
+  DEFVAR_BOOL ("multibyte-syntax-as-symbol", &multibyte_syntax_as_symbol,
+    "Non-nil means `scan-sexps' treats all multibyte characters as symbol.");
+  multibyte_syntax_as_symbol = 0;
+
+  DEFVAR_BOOL ("open-paren-in-column-0-is-defun-start",
+              &open_paren_in_column_0_is_defun_start,
+    "Non-nil means an open paren in column 0 denotes the start of a defun.");
+  open_paren_in_column_0_is_defun_start = 1;
+
   defsubr (&Ssyntax_table_p);
   defsubr (&Ssyntax_table);
   defsubr (&Sstandard_syntax_table);