Refill some copyright headers.
[bpt/emacs.git] / lisp / progmodes / cc-mode.el
CommitLineData
d9e94c22 1;;; cc-mode.el --- major mode for editing C and similar languages
785eecbb 2
92ab3834 3;; Copyright (C) 1985, 1987, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
e9bffc61
GM
4;; 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
5;; 2010, 2011 Free Software Foundation, Inc.
785eecbb 6
d9e94c22
MS
7;; Authors: 2003- Alan Mackenzie
8;; 1998- Martin Stjernholm
9;; 1992-1999 Barry A. Warsaw
5858f68c
GM
10;; 1987 Dave Detlefs
11;; 1987 Stewart Clamen
785eecbb 12;; 1985 Richard M. Stallman
0ec8351b 13;; Maintainer: bug-cc-mode@gnu.org
785eecbb 14;; Created: a long, long, time ago. adapted from the original c-mode.el
bd78fa1d 15;; Keywords: c languages
785eecbb 16
785eecbb
RS
17;; This file is part of GNU Emacs.
18
b1fc2b50 19;; GNU Emacs is free software: you can redistribute it and/or modify
785eecbb 20;; it under the terms of the GNU General Public License as published by
b1fc2b50
GM
21;; the Free Software Foundation, either version 3 of the License, or
22;; (at your option) any later version.
785eecbb
RS
23
24;; GNU Emacs is distributed in the hope that it will be useful,
25;; but WITHOUT ANY WARRANTY; without even the implied warranty of
26;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
27;; GNU General Public License for more details.
28
29;; You should have received a copy of the GNU General Public License
b1fc2b50 30;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
785eecbb 31
d9e94c22 32;;; Commentary:
130c507e
GM
33
34;; NOTE: Read the commentary below for the right way to submit bug reports!
35;; NOTE: See the accompanying texinfo manual for details on using this mode!
d9e94c22 36;; Note: The version string is in cc-defs.
785eecbb
RS
37
38;; This package provides GNU Emacs major modes for editing C, C++,
d9e94c22
MS
39;; Objective-C, Java, CORBA's IDL, Pike and AWK code. As of the
40;; latest Emacs and XEmacs releases, it is the default package for
41;; editing these languages. This package is called "CC Mode", and
42;; should be spelled exactly this way.
0ec8351b
BW
43
44;; CC Mode supports K&R and ANSI C, ANSI C++, Objective-C, Java,
d9e94c22
MS
45;; CORBA's IDL, Pike and AWK with a consistent indentation model
46;; across all modes. This indentation model is intuitive and very
47;; flexible, so that almost any desired style of indentation can be
48;; supported. Installation, usage, and programming details are
49;; contained in an accompanying texinfo manual.
785eecbb
RS
50
51;; CC Mode's immediate ancestors were, c++-mode.el, cplus-md.el, and
52;; cplus-md1.el..
53
785eecbb 54;; To submit bug reports, type "C-c C-b". These will be sent to
0ec8351b
BW
55;; bug-gnu-emacs@gnu.org (mirrored as the Usenet newsgroup
56;; gnu.emacs.bug) as well as bug-cc-mode@gnu.org, which directly
57;; contacts the CC Mode maintainers. Questions can sent to
58;; help-gnu-emacs@gnu.org (mirrored as gnu.emacs.help) and/or
130c507e
GM
59;; bug-cc-mode@gnu.org. Please do not send bugs or questions to our
60;; personal accounts; we reserve the right to ignore such email!
785eecbb 61
785eecbb
RS
62;; Many, many thanks go out to all the folks on the beta test list.
63;; Without their patience, testing, insight, code contributions, and
64;; encouragement CC Mode would be a far inferior package.
65
66;; You can get the latest version of CC Mode, including PostScript
67;; documentation and separate individual files from:
68;;
91b807c9 69;; http://cc-mode.sourceforge.net/
0ec8351b
BW
70;;
71;; You can join a moderated CC Mode announcement-only mailing list by
72;; visiting
785eecbb 73;;
91b807c9 74;; http://lists.sourceforge.net/mailman/listinfo/cc-mode-announce
785eecbb
RS
75
76;;; Code:
77
ae500c1a
GM
78;; For Emacs < 22.2.
79(eval-and-compile
80 (unless (fboundp 'declare-function) (defmacro declare-function (&rest r))))
81
51f606de
GM
82(eval-when-compile
83 (let ((load-path
130c507e
GM
84 (if (and (boundp 'byte-compile-dest-file)
85 (stringp byte-compile-dest-file))
86 (cons (file-name-directory byte-compile-dest-file) load-path)
51f606de 87 load-path)))
d9e94c22 88 (load "cc-bytecomp" nil t)))
130c507e
GM
89
90(cc-require 'cc-defs)
d9e94c22 91(cc-require-when-compile 'cc-langs)
130c507e 92(cc-require 'cc-vars)
130c507e 93(cc-require 'cc-engine)
d9e94c22 94(cc-require 'cc-styles)
130c507e
GM
95(cc-require 'cc-cmds)
96(cc-require 'cc-align)
d9e94c22 97(cc-require 'cc-menus)
130c507e 98
3efc2cd7 99;; Silence the compiler.
0386b551 100(cc-bytecomp-defvar adaptive-fill-first-line-regexp) ; Emacs
130c507e 101(cc-bytecomp-defun set-keymap-parents) ; XEmacs
0386b551 102(cc-bytecomp-defun run-mode-hooks) ; Emacs 21.1
130c507e 103
d9e94c22
MS
104;; We set these variables during mode init, yet we don't require
105;; font-lock.
106(cc-bytecomp-defvar font-lock-defaults)
107(cc-bytecomp-defvar font-lock-syntactic-keywords)
108
130c507e
GM
109;; Menu support for both XEmacs and Emacs. If you don't have easymenu
110;; with your version of Emacs, you are incompatible!
d9e94c22
MS
111(cc-external-require 'easymenu)
112
0386b551
AM
113;; Autoload directive for emacsen that doesn't have an older CC Mode
114;; version in the dist.
653d1554 115(autoload 'subword-mode "subword"
0386b551
AM
116 "Mode enabling subword movement and editing keys." t)
117
d9e94c22
MS
118;; Load cc-fonts first after font-lock is loaded, since it isn't
119;; necessary until font locking is requested.
3c0ab532
AM
120; (eval-after-load "font-lock" ; 2006-07-09: font-lock is now preloaded.
121; '
122(require 'cc-fonts) ;)
d9e94c22
MS
123
124;; cc-langs isn't loaded when we're byte compiled, so add autoload
125;; directives for the interface functions.
126(autoload 'c-make-init-lang-vars-fun "cc-langs")
127(autoload 'c-init-language-vars "cc-langs" nil nil 'macro)
785eecbb
RS
128
129\f
1dad6919
RS
130;; Other modes and packages which depend on CC Mode should do the
131;; following to make sure everything is loaded and available for their
132;; use:
133;;
134;; (require 'cc-mode)
a66cd3ee
MS
135;;
136;; And in the major mode function:
137;;
d9e94c22
MS
138;; (c-initialize-cc-mode t)
139;; (c-init-language-vars some-mode)
140;; (c-common-init 'some-mode) ; Or perhaps (c-basic-common-init 'some-mode)
141;;
28d88c16
MS
142;; If you're not writing a derived mode using the language variable
143;; system, then some-mode is one of the language modes directly
144;; supported by CC Mode. You can then use (c-init-language-vars-for
145;; 'some-mode) instead of `c-init-language-vars'.
146;; `c-init-language-vars-for' is a function that avoids the rather
147;; large expansion of `c-init-language-vars'.
148;;
149;; If you use `c-basic-common-init' then you might want to call
150;; `c-font-lock-init' too to set up CC Mode's font lock support.
151;;
d9e94c22
MS
152;; See cc-langs.el for further info. A small example of a derived mode
153;; is also available at <http://cc-mode.sourceforge.net/
154;; derived-mode-ex.el>.
1dad6919 155
a66cd3ee
MS
156(defun c-leave-cc-mode-mode ()
157 (setq c-buffer-is-cc-mode nil))
158
28d88c16
MS
159(defun c-init-language-vars-for (mode)
160 "Initialize the language variables for one of the language modes
161directly supported by CC Mode. This can be used instead of the
162`c-init-language-vars' macro if the language you want to use is one of
163those, rather than a derived language defined through the language
164variable system (see \"cc-langs.el\")."
28d88c16
MS
165 (cond ((eq mode 'c-mode) (c-init-language-vars c-mode))
166 ((eq mode 'c++-mode) (c-init-language-vars c++-mode))
167 ((eq mode 'objc-mode) (c-init-language-vars objc-mode))
168 ((eq mode 'java-mode) (c-init-language-vars java-mode))
169 ((eq mode 'idl-mode) (c-init-language-vars idl-mode))
170 ((eq mode 'pike-mode) (c-init-language-vars pike-mode))
171 ((eq mode 'awk-mode) (c-init-language-vars awk-mode))
172 (t (error "Unsupported mode %s" mode))))
173
aac90c52 174;;;###autoload
d9e94c22
MS
175(defun c-initialize-cc-mode (&optional new-style-init)
176 "Initialize CC Mode for use in the current buffer.
177If the optional NEW-STYLE-INIT is nil or left out then all necessary
178initialization to run CC Mode for the C language is done. Otherwise
28d88c16
MS
179only some basic setup is done, and a call to `c-init-language-vars' or
180`c-init-language-vars-for' is necessary too (which gives more
181control). See \"cc-mode.el\" for more info."
d9e94c22 182
611c76a7 183 (setq c-buffer-is-cc-mode t)
d9e94c22 184
0ec8351b
BW
185 (let ((initprop 'cc-mode-is-initialized)
186 c-initialization-ok)
187 (unless (get 'c-initialize-cc-mode initprop)
0ec8351b
BW
188 (unwind-protect
189 (progn
51f606de
GM
190 (put 'c-initialize-cc-mode initprop t)
191 (c-initialize-builtin-style)
0ec8351b 192 (run-hooks 'c-initialization-hook)
51f606de
GM
193 ;; Fix obsolete variables.
194 (if (boundp 'c-comment-continuation-stars)
d2f79585
TTN
195 (setq c-block-comment-prefix
196 (symbol-value 'c-comment-continuation-stars)))
a66cd3ee 197 (add-hook 'change-major-mode-hook 'c-leave-cc-mode-mode)
0ec8351b
BW
198 (setq c-initialization-ok t))
199 ;; Will try initialization hooks again if they failed.
d9e94c22
MS
200 (put 'c-initialize-cc-mode initprop c-initialization-ok))))
201
202 (unless new-style-init
28d88c16 203 (c-init-language-vars-for 'c-mode)))
1dad6919
RS
204
205\f
d9e94c22
MS
206;;; Common routines.
207
130c507e
GM
208(defvar c-mode-base-map ()
209 "Keymap shared by all CC Mode related modes.")
210
211(defun c-make-inherited-keymap ()
212 (let ((map (make-sparse-keymap)))
3efc2cd7
MS
213 ;; Necessary to use `cc-bytecomp-fboundp' below since this
214 ;; function is called from top-level forms that are evaluated
215 ;; while cc-bytecomp is active when one does M-x eval-buffer.
130c507e 216 (cond
d9e94c22 217 ;; Emacs
3efc2cd7 218 ((cc-bytecomp-fboundp 'set-keymap-parent)
130c507e 219 (set-keymap-parent map c-mode-base-map))
b705155a
SM
220 ;; XEmacs
221 ((cc-bytecomp-fboundp 'set-keymap-parents)
222 (set-keymap-parents map c-mode-base-map))
130c507e
GM
223 ;; incompatible
224 (t (error "CC Mode is incompatible with this version of Emacs")))
225 map))
226
a66cd3ee
MS
227(defun c-define-abbrev-table (name defs)
228 ;; Compatibility wrapper for `define-abbrev' which passes a non-nil
229 ;; sixth argument for SYSTEM-FLAG in emacsen that support it
0386b551 230 ;; (currently only Emacs >= 21.2).
d9e94c22
MS
231 (let ((table (or (symbol-value name)
232 (progn (define-abbrev-table name nil)
233 (symbol-value name)))))
a66cd3ee
MS
234 (while defs
235 (condition-case nil
236 (apply 'define-abbrev table (append (car defs) '(t)))
237 (wrong-number-of-arguments
238 (apply 'define-abbrev table (car defs))))
239 (setq defs (cdr defs)))))
d9e94c22 240(put 'c-define-abbrev-table 'lisp-indent-function 1)
a66cd3ee 241
0386b551
AM
242(defun c-bind-special-erase-keys ()
243 ;; Only used in Emacs to bind C-c C-<delete> and C-c C-<backspace>
244 ;; to the proper keys depending on `normal-erase-is-backspace'.
245 (if normal-erase-is-backspace
246 (progn
247 (define-key c-mode-base-map (kbd "C-c C-<delete>")
248 'c-hungry-delete-forward)
249 (define-key c-mode-base-map (kbd "C-c C-<backspace>")
cb694ab7 250 'c-hungry-delete-backwards))
0386b551 251 (define-key c-mode-base-map (kbd "C-c C-<delete>")
cb694ab7 252 'c-hungry-delete-backwards)
0386b551
AM
253 (define-key c-mode-base-map (kbd "C-c C-<backspace>")
254 'c-hungry-delete-forward)))
255
130c507e
GM
256(if c-mode-base-map
257 nil
0386b551 258
130c507e 259 (setq c-mode-base-map (make-sparse-keymap))
0386b551 260
130c507e
GM
261 ;; Separate M-BS from C-M-h. The former should remain
262 ;; backward-kill-word.
263 (define-key c-mode-base-map [(control meta h)] 'c-mark-function)
264 (define-key c-mode-base-map "\e\C-q" 'c-indent-exp)
265 (substitute-key-definition 'backward-sentence
266 'c-beginning-of-statement
267 c-mode-base-map global-map)
268 (substitute-key-definition 'forward-sentence
269 'c-end-of-statement
270 c-mode-base-map global-map)
271 (substitute-key-definition 'indent-new-comment-line
272 'c-indent-new-comment-line
273 c-mode-base-map global-map)
0386b551 274 (substitute-key-definition 'indent-for-tab-command
17ee4625
DN
275 ;; XXX Is this the right thing to do
276 ;; here?
277 'c-indent-line-or-region
0386b551 278 c-mode-base-map global-map)
a66cd3ee
MS
279 (when (fboundp 'comment-indent-new-line)
280 ;; indent-new-comment-line has changed name to
281 ;; comment-indent-new-line in Emacs 21.
282 (substitute-key-definition 'comment-indent-new-line
283 'c-indent-new-comment-line
284 c-mode-base-map global-map))
0386b551 285
130c507e 286 ;; RMS says don't make these the default.
51c9af45 287 ;; (April 2006): RMS has now approved these commands as defaults.
13ac2398
AM
288 (unless (memq 'argumentative-bod-function c-emacs-features)
289 (define-key c-mode-base-map "\e\C-a" 'c-beginning-of-defun)
290 (define-key c-mode-base-map "\e\C-e" 'c-end-of-defun))
0386b551 291
130c507e
GM
292 (define-key c-mode-base-map "\C-c\C-n" 'c-forward-conditional)
293 (define-key c-mode-base-map "\C-c\C-p" 'c-backward-conditional)
294 (define-key c-mode-base-map "\C-c\C-u" 'c-up-conditional)
d9e94c22
MS
295
296 ;; It doesn't suffice to put `c-fill-paragraph' on
297 ;; `fill-paragraph-function' since `c-fill-paragraph' must be called
298 ;; before any fill prefix adaption is done. E.g. `filladapt-mode'
299 ;; replaces `fill-paragraph' and does the adaption before calling
300 ;; `fill-paragraph-function', and we have to mask comments etc
301 ;; before that. Also, `c-fill-paragraph' chains on to
302 ;; `fill-paragraph' and the value on `fill-parapgraph-function' to
303 ;; do the actual filling work.
130c507e
GM
304 (substitute-key-definition 'fill-paragraph 'c-fill-paragraph
305 c-mode-base-map global-map)
306 ;; In XEmacs the default fill function is called
307 ;; fill-paragraph-or-region.
308 (substitute-key-definition 'fill-paragraph-or-region 'c-fill-paragraph
309 c-mode-base-map global-map)
d9e94c22 310
0386b551
AM
311 ;; We bind the forward deletion key and (implicitly) C-d to
312 ;; `c-electric-delete-forward', and the backward deletion key to
313 ;; `c-electric-backspace'. The hungry variants are bound to the
314 ;; same keys but prefixed with C-c. This implies that C-c C-d is
315 ;; `c-hungry-delete-forward'. For consistency, we bind not only C-c
cb694ab7
AM
316 ;; <backspace> to `c-hungry-delete-backwards' but also
317 ;; C-c C-<backspace>, so that the Ctrl key can be held down during
318 ;; the whole sequence regardless of the direction. This in turn
319 ;; implies that we bind C-c C-<delete> to `c-hungry-delete-forward',
320 ;; for the same reason.
0386b551 321
6d28be1d
EZ
322 ;; Bind the electric deletion functions to C-d and DEL. Emacs 21
323 ;; automatically maps the [delete] and [backspace] keys to these two
324 ;; depending on window system and user preferences. (In earlier
325 ;; versions it's possible to do the same by using `function-key-map'.)
326 (define-key c-mode-base-map "\C-d" 'c-electric-delete-forward)
327 (define-key c-mode-base-map "\177" 'c-electric-backspace)
0386b551 328 (define-key c-mode-base-map "\C-c\C-d" 'c-hungry-delete-forward)
cb694ab7
AM
329 (define-key c-mode-base-map [?\C-c ?\d] 'c-hungry-delete-backwards)
330 (define-key c-mode-base-map [?\C-c ?\C-\d] 'c-hungry-delete-backwards)
0386b551
AM
331 (define-key c-mode-base-map [?\C-c deletechar] 'c-hungry-delete-forward) ; C-c <delete> on a tty.
332 (define-key c-mode-base-map [?\C-c (control deletechar)] ; C-c C-<delete> on a tty.
333 'c-hungry-delete-forward)
334 (when (boundp 'normal-erase-is-backspace)
335 ;; The automatic C-d and DEL mapping functionality doesn't extend
336 ;; to special combinations like C-c C-<delete>, so we have to hook
337 ;; into the `normal-erase-is-backspace' system to bind it directly
338 ;; as appropriate.
339 (add-hook 'normal-erase-is-backspace-hook 'c-bind-special-erase-keys)
340 (c-bind-special-erase-keys))
341
342 (when (fboundp 'delete-forward-p)
343 ;; In XEmacs we fix the forward and backward deletion behavior by
344 ;; binding the keysyms for the [delete] and [backspace] keys
345 ;; directly, and use `delete-forward-p' to decide what [delete]
346 ;; should do. That's done in the XEmacs specific
347 ;; `c-electric-delete' and `c-hungry-delete' functions.
6d28be1d 348 (define-key c-mode-base-map [delete] 'c-electric-delete)
0386b551
AM
349 (define-key c-mode-base-map [backspace] 'c-electric-backspace)
350 (define-key c-mode-base-map (kbd "C-c <delete>") 'c-hungry-delete)
351 (define-key c-mode-base-map (kbd "C-c C-<delete>") 'c-hungry-delete)
cb694ab7
AM
352 (define-key c-mode-base-map (kbd "C-c <backspace>")
353 'c-hungry-delete-backwards)
354 (define-key c-mode-base-map (kbd "C-c C-<backspace>")
355 'c-hungry-delete-backwards))
0386b551
AM
356
357 (define-key c-mode-base-map "#" 'c-electric-pound)
358 (define-key c-mode-base-map "{" 'c-electric-brace)
359 (define-key c-mode-base-map "}" 'c-electric-brace)
130c507e 360 (define-key c-mode-base-map "/" 'c-electric-slash)
0386b551
AM
361 (define-key c-mode-base-map "*" 'c-electric-star)
362 (define-key c-mode-base-map ";" 'c-electric-semi&comma)
363 (define-key c-mode-base-map "," 'c-electric-semi&comma)
364 (define-key c-mode-base-map ":" 'c-electric-colon)
365 (define-key c-mode-base-map "(" 'c-electric-paren)
366 (define-key c-mode-base-map ")" 'c-electric-paren)
367
130c507e 368 (define-key c-mode-base-map "\C-c\C-\\" 'c-backslash-region)
0386b551 369 (define-key c-mode-base-map "\C-c\C-a" 'c-toggle-auto-newline)
130c507e
GM
370 (define-key c-mode-base-map "\C-c\C-b" 'c-submit-bug-report)
371 (define-key c-mode-base-map "\C-c\C-c" 'comment-region)
0386b551 372 (define-key c-mode-base-map "\C-c\C-l" 'c-toggle-electric-state)
130c507e 373 (define-key c-mode-base-map "\C-c\C-o" 'c-set-offset)
0386b551 374 (define-key c-mode-base-map "\C-c\C-q" 'c-indent-defun)
130c507e 375 (define-key c-mode-base-map "\C-c\C-s" 'c-show-syntactic-information)
0386b551 376 ;; (define-key c-mode-base-map "\C-c\C-t" 'c-toggle-auto-hungry-state) Commented out by ACM, 2005-03-05.
130c507e
GM
377 (define-key c-mode-base-map "\C-c." 'c-set-style)
378 ;; conflicts with OOBR
379 ;;(define-key c-mode-base-map "\C-c\C-v" 'c-version)
0386b551 380 ;; (define-key c-mode-base-map "\C-c\C-y" 'c-toggle-hungry-state) Commented out by ACM, 2005-11-22.
653d1554 381 (define-key c-mode-base-map "\C-c\C-w" 'subword-mode)
130c507e
GM
382 )
383
130c507e
GM
384;; We don't require the outline package, but we configure it a bit anyway.
385(cc-bytecomp-defvar outline-level)
386
d9e94c22
MS
387(defun c-mode-menu (modestr)
388 "Return a menu spec suitable for `easy-menu-define' that is exactly
389like the C mode menu except that the menu bar item name is MODESTR
390instead of \"C\".
391
392This function is provided for compatibility only; derived modes should
393preferably use the `c-mode-menu' language constant directly."
394 (cons modestr (c-lang-const c-mode-menu c)))
395
396;; Ugly hack to pull in the definition of `c-populate-syntax-table'
397;; from cc-langs to make it available at runtime. It's either this or
398;; moving the definition for it to cc-defs, but that would mean to
399;; break up the syntax table setup over two files.
400(defalias 'c-populate-syntax-table
401 (cc-eval-when-compile
402 (let ((f (symbol-function 'c-populate-syntax-table)))
403 (if (byte-code-function-p f) f (byte-compile f)))))
404
0386b551
AM
405;; CAUTION: Try to avoid installing things on
406;; `before-change-functions'. The macro `combine-after-change-calls'
407;; is used and it doesn't work if there are things on that hook. That
408;; can cause font lock functions to run in inconvenient places during
409;; temporary changes in some font lock support modes, causing extra
410;; unnecessary work and font lock glitches due to interactions between
411;; various text properties.
0ec1d2c5 412;;
9c184ed2
AM
413;; (2007-02-12): The macro `combine-after-change-calls' ISN'T used any
414;; more.
415
416(defun c-unfind-enclosing-token (pos)
417 ;; If POS is wholly inside a token, remove that id from
418 ;; `c-found-types', should it be present. Return t if we were in an
419 ;; id, else nil.
420 (save-excursion
421 (let ((tok-beg (progn (goto-char pos)
422 (and (c-beginning-of-current-token) (point))))
423 (tok-end (progn (goto-char pos)
424 (and (c-end-of-current-token) (point)))))
425 (when (and tok-beg tok-end)
426 (c-unfind-type (buffer-substring-no-properties tok-beg tok-end))
427 t))))
428
429(defun c-unfind-coalesced-tokens (beg end)
430 ;; unless the non-empty region (beg end) is entirely WS and there's at
431 ;; least one character of WS just before or after this region, remove
432 ;; the tokens which touch the region from `c-found-types' should they
433 ;; be present.
434 (or (c-partial-ws-p beg end)
435 (save-excursion
436 (progn
437 (goto-char beg)
438 (or (eq beg (point-min))
439 (c-skip-ws-backward (1- beg))
440 (/= (point) beg)
441 (= (c-backward-token-2) 1)
442 (c-unfind-type (buffer-substring-no-properties
443 (point) beg)))
444 (goto-char end)
445 (or (eq end (point-max))
446 (c-skip-ws-forward (1+ end))
447 (/= (point) end)
448 (progn (forward-char) (c-end-of-current-token) nil)
449 (c-unfind-type (buffer-substring-no-properties
450 end (point))))))))
451
452;; c-maybe-stale-found-type records a place near the region being
0ec1d2c5 453;; changed where an element of `found-types' might become stale. It
9c184ed2
AM
454;; is set in c-before-change and is either nil, or has the form:
455;;
456;; (c-decl-id-start "foo" 97 107 " (* ooka) " "o"), where
0ec1d2c5 457;;
9c184ed2
AM
458;; o - `c-decl-id-start' is the c-type text property value at buffer
459;; pos 96.
0ec1d2c5 460;;
9c184ed2
AM
461;; o - 97 107 is the region potentially containing the stale type -
462;; this is delimited by a non-nil c-type text property at 96 and
463;; either another one or a ";", "{", or "}" at 107.
0ec1d2c5 464;;
9c184ed2
AM
465;; o - " (* ooka) " is the (before change) buffer portion containing
466;; the suspect type (here "ooka").
467;;
468;; o - "o" is the buffer contents which is about to be deleted. This
469;; would be the empty string for an insertion.
470(defvar c-maybe-stale-found-type nil)
471(make-variable-buffer-local 'c-maybe-stale-found-type)
472
d9e94c22
MS
473(defun c-basic-common-init (mode default-style)
474 "Do the necessary initialization for the syntax handling routines
475and the line breaking/filling code. Intended to be used by other
476packages that embed CC Mode.
477
478MODE is the CC Mode flavor to set up, e.g. 'c-mode or 'java-mode.
479DEFAULT-STYLE tells which indentation style to install. It has the
480same format as `c-default-style'.
481
482Note that `c-init-language-vars' must be called before this function.
483This function cannot do that since `c-init-language-vars' is a macro
484that requires a literal mode spec at compile time."
d9e94c22 485
a66cd3ee
MS
486 (setq c-buffer-is-cc-mode mode)
487
130c507e
GM
488 ;; these variables should always be buffer local; they do not affect
489 ;; indentation style.
130c507e
GM
490 (make-local-variable 'comment-start)
491 (make-local-variable 'comment-end)
130c507e 492 (make-local-variable 'comment-start-skip)
175069ef 493
0386b551
AM
494 (make-local-variable 'paragraph-start)
495 (make-local-variable 'paragraph-separate)
496 (make-local-variable 'paragraph-ignore-fill-prefix)
497 (make-local-variable 'adaptive-fill-mode)
498 (make-local-variable 'adaptive-fill-regexp)
a66cd3ee 499
130c507e 500 ;; now set their values
175069ef
SM
501 (set (make-local-variable 'parse-sexp-ignore-comments) t)
502 (set (make-local-variable 'indent-line-function) 'c-indent-line)
503 (set (make-local-variable 'indent-region-function) 'c-indent-region)
504 (set (make-local-variable 'normal-auto-fill-function) 'c-do-auto-fill)
505 (set (make-local-variable 'comment-multi-line) t)
506 (set (make-local-variable 'comment-line-break-function)
507 'c-indent-new-comment-line)
a66cd3ee 508
fd8771f5
MS
509 ;; Install `c-fill-paragraph' on `fill-paragraph-function' so that a
510 ;; direct call to `fill-paragraph' behaves better. This still
511 ;; doesn't work with filladapt but it's better than nothing.
175069ef 512 (set (make-local-variable 'fill-paragraph-function) 'c-fill-paragraph)
fd8771f5 513
0ec1d2c5
AM
514 ;; Initialise the cache of brace pairs, and opening braces/brackets/parens.
515 (c-state-cache-init)
516
0386b551 517 (when (or c-recognize-<>-arglists
1d1e4868 518 (c-major-mode-is 'awk-mode)
452ea855 519 (c-major-mode-is '(java-mode c-mode c++-mode objc-mode)))
0386b551
AM
520 ;; We'll use the syntax-table text property to change the syntax
521 ;; of some chars for this language, so do the necessary setup for
522 ;; that.
523 ;;
524 ;; Note to other package developers: It's ok to turn this on in CC
525 ;; Mode buffers when CC Mode doesn't, but it's not ok to turn it
526 ;; off if CC Mode has turned it on.
527
528 ;; Emacs.
529 (when (boundp 'parse-sexp-lookup-properties)
175069ef 530 (set (make-local-variable 'parse-sexp-lookup-properties) t))
0386b551
AM
531
532 ;; Same as above for XEmacs.
533 (when (boundp 'lookup-syntax-properties)
175069ef 534 (set (make-local-variable 'lookup-syntax-properties) t)))
d9e94c22 535
d0fcee66 536 ;; Use this in Emacs 21+ to avoid meddling with the rear-nonsticky
d9e94c22
MS
537 ;; property on each character.
538 (when (boundp 'text-property-default-nonsticky)
d0fcee66
AM
539 (mapc (lambda (tprop)
540 (unless (assq tprop text-property-default-nonsticky)
175069ef
SM
541 (set (make-local-variable 'text-property-default-nonsticky)
542 (cons `(,tprop . t) text-property-default-nonsticky))))
d0fcee66 543 '(syntax-table category c-type)))
d9e94c22
MS
544
545 ;; In Emacs 21 and later it's possible to turn off the ad-hoc
546 ;; heuristic that open parens in column 0 are defun starters. Since
0386b551
AM
547 ;; we have c-state-cache, that heuristic isn't useful and only causes
548 ;; trouble, so turn it off.
99c8496e
AM
549;; 2006/12/17: This facility is somewhat confused, and doesn't really seem
550;; helpful. Comment it out for now.
551;; (when (memq 'col-0-paren c-emacs-features)
552;; (make-local-variable 'open-paren-in-column-0-is-defun-start)
553;; (setq open-paren-in-column-0-is-defun-start nil))
d9e94c22 554
d9e94c22
MS
555 (c-clear-found-types)
556
557 ;; now set the mode style based on default-style
558 (let ((style (if (stringp default-style)
559 default-style
560 (or (cdr (assq mode default-style))
561 (cdr (assq 'other default-style))
130c507e
GM
562 "gnu"))))
563 ;; Override style variables if `c-old-style-variable-behavior' is
564 ;; set. Also override if we are using global style variables,
565 ;; have already initialized a style once, and are switching to a
566 ;; different style. (It's doubtful whether this is desirable, but
567 ;; the whole situation with nonlocal style variables is a bit
568 ;; awkward. It's at least the most compatible way with the old
569 ;; style init procedure.)
570 (c-set-style style (not (or c-old-style-variable-behavior
571 (and (not c-style-variables-are-local-p)
572 c-indentation-style
573 (not (string-equal c-indentation-style
574 style)))))))
a66cd3ee
MS
575 (c-setup-paragraph-variables)
576
130c507e
GM
577 ;; we have to do something special for c-offsets-alist so that the
578 ;; buffer local value has its own alist structure.
579 (setq c-offsets-alist (copy-alist c-offsets-alist))
a66cd3ee 580
130c507e 581 ;; setup the comment indent variable in a Emacs version portable way
175069ef 582 (set (make-local-variable 'comment-indent-function) 'c-comment-indent)
a66cd3ee 583
cb694ab7
AM
584;; ;; Put submode indicators onto minor-mode-alist, but only once.
585;; (or (assq 'c-submode-indicators minor-mode-alist)
586;; (setq minor-mode-alist
587;; (cons '(c-submode-indicators c-submode-indicators)
588;; minor-mode-alist)))
589 (c-update-modeline)
a66cd3ee 590
d9e94c22
MS
591 ;; Install the functions that ensure that various internal caches
592 ;; don't become invalid due to buffer changes.
922ad43e
GM
593 (when (featurep 'xemacs)
594 (make-local-hook 'before-change-functions)
595 (make-local-hook 'after-change-functions))
9c184ed2 596 (add-hook 'before-change-functions 'c-before-change nil t)
8714fc18 597 (add-hook 'after-change-functions 'c-after-change nil t)
7d562742 598 (set (make-local-variable 'font-lock-extend-after-change-region-function)
a0526d5e
AM
599 'c-extend-after-change-region)) ; Currently (2009-05) used by all
600 ; lanaguages with #define (C, C++,; ObjC), and by AWK.
d9e94c22 601
d9e94c22
MS
602(defun c-setup-doc-comment-style ()
603 "Initialize the variables that depend on the value of `c-doc-comment-style'."
604 (when (and (featurep 'font-lock)
605 (symbol-value 'font-lock-mode))
606 ;; Force font lock mode to reinitialize itself.
607 (font-lock-mode 0)
608 (font-lock-mode 1)))
609
f3b554af
GM
610;; Buffer local variables defining the region to be fontified by a font lock
611;; after-change function. They are set in c-after-change to
612;; after-change-function's BEG and END, and may be modified by a
613;; `c-before-font-lock-function'.
614(defvar c-new-BEG 0)
615(make-variable-buffer-local 'c-new-BEG)
616(defvar c-new-END 0)
617(make-variable-buffer-local 'c-new-END)
618
d9e94c22
MS
619(defun c-common-init (&optional mode)
620 "Common initialization for all CC Mode modes.
621In addition to the work done by `c-basic-common-init' and
622`c-font-lock-init', this function sets up various other things as
623customary in CC Mode modes but which aren't strictly necessary for CC
624Mode to operate correctly.
625
626MODE is the symbol for the mode to initialize, like 'c-mode. See
627`c-basic-common-init' for details. It's only optional to be
0386b551 628compatible with old code; callers should always specify it."
d9e94c22
MS
629
630 (unless mode
631 ;; Called from an old third party package. The fallback is to
632 ;; initialize for C.
28d88c16 633 (c-init-language-vars-for 'c-mode))
d9e94c22
MS
634
635 (c-basic-common-init mode c-default-style)
636 (when mode
637 ;; Only initialize font locking if we aren't called from an old package.
638 (c-font-lock-init))
639
1d1e4868
AM
640 ;; Starting a mode is a sort of "change". So call the change functions...
641 (save-restriction
642 (widen)
43a91810
AM
643 (setq c-new-BEG (point-min))
644 (setq c-new-END (point-max))
1d1e4868 645 (save-excursion
dd969a56 646 (if c-get-state-before-change-functions
8a249abc
AM
647 (mapc (lambda (fn)
648 (funcall fn (point-min) (point-max)))
649 c-get-state-before-change-functions))
1d1e4868
AM
650 (if c-before-font-lock-function
651 (funcall c-before-font-lock-function (point-min) (point-max)
652 (- (point-max) (point-min))))))
653
175069ef
SM
654 (set (make-local-variable 'outline-regexp) "[^#\n\^M]")
655 (set (make-local-variable 'outline-level) 'c-outline-level)
d9e94c22
MS
656
657 (let ((rfn (assq mode c-require-final-newline)))
658 (when rfn
1750e02f 659 (and (cdr rfn)
175069ef
SM
660 (set (make-local-variable 'require-final-newline)
661 mode-require-final-newline)))))
130c507e 662
00af0b67
AM
663(defun c-count-cfss (lv-alist)
664 ;; LV-ALIST is an alist like `file-local-variables-alist'. Count how many
665 ;; elements with the key `c-file-style' there are in it.
666 (let ((elt-ptr lv-alist) elt (cownt 0))
667 (while elt-ptr
668 (setq elt (car elt-ptr)
669 elt-ptr (cdr elt-ptr))
670 (when (eq (car elt) 'c-file-style)
671 (setq cownt (1+ cownt))))
672 cownt))
673
a36abf0e
CY
674(defun c-before-hack-hook ()
675 "Set the CC Mode style and \"offsets\" when in the buffer's local variables.
676They are set only when, respectively, the pseudo variables
677`c-file-style' and `c-file-offsets' are present in the list.
678
679This function is called from the hook `before-hack-local-variables-hook'."
680 (when c-buffer-is-cc-mode
05c123e6
AM
681 (let ((mode-cons (assq 'mode file-local-variables-alist))
682 (stile (cdr (assq 'c-file-style file-local-variables-alist)))
a36abf0e 683 (offsets (cdr (assq 'c-file-offsets file-local-variables-alist))))
05c123e6
AM
684 (when mode-cons
685 (hack-one-local-variable (car mode-cons) (cdr mode-cons))
686 (setq file-local-variables-alist
687 (delq mode-cons file-local-variables-alist)))
a36abf0e
CY
688 (when stile
689 (or (stringp stile) (error "c-file-style is not a string"))
00af0b67
AM
690 (if (boundp 'dir-local-variables-alist)
691 ;; Determine whether `c-file-style' was set in the file's local
692 ;; variables or in a .dir-locals.el (a directory setting).
693 (let ((cfs-in-file-and-dir-count
694 (c-count-cfss file-local-variables-alist))
695 (cfs-in-dir-count (c-count-cfss dir-local-variables-alist)))
696 (c-set-style stile
697 (= cfs-in-file-and-dir-count cfs-in-dir-count)))
698 (c-set-style stile)))
a36abf0e
CY
699 (when offsets
700 (mapc
701 (lambda (langentry)
702 (let ((langelem (car langentry))
703 (offset (cdr langentry)))
704 (c-set-offset langelem offset)))
705 offsets)))))
706
cb694ab7
AM
707(defun c-remove-any-local-eval-or-mode-variables ()
708 ;; If the buffer specifies `mode' or `eval' in its File Local Variable list
709 ;; or on the first line, remove all occurrences. See
710 ;; `c-postprocess-file-styles' for justification. There is no need to save
5c4c911a
AM
711 ;; point here, or even bother too much about the buffer contents. However,
712 ;; DON'T mess up the kill-ring.
cb694ab7
AM
713 ;;
714 ;; Most of the code here is derived from Emacs 21.3's `hack-local-variables'
715 ;; in files.el.
716 (goto-char (point-max))
717 (search-backward "\n\^L" (max (- (point-max) 3000) (point-min)) 'move)
718 (let (lv-point (prefix "") (suffix ""))
719 (when (let ((case-fold-search t))
720 (search-forward "Local Variables:" nil t))
721 (setq lv-point (point))
722 ;; The prefix is what comes before "local variables:" in its line.
723 ;; The suffix is what comes after "local variables:" in its line.
724 (skip-chars-forward " \t")
725 (or (eolp)
726 (setq suffix (buffer-substring (point)
727 (progn (end-of-line) (point)))))
728 (goto-char (match-beginning 0))
729 (or (bolp)
730 (setq prefix
731 (buffer-substring (point)
732 (progn (beginning-of-line) (point)))))
733
734 (while (search-forward-regexp
735 (concat "^[ \t]*"
736 (regexp-quote prefix)
737 "\\(mode\\|eval\\):.*"
738 (regexp-quote suffix)
739 "$")
740 nil t)
5c4c911a
AM
741 (forward-line 0)
742 (delete-region (point) (progn (forward-line) (point)))))
cb694ab7
AM
743
744 ;; Delete the first line, if we've got one, in case it contains a mode spec.
745 (unless (and lv-point
746 (progn (goto-char lv-point)
747 (forward-line 0)
748 (bobp)))
749 (goto-char (point-min))
5c4c911a
AM
750 (unless (eobp)
751 (delete-region (point) (progn (forward-line) (point)))))))
cb694ab7 752
130c507e 753(defun c-postprocess-file-styles ()
d9e94c22 754 "Function that post processes relevant file local variables in CC Mode.
130c507e
GM
755Currently, this function simply applies any style and offset settings
756found in the file's Local Variable list. It first applies any style
757setting found in `c-file-style', then it applies any offset settings
758it finds in `c-file-offsets'.
759
760Note that the style variables are always made local to the buffer."
d9e94c22 761
130c507e 762 ;; apply file styles and offsets
09f90d2c
RS
763 (when c-buffer-is-cc-mode
764 (if (or c-file-style c-file-offsets)
765 (c-make-styles-buffer-local t))
c5fcadd1
AM
766 (when c-file-style
767 (or (stringp c-file-style)
768 (error "c-file-style is not a string"))
a3c11552 769 (c-set-style c-file-style))
b9a6ed29 770
09f90d2c 771 (and c-file-offsets
d61ca8d5 772 (mapc
09f90d2c
RS
773 (lambda (langentry)
774 (let ((langelem (car langentry))
775 (offset (cdr langentry)))
776 (c-set-offset langelem offset)))
0386b551
AM
777 c-file-offsets))
778 ;; Problem: The file local variable block might have explicitly set a
779 ;; style variable. The `c-set-style' or `mapcar' call might have
780 ;; overwritten this. So we run `hack-local-variables' again to remedy
781 ;; this. There are no guarantees this will work properly, particularly as
782 ;; we have no control over what the other hook functions on
cb694ab7
AM
783 ;; `hack-local-variables-hook' would have done. We now (2006/2/1) remove
784 ;; any `eval' or `mode' expressions before we evaluate again (see below).
785 ;; ACM, 2005/11/2.
786 ;;
787 ;; Problem (bug reported by Gustav Broberg): if one of the variables is
788 ;; `mode', this will invoke c-mode (etc.) again, setting up the style etc.
789 ;; We prevent this by temporarily removing `mode' from the Local Variables
790 ;; section.
0386b551 791 (if (or c-file-style c-file-offsets)
51c9af45
AM
792 (let ((hack-local-variables-hook nil) (inhibit-read-only t))
793 (c-tentative-buffer-changes
cb694ab7
AM
794 (c-remove-any-local-eval-or-mode-variables)
795 (hack-local-variables))
796 nil))))
130c507e 797
a36abf0e
CY
798(if (boundp 'before-hack-local-variables-hook)
799 (add-hook 'before-hack-local-variables-hook 'c-before-hack-hook)
800 (add-hook 'hack-local-variables-hook 'c-postprocess-file-styles))
130c507e 801
3efc2cd7
MS
802(defmacro c-run-mode-hooks (&rest hooks)
803 ;; Emacs 21.1 has introduced a system with delayed mode hooks that
dd969a56 804 ;; requires the use of the new function `run-mode-hooks'.
3efc2cd7
MS
805 (if (cc-bytecomp-fboundp 'run-mode-hooks)
806 `(run-mode-hooks ,@hooks)
807 `(progn ,@(mapcar (lambda (hook) `(run-hooks ,hook)) hooks))))
808
130c507e 809\f
1d1e4868
AM
810;;; Change hooks, linking with Font Lock.
811
1d1e4868
AM
812;; Buffer local variables recording Beginning/End-of-Macro position before a
813;; change, when a macro straddles, respectively, the BEG or END (or both) of
814;; the change region. Otherwise these have the values BEG/END.
815(defvar c-old-BOM 0)
816(make-variable-buffer-local 'c-old-BOM)
817(defvar c-old-EOM 0)
818(make-variable-buffer-local 'c-old-EOM)
819
820(defun c-extend-region-for-CPP (beg end)
f8016ed6
AM
821 ;; Set c-old-BOM or c-old-EOM respectively to BEG, END, each extended to the
822 ;; beginning/end of any preprocessor construct they may be in.
1d1e4868
AM
823 ;;
824 ;; Point is undefined both before and after this function call; the buffer
825 ;; has already been widened, and match-data saved. The return value is
826 ;; meaningless.
827 ;;
dd969a56
AM
828 ;; This function is in the C/C++/ObjC values of
829 ;; `c-get-state-before-change-functions' and is called exclusively as a
1d1e4868
AM
830 ;; before change function.
831 (goto-char beg)
832 (c-beginning-of-macro)
833 (setq c-old-BOM (point))
834
835 (goto-char end)
3d14bb73
AM
836 (when (c-beginning-of-macro)
837 (c-end-of-macro)
838 (or (eobp) (forward-char))) ; Over the terminating NL which may be marked
839 ; with a c-cpp-delimiter category property
f8016ed6 840 (setq c-old-EOM (point)))
1d1e4868
AM
841
842(defun c-neutralize-CPP-line (beg end)
c5fcadd1
AM
843 ;; BEG and END bound a region, typically a preprocessor line. Put a
844 ;; "punctuation" syntax-table property on syntactically obtrusive
845 ;; characters, ones which would interact syntactically with stuff outside
846 ;; this region.
1d1e4868
AM
847 ;;
848 ;; These are unmatched string delimiters, or unmatched
849 ;; parens/brackets/braces. An unclosed comment is regarded as valid, NOT
850 ;; obtrusive.
c5fcadd1
AM
851 (save-excursion
852 (let (s)
853 (while
854 (progn
855 (setq s (parse-partial-sexp beg end -1))
856 (cond
857 ((< (nth 0 s) 0) ; found an unmated ),},]
858 (c-put-char-property (1- (point)) 'syntax-table '(1))
859 t)
860 ((nth 3 s) ; In a string
861 (c-put-char-property (nth 8 s) 'syntax-table '(1))
862 t)
863 ((> (nth 0 s) 0) ; In a (,{,[
864 (c-put-char-property (nth 1 s) 'syntax-table '(1))
865 t)
866 (t nil)))))))
1d1e4868 867
0ec1d2c5 868(defun c-neutralize-syntax-in-and-mark-CPP (begg endd old-len)
a0526d5e
AM
869 ;; (i) Extend the font lock region to cover all changed preprocessor
870 ;; regions; it does this by setting the variables `c-new-BEG' and
871 ;; `c-new-END' to the new boundaries.
872 ;;
873 ;; (ii) "Neutralize" every preprocessor line wholly or partially in the
874 ;; extended changed region. "Restore" lines which were CPP lines before the
875 ;; change and are no longer so; these can be located from the Buffer local
876 ;; variables `c-old-BOM' and `c-old-EOM'.
0ec1d2c5
AM
877 ;;
878 ;; (iii) Mark every CPP construct by placing a `category' property value
879 ;; `c-cpp-delimiter' at its start and end. The marked characters are the
880 ;; opening # and usually the terminating EOL, but sometimes the character
881 ;; before a comment/string delimiter.
882 ;;
1d1e4868
AM
883 ;; That is, set syntax-table properties on characters that would otherwise
884 ;; interact syntactically with those outside the CPP line(s).
0ec1d2c5 885 ;;
1d1e4868
AM
886 ;; This function is called from an after-change function, BEGG ENDD and
887 ;; OLD-LEN being the standard parameters. It prepares the buffer for font
888 ;; locking, hence must get called before `font-lock-after-change-function'.
889 ;;
890 ;; Point is undefined both before and after this function call, the buffer
891 ;; has been widened, and match-data saved. The return value is ignored.
892 ;;
893 ;; This function is the C/C++/ObjC value of `c-before-font-lock-function'.
894 ;;
c5fcadd1 895 ;; Note: SPEED _MATTERS_ IN THIS FUNCTION!!!
0ec1d2c5 896 ;;
c5fcadd1 897 ;; This function might make hidden buffer changes.
0ec1d2c5 898 (c-save-buffer-state (limits)
a0526d5e
AM
899 ;; First determine the region, (c-new-BEG c-new-END), which will get font
900 ;; locked. It might need "neutralizing". This region may not start
901 ;; inside a string, comment, or macro.
c5fcadd1 902 (goto-char c-old-BOM) ; already set to old start of macro or begg.
a0526d5e 903 (setq c-new-BEG
43a91810
AM
904 (min c-new-BEG
905 (if (setq limits (c-state-literal-at (point)))
906 (cdr limits) ; go forward out of any string or comment.
907 (point))))
c5fcadd1 908
1d1e4868 909 (goto-char endd)
0ec1d2c5 910 (if (setq limits (c-state-literal-at (point)))
c5fcadd1
AM
911 (goto-char (car limits))) ; go backward out of any string or comment.
912 (if (c-beginning-of-macro)
913 (c-end-of-macro))
43a91810
AM
914 (setq c-new-END (max c-new-END
915 (+ (- c-old-EOM old-len) (- endd begg))
916 (point)))
c5fcadd1 917
0ec1d2c5 918 ;; Clear all old relevant properties.
a0526d5e 919 (c-clear-char-property-with-value c-new-BEG c-new-END 'syntax-table '(1))
0ec1d2c5
AM
920 (c-clear-char-property-with-value c-new-BEG c-new-END 'category 'c-cpp-delimiter)
921 ;; FIXME!!! What about the "<" and ">" category properties? 2009-11-16
1d1e4868 922
a0526d5e
AM
923 ;; Add needed properties to each CPP construct in the region.
924 (goto-char c-new-BEG)
0ec1d2c5 925 (let ((pps-position c-new-BEG) pps-state mbeg)
a0526d5e
AM
926 (while (and (< (point) c-new-END)
927 (search-forward-regexp c-anchored-cpp-prefix c-new-END t))
c5fcadd1
AM
928 ;; If we've found a "#" inside a string/comment, ignore it.
929 (setq pps-state
930 (parse-partial-sexp pps-position (point) nil nil pps-state)
931 pps-position (point))
932 (unless (or (nth 3 pps-state) ; in a string?
933 (nth 4 pps-state)) ; in a comment?
0ec1d2c5
AM
934 (goto-char (match-beginning 0))
935 (setq mbeg (point))
936 (if (> (c-syntactic-end-of-macro) mbeg)
937 (progn
938 (c-neutralize-CPP-line mbeg (point))
939 (c-set-cpp-delimiters mbeg (point))
940 ;(setq pps-position (point))
941 )
942 (forward-line)) ; no infinite loop with, e.g., "#//"
943 )))))
1d1e4868
AM
944
945(defun c-before-change (beg end)
dd969a56
AM
946 ;; Function to be put on `before-change-functions'. Primarily, this calls
947 ;; the language dependent `c-get-state-before-change-functions'. It is
1d1e4868
AM
948 ;; otherwise used only to remove stale entries from the `c-found-types'
949 ;; cache, and to record entries which a `c-after-change' function might
950 ;; confirm as stale.
0ec1d2c5 951 ;;
1d1e4868
AM
952 ;; Note that this function must be FAST rather than accurate. Note
953 ;; also that it only has any effect when font locking is enabled.
954 ;; We exploit this by checking for font-lock-*-face instead of doing
955 ;; rigourous syntactic analysis.
956
957 ;; If either change boundary is wholly inside an identifier, delete
958 ;; it/them from the cache. Don't worry about being inside a string
959 ;; or a comment - "wrongly" removing a symbol from `c-found-types'
960 ;; isn't critical.
961 (setq c-maybe-stale-found-type nil)
962 (save-restriction
963 (save-match-data
964 (widen)
965 (save-excursion
966 ;; Are we inserting/deleting stuff in the middle of an identifier?
967 (c-unfind-enclosing-token beg)
968 (c-unfind-enclosing-token end)
969 ;; Are we coalescing two tokens together, e.g. "fo o" -> "foo"?
970 (when (< beg end)
971 (c-unfind-coalesced-tokens beg end))
972 ;; Are we (potentially) disrupting the syntactic context which
973 ;; makes a type a type? E.g. by inserting stuff after "foo" in
974 ;; "foo bar;", or before "foo" in "typedef foo *bar;"?
975 ;;
976 ;; We search for appropriate c-type properties "near" the change.
977 ;; First, find an appropriate boundary for this property search.
978 (let (lim
979 type type-pos
980 marked-id term-pos
981 (end1
982 (or (and (eq (get-text-property end 'face) 'font-lock-comment-face)
983 (previous-single-property-change end 'face))
984 end)))
985 (when (>= end1 beg) ; Don't hassle about changes entirely in comments.
986 ;; Find a limit for the search for a `c-type' property
987 (while
988 (and (/= (skip-chars-backward "^;{}") 0)
989 (> (point) (point-min))
990 (memq (c-get-char-property (1- (point)) 'face)
991 '(font-lock-comment-face font-lock-string-face))))
992 (setq lim (max (point-min) (1- (point))))
993
994 ;; Look for the latest `c-type' property before end1
995 (when (and (> end1 (point-min))
996 (setq type-pos
997 (if (get-text-property (1- end1) 'c-type)
998 end1
999 (previous-single-property-change end1 'c-type nil lim))))
1000 (setq type (get-text-property (max (1- type-pos) lim) 'c-type))
1001
1002 (when (memq type '(c-decl-id-start c-decl-type-start))
1003 ;; Get the identifier, if any, that the property is on.
1004 (goto-char (1- type-pos))
1005 (setq marked-id
1006 (when (looking-at "\\(\\sw\\|\\s_\\)")
1007 (c-beginning-of-current-token)
1008 (buffer-substring-no-properties (point) type-pos)))
1009
1010 (goto-char end1)
1011 (skip-chars-forward "^;{}") ; FIXME!!! loop for comment, maybe
1012 (setq lim (point))
1013 (setq term-pos
1014 (or (next-single-property-change end 'c-type nil lim) lim))
1015 (setq c-maybe-stale-found-type
1016 (list type marked-id
1017 type-pos term-pos
1018 (buffer-substring-no-properties type-pos term-pos)
1019 (buffer-substring-no-properties beg end)))))))
1020
dd969a56
AM
1021 (if c-get-state-before-change-functions
1022 (mapc (lambda (fn)
1023 (funcall fn beg end))
1024 c-get-state-before-change-functions))
1d1e4868
AM
1025 ))))
1026
1027(defun c-after-change (beg end old-len)
1028 ;; Function put on `after-change-functions' to adjust various caches
1029 ;; etc. Prefer speed to finesse here, since there will be an order
1030 ;; of magnitude more calls to this function than any of the
1031 ;; functions that use the caches.
1032 ;;
1033 ;; Note that care must be taken so that this is called before any
1034 ;; font-lock callbacks since we might get calls to functions using
1035 ;; these caches from inside them, and we must thus be sure that this
1036 ;; has already been executed.
1037 ;;
1038 ;; This calls the language variable c-before-font-lock-function, if non nil.
1039 ;; This typically sets `syntax-table' properties.
1040
1041 (c-save-buffer-state ()
1042 ;; When `combine-after-change-calls' is used we might get calls
1043 ;; with regions outside the current narrowing. This has been
1044 ;; observed in Emacs 20.7.
1045 (save-restriction
1046 (save-match-data ; c-recognize-<>-arglists changes match-data
1047 (widen)
1048
1049 (when (> end (point-max))
1050 ;; Some emacsen might return positions past the end. This has been
1051 ;; observed in Emacs 20.7 when rereading a buffer changed on disk
1052 ;; (haven't been able to minimize it, but Emacs 21.3 appears to
1053 ;; work).
1054 (setq end (point-max))
1055 (when (> beg end)
1056 (setq beg end)))
1057
8a249abc
AM
1058 ;; C-y is capable of spuriously converting category properties
1059 ;; c-</>-as-paren-syntax into hard syntax-table properties. Remove
1060 ;; these when it happens.
1061 (c-clear-char-property-with-value beg end 'syntax-table
1062 c-<-as-paren-syntax)
1063 (c-clear-char-property-with-value beg end 'syntax-table
1064 c->-as-paren-syntax)
1065
1d1e4868
AM
1066 (c-trim-found-types beg end old-len) ; maybe we don't need all of these.
1067 (c-invalidate-sws-region-after beg end)
1068 (c-invalidate-state-cache beg)
1069 (c-invalidate-find-decl-cache beg)
1070
1071 (when c-recognize-<>-arglists
1072 (c-after-change-check-<>-operators beg end))
1073
ba7fdf30
AM
1074 ;; (c-new-BEG c-new-END) will be the region to fontify. It may become
1075 ;; larger than (beg end).
1076 (setq c-new-BEG beg
1077 c-new-END end)
1d1e4868
AM
1078 (if c-before-font-lock-function
1079 (save-excursion
1080 (funcall c-before-font-lock-function beg end old-len)))))))
1081
1082(defun c-after-font-lock-init ()
1083 ;; Put on `font-lock-mode-hook'.
1084 (remove-hook 'after-change-functions 'c-after-change t)
1085 (add-hook 'after-change-functions 'c-after-change nil t))
1086
1087(defun c-font-lock-init ()
1088 "Set up the font-lock variables for using the font-lock support in CC Mode.
1089This does not load the font-lock package. Use after
1090`c-basic-common-init' and after cc-fonts has been loaded."
1091
175069ef 1092 (set (make-local-variable 'font-lock-defaults)
1d1e4868
AM
1093 `(,(if (c-major-mode-is 'awk-mode)
1094 ;; awk-mode currently has only one font lock level.
1095 'awk-font-lock-keywords
1096 (mapcar 'c-mode-symbol
1097 '("font-lock-keywords" "font-lock-keywords-1"
1098 "font-lock-keywords-2" "font-lock-keywords-3")))
1099 nil nil
1100 ,c-identifier-syntax-modifications
1101 c-beginning-of-syntax
1d1e4868
AM
1102 (font-lock-mark-block-function
1103 . c-mark-function)))
922ad43e
GM
1104 (if (featurep 'xemacs)
1105 (make-local-hook 'font-lock-mode-hook))
1d1e4868
AM
1106 (add-hook 'font-lock-mode-hook 'c-after-font-lock-init nil t))
1107
8714fc18
AM
1108(defun c-extend-after-change-region (beg end old-len)
1109 "Extend the region to be fontified, if necessary."
1110 ;; Note: the parameters are ignored here. This somewhat indirect
1111 ;; implementation exists because it is minimally different from the
1112 ;; stand-alone CC Mode which, lacking
1113 ;; font-lock-extend-after-change-region-function, is forced to use advice
1114 ;; instead.
1115 ;;
a0526d5e
AM
1116 ;; Of the seven CC Mode languages, currently (2009-05) only C, C++, Objc
1117 ;; (the languages with #define) and AWK Mode make non-null use of this
1118 ;; function.
8714fc18 1119 (cons c-new-BEG c-new-END))
1d1e4868
AM
1120
1121\f
130c507e
GM
1122;; Support for C
1123
d9e94c22
MS
1124;;;###autoload
1125(defvar c-mode-syntax-table nil
1126 "Syntax table used in c-mode buffers.")
1127(or c-mode-syntax-table
1128 (setq c-mode-syntax-table
1129 (funcall (c-lang-const c-make-mode-syntax-table c))))
1130
130c507e
GM
1131(defvar c-mode-abbrev-table nil
1132 "Abbreviation table used in c-mode buffers.")
a66cd3ee
MS
1133(c-define-abbrev-table 'c-mode-abbrev-table
1134 '(("else" "else" c-electric-continued-statement 0)
1135 ("while" "while" c-electric-continued-statement 0)))
130c507e
GM
1136
1137(defvar c-mode-map ()
1138 "Keymap used in c-mode buffers.")
1139(if c-mode-map
1140 nil
1141 (setq c-mode-map (c-make-inherited-keymap))
1142 ;; add bindings which are only useful for C
1143 (define-key c-mode-map "\C-c\C-e" 'c-macro-expand)
1144 )
1145
1146(easy-menu-define c-c-menu c-mode-map "C Mode Commands"
d9e94c22
MS
1147 (cons "C" (c-lang-const c-mode-menu c)))
1148
1149;; In XEmacs >= 21.5 modes should add their own entries to
1150;; `auto-mode-alist'. The comment form of autoload is used to avoid
1151;; doing this on load. That since `add-to-list' prepends the value
1152;; which could cause it to clobber user settings. Later emacsen have
1153;; an append option, but it's not safe to use.
50fdde0e 1154
38477bef
AM
1155;; The extension ".C" is associated with C++ while the lowercase
1156;; variant goes with C. On case insensitive file systems, this means
50fdde0e
MS
1157;; that ".c" files also might open C++ mode if the C++ entry comes
1158;; first on `auto-mode-alist'. Thus we try to ensure that ".C" comes
1159;; after ".c", and since `add-to-list' adds the entry first we have to
1160;; add the ".C" entry first.
1161;;;###autoload (add-to-list 'auto-mode-alist '("\\.\\(cc\\|hh\\)\\'" . c++-mode))
1162;;;###autoload (add-to-list 'auto-mode-alist '("\\.[ch]\\(pp\\|xx\\|\\+\\+\\)\\'" . c++-mode))
1163;;;###autoload (add-to-list 'auto-mode-alist '("\\.\\(CC?\\|HH?\\)\\'" . c++-mode))
1164
d9e94c22
MS
1165;;;###autoload (add-to-list 'auto-mode-alist '("\\.[ch]\\'" . c-mode))
1166
1167;; NB: The following two associate yacc and lex files to C Mode, which
1168;; is not really suitable for those formats. Anyway, afaik there's
1169;; currently no better mode for them, and besides this is legacy.
1170;;;###autoload (add-to-list 'auto-mode-alist '("\\.y\\(acc\\)?\\'" . c-mode))
1171;;;###autoload (add-to-list 'auto-mode-alist '("\\.lex\\'" . c-mode))
1172
f63b48bb
DN
1173;; Preprocessed files generated by C and C++ compilers.
1174;;;###autoload (add-to-list 'auto-mode-alist '("\\.i\\'" . c-mode))
1175;;;###autoload (add-to-list 'auto-mode-alist '("\\.ii\\'" . c++-mode))
1176
1177
785eecbb
RS
1178;;;###autoload
1179(defun c-mode ()
1180 "Major mode for editing K&R and ANSI C code.
1181To submit a problem report, enter `\\[c-submit-bug-report]' from a
1182c-mode buffer. This automatically sets up a mail buffer with version
1183information already added. You just need to add a description of the
50fdde0e 1184problem, including a reproducible test case, and send the message.
785eecbb
RS
1185
1186To see what version of CC Mode you are running, enter `\\[c-version]'.
1187
d9e94c22
MS
1188The hook `c-mode-common-hook' is run with no args at mode
1189initialization, then `c-mode-hook'.
785eecbb
RS
1190
1191Key bindings:
1192\\{c-mode-map}"
1193 (interactive)
785eecbb 1194 (kill-all-local-variables)
d9e94c22 1195 (c-initialize-cc-mode t)
785eecbb 1196 (set-syntax-table c-mode-syntax-table)
175069ef 1197 (setq major-mode 'c-mode ; FIXME: Use define-derived-mode.
785eecbb 1198 mode-name "C"
130c507e
GM
1199 local-abbrev-table c-mode-abbrev-table
1200 abbrev-mode t)
785eecbb 1201 (use-local-map c-mode-map)
28d88c16 1202 (c-init-language-vars-for 'c-mode)
a66cd3ee 1203 (c-common-init 'c-mode)
d9e94c22 1204 (easy-menu-add c-c-menu)
51f606de 1205 (cc-imenu-init cc-imenu-c-generic-expression)
3efc2cd7 1206 (c-run-mode-hooks 'c-mode-common-hook 'c-mode-hook)
785eecbb
RS
1207 (c-update-modeline))
1208
1209\f
130c507e
GM
1210;; Support for C++
1211
d9e94c22
MS
1212;;;###autoload
1213(defvar c++-mode-syntax-table nil
1214 "Syntax table used in c++-mode buffers.")
1215(or c++-mode-syntax-table
1216 (setq c++-mode-syntax-table
1217 (funcall (c-lang-const c-make-mode-syntax-table c++))))
1218
130c507e
GM
1219(defvar c++-mode-abbrev-table nil
1220 "Abbreviation table used in c++-mode buffers.")
a66cd3ee
MS
1221(c-define-abbrev-table 'c++-mode-abbrev-table
1222 '(("else" "else" c-electric-continued-statement 0)
1223 ("while" "while" c-electric-continued-statement 0)
1224 ("catch" "catch" c-electric-continued-statement 0)))
130c507e
GM
1225
1226(defvar c++-mode-map ()
1227 "Keymap used in c++-mode buffers.")
1228(if c++-mode-map
1229 nil
1230 (setq c++-mode-map (c-make-inherited-keymap))
1231 ;; add bindings which are only useful for C++
1232 (define-key c++-mode-map "\C-c\C-e" 'c-macro-expand)
1233 (define-key c++-mode-map "\C-c:" 'c-scope-operator)
1234 (define-key c++-mode-map "<" 'c-electric-lt-gt)
1235 (define-key c++-mode-map ">" 'c-electric-lt-gt))
1236
1237(easy-menu-define c-c++-menu c++-mode-map "C++ Mode Commands"
d9e94c22
MS
1238 (cons "C++" (c-lang-const c-mode-menu c++)))
1239
785eecbb
RS
1240;;;###autoload
1241(defun c++-mode ()
1242 "Major mode for editing C++ code.
1243To submit a problem report, enter `\\[c-submit-bug-report]' from a
1244c++-mode buffer. This automatically sets up a mail buffer with
1245version information already added. You just need to add a description
1246of the problem, including a reproducible test case, and send the
1247message.
1248
1249To see what version of CC Mode you are running, enter `\\[c-version]'.
1250
d9e94c22
MS
1251The hook `c-mode-common-hook' is run with no args at mode
1252initialization, then `c++-mode-hook'.
785eecbb
RS
1253
1254Key bindings:
1255\\{c++-mode-map}"
1256 (interactive)
785eecbb 1257 (kill-all-local-variables)
d9e94c22 1258 (c-initialize-cc-mode t)
785eecbb 1259 (set-syntax-table c++-mode-syntax-table)
175069ef 1260 (setq major-mode 'c++-mode ; FIXME: Use define-derived-mode.
785eecbb 1261 mode-name "C++"
130c507e
GM
1262 local-abbrev-table c++-mode-abbrev-table
1263 abbrev-mode t)
785eecbb 1264 (use-local-map c++-mode-map)
28d88c16 1265 (c-init-language-vars-for 'c++-mode)
a66cd3ee 1266 (c-common-init 'c++-mode)
d9e94c22 1267 (easy-menu-add c-c++-menu)
51f606de 1268 (cc-imenu-init cc-imenu-c++-generic-expression)
3efc2cd7 1269 (c-run-mode-hooks 'c-mode-common-hook 'c++-mode-hook)
785eecbb
RS
1270 (c-update-modeline))
1271
1272\f
130c507e
GM
1273;; Support for Objective-C
1274
d9e94c22
MS
1275;;;###autoload
1276(defvar objc-mode-syntax-table nil
1277 "Syntax table used in objc-mode buffers.")
1278(or objc-mode-syntax-table
1279 (setq objc-mode-syntax-table
1280 (funcall (c-lang-const c-make-mode-syntax-table objc))))
1281
130c507e
GM
1282(defvar objc-mode-abbrev-table nil
1283 "Abbreviation table used in objc-mode buffers.")
a66cd3ee
MS
1284(c-define-abbrev-table 'objc-mode-abbrev-table
1285 '(("else" "else" c-electric-continued-statement 0)
1286 ("while" "while" c-electric-continued-statement 0)))
130c507e
GM
1287
1288(defvar objc-mode-map ()
1289 "Keymap used in objc-mode buffers.")
1290(if objc-mode-map
1291 nil
1292 (setq objc-mode-map (c-make-inherited-keymap))
1293 ;; add bindings which are only useful for Objective-C
1294 (define-key objc-mode-map "\C-c\C-e" 'c-macro-expand))
1295
1296(easy-menu-define c-objc-menu objc-mode-map "ObjC Mode Commands"
d9e94c22
MS
1297 (cons "ObjC" (c-lang-const c-mode-menu objc)))
1298
1299;;;###autoload (add-to-list 'auto-mode-alist '("\\.m\\'" . objc-mode))
130c507e 1300
785eecbb
RS
1301;;;###autoload
1302(defun objc-mode ()
1303 "Major mode for editing Objective C code.
1304To submit a problem report, enter `\\[c-submit-bug-report]' from an
1305objc-mode buffer. This automatically sets up a mail buffer with
1306version information already added. You just need to add a description
1307of the problem, including a reproducible test case, and send the
1308message.
1309
1310To see what version of CC Mode you are running, enter `\\[c-version]'.
1311
d9e94c22
MS
1312The hook `c-mode-common-hook' is run with no args at mode
1313initialization, then `objc-mode-hook'.
785eecbb
RS
1314
1315Key bindings:
1316\\{objc-mode-map}"
1317 (interactive)
785eecbb 1318 (kill-all-local-variables)
d9e94c22 1319 (c-initialize-cc-mode t)
785eecbb 1320 (set-syntax-table objc-mode-syntax-table)
175069ef 1321 (setq major-mode 'objc-mode ; FIXME: Use define-derived-mode.
785eecbb 1322 mode-name "ObjC"
130c507e
GM
1323 local-abbrev-table objc-mode-abbrev-table
1324 abbrev-mode t)
785eecbb 1325 (use-local-map objc-mode-map)
28d88c16 1326 (c-init-language-vars-for 'objc-mode)
a66cd3ee 1327 (c-common-init 'objc-mode)
d9e94c22
MS
1328 (easy-menu-add c-objc-menu)
1329 (cc-imenu-init nil 'cc-imenu-objc-function)
3efc2cd7 1330 (c-run-mode-hooks 'c-mode-common-hook 'objc-mode-hook)
785eecbb
RS
1331 (c-update-modeline))
1332
1333\f
130c507e
GM
1334;; Support for Java
1335
d9e94c22
MS
1336;;;###autoload
1337(defvar java-mode-syntax-table nil
1338 "Syntax table used in java-mode buffers.")
1339(or java-mode-syntax-table
1340 (setq java-mode-syntax-table
1341 (funcall (c-lang-const c-make-mode-syntax-table java))))
1342
130c507e
GM
1343(defvar java-mode-abbrev-table nil
1344 "Abbreviation table used in java-mode buffers.")
a66cd3ee
MS
1345(c-define-abbrev-table 'java-mode-abbrev-table
1346 '(("else" "else" c-electric-continued-statement 0)
1347 ("while" "while" c-electric-continued-statement 0)
1348 ("catch" "catch" c-electric-continued-statement 0)
1349 ("finally" "finally" c-electric-continued-statement 0)))
130c507e
GM
1350
1351(defvar java-mode-map ()
1352 "Keymap used in java-mode buffers.")
1353(if java-mode-map
1354 nil
1355 (setq java-mode-map (c-make-inherited-keymap))
1356 ;; add bindings which are only useful for Java
1357 )
1358
d9e94c22
MS
1359;; Regexp trying to describe the beginning of a Java top-level
1360;; definition. This is not used by CC Mode, nor is it maintained
1361;; since it's practically impossible to write a regexp that reliably
1362;; matches such a construct. Other tools are necessary.
1363(defconst c-Java-defun-prompt-regexp
1364 "^[ \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\v]*\\)+\\)?\\s-*")
1365
130c507e 1366(easy-menu-define c-java-menu java-mode-map "Java Mode Commands"
d9e94c22
MS
1367 (cons "Java" (c-lang-const c-mode-menu java)))
1368
1369;;;###autoload (add-to-list 'auto-mode-alist '("\\.java\\'" . java-mode))
130c507e 1370
785eecbb
RS
1371;;;###autoload
1372(defun java-mode ()
1373 "Major mode for editing Java code.
dc2b4c5f 1374To submit a problem report, enter `\\[c-submit-bug-report]' from a
785eecbb
RS
1375java-mode buffer. This automatically sets up a mail buffer with
1376version information already added. You just need to add a description
50fdde0e 1377of the problem, including a reproducible test case, and send the
785eecbb
RS
1378message.
1379
1380To see what version of CC Mode you are running, enter `\\[c-version]'.
1381
d9e94c22
MS
1382The hook `c-mode-common-hook' is run with no args at mode
1383initialization, then `java-mode-hook'.
785eecbb
RS
1384
1385Key bindings:
1386\\{java-mode-map}"
1387 (interactive)
785eecbb 1388 (kill-all-local-variables)
d9e94c22 1389 (c-initialize-cc-mode t)
785eecbb 1390 (set-syntax-table java-mode-syntax-table)
175069ef 1391 (setq major-mode 'java-mode ; FIXME: Use define-derived-mode.
785eecbb 1392 mode-name "Java"
91b807c9 1393 local-abbrev-table java-mode-abbrev-table
a66cd3ee 1394 abbrev-mode t)
785eecbb 1395 (use-local-map java-mode-map)
28d88c16 1396 (c-init-language-vars-for 'java-mode)
a66cd3ee 1397 (c-common-init 'java-mode)
d9e94c22 1398 (easy-menu-add c-java-menu)
51f606de 1399 (cc-imenu-init cc-imenu-java-generic-expression)
3efc2cd7 1400 (c-run-mode-hooks 'c-mode-common-hook 'java-mode-hook)
785eecbb
RS
1401 (c-update-modeline))
1402
1403\f
130c507e
GM
1404;; Support for CORBA's IDL language
1405
d9e94c22
MS
1406;;;###autoload
1407(defvar idl-mode-syntax-table nil
1408 "Syntax table used in idl-mode buffers.")
1409(or idl-mode-syntax-table
1410 (setq idl-mode-syntax-table
1411 (funcall (c-lang-const c-make-mode-syntax-table idl))))
1412
130c507e
GM
1413(defvar idl-mode-abbrev-table nil
1414 "Abbreviation table used in idl-mode buffers.")
a66cd3ee 1415(c-define-abbrev-table 'idl-mode-abbrev-table nil)
130c507e
GM
1416
1417(defvar idl-mode-map ()
1418 "Keymap used in idl-mode buffers.")
1419(if idl-mode-map
1420 nil
1421 (setq idl-mode-map (c-make-inherited-keymap))
1422 ;; add bindings which are only useful for IDL
1423 )
1424
1425(easy-menu-define c-idl-menu idl-mode-map "IDL Mode Commands"
d9e94c22
MS
1426 (cons "IDL" (c-lang-const c-mode-menu idl)))
1427
1428;;;###autoload (add-to-list 'auto-mode-alist '("\\.idl\\'" . idl-mode))
130c507e 1429
aac90c52
RS
1430;;;###autoload
1431(defun idl-mode ()
d9e94c22 1432 "Major mode for editing CORBA's IDL, PSDL and CIDL code.
aac90c52
RS
1433To submit a problem report, enter `\\[c-submit-bug-report]' from an
1434idl-mode buffer. This automatically sets up a mail buffer with
1435version information already added. You just need to add a description
1436of the problem, including a reproducible test case, and send the
1437message.
1438
1439To see what version of CC Mode you are running, enter `\\[c-version]'.
1440
d9e94c22
MS
1441The hook `c-mode-common-hook' is run with no args at mode
1442initialization, then `idl-mode-hook'.
aac90c52
RS
1443
1444Key bindings:
1445\\{idl-mode-map}"
1446 (interactive)
aac90c52 1447 (kill-all-local-variables)
d9e94c22 1448 (c-initialize-cc-mode t)
aac90c52 1449 (set-syntax-table idl-mode-syntax-table)
175069ef 1450 (setq major-mode 'idl-mode ; FIXME: Use define-derived-mode.
aac90c52
RS
1451 mode-name "IDL"
1452 local-abbrev-table idl-mode-abbrev-table)
1453 (use-local-map idl-mode-map)
28d88c16 1454 (c-init-language-vars-for 'idl-mode)
a66cd3ee 1455 (c-common-init 'idl-mode)
d9e94c22
MS
1456 (easy-menu-add c-idl-menu)
1457 ;;(cc-imenu-init cc-imenu-idl-generic-expression) ;TODO
3efc2cd7 1458 (c-run-mode-hooks 'c-mode-common-hook 'idl-mode-hook)
aac90c52
RS
1459 (c-update-modeline))
1460
1461\f
130c507e
GM
1462;; Support for Pike
1463
d9e94c22
MS
1464;;;###autoload
1465(defvar pike-mode-syntax-table nil
1466 "Syntax table used in pike-mode buffers.")
1467(or pike-mode-syntax-table
1468 (setq pike-mode-syntax-table
1469 (funcall (c-lang-const c-make-mode-syntax-table pike))))
1470
130c507e
GM
1471(defvar pike-mode-abbrev-table nil
1472 "Abbreviation table used in pike-mode buffers.")
a66cd3ee
MS
1473(c-define-abbrev-table 'pike-mode-abbrev-table
1474 '(("else" "else" c-electric-continued-statement 0)
1475 ("while" "while" c-electric-continued-statement 0)))
130c507e
GM
1476
1477(defvar pike-mode-map ()
1478 "Keymap used in pike-mode buffers.")
1479(if pike-mode-map
1480 nil
1481 (setq pike-mode-map (c-make-inherited-keymap))
1482 ;; additional bindings
1483 (define-key pike-mode-map "\C-c\C-e" 'c-macro-expand))
1484
1485(easy-menu-define c-pike-menu pike-mode-map "Pike Mode Commands"
d9e94c22
MS
1486 (cons "Pike" (c-lang-const c-mode-menu pike)))
1487
50fdde0e
MS
1488;;;###autoload (add-to-list 'auto-mode-alist '("\\.\\(u?lpc\\|pike\\|pmod\\(.in\\)?\\)\\'" . pike-mode))
1489;;;###autoload (add-to-list 'interpreter-mode-alist '("pike" . pike-mode))
130c507e 1490
0ec8351b
BW
1491;;;###autoload
1492(defun pike-mode ()
1493 "Major mode for editing Pike code.
a66cd3ee
MS
1494To submit a problem report, enter `\\[c-submit-bug-report]' from a
1495pike-mode buffer. This automatically sets up a mail buffer with
0ec8351b
BW
1496version information already added. You just need to add a description
1497of the problem, including a reproducible test case, and send the
1498message.
1499
1500To see what version of CC Mode you are running, enter `\\[c-version]'.
1501
d9e94c22
MS
1502The hook `c-mode-common-hook' is run with no args at mode
1503initialization, then `pike-mode-hook'.
0ec8351b
BW
1504
1505Key bindings:
1506\\{pike-mode-map}"
1507 (interactive)
0ec8351b 1508 (kill-all-local-variables)
d9e94c22 1509 (c-initialize-cc-mode t)
0ec8351b 1510 (set-syntax-table pike-mode-syntax-table)
175069ef 1511 (setq major-mode 'pike-mode ; FIXME: Use define-derived-mode.
0ec8351b 1512 mode-name "Pike"
130c507e 1513 local-abbrev-table pike-mode-abbrev-table
a66cd3ee 1514 abbrev-mode t)
0ec8351b 1515 (use-local-map pike-mode-map)
28d88c16 1516 (c-init-language-vars-for 'pike-mode)
a66cd3ee 1517 (c-common-init 'pike-mode)
d9e94c22
MS
1518 (easy-menu-add c-pike-menu)
1519 ;;(cc-imenu-init cc-imenu-pike-generic-expression) ;TODO
3efc2cd7 1520 (c-run-mode-hooks 'c-mode-common-hook 'pike-mode-hook)
0ec8351b
BW
1521 (c-update-modeline))
1522
1523\f
0386b551 1524;; Support for AWK
d9e94c22 1525
50fdde0e
MS
1526;;;###autoload (add-to-list 'auto-mode-alist '("\\.awk\\'" . awk-mode))
1527;;;###autoload (add-to-list 'interpreter-mode-alist '("awk" . awk-mode))
1528;;;###autoload (add-to-list 'interpreter-mode-alist '("mawk" . awk-mode))
1529;;;###autoload (add-to-list 'interpreter-mode-alist '("nawk" . awk-mode))
1530;;;###autoload (add-to-list 'interpreter-mode-alist '("gawk" . awk-mode))
d9e94c22 1531
50fdde0e
MS
1532;;; Autoload directives must be on the top level, so we construct an
1533;;; autoload form instead.
791887d9 1534;;;###autoload (autoload 'awk-mode "cc-mode" "Major mode for editing AWK code." t)
50fdde0e 1535
0386b551
AM
1536(defvar awk-mode-abbrev-table nil
1537 "Abbreviation table used in awk-mode buffers.")
1538(c-define-abbrev-table 'awk-mode-abbrev-table
1539 '(("else" "else" c-electric-continued-statement 0)
1540 ("while" "while" c-electric-continued-statement 0)))
1541
1542(defvar awk-mode-map ()
1543 "Keymap used in awk-mode buffers.")
1544(if awk-mode-map
1545 nil
1546 (setq awk-mode-map (c-make-inherited-keymap))
1547 ;; add bindings which are only useful for awk.
1548 (define-key awk-mode-map "#" 'self-insert-command)
1549 (define-key awk-mode-map "/" 'self-insert-command)
1550 (define-key awk-mode-map "*" 'self-insert-command)
1551 (define-key awk-mode-map "\C-c\C-n" 'undefined) ; #if doesn't exist in awk.
1552 (define-key awk-mode-map "\C-c\C-p" 'undefined)
1553 (define-key awk-mode-map "\C-c\C-u" 'undefined)
1554 (define-key awk-mode-map "\M-a" 'c-beginning-of-statement) ; 2003/10/7
1555 (define-key awk-mode-map "\M-e" 'c-end-of-statement) ; 2003/10/7
1556 (define-key awk-mode-map "\C-\M-a" 'c-awk-beginning-of-defun)
1557 (define-key awk-mode-map "\C-\M-e" 'c-awk-end-of-defun))
1558
1559(easy-menu-define c-awk-menu awk-mode-map "AWK Mode Commands"
1560 (cons "AWK" (c-lang-const c-mode-menu awk)))
1561
ae500c1a
GM
1562;; (require 'cc-awk) brings these in.
1563(defvar awk-mode-syntax-table)
1564(declare-function c-awk-unstick-NL-prop "cc-awk" ())
1565
0386b551
AM
1566(defun awk-mode ()
1567 "Major mode for editing AWK code.
d9e94c22
MS
1568To submit a problem report, enter `\\[c-submit-bug-report]' from an
1569awk-mode buffer. This automatically sets up a mail buffer with version
1570information already added. You just need to add a description of the
50fdde0e 1571problem, including a reproducible test case, and send the message.
d9e94c22
MS
1572
1573To see what version of CC Mode you are running, enter `\\[c-version]'.
1574
1575The hook `c-mode-common-hook' is run with no args at mode
1576initialization, then `awk-mode-hook'.
1577
1578Key bindings:
1579\\{awk-mode-map}"
0386b551
AM
1580 (interactive)
1581 (require 'cc-awk) ; Added 2003/6/10.
1582 (kill-all-local-variables)
1583 (c-initialize-cc-mode t)
1584 (set-syntax-table awk-mode-syntax-table)
175069ef 1585 (setq major-mode 'awk-mode ; FIXME: Use define-derived-mode.
0386b551
AM
1586 mode-name "AWK"
1587 local-abbrev-table awk-mode-abbrev-table
1588 abbrev-mode t)
1589 (use-local-map awk-mode-map)
1590 (c-init-language-vars-for 'awk-mode)
1591 (c-common-init 'awk-mode)
0386b551 1592 (c-awk-unstick-NL-prop)
0386b551
AM
1593
1594 ;; Prevent Xemacs's buffer-syntactic-context being used. See the comment
1595 ;; in cc-engine.el, just before (defun c-fast-in-literal ...
1596 (defalias 'c-in-literal 'c-slow-in-literal)
1597
1598 (c-run-mode-hooks 'c-mode-common-hook 'awk-mode-hook)
1599 (c-update-modeline))
d9e94c22
MS
1600
1601\f
c2efc1d0 1602;; bug reporting
785eecbb
RS
1603
1604(defconst c-mode-help-address
a66cd3ee
MS
1605 "bug-cc-mode@gnu.org"
1606 "Address(es) for CC Mode bug reports.")
785eecbb
RS
1607
1608(defun c-version ()
1609 "Echo the current version of CC Mode in the minibuffer."
1610 (interactive)
1611 (message "Using CC Mode version %s" c-version)
1612 (c-keep-region-active))
1613
130c507e
GM
1614(defvar c-prepare-bug-report-hooks nil)
1615
1616;; Dynamic variables used by reporter.
1617(defvar reporter-prompt-for-summary-p)
1618(defvar reporter-dont-compact-list)
1619
785eecbb
RS
1620(defun c-submit-bug-report ()
1621 "Submit via mail a bug report on CC Mode."
1622 (interactive)
77e31a8d 1623 (require 'reporter)
785eecbb
RS
1624 ;; load in reporter
1625 (let ((reporter-prompt-for-summary-p t)
1626 (reporter-dont-compact-list '(c-offsets-alist))
1627 (style c-indentation-style)
785eecbb
RS
1628 (c-features c-emacs-features))
1629 (and
1630 (if (y-or-n-p "Do you want to submit a report on CC Mode? ")
1631 t (message "") nil)
785eecbb
RS
1632 (reporter-submit-bug-report
1633 c-mode-help-address
d9e94c22 1634 (concat "CC Mode " c-version " (" mode-name ")")
51f606de 1635 (let ((vars (append
51f606de 1636 c-style-variables
d9e94c22 1637 '(c-buffer-is-cc-mode
51f606de 1638 c-tab-always-indent
d9e94c22
MS
1639 c-syntactic-indentation
1640 c-syntactic-indentation-in-macros
1641 c-ignore-auto-fill
1642 c-auto-align-backslashes
1643 c-backspace-function
1644 c-delete-function
1645 c-electric-pound-behavior
1646 c-default-style
1647 c-enable-xemacs-performance-kludge-p
1648 c-old-style-variable-behavior
51f606de
GM
1649 defun-prompt-regexp
1650 tab-width
1651 comment-column
1652 parse-sexp-ignore-comments
d9e94c22
MS
1653 parse-sexp-lookup-properties
1654 lookup-syntax-properties
51f606de
GM
1655 ;; A brain-damaged XEmacs only variable that, if
1656 ;; set to nil can cause all kinds of chaos.
1657 signal-error-on-buffer-boundary
1658 ;; Variables that affect line breaking and comments.
d9e94c22 1659 auto-fill-mode
91b807c9 1660 auto-fill-function
51f606de
GM
1661 filladapt-mode
1662 comment-multi-line
1663 comment-start-skip
1664 fill-prefix
d9e94c22 1665 fill-column
51f606de
GM
1666 paragraph-start
1667 adaptive-fill-mode
1668 adaptive-fill-regexp)
1669 nil)))
d61ca8d5 1670 (mapc (lambda (var) (unless (boundp var)
175069ef 1671 (setq vars (delq var vars))))
d61ca8d5
GM
1672 '(signal-error-on-buffer-boundary
1673 filladapt-mode
1674 defun-prompt-regexp
1675 font-lock-mode
1676 font-lock-maximum-decoration
1677 parse-sexp-lookup-properties
1678 lookup-syntax-properties))
51f606de 1679 vars)
9714ec23 1680 (lambda ()
a66cd3ee 1681 (run-hooks 'c-prepare-bug-report-hooks)
d9e94c22 1682 (insert (format "Buffer Style: %s\nc-emacs-features: %s\n"
a66cd3ee 1683 style c-features)))))))
785eecbb
RS
1684
1685\f
130c507e 1686(cc-provide 'cc-mode)
ab5796a9 1687
785eecbb 1688;;; cc-mode.el ends here