X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/0b5538bd8587cfa6a9c90ff7d0c4699654dbabc6..ee6bb6939fe507dc98986bfc23794da6110f61ef:/src/syntax.c diff --git a/src/syntax.c b/src/syntax.c index 0071dcebd8..052191d5fe 100644 --- a/src/syntax.c +++ b/src/syntax.c @@ -1,6 +1,6 @@ /* GNU Emacs routines to deal with syntax tables; also word and list parsing. Copyright (C) 1985, 1987, 1993, 1994, 1995, 1997, 1998, 1999, 2002, - 2003, 2004, 2005 Free Software Foundation, Inc. + 2003, 2004, 2005, 2006 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -97,10 +97,11 @@ static int find_start_modiff; static int find_defun_start P_ ((int, int)); -static int back_comment P_ ((int, int, int, int, int, int *, int *)); +static int back_comment P_ ((EMACS_INT, EMACS_INT, EMACS_INT, int, int, + EMACS_INT *, EMACS_INT *)); static int char_quoted P_ ((int, int)); static Lisp_Object skip_chars P_ ((int, int, Lisp_Object, Lisp_Object, int)); -static Lisp_Object scan_lists P_ ((int, int, int, int)); +static Lisp_Object scan_lists P_ ((EMACS_INT, EMACS_INT, EMACS_INT, int)); static void scan_sexps_forward P_ ((struct lisp_parse_state *, int, int, int, int, int, Lisp_Object, int)); @@ -133,7 +134,7 @@ update_syntax_table (charpos, count, init, object) { Lisp_Object tmp_table; int cnt = 0, invalidate = 1; - INTERVAL i, oldi; + INTERVAL i; if (init) { @@ -164,7 +165,7 @@ update_syntax_table (charpos, count, init, object) gl_state.e_property = INTERVAL_LAST_POS (i) - gl_state.offset; goto update; } - oldi = i = count > 0 ? gl_state.forward_i : gl_state.backward_i; + i = count > 0 ? gl_state.forward_i : gl_state.backward_i; /* We are guaranteed to be called with CHARPOS either in i, or further off. */ @@ -249,7 +250,8 @@ update_syntax_table (charpos, count, init, object) } else { - gl_state.b_property = i->position + LENGTH (i) - gl_state.offset; + gl_state.b_property + = i->position + LENGTH (i) - gl_state.offset; gl_state.backward_i = i; } return; @@ -258,7 +260,12 @@ update_syntax_table (charpos, count, init, object) { if (count > 0) { - gl_state.e_property = i->position + LENGTH (i) - gl_state.offset; + gl_state.e_property + = i->position + LENGTH (i) - gl_state.offset + /* e_property at EOB is not set to ZV but to ZV+1, so that + we can do INC(from);UPDATE_SYNTAX_TABLE_FORWARD without + having to check eob between the two. */ + + (NULL_INTERVAL_P (next_interval (i)) ? 1 : 0); gl_state.forward_i = i; } else @@ -465,9 +472,9 @@ prev_char_comend_first (pos, pos_byte) static int back_comment (from, from_byte, stop, comnested, comstyle, charpos_ptr, bytepos_ptr) - int from, from_byte, stop; + EMACS_INT from, from_byte, stop; int comnested, comstyle; - int *charpos_ptr, *bytepos_ptr; + EMACS_INT *charpos_ptr, *bytepos_ptr; { /* Look back, counting the parity of string-quotes, and recording the comment-starters seen. @@ -742,9 +749,8 @@ static void check_syntax_table (obj) Lisp_Object obj; { - if (!(CHAR_TABLE_P (obj) - && EQ (XCHAR_TABLE (obj)->purpose, Qsyntax_table))) - wrong_type_argument (Qsyntax_table_p, obj); + CHECK_TYPE (CHAR_TABLE_P (obj) && EQ (XCHAR_TABLE (obj)->purpose, Qsyntax_table), + Qsyntax_table_p, obj); } DEFUN ("syntax-table", Fsyntax_table, Ssyntax_table, 0, 0, 0, @@ -1033,6 +1039,11 @@ usage: (modify-syntax-entry CHAR NEWENTRY &optional SYNTAX-TABLE) */) check_syntax_table (syntax_table); SET_RAW_SYNTAX_ENTRY (syntax_table, XINT (c), Fstring_to_syntax (newentry)); + + /* We clear the regexp cache, since character classes can now have + different values from those in the compiled regexps.*/ + clear_regexp_cache (); + return Qnil; } @@ -1884,9 +1895,10 @@ in_classes (c, iso_classes) static int forw_comment (from, from_byte, stop, nesting, style, prev_syntax, charpos_ptr, bytepos_ptr, incomment_ptr) - int from, from_byte, stop; + EMACS_INT from, from_byte, stop; int nesting, style, prev_syntax; - int *charpos_ptr, *bytepos_ptr, *incomment_ptr; + EMACS_INT *charpos_ptr, *bytepos_ptr; + int *incomment_ptr; { register int c, c1; register enum syntaxcode code; @@ -1986,16 +1998,16 @@ between them, return t; otherwise return nil. */) (count) Lisp_Object count; { - register int from; - int from_byte; - register int stop; + register EMACS_INT from; + EMACS_INT from_byte; + register EMACS_INT stop; register int c, c1; register enum syntaxcode code; int comstyle = 0; /* style of comment encountered */ int comnested = 0; /* whether the comment is nestable or not */ int found; - int count1; - int out_charpos, out_bytepos; + EMACS_INT count1; + EMACS_INT out_charpos, out_bytepos; int dummy; CHECK_NUMBER (count); @@ -2117,8 +2129,6 @@ between them, return t; otherwise return nil. */) while (1) { DEC_BOTH (from, from_byte); - if (from == stop) - break; UPDATE_SYNTAX_TABLE_BACKWARD (from); c = FETCH_CHAR (from_byte); if (SYNTAX (c) == Scomment_fence @@ -2127,6 +2137,8 @@ between them, return t; otherwise return nil. */) found = 1; break; } + else if (from == stop) + break; } if (found == 0) { @@ -2134,6 +2146,9 @@ between them, return t; otherwise return nil. */) from_byte = ini_byte; goto leave; } + else + /* We have skipped one comment. */ + break; } else if (code == Sendcomment) { @@ -2190,11 +2205,12 @@ between them, return t; otherwise return nil. */) static Lisp_Object scan_lists (from, count, depth, sexpflag) - register int from; - int count, depth, sexpflag; + register EMACS_INT from; + EMACS_INT count, depth; + int sexpflag; { Lisp_Object val; - register int stop = count > 0 ? ZV : BEGV; + register EMACS_INT stop = count > 0 ? ZV : BEGV; register int c, c1; int stringterm; int quoted; @@ -2203,11 +2219,11 @@ scan_lists (from, count, depth, sexpflag) int min_depth = depth; /* Err out if depth gets less than this. */ int comstyle = 0; /* style of comment encountered */ int comnested = 0; /* whether the comment is nestable or not */ - int temp_pos; - int last_good = from; + EMACS_INT temp_pos; + EMACS_INT last_good = from; int found; - int from_byte; - int out_bytepos, out_charpos; + EMACS_INT from_byte; + EMACS_INT out_bytepos, out_charpos; int temp, dummy; int multibyte_symbol_p = sexpflag && multibyte_syntax_as_symbol; @@ -2336,10 +2352,9 @@ scan_lists (from, count, depth, sexpflag) close1: if (!--depth) goto done; if (depth < min_depth) - Fsignal (Qscan_error, - Fcons (build_string ("Containing expression ends prematurely"), - Fcons (make_number (last_good), - Fcons (make_number (from), Qnil)))); + xsignal3 (Qscan_error, + build_string ("Containing expression ends prematurely"), + make_number (last_good), make_number (from)); break; case Sstring: @@ -2488,10 +2503,9 @@ scan_lists (from, count, depth, sexpflag) open2: if (!--depth) goto done2; if (depth < min_depth) - Fsignal (Qscan_error, - Fcons (build_string ("Containing expression ends prematurely"), - Fcons (make_number (last_good), - Fcons (make_number (from), Qnil)))); + xsignal3 (Qscan_error, + build_string ("Containing expression ends prematurely"), + make_number (last_good), make_number (from)); break; case Sendcomment: @@ -2560,12 +2574,9 @@ scan_lists (from, count, depth, sexpflag) return val; lose: - Fsignal (Qscan_error, - Fcons (build_string ("Unbalanced parentheses"), - Fcons (make_number (last_good), - Fcons (make_number (from), Qnil)))); - abort (); - /* NOTREACHED */ + xsignal3 (Qscan_error, + build_string ("Unbalanced parentheses"), + make_number (last_good), make_number (from)); } DEFUN ("scan-lists", Fscan_lists, Sscan_lists, 3, 3, 0, @@ -2691,7 +2702,7 @@ scan_sexps_forward (stateptr, from, from_byte, end, targetdepth, int boundary_stop = commentstop == -1; int nofence; int found; - int out_bytepos, out_charpos; + EMACS_INT out_bytepos, out_charpos; int temp; prev_from = from; @@ -3014,7 +3025,7 @@ Parsing stops at TO or when certain criteria are met; point is set to where parsing stops. If fifth arg OLDSTATE is omitted or nil, parsing assumes that FROM is the beginning of a function. -Value is a list of ten elements describing final state of parsing: +Value is a list of elements describing final state of parsing: 0. depth in parens. 1. character address of start of innermost containing list; nil if none. 2. character address of start of last complete sexp terminated. @@ -3033,7 +3044,7 @@ If third arg TARGETDEPTH is non-nil, parsing stops if the depth in parentheses becomes equal to TARGETDEPTH. Fourth arg STOPBEFORE non-nil means stop when come to any character that starts a sexp. -Fifth arg OLDSTATE is a nine-element list like what this function returns. +Fifth arg OLDSTATE is a list like what this function returns. It is used to initialize the state of the parse. Elements number 1, 2, 6 and 8 are ignored; you can leave off element 8 (the last) entirely. Sixth arg COMMENTSTOP non-nil means stop at the start of a comment. @@ -3113,6 +3124,20 @@ init_syntax_once () Vstandard_syntax_table = Fmake_char_table (Qsyntax_table, temp); + /* Control characters should not be whitespace. */ + temp = XVECTOR (Vsyntax_code_object)->contents[(int) Spunct]; + for (i = 0; i <= ' ' - 1; i++) + SET_RAW_SYNTAX_ENTRY (Vstandard_syntax_table, i, temp); + SET_RAW_SYNTAX_ENTRY (Vstandard_syntax_table, 0177, temp); + + /* Except that a few really are whitespace. */ + temp = XVECTOR (Vsyntax_code_object)->contents[(int) Swhitespace]; + SET_RAW_SYNTAX_ENTRY (Vstandard_syntax_table, ' ', temp); + SET_RAW_SYNTAX_ENTRY (Vstandard_syntax_table, '\t', temp); + SET_RAW_SYNTAX_ENTRY (Vstandard_syntax_table, '\n', temp); + SET_RAW_SYNTAX_ENTRY (Vstandard_syntax_table, 015, temp); + SET_RAW_SYNTAX_ENTRY (Vstandard_syntax_table, 014, temp); + temp = XVECTOR (Vsyntax_code_object)->contents[(int) Sword]; for (i = 'a'; i <= 'z'; i++) SET_RAW_SYNTAX_ENTRY (Vstandard_syntax_table, i, temp);