Unify FRAME_window_system_DISPLAY_INFO macros between all ports.
[bpt/emacs.git] / src / syntax.h
CommitLineData
9889c728 1/* Declarations having to do with GNU Emacs syntax tables.
95df8112 2
ab422c4d
PE
3Copyright (C) 1985, 1993-1994, 1997-1998, 2001-2013 Free Software
4Foundation, 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 20
45b683a1
PE
21INLINE_HEADER_BEGIN
22#ifndef SYNTAX_INLINE
23# define SYNTAX_INLINE INLINE
24#endif
9889c728 25
1fc71008 26extern void update_syntax_table (ptrdiff_t, EMACS_INT, bool, Lisp_Object);
9889c728
JB
27
28/* The standard syntax table is stored where it will automatically
29 be used in all new buffers. */
4b4deea2 30#define Vstandard_syntax_table BVAR (&buffer_defaults, syntax_table)
9889c728 31
e46c910e
RS
32/* A syntax table is a chartable whose elements are cons cells
33 (CODE+FLAGS . MATCHING-CHAR). MATCHING-CHAR can be nil if the char
34 is not a kind of parenthesis.
9889c728 35
e46c910e 36 The low 8 bits of CODE+FLAGS is a code, as follows: */
9889c728
JB
37
38enum syntaxcode
39 {
40 Swhitespace, /* for a whitespace character */
41 Spunct, /* for random punctuation characters */
42 Sword, /* for a word constituent */
43 Ssymbol, /* symbol constituent but not word constituent */
44 Sopen, /* for a beginning delimiter */
45 Sclose, /* for an ending delimiter */
46 Squote, /* for a prefix character like Lisp ' */
47 Sstring, /* for a string-grouping character like Lisp " */
5eea1c5a 48 Smath, /* for delimiters like $ in Tex. */
9889c728
JB
49 Sescape, /* for a character that begins a C-style escape */
50 Scharquote, /* for a character that quotes the following character */
51 Scomment, /* for a comment-starting character */
52 Sendcomment, /* for a comment-ending character */
c8cdcb16 53 Sinherit, /* use the standard syntax table for this character */
5eea1c5a 54 Scomment_fence, /* Starts/ends comment which is delimited on the
47ab3db5 55 other side by any char with the same syntaxcode. */
5eea1c5a 56 Sstring_fence, /* Starts/ends string which is delimited on the
47ab3db5 57 other side by any char with the same syntaxcode. */
9889c728
JB
58 Smax /* Upper bound on codes that are meaningful */
59 };
60
e0b8ff93 61
45b683a1
PE
62struct gl_state_s
63{
64 Lisp_Object object; /* The object we are scanning. */
65 ptrdiff_t start; /* Where to stop. */
66 ptrdiff_t stop; /* Where to stop. */
67 bool use_global; /* Whether to use global_code
68 or c_s_t. */
69 Lisp_Object global_code; /* Syntax code of current char. */
70 Lisp_Object current_syntax_table; /* Syntax table for current pos. */
71 Lisp_Object old_prop; /* Syntax-table prop at prev pos. */
72 ptrdiff_t b_property; /* First index where c_s_t is valid. */
73 ptrdiff_t e_property; /* First index where c_s_t is
74 not valid. */
75 INTERVAL forward_i; /* Where to start lookup on forward */
76 INTERVAL backward_i; /* or backward movement. The
77 data in c_s_t is valid
78 between these intervals,
79 and possibly at the
80 intervals too, depending
81 on: */
82 /* Offset for positions specified to UPDATE_SYNTAX_TABLE. */
83 ptrdiff_t offset;
84};
e0b8ff93 85
45b683a1 86extern struct gl_state_s gl_state;
9889c728 87
45b683a1 88/* Fetch the information from the entry for character C
177c0ea7 89 in syntax table TABLE, or from globally kept data (gl_state).
5eea1c5a 90 Does inheritance. */
5eea1c5a 91
45b683a1
PE
92SYNTAX_INLINE Lisp_Object
93SYNTAX_ENTRY (int c)
94{
5eea1c5a 95#ifdef SYNTAX_ENTRY_VIA_PROPERTY
45b683a1
PE
96 return (gl_state.use_global
97 ? gl_state.global_code
98 : CHAR_TABLE_REF (gl_state.current_syntax_table, c));
5eea1c5a 99#else
45b683a1 100 return CHAR_TABLE_REF (BVAR (current_buffer, syntax_table), c);
5eea1c5a 101#endif
45b683a1 102}
e0b8ff93 103
e46c910e 104/* Extract the information from the entry for character C
e0b8ff93 105 in the current syntax table. */
c8cdcb16 106
45b683a1
PE
107SYNTAX_INLINE int
108SYNTAX_WITH_FLAGS (int c)
109{
110 Lisp_Object ent = SYNTAX_ENTRY (c);
111 return CONSP (ent) ? XINT (XCAR (ent)) : Swhitespace;
112}
113
114SYNTAX_INLINE enum syntaxcode
115SYNTAX (int c)
116{
117 return SYNTAX_WITH_FLAGS (c) & 0xff;
118}
9889c728 119
a306d6f1 120
c5683ceb 121/* Whether the syntax of the character C has the prefix flag set. */
1fc71008 122extern bool syntax_prefix_flag_p (int c);
c0364919 123
1fc71008
PE
124/* This array, indexed by a character less than 256, contains the
125 syntax code which that character signifies (as an unsigned char).
126 For example, syntax_spec_code['w'] == Sword. */
9889c728 127
1fc71008 128extern unsigned char const syntax_spec_code[0400];
9889c728 129
5eea1c5a
RS
130/* Indexed by syntax code, give the letter that describes it. */
131
1fc71008 132extern char const syntax_code_spec[16];
5eea1c5a 133
c292db29 134/* Convert the byte offset BYTEPOS into a character position,
2f16e7fd
RS
135 for the object recorded in gl_state with SETUP_SYNTAX_TABLE_FOR_OBJECT.
136
45b683a1
PE
137 The value is meant for use in code that does nothing when
138 parse_sexp_lookup_properties is 0, so return 0 in that case, for speed. */
139
140SYNTAX_INLINE ptrdiff_t
141SYNTAX_TABLE_BYTE_TO_CHAR (ptrdiff_t bytepos)
142{
143 return (! parse_sexp_lookup_properties
144 ? 0
145 : STRINGP (gl_state.object)
146 ? string_byte_to_char (gl_state.object, bytepos)
147 : BUFFERP (gl_state.object)
148 ? ((buf_bytepos_to_charpos
149 (XBUFFER (gl_state.object),
150 (bytepos + BUF_BEGV_BYTE (XBUFFER (gl_state.object)) - 1)))
151 - BUF_BEGV (XBUFFER (gl_state.object)) + 1)
152 : NILP (gl_state.object)
153 ? BYTE_TO_CHAR (bytepos + BEGV_BYTE - 1) - BEGV + 1
154 : bytepos);
155}
c292db29 156
f79b4b7e
KH
157/* Make syntax table state (gl_state) good for CHARPOS, assuming it is
158 currently good for a position before CHARPOS. */
5eea1c5a 159
45b683a1
PE
160SYNTAX_INLINE void
161UPDATE_SYNTAX_TABLE_FORWARD (ptrdiff_t charpos)
162{
163 if (parse_sexp_lookup_properties && charpos >= gl_state.e_property)
164 update_syntax_table (charpos + gl_state.offset, 1, 0, gl_state.object);
165}
5eea1c5a 166
f79b4b7e
KH
167/* Make syntax table state (gl_state) good for CHARPOS, assuming it is
168 currently good for a position after CHARPOS. */
5eea1c5a 169
45b683a1
PE
170SYNTAX_INLINE void
171UPDATE_SYNTAX_TABLE_BACKWARD (ptrdiff_t charpos)
172{
173 if (parse_sexp_lookup_properties && charpos < gl_state.b_property)
174 update_syntax_table (charpos + gl_state.offset, -1, 0, gl_state.object);
175}
e2d8d746 176
f79b4b7e 177/* Make syntax table good for CHARPOS. */
e2d8d746 178
45b683a1
PE
179SYNTAX_INLINE void
180UPDATE_SYNTAX_TABLE (ptrdiff_t charpos)
181{
182 UPDATE_SYNTAX_TABLE_BACKWARD (charpos);
183 UPDATE_SYNTAX_TABLE_FORWARD (charpos);
184}
185
186/* Set up the buffer-global syntax table. */
5eea1c5a 187
45b683a1
PE
188SYNTAX_INLINE void
189SETUP_BUFFER_SYNTAX_TABLE (void)
5eea1c5a 190{
45b683a1
PE
191 gl_state.use_global = 0;
192 gl_state.current_syntax_table = BVAR (current_buffer, syntax_table);
193}
5eea1c5a 194
d311d28c 195extern ptrdiff_t scan_words (ptrdiff_t, EMACS_INT);
45b683a1
PE
196extern void SETUP_SYNTAX_TABLE_FOR_OBJECT (Lisp_Object, ptrdiff_t, ptrdiff_t);
197
198INLINE_HEADER_END