X-Git-Url: https://git.hcoop.net/bpt/emacs.git/blobdiff_plain/fca8fe46b72cab72cc06a7b20f6750d641959b7c..acaf905b1130aae80fa59d2c861ffd4c8eb75486:/src/syntax.c diff --git a/src/syntax.c b/src/syntax.c index 892cec6569..bb473a52b3 100644 --- a/src/syntax.c +++ b/src/syntax.c @@ -1,5 +1,5 @@ /* GNU Emacs routines to deal with syntax tables; also word and list parsing. - Copyright (C) 1985, 1987, 1993-1995, 1997-1999, 2001-2011 + Copyright (C) 1985, 1987, 1993-1995, 1997-1999, 2001-2012 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -19,7 +19,9 @@ along with GNU Emacs. If not, see . */ #include + #include +#include #include #include "lisp.h" #include "commands.h" @@ -95,12 +97,15 @@ along with GNU Emacs. If not, see . */ #define ST_COMMENT_STYLE (256 + 1) #define ST_STRING_STYLE (256 + 2) -Lisp_Object Qsyntax_table_p, Qsyntax_table, Qscan_error; +static Lisp_Object Qsyntax_table_p; +static Lisp_Object Qsyntax_table, Qscan_error; +#ifndef __GNUC__ /* Used as a temporary in SYNTAX_ENTRY and other macros in syntax.h, if not compiled with GCC. No need to mark it, since it is used only very temporarily. */ Lisp_Object syntax_temp; +#endif /* This is the internal form of the parse state used in parse-partial-sexp. */ @@ -138,6 +143,7 @@ static EMACS_INT find_start_begv; static int find_start_modiff; +static Lisp_Object Fsyntax_table_p (Lisp_Object); static Lisp_Object skip_chars (int, Lisp_Object, Lisp_Object, int); static Lisp_Object skip_syntaxes (int, Lisp_Object, Lisp_Object); static Lisp_Object scan_lists (EMACS_INT, EMACS_INT, EMACS_INT, int); @@ -171,11 +177,12 @@ struct gl_state_s gl_state; /* Global state of syntax parser. */ start/end of OBJECT. */ void -update_syntax_table (EMACS_INT charpos, int count, int init, +update_syntax_table (EMACS_INT charpos, EMACS_INT count, int init, Lisp_Object object) { Lisp_Object tmp_table; - int cnt = 0, invalidate = 1; + unsigned cnt = 0; + int invalidate = 1; INTERVAL i; if (init) @@ -360,7 +367,7 @@ char_quoted (EMACS_INT charpos, EMACS_INT bytepos) /* Return the bytepos one character before BYTEPOS. We assume that BYTEPOS is not at the start of the buffer. */ -static INLINE EMACS_INT +static inline EMACS_INT dec_bytepos (EMACS_INT bytepos) { if (NILP (BVAR (current_buffer, enable_multibyte_characters))) @@ -391,7 +398,12 @@ find_defun_start (EMACS_INT pos, EMACS_INT pos_byte) if (!open_paren_in_column_0_is_defun_start) { + find_start_value = BEGV; find_start_value_byte = BEGV_BYTE; + find_start_buffer = current_buffer; + find_start_modiff = MODIFF; + find_start_begv = BEGV; + find_start_pos = pos; return BEGV; } @@ -974,7 +986,7 @@ text property. */) break; } - if (val < XVECTOR (Vsyntax_code_object)->size && NILP (match)) + if (val < ASIZE (Vsyntax_code_object) && NILP (match)) return XVECTOR (Vsyntax_code_object)->contents[val]; else /* Since we can't use a shared object, let's make a new one. */ @@ -1365,8 +1377,6 @@ and the function returns nil. Field boundaries are not noticed if return val == orig_val ? Qt : Qnil; } -Lisp_Object skip_chars (int, Lisp_Object, Lisp_Object, int); - DEFUN ("skip-chars-forward", Fskip_chars_forward, Sskip_chars_forward, 1, 2, 0, doc: /* Move point forward, stopping before a char not in STRING, or at pos LIM. STRING is like the inside of a `[...]' in a regular expression @@ -1540,7 +1550,8 @@ skip_chars (int forwardp, Lisp_Object string, Lisp_Object lim, int handle_iso_cl if (c <= c2) { - while (c <= c2) + unsigned lim2 = c2 + 1; + while (c < lim2) fastmap[c++] = 1; if (! ASCII_CHAR_P (c2)) string_has_eight_bit = 1; @@ -1680,7 +1691,8 @@ skip_chars (int forwardp, Lisp_Object string, Lisp_Object lim, int handle_iso_cl } if (! ASCII_CHAR_P (c)) { - while (leading_code <= leading_code2) + unsigned lim2 = leading_code2 + 1; + while (leading_code < lim2) fastmap[leading_code++] = 1; if (c <= c2) { @@ -1712,9 +1724,9 @@ skip_chars (int forwardp, Lisp_Object string, Lisp_Object lim, int handle_iso_cl for (i = 0; i < n_char_ranges; i += 2) { int c1 = char_ranges[i]; - int c2 = char_ranges[i + 1]; + unsigned lim2 = char_ranges[i + 1] + 1; - for (; c1 <= c2; c1++) + for (; c1 < lim2; c1++) { int b = CHAR_TO_BYTE_SAFE (c1); if (b >= 0) @@ -3355,8 +3367,7 @@ init_syntax_once (void) Lisp_Object temp; /* This has to be done here, before we call Fmake_char_table. */ - Qsyntax_table = intern_c_string ("syntax-table"); - staticpro (&Qsyntax_table); + DEFSYM (Qsyntax_table, "syntax-table"); /* Intern_C_String this now in case it isn't already done. Setting this variable twice is harmless. @@ -3365,7 +3376,7 @@ init_syntax_once (void) /* Create objects which can be shared among syntax tables. */ Vsyntax_code_object = Fmake_vector (make_number (Smax), Qnil); - for (i = 0; i < XVECTOR (Vsyntax_code_object)->size; i++) + for (i = 0; i < ASIZE (Vsyntax_code_object); i++) XVECTOR (Vsyntax_code_object)->contents[i] = Fcons (make_number (i), Qnil); @@ -3441,8 +3452,7 @@ init_syntax_once (void) void syms_of_syntax (void) { - Qsyntax_table_p = intern_c_string ("syntax-table-p"); - staticpro (&Qsyntax_table_p); + DEFSYM (Qsyntax_table_p, "syntax-table-p"); staticpro (&Vsyntax_code_object); @@ -3454,8 +3464,7 @@ syms_of_syntax (void) /* Defined in regex.c */ staticpro (&re_match_object); - Qscan_error = intern_c_string ("scan-error"); - staticpro (&Qscan_error); + DEFSYM (Qscan_error, "scan-error"); Fput (Qscan_error, Qerror_conditions, pure_cons (Qscan_error, pure_cons (Qerror, Qnil))); Fput (Qscan_error, Qerror_message,