Add missing entry.
[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,
ae940284 4;; 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
d7a0267c 5;; Free Software Foundation, Inc.
785eecbb 6
d9e94c22
MS
7;; Authors: 2003- Alan Mackenzie
8;; 1998- Martin Stjernholm
9;; 1992-1999 Barry A. Warsaw
785eecbb
RS
10;; 1987 Dave Detlefs and Stewart Clamen
11;; 1985 Richard M. Stallman
0ec8351b 12;; Maintainer: bug-cc-mode@gnu.org
785eecbb 13;; Created: a long, long, time ago. adapted from the original c-mode.el
785eecbb
RS
14;; Keywords: c languages oop
15
785eecbb
RS
16;; This file is part of GNU Emacs.
17
b1fc2b50 18;; GNU Emacs is free software: you can redistribute it and/or modify
785eecbb 19;; it under the terms of the GNU General Public License as published by
b1fc2b50
GM
20;; the Free Software Foundation, either version 3 of the License, or
21;; (at your option) any later version.
785eecbb
RS
22
23;; GNU Emacs is distributed in the hope that it will be useful,
24;; but WITHOUT ANY WARRANTY; without even the implied warranty of
25;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
26;; GNU General Public License for more details.
27
28;; You should have received a copy of the GNU General Public License
b1fc2b50 29;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
785eecbb 30
d9e94c22 31;;; Commentary:
130c507e
GM
32
33;; NOTE: Read the commentary below for the right way to submit bug reports!
34;; NOTE: See the accompanying texinfo manual for details on using this mode!
d9e94c22 35;; Note: The version string is in cc-defs.
785eecbb
RS
36
37;; This package provides GNU Emacs major modes for editing C, C++,
d9e94c22
MS
38;; Objective-C, Java, CORBA's IDL, Pike and AWK code. As of the
39;; latest Emacs and XEmacs releases, it is the default package for
40;; editing these languages. This package is called "CC Mode", and
41;; should be spelled exactly this way.
0ec8351b
BW
42
43;; CC Mode supports K&R and ANSI C, ANSI C++, Objective-C, Java,
d9e94c22
MS
44;; CORBA's IDL, Pike and AWK with a consistent indentation model
45;; across all modes. This indentation model is intuitive and very
46;; flexible, so that almost any desired style of indentation can be
47;; supported. Installation, usage, and programming details are
48;; contained in an accompanying texinfo manual.
785eecbb
RS
49
50;; CC Mode's immediate ancestors were, c++-mode.el, cplus-md.el, and
51;; cplus-md1.el..
52
785eecbb 53;; To submit bug reports, type "C-c C-b". These will be sent to
0ec8351b
BW
54;; bug-gnu-emacs@gnu.org (mirrored as the Usenet newsgroup
55;; gnu.emacs.bug) as well as bug-cc-mode@gnu.org, which directly
56;; contacts the CC Mode maintainers. Questions can sent to
57;; help-gnu-emacs@gnu.org (mirrored as gnu.emacs.help) and/or
130c507e
GM
58;; bug-cc-mode@gnu.org. Please do not send bugs or questions to our
59;; personal accounts; we reserve the right to ignore such email!
785eecbb 60
785eecbb
RS
61;; Many, many thanks go out to all the folks on the beta test list.
62;; Without their patience, testing, insight, code contributions, and
63;; encouragement CC Mode would be a far inferior package.
64
65;; You can get the latest version of CC Mode, including PostScript
66;; documentation and separate individual files from:
67;;
91b807c9 68;; http://cc-mode.sourceforge.net/
0ec8351b
BW
69;;
70;; You can join a moderated CC Mode announcement-only mailing list by
71;; visiting
785eecbb 72;;
91b807c9 73;; http://lists.sourceforge.net/mailman/listinfo/cc-mode-announce
785eecbb
RS
74
75;;; Code:
76
ae500c1a
GM
77;; For Emacs < 22.2.
78(eval-and-compile
79 (unless (fboundp 'declare-function) (defmacro declare-function (&rest r))))
80
51f606de
GM
81(eval-when-compile
82 (let ((load-path
130c507e
GM
83 (if (and (boundp 'byte-compile-dest-file)
84 (stringp byte-compile-dest-file))
85 (cons (file-name-directory byte-compile-dest-file) load-path)
51f606de 86 load-path)))
d9e94c22 87 (load "cc-bytecomp" nil t)))
130c507e
GM
88
89(cc-require 'cc-defs)
d9e94c22 90(cc-require-when-compile 'cc-langs)
130c507e 91(cc-require 'cc-vars)
130c507e 92(cc-require 'cc-engine)
d9e94c22 93(cc-require 'cc-styles)
130c507e
GM
94(cc-require 'cc-cmds)
95(cc-require 'cc-align)
d9e94c22 96(cc-require 'cc-menus)
130c507e 97
3efc2cd7 98;; Silence the compiler.
0386b551 99(cc-bytecomp-defvar adaptive-fill-first-line-regexp) ; Emacs
130c507e 100(cc-bytecomp-defun set-keymap-parents) ; XEmacs
0386b551 101(cc-bytecomp-defun run-mode-hooks) ; Emacs 21.1
3efc2cd7 102(cc-bytecomp-obsolete-fun make-local-hook) ; Marked obsolete in 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.
115(autoload 'c-subword-mode "cc-subword"
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
AM
380 ;; (define-key c-mode-base-map "\C-c\C-y" 'c-toggle-hungry-state) Commented out by ACM, 2005-11-22.
381 (define-key c-mode-base-map "\C-c\C-w" 'c-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.
9c184ed2
AM
412;;
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
453;; changed where an element of `found-types' might become stale. It
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
457;;
458;; o - `c-decl-id-start' is the c-type text property value at buffer
459;; pos 96.
460;;
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.
464;;
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 'parse-sexp-ignore-comments)
491 (make-local-variable 'indent-line-function)
492 (make-local-variable 'indent-region-function)
130c507e
GM
493 (make-local-variable 'normal-auto-fill-function)
494 (make-local-variable 'comment-start)
495 (make-local-variable 'comment-end)
130c507e
GM
496 (make-local-variable 'comment-start-skip)
497 (make-local-variable 'comment-multi-line)
0386b551
AM
498 (make-local-variable 'comment-line-break-function)
499 (make-local-variable 'paragraph-start)
500 (make-local-variable 'paragraph-separate)
501 (make-local-variable 'paragraph-ignore-fill-prefix)
502 (make-local-variable 'adaptive-fill-mode)
503 (make-local-variable 'adaptive-fill-regexp)
a66cd3ee 504
130c507e 505 ;; now set their values
e2c21e66 506 (setq parse-sexp-ignore-comments t
130c507e
GM
507 indent-line-function 'c-indent-line
508 indent-region-function 'c-indent-region
130c507e 509 normal-auto-fill-function 'c-do-auto-fill
0386b551
AM
510 comment-multi-line t
511 comment-line-break-function 'c-indent-new-comment-line)
a66cd3ee 512
fd8771f5
MS
513 ;; Install `c-fill-paragraph' on `fill-paragraph-function' so that a
514 ;; direct call to `fill-paragraph' behaves better. This still
515 ;; doesn't work with filladapt but it's better than nothing.
516 (make-local-variable 'fill-paragraph-function)
517 (setq fill-paragraph-function 'c-fill-paragraph)
518
0386b551 519 (when (or c-recognize-<>-arglists
1d1e4868
AM
520 (c-major-mode-is 'awk-mode)
521 (c-major-mode-is '(c-mode c++-mode objc-mode)))
0386b551
AM
522 ;; We'll use the syntax-table text property to change the syntax
523 ;; of some chars for this language, so do the necessary setup for
524 ;; that.
525 ;;
526 ;; Note to other package developers: It's ok to turn this on in CC
527 ;; Mode buffers when CC Mode doesn't, but it's not ok to turn it
528 ;; off if CC Mode has turned it on.
529
530 ;; Emacs.
531 (when (boundp 'parse-sexp-lookup-properties)
532 (make-local-variable 'parse-sexp-lookup-properties)
533 (setq parse-sexp-lookup-properties t))
534
535 ;; Same as above for XEmacs.
536 (when (boundp 'lookup-syntax-properties)
537 (make-local-variable 'lookup-syntax-properties)
538 (setq lookup-syntax-properties t)))
d9e94c22
MS
539
540 ;; Use this in Emacs 21 to avoid meddling with the rear-nonsticky
541 ;; property on each character.
542 (when (boundp 'text-property-default-nonsticky)
543 (make-local-variable 'text-property-default-nonsticky)
544 (let ((elem (assq 'syntax-table text-property-default-nonsticky)))
545 (if elem
546 (setcdr elem t)
547 (setq text-property-default-nonsticky
548 (cons '(syntax-table . t)
549 text-property-default-nonsticky))))
550 (setq text-property-default-nonsticky
551 (cons '(c-type . t)
552 text-property-default-nonsticky)))
553
554 ;; In Emacs 21 and later it's possible to turn off the ad-hoc
555 ;; heuristic that open parens in column 0 are defun starters. Since
0386b551
AM
556 ;; we have c-state-cache, that heuristic isn't useful and only causes
557 ;; trouble, so turn it off.
99c8496e
AM
558;; 2006/12/17: This facility is somewhat confused, and doesn't really seem
559;; helpful. Comment it out for now.
560;; (when (memq 'col-0-paren c-emacs-features)
561;; (make-local-variable 'open-paren-in-column-0-is-defun-start)
562;; (setq open-paren-in-column-0-is-defun-start nil))
d9e94c22 563
d9e94c22
MS
564 (c-clear-found-types)
565
566 ;; now set the mode style based on default-style
567 (let ((style (if (stringp default-style)
568 default-style
569 (or (cdr (assq mode default-style))
570 (cdr (assq 'other default-style))
130c507e
GM
571 "gnu"))))
572 ;; Override style variables if `c-old-style-variable-behavior' is
573 ;; set. Also override if we are using global style variables,
574 ;; have already initialized a style once, and are switching to a
575 ;; different style. (It's doubtful whether this is desirable, but
576 ;; the whole situation with nonlocal style variables is a bit
577 ;; awkward. It's at least the most compatible way with the old
578 ;; style init procedure.)
579 (c-set-style style (not (or c-old-style-variable-behavior
580 (and (not c-style-variables-are-local-p)
581 c-indentation-style
582 (not (string-equal c-indentation-style
583 style)))))))
a66cd3ee
MS
584 (c-setup-paragraph-variables)
585
130c507e
GM
586 ;; we have to do something special for c-offsets-alist so that the
587 ;; buffer local value has its own alist structure.
588 (setq c-offsets-alist (copy-alist c-offsets-alist))
a66cd3ee 589
130c507e 590 ;; setup the comment indent variable in a Emacs version portable way
130c507e
GM
591 (make-local-variable 'comment-indent-function)
592 (setq comment-indent-function 'c-comment-indent)
a66cd3ee 593
cb694ab7
AM
594;; ;; Put submode indicators onto minor-mode-alist, but only once.
595;; (or (assq 'c-submode-indicators minor-mode-alist)
596;; (setq minor-mode-alist
597;; (cons '(c-submode-indicators c-submode-indicators)
598;; minor-mode-alist)))
599 (c-update-modeline)
a66cd3ee 600
d9e94c22
MS
601 ;; Install the functions that ensure that various internal caches
602 ;; don't become invalid due to buffer changes.
9c184ed2
AM
603 (make-local-hook 'before-change-functions)
604 (add-hook 'before-change-functions 'c-before-change nil t)
0386b551 605 (make-local-hook 'after-change-functions)
8714fc18 606 (add-hook 'after-change-functions 'c-after-change nil t)
7d562742 607 (set (make-local-variable 'font-lock-extend-after-change-region-function)
8714fc18 608 'c-extend-after-change-region)) ; Currently (2008-04), only used by AWK.
d9e94c22 609
d9e94c22
MS
610(defun c-setup-doc-comment-style ()
611 "Initialize the variables that depend on the value of `c-doc-comment-style'."
612 (when (and (featurep 'font-lock)
613 (symbol-value 'font-lock-mode))
614 ;; Force font lock mode to reinitialize itself.
615 (font-lock-mode 0)
616 (font-lock-mode 1)))
617
618(defun c-common-init (&optional mode)
619 "Common initialization for all CC Mode modes.
620In addition to the work done by `c-basic-common-init' and
621`c-font-lock-init', this function sets up various other things as
622customary in CC Mode modes but which aren't strictly necessary for CC
623Mode to operate correctly.
624
625MODE is the symbol for the mode to initialize, like 'c-mode. See
626`c-basic-common-init' for details. It's only optional to be
0386b551 627compatible with old code; callers should always specify it."
d9e94c22
MS
628
629 (unless mode
630 ;; Called from an old third party package. The fallback is to
631 ;; initialize for C.
28d88c16 632 (c-init-language-vars-for 'c-mode))
d9e94c22
MS
633
634 (c-basic-common-init mode c-default-style)
635 (when mode
636 ;; Only initialize font locking if we aren't called from an old package.
637 (c-font-lock-init))
638
1d1e4868
AM
639 ;; Starting a mode is a sort of "change". So call the change functions...
640 (save-restriction
641 (widen)
642 (save-excursion
643 (if c-get-state-before-change-function
644 (funcall c-get-state-before-change-function (point-min) (point-max)))
645 (if c-before-font-lock-function
646 (funcall c-before-font-lock-function (point-min) (point-max)
647 (- (point-max) (point-min))))))
648
d9e94c22
MS
649 (make-local-variable 'outline-regexp)
650 (make-local-variable 'outline-level)
651 (setq outline-regexp "[^#\n\^M]"
652 outline-level 'c-outline-level)
653
654 (let ((rfn (assq mode c-require-final-newline)))
655 (when rfn
656 (make-local-variable 'require-final-newline)
1750e02f
RS
657 (and (cdr rfn)
658 (setq require-final-newline mode-require-final-newline)))))
130c507e 659
a36abf0e
CY
660(defun c-before-hack-hook ()
661 "Set the CC Mode style and \"offsets\" when in the buffer's local variables.
662They are set only when, respectively, the pseudo variables
663`c-file-style' and `c-file-offsets' are present in the list.
664
665This function is called from the hook `before-hack-local-variables-hook'."
666 (when c-buffer-is-cc-mode
667 (let ((stile (cdr (assq 'c-file-style file-local-variables-alist)))
668 (offsets (cdr (assq 'c-file-offsets file-local-variables-alist))))
669 (when stile
670 (or (stringp stile) (error "c-file-style is not a string"))
671 (c-set-style stile))
672 (when offsets
673 (mapc
674 (lambda (langentry)
675 (let ((langelem (car langentry))
676 (offset (cdr langentry)))
677 (c-set-offset langelem offset)))
678 offsets)))))
679
cb694ab7
AM
680(defun c-remove-any-local-eval-or-mode-variables ()
681 ;; If the buffer specifies `mode' or `eval' in its File Local Variable list
682 ;; or on the first line, remove all occurrences. See
683 ;; `c-postprocess-file-styles' for justification. There is no need to save
5c4c911a
AM
684 ;; point here, or even bother too much about the buffer contents. However,
685 ;; DON'T mess up the kill-ring.
cb694ab7
AM
686 ;;
687 ;; Most of the code here is derived from Emacs 21.3's `hack-local-variables'
688 ;; in files.el.
689 (goto-char (point-max))
690 (search-backward "\n\^L" (max (- (point-max) 3000) (point-min)) 'move)
691 (let (lv-point (prefix "") (suffix ""))
692 (when (let ((case-fold-search t))
693 (search-forward "Local Variables:" nil t))
694 (setq lv-point (point))
695 ;; The prefix is what comes before "local variables:" in its line.
696 ;; The suffix is what comes after "local variables:" in its line.
697 (skip-chars-forward " \t")
698 (or (eolp)
699 (setq suffix (buffer-substring (point)
700 (progn (end-of-line) (point)))))
701 (goto-char (match-beginning 0))
702 (or (bolp)
703 (setq prefix
704 (buffer-substring (point)
705 (progn (beginning-of-line) (point)))))
706
707 (while (search-forward-regexp
708 (concat "^[ \t]*"
709 (regexp-quote prefix)
710 "\\(mode\\|eval\\):.*"
711 (regexp-quote suffix)
712 "$")
713 nil t)
5c4c911a
AM
714 (forward-line 0)
715 (delete-region (point) (progn (forward-line) (point)))))
cb694ab7
AM
716
717 ;; Delete the first line, if we've got one, in case it contains a mode spec.
718 (unless (and lv-point
719 (progn (goto-char lv-point)
720 (forward-line 0)
721 (bobp)))
722 (goto-char (point-min))
5c4c911a
AM
723 (unless (eobp)
724 (delete-region (point) (progn (forward-line) (point)))))))
cb694ab7 725
130c507e 726(defun c-postprocess-file-styles ()
d9e94c22 727 "Function that post processes relevant file local variables in CC Mode.
130c507e
GM
728Currently, this function simply applies any style and offset settings
729found in the file's Local Variable list. It first applies any style
730setting found in `c-file-style', then it applies any offset settings
731it finds in `c-file-offsets'.
732
733Note that the style variables are always made local to the buffer."
d9e94c22 734
130c507e 735 ;; apply file styles and offsets
09f90d2c
RS
736 (when c-buffer-is-cc-mode
737 (if (or c-file-style c-file-offsets)
738 (c-make-styles-buffer-local t))
c5fcadd1
AM
739 (when c-file-style
740 (or (stringp c-file-style)
741 (error "c-file-style is not a string"))
742 (c-set-style c-file-style))
b9a6ed29 743
09f90d2c 744 (and c-file-offsets
d61ca8d5 745 (mapc
09f90d2c
RS
746 (lambda (langentry)
747 (let ((langelem (car langentry))
748 (offset (cdr langentry)))
749 (c-set-offset langelem offset)))
0386b551
AM
750 c-file-offsets))
751 ;; Problem: The file local variable block might have explicitly set a
752 ;; style variable. The `c-set-style' or `mapcar' call might have
753 ;; overwritten this. So we run `hack-local-variables' again to remedy
754 ;; this. There are no guarantees this will work properly, particularly as
755 ;; we have no control over what the other hook functions on
cb694ab7
AM
756 ;; `hack-local-variables-hook' would have done. We now (2006/2/1) remove
757 ;; any `eval' or `mode' expressions before we evaluate again (see below).
758 ;; ACM, 2005/11/2.
759 ;;
760 ;; Problem (bug reported by Gustav Broberg): if one of the variables is
761 ;; `mode', this will invoke c-mode (etc.) again, setting up the style etc.
762 ;; We prevent this by temporarily removing `mode' from the Local Variables
763 ;; section.
0386b551 764 (if (or c-file-style c-file-offsets)
51c9af45
AM
765 (let ((hack-local-variables-hook nil) (inhibit-read-only t))
766 (c-tentative-buffer-changes
cb694ab7
AM
767 (c-remove-any-local-eval-or-mode-variables)
768 (hack-local-variables))
769 nil))))
130c507e 770
a36abf0e
CY
771(if (boundp 'before-hack-local-variables-hook)
772 (add-hook 'before-hack-local-variables-hook 'c-before-hack-hook)
773 (add-hook 'hack-local-variables-hook 'c-postprocess-file-styles))
130c507e 774
3efc2cd7
MS
775(defmacro c-run-mode-hooks (&rest hooks)
776 ;; Emacs 21.1 has introduced a system with delayed mode hooks that
777 ;; require the use of the new function `run-mode-hooks'.
778 (if (cc-bytecomp-fboundp 'run-mode-hooks)
779 `(run-mode-hooks ,@hooks)
780 `(progn ,@(mapcar (lambda (hook) `(run-hooks ,hook)) hooks))))
781
130c507e 782\f
1d1e4868
AM
783;;; Change hooks, linking with Font Lock.
784
785;; Buffer local variables defining the region to be fontified by a font lock
786;; after-change function. They are set in c-after-change to
787;; after-change-function's BEG and END, and may be modified by a
788;; `c-before-font-lock-function'.
789(defvar c-new-BEG 0)
790(make-variable-buffer-local 'c-new-BEG)
791(defvar c-new-END 0)
792(make-variable-buffer-local 'c-new-END)
793
794;; Buffer local variables recording Beginning/End-of-Macro position before a
795;; change, when a macro straddles, respectively, the BEG or END (or both) of
796;; the change region. Otherwise these have the values BEG/END.
797(defvar c-old-BOM 0)
798(make-variable-buffer-local 'c-old-BOM)
799(defvar c-old-EOM 0)
800(make-variable-buffer-local 'c-old-EOM)
801
802(defun c-extend-region-for-CPP (beg end)
f8016ed6
AM
803 ;; Set c-old-BOM or c-old-EOM respectively to BEG, END, each extended to the
804 ;; beginning/end of any preprocessor construct they may be in.
1d1e4868
AM
805 ;;
806 ;; Point is undefined both before and after this function call; the buffer
807 ;; has already been widened, and match-data saved. The return value is
808 ;; meaningless.
809 ;;
810 ;; This function is the C/C++/ObjC value of
811 ;; `c-get-state-before-change-function' and is called exclusively as a
812 ;; before change function.
813 (goto-char beg)
814 (c-beginning-of-macro)
815 (setq c-old-BOM (point))
816
817 (goto-char end)
f8016ed6
AM
818 (if (c-beginning-of-macro)
819 (c-end-of-macro))
820 (setq c-old-EOM (point)))
1d1e4868
AM
821
822(defun c-neutralize-CPP-line (beg end)
c5fcadd1
AM
823 ;; BEG and END bound a region, typically a preprocessor line. Put a
824 ;; "punctuation" syntax-table property on syntactically obtrusive
825 ;; characters, ones which would interact syntactically with stuff outside
826 ;; this region.
1d1e4868
AM
827 ;;
828 ;; These are unmatched string delimiters, or unmatched
829 ;; parens/brackets/braces. An unclosed comment is regarded as valid, NOT
830 ;; obtrusive.
c5fcadd1
AM
831 (save-excursion
832 (let (s)
833 (while
834 (progn
835 (setq s (parse-partial-sexp beg end -1))
836 (cond
837 ((< (nth 0 s) 0) ; found an unmated ),},]
838 (c-put-char-property (1- (point)) 'syntax-table '(1))
839 t)
840 ((nth 3 s) ; In a string
841 (c-put-char-property (nth 8 s) 'syntax-table '(1))
842 t)
843 ((> (nth 0 s) 0) ; In a (,{,[
844 (c-put-char-property (nth 1 s) 'syntax-table '(1))
845 t)
846 (t nil)))))))
1d1e4868
AM
847
848(defun c-neutralize-syntax-in-CPP (begg endd old-len)
849 ;; "Neutralize" every preprocessor line wholly or partially in the changed
850 ;; region. "Restore" lines which were CPP lines before the change and are
851 ;; no longer so; these can be located from the Buffer local variables
852 ;; c-old-[EB]OM.
853 ;;
854 ;; That is, set syntax-table properties on characters that would otherwise
855 ;; interact syntactically with those outside the CPP line(s).
856 ;;
857 ;; This function is called from an after-change function, BEGG ENDD and
858 ;; OLD-LEN being the standard parameters. It prepares the buffer for font
859 ;; locking, hence must get called before `font-lock-after-change-function'.
860 ;;
861 ;; Point is undefined both before and after this function call, the buffer
862 ;; has been widened, and match-data saved. The return value is ignored.
863 ;;
864 ;; This function is the C/C++/ObjC value of `c-before-font-lock-function'.
865 ;;
c5fcadd1
AM
866 ;; Note: SPEED _MATTERS_ IN THIS FUNCTION!!!
867 ;;
868 ;; This function might make hidden buffer changes.
f18ea992 869 (c-save-buffer-state (limits mbeg+1 beg end)
c5fcadd1
AM
870 ;; First determine the region, (beg end), which may need "neutralizing".
871 ;; This may not start inside a string, comment, or macro.
872 (goto-char c-old-BOM) ; already set to old start of macro or begg.
873 (setq beg
874 (if (setq limits (c-literal-limits))
875 (cdr limits) ; go forward out of any string or comment.
876 (point)))
877
1d1e4868 878 (goto-char endd)
c5fcadd1
AM
879 (if (setq limits (c-literal-limits))
880 (goto-char (car limits))) ; go backward out of any string or comment.
881 (if (c-beginning-of-macro)
882 (c-end-of-macro))
1d1e4868
AM
883 (setq end (max (+ (- c-old-EOM old-len) (- endd begg))
884 (point)))
c5fcadd1 885
1d1e4868
AM
886 ;; Clear all old punctuation properties
887 (c-clear-char-property-with-value beg end 'syntax-table '(1))
888
889 (goto-char beg)
c5fcadd1
AM
890 (let ((pps-position beg) pps-state)
891 (while (and (< (point) end)
892 (search-forward-regexp c-anchored-cpp-prefix end t))
893 ;; If we've found a "#" inside a string/comment, ignore it.
894 (setq pps-state
895 (parse-partial-sexp pps-position (point) nil nil pps-state)
896 pps-position (point))
897 (unless (or (nth 3 pps-state) ; in a string?
898 (nth 4 pps-state)) ; in a comment?
899 (setq mbeg+1 (point))
900 (c-end-of-macro) ; Do we need to go forward 1 char here? No!
901 (c-neutralize-CPP-line mbeg+1 (point))
902 (setq pps-position (point))))))) ; no need to update pps-state.
1d1e4868
AM
903
904(defun c-before-change (beg end)
905 ;; Function to be put on `before-change-function'. Primarily, this calls
906 ;; the language dependent `c-get-state-before-change-function'. It is
907 ;; otherwise used only to remove stale entries from the `c-found-types'
908 ;; cache, and to record entries which a `c-after-change' function might
909 ;; confirm as stale.
910 ;;
911 ;; Note that this function must be FAST rather than accurate. Note
912 ;; also that it only has any effect when font locking is enabled.
913 ;; We exploit this by checking for font-lock-*-face instead of doing
914 ;; rigourous syntactic analysis.
915
916 ;; If either change boundary is wholly inside an identifier, delete
917 ;; it/them from the cache. Don't worry about being inside a string
918 ;; or a comment - "wrongly" removing a symbol from `c-found-types'
919 ;; isn't critical.
920 (setq c-maybe-stale-found-type nil)
921 (save-restriction
922 (save-match-data
923 (widen)
924 (save-excursion
925 ;; Are we inserting/deleting stuff in the middle of an identifier?
926 (c-unfind-enclosing-token beg)
927 (c-unfind-enclosing-token end)
928 ;; Are we coalescing two tokens together, e.g. "fo o" -> "foo"?
929 (when (< beg end)
930 (c-unfind-coalesced-tokens beg end))
931 ;; Are we (potentially) disrupting the syntactic context which
932 ;; makes a type a type? E.g. by inserting stuff after "foo" in
933 ;; "foo bar;", or before "foo" in "typedef foo *bar;"?
934 ;;
935 ;; We search for appropriate c-type properties "near" the change.
936 ;; First, find an appropriate boundary for this property search.
937 (let (lim
938 type type-pos
939 marked-id term-pos
940 (end1
941 (or (and (eq (get-text-property end 'face) 'font-lock-comment-face)
942 (previous-single-property-change end 'face))
943 end)))
944 (when (>= end1 beg) ; Don't hassle about changes entirely in comments.
945 ;; Find a limit for the search for a `c-type' property
946 (while
947 (and (/= (skip-chars-backward "^;{}") 0)
948 (> (point) (point-min))
949 (memq (c-get-char-property (1- (point)) 'face)
950 '(font-lock-comment-face font-lock-string-face))))
951 (setq lim (max (point-min) (1- (point))))
952
953 ;; Look for the latest `c-type' property before end1
954 (when (and (> end1 (point-min))
955 (setq type-pos
956 (if (get-text-property (1- end1) 'c-type)
957 end1
958 (previous-single-property-change end1 'c-type nil lim))))
959 (setq type (get-text-property (max (1- type-pos) lim) 'c-type))
960
961 (when (memq type '(c-decl-id-start c-decl-type-start))
962 ;; Get the identifier, if any, that the property is on.
963 (goto-char (1- type-pos))
964 (setq marked-id
965 (when (looking-at "\\(\\sw\\|\\s_\\)")
966 (c-beginning-of-current-token)
967 (buffer-substring-no-properties (point) type-pos)))
968
969 (goto-char end1)
970 (skip-chars-forward "^;{}") ; FIXME!!! loop for comment, maybe
971 (setq lim (point))
972 (setq term-pos
973 (or (next-single-property-change end 'c-type nil lim) lim))
974 (setq c-maybe-stale-found-type
975 (list type marked-id
976 type-pos term-pos
977 (buffer-substring-no-properties type-pos term-pos)
978 (buffer-substring-no-properties beg end)))))))
979
980 (setq c-new-BEG beg
981 c-new-END end)
982 (if c-get-state-before-change-function
983 (funcall c-get-state-before-change-function beg end))
984 ))))
985
986(defun c-after-change (beg end old-len)
987 ;; Function put on `after-change-functions' to adjust various caches
988 ;; etc. Prefer speed to finesse here, since there will be an order
989 ;; of magnitude more calls to this function than any of the
990 ;; functions that use the caches.
991 ;;
992 ;; Note that care must be taken so that this is called before any
993 ;; font-lock callbacks since we might get calls to functions using
994 ;; these caches from inside them, and we must thus be sure that this
995 ;; has already been executed.
996 ;;
997 ;; This calls the language variable c-before-font-lock-function, if non nil.
998 ;; This typically sets `syntax-table' properties.
999
1000 (c-save-buffer-state ()
1001 ;; When `combine-after-change-calls' is used we might get calls
1002 ;; with regions outside the current narrowing. This has been
1003 ;; observed in Emacs 20.7.
1004 (save-restriction
1005 (save-match-data ; c-recognize-<>-arglists changes match-data
1006 (widen)
1007
1008 (when (> end (point-max))
1009 ;; Some emacsen might return positions past the end. This has been
1010 ;; observed in Emacs 20.7 when rereading a buffer changed on disk
1011 ;; (haven't been able to minimize it, but Emacs 21.3 appears to
1012 ;; work).
1013 (setq end (point-max))
1014 (when (> beg end)
1015 (setq beg end)))
1016
1017 (c-trim-found-types beg end old-len) ; maybe we don't need all of these.
1018 (c-invalidate-sws-region-after beg end)
1019 (c-invalidate-state-cache beg)
1020 (c-invalidate-find-decl-cache beg)
1021
1022 (when c-recognize-<>-arglists
1023 (c-after-change-check-<>-operators beg end))
1024
1025 (if c-before-font-lock-function
1026 (save-excursion
1027 (funcall c-before-font-lock-function beg end old-len)))))))
1028
1029(defun c-after-font-lock-init ()
1030 ;; Put on `font-lock-mode-hook'.
1031 (remove-hook 'after-change-functions 'c-after-change t)
1032 (add-hook 'after-change-functions 'c-after-change nil t))
1033
1034(defun c-font-lock-init ()
1035 "Set up the font-lock variables for using the font-lock support in CC Mode.
1036This does not load the font-lock package. Use after
1037`c-basic-common-init' and after cc-fonts has been loaded."
1038
1039 (make-local-variable 'font-lock-defaults)
1040 (setq font-lock-defaults
1041 `(,(if (c-major-mode-is 'awk-mode)
1042 ;; awk-mode currently has only one font lock level.
1043 'awk-font-lock-keywords
1044 (mapcar 'c-mode-symbol
1045 '("font-lock-keywords" "font-lock-keywords-1"
1046 "font-lock-keywords-2" "font-lock-keywords-3")))
1047 nil nil
1048 ,c-identifier-syntax-modifications
1049 c-beginning-of-syntax
1050 (font-lock-lines-before . 1)
1051 (font-lock-mark-block-function
1052 . c-mark-function)))
1053
1054 (make-local-hook 'font-lock-mode-hook)
1055 (add-hook 'font-lock-mode-hook 'c-after-font-lock-init nil t))
1056
8714fc18
AM
1057(defun c-extend-after-change-region (beg end old-len)
1058 "Extend the region to be fontified, if necessary."
1059 ;; Note: the parameters are ignored here. This somewhat indirect
1060 ;; implementation exists because it is minimally different from the
1061 ;; stand-alone CC Mode which, lacking
1062 ;; font-lock-extend-after-change-region-function, is forced to use advice
1063 ;; instead.
1064 ;;
1065 ;; Of the seven CC Mode languages, currently (2008-04) only AWK Mode makes
1066 ;; non-null use of this function.
1067 (cons c-new-BEG c-new-END))
1d1e4868
AM
1068
1069\f
130c507e
GM
1070;; Support for C
1071
d9e94c22
MS
1072;;;###autoload
1073(defvar c-mode-syntax-table nil
1074 "Syntax table used in c-mode buffers.")
1075(or c-mode-syntax-table
1076 (setq c-mode-syntax-table
1077 (funcall (c-lang-const c-make-mode-syntax-table c))))
1078
130c507e
GM
1079(defvar c-mode-abbrev-table nil
1080 "Abbreviation table used in c-mode buffers.")
a66cd3ee
MS
1081(c-define-abbrev-table 'c-mode-abbrev-table
1082 '(("else" "else" c-electric-continued-statement 0)
1083 ("while" "while" c-electric-continued-statement 0)))
130c507e
GM
1084
1085(defvar c-mode-map ()
1086 "Keymap used in c-mode buffers.")
1087(if c-mode-map
1088 nil
1089 (setq c-mode-map (c-make-inherited-keymap))
1090 ;; add bindings which are only useful for C
1091 (define-key c-mode-map "\C-c\C-e" 'c-macro-expand)
1092 )
1093
1094(easy-menu-define c-c-menu c-mode-map "C Mode Commands"
d9e94c22
MS
1095 (cons "C" (c-lang-const c-mode-menu c)))
1096
1097;; In XEmacs >= 21.5 modes should add their own entries to
1098;; `auto-mode-alist'. The comment form of autoload is used to avoid
1099;; doing this on load. That since `add-to-list' prepends the value
1100;; which could cause it to clobber user settings. Later emacsen have
1101;; an append option, but it's not safe to use.
50fdde0e
MS
1102
1103;; The the extension ".C" is associated to C++ while the lowercase
1104;; variant goes to C. On case insensitive file systems, this means
1105;; that ".c" files also might open C++ mode if the C++ entry comes
1106;; first on `auto-mode-alist'. Thus we try to ensure that ".C" comes
1107;; after ".c", and since `add-to-list' adds the entry first we have to
1108;; add the ".C" entry first.
1109;;;###autoload (add-to-list 'auto-mode-alist '("\\.\\(cc\\|hh\\)\\'" . c++-mode))
1110;;;###autoload (add-to-list 'auto-mode-alist '("\\.[ch]\\(pp\\|xx\\|\\+\\+\\)\\'" . c++-mode))
1111;;;###autoload (add-to-list 'auto-mode-alist '("\\.\\(CC?\\|HH?\\)\\'" . c++-mode))
1112
d9e94c22
MS
1113;;;###autoload (add-to-list 'auto-mode-alist '("\\.[ch]\\'" . c-mode))
1114
1115;; NB: The following two associate yacc and lex files to C Mode, which
1116;; is not really suitable for those formats. Anyway, afaik there's
1117;; currently no better mode for them, and besides this is legacy.
1118;;;###autoload (add-to-list 'auto-mode-alist '("\\.y\\(acc\\)?\\'" . c-mode))
1119;;;###autoload (add-to-list 'auto-mode-alist '("\\.lex\\'" . c-mode))
1120
f63b48bb
DN
1121;; Preprocessed files generated by C and C++ compilers.
1122;;;###autoload (add-to-list 'auto-mode-alist '("\\.i\\'" . c-mode))
1123;;;###autoload (add-to-list 'auto-mode-alist '("\\.ii\\'" . c++-mode))
1124
1125
785eecbb
RS
1126;;;###autoload
1127(defun c-mode ()
1128 "Major mode for editing K&R and ANSI C code.
1129To submit a problem report, enter `\\[c-submit-bug-report]' from a
1130c-mode buffer. This automatically sets up a mail buffer with version
1131information already added. You just need to add a description of the
50fdde0e 1132problem, including a reproducible test case, and send the message.
785eecbb
RS
1133
1134To see what version of CC Mode you are running, enter `\\[c-version]'.
1135
d9e94c22
MS
1136The hook `c-mode-common-hook' is run with no args at mode
1137initialization, then `c-mode-hook'.
785eecbb
RS
1138
1139Key bindings:
1140\\{c-mode-map}"
1141 (interactive)
785eecbb 1142 (kill-all-local-variables)
d9e94c22 1143 (c-initialize-cc-mode t)
785eecbb
RS
1144 (set-syntax-table c-mode-syntax-table)
1145 (setq major-mode 'c-mode
1146 mode-name "C"
130c507e
GM
1147 local-abbrev-table c-mode-abbrev-table
1148 abbrev-mode t)
785eecbb 1149 (use-local-map c-mode-map)
28d88c16 1150 (c-init-language-vars-for 'c-mode)
a66cd3ee 1151 (c-common-init 'c-mode)
d9e94c22 1152 (easy-menu-add c-c-menu)
51f606de 1153 (cc-imenu-init cc-imenu-c-generic-expression)
3efc2cd7 1154 (c-run-mode-hooks 'c-mode-common-hook 'c-mode-hook)
785eecbb
RS
1155 (c-update-modeline))
1156
1157\f
130c507e
GM
1158;; Support for C++
1159
d9e94c22
MS
1160;;;###autoload
1161(defvar c++-mode-syntax-table nil
1162 "Syntax table used in c++-mode buffers.")
1163(or c++-mode-syntax-table
1164 (setq c++-mode-syntax-table
1165 (funcall (c-lang-const c-make-mode-syntax-table c++))))
1166
130c507e
GM
1167(defvar c++-mode-abbrev-table nil
1168 "Abbreviation table used in c++-mode buffers.")
a66cd3ee
MS
1169(c-define-abbrev-table 'c++-mode-abbrev-table
1170 '(("else" "else" c-electric-continued-statement 0)
1171 ("while" "while" c-electric-continued-statement 0)
1172 ("catch" "catch" c-electric-continued-statement 0)))
130c507e
GM
1173
1174(defvar c++-mode-map ()
1175 "Keymap used in c++-mode buffers.")
1176(if c++-mode-map
1177 nil
1178 (setq c++-mode-map (c-make-inherited-keymap))
1179 ;; add bindings which are only useful for C++
1180 (define-key c++-mode-map "\C-c\C-e" 'c-macro-expand)
1181 (define-key c++-mode-map "\C-c:" 'c-scope-operator)
1182 (define-key c++-mode-map "<" 'c-electric-lt-gt)
1183 (define-key c++-mode-map ">" 'c-electric-lt-gt))
1184
1185(easy-menu-define c-c++-menu c++-mode-map "C++ Mode Commands"
d9e94c22
MS
1186 (cons "C++" (c-lang-const c-mode-menu c++)))
1187
785eecbb
RS
1188;;;###autoload
1189(defun c++-mode ()
1190 "Major mode for editing C++ code.
1191To submit a problem report, enter `\\[c-submit-bug-report]' from a
1192c++-mode buffer. This automatically sets up a mail buffer with
1193version information already added. You just need to add a description
1194of the problem, including a reproducible test case, and send the
1195message.
1196
1197To see what version of CC Mode you are running, enter `\\[c-version]'.
1198
d9e94c22
MS
1199The hook `c-mode-common-hook' is run with no args at mode
1200initialization, then `c++-mode-hook'.
785eecbb
RS
1201
1202Key bindings:
1203\\{c++-mode-map}"
1204 (interactive)
785eecbb 1205 (kill-all-local-variables)
d9e94c22 1206 (c-initialize-cc-mode t)
785eecbb
RS
1207 (set-syntax-table c++-mode-syntax-table)
1208 (setq major-mode 'c++-mode
1209 mode-name "C++"
130c507e
GM
1210 local-abbrev-table c++-mode-abbrev-table
1211 abbrev-mode t)
785eecbb 1212 (use-local-map c++-mode-map)
28d88c16 1213 (c-init-language-vars-for 'c++-mode)
a66cd3ee 1214 (c-common-init 'c++-mode)
d9e94c22 1215 (easy-menu-add c-c++-menu)
51f606de 1216 (cc-imenu-init cc-imenu-c++-generic-expression)
3efc2cd7 1217 (c-run-mode-hooks 'c-mode-common-hook 'c++-mode-hook)
785eecbb
RS
1218 (c-update-modeline))
1219
1220\f
130c507e
GM
1221;; Support for Objective-C
1222
d9e94c22
MS
1223;;;###autoload
1224(defvar objc-mode-syntax-table nil
1225 "Syntax table used in objc-mode buffers.")
1226(or objc-mode-syntax-table
1227 (setq objc-mode-syntax-table
1228 (funcall (c-lang-const c-make-mode-syntax-table objc))))
1229
130c507e
GM
1230(defvar objc-mode-abbrev-table nil
1231 "Abbreviation table used in objc-mode buffers.")
a66cd3ee
MS
1232(c-define-abbrev-table 'objc-mode-abbrev-table
1233 '(("else" "else" c-electric-continued-statement 0)
1234 ("while" "while" c-electric-continued-statement 0)))
130c507e
GM
1235
1236(defvar objc-mode-map ()
1237 "Keymap used in objc-mode buffers.")
1238(if objc-mode-map
1239 nil
1240 (setq objc-mode-map (c-make-inherited-keymap))
1241 ;; add bindings which are only useful for Objective-C
1242 (define-key objc-mode-map "\C-c\C-e" 'c-macro-expand))
1243
1244(easy-menu-define c-objc-menu objc-mode-map "ObjC Mode Commands"
d9e94c22
MS
1245 (cons "ObjC" (c-lang-const c-mode-menu objc)))
1246
1247;;;###autoload (add-to-list 'auto-mode-alist '("\\.m\\'" . objc-mode))
130c507e 1248
785eecbb
RS
1249;;;###autoload
1250(defun objc-mode ()
1251 "Major mode for editing Objective C code.
1252To submit a problem report, enter `\\[c-submit-bug-report]' from an
1253objc-mode buffer. This automatically sets up a mail buffer with
1254version information already added. You just need to add a description
1255of the problem, including a reproducible test case, and send the
1256message.
1257
1258To see what version of CC Mode you are running, enter `\\[c-version]'.
1259
d9e94c22
MS
1260The hook `c-mode-common-hook' is run with no args at mode
1261initialization, then `objc-mode-hook'.
785eecbb
RS
1262
1263Key bindings:
1264\\{objc-mode-map}"
1265 (interactive)
785eecbb 1266 (kill-all-local-variables)
d9e94c22 1267 (c-initialize-cc-mode t)
785eecbb
RS
1268 (set-syntax-table objc-mode-syntax-table)
1269 (setq major-mode 'objc-mode
1270 mode-name "ObjC"
130c507e
GM
1271 local-abbrev-table objc-mode-abbrev-table
1272 abbrev-mode t)
785eecbb 1273 (use-local-map objc-mode-map)
28d88c16 1274 (c-init-language-vars-for 'objc-mode)
a66cd3ee 1275 (c-common-init 'objc-mode)
d9e94c22
MS
1276 (easy-menu-add c-objc-menu)
1277 (cc-imenu-init nil 'cc-imenu-objc-function)
3efc2cd7 1278 (c-run-mode-hooks 'c-mode-common-hook 'objc-mode-hook)
785eecbb
RS
1279 (c-update-modeline))
1280
1281\f
130c507e
GM
1282;; Support for Java
1283
d9e94c22
MS
1284;;;###autoload
1285(defvar java-mode-syntax-table nil
1286 "Syntax table used in java-mode buffers.")
1287(or java-mode-syntax-table
1288 (setq java-mode-syntax-table
1289 (funcall (c-lang-const c-make-mode-syntax-table java))))
1290
130c507e
GM
1291(defvar java-mode-abbrev-table nil
1292 "Abbreviation table used in java-mode buffers.")
a66cd3ee
MS
1293(c-define-abbrev-table 'java-mode-abbrev-table
1294 '(("else" "else" c-electric-continued-statement 0)
1295 ("while" "while" c-electric-continued-statement 0)
1296 ("catch" "catch" c-electric-continued-statement 0)
1297 ("finally" "finally" c-electric-continued-statement 0)))
130c507e
GM
1298
1299(defvar java-mode-map ()
1300 "Keymap used in java-mode buffers.")
1301(if java-mode-map
1302 nil
1303 (setq java-mode-map (c-make-inherited-keymap))
1304 ;; add bindings which are only useful for Java
1305 )
1306
d9e94c22
MS
1307;; Regexp trying to describe the beginning of a Java top-level
1308;; definition. This is not used by CC Mode, nor is it maintained
1309;; since it's practically impossible to write a regexp that reliably
1310;; matches such a construct. Other tools are necessary.
1311(defconst c-Java-defun-prompt-regexp
1312 "^[ \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-*")
1313
130c507e 1314(easy-menu-define c-java-menu java-mode-map "Java Mode Commands"
d9e94c22
MS
1315 (cons "Java" (c-lang-const c-mode-menu java)))
1316
1317;;;###autoload (add-to-list 'auto-mode-alist '("\\.java\\'" . java-mode))
130c507e 1318
785eecbb
RS
1319;;;###autoload
1320(defun java-mode ()
1321 "Major mode for editing Java code.
dc2b4c5f 1322To submit a problem report, enter `\\[c-submit-bug-report]' from a
785eecbb
RS
1323java-mode buffer. This automatically sets up a mail buffer with
1324version information already added. You just need to add a description
50fdde0e 1325of the problem, including a reproducible test case, and send the
785eecbb
RS
1326message.
1327
1328To see what version of CC Mode you are running, enter `\\[c-version]'.
1329
d9e94c22
MS
1330The hook `c-mode-common-hook' is run with no args at mode
1331initialization, then `java-mode-hook'.
785eecbb
RS
1332
1333Key bindings:
1334\\{java-mode-map}"
1335 (interactive)
785eecbb 1336 (kill-all-local-variables)
d9e94c22 1337 (c-initialize-cc-mode t)
785eecbb
RS
1338 (set-syntax-table java-mode-syntax-table)
1339 (setq major-mode 'java-mode
1340 mode-name "Java"
91b807c9 1341 local-abbrev-table java-mode-abbrev-table
a66cd3ee 1342 abbrev-mode t)
785eecbb 1343 (use-local-map java-mode-map)
28d88c16 1344 (c-init-language-vars-for 'java-mode)
a66cd3ee 1345 (c-common-init 'java-mode)
d9e94c22 1346 (easy-menu-add c-java-menu)
51f606de 1347 (cc-imenu-init cc-imenu-java-generic-expression)
3efc2cd7 1348 (c-run-mode-hooks 'c-mode-common-hook 'java-mode-hook)
785eecbb
RS
1349 (c-update-modeline))
1350
1351\f
130c507e
GM
1352;; Support for CORBA's IDL language
1353
d9e94c22
MS
1354;;;###autoload
1355(defvar idl-mode-syntax-table nil
1356 "Syntax table used in idl-mode buffers.")
1357(or idl-mode-syntax-table
1358 (setq idl-mode-syntax-table
1359 (funcall (c-lang-const c-make-mode-syntax-table idl))))
1360
130c507e
GM
1361(defvar idl-mode-abbrev-table nil
1362 "Abbreviation table used in idl-mode buffers.")
a66cd3ee 1363(c-define-abbrev-table 'idl-mode-abbrev-table nil)
130c507e
GM
1364
1365(defvar idl-mode-map ()
1366 "Keymap used in idl-mode buffers.")
1367(if idl-mode-map
1368 nil
1369 (setq idl-mode-map (c-make-inherited-keymap))
1370 ;; add bindings which are only useful for IDL
1371 )
1372
1373(easy-menu-define c-idl-menu idl-mode-map "IDL Mode Commands"
d9e94c22
MS
1374 (cons "IDL" (c-lang-const c-mode-menu idl)))
1375
1376;;;###autoload (add-to-list 'auto-mode-alist '("\\.idl\\'" . idl-mode))
130c507e 1377
aac90c52
RS
1378;;;###autoload
1379(defun idl-mode ()
d9e94c22 1380 "Major mode for editing CORBA's IDL, PSDL and CIDL code.
aac90c52
RS
1381To submit a problem report, enter `\\[c-submit-bug-report]' from an
1382idl-mode buffer. This automatically sets up a mail buffer with
1383version information already added. You just need to add a description
1384of the problem, including a reproducible test case, and send the
1385message.
1386
1387To see what version of CC Mode you are running, enter `\\[c-version]'.
1388
d9e94c22
MS
1389The hook `c-mode-common-hook' is run with no args at mode
1390initialization, then `idl-mode-hook'.
aac90c52
RS
1391
1392Key bindings:
1393\\{idl-mode-map}"
1394 (interactive)
aac90c52 1395 (kill-all-local-variables)
d9e94c22 1396 (c-initialize-cc-mode t)
aac90c52
RS
1397 (set-syntax-table idl-mode-syntax-table)
1398 (setq major-mode 'idl-mode
1399 mode-name "IDL"
1400 local-abbrev-table idl-mode-abbrev-table)
1401 (use-local-map idl-mode-map)
28d88c16 1402 (c-init-language-vars-for 'idl-mode)
a66cd3ee 1403 (c-common-init 'idl-mode)
d9e94c22
MS
1404 (easy-menu-add c-idl-menu)
1405 ;;(cc-imenu-init cc-imenu-idl-generic-expression) ;TODO
3efc2cd7 1406 (c-run-mode-hooks 'c-mode-common-hook 'idl-mode-hook)
aac90c52
RS
1407 (c-update-modeline))
1408
1409\f
130c507e
GM
1410;; Support for Pike
1411
d9e94c22
MS
1412;;;###autoload
1413(defvar pike-mode-syntax-table nil
1414 "Syntax table used in pike-mode buffers.")
1415(or pike-mode-syntax-table
1416 (setq pike-mode-syntax-table
1417 (funcall (c-lang-const c-make-mode-syntax-table pike))))
1418
130c507e
GM
1419(defvar pike-mode-abbrev-table nil
1420 "Abbreviation table used in pike-mode buffers.")
a66cd3ee
MS
1421(c-define-abbrev-table 'pike-mode-abbrev-table
1422 '(("else" "else" c-electric-continued-statement 0)
1423 ("while" "while" c-electric-continued-statement 0)))
130c507e
GM
1424
1425(defvar pike-mode-map ()
1426 "Keymap used in pike-mode buffers.")
1427(if pike-mode-map
1428 nil
1429 (setq pike-mode-map (c-make-inherited-keymap))
1430 ;; additional bindings
1431 (define-key pike-mode-map "\C-c\C-e" 'c-macro-expand))
1432
1433(easy-menu-define c-pike-menu pike-mode-map "Pike Mode Commands"
d9e94c22
MS
1434 (cons "Pike" (c-lang-const c-mode-menu pike)))
1435
50fdde0e
MS
1436;;;###autoload (add-to-list 'auto-mode-alist '("\\.\\(u?lpc\\|pike\\|pmod\\(.in\\)?\\)\\'" . pike-mode))
1437;;;###autoload (add-to-list 'interpreter-mode-alist '("pike" . pike-mode))
130c507e 1438
0ec8351b
BW
1439;;;###autoload
1440(defun pike-mode ()
1441 "Major mode for editing Pike code.
a66cd3ee
MS
1442To submit a problem report, enter `\\[c-submit-bug-report]' from a
1443pike-mode buffer. This automatically sets up a mail buffer with
0ec8351b
BW
1444version information already added. You just need to add a description
1445of the problem, including a reproducible test case, and send the
1446message.
1447
1448To see what version of CC Mode you are running, enter `\\[c-version]'.
1449
d9e94c22
MS
1450The hook `c-mode-common-hook' is run with no args at mode
1451initialization, then `pike-mode-hook'.
0ec8351b
BW
1452
1453Key bindings:
1454\\{pike-mode-map}"
1455 (interactive)
0ec8351b 1456 (kill-all-local-variables)
d9e94c22 1457 (c-initialize-cc-mode t)
0ec8351b
BW
1458 (set-syntax-table pike-mode-syntax-table)
1459 (setq major-mode 'pike-mode
1460 mode-name "Pike"
130c507e 1461 local-abbrev-table pike-mode-abbrev-table
a66cd3ee 1462 abbrev-mode t)
0ec8351b 1463 (use-local-map pike-mode-map)
28d88c16 1464 (c-init-language-vars-for 'pike-mode)
a66cd3ee 1465 (c-common-init 'pike-mode)
d9e94c22
MS
1466 (easy-menu-add c-pike-menu)
1467 ;;(cc-imenu-init cc-imenu-pike-generic-expression) ;TODO
3efc2cd7 1468 (c-run-mode-hooks 'c-mode-common-hook 'pike-mode-hook)
0ec8351b
BW
1469 (c-update-modeline))
1470
1471\f
0386b551 1472;; Support for AWK
d9e94c22 1473
50fdde0e
MS
1474;;;###autoload (add-to-list 'auto-mode-alist '("\\.awk\\'" . awk-mode))
1475;;;###autoload (add-to-list 'interpreter-mode-alist '("awk" . awk-mode))
1476;;;###autoload (add-to-list 'interpreter-mode-alist '("mawk" . awk-mode))
1477;;;###autoload (add-to-list 'interpreter-mode-alist '("nawk" . awk-mode))
1478;;;###autoload (add-to-list 'interpreter-mode-alist '("gawk" . awk-mode))
d9e94c22 1479
50fdde0e
MS
1480;;; Autoload directives must be on the top level, so we construct an
1481;;; autoload form instead.
791887d9 1482;;;###autoload (autoload 'awk-mode "cc-mode" "Major mode for editing AWK code." t)
50fdde0e 1483
0386b551
AM
1484(defvar awk-mode-abbrev-table nil
1485 "Abbreviation table used in awk-mode buffers.")
1486(c-define-abbrev-table 'awk-mode-abbrev-table
1487 '(("else" "else" c-electric-continued-statement 0)
1488 ("while" "while" c-electric-continued-statement 0)))
1489
1490(defvar awk-mode-map ()
1491 "Keymap used in awk-mode buffers.")
1492(if awk-mode-map
1493 nil
1494 (setq awk-mode-map (c-make-inherited-keymap))
1495 ;; add bindings which are only useful for awk.
1496 (define-key awk-mode-map "#" 'self-insert-command)
1497 (define-key awk-mode-map "/" 'self-insert-command)
1498 (define-key awk-mode-map "*" 'self-insert-command)
1499 (define-key awk-mode-map "\C-c\C-n" 'undefined) ; #if doesn't exist in awk.
1500 (define-key awk-mode-map "\C-c\C-p" 'undefined)
1501 (define-key awk-mode-map "\C-c\C-u" 'undefined)
1502 (define-key awk-mode-map "\M-a" 'c-beginning-of-statement) ; 2003/10/7
1503 (define-key awk-mode-map "\M-e" 'c-end-of-statement) ; 2003/10/7
1504 (define-key awk-mode-map "\C-\M-a" 'c-awk-beginning-of-defun)
1505 (define-key awk-mode-map "\C-\M-e" 'c-awk-end-of-defun))
1506
1507(easy-menu-define c-awk-menu awk-mode-map "AWK Mode Commands"
1508 (cons "AWK" (c-lang-const c-mode-menu awk)))
1509
ae500c1a
GM
1510;; (require 'cc-awk) brings these in.
1511(defvar awk-mode-syntax-table)
1512(declare-function c-awk-unstick-NL-prop "cc-awk" ())
1513
0386b551
AM
1514(defun awk-mode ()
1515 "Major mode for editing AWK code.
d9e94c22
MS
1516To submit a problem report, enter `\\[c-submit-bug-report]' from an
1517awk-mode buffer. This automatically sets up a mail buffer with version
1518information already added. You just need to add a description of the
50fdde0e 1519problem, including a reproducible test case, and send the message.
d9e94c22
MS
1520
1521To see what version of CC Mode you are running, enter `\\[c-version]'.
1522
1523The hook `c-mode-common-hook' is run with no args at mode
1524initialization, then `awk-mode-hook'.
1525
1526Key bindings:
1527\\{awk-mode-map}"
0386b551
AM
1528 (interactive)
1529 (require 'cc-awk) ; Added 2003/6/10.
1530 (kill-all-local-variables)
1531 (c-initialize-cc-mode t)
1532 (set-syntax-table awk-mode-syntax-table)
1533 (setq major-mode 'awk-mode
1534 mode-name "AWK"
1535 local-abbrev-table awk-mode-abbrev-table
1536 abbrev-mode t)
1537 (use-local-map awk-mode-map)
1538 (c-init-language-vars-for 'awk-mode)
1539 (c-common-init 'awk-mode)
0386b551 1540 (c-awk-unstick-NL-prop)
0386b551
AM
1541
1542 ;; Prevent Xemacs's buffer-syntactic-context being used. See the comment
1543 ;; in cc-engine.el, just before (defun c-fast-in-literal ...
1544 (defalias 'c-in-literal 'c-slow-in-literal)
1545
1546 (c-run-mode-hooks 'c-mode-common-hook 'awk-mode-hook)
1547 (c-update-modeline))
d9e94c22
MS
1548
1549\f
c2efc1d0 1550;; bug reporting
785eecbb
RS
1551
1552(defconst c-mode-help-address
a66cd3ee
MS
1553 "bug-cc-mode@gnu.org"
1554 "Address(es) for CC Mode bug reports.")
785eecbb
RS
1555
1556(defun c-version ()
1557 "Echo the current version of CC Mode in the minibuffer."
1558 (interactive)
1559 (message "Using CC Mode version %s" c-version)
1560 (c-keep-region-active))
1561
130c507e
GM
1562(defvar c-prepare-bug-report-hooks nil)
1563
1564;; Dynamic variables used by reporter.
1565(defvar reporter-prompt-for-summary-p)
1566(defvar reporter-dont-compact-list)
1567
785eecbb
RS
1568(defun c-submit-bug-report ()
1569 "Submit via mail a bug report on CC Mode."
1570 (interactive)
77e31a8d 1571 (require 'reporter)
785eecbb
RS
1572 ;; load in reporter
1573 (let ((reporter-prompt-for-summary-p t)
1574 (reporter-dont-compact-list '(c-offsets-alist))
1575 (style c-indentation-style)
785eecbb
RS
1576 (c-features c-emacs-features))
1577 (and
1578 (if (y-or-n-p "Do you want to submit a report on CC Mode? ")
1579 t (message "") nil)
785eecbb
RS
1580 (reporter-submit-bug-report
1581 c-mode-help-address
d9e94c22 1582 (concat "CC Mode " c-version " (" mode-name ")")
51f606de 1583 (let ((vars (append
51f606de 1584 c-style-variables
d9e94c22 1585 '(c-buffer-is-cc-mode
51f606de 1586 c-tab-always-indent
d9e94c22
MS
1587 c-syntactic-indentation
1588 c-syntactic-indentation-in-macros
1589 c-ignore-auto-fill
1590 c-auto-align-backslashes
1591 c-backspace-function
1592 c-delete-function
1593 c-electric-pound-behavior
1594 c-default-style
1595 c-enable-xemacs-performance-kludge-p
1596 c-old-style-variable-behavior
51f606de
GM
1597 defun-prompt-regexp
1598 tab-width
1599 comment-column
1600 parse-sexp-ignore-comments
d9e94c22
MS
1601 parse-sexp-lookup-properties
1602 lookup-syntax-properties
51f606de
GM
1603 ;; A brain-damaged XEmacs only variable that, if
1604 ;; set to nil can cause all kinds of chaos.
1605 signal-error-on-buffer-boundary
1606 ;; Variables that affect line breaking and comments.
d9e94c22 1607 auto-fill-mode
91b807c9 1608 auto-fill-function
51f606de
GM
1609 filladapt-mode
1610 comment-multi-line
1611 comment-start-skip
1612 fill-prefix
d9e94c22 1613 fill-column
51f606de
GM
1614 paragraph-start
1615 adaptive-fill-mode
1616 adaptive-fill-regexp)
1617 nil)))
d61ca8d5
GM
1618 (mapc (lambda (var) (unless (boundp var)
1619 (setq vars (delq var vars))))
1620 '(signal-error-on-buffer-boundary
1621 filladapt-mode
1622 defun-prompt-regexp
1623 font-lock-mode
1624 font-lock-maximum-decoration
1625 parse-sexp-lookup-properties
1626 lookup-syntax-properties))
51f606de 1627 vars)
9714ec23 1628 (lambda ()
a66cd3ee 1629 (run-hooks 'c-prepare-bug-report-hooks)
d9e94c22 1630 (insert (format "Buffer Style: %s\nc-emacs-features: %s\n"
a66cd3ee 1631 style c-features)))))))
785eecbb
RS
1632
1633\f
130c507e 1634(cc-provide 'cc-mode)
ab5796a9 1635
cbee283d 1636;; arch-tag: 7825e5c4-fd09-439f-a04d-4c13208ba3d7
785eecbb 1637;;; cc-mode.el ends here