Declare Lisp_Object Q* variables to be 'static' if not exproted.
[bpt/emacs.git] / src / syntax.h
CommitLineData
9889c728 1/* Declarations having to do with GNU Emacs syntax tables.
95df8112
GM
2
3Copyright (C) 1985, 1993-1994, 1997-1998, 2001-2011
4 Free Software Foundation, Inc.
9889c728
JB
5
6This file is part of GNU Emacs.
7
b9b1cc14 8GNU Emacs is free software: you can redistribute it and/or modify
9889c728 9it under the terms of the GNU General Public License as published by
b9b1cc14
GM
10the Free Software Foundation, either version 3 of the License, or
11(at your option) any later version.
9889c728
JB
12
13GNU Emacs is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
b9b1cc14 19along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
9889c728
JB
20
21
4f3a2f8d 22extern void update_syntax_table (EMACS_INT, int, int, Lisp_Object);
9889c728
JB
23
24/* The standard syntax table is stored where it will automatically
25 be used in all new buffers. */
4b4deea2 26#define Vstandard_syntax_table BVAR (&buffer_defaults, syntax_table)
9889c728 27
e46c910e
RS
28/* A syntax table is a chartable whose elements are cons cells
29 (CODE+FLAGS . MATCHING-CHAR). MATCHING-CHAR can be nil if the char
30 is not a kind of parenthesis.
9889c728 31
e46c910e 32 The low 8 bits of CODE+FLAGS is a code, as follows: */
9889c728
JB
33
34enum syntaxcode
35 {
36 Swhitespace, /* for a whitespace character */
37 Spunct, /* for random punctuation characters */
38 Sword, /* for a word constituent */
39 Ssymbol, /* symbol constituent but not word constituent */
40 Sopen, /* for a beginning delimiter */
41 Sclose, /* for an ending delimiter */
42 Squote, /* for a prefix character like Lisp ' */
43 Sstring, /* for a string-grouping character like Lisp " */
5eea1c5a 44 Smath, /* for delimiters like $ in Tex. */
9889c728
JB
45 Sescape, /* for a character that begins a C-style escape */
46 Scharquote, /* for a character that quotes the following character */
47 Scomment, /* for a comment-starting character */
48 Sendcomment, /* for a comment-ending character */
c8cdcb16 49 Sinherit, /* use the standard syntax table for this character */
5eea1c5a 50 Scomment_fence, /* Starts/ends comment which is delimited on the
47ab3db5 51 other side by any char with the same syntaxcode. */
5eea1c5a 52 Sstring_fence, /* Starts/ends string which is delimited on the
47ab3db5 53 other side by any char with the same syntaxcode. */
9889c728
JB
54 Smax /* Upper bound on codes that are meaningful */
55 };
56
e0b8ff93 57/* Set the syntax entry VAL for char C in table TABLE. */
e46c910e 58
f4926ee8 59#define SET_RAW_SYNTAX_ENTRY(table, c, val) \
dcb82a5e 60 CHAR_TABLE_SET ((table), c, (val))
e0b8ff93 61
f4926ee8
KH
62/* Set the syntax entry VAL for char-range RANGE in table TABLE.
63 RANGE is a cons (FROM . TO) specifying the range of characters. */
e0b8ff93 64
f4926ee8
KH
65#define SET_RAW_SYNTAX_ENTRY_RANGE(table, range, val) \
66 Fset_char_table_range ((table), (range), (val))
9889c728 67
5eea1c5a 68/* SYNTAX_ENTRY fetches the information from the entry for character C
177c0ea7 69 in syntax table TABLE, or from globally kept data (gl_state).
5eea1c5a
RS
70 Does inheritance. */
71/* CURRENT_SYNTAX_TABLE gives the syntax table valid for current
72 position, it is either the buffer's syntax table, or syntax table
73 found in text properties. */
74
75#ifdef SYNTAX_ENTRY_VIA_PROPERTY
76# define SYNTAX_ENTRY(c) \
77 (gl_state.use_global ? gl_state.global_code : SYNTAX_ENTRY_INT (c))
78# define CURRENT_SYNTAX_TABLE gl_state.current_syntax_table
79#else
80# define SYNTAX_ENTRY SYNTAX_ENTRY_INT
4b4deea2 81# define CURRENT_SYNTAX_TABLE BVAR (current_buffer, syntax_table)
5eea1c5a 82#endif
e0b8ff93 83
501d7ac6 84#define SYNTAX_ENTRY_INT(c) CHAR_TABLE_REF (CURRENT_SYNTAX_TABLE, (c))
e0b8ff93 85
e46c910e 86/* Extract the information from the entry for character C
e0b8ff93 87 in the current syntax table. */
c8cdcb16
RS
88
89#ifdef __GNUC__
e46c910e 90#define SYNTAX(c) \
874757e8
AS
91 ({ Lisp_Object _syntax_temp; \
92 _syntax_temp = SYNTAX_ENTRY (c); \
93 (CONSP (_syntax_temp) \
94 ? (enum syntaxcode) (XINT (XCAR (_syntax_temp)) & 0xff) \
e0b8ff93 95 : Swhitespace); })
e46c910e
RS
96
97#define SYNTAX_WITH_FLAGS(c) \
874757e8
AS
98 ({ Lisp_Object _syntax_temp; \
99 _syntax_temp = SYNTAX_ENTRY (c); \
100 (CONSP (_syntax_temp) \
101 ? XINT (XCAR (_syntax_temp)) \
e0b8ff93 102 : (int) Swhitespace); })
e46c910e
RS
103
104#define SYNTAX_MATCH(c) \
874757e8
AS
105 ({ Lisp_Object _syntax_temp; \
106 _syntax_temp = SYNTAX_ENTRY (c); \
107 (CONSP (_syntax_temp) \
108 ? XCDR (_syntax_temp) \
e0b8ff93 109 : Qnil); })
c8cdcb16 110#else
3d7db6f1 111extern Lisp_Object syntax_temp;
e46c910e 112#define SYNTAX(c) \
9d40ebd2 113 (syntax_temp = SYNTAX_ENTRY ((c)), \
e46c910e 114 (CONSP (syntax_temp) \
3331fb06 115 ? (enum syntaxcode) (XINT (XCAR (syntax_temp)) & 0xff) \
e0b8ff93 116 : Swhitespace))
e46c910e
RS
117
118#define SYNTAX_WITH_FLAGS(c) \
9d40ebd2 119 (syntax_temp = SYNTAX_ENTRY ((c)), \
e46c910e 120 (CONSP (syntax_temp) \
3331fb06 121 ? XINT (XCAR (syntax_temp)) \
e0b8ff93 122 : (int) Swhitespace))
e46c910e
RS
123
124#define SYNTAX_MATCH(c) \
9d40ebd2 125 (syntax_temp = SYNTAX_ENTRY ((c)), \
e46c910e 126 (CONSP (syntax_temp) \
3331fb06 127 ? XCDR (syntax_temp) \
e0b8ff93 128 : Qnil))
c8cdcb16 129#endif
9889c728 130
a306d6f1 131
c5683ceb
SM
132/* Whether the syntax of the character C has the prefix flag set. */
133extern int syntax_prefix_flag_p (int c);
c0364919 134
9889c728
JB
135/* This array, indexed by a character, contains the syntax code which that
136 character signifies (as a char). For example,
5eea1c5a 137 (enum syntaxcode) syntax_spec_code['w'] is Sword. */
9889c728
JB
138
139extern unsigned char syntax_spec_code[0400];
140
5eea1c5a
RS
141/* Indexed by syntax code, give the letter that describes it. */
142
143extern char syntax_code_spec[16];
144
c292db29 145/* Convert the byte offset BYTEPOS into a character position,
2f16e7fd
RS
146 for the object recorded in gl_state with SETUP_SYNTAX_TABLE_FOR_OBJECT.
147
148 The value is meant for use in the UPDATE_SYNTAX_TABLE... macros.
149 These macros do nothing when parse_sexp_lookup_properties is 0,
150 so we return 0 in that case, for speed. */
c292db29
RS
151
152#define SYNTAX_TABLE_BYTE_TO_CHAR(bytepos) \
2f16e7fd
RS
153 (! parse_sexp_lookup_properties \
154 ? 0 \
155 : STRINGP (gl_state.object) \
c292db29
RS
156 ? string_byte_to_char (gl_state.object, (bytepos)) \
157 : BUFFERP (gl_state.object) \
f79b4b7e
KH
158 ? buf_bytepos_to_charpos (XBUFFER (gl_state.object), \
159 (bytepos) + BUF_BEGV_BYTE (XBUFFER (gl_state.object)) - 1) - BUF_BEGV (XBUFFER (gl_state.object)) + 1 \
c292db29 160 : NILP (gl_state.object) \
f79b4b7e 161 ? BYTE_TO_CHAR ((bytepos) + BEGV_BYTE - 1) - BEGV + 1 \
c292db29
RS
162 : (bytepos))
163
f79b4b7e
KH
164/* Make syntax table state (gl_state) good for CHARPOS, assuming it is
165 currently good for a position before CHARPOS. */
5eea1c5a 166
f79b4b7e 167#define UPDATE_SYNTAX_TABLE_FORWARD(charpos) \
2f16e7fd 168 (parse_sexp_lookup_properties \
f79b4b7e
KH
169 && (charpos) >= gl_state.e_property \
170 ? (update_syntax_table ((charpos) + gl_state.offset, 1, 0, \
c292db29
RS
171 gl_state.object), \
172 1) \
173 : 0)
5eea1c5a 174
f79b4b7e
KH
175/* Make syntax table state (gl_state) good for CHARPOS, assuming it is
176 currently good for a position after CHARPOS. */
5eea1c5a 177
f79b4b7e 178#define UPDATE_SYNTAX_TABLE_BACKWARD(charpos) \
2f16e7fd 179 (parse_sexp_lookup_properties \
4948e1f2 180 && (charpos) < gl_state.b_property \
f79b4b7e 181 ? (update_syntax_table ((charpos) + gl_state.offset, -1, 0, \
c292db29
RS
182 gl_state.object), \
183 1) \
184 : 0)
e2d8d746 185
f79b4b7e 186/* Make syntax table good for CHARPOS. */
e2d8d746 187
f79b4b7e 188#define UPDATE_SYNTAX_TABLE(charpos) \
2f16e7fd 189 (parse_sexp_lookup_properties \
4948e1f2 190 && (charpos) < gl_state.b_property \
f79b4b7e 191 ? (update_syntax_table ((charpos) + gl_state.offset, -1, 0, \
c292db29
RS
192 gl_state.object), \
193 1) \
2f16e7fd 194 : (parse_sexp_lookup_properties \
f79b4b7e
KH
195 && (charpos) >= gl_state.e_property \
196 ? (update_syntax_table ((charpos) + gl_state.offset, 1, 0,\
c292db29
RS
197 gl_state.object), \
198 1) \
199 : 0))
5eea1c5a 200
d48cd3f4
SM
201/* This macro sets up the buffer-global syntax table. */
202#define SETUP_BUFFER_SYNTAX_TABLE() \
203do \
204 { \
205 gl_state.use_global = 0; \
4b4deea2 206 gl_state.current_syntax_table = BVAR (current_buffer, syntax_table); \
d48cd3f4
SM
207 } while (0)
208
5eea1c5a
RS
209/* This macro should be called with FROM at the start of forward
210 search, or after the last position of the backward search. It
211 makes sure that the first char is picked up with correct table, so
212 one does not need to call UPDATE_SYNTAX_TABLE immediately after the
177c0ea7 213 call.
5eea1c5a
RS
214 Sign of COUNT gives the direction of the search.
215 */
216
c292db29 217#define SETUP_SYNTAX_TABLE(FROM, COUNT) \
92413ef3 218do \
2f16e7fd 219 { \
d48cd3f4 220 SETUP_BUFFER_SYNTAX_TABLE (); \
4948e1f2 221 gl_state.b_property = BEGV; \
2f16e7fd
RS
222 gl_state.e_property = ZV + 1; \
223 gl_state.object = Qnil; \
2f16e7fd 224 gl_state.offset = 0; \
2f16e7fd 225 if (parse_sexp_lookup_properties) \
9b9794f0
RS
226 if ((COUNT) > 0 || (FROM) > BEGV) \
227 update_syntax_table ((COUNT) > 0 ? (FROM) : (FROM) - 1, (COUNT),\
228 1, Qnil); \
2f16e7fd 229 } \
92413ef3 230while (0)
5eea1c5a
RS
231
232/* Same as above, but in OBJECT. If OBJECT is nil, use current buffer.
e2d8d746
RS
233 If it is t, ignore properties altogether.
234
235 This is meant for regex.c to use. For buffers, regex.c passes arguments
236 to the UPDATE_SYNTAX_TABLE macros which are relative to BEGV.
4bbd5bc3 237 So if it is a buffer, we set the offset field to BEGV. */
5eea1c5a 238
c292db29 239#define SETUP_SYNTAX_TABLE_FOR_OBJECT(OBJECT, FROM, COUNT) \
92413ef3 240do \
4bbd5bc3 241 { \
d48cd3f4 242 SETUP_BUFFER_SYNTAX_TABLE (); \
c292db29
RS
243 gl_state.object = (OBJECT); \
244 if (BUFFERP (gl_state.object)) \
245 { \
246 struct buffer *buf = XBUFFER (gl_state.object); \
4948e1f2 247 gl_state.b_property = 1; \
1d1293dd 248 gl_state.e_property = BUF_ZV (buf) - BUF_BEGV (buf) + 1; \
c292db29
RS
249 gl_state.offset = BUF_BEGV (buf) - 1; \
250 } \
251 else if (NILP (gl_state.object)) \
4bbd5bc3 252 { \
4948e1f2 253 gl_state.b_property = 1; \
1d1293dd 254 gl_state.e_property = ZV - BEGV + 1; \
4bbd5bc3
RS
255 gl_state.offset = BEGV - 1; \
256 } \
c292db29 257 else if (EQ (gl_state.object, Qt)) \
4bbd5bc3 258 { \
4948e1f2 259 gl_state.b_property = 0; \
4bbd5bc3
RS
260 gl_state.e_property = 1500000000; \
261 gl_state.offset = 0; \
262 } \
263 else \
264 { \
4948e1f2 265 gl_state.b_property = 0; \
d5db4077 266 gl_state.e_property = 1 + SCHARS (gl_state.object); \
4bbd5bc3
RS
267 gl_state.offset = 0; \
268 } \
4bbd5bc3 269 if (parse_sexp_lookup_properties) \
f79b4b7e 270 update_syntax_table (((FROM) + gl_state.offset \
c292db29
RS
271 + (COUNT > 0 ? 0 : -1)), \
272 COUNT, 1, gl_state.object); \
4bbd5bc3 273 } \
92413ef3 274while (0)
5eea1c5a
RS
275
276struct gl_state_s
277{
c292db29 278 Lisp_Object object; /* The object we are scanning. */
5eea1c5a
RS
279 int start; /* Where to stop. */
280 int stop; /* Where to stop. */
281 int use_global; /* Whether to use global_code
282 or c_s_t. */
283 Lisp_Object global_code; /* Syntax code of current char. */
284 Lisp_Object current_syntax_table; /* Syntax table for current pos. */
285 Lisp_Object old_prop; /* Syntax-table prop at prev pos. */
4948e1f2 286 int b_property; /* First index where c_s_t is valid. */
5eea1c5a
RS
287 int e_property; /* First index where c_s_t is
288 not valid. */
289 INTERVAL forward_i; /* Where to start lookup on forward */
290 INTERVAL backward_i; /* or backward movement. The
291 data in c_s_t is valid
292 between these intervals,
293 and possibly at the
294 intervals too, depending
295 on: */
e2d8d746
RS
296 /* Offset for positions specified to UPDATE_SYNTAX_TABLE. */
297 int offset;
5eea1c5a
RS
298};
299
300extern struct gl_state_s gl_state;
4f3a2f8d 301extern EMACS_INT scan_words (EMACS_INT, EMACS_INT);