emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] Changes to emacs/src/syntax.c [emacs-unicode-2]


From: Miles Bader
Subject: [Emacs-diffs] Changes to emacs/src/syntax.c [emacs-unicode-2]
Date: Mon, 28 Jun 2004 03:55:37 -0400

Index: emacs/src/syntax.c
diff -c emacs/src/syntax.c:1.166.4.4 emacs/src/syntax.c:1.166.4.5
*** emacs/src/syntax.c:1.166.4.4        Fri Apr 16 12:50:49 2004
--- emacs/src/syntax.c  Mon Jun 28 07:29:24 2004
***************
*** 26,31 ****
--- 26,32 ----
  #include "buffer.h"
  #include "character.h"
  #include "keymap.h"
+ #include "regex.h"
  
  /* Make syntax table lookup grant data in gl_state.  */
  #define SYNTAX_ENTRY_VIA_PROPERTY
***************
*** 97,108 ****
  static int find_defun_start P_ ((int, int));
  static int back_comment P_ ((int, int, int, int, int, int *, int *));
  static int char_quoted P_ ((int, int));
! static Lisp_Object skip_chars P_ ((int, Lisp_Object, Lisp_Object));
  static Lisp_Object skip_syntaxes P_ ((int, Lisp_Object, Lisp_Object));
  static Lisp_Object scan_lists P_ ((int, int, int, int));
  static void scan_sexps_forward P_ ((struct lisp_parse_state *,
                                    int, int, int, int,
                                    int, Lisp_Object, int));
  
  
  struct gl_state_s gl_state;           /* Global state of syntax parser.  */
--- 98,110 ----
  static int find_defun_start P_ ((int, int));
  static int back_comment P_ ((int, int, int, int, int, int *, int *));
  static int char_quoted P_ ((int, int));
! static Lisp_Object skip_chars P_ ((int, Lisp_Object, Lisp_Object, int));
  static Lisp_Object skip_syntaxes P_ ((int, Lisp_Object, Lisp_Object));
  static Lisp_Object scan_lists P_ ((int, int, int, int));
  static void scan_sexps_forward P_ ((struct lisp_parse_state *,
                                    int, int, int, int,
                                    int, Lisp_Object, int));
+ static int in_classes P_ ((int, Lisp_Object));
  
  
  struct gl_state_s gl_state;           /* Global state of syntax parser.  */
***************
*** 293,300 ****
  
    while (bytepos >= beg)
      {
        UPDATE_SYNTAX_TABLE_BACKWARD (charpos);
!       code = SYNTAX (FETCH_CHAR_AS_MULTIBYTE (bytepos));
        if (! (code == Scharquote || code == Sescape))
        break;
  
--- 295,305 ----
  
    while (bytepos >= beg)
      {
+       int c;
+ 
        UPDATE_SYNTAX_TABLE_BACKWARD (charpos);
!       c = FETCH_CHAR_AS_MULTIBYTE (bytepos);
!       code = SYNTAX (c);
        if (! (code == Scharquote || code == Sescape))
        break;
  
***************
*** 381,392 ****
    gl_state.use_global = 0;
    while (PT > BEGV)
      {
        /* Open-paren at start of line means we may have found our
         defun-start.  */
!       if (SYNTAX (FETCH_CHAR_AS_MULTIBYTE (PT_BYTE)) == Sopen)
        {
          SETUP_SYNTAX_TABLE (PT + 1, -1);      /* Try again... */
!         if (SYNTAX (FETCH_CHAR_AS_MULTIBYTE (PT_BYTE)) == Sopen)
            break;
          /* Now fallback to the default value.  */
          gl_state.current_syntax_table = current_buffer->syntax_table;
--- 386,401 ----
    gl_state.use_global = 0;
    while (PT > BEGV)
      {
+       int c;
+ 
        /* Open-paren at start of line means we may have found our
         defun-start.  */
!       c = FETCH_CHAR_AS_MULTIBYTE (PT_BYTE);
!       if (SYNTAX (c) == Sopen)
        {
          SETUP_SYNTAX_TABLE (PT + 1, -1);      /* Try again... */
!         c = FETCH_CHAR_AS_MULTIBYTE (PT_BYTE);
!         if (SYNTAX (c) == Sopen)
            break;
          /* Now fallback to the default value.  */
          gl_state.current_syntax_table = current_buffer->syntax_table;
***************
*** 955,961 ****
  DEFUN ("modify-syntax-entry", Fmodify_syntax_entry, Smodify_syntax_entry, 2, 
3,
    "cSet syntax for character: \nsSet syntax for %s to: ",
         doc: /* Set syntax for character CHAR according to string NEWENTRY.
! The syntax is changed only for table SYNTAX_TABLE, which defaults to
   the current buffer's syntax table.
  CHAR may be a cons (MIN . MAX), in which case, syntaxes of all characters
  in the range MIN and MAX are changed.
--- 964,970 ----
  DEFUN ("modify-syntax-entry", Fmodify_syntax_entry, Smodify_syntax_entry, 2, 
3,
    "cSet syntax for character: \nsSet syntax for %s to: ",
         doc: /* Set syntax for character CHAR according to string NEWENTRY.
! The syntax is changed only for table SYNTAX-TABLE, which defaults to
   the current buffer's syntax table.
  CHAR may be a cons (MIN . MAX), in which case, syntaxes of all characters
  in the range MIN and MAX are changed.
***************
*** 1339,1351 ****
   (but not as the end of a range; quoting is never needed there).
  Thus, with arg "a-zA-Z", this skips letters stopping before first nonletter.
  With arg "^a-zA-Z", skips nonletters stopping before first letter.
! Returns the distance traveled, either zero or positive.
! Note that char classes, e.g. `[:alpha:]', are not currently supported;
! they will be treated as literals.  */)
       (string, lim)
       Lisp_Object string, lim;
  {
!   return skip_chars (1, string, lim);
  }
  
  DEFUN ("skip-chars-backward", Fskip_chars_backward, Sskip_chars_backward, 1, 
2, 0,
--- 1348,1360 ----
   (but not as the end of a range; quoting is never needed there).
  Thus, with arg "a-zA-Z", this skips letters stopping before first nonletter.
  With arg "^a-zA-Z", skips nonletters stopping before first letter.
! Char classes, e.g. `[:alpha:]', are supported.
! 
! Returns the distance traveled, either zero or positive.  */)
       (string, lim)
       Lisp_Object string, lim;
  {
!   return skip_chars (1, string, lim, 1);
  }
  
  DEFUN ("skip-chars-backward", Fskip_chars_backward, Sskip_chars_backward, 1, 
2, 0,
***************
*** 1355,1361 ****
       (string, lim)
       Lisp_Object string, lim;
  {
!   return skip_chars (0, string, lim);
  }
  
  DEFUN ("skip-syntax-forward", Fskip_syntax_forward, Sskip_syntax_forward, 1, 
2, 0,
--- 1364,1370 ----
       (string, lim)
       Lisp_Object string, lim;
  {
!   return skip_chars (0, string, lim, 1);
  }
  
  DEFUN ("skip-syntax-forward", Fskip_syntax_forward, Sskip_syntax_forward, 1, 
2, 0,
***************
*** 1383,1391 ****
  }
  
  static Lisp_Object
! skip_chars (forwardp, string, lim)
       int forwardp;
       Lisp_Object string, lim;
  {
    register unsigned int c;
    unsigned char fastmap[0400];
--- 1392,1401 ----
  }
  
  static Lisp_Object
! skip_chars (forwardp, string, lim, handle_iso_classes)
       int forwardp;
       Lisp_Object string, lim;
+      int handle_iso_classes;
  {
    register unsigned int c;
    unsigned char fastmap[0400];
***************
*** 1403,1410 ****
--- 1413,1422 ----
    int size_byte;
    const unsigned char *str;
    int len;
+   Lisp_Object iso_classes;
  
    CHECK_STRING (string);
+   iso_classes = Qnil;
  
    if (NILP (lim))
      XSETINT (lim, forwardp ? ZV : BEGV);
***************
*** 1448,1453 ****
--- 1460,1501 ----
        {
          c = str[i_byte++];
  
+         if (handle_iso_classes && c == '['
+             && i_byte < size_byte
+             && str[i_byte] == ':')
+           {
+             const unsigned char *class_beg = str + i_byte + 1;
+             const unsigned char *class_end = class_beg;
+             const unsigned char *class_limit = str + size_byte - 2;
+             /* Leave room for the null.        */
+             unsigned char class_name[CHAR_CLASS_MAX_LENGTH + 1];
+             re_wctype_t cc;
+ 
+             if (class_limit - class_beg > CHAR_CLASS_MAX_LENGTH)
+               class_limit = class_beg + CHAR_CLASS_MAX_LENGTH;
+ 
+             while (class_end < class_limit
+                    && *class_end >= 'a' && *class_end <= 'z')
+               class_end++;
+ 
+             if (class_end == class_beg
+                 || *class_end != ':' || class_end[1] != ']')
+               goto not_a_class_name;
+ 
+             bcopy (class_beg, class_name, class_end - class_beg);
+             class_name[class_end - class_beg] = 0;
+ 
+             cc = re_wctype (class_name);
+             if (cc == 0)
+               error ("Invalid ISO C character class");
+ 
+             iso_classes = Fcons (make_number (cc), iso_classes);
+ 
+             i_byte = class_end + 2 - str;
+             continue;
+           }
+ 
+       not_a_class_name:
          if (c == '\\')
            {
              if (i_byte == size_byte)
***************
*** 1534,1539 ****
--- 1582,1623 ----
          c = STRING_CHAR_AND_LENGTH (str + i_byte, size_byte-i_byte, len);
          i_byte += len;
  
+         if (handle_iso_classes && c == '['
+             && i_byte < size_byte
+             && STRING_CHAR (str + i_byte, size_byte - i_byte) == ':')
+           {
+             const unsigned char *class_beg = str + i_byte + 1;
+             const unsigned char *class_end = class_beg;
+             const unsigned char *class_limit = str + size_byte - 2;
+             /* Leave room for the null.        */
+             unsigned char class_name[CHAR_CLASS_MAX_LENGTH + 1];
+             re_wctype_t cc;
+ 
+             if (class_limit - class_beg > CHAR_CLASS_MAX_LENGTH)
+               class_limit = class_beg + CHAR_CLASS_MAX_LENGTH;
+ 
+             while (class_end < class_limit
+                    && *class_end >= 'a' && *class_end <= 'z')
+               class_end++;
+ 
+             if (class_end == class_beg
+                 || *class_end != ':' || class_end[1] != ']')
+               goto not_a_class_name_multibyte;
+ 
+             bcopy (class_beg, class_name, class_end - class_beg);
+             class_name[class_end - class_beg] = 0;
+ 
+             cc = re_wctype (class_name);
+             if (cc == 0)
+               error ("Invalid ISO C character class");
+ 
+             iso_classes = Fcons (make_number (cc), iso_classes);
+ 
+             i_byte = class_end + 2 - str;
+             continue;
+           }
+ 
+       not_a_class_name_multibyte:
          if (c == '\\')
            {
              if (i_byte == size_byte)
***************
*** 1643,1655 ****
  
      if (forwardp)
        {
!       endp = (XINT (lim) == GPT) ? GPT_ADDR : CHAR_POS_ADDR (XINT (lim));
!       stop = (pos < GPT && GPT < XINT (lim)) ? GPT_ADDR : endp;
        }
      else
        {
!       endp = CHAR_POS_ADDR (XINT (lim));
!       stop = (pos >= GPT && GPT > XINT (lim)) ? GAP_END_ADDR : endp;
        }
  
      immediate_quit = 1;
--- 1727,1739 ----
  
      if (forwardp)
        {
!       endp = (XINT (lim) == GPT) ? GPT_ADDR : CHAR_POS_ADDR (XINT (lim));
!       stop = (pos < GPT && GPT < XINT (lim)) ? GPT_ADDR : endp;
        }
      else
        {
!       endp = CHAR_POS_ADDR (XINT (lim));
!       stop = (pos >= GPT && GPT > XINT (lim)) ? GAP_END_ADDR : endp;
        }
  
      immediate_quit = 1;
***************
*** 1667,1675 ****
                  p = GAP_END_ADDR;
                  stop = endp;
                }
              if (! fastmap[*p])
                break;
-             c = STRING_CHAR_AND_LENGTH (p, MAX_MULTIBYTE_LENGTH, nbytes);
              if (! ASCII_CHAR_P (c))
                {
                  /* As we are looking at a multibyte character, we
--- 1751,1767 ----
                  p = GAP_END_ADDR;
                  stop = endp;
                }
+             c = STRING_CHAR_AND_LENGTH (p, MAX_MULTIBYTE_LENGTH, nbytes);
+             if (! NILP (iso_classes) && in_classes (c, iso_classes))
+               {
+                 if (negate)
+                   break;
+                 else
+                   goto fwd_ok;
+               }
+ 
              if (! fastmap[*p])
                break;
              if (! ASCII_CHAR_P (c))
                {
                  /* As we are looking at a multibyte character, we
***************
*** 1686,1691 ****
--- 1778,1784 ----
                  if (!(negate ^ (i < n_char_ranges)))
                    break;
                }
+           fwd_ok:
              p += nbytes, pos++, pos_byte += nbytes;
            }
        else
***************
*** 1698,1705 ****
--- 1791,1808 ----
                  p = GAP_END_ADDR;
                  stop = endp;
                }
+ 
+             if (!NILP (iso_classes) && in_classes (*p, iso_classes))
+               {
+                 if (negate)
+                   break;
+                 else
+                   goto fwd_unibyte_ok;
+               }
+ 
              if (!fastmap[*p])
                break;
+           fwd_unibyte_ok:
              p++, pos++, pos_byte++;
            }
        }
***************
*** 1719,1727 ****
                }
              prev_p = p;
              while (--p >= stop && ! CHAR_HEAD_P (*p));
              if (! fastmap[*p])
                break;
-             c = STRING_CHAR (p, MAX_MULTIBYTE_LENGTH);
              if (! ASCII_CHAR_P (c))
                {
                  /* See the comment in the previous similar code.  */
--- 1822,1839 ----
                }
              prev_p = p;
              while (--p >= stop && ! CHAR_HEAD_P (*p));
+             c = STRING_CHAR (p, MAX_MULTIBYTE_LENGTH);
+ 
+             if (! NILP (iso_classes) && in_classes (c, iso_classes))
+               {
+                 if (negate)
+                   break;
+                 else
+                   goto back_ok;
+               }
+ 
              if (! fastmap[*p])
                break;
              if (! ASCII_CHAR_P (c))
                {
                  /* See the comment in the previous similar code.  */
***************
*** 1731,1736 ****
--- 1843,1849 ----
                  if (!(negate ^ (i < n_char_ranges)))
                    break;
                }
+           back_ok:
              pos--, pos_byte -= prev_p - p;
            }
        else
***************
*** 1743,1750 ****
--- 1856,1873 ----
                  p = GPT_ADDR;
                  stop = endp;
                }
+ 
+             if (! NILP (iso_classes) && in_classes (p[-1], iso_classes))
+               {
+                 if (negate)
+                   break;
+                 else
+                   goto back_unibyte_ok;
+               }
+ 
              if (!fastmap[p[-1]])
                break;
+           back_unibyte_ok:
              p--, pos--, pos_byte--;
            }
        }
***************
*** 1927,1932 ****
--- 2050,2079 ----
      return make_number (PT - start_point);
    }
  }
+ 
+ /* Return 1 if character C belongs to one of the ISO classes
+    in the list ISO_CLASSES.  Each class is represented by an
+    integer which is its type according to re_wctype.  */
+ 
+ static int
+ in_classes (c, iso_classes)
+      int c;
+      Lisp_Object iso_classes;
+ {
+   int fits_class = 0;
+ 
+   while (! NILP (iso_classes))
+     {
+       Lisp_Object elt;
+       elt = XCAR (iso_classes);
+       iso_classes = XCDR (iso_classes);
+ 
+       if (re_iswctype (c, XFASTINT (elt)))
+       fits_class = 1;
+     }
+ 
+   return fits_class;
+ }
  
  /* Jump over a comment, assuming we are at the beginning of one.
     FROM is the current position.
***************
*** 2310,2316 ****
          INC_BOTH (from, from_byte);
          UPDATE_SYNTAX_TABLE_FORWARD (from);
          if (from < stop && comstart_first
!             && SYNTAX_COMSTART_SECOND (FETCH_CHAR_AS_MULTIBYTE (from_byte))
              && parse_sexp_ignore_comments)
            {
              /* we have encountered a comment start sequence and we
--- 2457,2464 ----
          INC_BOTH (from, from_byte);
          UPDATE_SYNTAX_TABLE_FORWARD (from);
          if (from < stop && comstart_first
!             && (c = FETCH_CHAR_AS_MULTIBYTE (from_byte),
!                 SYNTAX_COMSTART_SECOND (c))
              && parse_sexp_ignore_comments)
            {
              /* we have encountered a comment start sequence and we
***************
*** 2636,2642 ****
           Fcons (build_string ("Unbalanced parentheses"),
                  Fcons (make_number (last_good),
                         Fcons (make_number (from), Qnil))));
! 
    /* NOTREACHED */
  }
  
--- 2784,2790 ----
           Fcons (build_string ("Unbalanced parentheses"),
                  Fcons (make_number (last_good),
                         Fcons (make_number (from), Qnil))));
!   abort ();
    /* NOTREACHED */
  }
  
***************
*** 2776,2783 ****
  #define INC_FROM                              \
  do { prev_from = from;                                \
       prev_from_byte = from_byte;              \
!      prev_from_syntax                         \
!        = SYNTAX_WITH_FLAGS (FETCH_CHAR_AS_MULTIBYTE (prev_from_byte)); \
       INC_BOTH (from, from_byte);              \
       if (from < end)                          \
         UPDATE_SYNTAX_TABLE_FORWARD (from);    \
--- 2924,2931 ----
  #define INC_FROM                              \
  do { prev_from = from;                                \
       prev_from_byte = from_byte;              \
!      temp = FETCH_CHAR_AS_MULTIBYTE (prev_from_byte); \
!      prev_from_syntax = SYNTAX_WITH_FLAGS (temp); \
       INC_BOTH (from, from_byte);              \
       if (from < end)                          \
         UPDATE_SYNTAX_TABLE_FORWARD (from);    \
***************
*** 2852,2858 ****
    curlevel->last = -1;
  
    SETUP_SYNTAX_TABLE (prev_from, 1);
!   prev_from_syntax = SYNTAX_WITH_FLAGS (FETCH_CHAR (prev_from_byte));
    UPDATE_SYNTAX_TABLE_FORWARD (from);
  
    /* Enter the loop at a place appropriate for initial state.  */
--- 3000,3007 ----
    curlevel->last = -1;
  
    SETUP_SYNTAX_TABLE (prev_from, 1);
!   temp = FETCH_CHAR (prev_from_byte);
!   prev_from_syntax = SYNTAX_WITH_FLAGS (temp);
    UPDATE_SYNTAX_TABLE_FORWARD (from);
  
    /* Enter the loop at a place appropriate for initial state.  */
***************
*** 2931,2937 ****
          while (from < end)
            {
              /* Some compilers can't handle this inside the switch.  */
!             temp = SYNTAX (FETCH_CHAR_AS_MULTIBYTE (from_byte));
              switch (temp)
                {
                case Scharquote:
--- 3080,3087 ----
          while (from < end)
            {
              /* Some compilers can't handle this inside the switch.  */
!             temp = FETCH_CHAR_AS_MULTIBYTE (from_byte);
!             temp = SYNTAX (temp);
              switch (temp)
                {
                case Scharquote:




reply via email to

[Prev in Thread] Current Thread [Next in Thread]