X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/38182d901d030c7d65f4aa7a49b583afb30eb9b7..b5071fc755c4f287c7befba1150d91a985762ebd:/src/syntax.c diff --git a/src/syntax.c b/src/syntax.c index de1ab2a751..390d732944 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-1995, 1997-1999, 2001-2012 - Free Software Foundation, Inc. + Copyright (C) 1985, 1987, 1993-1995, 1997-1999, 2001-2013 Free + Software Foundation, Inc. This file is part of GNU Emacs. @@ -20,9 +20,8 @@ along with GNU Emacs. If not, see . */ #include -#include #include -#include + #include "lisp.h" #include "commands.h" #include "character.h" @@ -122,6 +121,7 @@ struct lisp_parse_state /* Char number of start of containing expression */ ptrdiff_t prevlevelstart; ptrdiff_t location; /* Char number at which parsing stopped. */ + ptrdiff_t location_byte; /* Corresponding byte position. */ ptrdiff_t comstr_start; /* Position of last comment/string starter. */ Lisp_Object levelstarts; /* Char numbers of starts-of-expression of levels (starting from outermost). */ @@ -150,6 +150,13 @@ static void scan_sexps_forward (struct lisp_parse_state *, ptrdiff_t, ptrdiff_t, ptrdiff_t, EMACS_INT, int, Lisp_Object, int); static int in_classes (int, Lisp_Object); + +/* This setter is used only in this file, so it can be private. */ +static void +bset_syntax_table (struct buffer *b, Lisp_Object val) +{ + b->INTERNAL_FIELD (syntax_table) = val; +} /* Whether the syntax of the character C has the prefix flag set. */ int syntax_prefix_flag_p (int c) @@ -171,7 +178,7 @@ struct gl_state_s gl_state; /* Global state of syntax parser. */ direction than the intervals - or in an interval. We update the current syntax-table basing on the property of this interval, and update the interval to start further than CHARPOS - or be - NULL_INTERVAL. We also update lim_property to be the next value of + NULL. We also update lim_property to be the next value of charpos to call this subroutine again - or be before/after the start/end of OBJECT. */ @@ -192,7 +199,7 @@ update_syntax_table (ptrdiff_t charpos, EMACS_INT count, int init, i = interval_of (charpos, object); gl_state.backward_i = gl_state.forward_i = i; invalidate = 0; - if (NULL_INTERVAL_P (i)) + if (!i) return; /* interval_of updates only ->position of the return value, so update the parents manually to speed up update_interval. */ @@ -217,7 +224,7 @@ update_syntax_table (ptrdiff_t charpos, EMACS_INT count, int init, /* We are guaranteed to be called with CHARPOS either in i, or further off. */ - if (NULL_INTERVAL_P (i)) + if (!i) error ("Error in syntax_table logic for to-the-end intervals"); else if (charpos < i->position) /* Move left. */ { @@ -287,7 +294,7 @@ update_syntax_table (ptrdiff_t charpos, EMACS_INT count, int init, } } - while (!NULL_INTERVAL_P (i)) + while (i) { if (cnt && !EQ (tmp_table, textget (i->plist, Qsyntax_table))) { @@ -313,7 +320,7 @@ update_syntax_table (ptrdiff_t charpos, EMACS_INT count, int init, /* 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); + + (next_interval (i) ? 0 : 1); gl_state.forward_i = i; } else @@ -326,7 +333,7 @@ update_syntax_table (ptrdiff_t charpos, EMACS_INT count, int init, cnt++; i = count > 0 ? next_interval (i) : previous_interval (i); } - eassert (NULL_INTERVAL_P (i)); /* This property goes to the end. */ + eassert (i == NULL); /* This property goes to the end. */ if (count > 0) gl_state.e_property = gl_state.stop; else @@ -366,7 +373,7 @@ char_quoted (ptrdiff_t charpos, ptrdiff_t bytepos) /* Return the bytepos one character before BYTEPOS. We assume that BYTEPOS is not at the start of the buffer. */ -static inline ptrdiff_t +static ptrdiff_t dec_bytepos (ptrdiff_t bytepos) { if (NILP (BVAR (current_buffer, enable_multibyte_characters))) @@ -819,7 +826,7 @@ It is a copy of the TABLE, which defaults to the standard syntax table. */) /* Only the standard syntax table should have a default element. Other syntax tables should inherit from parents instead. */ - XCHAR_TABLE (copy)->defalt = Qnil; + set_char_table_defalt (copy, Qnil); /* Copied syntax tables should all have parents. If we copied one with no parent, such as the standard syntax table, @@ -836,7 +843,7 @@ One argument, a syntax table. */) { int idx; check_syntax_table (table); - BVAR (current_buffer, syntax_table) = table; + bset_syntax_table (current_buffer, table); /* Indicate that this buffer now has a specified syntax table. */ idx = PER_BUFFER_VAR_IDX (syntax_table); SET_PER_BUFFER_VALUE_P (current_buffer, idx, 1); @@ -915,11 +922,11 @@ DEFUN ("matching-paren", Fmatching_paren, Smatching_paren, 1, 1, 0, } DEFUN ("string-to-syntax", Fstring_to_syntax, Sstring_to_syntax, 1, 1, 0, - doc: /* Convert a syntax specification STRING into syntax cell form. -STRING should be a string as it is allowed as argument of -`modify-syntax-entry'. Value is the equivalent cons cell -\(CODE . MATCHING-CHAR) that can be used as value of a `syntax-table' -text property. */) + doc: /* Convert a syntax descriptor STRING into a raw syntax descriptor. +STRING should be a string of the form allowed as argument of +`modify-syntax-entry'. The return value is a raw syntax descriptor: a +cons cell \(CODE . MATCHING-CHAR) which can be used, for example, as +the value of a `syntax-table' text property. */) (Lisp_Object string) { register const unsigned char *p; @@ -1009,7 +1016,7 @@ The first character of NEWENTRY should be one of the following: " string quote. \\ escape. $ paired delimiter. ' expression quote or prefix operator. < comment starter. > comment ender. - / character-quote. @ inherit from `standard-syntax-table'. + / character-quote. @ inherit from parent table. | generic string fence. ! generic comment fence. Only single-character comment start and end sequences are represented thus. @@ -1152,7 +1159,7 @@ DEFUN ("internal-describe-syntax-value", Finternal_describe_syntax_value, insert_string ("\twhich means: "); - switch (SWITCH_ENUM_CAST (code)) + switch (code) { case Swhitespace: insert_string ("whitespace"); break; @@ -2525,7 +2532,7 @@ scan_lists (register EMACS_INT from, EMACS_INT count, EMACS_INT depth, int sexpf if (prefix) continue; - switch (SWITCH_ENUM_CAST (code)) + switch (code) { case Sescape: case Scharquote: @@ -2702,7 +2709,7 @@ scan_lists (register EMACS_INT from, EMACS_INT count, EMACS_INT depth, int sexpf else if (SYNTAX_FLAGS_PREFIX (syntax)) continue; - switch (SWITCH_ENUM_CAST (code)) + switch (code) { case Sword: case Ssymbol: @@ -3123,7 +3130,7 @@ do { prev_from = from; \ if (SYNTAX_FLAGS_PREFIX (prev_from_syntax)) continue; - switch (SWITCH_ENUM_CAST (code)) + switch (code) { case Sescape: case Scharquote: @@ -3271,6 +3278,7 @@ do { prev_from = from; \ stop: /* Here if stopping before start of sexp. */ from = prev_from; /* We have just fetched the char that starts it; */ + from_byte = prev_from_byte; goto done; /* but return the position before it. */ endquoted: @@ -3282,6 +3290,7 @@ do { prev_from = from; \ state.prevlevelstart = (curlevel == levelstart) ? -1 : (curlevel - 1)->last; state.location = from; + state.location_byte = from_byte; state.levelstarts = Qnil; while (curlevel > levelstart) state.levelstarts = Fcons (make_number ((--curlevel)->last), @@ -3321,7 +3330,8 @@ Fifth arg OLDSTATE is a list like what this function returns. Sixth arg COMMENTSTOP non-nil means stop at the start of a comment. If it is symbol `syntax-table', stop after the start of a comment or a string, or after end of a comment or a string. */) - (Lisp_Object from, Lisp_Object to, Lisp_Object targetdepth, Lisp_Object stopbefore, Lisp_Object oldstate, Lisp_Object commentstop) + (Lisp_Object from, Lisp_Object to, Lisp_Object targetdepth, + Lisp_Object stopbefore, Lisp_Object oldstate, Lisp_Object commentstop) { struct lisp_parse_state state; EMACS_INT target; @@ -3341,7 +3351,7 @@ Sixth arg COMMENTSTOP non-nil means stop at the start of a comment. (NILP (commentstop) ? 0 : (EQ (commentstop, Qsyntax_table) ? -1 : 1))); - SET_PT (state.location); + SET_PT_BOTH (state.location, state.location_byte); return Fcons (make_number (state.depth), Fcons (state.prevlevelstart < 0 @@ -3383,8 +3393,8 @@ init_syntax_once (void) Qchar_table_extra_slots = intern_c_string ("char-table-extra-slots"); /* Create objects which can be shared among syntax tables. */ - Vsyntax_code_object = Fmake_vector (make_number (Smax), Qnil); - for (i = 0; i < ASIZE (Vsyntax_code_object); i++) + Vsyntax_code_object = make_uninit_vector (Smax); + for (i = 0; i < Smax; i++) ASET (Vsyntax_code_object, i, Fcons (make_number (i), Qnil)); /* Now we are ready to set up this property, so we can @@ -3473,9 +3483,9 @@ syms_of_syntax (void) DEFSYM (Qscan_error, "scan-error"); Fput (Qscan_error, Qerror_conditions, - pure_cons (Qscan_error, pure_cons (Qerror, Qnil))); + listn (CONSTYPE_PURE, 2, Qscan_error, Qerror)); Fput (Qscan_error, Qerror_message, - make_pure_c_string ("Scan error")); + build_pure_c_string ("Scan error")); DEFVAR_BOOL ("parse-sexp-ignore-comments", parse_sexp_ignore_comments, doc: /* Non-nil means `forward-sexp', etc., should treat comments as whitespace. */);