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