annotate src/syntax.h @ 2798:7074e4039632

[xemacs-hg @ 2005-06-02 21:51:13 by viteno] Update xemacs_extra_name.
author viteno
date Thu, 02 Jun 2005 21:51:13 +0000
parents 70921960b980
children 141c2920ea48
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 /* Declarations having to do with XEmacs syntax tables.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2 Copyright (C) 1985, 1992, 1993 Free Software Foundation, Inc.
1296
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
3 Copyright (C) 2002, 2003 Ben Wing.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5 This file is part of XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7 XEmacs is free software; you can redistribute it and/or modify it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8 under the terms of the GNU General Public License as published by the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9 Free Software Foundation; either version 2, or (at your option) any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10 later version.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12 XEmacs is distributed in the hope that it will be useful, but WITHOUT
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15 for more details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18 along with XEmacs; see the file COPYING. If not, write to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20 Boston, MA 02111-1307, USA. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22 /* Synched up with: FSF 19.28. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
24 #ifndef INCLUDED_syntax_h_
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
25 #define INCLUDED_syntax_h_
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27 #include "chartab.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29 /* A syntax table is a type of char table.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31 The low 7 bits of the integer is a code, as follows. The 8th bit is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32 used as the prefix bit flag (see below).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34 The values in a syntax table are either integers or conses of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35 integers and chars. The lowest 7 bits of the integer are the syntax
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36 class. If this is Sinherit, then the actual syntax value needs to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 be retrieved from the standard syntax table.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 Since the logic involved in finding the actual integer isn't very
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40 complex, you'd think the time required to retrieve it is not a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41 factor. If you thought that, however, you'd be wrong, due to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42 high number of times (many per character) that the syntax value is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43 accessed in functions such as scan_lists(). To speed this up,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44 we maintain a mirror syntax table that contains the actual
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 integers. We can do this successfully because syntax tables are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46 now an abstract type, where we control all access.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49 enum syntaxcode
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51 Swhitespace, /* whitespace character */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 Spunct, /* random punctuation character */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 Sword, /* word constituent */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 Ssymbol, /* symbol constituent but not word constituent */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 Sopen, /* a beginning delimiter */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 Sclose, /* an ending delimiter */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 Squote, /* a prefix character like Lisp ' */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 Sstring, /* a string-grouping character like Lisp " */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59 Smath, /* delimiters like $ in TeX. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 Sescape, /* a character that begins a C-style escape */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 Scharquote, /* a character that quotes the following character */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 Scomment, /* a comment-starting character */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63 Sendcomment, /* a comment-ending character */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 Sinherit, /* use the standard syntax table for this character */
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
65 Scomment_fence, /* Starts/ends comment which is delimited on the
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
66 other side by a char with the same syntaxcode. */
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
67 Sstring_fence, /* Starts/ends string which is delimited on the
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
68 other side by a char with the same syntaxcode. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 Smax /* Upper bound on codes that are meaningful */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72 enum syntaxcode charset_syntax (struct buffer *buf, Lisp_Object charset,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 int *multi_p_out);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74
1296
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
75 void update_syntax_table (Lisp_Object table);
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
76
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
77 DECLARE_INLINE_HEADER (
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
78 void
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
79 update_mirror_syntax_if_dirty (Lisp_Object table)
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
80 )
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
81 {
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
82 if (XCHAR_TABLE (table)->dirty)
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
83 update_syntax_table (table);
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
84 }
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
85
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 /* Return the syntax code for a particular character and mirror table. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87
1296
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
88 DECLARE_INLINE_HEADER (
1315
70921960b980 [xemacs-hg @ 2003-02-20 08:19:28 by ben]
ben
parents: 1296
diff changeset
89 int
1296
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
90 SYNTAX_CODE (Lisp_Object table, Ichar c)
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
91 )
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
92 {
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
93 type_checking_assert (XCHAR_TABLE (table)->mirror_table_p);
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
94 update_mirror_syntax_if_dirty (table);
1315
70921960b980 [xemacs-hg @ 2003-02-20 08:19:28 by ben]
ben
parents: 1296
diff changeset
95 return XINT (get_char_table_1 (c, table));
1296
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
96 }
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
97
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
98 #ifdef NOT_WORTH_THE_EFFORT
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
99
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
100 /* Same but skip the dirty check. */
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
101
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
102 DECLARE_INLINE_HEADER (
1315
70921960b980 [xemacs-hg @ 2003-02-20 08:19:28 by ben]
ben
parents: 1296
diff changeset
103 int
1296
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
104 SYNTAX_CODE_1 (Lisp_Object table, Ichar c)
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
105 )
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
106 {
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
107 type_checking_assert (XCHAR_TABLE (table)->mirror_table_p);
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
108 return (enum syntaxcode) XINT (get_char_table_1 (c, table));
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
109 }
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
110
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
111 #endif /* NOT_WORTH_THE_EFFORT */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113 #define SYNTAX_FROM_CODE(code) ((enum syntaxcode) ((code) & 0177))
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
114
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115 #define SYNTAX(table, c) SYNTAX_FROM_CODE (SYNTAX_CODE (table, c))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
117 DECLARE_INLINE_HEADER (
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
118 int
867
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 826
diff changeset
119 WORD_SYNTAX_P (Lisp_Object table, Ichar c)
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
120 )
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122 return SYNTAX (table, c) == Sword;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125 /* OK, here's a graphic diagram of the format of the syntax values:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 Bit number:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 [ 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 ]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 [ 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 ]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 <-----> <-----> <-------------> <-------------> ^ <----------->
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 ELisp unused |comment bits | unused | syntax code
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134 tag | | | | | | | | |
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 stuff | | | | | | | | |
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136 | | | | | | | | |
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 | | | | | | | | `--> prefix flag
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 | | | | | | | |
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 | | | | | | | `--> comment end style B, second char
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 | | | | | | `----> comment end style A, second char
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141 | | | | | `------> comment end style B, first char
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142 | | | | `--------> comment end style A, first char
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 | | | `----------> comment start style B, second char
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 | | `------------> comment start style A, second char
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145 | `--------------> comment start style B, first char
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 `----------------> comment start style A, first char
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148 In a 64-bit integer, there would be 32 more unused bits between
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 the tag and the comment bits.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 Clearly, such a scheme will not work for Mule, because the matching
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152 paren could be any character and as such requires 19 bits, which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 we don't got.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 Remember that under Mule we use char tables instead of vectors.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156 So what we do is use another char table for the matching paren
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 and store a pointer to it in the first char table. (This frees
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 code from having to worry about passing two tables around.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 /* The prefix flag bit for backward-prefix-chars is now put into bit 7. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 #define SYNTAX_PREFIX(table, c) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165 ((SYNTAX_CODE (table, c) >> 7) & 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167 /* Bits 23-16 are used to implement up to two comment styles
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 in a single buffer. They have the following meanings:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 1. first of a one or two character comment-start sequence of style a.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 2. first of a one or two character comment-start sequence of style b.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 3. second of a two-character comment-start sequence of style a.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 4. second of a two-character comment-start sequence of style b.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 5. first of a one or two character comment-end sequence of style a.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 6. first of a one or two character comment-end sequence of style b.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 7. second of a two-character comment-end sequence of style a.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 8. second of a two-character comment-end sequence of style b.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 #define SYNTAX_COMMENT_BITS(table, c) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 ((SYNTAX_CODE (table, c) >> 16) &0xff)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 #define SYNTAX_FIRST_OF_START_A 0x80
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184 #define SYNTAX_FIRST_OF_START_B 0x40
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 #define SYNTAX_SECOND_OF_START_A 0x20
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 #define SYNTAX_SECOND_OF_START_B 0x10
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 #define SYNTAX_FIRST_OF_END_A 0x08
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188 #define SYNTAX_FIRST_OF_END_B 0x04
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 #define SYNTAX_SECOND_OF_END_A 0x02
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 #define SYNTAX_SECOND_OF_END_B 0x01
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192 #define SYNTAX_COMMENT_STYLE_A 0xaa
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 #define SYNTAX_COMMENT_STYLE_B 0x55
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 #define SYNTAX_FIRST_CHAR_START 0xc0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 #define SYNTAX_FIRST_CHAR_END 0x0c
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 #define SYNTAX_FIRST_CHAR 0xcc
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 #define SYNTAX_SECOND_CHAR_START 0x30
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 #define SYNTAX_SECOND_CHAR_END 0x03
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 #define SYNTAX_SECOND_CHAR 0x33
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
201 #if 0
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
202
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
203 /* #### Entirely unused. Should they be deleted? */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
205 /* #### These are now more or less equivalent to
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
206 SYNTAX_COMMENT_MATCH_START ...*/
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
207 /* a and b must be first and second start chars for a common type */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
208 #define SYNTAX_START_P(table, a, b) \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
209 (((SYNTAX_COMMENT_BITS (table, a) & SYNTAX_FIRST_CHAR_START) >> 2) \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
210 & (SYNTAX_COMMENT_BITS (table, b) & SYNTAX_SECOND_CHAR_START))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
211
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
212 /* ... and SYNTAX_COMMENT_MATCH_END */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
213 /* a and b must be first and second end chars for a common type */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
214 #define SYNTAX_END_P(table, a, b) \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
215 (((SYNTAX_COMMENT_BITS (table, a) & SYNTAX_FIRST_CHAR_END) >> 2) \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
216 & (SYNTAX_COMMENT_BITS (table, b) & SYNTAX_SECOND_CHAR_END))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 #define SYNTAX_STYLES_MATCH_START_P(table, a, b, mask) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 ((SYNTAX_COMMENT_BITS (table, a) & SYNTAX_FIRST_CHAR_START & (mask)) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 && (SYNTAX_COMMENT_BITS (table, b) & SYNTAX_SECOND_CHAR_START & (mask)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 #define SYNTAX_STYLES_MATCH_END_P(table, a, b, mask) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 ((SYNTAX_COMMENT_BITS (table, a) & SYNTAX_FIRST_CHAR_END & (mask)) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 && (SYNTAX_COMMENT_BITS (table, b) & SYNTAX_SECOND_CHAR_END & (mask)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 #define SYNTAX_STYLES_MATCH_1CHAR_P(table, a, mask) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 ((SYNTAX_COMMENT_BITS (table, a) & (mask)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 #define STYLE_FOUND_P(table, a, b, startp, style) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 ((SYNTAX_COMMENT_BITS (table, a) & \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 ((startp) ? SYNTAX_FIRST_CHAR_START : \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 SYNTAX_FIRST_CHAR_END) & (style)) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 && (SYNTAX_COMMENT_BITS (table, b) & \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 ((startp) ? SYNTAX_SECOND_CHAR_START : \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235 SYNTAX_SECOND_CHAR_END) & (style)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 #define SYNTAX_COMMENT_MASK_START(table, a, b) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 ((STYLE_FOUND_P (table, a, b, 1, SYNTAX_COMMENT_STYLE_A) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 ? SYNTAX_COMMENT_STYLE_A \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240 : (STYLE_FOUND_P (table, a, b, 1, SYNTAX_COMMENT_STYLE_B) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 ? SYNTAX_COMMENT_STYLE_B \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 : 0)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 #define SYNTAX_COMMENT_MASK_END(table, a, b) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 ((STYLE_FOUND_P (table, a, b, 0, SYNTAX_COMMENT_STYLE_A) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 ? SYNTAX_COMMENT_STYLE_A \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 : (STYLE_FOUND_P (table, a, b, 0, SYNTAX_COMMENT_STYLE_B) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 ? SYNTAX_COMMENT_STYLE_B \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 : 0)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 #define STYLE_FOUND_1CHAR_P(table, a, style) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 ((SYNTAX_COMMENT_BITS (table, a) & (style)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 #define SYNTAX_COMMENT_1CHAR_MASK(table, a) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 ((STYLE_FOUND_1CHAR_P (table, a, SYNTAX_COMMENT_STYLE_A) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 ? SYNTAX_COMMENT_STYLE_A \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 : (STYLE_FOUND_1CHAR_P (table, a, SYNTAX_COMMENT_STYLE_B) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 ? SYNTAX_COMMENT_STYLE_B \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 : 0)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
261 #endif /* 0 */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 /* This array, indexed by a character, contains the syntax code which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 that character signifies (as a char).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 For example, (enum syntaxcode) syntax_spec_code['w'] is Sword. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
267 extern const unsigned char syntax_spec_code[0400];
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 /* Indexed by syntax code, give the letter that describes it. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
271 extern const unsigned char syntax_code_spec[];
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 460
diff changeset
273 Lisp_Object scan_lists (struct buffer *buf, Charbpos from, int count,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274 int depth, int sexpflag, int no_error);
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 460
diff changeset
275 int char_quoted (struct buffer *buf, Charbpos pos);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277 /* NOTE: This does not refer to the mirror table, but to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278 syntax table itself. */
867
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 826
diff changeset
279 Lisp_Object syntax_match (Lisp_Object table, Ichar ch);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281 extern int no_quit_in_re_search;
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
282
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
283
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
284 /****************************** syntax caches ********************************/
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
285
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
286 extern int lookup_syntax_properties;
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
287
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
288 /* Now that the `syntax-table' property exists, and can override the syntax
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
289 table or directly specify the syntax, we cache the last place we
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
290 retrieved the syntax-table property. This is because, when moving
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
291 linearly through text (e.g. in the regex routines or the scanning
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
292 routines in syntax.c), we only need to recalculate at the next place the
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
293 syntax-table property changes (i.e. not every position), and when we do
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
294 need to recalculate, we can update the info from the previous info
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
295 faster than if we did the whole calculation from scratch. */
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
296 struct syntax_cache
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
297 {
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
298 int use_code; /* Whether to use syntax_code or
1296
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
299 syntax_table. This is set
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
300 depending on whether the
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
301 syntax-table property is a
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
302 syntax table or a syntax
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
303 code. */
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
304 int no_syntax_table_prop; /* If non-zero, there was no
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
305 `syntax-table' property on the
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
306 current range, and so we're
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
307 using the buffer's syntax table.
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
308 This is important to note because
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
309 sometimes the buffer's syntax
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
310 table can be changed. */
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
311 Lisp_Object object; /* The buffer or string the current
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
312 syntax cache applies to, or
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
313 Qnil for a string of text not
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
314 coming from a buffer or string. */
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
315 struct buffer *buffer; /* The buffer that supplies the
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
316 syntax tables, or 0 for the
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
317 standard syntax table. If
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
318 OBJECT is a buffer, this will
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
319 always be the same buffer. */
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
320 int syntax_code; /* Syntax code of current char. */
1296
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
321 Lisp_Object syntax_table; /* Syntax table for current pos. */
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
322 Lisp_Object mirror_table; /* Mirror table for this table. */
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
323 Lisp_Object start, end; /* Markers to keep track of the
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
324 known region in a buffer.
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
325 Formerly we used an internal
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
326 extent, but it seems that having
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
327 an extent over the entire buffer
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
328 causes serious slowdowns in
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
329 extent operations! Yuck! */
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
330 Charxpos next_change; /* Position of the next extent
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
331 change. */
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
332 Charxpos prev_change; /* Position of the previous extent
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
333 change. */
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
334 };
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
335
1296
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
336 extern const struct sized_memory_description syntax_cache_description;
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
337
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
338 /* Note that the external interface to the syntax-cache uses charpos's, but
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
339 intnernally we use bytepos's, for speed. */
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
340
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
341 void update_syntax_cache (struct syntax_cache *cache, Charxpos pos, int count);
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
342 struct syntax_cache *setup_syntax_cache (struct syntax_cache *cache,
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
343 Lisp_Object object,
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
344 struct buffer *buffer,
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
345 Charxpos from, int count);
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
346 struct syntax_cache *setup_buffer_syntax_cache (struct buffer *buffer,
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
347 Charxpos from, int count);
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
348
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
349 /* Make syntax cache state good for CHARPOS, assuming it is
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
350 currently good for a position before CHARPOS. */
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
351 DECLARE_INLINE_HEADER (
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
352 void
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
353 UPDATE_SYNTAX_CACHE_FORWARD (struct syntax_cache *cache, Charxpos pos)
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
354 )
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
355 {
1315
70921960b980 [xemacs-hg @ 2003-02-20 08:19:28 by ben]
ben
parents: 1296
diff changeset
356 /* #### Formerly this function, and the next one, had
70921960b980 [xemacs-hg @ 2003-02-20 08:19:28 by ben]
ben
parents: 1296
diff changeset
357
70921960b980 [xemacs-hg @ 2003-02-20 08:19:28 by ben]
ben
parents: 1296
diff changeset
358 if (pos < cache->prev_change || pos >= cache->next_change)
70921960b980 [xemacs-hg @ 2003-02-20 08:19:28 by ben]
ben
parents: 1296
diff changeset
359
70921960b980 [xemacs-hg @ 2003-02-20 08:19:28 by ben]
ben
parents: 1296
diff changeset
360 just like for plain UPDATE_SYNTAX_CACHE. However, sometimes the
70921960b980 [xemacs-hg @ 2003-02-20 08:19:28 by ben]
ben
parents: 1296
diff changeset
361 value of POS may be invalid (particularly, it may be 0 for a buffer).
70921960b980 [xemacs-hg @ 2003-02-20 08:19:28 by ben]
ben
parents: 1296
diff changeset
362 FSF has the check at only one end, so let's try the same. */
70921960b980 [xemacs-hg @ 2003-02-20 08:19:28 by ben]
ben
parents: 1296
diff changeset
363 if (pos >= cache->next_change)
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
364 update_syntax_cache (cache, pos, 1);
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
365 }
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
366
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
367 /* Make syntax cache state good for CHARPOS, assuming it is
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
368 currently good for a position after CHARPOS. */
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
369 DECLARE_INLINE_HEADER (
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
370 void
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
371 UPDATE_SYNTAX_CACHE_BACKWARD (struct syntax_cache *cache, Charxpos pos)
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
372 )
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
373 {
1315
70921960b980 [xemacs-hg @ 2003-02-20 08:19:28 by ben]
ben
parents: 1296
diff changeset
374 if (pos < cache->prev_change)
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
375 update_syntax_cache (cache, pos, -1);
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
376 }
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
377
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
378 /* Make syntax cache state good for CHARPOS */
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
379 DECLARE_INLINE_HEADER (
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
380 void
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
381 UPDATE_SYNTAX_CACHE (struct syntax_cache *cache, Charxpos pos)
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
382 )
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
383 {
1315
70921960b980 [xemacs-hg @ 2003-02-20 08:19:28 by ben]
ben
parents: 1296
diff changeset
384 if (pos < cache->prev_change || pos >= cache->next_change)
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
385 update_syntax_cache (cache, pos, 0);
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
386 }
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
387
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
388 #define SYNTAX_FROM_CACHE(cache, c) \
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
389 SYNTAX_FROM_CODE (SYNTAX_CODE_FROM_CACHE (cache, c))
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
390
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
391 #define SYNTAX_CODE_FROM_CACHE(cache, c) \
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
392 ((cache)->use_code ? (cache)->syntax_code \
1296
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
393 : SYNTAX_CODE ((cache)->mirror_table, c))
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
394
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
395 #ifdef NOT_WORTH_THE_EFFORT
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
396 /* If we really cared about the theoretical performance hit of the dirty
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
397 check in SYNTAX_CODE, we could use SYNTAX_CODE_1 and endeavor to always
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
398 keep the mirror table clean, e.g. by checking for dirtiness at the time
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
399 we set up the syntax cache. There are lots of potential problems, of
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
400 course -- incomplete understanding of the possible pathways into the
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
401 code, with some that are bypassing the setups, Lisp code being executed
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
402 in the meantime that could change things (e.g. QUIT is called in many
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
403 functions and could execute arbitrary Lisp very easily), etc. The QUIT
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
404 problem is the biggest one, probably, and one of the main reasons it's
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
405 probably just not worth it. */
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
406 #define SYNTAX_CODE_FROM_CACHE(cache, c) \
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
407 ((cache)->use_code ? (cache)->syntax_code \
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
408 : SYNTAX_CODE_1 ((cache)->mirror_table, c))
87084e8445a7 [xemacs-hg @ 2003-02-14 09:50:15 by ben]
ben
parents: 867
diff changeset
409 #endif
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
410
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
411
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 793
diff changeset
412 /***************************** syntax code macros ****************************/
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
413
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
414 #define SYNTAX_CODE_PREFIX(c) \
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
415 ((c >> 7) & 1)
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
416
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
417 #define SYNTAX_CODE_COMMENT_BITS(c) \
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
418 ((c >> 16) &0xff)
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
419
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
420 #define SYNTAX_CODES_START_P(a, b) \
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
421 (((SYNTAX_CODE_COMMENT_BITS (a) & SYNTAX_FIRST_CHAR_START) >> 2) \
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
422 & (SYNTAX_CODE_COMMENT_BITS (b) & SYNTAX_SECOND_CHAR_START))
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
423
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
424 #define SYNTAX_CODES_END_P(a, b) \
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
425 (((SYNTAX_CODE_COMMENT_BITS (a) & SYNTAX_FIRST_CHAR_END) >> 2) \
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
426 & (SYNTAX_CODE_COMMENT_BITS (b) & SYNTAX_SECOND_CHAR_END))
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
427
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
428 #define SYNTAX_CODES_COMMENT_MASK_START(a, b) \
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
429 (SYNTAX_CODES_MATCH_START_P (a, b, SYNTAX_COMMENT_STYLE_A) \
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
430 ? SYNTAX_COMMENT_STYLE_A \
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
431 : (SYNTAX_CODES_MATCH_START_P (a, b, SYNTAX_COMMENT_STYLE_B) \
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
432 ? SYNTAX_COMMENT_STYLE_B \
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
433 : 0))
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
434 #define SYNTAX_CODES_COMMENT_MASK_END(a, b) \
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
435 (SYNTAX_CODES_MATCH_END_P (a, b, SYNTAX_COMMENT_STYLE_A) \
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
436 ? SYNTAX_COMMENT_STYLE_A \
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
437 : (SYNTAX_CODES_MATCH_END_P (a, b, SYNTAX_COMMENT_STYLE_B) \
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
438 ? SYNTAX_COMMENT_STYLE_B \
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
439 : 0))
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
440
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
441 #define SYNTAX_CODE_START_FIRST_P(a) \
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
442 (SYNTAX_CODE_COMMENT_BITS (a) & SYNTAX_FIRST_CHAR_START)
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
443
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
444 #define SYNTAX_CODE_START_SECOND_P(a) \
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
445 (SYNTAX_CODE_COMMENT_BITS (a) & SYNTAX_SECOND_CHAR_START)
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
446
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
447 #define SYNTAX_CODE_END_FIRST_P(a) \
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
448 (SYNTAX_CODE_COMMENT_BITS (a) & SYNTAX_FIRST_CHAR_END)
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
449
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
450 #define SYNTAX_CODE_END_SECOND_P(a) \
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
451 (SYNTAX_CODE_COMMENT_BITS (a) & SYNTAX_SECOND_CHAR_END)
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
452
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
453
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
454 #define SYNTAX_CODES_MATCH_START_P(a, b, mask) \
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
455 ((SYNTAX_CODE_COMMENT_BITS (a) & SYNTAX_FIRST_CHAR_START & (mask)) \
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
456 && (SYNTAX_CODE_COMMENT_BITS (b) \
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
457 & SYNTAX_SECOND_CHAR_START & (mask)))
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
458
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
459 #define SYNTAX_CODES_MATCH_END_P(a, b, mask) \
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
460 ((SYNTAX_CODE_COMMENT_BITS (a) & SYNTAX_FIRST_CHAR_END & (mask)) \
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
461 && (SYNTAX_CODE_COMMENT_BITS (b) & SYNTAX_SECOND_CHAR_END & (mask)))
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
462
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
463 #define SYNTAX_CODE_MATCHES_1CHAR_P(a, mask) \
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
464 ((SYNTAX_CODE_COMMENT_BITS (a) & (mask)))
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
465
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
466 #define SYNTAX_CODE_COMMENT_1CHAR_MASK(a) \
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
467 ((SYNTAX_CODE_MATCHES_1CHAR_P (a, SYNTAX_COMMENT_STYLE_A) \
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
468 ? SYNTAX_COMMENT_STYLE_A \
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
469 : (SYNTAX_CODE_MATCHES_1CHAR_P (a, SYNTAX_COMMENT_STYLE_B) \
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
470 ? SYNTAX_COMMENT_STYLE_B \
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
471 : 0)))
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
472
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
473
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
474 #endif /* INCLUDED_syntax_h_ */