]> code.delx.au - gnu-emacs/blob - lisp/progmodes/cc-langs.el
(c-indent-exp): Keep the indentation of the block
[gnu-emacs] / lisp / progmodes / cc-langs.el
1 ;;; cc-langs.el --- language specific settings for CC Mode
2
3 ;; Copyright (C) 1985,1987,1992-2001 Free Software Foundation, Inc.
4
5 ;; Authors: 2000- Martin Stjernholm
6 ;; 1998-1999 Barry A. Warsaw and Martin Stjernholm
7 ;; 1992-1997 Barry A. Warsaw
8 ;; 1987 Dave Detlefs and Stewart Clamen
9 ;; 1985 Richard M. Stallman
10 ;; Maintainer: bug-cc-mode@gnu.org
11 ;; Created: 22-Apr-1997 (split from cc-mode.el)
12 ;; Version: See cc-mode.el
13 ;; Keywords: c languages oop
14
15 ;; This file is part of GNU Emacs.
16
17 ;; GNU Emacs is free software; you can redistribute it and/or modify
18 ;; it under the terms of the GNU General Public License as published by
19 ;; the Free Software Foundation; either version 2, or (at your option)
20 ;; any later version.
21
22 ;; GNU Emacs is distributed in the hope that it will be useful,
23 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
24 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
25 ;; GNU General Public License for more details.
26
27 ;; You should have received a copy of the GNU General Public License
28 ;; along with this program; see the file COPYING. If not, write to
29 ;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
30 ;; Boston, MA 02111-1307, USA.
31
32 (eval-when-compile
33 (let ((load-path
34 (if (and (boundp 'byte-compile-dest-file)
35 (stringp byte-compile-dest-file))
36 (cons (file-name-directory byte-compile-dest-file) load-path)
37 load-path)))
38 (require 'cc-bytecomp)))
39
40 (cc-require 'cc-defs)
41 (cc-require 'cc-vars)
42
43 \f
44 (defvar c-buffer-is-cc-mode nil
45 "Non-nil for all buffers with a `major-mode' derived from CC Mode.
46 Otherwise, this variable is nil. I.e. this variable is non-nil for
47 `c-mode', `c++-mode', `objc-mode', `java-mode', `idl-mode',
48 `pike-mode', and any other non-CC Mode mode that calls
49 `c-initialize-cc-mode' (e.g. `awk-mode').")
50 (make-variable-buffer-local 'c-buffer-is-cc-mode)
51 (put 'c-buffer-is-cc-mode 'permanent-local t)
52
53 \f
54 ;; Regular expressions and other values which must be parameterized on
55 ;; a per-language basis.
56
57 ;; Regex describing a `symbol' in all languages. We cannot use just
58 ;; `word' syntax class since `_' cannot be in word class. Putting
59 ;; underscore in word class breaks forward word movement behavior that
60 ;; users are familiar with. Besides, this runs counter to Emacs
61 ;; convention.
62 ;;
63 ;; I suspect this definition isn't correct in light of Java's
64 ;; definition of a symbol as being Unicode. I know so little about
65 ;; I18N (except how to sound cool and say I18N :-) that I'm willing to
66 ;; punt on this for now.
67 (defconst c-symbol-key "[_a-zA-Z]\\(\\w\\|\\s_\\)*")
68
69 ;; HELPME: Many of the following keyword lists are more or less bogus
70 ;; for some languages (notably ObjC and IDL). The effects of the
71 ;; erroneous values in the language handling is miniscule since these
72 ;; constants are not used very much (yet, anyway) in the actual syntax
73 ;; detection code, but I'd still appreciate help to get them correct.
74
75 ;; Primitive type keywords.
76 (defconst c-C-primitive-type-kwds
77 "char\\|double\\|float\\|int\\|long\\|short\\|signed\\|unsigned\\|void")
78 (defconst c-C++-primitive-type-kwds c-C-primitive-type-kwds)
79 (defconst c-ObjC-primitive-type-kwds c-C-primitive-type-kwds)
80 (defconst c-Java-primitive-type-kwds
81 "boolean\\|byte\\|char\\|double\\|float\\|int\\|long\\|short\\|void")
82 (defconst c-IDL-primitive-type-kwds c-C-primitive-type-kwds)
83 (defconst c-Pike-primitive-type-kwds
84 (concat "constant\\|float\\|int\\|mapping\\|multiset\\|object\\|"
85 "program\\|string\\|void"))
86
87 ;; Declaration specifier keywords.
88 (defconst c-C-specifier-kwds
89 "auto\\|const\\|extern\\|register\\|static\\|volatile")
90 (defconst c-C++-specifier-kwds
91 (concat c-C-specifier-kwds "\\|friend\\|inline\\|virtual"))
92 (defconst c-ObjC-specifier-kwds c-C++-specifier-kwds)
93 (defconst c-Java-specifier-kwds
94 ;; Note: `const' is not used, but it's still a reserved keyword.
95 (concat "abstract\\|const\\|final\\|native\\|private\\|protected\\|"
96 "public\\|static\\|synchronized\\|transient\\|volatile"))
97 (defconst c-IDL-specifier-kwds c-C++-specifier-kwds)
98 (defconst c-Pike-specifier-kwds
99 (concat "final\\|inline\\|local\\|nomask\\|optional\\|private\\|"
100 "protected\\|static\\|variant"))
101
102 ;; Class/struct declaration keywords.
103 (defconst c-C-class-kwds "struct\\|union")
104 (defconst c-C++-class-kwds (concat c-C-class-kwds "\\|class"))
105 (defconst c-ObjC-class-kwds "interface\\|implementation")
106 (defconst c-Java-class-kwds "class\\|interface")
107 (defconst c-IDL-class-kwds
108 (concat c-C++-class-kwds "\\|interface\\|valuetype"))
109 (defconst c-Pike-class-kwds "class")
110
111 ;; Keywords introducing other declaration-level blocks.
112 (defconst c-C-extra-toplevel-kwds "extern")
113 (defconst c-C++-extra-toplevel-kwds
114 (concat c-C-extra-toplevel-kwds "\\|namespace"))
115 ;;(defconst c-ObjC-extra-toplevel-kwds nil)
116 ;;(defconst c-Java-extra-toplevel-kwds nil)
117 (defconst c-IDL-extra-toplevel-kwds "module")
118 ;;(defconst c-Pike-extra-toplevel-kwds nil)
119
120 ;; Keywords introducing other declaration-level constructs.
121 (defconst c-C-other-decl-kwds "enum\\|typedef")
122 (defconst c-C++-other-decl-kwds (concat c-C-other-decl-kwds "\\|template"))
123 ;;(defconst c-ObjC-other-decl-kwds nil)
124 (defconst c-Java-other-decl-kwds "import\\|package")
125 ;;(defconst c-IDL-other-decl-kwds nil)
126 (defconst c-Pike-other-decl-kwds "import\\|inherit")
127
128 ;; Keywords that occur in declaration-level constructs.
129 ;;(defconst c-C-decl-level-kwds nil)
130 ;;(defconst c-C++-decl-level-kwds nil)
131 ;;(defconst c-ObjC-decl-level-kwds nil)
132 (defconst c-Java-decl-level-kwds "extends\\|implements\\|throws")
133 ;;(defconst c-IDL-decl-level-kwds nil)
134 ;;(defconst c-Pike-decl-level-kwds nil)
135
136 ;; Protection label keywords in classes.
137 ;;(defconst c-C-protection-kwds nil)
138 (defconst c-C++-protection-kwds "private\\|protected\\|public")
139 (defconst c-ObjC-protection-kwds c-C++-protection-kwds)
140 ;;(defconst c-Java-protection-kwds nil)
141 ;;(defconst c-IDL-protection-kwds nil)
142 ;;(defconst c-Pike-protection-kwds nil)
143
144 ;; Statement keywords followed directly by a block.
145 (defconst c-C-block-stmt-1-kwds "do\\|else")
146 (defconst c-C++-block-stmt-1-kwds
147 (concat c-C-block-stmt-1-kwds "\\|asm\\|try"))
148 (defconst c-ObjC-block-stmt-1-kwds c-C++-block-stmt-1-kwds)
149 (defconst c-Java-block-stmt-1-kwds
150 (concat c-C-block-stmt-1-kwds "\\|finally\\|try"))
151 ;;(defconst c-IDL-block-stmt-1-kwds nil)
152 (defconst c-Pike-block-stmt-1-kwds c-C-block-stmt-1-kwds)
153
154 ;; Statement keywords followed by a paren sexp and then by a block.
155 (defconst c-C-block-stmt-2-kwds "for\\|if\\|switch\\|while")
156 (defconst c-C++-block-stmt-2-kwds (concat c-C-block-stmt-2-kwds "\\|catch"))
157 (defconst c-ObjC-block-stmt-2-kwds c-C++-block-stmt-2-kwds)
158 (defconst c-Java-block-stmt-2-kwds
159 (concat c-C++-block-stmt-2-kwds "\\|synchronized"))
160 ;;(defconst c-IDL-block-stmt-2-kwds nil)
161 (defconst c-Pike-block-stmt-2-kwds c-C-block-stmt-2-kwds)
162
163 ;; Statement keywords followed by an expression or nothing.
164 (defconst c-C-simple-stmt-kwds "break\\|continue\\|goto\\|return")
165 (defconst c-C++-simple-stmt-kwds c-C-simple-stmt-kwds)
166 (defconst c-ObjC-simple-stmt-kwds c-C-simple-stmt-kwds)
167 (defconst c-Java-simple-stmt-kwds
168 ;; Note: `goto' is not a valid statement, but the keyword is still reserved.
169 (concat c-C-simple-stmt-kwds "\\|throw"))
170 ;;(defconst c-IDL-simple-stmt-kwds nil)
171 (defconst c-Pike-simple-stmt-kwds "break\\|continue\\|return")
172
173 ;; Keywords introducing labels in blocks.
174 (defconst c-C-label-kwds "case\\|default")
175 (defconst c-C++-label-kwds c-C-label-kwds)
176 (defconst c-ObjC-label-kwds c-C-label-kwds)
177 (defconst c-Java-label-kwds c-C-label-kwds)
178 ;;(defconst c-IDL-label-kwds nil)
179 (defconst c-Pike-label-kwds c-C-label-kwds)
180
181 ;; Keywords that can occur anywhere in expressions.
182 (defconst c-C-expr-kwds "sizeof")
183 (defconst c-C++-expr-kwds
184 (concat c-C-expr-kwds "\\|delete\\|new\\|operator\\|this\\|throw"))
185 (defconst c-ObjC-expr-kwds c-C-expr-kwds)
186 (defconst c-Java-expr-kwds "instanceof\\|new\\|super\\|this")
187 ;;(defconst c-IDL-expr-kwds nil)
188 (defconst c-Pike-expr-kwds
189 (concat c-C-expr-kwds "\\|catch\\|class\\|gauge\\|lambda\\|predef"))
190
191 ;; All keywords.
192 (defconst c-C-keywords
193 (concat c-C-primitive-type-kwds "\\|" c-C-specifier-kwds
194 "\\|" c-C-class-kwds "\\|" c-C-extra-toplevel-kwds
195 "\\|" c-C-other-decl-kwds
196 ;; "\\|" c-C-decl-level-kwds "\\|" c-C-protection-kwds
197 "\\|" c-C-block-stmt-1-kwds "\\|" c-C-block-stmt-2-kwds
198 "\\|" c-C-simple-stmt-kwds "\\|" c-C-label-kwds
199 "\\|" c-C-expr-kwds))
200 (defconst c-C++-keywords
201 (concat c-C++-primitive-type-kwds "\\|" c-C++-specifier-kwds
202 "\\|" c-C++-class-kwds "\\|" c-C++-extra-toplevel-kwds
203 "\\|" c-C++-other-decl-kwds
204 ;; "\\|" c-C++-decl-level-kwds
205 "\\|" c-C++-protection-kwds
206 "\\|" c-C++-block-stmt-1-kwds "\\|" c-C++-block-stmt-2-kwds
207 "\\|" c-C++-simple-stmt-kwds "\\|" c-C++-label-kwds
208 "\\|" c-C++-expr-kwds))
209 (defconst c-ObjC-keywords
210 (concat c-ObjC-primitive-type-kwds "\\|" c-ObjC-specifier-kwds
211 "\\|" c-ObjC-class-kwds
212 ;; "\\|" c-ObjC-extra-toplevel-kwds
213 ;; "\\|" c-ObjC-other-decl-kwds "\\|" c-ObjC-decl-level-kwds
214 "\\|" c-ObjC-protection-kwds
215 "\\|" c-ObjC-block-stmt-1-kwds "\\|" c-ObjC-block-stmt-2-kwds
216 "\\|" c-ObjC-simple-stmt-kwds "\\|" c-ObjC-label-kwds
217 "\\|" c-ObjC-expr-kwds))
218 (defconst c-Java-keywords
219 (concat c-Java-primitive-type-kwds "\\|" c-Java-specifier-kwds
220 "\\|" c-Java-class-kwds
221 ;; "\\|" c-Java-extra-toplevel-kwds
222 "\\|" c-Java-other-decl-kwds "\\|" c-Java-decl-level-kwds
223 ;; "\\|" c-Java-protection-kwds
224 "\\|" c-Java-block-stmt-1-kwds "\\|" c-Java-block-stmt-2-kwds
225 "\\|" c-Java-simple-stmt-kwds "\\|" c-Java-label-kwds
226 "\\|" c-Java-expr-kwds))
227 (defconst c-IDL-keywords
228 (concat c-IDL-primitive-type-kwds "\\|" c-IDL-specifier-kwds
229 "\\|" c-IDL-class-kwds "\\|" c-IDL-extra-toplevel-kwds
230 ;; "\\|" c-IDL-other-decl-kwds "\\|" c-IDL-decl-level-kwds
231 ;; "\\|" c-IDL-protection-kwds
232 ;; "\\|" c-IDL-block-stmt-1-kwds "\\|" c-IDL-block-stmt-2-kwds
233 ;; "\\|" c-IDL-simple-stmt-kwds "\\|" c-IDL-label-kwds
234 ;; "\\|" c-IDL-expr-kwds)
235 ))
236 (defconst c-Pike-keywords
237 (concat c-Pike-primitive-type-kwds "\\|" c-Pike-specifier-kwds
238 "\\|" c-Pike-class-kwds
239 ;; "\\|" c-Pike-extra-toplevel-kwds
240 "\\|" c-Pike-other-decl-kwds
241 ;; "\\|" c-Pike-decl-level-kwds "\\|" c-Pike-protection-kwds
242 "\\|" c-Pike-block-stmt-1-kwds "\\|" c-Pike-block-stmt-2-kwds
243 "\\|" c-Pike-simple-stmt-kwds "\\|" c-Pike-label-kwds
244 "\\|" c-Pike-expr-kwds))
245
246 (defvar c-keywords nil)
247 (make-variable-buffer-local 'c-keywords)
248
249 ;; Keywords defining protection levels
250 (defconst c-protection-key "\\<\\(public\\|protected\\|private\\)\\>")
251
252 ;; Regexps introducing class definitions.
253 (defconst c-C-class-key (c-paren-re c-C-class-kwds))
254 (defconst c-C++-class-key (c-paren-re c-C++-class-kwds))
255 (defconst c-IDL-class-key (c-paren-re c-IDL-class-kwds))
256 (defconst c-ObjC-class-key
257 (concat
258 "@\\(" c-ObjC-class-kwds "\\)\\s +"
259 c-symbol-key ;name of the class
260 "\\(\\s *:\\s *" c-symbol-key "\\)?" ;maybe followed by the superclass
261 "\\(\\s *<[^>]+>\\)?" ;and maybe the adopted protocols list
262 ))
263 (defconst c-Java-class-key
264 (concat
265 "\\(" c-protection-key "\\s +\\)?"
266 "\\(" c-Java-class-kwds "\\)\\s +"
267 c-symbol-key ;name of the class
268 "\\(\\s *extends\\s *" c-symbol-key "\\)?" ;maybe followed by superclass
269 ;;"\\(\\s *implements *[^{]+{\\)?" ;maybe the adopted protocols list
270 ))
271 (defconst c-Pike-class-key (c-paren-re c-Pike-class-kwds))
272
273 (defvar c-class-key c-C-class-key)
274 (make-variable-buffer-local 'c-class-key)
275
276 (defconst c-C-extra-toplevel-key (c-paren-re c-C-extra-toplevel-kwds))
277 (defconst c-C++-extra-toplevel-key (c-paren-re c-C++-extra-toplevel-kwds))
278 (defconst c-IDL-extra-toplevel-key (c-paren-re c-IDL-extra-toplevel-kwds))
279
280 (defvar c-extra-toplevel-key c-C-extra-toplevel-key)
281 (make-variable-buffer-local 'c-extra-toplevel-key)
282
283 ;; Keywords that can introduce bitfields in the languages that supports that.
284 (defconst c-C-bitfield-key "\\(char\\|int\\|long\\|signed\\|unsigned\\)")
285
286 (defvar c-bitfield-key nil)
287 (make-variable-buffer-local 'c-bitfield-key)
288
289 ;; regexp describing access protection clauses. language specific
290 (defvar c-access-key nil)
291 (make-variable-buffer-local 'c-access-key)
292 (defconst c-C++-access-key
293 (concat "\\<\\(" c-C++-protection-kwds "\\)\\>[ \t]*:"))
294 ;;(defconst c-IDL-access-key nil)
295 (defconst c-ObjC-access-key (concat "@" c-protection-key))
296 ;;(defconst c-Java-access-key nil)
297 ;;(defconst c-Pike-access-key nil)
298
299 ;; keywords introducing conditional blocks
300 (defconst c-C-conditional-key nil)
301 (defconst c-C++-conditional-key nil)
302 (defconst c-IDL-conditional-key nil)
303 (defconst c-ObjC-conditional-key nil)
304 (defconst c-Java-conditional-key nil)
305 (defconst c-Pike-conditional-key nil)
306
307 (let ((all-kws "for\\|if\\|do\\|else\\|while\\|switch")
308 (exc-kws "\\|try\\|catch")
309 (thr-kws "\\|finally\\|synchronized")
310 (front "\\<\\(")
311 (back "\\)\\>[^_]"))
312 (setq c-C-conditional-key (concat front all-kws back)
313 c-C++-conditional-key (concat front all-kws exc-kws back)
314 ;; c-IDL-conditional-key is nil.
315 c-ObjC-conditional-key c-C-conditional-key
316 c-Java-conditional-key (concat front all-kws exc-kws thr-kws back)
317 c-Pike-conditional-key (concat front all-kws "\\|foreach" back)))
318
319 (defvar c-conditional-key c-C-conditional-key)
320 (make-variable-buffer-local 'c-conditional-key)
321
322 ;; keywords describing method definition introductions
323 (defvar c-method-key nil)
324 (make-variable-buffer-local 'c-method-key)
325
326 (defconst c-ObjC-method-key
327 (concat
328 "^\\s *[+-]\\s *"
329 "\\(([^)]*)\\)?" ; return type
330 ;; \\s- in objc syntax table does not include \n
331 ;; since it is considered the end of //-comments.
332 "[ \t\n]*" c-symbol-key))
333
334 ;; comment starter definitions for various languages. language specific
335 (defconst c-C++-comment-start-regexp "/[/*]")
336 (defconst c-C-comment-start-regexp c-C++-comment-start-regexp)
337 (defconst c-IDL-comment-start-regexp c-C++-comment-start-regexp)
338 (defconst c-ObjC-comment-start-regexp c-C++-comment-start-regexp)
339 (defconst c-Pike-comment-start-regexp c-C++-comment-start-regexp)
340 ;; We need to match all 3 Java style comments
341 ;; 1) Traditional C block; 2) javadoc /** ...; 3) C++ style
342 (defconst c-Java-comment-start-regexp "/\\(/\\|[*][*]?\\)")
343 (defvar c-comment-start-regexp c-C++-comment-start-regexp)
344 (make-variable-buffer-local 'c-comment-start-regexp)
345
346 ;; Regexp describing a switch's case or default label for all languages
347 (defconst c-switch-label-key "\\(\\(case[( \t]+\\S .*\\)\\|default[ \t]*\\):")
348 ;; Regexp describing any label.
349 (defconst c-label-key (concat c-symbol-key ":\\([^:]\\|$\\)"))
350
351 ;; Regexp describing class inheritance declarations. TBD: this should
352 ;; be language specific, and only makes sense for C++
353 (defconst c-inher-key
354 (concat "\\(\\<static\\>\\s +\\)?"
355 c-C++-class-key "[ \t]+" c-symbol-key
356 "\\([ \t]*:[ \t]*\\)\\s *[^;]"))
357
358 ;; Regexp describing C++ base classes in a derived class definition.
359 ;; TBD: this should be language specific, and only makes sense for C++
360 (defvar c-baseclass-key
361 (concat
362 ":?[ \t]*\\(virtual[ \t]+\\)?\\("
363 c-protection-key "[ \t]+\\)" c-symbol-key))
364 (make-variable-buffer-local 'c-baseclass-key)
365
366 ;; Regexp describing friend declarations in C++ classes.
367 (defconst c-C++-friend-key
368 "friend[ \t]+\\|template[ \t]*<.+>[ \t]*friend[ \t]+")
369
370 ;; Regexp describing Java inheritance and throws clauses.
371 (defconst c-Java-special-key "\\(implements\\|extends\\|throws\\)[^_]")
372
373 ;; Regexp describing the beginning of a Java top-level definition.
374 (defconst c-Java-defun-prompt-regexp
375 "^[ \t]*\\(\\(\\(public\\|protected\\|private\\|const\\|abstract\\|synchronized\\|final\\|static\\|threadsafe\\|transient\\|native\\|volatile\\)\\s-+\\)*\\(\\(\\([[a-zA-Z][][_$.a-zA-Z0-9]*[][_$.a-zA-Z0-9]+\\|[[a-zA-Z]\\)\\s-*\\)\\s-+\\)\\)?\\(\\([[a-zA-Z][][_$.a-zA-Z0-9]*\\s-+\\)\\s-*\\)?\\([_a-zA-Z][^][ \t:;.,{}()\7f=]*\\|\\([_$a-zA-Z][_$.a-zA-Z0-9]*\\)\\)\\s-*\\(([^);{}]*)\\)?\\([] \t]*\\)\\(\\s-*\\<throws\\>\\s-*\\(\\([_$a-zA-Z][_$.a-zA-Z0-9]*\\)[, \t\n\r\f]*\\)+\\)?\\s-*")
376
377 ;; Regexp to append to paragraph-start.
378 (defvar c-append-paragraph-start "$")
379 (make-variable-buffer-local 'c-append-paragraph-start)
380 (defconst c-Java-javadoc-paragraph-start
381 "\\(@[a-zA-Z]+\\>\\|$\\)")
382 (defconst c-Pike-pikedoc-paragraph-start
383 "\\(@[a-zA-Z]+\\>\\([^{]\\|$\\)\\|$\\)")
384
385 ;; Regexp to append to paragraph-separate.
386 (defvar c-append-paragraph-separate "$")
387 (make-variable-buffer-local 'c-append-paragraph-separate)
388 (defconst c-Pike-pikedoc-paragraph-separate c-Pike-pikedoc-paragraph-start)
389
390 ;; Regexp that starts lambda constructs.
391 (defvar c-lambda-key nil)
392 (make-variable-buffer-local 'c-lambda-key)
393 (defconst c-Pike-lambda-key "\\<lambda\\>")
394
395 ;; Regexp that are followed by a statement block in expressions.
396 (defvar c-inexpr-block-key nil)
397 (make-variable-buffer-local 'c-inexpr-block-key)
398 (defconst c-Pike-inexpr-block-key "\\<\\(catch\\|gauge\\)\\>")
399
400 ;; Regexp that may be followed by an anonymous class in expressions.
401 (defvar c-inexpr-class-key nil)
402 (make-variable-buffer-local 'c-inexpr-class-key)
403 (defconst c-Java-inexpr-class-key "\\<new\\>")
404 (defconst c-Pike-inexpr-class-key "\\<class\\>")
405
406 ;; List of open- and close-chars that makes up a pike-style brace
407 ;; list, ie for a `([ ])' list there should be a cons (?\[ . ?\]) in
408 ;; this list.
409 (defvar c-special-brace-lists nil)
410 (make-variable-buffer-local 'c-special-brace-lists)
411 (defconst c-Pike-special-brace-lists '((?{ . ?})
412 (?\[ . ?\])
413 (?< . ?>)))
414
415 \f
416 ;; Syntax tables.
417
418 (defun c-populate-syntax-table (table)
419 ;; Populate the syntax TABLE
420 ;; DO NOT TRY TO SET _ (UNDERSCORE) TO WORD CLASS!
421 (modify-syntax-entry ?_ "_" table)
422 (modify-syntax-entry ?\\ "\\" table)
423 (modify-syntax-entry ?+ "." table)
424 (modify-syntax-entry ?- "." table)
425 (modify-syntax-entry ?= "." table)
426 (modify-syntax-entry ?% "." table)
427 (modify-syntax-entry ?< "." table)
428 (modify-syntax-entry ?> "." table)
429 (modify-syntax-entry ?& "." table)
430 (modify-syntax-entry ?| "." table)
431 (modify-syntax-entry ?\' "\"" table)
432 ;; Set up block and line oriented comments. The new C standard
433 ;; mandates both comment styles even in C, so since all languages
434 ;; now require dual comments, we make this the default.
435 (cond
436 ;; XEmacs 19 & 20
437 ((memq '8-bit c-emacs-features)
438 (modify-syntax-entry ?/ ". 1456" table)
439 (modify-syntax-entry ?* ". 23" table))
440 ;; Emacs 19 & 20
441 ((memq '1-bit c-emacs-features)
442 (modify-syntax-entry ?/ ". 124b" table)
443 (modify-syntax-entry ?* ". 23" table))
444 ;; incompatible
445 (t (error "CC Mode is incompatible with this version of Emacs"))
446 )
447 (modify-syntax-entry ?\n "> b" table)
448 ;; Give CR the same syntax as newline, for selective-display
449 (modify-syntax-entry ?\^m "> b" table))
450
451 ;;;###autoload
452 (defvar c-mode-syntax-table nil
453 "Syntax table used in c-mode buffers.")
454 (if c-mode-syntax-table
455 ()
456 (setq c-mode-syntax-table (make-syntax-table))
457 (c-populate-syntax-table c-mode-syntax-table))
458
459 ;;;###autoload
460 (defvar c++-mode-syntax-table nil
461 "Syntax table used in c++-mode buffers.")
462 (if c++-mode-syntax-table
463 ()
464 (setq c++-mode-syntax-table (make-syntax-table))
465 (c-populate-syntax-table c++-mode-syntax-table)
466 ;; TBD: does it make sense for colon to be symbol class in C++?
467 ;; I'm not so sure, since c-label-key is busted on lines like:
468 ;; Foo::bar( i );
469 ;; maybe c-label-key should be fixed instead of commenting this out,
470 ;; but it also bothers me that this only seems appropriate for C++
471 ;; and not C.
472 ;;(modify-syntax-entry ?: "_" c++-mode-syntax-table)
473 )
474
475 (defvar c++-template-syntax-table nil
476 "A variant of `c++-mode-syntax-table' that defines `<' and `>' as
477 parenthesis characters. Used temporarily when template argument lists
478 are parsed.")
479 (if c++-template-syntax-table
480 ()
481 (setq c++-template-syntax-table
482 (copy-syntax-table c++-mode-syntax-table))
483 (modify-syntax-entry ?< "(>" c++-template-syntax-table)
484 (modify-syntax-entry ?> ")<" c++-template-syntax-table))
485
486 ;;;###autoload
487 (defvar objc-mode-syntax-table nil
488 "Syntax table used in objc-mode buffers.")
489 (if objc-mode-syntax-table
490 ()
491 (setq objc-mode-syntax-table (make-syntax-table))
492 (c-populate-syntax-table objc-mode-syntax-table)
493 ;; add extra Objective-C only syntax
494 (modify-syntax-entry ?@ "_" objc-mode-syntax-table))
495
496 ;;;###autoload
497 (defvar java-mode-syntax-table nil
498 "Syntax table used in java-mode buffers.")
499 (if java-mode-syntax-table
500 ()
501 (setq java-mode-syntax-table (make-syntax-table))
502 (c-populate-syntax-table java-mode-syntax-table))
503
504 ;;;###autoload
505 (defvar idl-mode-syntax-table nil
506 "Syntax table used in idl-mode buffers.")
507 (if idl-mode-syntax-table
508 nil
509 (setq idl-mode-syntax-table (make-syntax-table))
510 (c-populate-syntax-table idl-mode-syntax-table))
511
512 ;;;###autoload
513 (defvar pike-mode-syntax-table nil
514 "Syntax table used in pike-mode buffers.")
515 (if pike-mode-syntax-table
516 ()
517 (setq pike-mode-syntax-table (make-syntax-table))
518 (c-populate-syntax-table pike-mode-syntax-table)
519 (modify-syntax-entry ?@ "." pike-mode-syntax-table))
520
521 \f
522 ;; internal state variables
523
524 ;; Internal state of hungry delete key feature
525 (defvar c-hungry-delete-key nil)
526 (make-variable-buffer-local 'c-hungry-delete-key)
527
528 ;; Internal state of auto newline feature.
529 (defvar c-auto-newline nil)
530 (make-variable-buffer-local 'c-auto-newline)
531
532 ;; Internal auto-newline/hungry-delete designation string for mode line.
533 (defvar c-auto-hungry-string nil)
534 (make-variable-buffer-local 'c-auto-hungry-string)
535
536 ;; Non-nil means K&R style argument declarations are valid.
537 (defvar c-recognize-knr-p t)
538 (make-variable-buffer-local 'c-recognize-knr-p)
539
540 \f
541 (cc-provide 'cc-langs)
542 ;;; cc-langs.el ends here