(detect_coding_iso2022): Do not exclude posibility of
[bpt/emacs.git] / src / syntax.c
index 9ead7e6..371dded 100644 (file)
@@ -190,7 +190,7 @@ update_syntax_table (pos, count, init, object)
 
   gl_state.current_syntax_table = tmp_table;
   gl_state.old_prop = tmp_table;
-  if (Fsyntax_table_p (tmp_table) == Qt)
+  if (EQ (Fsyntax_table_p (tmp_table), Qt))
     {
       gl_state.use_global = 0;
     } 
@@ -341,8 +341,8 @@ find_defun_start (pos)
    the search was not successful).  */
 
 static int
-back_comment (from, stop)
-     int from, stop;
+back_comment (from, stop, comstyle)
+     int from, stop, comstyle;
 {
   /* Look back, counting the parity of string-quotes,
      and recording the comment-starters seen.
@@ -361,7 +361,7 @@ back_comment (from, stop)
   int comstart_parity = 0;
   int scanstart = from - 1;
   register enum syntaxcode code;
-  int c, comstyle = 0;
+  int c;
 
   /* At beginning of range to scan, we're outside of strings;
      that determines quote parity to the comment-end.  */
@@ -388,10 +388,16 @@ back_comment (from, stop)
                        
       /* If this char starts a 2-char comment start sequence,
         treat it like a 1-char comment starter.  */
-      if (from < scanstart && SYNTAX_COMSTART_FIRST (c)
-         && SYNTAX_COMSTART_SECOND (FETCH_CHAR (from + 1))
-         && comstyle == SYNTAX_COMMENT_STYLE (FETCH_CHAR (from + 1)))
-       code = Scomment;
+      if (from < scanstart && SYNTAX_COMSTART_SECOND (c)
+         && SYNTAX_COMSTART_FIRST (FETCH_CHAR (from - 1))
+         && comstyle == SYNTAX_COMMENT_STYLE (c))
+       {
+         code = Scomment;
+         DEC_POS (from);
+         /* This is apparently the best we can do: */
+         UPDATE_SYNTAX_TABLE_BACKWARD (from);
+         c = FETCH_CHAR (from);
+       }
 
       /* Ignore escaped characters.  */
       if (char_quoted (from))
@@ -492,7 +498,7 @@ Currently, any char-table counts as a syntax table.")
      Lisp_Object object;
 {
   if (CHAR_TABLE_P (object)
-      && XCHAR_TABLE (object)->purpose == Qsyntax_table)
+      && EQ (XCHAR_TABLE (object)->purpose, Qsyntax_table))
     return Qt;
   return Qnil;
 }
@@ -502,7 +508,7 @@ check_syntax_table (obj)
      Lisp_Object obj;
 {
   if (!(CHAR_TABLE_P (obj)
-       && XCHAR_TABLE (obj)->purpose == Qsyntax_table))
+       && EQ (XCHAR_TABLE (obj)->purpose, Qsyntax_table)))
     wrong_type_argument (Qsyntax_table_p, obj);
 }   
 
@@ -659,7 +665,7 @@ DEFUN ("matching-paren", Fmatching_paren, Smatching_paren, 1, 1, 0,
   char_int = XINT (character);
   code = SYNTAX (char_int);
   if (code == Sopen || code == Sclose)
-    return make_number (SYNTAX_MATCH (char_int));
+    return SYNTAX_MATCH (char_int);
   return Qnil;
 }
 
@@ -729,11 +735,11 @@ DEFUN ("modify-syntax-entry", Fmodify_syntax_entry, Smodify_syntax_entry, 2, 3,
   p = XSTRING (newentry)->data;
   code = (enum syntaxcode) syntax_spec_code[*p++];
   if (((int) code & 0377) == 0377)
-    error ("invalid syntax description letter: %c", c);
+    error ("invalid syntax description letter: %c", p[-1]);
 
   if (code == Sinherit)
     {
-      SET_RAW_SYNTAX_ENTRY (syntax_table, c, Qnil);
+      SET_RAW_SYNTAX_ENTRY (syntax_table, XINT (c), Qnil);
       return Qnil;
     }
 
@@ -785,7 +791,7 @@ DEFUN ("modify-syntax-entry", Fmodify_syntax_entry, Smodify_syntax_entry, 2, 3,
     /* Since we can't use a shared object, let's make a new one.  */
     newentry = Fcons (make_number (val), match);
     
-  SET_RAW_SYNTAX_ENTRY (syntax_table, c, newentry);
+  SET_RAW_SYNTAX_ENTRY (syntax_table, XINT (c), newentry);
 
   return Qnil;
 }
@@ -830,7 +836,7 @@ describe_syntax (value)
       return;
     }
 
-  code = (enum syntaxcode) (first & 0377);
+  code = (enum syntaxcode) (XINT (first) & 0377);
   start1 = (XINT (first) >> 16) & 1;
   start2 = (XINT (first) >> 17) & 1;
   end1 = (XINT (first) >> 18) & 1;
@@ -933,12 +939,13 @@ describe_syntax_1 (vector)
 {
   struct buffer *old = current_buffer;
   set_buffer_internal (XBUFFER (Vstandard_output));
-  describe_vector (vector, Qnil, describe_syntax, 0, Qnil, Qnil);
+  describe_vector (vector, Qnil, describe_syntax, 0, Qnil, Qnil, (int *) 0, 0);
   while (! NILP (XCHAR_TABLE (vector)->parent))
     {
       vector = XCHAR_TABLE (vector)->parent;
       insert_string ("\nThe parent syntax table is:");
-      describe_vector (vector, Qnil, describe_syntax, 0, Qnil, Qnil);
+      describe_vector (vector, Qnil, describe_syntax, 0, Qnil, Qnil,
+                      (int *) 0, 0);
     }
        
   call0 (intern ("help-mode"));
@@ -1285,21 +1292,25 @@ skip_chars (forwardp, syntaxp, string, lim)
                  {
                    int savepos = pos;
                    DEC_POS (pos);
+                   UPDATE_SYNTAX_TABLE_BACKWARD (pos);
                    if (!fastmap[(int) SYNTAX (FETCH_CHAR (pos))])
                      {
                        pos = savepos;
                        break;
                      }
-                   UPDATE_SYNTAX_TABLE_BACKWARD (pos - 1);
                  }
              }
            else
              {
-               while (pos > XINT (lim)
-                      && fastmap[(int) SYNTAX (FETCH_BYTE (pos - 1))])
+               while (pos > XINT (lim))
                  {
                    pos--;
-                   UPDATE_SYNTAX_TABLE_BACKWARD (pos - 1);
+                   UPDATE_SYNTAX_TABLE_BACKWARD (pos);
+                   if (!fastmap[(int) SYNTAX (FETCH_BYTE (pos))])
+                     {
+                       pos++;
+                       break;
+                     }
                  }
              }
          }
@@ -1496,9 +1507,15 @@ between them, return t; otherwise return nil.")
 
   while (count1 < 0)
     {
-      while (from > stop)
+      while (1)
        {
          int quoted;
+         if (from <= stop)
+           {
+             SET_PT (stop);
+             immediate_quit = 0;
+             return Qnil;
+           }
 
          DEC_POS (from);
          quoted = char_quoted (from);
@@ -1527,6 +1544,17 @@ between them, return t; otherwise return nil.")
              comstyle = SYNTAX_COMMENT_STYLE (c1);
              from = temp_pos;
            }
+         if (from > stop && SYNTAX_COMSTART_SECOND (c)
+             && (c1 = FETCH_CHAR (temp_pos),
+                 SYNTAX_COMSTART_FIRST (c1))
+             && !char_quoted (temp_pos))
+           {
+             /* We must record the comment style encountered so that
+                later, we can match only the proper comment begin
+                sequence of the same style.  */
+             code = Scomment;
+             from = temp_pos;
+           }
 
          if (code == Scomment_fence)
            {
@@ -1580,7 +1608,7 @@ between them, return t; otherwise return nil.")
                  break;
                }
 #endif /* 0 */
-             found = back_comment (from, stop);
+             found = back_comment (from, stop, comstyle);
              if (found != -1) from = found;
 #if 0
              /* Look back, counting the parity of string-quotes,
@@ -2027,7 +2055,7 @@ scan_lists (from, count, depth, sexpflag)
                  break;
                }
 #endif /* 0 */
-             found = back_comment (from, stop);
+             found = back_comment (from, stop, comstyle);
              if (found != -1) from = found;
 #if 0
              /* Look back, counting the parity of string-quotes,
@@ -2392,12 +2420,10 @@ scan_sexps_forward (stateptr, from, end, targetdepth,
       UPDATE_SYNTAX_TABLE_FORWARD (from);
       code = SYNTAX (FETCH_CHAR (from));
       INC_FROM;
+
       if (code == Scomment)
        state.comstr_start = prev_from;
-      
-      else if (code == Scomment_fence 
-              || (from < end && SYNTAX_COMSTART_FIRST (FETCH_CHAR (prev_from))
-                  && SYNTAX_COMSTART_SECOND (FETCH_CHAR (from))))
+      else if (code == Scomment_fence)
        {
          /* Record the comment style we have entered so that only
             the comment-end sequence of the same style actually
@@ -2409,6 +2435,22 @@ scan_sexps_forward (stateptr, from, end, targetdepth,
          if (code != Scomment_fence) INC_FROM;
          code = Scomment;
        }
+     else if (from < end)
+       if (SYNTAX_COMSTART_FIRST (FETCH_CHAR (prev_from)))
+         if (SYNTAX_COMSTART_SECOND (FETCH_CHAR (from)))
+           /* Duplicate code to avoid a very complex if-expression
+              which causes trouble for the SGI compiler.  */
+           {
+             /* Record the comment style we have entered so that only
+                the comment-end sequence of the same style actually
+                terminates the comment section.  */
+             state.comstyle = ( code == Scomment_fence 
+                                ? ST_COMMENT_STYLE 
+                                : SYNTAX_COMMENT_STYLE (FETCH_CHAR (from)));
+             state.comstr_start = prev_from;
+             if (code != Scomment_fence) INC_FROM;
+             code = Scomment;
+           }
 
       if (SYNTAX_PREFIX (FETCH_CHAR (prev_from)))
        continue;
@@ -2679,7 +2721,7 @@ init_syntax_once ()
   Qchar_table_extra_slots = intern ("char-table-extra-slots");
 
   /* Create objects which can be shared among syntax tables.  */
-  Vsyntax_code_object = Fmake_vector (13, Qnil);
+  Vsyntax_code_object = Fmake_vector (make_number (13), Qnil);
   for (i = 0; i < XVECTOR (Vsyntax_code_object)->size; i++)
     XVECTOR (Vsyntax_code_object)->contents[i]
       = Fcons (make_number (i), Qnil);