aboutsummaryrefslogtreecommitdiffstats
path: root/src/syntax.h
diff options
context:
space:
mode:
authorKarl Heuer1997-02-20 06:57:02 +0000
committerKarl Heuer1997-02-20 06:57:02 +0000
commite0b8ff939dbb3ea39fcd7967d5d45e7b33ee45a1 (patch)
tree2c3ca2f7edfd64bbb2bd51f4061ffbb521483374 /src/syntax.h
parent93da5fff9b9bdfc4792699433e33db046f26d0d8 (diff)
downloademacs-e0b8ff939dbb3ea39fcd7967d5d45e7b33ee45a1.tar.gz
emacs-e0b8ff939dbb3ea39fcd7967d5d45e7b33ee45a1.zip
(SET_RAW_SYNTAX_ENTRY): Handle syntax of multibyte
characters. (SYNTAX_ENTRY_FOLLOW_PARENT): New macro. (SYNTAX_ENTRY): Handle syntax of multibyte characters. (SYNTAX, SYNTAX_WITH_FLAGS, SYNTAX_MATCH): Don't signal error even if a syntax entry is not cons.
Diffstat (limited to 'src/syntax.h')
-rw-r--r--src/syntax.h92
1 files changed, 44 insertions, 48 deletions
diff --git a/src/syntax.h b/src/syntax.h
index a4a8fb2a632..a9cbb1dd901 100644
--- a/src/syntax.h
+++ b/src/syntax.h
@@ -51,95 +51,91 @@ enum syntaxcode
51 Smax /* Upper bound on codes that are meaningful */ 51 Smax /* Upper bound on codes that are meaningful */
52 }; 52 };
53 53
54/* Fetch the syntax entry for char C from table TABLE. 54/* Set the syntax entry VAL for char C in table TABLE. */
55 This returns the whole entry (normally a cons cell)
56 and does not do any kind of inheritance. */
57
58#if 1
59#define RAW_SYNTAX_ENTRY(table, c) \
60 (XCHAR_TABLE (table)->contents[(unsigned char) (c)])
61 55
62#define SET_RAW_SYNTAX_ENTRY(table, c, val) \ 56#define SET_RAW_SYNTAX_ENTRY(table, c, val) \
63 (XCHAR_TABLE (table)->contents[(unsigned char) (c)] = (val)) 57 ((unsigned)(c) < 128 \
58 ? (XCHAR_TABLE (table)->contents[(unsigned) (c)] = (val)) \
59 : Faset ((table), (unsigned) (c), (val)))
60
61/* Fetch the syntax entry for char C in syntax table TABLE.
62 This macro is called only when C is less than CHAR_TABLE_ORDINARY_SLOTS.
63 Do inheritance. */
64
65#ifdef __GNUC__
66#define SYNTAX_ENTRY_FOLLOW_PARENT(table, c) \
67 ({ Lisp_Object tbl = table; \
68 Lisp_Object temp = XCHAR_TABLE (tbl)->contents[(c)]; \
69 while (NILP (temp)) \
70 { \
71 tbl = XCHAR_TABLE (tbl)->parent; \
72 if (NILP (tbl)) \
73 break; \
74 temp = XCHAR_TABLE (tbl)->contents[(c)]; \
75 } \
76 temp; })
64#else 77#else
65#define RAW_SYNTAX_ENTRY(table, c) \ 78extern Lisp_Object syntax_temp;
66 ((c) >= 128 \ 79extern Lisp_Object syntax_parent_lookup ();
67 ? raw_syntax_table_lookup (table, c) \
68 : XCHAR_TABLE (table)->contents[(unsigned char) (c)])
69 80
70#define SET_RAW_SYNTAX_ENTRY(table, c, val) \ 81#define SYNTAX_ENTRY_FOLLOW_PARENT(table, c) \
71 ((c) >= 128 \ 82 (syntax_temp = XCHAR_TABLE (table)->contents[(c)], \
72 ? set_raw_syntax_table_lookup (table, c, (val)) \ 83 (NILP (syntax_temp) \
73 : XCHAR_TABLE (table)->contents[(unsigned char) (c)] = (val)) 84 ? syntax_parent_lookup (table, (c)) \
85 : syntax_temp))
74#endif 86#endif
75 87
88/* Fetch the syntax entry for char C in the current syntax table.
89 This returns the whole entry (normally a cons cell).
90 Do Inheritance. */
91
92#define SYNTAX_ENTRY(c) \
93 ((unsigned) (c) < CHAR_TABLE_ORDINARY_SLOTS \
94 ? SYNTAX_ENTRY_FOLLOW_PARENT (current_buffer->syntax_table, (unsigned) (c))\
95 : Faref (current_buffer->syntax_table, make_number (c)))
96
76/* Extract the information from the entry for character C 97/* Extract the information from the entry for character C
77 in syntax table TABLE. Do inheritance. */ 98 in the current syntax table. */
78 99
79#ifdef __GNUC__ 100#ifdef __GNUC__
80#define SYNTAX_ENTRY(c) \
81 ({ Lisp_Object temp, table; \
82 unsigned char cc = (c); \
83 table = current_buffer->syntax_table; \
84 while (!NILP (table)) \
85 { \
86 temp = RAW_SYNTAX_ENTRY (table, cc); \
87 if (!NILP (temp)) \
88 break; \
89 table = XCHAR_TABLE (table)->parent; \
90 } \
91 temp; })
92
93#define SYNTAX(c) \ 101#define SYNTAX(c) \
94 ({ Lisp_Object temp; \ 102 ({ Lisp_Object temp; \
95 temp = SYNTAX_ENTRY (c); \ 103 temp = SYNTAX_ENTRY (c); \
96 (CONSP (temp) \ 104 (CONSP (temp) \
97 ? (enum syntaxcode) (XINT (XCONS (temp)->car) & 0xff) \ 105 ? (enum syntaxcode) (XINT (XCONS (temp)->car) & 0xff) \
98 : wrong_type_argument (Qconsp, temp)); }) 106 : Swhitespace); })
99 107
100#define SYNTAX_WITH_FLAGS(c) \ 108#define SYNTAX_WITH_FLAGS(c) \
101 ({ Lisp_Object temp; \ 109 ({ Lisp_Object temp; \
102 temp = SYNTAX_ENTRY (c); \ 110 temp = SYNTAX_ENTRY (c); \
103 (CONSP (temp) \ 111 (CONSP (temp) \
104 ? XINT (XCONS (temp)->car) \ 112 ? XINT (XCONS (temp)->car) \
105 : wrong_type_argument (Qconsp, temp)); }) 113 : (int) Swhitespace); })
106 114
107#define SYNTAX_MATCH(c) \ 115#define SYNTAX_MATCH(c) \
108 ({ Lisp_Object temp; \ 116 ({ Lisp_Object temp; \
109 temp = SYNTAX_ENTRY (c); \ 117 temp = SYNTAX_ENTRY (c); \
110 (CONSP (temp) \ 118 (CONSP (temp) \
111 ? XINT (XCONS (temp)->cdr) \ 119 ? XINT (XCONS (temp)->cdr) \
112 : wrong_type_argument (Qconsp, temp)); }) 120 : Qnil); })
113#else 121#else
114extern Lisp_Object syntax_temp;
115extern Lisp_Object syntax_parent_lookup ();
116
117#define SYNTAX_ENTRY(c) \
118 (syntax_temp \
119 = RAW_SYNTAX_ENTRY (current_buffer->syntax_table, (c)), \
120 (NILP (syntax_temp) \
121 ? (syntax_temp \
122 = syntax_parent_lookup (current_buffer->syntax_table, \
123 (unsigned char) (c))) \
124 : syntax_temp))
125
126#define SYNTAX(c) \ 122#define SYNTAX(c) \
127 (syntax_temp = SYNTAX_ENTRY ((c)), \ 123 (syntax_temp = SYNTAX_ENTRY ((c)), \
128 (CONSP (syntax_temp) \ 124 (CONSP (syntax_temp) \
129 ? (enum syntaxcode) (XINT (XCONS (syntax_temp)->car) & 0xff) \ 125 ? (enum syntaxcode) (XINT (XCONS (syntax_temp)->car) & 0xff) \
130 : wrong_type_argument (Qconsp, syntax_temp))) 126 : Swhitespace))
131 127
132#define SYNTAX_WITH_FLAGS(c) \ 128#define SYNTAX_WITH_FLAGS(c) \
133 (syntax_temp = SYNTAX_ENTRY ((c)), \ 129 (syntax_temp = SYNTAX_ENTRY ((c)), \
134 (CONSP (syntax_temp) \ 130 (CONSP (syntax_temp) \
135 ? XINT (XCONS (syntax_temp)->car) \ 131 ? XINT (XCONS (syntax_temp)->car) \
136 : wrong_type_argument (Qconsp, syntax_temp))) 132 : (int) Swhitespace))
137 133
138#define SYNTAX_MATCH(c) \ 134#define SYNTAX_MATCH(c) \
139 (syntax_temp = SYNTAX_ENTRY ((c)), \ 135 (syntax_temp = SYNTAX_ENTRY ((c)), \
140 (CONSP (syntax_temp) \ 136 (CONSP (syntax_temp) \
141 ? XINT (XCONS (syntax_temp)->cdr) \ 137 ? XINT (XCONS (syntax_temp)->cdr) \
142 : wrong_type_argument (Qconsp, syntax_temp))) 138 : Qnil))
143#endif 139#endif
144 140
145/* Then there are six single-bit flags that have the following meanings: 141/* Then there are six single-bit flags that have the following meanings: