syntax.h 7.22 KB
Newer Older
Jim Blandy's avatar
Jim Blandy committed
1
/* Declarations having to do with GNU Emacs syntax tables.
2

Paul Eggert's avatar
Paul Eggert committed
3
Copyright (C) 1985, 1993-1994, 1997-1998, 2001-2015 Free Software
4
Foundation, Inc.
Jim Blandy's avatar
Jim Blandy committed
5 6 7

This file is part of GNU Emacs.

8
GNU Emacs is free software: you can redistribute it and/or modify
Jim Blandy's avatar
Jim Blandy committed
9
it under the terms of the GNU General Public License as published by
10 11
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Jim Blandy's avatar
Jim Blandy committed
12 13 14 15 16 17 18

GNU Emacs is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
19
along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
Jim Blandy's avatar
Jim Blandy committed
20

21 22 23 24 25 26
#ifndef EMACS_SYNTAX_H
#define EMACS_SYNTAX_H

#include "buffer.h"
#include "lisp.h"

27
INLINE_HEADER_BEGIN
Jim Blandy's avatar
Jim Blandy committed
28

Paul Eggert's avatar
Paul Eggert committed
29
extern void update_syntax_table (ptrdiff_t, EMACS_INT, bool, Lisp_Object);
30
extern void update_syntax_table_forward (ptrdiff_t, bool, Lisp_Object);
Jim Blandy's avatar
Jim Blandy committed
31 32 33

/* The standard syntax table is stored where it will automatically
   be used in all new buffers.  */
Tom Tromey's avatar
Tom Tromey committed
34
#define Vstandard_syntax_table BVAR (&buffer_defaults, syntax_table)
Jim Blandy's avatar
Jim Blandy committed
35

36 37 38
/* A syntax table is a chartable whose elements are cons cells
   (CODE+FLAGS . MATCHING-CHAR).  MATCHING-CHAR can be nil if the char
   is not a kind of parenthesis.
Jim Blandy's avatar
Jim Blandy committed
39

40
   The low 8 bits of CODE+FLAGS is a code, as follows:  */
Jim Blandy's avatar
Jim Blandy committed
41 42 43 44 45 46 47 48 49 50 51

enum syntaxcode
  {
    Swhitespace, /* for a whitespace character */
    Spunct,	 /* for random punctuation characters */
    Sword,	 /* for a word constituent */
    Ssymbol,	 /* symbol constituent but not word constituent */
    Sopen,	 /* for a beginning delimiter */
    Sclose,      /* for an ending delimiter */
    Squote,	 /* for a prefix character like Lisp ' */
    Sstring,	 /* for a string-grouping character like Lisp " */
52
    Smath,	 /* for delimiters like $ in Tex.  */
Jim Blandy's avatar
Jim Blandy committed
53 54 55 56
    Sescape,	 /* for a character that begins a C-style escape */
    Scharquote,  /* for a character that quotes the following character */
    Scomment,    /* for a comment-starting character */
    Sendcomment, /* for a comment-ending character */
57
    Sinherit,    /* use the standard syntax table for this character */
58
    Scomment_fence, /* Starts/ends comment which is delimited on the
Richard M. Stallman's avatar
Richard M. Stallman committed
59
		       other side by any char with the same syntaxcode.  */
60
    Sstring_fence,  /* Starts/ends string which is delimited on the
Richard M. Stallman's avatar
Richard M. Stallman committed
61
		       other side by any char with the same syntaxcode.  */
62
    Smax	 /* Upper bound on codes that are meaningful.  */
Jim Blandy's avatar
Jim Blandy committed
63 64
  };

65

66 67
struct gl_state_s
{
68 69 70
  Lisp_Object object;			/* The object we are scanning.  */
  ptrdiff_t start;			/* Where to stop.  */
  ptrdiff_t stop;			/* Where to stop.  */
71
  bool use_global;			/* Whether to use global_code
72 73 74 75 76
					   or c_s_t.  */
  Lisp_Object global_code;		/* Syntax code of current char.  */
  Lisp_Object current_syntax_table;	/* Syntax table for current pos.  */
  Lisp_Object old_prop;			/* Syntax-table prop at prev pos.  */
  ptrdiff_t b_property;			/* First index where c_s_t is valid.  */
77
  ptrdiff_t e_property;			/* First index where c_s_t is
78 79 80 81
					   not valid.  */
  bool e_property_truncated;		/* true if e_property if was truncated
					   by parse_sexp_propertize_done.  */
  INTERVAL forward_i;			/* Where to start lookup on forward.  */
82 83 84 85 86
  INTERVAL backward_i;			/* or backward movement.  The
					   data in c_s_t is valid
					   between these intervals,
					   and possibly at the
					   intervals too, depending
87
					   on:  */
88 89 90
  /* Offset for positions specified to UPDATE_SYNTAX_TABLE.  */
  ptrdiff_t offset;
};
91

92
extern struct gl_state_s gl_state;
Jim Blandy's avatar
Jim Blandy committed
93

94
/* Fetch the information from the entry for character C
95 96
   in the current buffer's syntax table,
   or (if VIA_PROPERTY) from globally kept data (gl_state).
97 98
   Does inheritance.  */

Paul Eggert's avatar
Paul Eggert committed
99
INLINE Lisp_Object
100
syntax_property_entry (int c, bool via_property)
101
{
102 103 104 105
  if (via_property)
    return (gl_state.use_global
	    ? gl_state.global_code
	    : CHAR_TABLE_REF (gl_state.current_syntax_table, c));
106
  return CHAR_TABLE_REF (BVAR (current_buffer, syntax_table), c);
107 108 109 110
}
INLINE Lisp_Object
SYNTAX_ENTRY (int c)
{
111
  return syntax_property_entry (c, false);
112
}
113

114
/* Extract the information from the entry for character C
115
   in the current syntax table.  */
116

Paul Eggert's avatar
Paul Eggert committed
117
INLINE int
118
syntax_property_with_flags (int c, bool via_property)
119
{
120
  Lisp_Object ent = syntax_property_entry (c, via_property);
121 122
  return CONSP (ent) ? XINT (XCAR (ent)) : Swhitespace;
}
123 124 125
INLINE int
SYNTAX_WITH_FLAGS (int c)
{
126
  return syntax_property_with_flags (c, false);
127
}
128

129 130 131 132 133
INLINE enum syntaxcode
syntax_property (int c, bool via_property)
{
  return syntax_property_with_flags (c, via_property) & 0xff;
}
Paul Eggert's avatar
Paul Eggert committed
134
INLINE enum syntaxcode
135 136
SYNTAX (int c)
{
137
  return syntax_property (c, false);
138
}
Jim Blandy's avatar
Jim Blandy committed
139

Richard M. Stallman's avatar
Richard M. Stallman committed
140

141
/* Whether the syntax of the character C has the prefix flag set.  */
Paul Eggert's avatar
Paul Eggert committed
142
extern bool syntax_prefix_flag_p (int c);
143

Paul Eggert's avatar
Paul Eggert committed
144 145 146
/* This array, indexed by a character less than 256, contains the
   syntax code which that character signifies (as an unsigned char).
   For example, syntax_spec_code['w'] == Sword.  */
Jim Blandy's avatar
Jim Blandy committed
147

Paul Eggert's avatar
Paul Eggert committed
148
extern unsigned char const syntax_spec_code[0400];
Jim Blandy's avatar
Jim Blandy committed
149

150 151
/* Indexed by syntax code, give the letter that describes it.  */

Paul Eggert's avatar
Paul Eggert committed
152
extern char const syntax_code_spec[16];
153

154
/* Convert the byte offset BYTEPOS into a character position,
155 156
   for the object recorded in gl_state with SETUP_SYNTAX_TABLE_FOR_OBJECT.

157
   The value is meant for use in code that does nothing when
158 159
   parse_sexp_lookup_properties is false, so return 0 in that case,
   for speed.  */
160

Paul Eggert's avatar
Paul Eggert committed
161
INLINE ptrdiff_t
162 163 164 165 166 167 168 169 170 171 172 173 174 175 176
SYNTAX_TABLE_BYTE_TO_CHAR (ptrdiff_t bytepos)
{
  return (! parse_sexp_lookup_properties
	  ? 0
	  : STRINGP (gl_state.object)
	  ? string_byte_to_char (gl_state.object, bytepos)
	  : BUFFERP (gl_state.object)
	  ? ((buf_bytepos_to_charpos
	      (XBUFFER (gl_state.object),
	       (bytepos + BUF_BEGV_BYTE (XBUFFER (gl_state.object)) - 1)))
	     - BUF_BEGV (XBUFFER (gl_state.object)) + 1)
	  : NILP (gl_state.object)
	  ? BYTE_TO_CHAR (bytepos + BEGV_BYTE - 1) - BEGV + 1
	  : bytepos);
}
177

178 179
/* Make syntax table state (gl_state) good for CHARPOS, assuming it is
   currently good for a position before CHARPOS.  */
180

Paul Eggert's avatar
Paul Eggert committed
181
INLINE void
182
UPDATE_SYNTAX_TABLE_FORWARD (ptrdiff_t charpos)
183
{ /* Performs just-in-time syntax-propertization.  */
184
  if (parse_sexp_lookup_properties && charpos >= gl_state.e_property)
185 186
    update_syntax_table_forward (charpos + gl_state.offset,
				 false, gl_state.object);
187
}
188

189 190
/* Make syntax table state (gl_state) good for CHARPOS, assuming it is
   currently good for a position after CHARPOS.  */
191

Paul Eggert's avatar
Paul Eggert committed
192
INLINE void
193 194 195
UPDATE_SYNTAX_TABLE_BACKWARD (ptrdiff_t charpos)
{
  if (parse_sexp_lookup_properties && charpos < gl_state.b_property)
196
    update_syntax_table (charpos + gl_state.offset, -1, false, gl_state.object);
197
}
198

199
/* Make syntax table good for CHARPOS.  */
200

Paul Eggert's avatar
Paul Eggert committed
201
INLINE void
202 203 204 205 206 207 208
UPDATE_SYNTAX_TABLE (ptrdiff_t charpos)
{
  UPDATE_SYNTAX_TABLE_BACKWARD (charpos);
  UPDATE_SYNTAX_TABLE_FORWARD (charpos);
}

/* Set up the buffer-global syntax table.  */
209

Paul Eggert's avatar
Paul Eggert committed
210
INLINE void
211
SETUP_BUFFER_SYNTAX_TABLE (void)
212
{
213
  gl_state.use_global = false;
214
  gl_state.e_property_truncated = false;
215 216
  gl_state.current_syntax_table = BVAR (current_buffer, syntax_table);
}
217

218
extern ptrdiff_t scan_words (ptrdiff_t, EMACS_INT);
219 220 221
extern void SETUP_SYNTAX_TABLE_FOR_OBJECT (Lisp_Object, ptrdiff_t, ptrdiff_t);

INLINE_HEADER_END
222 223

#endif /* EMACS_SYNTAX_H */