aboutsummaryrefslogtreecommitdiffstats
path: root/src/syntax.h
diff options
context:
space:
mode:
authorBill Wohler2014-02-23 18:04:35 -0800
committerBill Wohler2014-02-23 18:04:35 -0800
commit3e93bafb95608467e438ba7f725fd1f020669f8c (patch)
treef2f90109f283e06a18caea3cb2a2623abcfb3a92 /src/syntax.h
parent791c0d7634e44bb92ca85af605be84ff2ae08963 (diff)
parente918e27fdf331e89268fc2c9d7cf838d3ecf7aa7 (diff)
downloademacs-3e93bafb95608467e438ba7f725fd1f020669f8c.tar.gz
emacs-3e93bafb95608467e438ba7f725fd1f020669f8c.zip
Merge from trunk; up to 2014-02-23T23:41:17Z!lekktu@gmail.com.
Diffstat (limited to 'src/syntax.h')
-rw-r--r--src/syntax.h332
1 files changed, 120 insertions, 212 deletions
diff --git a/src/syntax.h b/src/syntax.h
index c9af240df0c..549ca4a828e 100644
--- a/src/syntax.h
+++ b/src/syntax.h
@@ -1,6 +1,6 @@
1/* Declarations having to do with GNU Emacs syntax tables. 1/* Declarations having to do with GNU Emacs syntax tables.
2 2
3Copyright (C) 1985, 1993-1994, 1997-1998, 2001-2013 Free Software 3Copyright (C) 1985, 1993-1994, 1997-1998, 2001-2014 Free Software
4Foundation, Inc. 4Foundation, Inc.
5 5
6This file is part of GNU Emacs. 6This file is part of GNU Emacs.
@@ -18,8 +18,9 @@ GNU General Public License for more details.
18You should have received a copy of the GNU General Public License 18You should have received a copy of the GNU General Public License
19along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ 19along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
20 20
21INLINE_HEADER_BEGIN
21 22
22extern void update_syntax_table (ptrdiff_t, EMACS_INT, int, Lisp_Object); 23extern void update_syntax_table (ptrdiff_t, EMACS_INT, bool, Lisp_Object);
23 24
24/* The standard syntax table is stored where it will automatically 25/* The standard syntax table is stored where it will automatically
25 be used in all new buffers. */ 26 be used in all new buffers. */
@@ -54,249 +55,156 @@ enum syntaxcode
54 Smax /* Upper bound on codes that are meaningful */ 55 Smax /* Upper bound on codes that are meaningful */
55 }; 56 };
56 57
57/* Set the syntax entry VAL for char C in table TABLE. */
58 58
59#define SET_RAW_SYNTAX_ENTRY(table, c, val) \ 59struct gl_state_s
60 CHAR_TABLE_SET ((table), c, (val)) 60{
61 61 Lisp_Object object; /* The object we are scanning. */
62/* Set the syntax entry VAL for char-range RANGE in table TABLE. 62 ptrdiff_t start; /* Where to stop. */
63 RANGE is a cons (FROM . TO) specifying the range of characters. */ 63 ptrdiff_t stop; /* Where to stop. */
64 bool use_global; /* Whether to use global_code
65 or c_s_t. */
66 Lisp_Object global_code; /* Syntax code of current char. */
67 Lisp_Object current_syntax_table; /* Syntax table for current pos. */
68 Lisp_Object old_prop; /* Syntax-table prop at prev pos. */
69 ptrdiff_t b_property; /* First index where c_s_t is valid. */
70 ptrdiff_t e_property; /* First index where c_s_t is
71 not valid. */
72 INTERVAL forward_i; /* Where to start lookup on forward */
73 INTERVAL backward_i; /* or backward movement. The
74 data in c_s_t is valid
75 between these intervals,
76 and possibly at the
77 intervals too, depending
78 on: */
79 /* Offset for positions specified to UPDATE_SYNTAX_TABLE. */
80 ptrdiff_t offset;
81};
64 82
65#define SET_RAW_SYNTAX_ENTRY_RANGE(table, range, val) \ 83extern struct gl_state_s gl_state;
66 Fset_char_table_range ((table), (range), (val))
67 84
68/* SYNTAX_ENTRY fetches the information from the entry for character C 85/* Fetch the information from the entry for character C
69 in syntax table TABLE, or from globally kept data (gl_state). 86 in the current buffer's syntax table,
87 or (if VIA_PROPERTY) from globally kept data (gl_state).
70 Does inheritance. */ 88 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 89
75#ifdef SYNTAX_ENTRY_VIA_PROPERTY 90INLINE Lisp_Object
76# define SYNTAX_ENTRY(c) \ 91syntax_property_entry (int c, bool via_property)
77 (gl_state.use_global ? gl_state.global_code : SYNTAX_ENTRY_INT (c)) 92{
78# define CURRENT_SYNTAX_TABLE gl_state.current_syntax_table 93 if (via_property)
79#else 94 return (gl_state.use_global
80# define SYNTAX_ENTRY SYNTAX_ENTRY_INT 95 ? gl_state.global_code
81# define CURRENT_SYNTAX_TABLE BVAR (current_buffer, syntax_table) 96 : CHAR_TABLE_REF (gl_state.current_syntax_table, c));
82#endif 97 return CHAR_TABLE_REF (BVAR (current_buffer, syntax_table), c);
83 98}
84#define SYNTAX_ENTRY_INT(c) CHAR_TABLE_REF (CURRENT_SYNTAX_TABLE, (c)) 99INLINE Lisp_Object
100SYNTAX_ENTRY (int c)
101{
102 return syntax_property_entry (c, false);
103}
85 104
86/* Extract the information from the entry for character C 105/* Extract the information from the entry for character C
87 in the current syntax table. */ 106 in the current syntax table. */
88 107
89#ifdef __GNUC__ 108INLINE int
90#define SYNTAX(c) \ 109syntax_property_with_flags (int c, bool via_property)
91 ({ Lisp_Object _syntax_temp; \ 110{
92 _syntax_temp = SYNTAX_ENTRY (c); \ 111 Lisp_Object ent = syntax_property_entry (c, via_property);
93 (CONSP (_syntax_temp) \ 112 return CONSP (ent) ? XINT (XCAR (ent)) : Swhitespace;
94 ? (enum syntaxcode) (XINT (XCAR (_syntax_temp)) & 0xff) \ 113}
95 : Swhitespace); }) 114INLINE int
96 115SYNTAX_WITH_FLAGS (int c)
97#define SYNTAX_WITH_FLAGS(c) \ 116{
98 ({ Lisp_Object _syntax_temp; \ 117 return syntax_property_with_flags (c, false);
99 _syntax_temp = SYNTAX_ENTRY (c); \ 118}
100 (CONSP (_syntax_temp) \ 119
101 ? XINT (XCAR (_syntax_temp)) \ 120INLINE enum syntaxcode
102 : (int) Swhitespace); }) 121syntax_property (int c, bool via_property)
103 122{
104#define SYNTAX_MATCH(c) \ 123 return syntax_property_with_flags (c, via_property) & 0xff;
105 ({ Lisp_Object _syntax_temp; \ 124}
106 _syntax_temp = SYNTAX_ENTRY (c); \ 125INLINE enum syntaxcode
107 (CONSP (_syntax_temp) \ 126SYNTAX (int c)
108 ? XCDR (_syntax_temp) \ 127{
109 : Qnil); }) 128 return syntax_property (c, false);
110#else 129}
111extern Lisp_Object syntax_temp;
112#define SYNTAX(c) \
113 (syntax_temp = SYNTAX_ENTRY ((c)), \
114 (CONSP (syntax_temp) \
115 ? (enum syntaxcode) (XINT (XCAR (syntax_temp)) & 0xff) \
116 : Swhitespace))
117
118#define SYNTAX_WITH_FLAGS(c) \
119 (syntax_temp = SYNTAX_ENTRY ((c)), \
120 (CONSP (syntax_temp) \
121 ? XINT (XCAR (syntax_temp)) \
122 : (int) Swhitespace))
123
124#define SYNTAX_MATCH(c) \
125 (syntax_temp = SYNTAX_ENTRY ((c)), \
126 (CONSP (syntax_temp) \
127 ? XCDR (syntax_temp) \
128 : Qnil))
129#endif
130 130
131 131
132/* Whether the syntax of the character C has the prefix flag set. */ 132/* Whether the syntax of the character C has the prefix flag set. */
133extern int syntax_prefix_flag_p (int c); 133extern bool syntax_prefix_flag_p (int c);
134 134
135/* This array, indexed by a character, contains the syntax code which that 135/* This array, indexed by a character less than 256, contains the
136 character signifies (as a char). For example, 136 syntax code which that character signifies (as an unsigned char).
137 (enum syntaxcode) syntax_spec_code['w'] is Sword. */ 137 For example, syntax_spec_code['w'] == Sword. */
138 138
139extern unsigned char syntax_spec_code[0400]; 139extern unsigned char const syntax_spec_code[0400];
140 140
141/* Indexed by syntax code, give the letter that describes it. */ 141/* Indexed by syntax code, give the letter that describes it. */
142 142
143extern char syntax_code_spec[16]; 143extern char const syntax_code_spec[16];
144 144
145/* Convert the byte offset BYTEPOS into a character position, 145/* Convert the byte offset BYTEPOS into a character position,
146 for the object recorded in gl_state with SETUP_SYNTAX_TABLE_FOR_OBJECT. 146 for the object recorded in gl_state with SETUP_SYNTAX_TABLE_FOR_OBJECT.
147 147
148 The value is meant for use in the UPDATE_SYNTAX_TABLE... macros. 148 The value is meant for use in code that does nothing when
149 These macros do nothing when parse_sexp_lookup_properties is 0, 149 parse_sexp_lookup_properties is false, so return 0 in that case,
150 so we return 0 in that case, for speed. */ 150 for speed. */
151 151
152#define SYNTAX_TABLE_BYTE_TO_CHAR(bytepos) \ 152INLINE ptrdiff_t
153 (! parse_sexp_lookup_properties \ 153SYNTAX_TABLE_BYTE_TO_CHAR (ptrdiff_t bytepos)
154 ? 0 \ 154{
155 : STRINGP (gl_state.object) \ 155 return (! parse_sexp_lookup_properties
156 ? string_byte_to_char (gl_state.object, (bytepos)) \ 156 ? 0
157 : BUFFERP (gl_state.object) \ 157 : STRINGP (gl_state.object)
158 ? buf_bytepos_to_charpos (XBUFFER (gl_state.object), \ 158 ? string_byte_to_char (gl_state.object, bytepos)
159 (bytepos) + BUF_BEGV_BYTE (XBUFFER (gl_state.object)) - 1) - BUF_BEGV (XBUFFER (gl_state.object)) + 1 \ 159 : BUFFERP (gl_state.object)
160 : NILP (gl_state.object) \ 160 ? ((buf_bytepos_to_charpos
161 ? BYTE_TO_CHAR ((bytepos) + BEGV_BYTE - 1) - BEGV + 1 \ 161 (XBUFFER (gl_state.object),
162 : (bytepos)) 162 (bytepos + BUF_BEGV_BYTE (XBUFFER (gl_state.object)) - 1)))
163 - BUF_BEGV (XBUFFER (gl_state.object)) + 1)
164 : NILP (gl_state.object)
165 ? BYTE_TO_CHAR (bytepos + BEGV_BYTE - 1) - BEGV + 1
166 : bytepos);
167}
163 168
164/* Make syntax table state (gl_state) good for CHARPOS, assuming it is 169/* Make syntax table state (gl_state) good for CHARPOS, assuming it is
165 currently good for a position before CHARPOS. */ 170 currently good for a position before CHARPOS. */
166 171
167#define UPDATE_SYNTAX_TABLE_FORWARD(charpos) \ 172INLINE void
168 (parse_sexp_lookup_properties \ 173UPDATE_SYNTAX_TABLE_FORWARD (ptrdiff_t charpos)
169 && (charpos) >= gl_state.e_property \ 174{
170 ? (update_syntax_table ((charpos) + gl_state.offset, 1, 0, \ 175 if (parse_sexp_lookup_properties && charpos >= gl_state.e_property)
171 gl_state.object), \ 176 update_syntax_table (charpos + gl_state.offset, 1, false, gl_state.object);
172 1) \ 177}
173 : 0)
174 178
175/* Make syntax table state (gl_state) good for CHARPOS, assuming it is 179/* Make syntax table state (gl_state) good for CHARPOS, assuming it is
176 currently good for a position after CHARPOS. */ 180 currently good for a position after CHARPOS. */
177 181
178#define UPDATE_SYNTAX_TABLE_BACKWARD(charpos) \ 182INLINE void
179 (parse_sexp_lookup_properties \ 183UPDATE_SYNTAX_TABLE_BACKWARD (ptrdiff_t charpos)
180 && (charpos) < gl_state.b_property \ 184{
181 ? (update_syntax_table ((charpos) + gl_state.offset, -1, 0, \ 185 if (parse_sexp_lookup_properties && charpos < gl_state.b_property)
182 gl_state.object), \ 186 update_syntax_table (charpos + gl_state.offset, -1, false, gl_state.object);
183 1) \ 187}
184 : 0)
185 188
186/* Make syntax table good for CHARPOS. */ 189/* Make syntax table good for CHARPOS. */
187 190
188#define UPDATE_SYNTAX_TABLE(charpos) \ 191INLINE void
189 (parse_sexp_lookup_properties \ 192UPDATE_SYNTAX_TABLE (ptrdiff_t charpos)
190 && (charpos) < gl_state.b_property \ 193{
191 ? (update_syntax_table ((charpos) + gl_state.offset, -1, 0, \ 194 UPDATE_SYNTAX_TABLE_BACKWARD (charpos);
192 gl_state.object), \ 195 UPDATE_SYNTAX_TABLE_FORWARD (charpos);
193 1) \ 196}
194 : (parse_sexp_lookup_properties \ 197
195 && (charpos) >= gl_state.e_property \ 198/* Set up the buffer-global syntax table. */
196 ? (update_syntax_table ((charpos) + gl_state.offset, 1, 0,\
197 gl_state.object), \
198 1) \
199 : 0))
200
201/* This macro sets up the buffer-global syntax table. */
202#define SETUP_BUFFER_SYNTAX_TABLE() \
203do \
204 { \
205 gl_state.use_global = 0; \
206 gl_state.current_syntax_table = BVAR (current_buffer, syntax_table);\
207 } while (0)
208
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
213 call.
214 Sign of COUNT gives the direction of the search.
215 */
216
217#define SETUP_SYNTAX_TABLE(FROM, COUNT) \
218do \
219 { \
220 SETUP_BUFFER_SYNTAX_TABLE (); \
221 gl_state.b_property = BEGV; \
222 gl_state.e_property = ZV + 1; \
223 gl_state.object = Qnil; \
224 gl_state.offset = 0; \
225 if (parse_sexp_lookup_properties) \
226 if ((COUNT) > 0 || (FROM) > BEGV) \
227 update_syntax_table ((COUNT) > 0 ? (FROM) : (FROM) - 1, (COUNT),\
228 1, Qnil); \
229 } \
230while (0)
231
232/* Same as above, but in OBJECT. If OBJECT is nil, use current buffer.
233 If it is t (which is only used in fast_c_string_match_ignore_case),
234 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.
238 So if it is a buffer, we set the offset field to BEGV. */
239
240#define SETUP_SYNTAX_TABLE_FOR_OBJECT(OBJECT, FROM, COUNT) \
241do \
242 { \
243 SETUP_BUFFER_SYNTAX_TABLE (); \
244 gl_state.object = (OBJECT); \
245 if (BUFFERP (gl_state.object)) \
246 { \
247 struct buffer *buf = XBUFFER (gl_state.object); \
248 gl_state.b_property = 1; \
249 gl_state.e_property = BUF_ZV (buf) - BUF_BEGV (buf) + 1; \
250 gl_state.offset = BUF_BEGV (buf) - 1; \
251 } \
252 else if (NILP (gl_state.object)) \
253 { \
254 gl_state.b_property = 1; \
255 gl_state.e_property = ZV - BEGV + 1; \
256 gl_state.offset = BEGV - 1; \
257 } \
258 else if (EQ (gl_state.object, Qt)) \
259 { \
260 gl_state.b_property = 0; \
261 gl_state.e_property = PTRDIFF_MAX; \
262 gl_state.offset = 0; \
263 } \
264 else \
265 { \
266 gl_state.b_property = 0; \
267 gl_state.e_property = 1 + SCHARS (gl_state.object); \
268 gl_state.offset = 0; \
269 } \
270 if (parse_sexp_lookup_properties) \
271 update_syntax_table (((FROM) + gl_state.offset \
272 + (COUNT > 0 ? 0 : -1)), \
273 COUNT, 1, gl_state.object); \
274 } \
275while (0)
276 199
277struct gl_state_s 200INLINE void
201SETUP_BUFFER_SYNTAX_TABLE (void)
278{ 202{
279 Lisp_Object object; /* The object we are scanning. */ 203 gl_state.use_global = false;
280 ptrdiff_t start; /* Where to stop. */ 204 gl_state.current_syntax_table = BVAR (current_buffer, syntax_table);
281 ptrdiff_t stop; /* Where to stop. */ 205}
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. */
287 ptrdiff_t b_property; /* First index where c_s_t is valid. */
288 ptrdiff_t 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: */
297 /* Offset for positions specified to UPDATE_SYNTAX_TABLE. */
298 ptrdiff_t offset;
299};
300 206
301extern struct gl_state_s gl_state;
302extern ptrdiff_t scan_words (ptrdiff_t, EMACS_INT); 207extern ptrdiff_t scan_words (ptrdiff_t, EMACS_INT);
208extern void SETUP_SYNTAX_TABLE_FOR_OBJECT (Lisp_Object, ptrdiff_t, ptrdiff_t);
209
210INLINE_HEADER_END