[Top][All Lists]
[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:
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Emacs-diffs] Changes to emacs/src/syntax.c [emacs-unicode-2],
Miles Bader <=